forked from toolshed/abra
		
	fix: flags for logging in
This commit is contained in:
		@ -59,13 +59,15 @@ var CatalogueSkipList = map[string]bool{
 | 
			
		||||
var catalogueGenerateCommand = &cli.Command{
 | 
			
		||||
	Name:    "generate",
 | 
			
		||||
	Aliases: []string{"g"},
 | 
			
		||||
	Usage:   "Generate a new copy of the catalogue",
 | 
			
		||||
	Usage:   "Generate a new copy of the recipe catalogue",
 | 
			
		||||
	Flags: []cli.Flag{
 | 
			
		||||
		internal.PushFlag,
 | 
			
		||||
		internal.CommitFlag,
 | 
			
		||||
		internal.CommitMessageFlag,
 | 
			
		||||
		internal.DryFlag,
 | 
			
		||||
		internal.SkipUpdatesFlag,
 | 
			
		||||
		internal.RegistryUsernameFlag,
 | 
			
		||||
		internal.RegistryPasswordFlag,
 | 
			
		||||
	},
 | 
			
		||||
	Description: `
 | 
			
		||||
This command generates a new copy of the recipe catalogue which can be found on:
 | 
			
		||||
@ -73,8 +75,8 @@ This command generates a new copy of the recipe catalogue which can be found on:
 | 
			
		||||
    https://recipes.coopcloud.tech
 | 
			
		||||
 | 
			
		||||
It polls the entire git.coopcloud.tech/coop-cloud/... recipe repository
 | 
			
		||||
listing, parses README and tags to produce recipe metadata and produces a
 | 
			
		||||
apps.json file which is placed in your ~/.abra/catalogue/recipes.json.
 | 
			
		||||
listing, parses README.md and git tags of those repositories to produce recipe
 | 
			
		||||
metadata and produces a recipes JSON file.
 | 
			
		||||
 | 
			
		||||
It is possible to generate new metadata for a single recipe by passing
 | 
			
		||||
<recipe>. The existing local catalogue will be updated, not overwritten.
 | 
			
		||||
@ -84,6 +86,9 @@ A new catalogue copy can be published to the recipes repository by passing the
 | 
			
		||||
 | 
			
		||||
    https://git.coopcloud.tech/coop-cloud/recipes
 | 
			
		||||
 | 
			
		||||
It is quite easy to get rate limited by Docker Hub when running this command.
 | 
			
		||||
If you have a Hub account you can have Abra log you in to avoid this. Pass
 | 
			
		||||
"--username" and "--password".
 | 
			
		||||
`,
 | 
			
		||||
	ArgsUsage: "[<recipe>]",
 | 
			
		||||
	Action: func(c *cli.Context) error {
 | 
			
		||||
@ -133,7 +138,11 @@ A new catalogue copy can be published to the recipes repository by passing the
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			versions, err := catalogue.GetRecipeVersions(recipeMeta.Name)
 | 
			
		||||
			versions, err := catalogue.GetRecipeVersions(
 | 
			
		||||
				recipeMeta.Name,
 | 
			
		||||
				internal.RegistryUsername,
 | 
			
		||||
				internal.RegistryPassword,
 | 
			
		||||
			)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				logrus.Fatal(err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@ -455,6 +455,26 @@ var SkipUpdatesFlag = &cli.BoolFlag{
 | 
			
		||||
	Destination: &SkipUpdates,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var RegistryUsername string
 | 
			
		||||
var RegistryUsernameFlag = &cli.StringFlag{
 | 
			
		||||
	Name:        "username",
 | 
			
		||||
	Aliases:     []string{"u"},
 | 
			
		||||
	Value:       "",
 | 
			
		||||
	Usage:       "Registry username",
 | 
			
		||||
	EnvVars:     []string{"REGISTRY_USERNAME"},
 | 
			
		||||
	Destination: &RegistryUsername,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var RegistryPassword string
 | 
			
		||||
var RegistryPasswordFlag = &cli.StringFlag{
 | 
			
		||||
	Name:        "password",
 | 
			
		||||
	Aliases:     []string{"p"},
 | 
			
		||||
	Value:       "",
 | 
			
		||||
	Usage:       "Registry password",
 | 
			
		||||
	EnvVars:     []string{"REGISTRY_PASSWORD"},
 | 
			
		||||
	Destination: &RegistryUsername,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SSHFailMsg is a hopefully helpful SSH failure message
 | 
			
		||||
var SSHFailMsg = `
 | 
			
		||||
Woops, Abra is unable to connect to connect to %s.
 | 
			
		||||
 | 
			
		||||
@ -362,7 +362,7 @@ func ReadReposMetadata() (RepoCatalogue, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetRecipeVersions retrieves all recipe versions.
 | 
			
		||||
func GetRecipeVersions(recipeName string) (RecipeVersions, error) {
 | 
			
		||||
func GetRecipeVersions(recipeName, registryUsername, registryPassword string) (RecipeVersions, error) {
 | 
			
		||||
	versions := RecipeVersions{}
 | 
			
		||||
 | 
			
		||||
	recipeDir := path.Join(config.RECIPES_DIR, recipeName)
 | 
			
		||||
@ -439,7 +439,7 @@ func GetRecipeVersions(recipeName string) (RecipeVersions, error) {
 | 
			
		||||
			if digest, exists = queryCache[img]; !exists {
 | 
			
		||||
				logrus.Debugf("looking up image: %s from %s", img, path)
 | 
			
		||||
				var err error
 | 
			
		||||
				digest, err = client.GetTagDigest(cl, img)
 | 
			
		||||
				digest, err = client.GetTagDigest(cl, img, registryUsername, registryPassword)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					logrus.Warn(err)
 | 
			
		||||
					continue
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,6 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"coopcloud.tech/abra/pkg/web"
 | 
			
		||||
@ -42,7 +41,7 @@ func basicAuth(username, password string) string {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getRegv2Token retrieves a registry v2 authentication token.
 | 
			
		||||
func getRegv2Token(cl *client.Client, image reference.Named) (string, error) {
 | 
			
		||||
func getRegv2Token(cl *client.Client, image reference.Named, registryUsername, registryPassword string) (string, error) {
 | 
			
		||||
	img := reference.Path(image)
 | 
			
		||||
	tokenURL := "https://auth.docker.io/token"
 | 
			
		||||
	values := fmt.Sprintf("service=registry.docker.io&scope=repository:%s:pull", img)
 | 
			
		||||
@ -53,11 +52,10 @@ func getRegv2Token(cl *client.Client, image reference.Named) (string, error) {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	username, userOk := os.LookupEnv("DOCKER_USERNAME")
 | 
			
		||||
	password, passOk := os.LookupEnv("DOCKER_PASSWORD")
 | 
			
		||||
	if userOk && passOk {
 | 
			
		||||
		logrus.Debugf("using docker log in credentials for registry token request")
 | 
			
		||||
		req.Header.Add("Authorization", fmt.Sprintf("Basic %s", basicAuth(username, password)))
 | 
			
		||||
	if registryUsername != "" && registryPassword != "" {
 | 
			
		||||
		logrus.Debugf("using registry log in credentials for token request")
 | 
			
		||||
		auth := basicAuth(registryUsername, registryPassword)
 | 
			
		||||
		req.Header.Add("Authorization", fmt.Sprintf("Basic %s", auth))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	client := web.NewHTTPRetryClient()
 | 
			
		||||
@ -94,7 +92,7 @@ func getRegv2Token(cl *client.Client, image reference.Named) (string, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetTagDigest retrieves an image digest from a v2 registry
 | 
			
		||||
func GetTagDigest(cl *client.Client, image reference.Named) (string, error) {
 | 
			
		||||
func GetTagDigest(cl *client.Client, image reference.Named, registryUsername, registryPassword string) (string, error) {
 | 
			
		||||
	img := reference.Path(image)
 | 
			
		||||
	tag := image.(reference.NamedTagged).Tag()
 | 
			
		||||
	manifestURL := fmt.Sprintf("https://index.docker.io/v2/%s/manifests/%s", img, tag)
 | 
			
		||||
@ -104,7 +102,7 @@ func GetTagDigest(cl *client.Client, image reference.Named) (string, error) {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	token, err := getRegv2Token(cl, image)
 | 
			
		||||
	token, err := getRegv2Token(cl, image, registryUsername, registryPassword)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user