2021-03-04 20:44:49 -05:00
|
|
|
package registry
|
|
|
|
|
|
|
|
|
|
import (
|
2021-08-05 01:12:10 -04:00
|
|
|
"bytes"
|
2021-03-04 20:44:49 -05:00
|
|
|
"errors"
|
2024-02-13 01:09:24 -05:00
|
|
|
"fmt"
|
2023-12-22 01:59:22 +08:00
|
|
|
"io"
|
2021-03-04 20:44:49 -05:00
|
|
|
"os"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"github.com/dokku/dokku/plugins/common"
|
|
|
|
|
)
|
|
|
|
|
|
2021-03-19 16:31:07 -04:00
|
|
|
// CommandLogin logs a user into the specified server
|
2021-03-04 20:44:49 -05:00
|
|
|
func CommandLogin(server string, username string, password string, passwordStdin bool) error {
|
|
|
|
|
if passwordStdin {
|
2023-12-22 01:59:22 +08:00
|
|
|
stdin, err := io.ReadAll(os.Stdin)
|
2021-03-04 20:44:49 -05:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
password = strings.TrimSpace(string(stdin))
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-04 22:16:40 -05:00
|
|
|
if server == "" {
|
|
|
|
|
return errors.New("Missing server argument")
|
|
|
|
|
}
|
|
|
|
|
if username == "" {
|
|
|
|
|
return errors.New("Missing username argument")
|
|
|
|
|
}
|
|
|
|
|
if password == "" {
|
|
|
|
|
return errors.New("Missing password argument")
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-12 23:54:14 -05:00
|
|
|
if server == "hub.docker.com" || server == "docker.com" {
|
|
|
|
|
server = "docker.io"
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-05 01:12:10 -04:00
|
|
|
buffer := bytes.Buffer{}
|
|
|
|
|
buffer.Write([]byte(password + "\n"))
|
|
|
|
|
|
2024-02-13 01:09:24 -05:00
|
|
|
result, err := common.CallExecCommand(common.ExecCommandInput{
|
2024-02-14 00:33:20 -05:00
|
|
|
Command: common.DockerBin(),
|
|
|
|
|
Args: []string{"login", "--username", username, "--password-stdin", server},
|
|
|
|
|
Stdin: &buffer,
|
|
|
|
|
StreamStdio: true,
|
2024-02-13 01:09:24 -05:00
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("Unable to run docker login: %w", err)
|
|
|
|
|
}
|
|
|
|
|
if result.ExitCode != 0 {
|
|
|
|
|
return fmt.Errorf("Unable to run docker login: %s", result.StderrContents())
|
2021-03-04 20:44:49 -05:00
|
|
|
}
|
|
|
|
|
|
2024-02-13 01:09:24 -05:00
|
|
|
_, err = common.CallPlugnTrigger(common.PlugnTriggerInput{
|
2024-02-12 20:07:43 -05:00
|
|
|
Trigger: "post-registry-login",
|
|
|
|
|
Args: []string{server, username},
|
|
|
|
|
StreamStdio: true,
|
2024-01-18 22:25:23 -05:00
|
|
|
Env: map[string]string{
|
|
|
|
|
"DOCKER_REGISTRY_PASS": password,
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-04 20:44:49 -05:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CommandReport displays a registry report for one or more apps
|
|
|
|
|
func CommandReport(appName string, format string, infoFlag string) error {
|
|
|
|
|
if len(appName) == 0 {
|
|
|
|
|
apps, err := common.DokkuApps()
|
|
|
|
|
if err != nil {
|
2025-02-02 01:37:14 -05:00
|
|
|
if errors.Is(err, common.NoAppsExist) {
|
|
|
|
|
common.LogWarn(err.Error())
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2021-03-04 20:44:49 -05:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
for _, appName := range apps {
|
|
|
|
|
if err := ReportSingleApp(appName, format, infoFlag); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ReportSingleApp(appName, format, infoFlag)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CommandSet set or clear a registry property for an app
|
|
|
|
|
func CommandSet(appName string, property string, value string) error {
|
|
|
|
|
common.CommandPropertySet("registry", appName, property, value, DefaultProperties, GlobalProperties)
|
|
|
|
|
return nil
|
|
|
|
|
}
|