diff --git a/hosts/hosts.go b/hosts/hosts.go index 8736444..5106f2a 100644 --- a/hosts/hosts.go +++ b/hosts/hosts.go @@ -1,5 +1,13 @@ package hosts +import ( + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" +) + // a host is a name and an address // memnarch expects an SSH private key to connect to Addr to exist at MEMNARCH_HOSTS/Name @@ -12,6 +20,27 @@ type RemoteMachine interface { Run(...string) error } -func (*Host) Run(cmdArgs ...string) error { +func (self *Host) Run(cmdArgs ...string) error { + // make sure keyfile exists + keysDir := os.Getenv("MEMNARCH_HOSTS") + keyfile := filepath.Join(keysDir, self.Name) + info, err := os.Stat(keyfile) + if (err != nil) { + return err + } + if (info.IsDir()) { + return errors.New("supposed keyfile is actually a directory") + } + // ssh in + completeArgs := append([]string{"-i", keyfile, "memnarch@"+self.Addr}, cmdArgs...) + sshCmd := exec.Command("ssh", completeArgs...) + output, err := sshCmd.CombinedOutput() + // TODO: log the metadata + fmt.Println(output) + // if error, return it + if err != nil { + return err + } + // otherwise... return nil } \ No newline at end of file