mirror of
https://github.com/speatzle/nfsense.git
synced 2025-05-11 19:08:20 +00:00
75 lines
1.5 KiB
Go
75 lines
1.5 KiB
Go
package networkd
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
|
|
"golang.org/x/exp/slog"
|
|
"nfsense.net/nfsense/internal/definitions"
|
|
)
|
|
|
|
const basepath = "/etc/systemd/network"
|
|
|
|
func ApplyNetworkdConfiguration(currentConfig definitions.Config, pendingConfig definitions.Config) error {
|
|
files, err := GenerateNetworkdConfiguration(pendingConfig)
|
|
if err != nil {
|
|
return fmt.Errorf("Generating Networkd Configuration: %w", err)
|
|
}
|
|
|
|
err = RemoveContents(basepath)
|
|
if err != nil {
|
|
return fmt.Errorf("Removing old Config Files: %w", err)
|
|
}
|
|
|
|
for _, file := range files {
|
|
f, err := os.Create(basepath + "/" + file.Name)
|
|
if err != nil {
|
|
return fmt.Errorf("creating File: %w", err)
|
|
}
|
|
|
|
_, err = f.WriteString(file.Content + "\n")
|
|
if err != nil {
|
|
return fmt.Errorf("writing File: %w", err)
|
|
}
|
|
|
|
err = f.Sync()
|
|
if err != nil {
|
|
return fmt.Errorf("syncing File: %w", err)
|
|
}
|
|
}
|
|
|
|
cmd := exec.Command("systemctl", "restart", "systemd-networkd")
|
|
|
|
var out bytes.Buffer
|
|
cmd.Stdout = &out
|
|
|
|
err = cmd.Run()
|
|
if err != nil {
|
|
return fmt.Errorf("restarting networkd: %w", err)
|
|
}
|
|
slog.Info("networkd output", "out", out.String())
|
|
|
|
return nil
|
|
}
|
|
|
|
func RemoveContents(dir string) error {
|
|
d, err := os.Open(dir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer d.Close()
|
|
names, err := d.Readdirnames(-1)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, name := range names {
|
|
err = os.RemoveAll(filepath.Join(dir, name))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|