blob: c634b594ff8f566381cb86524d12dee1aa05236c [file] [log] [blame]
Robert Kroegerdd07b362014-09-18 17:34:42 -07001// +build linux darwin
2
3package impl
4
5import (
Robert Kroeger5dce7f52014-10-28 09:22:40 -07006 "fmt"
Robert Kroegerdd07b362014-09-18 17:34:42 -07007 "log"
Robert Kroeger5dce7f52014-10-28 09:22:40 -07008 "os"
Robert Kroegera99ad142014-10-30 17:56:39 -07009 "path/filepath"
Robert Kroegerdd07b362014-09-18 17:34:42 -070010 "syscall"
11)
12
13// Chown is only availabe on UNIX platforms so this file has a build
14// restriction.
15func (hw *WorkParameters) Chown() error {
Robert Kroegera99ad142014-10-30 17:56:39 -070016 chown := func(path string, _ os.FileInfo, inerr error) error {
17 if inerr != nil {
18 return inerr
19 }
Robert Kroeger5dce7f52014-10-28 09:22:40 -070020 if hw.dryrun {
21 log.Printf("[dryrun] os.Chown(%s, %d, %d)", path, hw.uid, hw.gid)
22 return nil
23 }
24 return os.Chown(path, hw.uid, hw.gid)
25 }
Robert Kroegerdd07b362014-09-18 17:34:42 -070026
Robert Kroegera99ad142014-10-30 17:56:39 -070027 for _, p := range []string{hw.workspace, hw.logDir} {
Bogdan Caprita2b219362014-12-09 17:03:33 -080028 // TODO(rjkroege): Ensure that the device manager can read log entries.
Robert Kroegera99ad142014-10-30 17:56:39 -070029 if err := filepath.Walk(p, chown); err != nil {
Robert Kroeger5dce7f52014-10-28 09:22:40 -070030 return fmt.Errorf("os.Chown(%s, %d, %d) failed: %v", p, hw.uid, hw.gid, err)
31 }
32 }
Robert Kroegerdd07b362014-09-18 17:34:42 -070033 return nil
34}
35
36func (hw *WorkParameters) Exec() error {
Robert Kroegerc6175582014-11-21 16:03:16 -080037 attr := new(syscall.ProcAttr)
38
39 if dir, err := os.Getwd(); err != nil {
40 log.Printf("error Getwd(): %v\n", err)
41 return fmt.Errorf("os.Getwd failed: %v", err)
42 attr.Dir = dir
43 }
44 attr.Env = hw.envv
45
Robert Kroeger03eebbc2015-01-28 13:06:22 -080046 attr.Sys = new(syscall.SysProcAttr)
47 attr.Sys.Setsid = true
Robert Kroeger5dce7f52014-10-28 09:22:40 -070048 if hw.dryrun {
Robert Kroeger5dce7f52014-10-28 09:22:40 -070049 log.Printf("[dryrun] syscall.Setgid(%d)", hw.gid)
Robert Kroeger356fe812014-10-31 12:01:25 -070050 log.Printf("[dryrun] syscall.Setuid(%d)", hw.uid)
Robert Kroeger5dce7f52014-10-28 09:22:40 -070051 } else {
Robert Kroegerc6175582014-11-21 16:03:16 -080052 attr.Sys.Credential = new(syscall.Credential)
53 attr.Sys.Credential.Gid = uint32(hw.gid)
54 attr.Sys.Credential.Uid = uint32(hw.uid)
Robert Kroeger5dce7f52014-10-28 09:22:40 -070055 }
Robert Kroegerc6175582014-11-21 16:03:16 -080056
57 _, _, err := syscall.StartProcess(hw.argv0, hw.argv, attr)
58 if err != nil {
59 if !hw.dryrun {
60 log.Printf("StartProcess failed: attr: %#v, attr.Sys: %#v, attr.Sys.Cred: %#v error: %v\n", attr, attr.Sys, attr.Sys.Credential, err)
61 } else {
62 log.Printf("StartProcess failed: %v", err)
63 }
64 return fmt.Errorf("syscall.StartProcess(%s) failed: %v", hw.argv0, err)
65 }
66 // TODO(rjkroege): Return the pid to the node manager.
67 os.Exit(0)
68 return nil // Not reached.
Robert Kroegerdd07b362014-09-18 17:34:42 -070069}
Robert Kroeger93550552014-10-28 16:42:53 -070070
71func (hw *WorkParameters) Remove() error {
72 for _, p := range hw.argv {
73 if err := os.RemoveAll(p); err != nil {
74 return fmt.Errorf("os.RemoveAll(%s) failed: %v", p, err)
75 }
76 }
77 return nil
78}