func LoginCmd()

in auth/login.go [57:184]


func LoginCmd() (*LoginResult, error) {

	// enable log output if requested
	if os.Getenv("DEBUG")+os.Getenv("TRACE") != "" {
		log.SetOutput(os.Stdout)
	}

	flag := flag.NewFlagSet("-login", flag.ExitOnError)
	flag.Usage = func() {
		fmt.Println(usage)
	}

	var helpFlag bool
	flag.BoolVar(&helpFlag, "h", false, "Show usage")
	flag.BoolVar(&helpFlag, "help", false, "Show usage")
	err := flag.Parse(os.Args[1:])
	if err != nil {
		return nil, err
	}

	if helpFlag {
		flag.Usage()
		return nil, nil
	}

	args := flag.Args()

	if len(args) == 0 && os.Getenv("OPS_APIHOST") == "" {
		flag.Usage()
		return nil, errors.New("missing apihost")
	}

	apihost := os.Getenv("OPS_APIHOST")
	if apihost == "" {
		apihost = args[0]
	}
	url := apihost + whiskLoginPath

	apihost = ensureSchema(apihost)

	// try to get the user from the environment
	user := os.Getenv("OPS_USER")
	if user == "" {
		// if env var not set, try to get it from the command line
		if os.Getenv("OPS_APIHOST") != "" {
			// if apihost env var was set, treat the first arg as the user
			if len(args) > 0 {
				user = args[0]
			}
		} else {
			// if apihost env var was not set, treat the second arg as the user
			if len(args) > 1 {
				user = args[1]
			}
		}
	}

	// if still not set, use the default user
	if user == "" {
		fmt.Println("Using the default user:", defaultUser)
		user = defaultUser
	}

	fmt.Println("Logging in", apihost, "as", user)

	password := os.Getenv("OPS_PASSWORD")
	if password == "" {
		fmt.Print("Enter Password: ")
		pwd, err := AskPassword()
		if err != nil {
			return nil, err
		}
		password = pwd
		fmt.Println()
	}

	creds, err := doLogin(url, user, password)
	if err != nil {
		return nil, err
	}

	if _, ok := creds["AUTH"]; !ok {
		return nil, errors.New("missing AUTH token from login response")
	}

	opsHome := os.Getenv("OPS_HOME")
	if opsHome == "" {
		return nil, fmt.Errorf("OPS_HOME not defined")
	}

	configMap, err := config.NewConfigMapBuilder().
		WithConfigJson(filepath.Join(opsHome, "config.json")).
		Build()

	if err != nil {
		return nil, err
	}

	for k, v := range creds {
		if err := configMap.Insert(k, v); err != nil {
			return nil, err
		}
	}

	if err := configMap.Insert("STATUS_LOGGED_USER", user); err != nil {
		log.Println("[Warning] Failed to insert STATUS_LOGGED_USER")
	}

	err = configMap.SaveConfig()
	if err != nil {
		return nil, err
	}

	// if err := storeCredentials(creds); err != nil {
	// 	return nil, err
	// }

	// auth, err := keyring.Get(opsSecretServiceName, "AUTH")
	// if err != nil {
	// 	return nil, err
	// }

	return &LoginResult{
		Login:   user,
		Auth:    creds["AUTH"],
		ApiHost: apihost,
	}, nil
}