From 2765487f10f34db52118c2ed3c51322ad6e4f337 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Thu, 7 Sep 2023 11:13:52 +0000 Subject: [PATCH] cmd/cli: use better approach for detecting NetworkManager Currently, ctrld assumes that NetworkManager is not available if writing to /etc/NetworkManager/conf.d return directory not exist error. That would work on most Linux distros. However, cloud provider may do some hacks, causing ctrld confusion and think that NetworkManager is available. Fixing this by checking whether NetworkManager binary presents first. While at it, also fixing a bug when restarting NetworkManager failed causing ctrld hangs. The go-systemd library is not clear about this, but the waitCh channel won't never be closed if error occurred, so we must return immediately instead of receiving from it blindly. --- cmd/cli/network_manager_linux.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/cmd/cli/network_manager_linux.go b/cmd/cli/network_manager_linux.go index 5e7b540..1a8c22b 100644 --- a/cmd/cli/network_manager_linux.go +++ b/cmd/cli/network_manager_linux.go @@ -3,6 +3,7 @@ package cli import ( "context" "os" + "os/exec" "path/filepath" "time" @@ -16,13 +17,21 @@ const ( dns=none systemd-resolved=false ` - nmSystemdUnitName = "NetworkManager.service" - systemdEnabledState = "enabled" + nmSystemdUnitName = "NetworkManager.service" ) var networkManagerCtrldConfFile = filepath.Join(nmConfDir, nmCtrldConfFilename) +// hasNetworkManager reports whether NetworkManager executable found. +func hasNetworkManager() bool { + exe, _ := exec.LookPath("NetworkManager") + return exe != "" +} + func setupNetworkManager() error { + if !hasNetworkManager() { + return nil + } if content, _ := os.ReadFile(nmCtrldConfContent); string(content) == nmCtrldConfContent { mainLog.Load().Debug().Msg("NetworkManager already setup, nothing to do") return nil @@ -43,6 +52,9 @@ func setupNetworkManager() error { } func restoreNetworkManager() error { + if !hasNetworkManager() { + return nil + } err := os.Remove(networkManagerCtrldConfFile) if os.IsNotExist(err) { mainLog.Load().Debug().Msg("NetworkManager is not available") @@ -71,6 +83,7 @@ func reloadNetworkManager() { 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") + return } <-waitCh }