2022-08-10 16:55:20 +00:00
|
|
|
package provider
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2022-10-21 16:52:41 +00:00
|
|
|
"io/ioutil"
|
2022-08-10 16:55:20 +00:00
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
|
2022-10-20 21:01:41 +00:00
|
|
|
"github.com/kairos-io/kairos/pkg/machine"
|
2022-11-07 11:41:46 +00:00
|
|
|
"github.com/kairos-io/kairos/pkg/machine/systemd"
|
2022-09-16 15:42:45 +00:00
|
|
|
"github.com/kairos-io/kairos/pkg/utils"
|
|
|
|
providerConfig "github.com/kairos-io/provider-kairos/internal/provider/config"
|
|
|
|
"github.com/kairos-io/provider-kairos/internal/services"
|
2022-10-20 21:01:41 +00:00
|
|
|
"gopkg.in/yaml.v3"
|
2022-08-10 16:55:20 +00:00
|
|
|
|
|
|
|
yip "github.com/mudler/yip/pkg/schema"
|
|
|
|
)
|
|
|
|
|
2022-10-21 16:52:41 +00:00
|
|
|
func SaveOEMCloudConfig(name string, yc yip.YipConfig) error {
|
|
|
|
dnsYAML, err := yaml.Marshal(yc)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return ioutil.WriteFile(filepath.Join("oem", fmt.Sprintf("100_%s.yaml", name)), dnsYAML, 0700)
|
|
|
|
}
|
2022-08-10 16:55:20 +00:00
|
|
|
func SetupVPN(instance, apiAddress, rootDir string, start bool, c *providerConfig.Config) error {
|
|
|
|
|
2022-09-19 09:59:28 +00:00
|
|
|
if c.Kairos == nil || c.Kairos.NetworkToken == "" {
|
2022-08-10 16:55:20 +00:00
|
|
|
return fmt.Errorf("no network token defined")
|
|
|
|
}
|
|
|
|
|
2022-08-12 07:51:59 +00:00
|
|
|
svc, err := services.EdgeVPN(instance, rootDir)
|
2022-08-10 16:55:20 +00:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("could not create svc: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
apiAddress = strings.ReplaceAll(apiAddress, "https://", "")
|
|
|
|
apiAddress = strings.ReplaceAll(apiAddress, "http://", "")
|
|
|
|
|
|
|
|
vpnOpts := map[string]string{
|
2022-10-30 14:44:09 +00:00
|
|
|
"EDGEVPNTOKEN": c.Kairos.NetworkToken,
|
|
|
|
"API": "true",
|
|
|
|
"APILISTEN": apiAddress,
|
|
|
|
"DHCP": "true",
|
|
|
|
"DHCPLEASEDIR": "/usr/local/.kairos/lease",
|
2022-08-10 16:55:20 +00:00
|
|
|
}
|
|
|
|
// Override opts with user-supplied
|
|
|
|
for k, v := range c.VPN {
|
|
|
|
vpnOpts[k] = v
|
|
|
|
}
|
|
|
|
|
2022-09-19 09:59:28 +00:00
|
|
|
if c.Kairos.DNS {
|
2022-08-10 16:55:20 +00:00
|
|
|
vpnOpts["DNSADDRESS"] = "127.0.0.1:53"
|
|
|
|
vpnOpts["DNSFORWARD"] = "true"
|
2022-10-20 21:01:41 +00:00
|
|
|
|
|
|
|
dnsConfig := yip.YipConfig{
|
2022-08-10 16:55:20 +00:00
|
|
|
Name: "DNS Configuration",
|
|
|
|
Stages: map[string][]yip.Stage{
|
2022-10-21 16:52:41 +00:00
|
|
|
"initramfs": {
|
|
|
|
{
|
|
|
|
Files: []yip.File{{
|
2022-12-03 19:56:19 +00:00
|
|
|
Permissions: 0644,
|
|
|
|
Path: "/etc/systemd/resolved.conf", Content: `
|
2022-10-21 16:52:41 +00:00
|
|
|
[Resolve]
|
|
|
|
DNS=127.0.0.1`,
|
|
|
|
}},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Dns: yip.DNS{Nameservers: []string{"127.0.0.1"}}},
|
|
|
|
}},
|
2022-10-20 21:01:41 +00:00
|
|
|
}
|
|
|
|
|
2022-11-07 11:41:46 +00:00
|
|
|
dat, _ := yaml.Marshal(&dnsConfig)
|
2022-12-03 19:56:19 +00:00
|
|
|
_ = machine.ExecuteInlineCloudConfig(string(dat), "initramfs")
|
2022-11-07 11:41:46 +00:00
|
|
|
if !utils.IsOpenRCBased() {
|
|
|
|
svc, err := systemd.NewService(
|
|
|
|
systemd.WithName("systemd-resolved"),
|
|
|
|
)
|
|
|
|
if err == nil {
|
2022-12-03 19:56:19 +00:00
|
|
|
_ = svc.Restart()
|
2022-11-07 11:41:46 +00:00
|
|
|
}
|
2022-10-20 21:01:41 +00:00
|
|
|
}
|
|
|
|
|
2022-10-21 16:52:41 +00:00
|
|
|
if err := SaveOEMCloudConfig("vpn_dns", dnsConfig); err != nil {
|
2022-08-10 16:55:20 +00:00
|
|
|
return fmt.Errorf("could not create dns config: %w", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
os.MkdirAll("/etc/systemd/system.conf.d/", 0600) //nolint:errcheck
|
|
|
|
// Setup edgevpn instance
|
2022-09-16 15:42:45 +00:00
|
|
|
err = utils.WriteEnv(filepath.Join(rootDir, "/etc/systemd/system.conf.d/edgevpn-kairos.env"), vpnOpts)
|
2022-08-10 16:55:20 +00:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("could not create write env file: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = svc.WriteUnit()
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("could not create write unit file: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if start {
|
|
|
|
err = svc.Start()
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("could not start svc: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return svc.Enable()
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|