parent
e2979a631a
commit
6cfffb38f9
|
@ -21,7 +21,8 @@ const (
|
||||||
errEndpointsFileNotFound = portainer.Error("Unable to locate external endpoints file")
|
errEndpointsFileNotFound = portainer.Error("Unable to locate external endpoints file")
|
||||||
errInvalidSyncInterval = portainer.Error("Invalid synchronization interval")
|
errInvalidSyncInterval = portainer.Error("Invalid synchronization interval")
|
||||||
errEndpointExcludeExternal = portainer.Error("Cannot use the -H flag mutually with --external-endpoints")
|
errEndpointExcludeExternal = portainer.Error("Cannot use the -H flag mutually with --external-endpoints")
|
||||||
errNoAuthExcludeAdminPassword = portainer.Error("Cannot use --no-auth with --admin-password")
|
errNoAuthExcludeAdminPassword = portainer.Error("Cannot use --no-auth with --admin-password or --admin-password-file")
|
||||||
|
errAdminPassExcludeAdminPassFile = portainer.Error("Cannot use --admin-password with --admin-password-file")
|
||||||
)
|
)
|
||||||
|
|
||||||
// ParseFlags parse the CLI flags and return a portainer.Flags struct
|
// ParseFlags parse the CLI flags and return a portainer.Flags struct
|
||||||
|
@ -45,6 +46,7 @@ func (*Service) ParseFlags(version string) (*portainer.CLIFlags, error) {
|
||||||
SSLCert: kingpin.Flag("sslcert", "Path to the SSL certificate used to secure the Portainer instance").Default(defaultSSLCertPath).String(),
|
SSLCert: kingpin.Flag("sslcert", "Path to the SSL certificate used to secure the Portainer instance").Default(defaultSSLCertPath).String(),
|
||||||
SSLKey: kingpin.Flag("sslkey", "Path to the SSL key used to secure the Portainer instance").Default(defaultSSLKeyPath).String(),
|
SSLKey: kingpin.Flag("sslkey", "Path to the SSL key used to secure the Portainer instance").Default(defaultSSLKeyPath).String(),
|
||||||
AdminPassword: kingpin.Flag("admin-password", "Hashed admin password").String(),
|
AdminPassword: kingpin.Flag("admin-password", "Hashed admin password").String(),
|
||||||
|
AdminPasswordFile: kingpin.Flag("admin-password-file", "Path to the file containing the password for the admin user").String(),
|
||||||
// Deprecated flags
|
// Deprecated flags
|
||||||
Labels: pairs(kingpin.Flag("hide-label", "Hide containers with a specific label in the UI").Short('l')),
|
Labels: pairs(kingpin.Flag("hide-label", "Hide containers with a specific label in the UI").Short('l')),
|
||||||
Logo: kingpin.Flag("logo", "URL for the logo displayed in the UI").String(),
|
Logo: kingpin.Flag("logo", "URL for the logo displayed in the UI").String(),
|
||||||
|
@ -77,10 +79,14 @@ func (*Service) ValidateFlags(flags *portainer.CLIFlags) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if *flags.NoAuth && (*flags.AdminPassword != "") {
|
if *flags.NoAuth && (*flags.AdminPassword != "" || *flags.AdminPasswordFile != "") {
|
||||||
return errNoAuthExcludeAdminPassword
|
return errNoAuthExcludeAdminPassword
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if *flags.AdminPassword != "" && *flags.AdminPasswordFile != "" {
|
||||||
|
return errAdminPassExcludeAdminPassFile
|
||||||
|
}
|
||||||
|
|
||||||
displayDeprecationWarnings(*flags.Templates, *flags.Logo, *flags.Labels)
|
displayDeprecationWarnings(*flags.Templates, *flags.Logo, *flags.Labels)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -212,12 +212,27 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if *flags.AdminPassword != "" {
|
adminPasswordHash := ""
|
||||||
log.Printf("Creating admin user with password hash %s", *flags.AdminPassword)
|
if *flags.AdminPasswordFile != "" {
|
||||||
|
content, err := file.GetStringFromFile(*flags.AdminPasswordFile)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
adminPasswordHash, err = cryptoService.Hash(content)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
} else if *flags.AdminPassword != "" {
|
||||||
|
adminPasswordHash = *flags.AdminPassword
|
||||||
|
}
|
||||||
|
|
||||||
|
if adminPasswordHash != "" {
|
||||||
|
|
||||||
|
log.Printf("Creating admin user with password hash %s", adminPasswordHash)
|
||||||
user := &portainer.User{
|
user := &portainer.User{
|
||||||
Username: "admin",
|
Username: "admin",
|
||||||
Role: portainer.AdministratorRole,
|
Role: portainer.AdministratorRole,
|
||||||
Password: *flags.AdminPassword,
|
Password: adminPasswordHash,
|
||||||
}
|
}
|
||||||
err := store.UserService.CreateUser(user)
|
err := store.UserService.CreateUser(user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package file
|
package file
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
|
||||||
"github.com/portainer/portainer"
|
"github.com/portainer/portainer"
|
||||||
|
|
||||||
"io"
|
"io"
|
||||||
|
@ -162,3 +164,13 @@ func (service *Service) createFileInStore(filePath string, r io.Reader) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetStringFromFile returns a string content from file.
|
||||||
|
func GetStringFromFile(filePath string) (string, error) {
|
||||||
|
content, err := ioutil.ReadFile(filePath)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(content), nil
|
||||||
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ type (
|
||||||
SSLCert *string
|
SSLCert *string
|
||||||
SSLKey *string
|
SSLKey *string
|
||||||
AdminPassword *string
|
AdminPassword *string
|
||||||
|
AdminPasswordFile *string
|
||||||
// Deprecated fields
|
// Deprecated fields
|
||||||
Logo *string
|
Logo *string
|
||||||
Templates *string
|
Templates *string
|
||||||
|
|
Loading…
Reference in New Issue