mirror of
https://github.com/fosrl/newt.git
synced 2026-03-31 23:16:40 +00:00
Add name to provisioning
This commit is contained in:
10
main.go
10
main.go
@@ -169,6 +169,9 @@ var (
|
|||||||
// Provisioning key – exchanged once for a permanent newt ID + secret
|
// Provisioning key – exchanged once for a permanent newt ID + secret
|
||||||
provisioningKey string
|
provisioningKey string
|
||||||
|
|
||||||
|
// Optional name for the site created during provisioning
|
||||||
|
newtName string
|
||||||
|
|
||||||
// Path to config file (overrides CONFIG_FILE env var and default location)
|
// Path to config file (overrides CONFIG_FILE env var and default location)
|
||||||
configFile string
|
configFile string
|
||||||
)
|
)
|
||||||
@@ -284,6 +287,7 @@ func runNewtMain(ctx context.Context) {
|
|||||||
noCloudEnv := os.Getenv("NO_CLOUD")
|
noCloudEnv := os.Getenv("NO_CLOUD")
|
||||||
noCloud = noCloudEnv == "true"
|
noCloud = noCloudEnv == "true"
|
||||||
provisioningKey = os.Getenv("NEWT_PROVISIONING_KEY")
|
provisioningKey = os.Getenv("NEWT_PROVISIONING_KEY")
|
||||||
|
newtName = os.Getenv("NEWT_NAME")
|
||||||
configFile = os.Getenv("CONFIG_FILE")
|
configFile = os.Getenv("CONFIG_FILE")
|
||||||
|
|
||||||
if endpoint == "" {
|
if endpoint == "" {
|
||||||
@@ -336,6 +340,9 @@ func runNewtMain(ctx context.Context) {
|
|||||||
if provisioningKey == "" {
|
if provisioningKey == "" {
|
||||||
flag.StringVar(&provisioningKey, "provisioning-key", "", "One-time provisioning key used to obtain a newt ID and secret from the server")
|
flag.StringVar(&provisioningKey, "provisioning-key", "", "One-time provisioning key used to obtain a newt ID and secret from the server")
|
||||||
}
|
}
|
||||||
|
if newtName == "" {
|
||||||
|
flag.StringVar(&newtName, "name", "", "Name for the site created during provisioning (supports {{env.VAR}} interpolation)")
|
||||||
|
}
|
||||||
if configFile == "" {
|
if configFile == "" {
|
||||||
flag.StringVar(&configFile, "config-file", "", "Path to config file (overrides CONFIG_FILE env var and default location)")
|
flag.StringVar(&configFile, "config-file", "", "Path to config file (overrides CONFIG_FILE env var and default location)")
|
||||||
}
|
}
|
||||||
@@ -623,6 +630,9 @@ func runNewtMain(ctx context.Context) {
|
|||||||
if provisioningKey != "" && client.GetConfig().ProvisioningKey == "" {
|
if provisioningKey != "" && client.GetConfig().ProvisioningKey == "" {
|
||||||
client.GetConfig().ProvisioningKey = provisioningKey
|
client.GetConfig().ProvisioningKey = provisioningKey
|
||||||
}
|
}
|
||||||
|
if newtName != "" && client.GetConfig().Name == "" {
|
||||||
|
client.GetConfig().Name = newtName
|
||||||
|
}
|
||||||
|
|
||||||
endpoint = client.GetConfig().Endpoint // Update endpoint from config
|
endpoint = client.GetConfig().Endpoint // Update endpoint from config
|
||||||
id = client.GetConfig().ID // Update ID from config
|
id = client.GetConfig().ID // Update ID from config
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@@ -99,6 +100,10 @@ func (c *Client) loadConfig() error {
|
|||||||
if c.config.ProvisioningKey == "" {
|
if c.config.ProvisioningKey == "" {
|
||||||
c.config.ProvisioningKey = config.ProvisioningKey
|
c.config.ProvisioningKey = config.ProvisioningKey
|
||||||
}
|
}
|
||||||
|
// Always load the name from the file if not already set
|
||||||
|
if c.config.Name == "" {
|
||||||
|
c.config.Name = config.Name
|
||||||
|
}
|
||||||
|
|
||||||
// Check if CLI args provided values that override file values
|
// Check if CLI args provided values that override file values
|
||||||
if (!fileHadID && originalConfig.ID != "") ||
|
if (!fileHadID && originalConfig.ID != "") ||
|
||||||
@@ -135,6 +140,21 @@ func (c *Client) saveConfig() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// interpolateString replaces {{env.VAR}} tokens in s with the corresponding
|
||||||
|
// environment variable values. Tokens that do not match a supported scheme are
|
||||||
|
// left unchanged, mirroring the blueprint interpolation logic.
|
||||||
|
func interpolateString(s string) string {
|
||||||
|
re := regexp.MustCompile(`\{\{([^}]+)\}\}`)
|
||||||
|
return re.ReplaceAllStringFunc(s, func(match string) string {
|
||||||
|
inner := strings.TrimSpace(match[2 : len(match)-2])
|
||||||
|
if strings.HasPrefix(inner, "env.") {
|
||||||
|
varName := strings.TrimPrefix(inner, "env.")
|
||||||
|
return os.Getenv(varName)
|
||||||
|
}
|
||||||
|
return match
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// provisionIfNeeded checks whether a provisioning key is present and, if so,
|
// provisionIfNeeded checks whether a provisioning key is present and, if so,
|
||||||
// exchanges it for a newt ID and secret by calling the registration endpoint.
|
// exchanges it for a newt ID and secret by calling the registration endpoint.
|
||||||
// On success the config is updated in-place and flagged for saving so that
|
// On success the config is updated in-place and flagged for saving so that
|
||||||
@@ -158,9 +178,15 @@ func (c *Client) provisionIfNeeded() error {
|
|||||||
}
|
}
|
||||||
baseEndpoint := strings.TrimRight(baseURL.String(), "/")
|
baseEndpoint := strings.TrimRight(baseURL.String(), "/")
|
||||||
|
|
||||||
|
// Interpolate any {{env.VAR}} tokens in the name before sending.
|
||||||
|
name := interpolateString(c.config.Name)
|
||||||
|
|
||||||
reqBody := map[string]interface{}{
|
reqBody := map[string]interface{}{
|
||||||
"provisioningKey": c.config.ProvisioningKey,
|
"provisioningKey": c.config.ProvisioningKey,
|
||||||
}
|
}
|
||||||
|
if name != "" {
|
||||||
|
reqBody["name"] = name
|
||||||
|
}
|
||||||
jsonData, err := json.Marshal(reqBody)
|
jsonData, err := json.Marshal(reqBody)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to marshal provisioning request: %w", err)
|
return fmt.Errorf("failed to marshal provisioning request: %w", err)
|
||||||
@@ -236,6 +262,7 @@ func (c *Client) provisionIfNeeded() error {
|
|||||||
c.config.ID = provResp.Data.NewtID
|
c.config.ID = provResp.Data.NewtID
|
||||||
c.config.Secret = provResp.Data.Secret
|
c.config.Secret = provResp.Data.Secret
|
||||||
c.config.ProvisioningKey = ""
|
c.config.ProvisioningKey = ""
|
||||||
|
c.config.Name = ""
|
||||||
c.configNeedsSave = true
|
c.configNeedsSave = true
|
||||||
|
|
||||||
// Save immediately so that if the subsequent connection attempt fails the
|
// Save immediately so that if the subsequent connection attempt fails the
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ type Config struct {
|
|||||||
Endpoint string `json:"endpoint"`
|
Endpoint string `json:"endpoint"`
|
||||||
TlsClientCert string `json:"tlsClientCert"`
|
TlsClientCert string `json:"tlsClientCert"`
|
||||||
ProvisioningKey string `json:"provisioningKey,omitempty"`
|
ProvisioningKey string `json:"provisioningKey,omitempty"`
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type TokenResponse struct {
|
type TokenResponse struct {
|
||||||
|
|||||||
Reference in New Issue
Block a user