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