feat: finally implement app new command
This commit is contained in:
parent
932803453e
commit
42968fb8e1
@ -113,7 +113,9 @@ on your $PATH.
|
|||||||
logrus.Fatal(fmt.Errorf("'%s' cannot be longer than 45 characters", sanitisedAppName))
|
logrus.Fatal(fmt.Errorf("'%s' cannot be longer than 45 characters", sanitisedAppName))
|
||||||
}
|
}
|
||||||
|
|
||||||
config.CopyAppEnvSample(appType, AppName, Server)
|
if err := config.CopyAppEnvSample(appType, AppName, Server); err != nil {
|
||||||
|
logrus.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
secrets := make(map[string]string)
|
secrets := make(map[string]string)
|
||||||
if Secrets {
|
if Secrets {
|
||||||
@ -123,7 +125,7 @@ on your $PATH.
|
|||||||
logrus.Fatal(err)
|
logrus.Fatal(err)
|
||||||
}
|
}
|
||||||
secretEnvVars := secret.ReadSecretEnvVars(appEnv)
|
secretEnvVars := secret.ReadSecretEnvVars(appEnv)
|
||||||
secrets, err = secret.GenerateSecrets(secretEnvVars, Server)
|
secrets, err = secret.GenerateSecrets(secretEnvVars, sanitisedAppName, Server)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Fatal(err)
|
logrus.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,25 @@
|
|||||||
package client
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/docker/docker/api/types/swarm"
|
||||||
|
)
|
||||||
|
|
||||||
func StoreSecret(secretName, secretValue, server string) error {
|
func StoreSecret(secretName, secretValue, server string) error {
|
||||||
|
cl, err := NewClientWithContext(server)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
ann := swarm.Annotations{Name: secretName}
|
||||||
|
spec := swarm.SecretSpec{Annotations: ann, Data: []byte(secretValue)}
|
||||||
|
|
||||||
|
// We don't bother with the secret IDs for now
|
||||||
|
if _, err := cl.SecretCreate(ctx, spec); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -208,6 +208,10 @@ func CopyAppEnvSample(appType, appName, server string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
appEnvPath := path.Join(ABRA_DIR, "servers", server, fmt.Sprintf("%s.env", appName))
|
appEnvPath := path.Join(ABRA_DIR, "servers", server, fmt.Sprintf("%s.env", appName))
|
||||||
|
if _, err := os.Stat(appEnvPath); err == nil {
|
||||||
|
return fmt.Errorf("%s already exists?", appEnvPath)
|
||||||
|
}
|
||||||
|
|
||||||
err = ioutil.WriteFile(appEnvPath, envSample, 0755)
|
err = ioutil.WriteFile(appEnvPath, envSample, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -80,39 +80,55 @@ func ParseSecretEnvVarValue(secretValue string) (SecretValue, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return SecretValue{}, err
|
return SecretValue{}, err
|
||||||
}
|
}
|
||||||
return SecretValue{Version: values[0], Length: length}, nil
|
version := strings.ReplaceAll(values[0], " ", "")
|
||||||
|
return SecretValue{Version: version, Length: length}, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func GenerateSecrets(secretEnvVars map[string]string, server string) (map[string]string, error) {
|
func GenerateSecrets(secretEnvVars map[string]string, appName, server string) (map[string]string, error) {
|
||||||
secrets := make(map[string]string)
|
secrets := make(map[string]string)
|
||||||
|
|
||||||
|
ch := make(chan error, len(secretEnvVars))
|
||||||
for secretEnvVar := range secretEnvVars {
|
for secretEnvVar := range secretEnvVars {
|
||||||
secretName := ParseSecretEnvVarName(secretEnvVar)
|
go func(s string) {
|
||||||
secretValue, err := ParseSecretEnvVarValue(secretEnvVars[secretEnvVar])
|
secretName := ParseSecretEnvVarName(s)
|
||||||
|
secretValue, err := ParseSecretEnvVarValue(secretEnvVars[s])
|
||||||
|
if err != nil {
|
||||||
|
ch <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
secretRemoteName := fmt.Sprintf("%s_%s_%s", appName, secretName, secretValue.Version)
|
||||||
|
if secretValue.Length > 0 {
|
||||||
|
passwords, err := GeneratePasswords(1, uint(secretValue.Length))
|
||||||
|
if err != nil {
|
||||||
|
ch <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := client.StoreSecret(secretRemoteName, passwords[0], server); err != nil {
|
||||||
|
ch <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
secrets[secretName] = passwords[0]
|
||||||
|
} else {
|
||||||
|
passphrases, err := GeneratePassphrases(1)
|
||||||
|
if err != nil {
|
||||||
|
ch <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := client.StoreSecret(secretRemoteName, passphrases[0], server); err != nil {
|
||||||
|
ch <- err
|
||||||
|
}
|
||||||
|
secrets[secretName] = passphrases[0]
|
||||||
|
}
|
||||||
|
ch <- nil
|
||||||
|
}(secretEnvVar)
|
||||||
|
}
|
||||||
|
|
||||||
|
for range secretEnvVars {
|
||||||
|
err := <-ch
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if secretValue.Length > 0 {
|
|
||||||
passwords, err := GeneratePasswords(1, uint(secretValue.Length))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
secrets[secretName] = passwords[0]
|
|
||||||
if err := client.StoreSecret(secretName, passwords[0], server); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
passphrases, err := GeneratePassphrases(1)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
secrets[secretName] = passphrases[0]
|
|
||||||
if err := client.StoreSecret(secretName, passphrases[0], server); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return secrets, nil
|
return secrets, nil
|
||||||
|
Loading…
x
Reference in New Issue
Block a user