@@ -390,6 +390,28 @@ func (nc *nspawnCluster) MemberCommand(m Member, args ...string) (string, error)
390
390
return stdoutBytes .String (), err
391
391
}
392
392
393
+ // MemberCommandStderr() is like MemberCommand(), except that it returns
394
+ // both stdout and stderr from the running command. This is definitely useful
395
+ // for most cases, especially when the caller needs to check for both stdout
396
+ // and stderr.
397
+ //
398
+ // NOTE: Ideally we should remove MemberCommand() above, and rename
399
+ // MemberCommandStderr() to MemberCommand(). For doing that, however, we need
400
+ // to change every call site to replace MemberCommand() with MemberCommandStderr().
401
+ // Of course that would be a lot of work. I'll leave that to future work.
402
+ // - dpark 20161102
403
+ func (nc * nspawnCluster ) MemberCommandStderr (m Member , args ... string ) (string , string , error ) {
404
+ baseArgs := []string {"-o" , "UserKnownHostsFile=/dev/null" , "-o" , "StrictHostKeyChecking=no" , fmt .Sprintf ("core@%s" , m .IP ())}
405
+ args = append (baseArgs , args ... )
406
+ log .Printf ("ssh %s" , strings .Join (args , " " ))
407
+ var stdoutBytes , stderrBytes bytes.Buffer
408
+ cmd := exec .Command ("ssh" , args ... )
409
+ cmd .Stdout = & stdoutBytes
410
+ cmd .Stderr = & stderrBytes
411
+ err := cmd .Run ()
412
+ return stdoutBytes .String (), stderrBytes .String (), err
413
+ }
414
+
393
415
func (nc * nspawnCluster ) CreateMember () (m Member , err error ) {
394
416
id := nc .nextID ()
395
417
log .Printf ("Creating nspawn machine %s in cluster %s" , id , nc .name )
0 commit comments