You've already forked dcmerge
Initial Commit
This commit is contained in:
99
pkg/fetcher/fetcher.go
Normal file
99
pkg/fetcher/fetcher.go
Normal file
@ -0,0 +1,99 @@
|
||||
package fetcher
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
|
||||
"git.cryptic.systems/volker.raschek/dcmerge/pkg/domain/dockerCompose"
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
func Fetch(urls ...string) ([]*dockerCompose.Config, error) {
|
||||
dockerComposeConfigs := make([]*dockerCompose.Config, 0)
|
||||
|
||||
for _, rawURL := range urls {
|
||||
dockerComposeURL, err := url.Parse(rawURL)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
switch {
|
||||
case dockerComposeURL.Scheme == "http" || dockerComposeURL.Scheme == "https":
|
||||
dockerComposeConfig, err := getDockerComposeViaHTTP(dockerComposeURL.String())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
dockerComposeConfigs = append(dockerComposeConfigs, dockerComposeConfig)
|
||||
case dockerComposeURL.Scheme == "file":
|
||||
fallthrough
|
||||
default:
|
||||
dockerComposeConfig, err := readDockerComposeFromFile(dockerComposeURL.Path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
dockerComposeConfigs = append(dockerComposeConfigs, dockerComposeConfig)
|
||||
}
|
||||
}
|
||||
|
||||
return dockerComposeConfigs, nil
|
||||
}
|
||||
|
||||
var ErrorPathIsDir error = errors.New("Path is a directory")
|
||||
|
||||
func getDockerComposeViaHTTP(url string) (*dockerCompose.Config, error) {
|
||||
req, err := http.NewRequest(http.MethodGet, url, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return nil, fmt.Errorf("Received unexpected HTTP-Statuscode %v", resp.StatusCode)
|
||||
}
|
||||
|
||||
dockerCompose := dockerCompose.NewConfig()
|
||||
|
||||
yamlDecoder := yaml.NewDecoder(resp.Body)
|
||||
err = yamlDecoder.Decode(&dockerCompose)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return dockerCompose, nil
|
||||
}
|
||||
|
||||
func readDockerComposeFromFile(name string) (*dockerCompose.Config, error) {
|
||||
fileStat, err := os.Stat(name)
|
||||
switch {
|
||||
case errors.Is(err, os.ErrNotExist):
|
||||
return nil, err
|
||||
case fileStat.IsDir():
|
||||
return nil, fmt.Errorf("%w: %s", ErrorPathIsDir, name)
|
||||
}
|
||||
|
||||
file, err := os.Open(name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
dockerCompose := dockerCompose.NewConfig()
|
||||
|
||||
yamlDecoder := yaml.NewDecoder(file)
|
||||
err = yamlDecoder.Decode(&dockerCompose)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return dockerCompose, nil
|
||||
}
|
Reference in New Issue
Block a user