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 type Host struct { Name string Addr string } type RemoteMachine interface { Run(...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 }