mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-02-03 22:18:39 +00:00
77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
package cli
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/coreos/go-systemd/v22/dbus"
|
|
)
|
|
|
|
const (
|
|
nmConfDir = "/etc/NetworkManager/conf.d"
|
|
nmCtrldConfFilename = "99-ctrld.conf"
|
|
nmCtrldConfContent = `[main]
|
|
dns=none
|
|
systemd-resolved=false
|
|
`
|
|
nmSystemdUnitName = "NetworkManager.service"
|
|
systemdEnabledState = "enabled"
|
|
)
|
|
|
|
var networkManagerCtrldConfFile = filepath.Join(nmConfDir, nmCtrldConfFilename)
|
|
|
|
func setupNetworkManager() error {
|
|
if content, _ := os.ReadFile(nmCtrldConfContent); string(content) == nmCtrldConfContent {
|
|
mainLog.Load().Debug().Msg("NetworkManager already setup, nothing to do")
|
|
return nil
|
|
}
|
|
err := os.WriteFile(networkManagerCtrldConfFile, []byte(nmCtrldConfContent), os.FileMode(0644))
|
|
if os.IsNotExist(err) {
|
|
mainLog.Load().Debug().Msg("NetworkManager is not available")
|
|
return nil
|
|
}
|
|
if err != nil {
|
|
mainLog.Load().Debug().Err(err).Msg("could not write NetworkManager ctrld config file")
|
|
return err
|
|
}
|
|
|
|
reloadNetworkManager()
|
|
mainLog.Load().Debug().Msg("setup NetworkManager done")
|
|
return nil
|
|
}
|
|
|
|
func restoreNetworkManager() error {
|
|
err := os.Remove(networkManagerCtrldConfFile)
|
|
if os.IsNotExist(err) {
|
|
mainLog.Load().Debug().Msg("NetworkManager is not available")
|
|
return nil
|
|
}
|
|
if err != nil {
|
|
mainLog.Load().Debug().Err(err).Msg("could not remove NetworkManager ctrld config file")
|
|
return err
|
|
}
|
|
|
|
reloadNetworkManager()
|
|
mainLog.Load().Debug().Msg("restore NetworkManager done")
|
|
return nil
|
|
}
|
|
|
|
func reloadNetworkManager() {
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
|
|
defer cancel()
|
|
conn, err := dbus.NewSystemConnectionContext(ctx)
|
|
if err != nil {
|
|
mainLog.Load().Error().Err(err).Msg("could not create new system connection")
|
|
return
|
|
}
|
|
defer conn.Close()
|
|
|
|
waitCh := make(chan string)
|
|
if _, err := conn.ReloadUnitContext(ctx, nmSystemdUnitName, "ignore-dependencies", waitCh); err != nil {
|
|
mainLog.Load().Debug().Err(err).Msg("could not reload NetworkManager")
|
|
}
|
|
<-waitCh
|
|
}
|