Chmod and Chown may not be supported

master
Tamás Gulácsi 2016-04-01 22:37:28 +02:00
parent 0c0c51cbe0
commit 1956e2633b
4 changed files with 39 additions and 3 deletions

View File

@ -233,11 +233,11 @@ func (mp *master) fetch() {
return
}
//copy permissions
if err := tmpBin.Chmod(mp.binPerms); err != nil {
if err := chmod(tmpBin, mp.binPerms); err != nil {
mp.warnf("failed to make temp binary executable: %s", err)
return
}
if err := tmpBin.Chown(uid, gid); err != nil {
if err := chown(tmpBin, uid, gid); err != nil {
mp.warnf("failed to change owner of binary: %s", err)
return
}

View File

@ -7,6 +7,7 @@ package overseer
//in some other way on other OSs... TODO!
import (
"os"
"os/exec"
"syscall"
)
@ -21,8 +22,18 @@ var (
)
func move(dst, src string) error {
if err := os.Rename(src, dst); err == nil {
return nil
}
//HACK: we're shelling out to mv because linux
//throws errors when crossing device boundaryes.
//TODO see sys_posix_mv.go
return exec.Command("mv", src, dst).Run()
}
func chmod(f *os.File, perms os.FileMode) error {
return f.Chmod(perms)
}
func chown(f *os.File, uid, gid int) error {
return f.Chown(uid, gid)
}

View File

@ -19,3 +19,11 @@ var (
func move(dst, src string) error {
return errors.New("Not supported")
}
func chmod(f *os.File, perms os.FileMode) error {
return errors.New("Not supported")
}
func chown(f *os.File, uid, gid int) error {
return errors.New("Not supported")
}

View File

@ -3,8 +3,11 @@
package overseer
import (
"bytes"
"fmt"
"os"
"os/exec"
"path/filepath"
"syscall"
)
@ -18,12 +21,26 @@ var (
)
func move(dst, src string) error {
os.MkdirAll(filepath.Dir(dst), 0755)
if err := os.Rename(src, dst); err == nil {
return nil
}
//HACK: we're shelling out to move because windows
//throws errors when crossing device boundaryes.
// https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/move.mspx?mfr=true
cmd := exec.Command("cmd", "/c", `move /y "`+src+`" "`+dst+`"`)
if b, err := cmd.CombinedOutput(); err != nil {
return fmt.Errorf("%q: %v: %v", cmd.Args, b, err)
return fmt.Errorf("%v: %q: %v", cmd.Args, bytes.TrimSpace(b), err)
}
return nil
}
func chmod(f *os.File, perms os.FileMode) error {
_ = f.Chmod(perms)
return nil
}
func chown(f *os.File, uid, gid int) error {
_ = f.Chown(uid, gid)
return nil
}