From 38907f6bc2759aaa0d6977ca15b037e4423c1519 Mon Sep 17 00:00:00 2001 From: wh1te909 Date: Fri, 1 Jul 2022 19:10:10 +0000 Subject: [PATCH] fix linux agent update when /tmp on different fs fixes #10 --- agent/agent_unix.go | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/agent/agent_unix.go b/agent/agent_unix.go index 42630c7..55c9d97 100644 --- a/agent/agent_unix.go +++ b/agent/agent_unix.go @@ -18,6 +18,7 @@ import ( "bufio" "fmt" "os" + "path/filepath" "runtime" "strconv" "strings" @@ -249,8 +250,29 @@ func (a *Agent) AgentUpdate(url, inno, version string) { os.Chmod(f.Name(), 0755) err = os.Rename(f.Name(), self) if err != nil { - a.Logger.Errorln("AgentUpdate() os.Rename():", err) - return + a.Logger.Debugln("Detected /tmp on different filesystem") + // rename does not work when src and dest are on different filesystems + // so we need to manually copy it to the same fs then rename it + cwd, err := os.Getwd() + if err != nil { + a.Logger.Errorln("AgentUpdate() os.Getwd():", err) + return + } + // create a tmpfile in same fs as agent + tmpfile := filepath.Join(cwd, GenerateAgentID()) + defer os.Remove(tmpfile) + a.Logger.Debugln("Copying tmpfile from", f.Name(), "to", tmpfile) + cperr := copyFile(f.Name(), tmpfile) + if cperr != nil { + a.Logger.Errorln("AgentUpdate() copyFile:", cperr) + return + } + os.Chmod(tmpfile, 0755) + rerr := os.Rename(tmpfile, self) + if rerr != nil { + a.Logger.Errorln("AgentUpdate() os.Rename():", rerr) + return + } } opts := a.NewCMDOpts()