provider-kairos/internal/cli/rotate.go

97 lines
1.9 KiB
Go
Raw Normal View History

2022-08-10 16:55:20 +00:00
package cli
import (
"errors"
"fmt"
"io/ioutil"
"os"
config "github.com/c3os-io/c3os/pkg/config"
"github.com/c3os-io/provider-c3os/internal/provider"
providerConfig "github.com/c3os-io/provider-c3os/internal/provider/config"
2022-08-12 07:51:59 +00:00
"github.com/c3os-io/provider-c3os/internal/services"
2022-08-10 16:55:20 +00:00
"gopkg.in/yaml.v3"
)
func RotateToken(configDir []string, newToken, apiAddress, rootDir string, restart bool) error {
if err := ReplaceToken(configDir, newToken); err != nil {
return err
}
c, err := config.Scan(config.Directories(configDir...))
if err != nil {
return err
}
providerCfg := &providerConfig.Config{}
err = c.Unmarshal(providerCfg)
if err != nil {
return err
}
2022-08-12 07:51:59 +00:00
err = provider.SetupVPN(services.EdgeVPNDefaultInstance, apiAddress, rootDir, false, providerCfg)
2022-08-10 16:55:20 +00:00
if err != nil {
return err
}
if restart {
2022-08-12 07:51:59 +00:00
svc, err := services.EdgeVPN(services.EdgeVPNDefaultInstance, rootDir)
2022-08-10 16:55:20 +00:00
if err != nil {
return err
}
return svc.Restart()
}
return nil
}
func ReplaceToken(dir []string, token string) (err error) {
c, err := config.Scan(config.Directories(dir...))
if err != nil {
return fmt.Errorf("no config file found: %w", err)
}
header := "#node-config"
if hasHeader, head := config.HasHeader(c.String(), ""); hasHeader {
header = head
}
content := map[interface{}]interface{}{}
if err := yaml.Unmarshal([]byte(c.String()), &content); err != nil {
return err
}
section, exists := content["c3os"]
if !exists {
return errors.New("no c3os section in config file")
}
dd, err := yaml.Marshal(section)
if err != nil {
return err
}
piece := map[string]interface{}{}
if err := yaml.Unmarshal(dd, &piece); err != nil {
return err
}
piece["network_token"] = token
content["c3os"] = piece
d, err := yaml.Marshal(content)
if err != nil {
return err
}
fi, err := os.Stat(c.Location())
if err != nil {
return err
}
return ioutil.WriteFile(c.Location(), []byte(config.AddHeader(header, string(d))), fi.Mode().Perm())
}