github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/cmd/jujud/run_linux.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package main 5 6 import ( 7 "fmt" 8 "net/rpc" 9 "os" 10 "path/filepath" 11 12 "launchpad.net/juju-core/juju/osenv" 13 "launchpad.net/juju-core/utils/exec" 14 "launchpad.net/juju-core/worker/uniter" 15 ) 16 17 18 func (c *RunCommand) executeInUnitContext() (*exec.ExecResponse, error) { 19 unitDir := filepath.Join(AgentDir, c.unit) 20 logger.Debugf("looking for unit dir %s", unitDir) 21 // make sure the unit exists 22 _, err := os.Stat(unitDir) 23 if os.IsNotExist(err) { 24 return nil, fmt.Errorf("unit %q not found on this machine", c.unit) 25 } else if err != nil { 26 return nil, err 27 } 28 29 socketPath := filepath.Join(unitDir, uniter.RunListenerFile) 30 // make sure the socket exists 31 client, err := rpc.Dial(osenv.SocketType, socketPath) 32 if err != nil { 33 return nil, err 34 } 35 defer client.Close() 36 37 var result exec.ExecResponse 38 err = client.Call(uniter.JujuRunEndpoint, c.commands, &result) 39 return &result, err 40 } 41 42 func (c *RunCommand) executeNoContext() (*exec.ExecResponse, error) { 43 // Acquire the uniter hook execution lock to make sure we don't 44 // stomp on each other. 45 lock, err := getLock() 46 if err != nil { 47 return nil, err 48 } 49 err = lock.Lock("juju-run") 50 if err != nil { 51 return nil, err 52 } 53 defer lock.Unlock() 54 55 runCmd := `[ -f "/home/ubuntu/.juju-proxy" ] && . "/home/ubuntu/.juju-proxy"` + "\n" + c.commands 56 57 return exec.RunCommands( 58 exec.RunParams{ 59 Commands: runCmd, 60 }) 61 }