provider-kairos/internal/cli/rotate.go

105 lines
2.2 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/kairos-io/kairos/pkg/config"
"github.com/kairos-io/provider-kairos/internal/provider"
providerConfig "github.com/kairos-io/provider-kairos/internal/provider/config"
"github.com/kairos-io/provider-kairos/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) {
locations, err := config.FindYAMLWithKey("kairos.network_token", config.Directories(dir...))
2022-08-10 16:55:20 +00:00
if err != nil {
return err
2022-08-10 16:55:20 +00:00
}
for _, f := range locations {
dat, err := os.ReadFile(f)
if err != nil {
fmt.Printf("warning: could not read %s '%s'\n", f, err.Error())
}
2022-08-10 16:55:20 +00:00
header := config.DefaultHeader
if hasHeader, head := config.HasHeader(string(dat), ""); hasHeader {
header = head
}
content := map[interface{}]interface{}{}
2022-08-10 16:55:20 +00:00
if err := yaml.Unmarshal(dat, &content); err != nil {
return err
}
2022-08-10 16:55:20 +00:00
section, exists := content["kairos"]
if !exists {
return errors.New("no kairos section in config file")
}
2022-08-10 16:55:20 +00:00
dd, err := yaml.Marshal(section)
if err != nil {
return err
}
2022-08-10 16:55:20 +00:00
piece := map[string]interface{}{}
2022-08-10 16:55:20 +00:00
if err := yaml.Unmarshal(dd, &piece); err != nil {
return err
}
2022-08-10 16:55:20 +00:00
piece["network_token"] = token
content["kairos"] = piece
2022-08-10 16:55:20 +00:00
d, err := yaml.Marshal(content)
if err != nil {
return err
}
2022-08-10 16:55:20 +00:00
fi, err := os.Stat(f)
if err != nil {
return err
}
2022-08-10 16:55:20 +00:00
if err := ioutil.WriteFile(f, []byte(config.AddHeader(header, string(d))), fi.Mode().Perm()); err != nil {
return err
}
2022-08-10 16:55:20 +00:00
}
return nil
2022-08-10 16:55:20 +00:00
}