func run(desc string, fn func() (chan Response, error)) {
	println("################################################################################")
	println(">", desc)
	resp, err := fn()
	printResponses(resp, err)
}
Print the description, run the command, then print the results... easy
package main
import (
	. "github.com/aerospike/gommander"
	"golang.org/x/crypto/ssh"
	"bytes"
	"flag"
	"fmt"
	"strconv"
	"strings"
	"time"
)
func column(s string, w int) string {
	o := bytes.Buffer{}
	i := 0
	for ; i < len(s); i++ {
		o.WriteRune(rune(s[i]))
		if i >= w {
			break
		}
	}
	for j := i; j < w; j++ {
		o.WriteRune(' ')
	}
	return o.String()
}
func printResponses(responses chan Response, err error) {
	const layout = "2006-01-02 15:04:05 -0700"
	date := time.Now().Format(layout)
	sep := "]"
	if err != nil {
		panic(err)
	}
	for r := range responses {
		println("--------------------------------------------------------------------------------")
		exit := column(fmt.Sprintf("%d", r.ExitCode), 3)
		host := column(r.Node.Host, 15)
		epre := fmt.Sprintf("\033[0;91m%s %s %s %s %s  \033[0m", date, host, column(" ERR", 5), exit, sep)
		opre := fmt.Sprintf("\033[0;90m%s %s %s %s %s  \033[0m", date, host, column(" OUT", 5), exit, sep)
		ostr := strings.Trim(r.Stdout.String(), "\r\n ")
		if len(ostr) > 0 {
			for _, s := range strings.Split(ostr, "\n") {
				fmt.Println(opre + s)
			}
		} else {
			if r.ExitCode == 0 {
				fmt.Println(opre + "<SUCCESS>")
			}
		}
		estr := strings.Trim(r.Stderr.String(), "\r\n ")
		if len(estr) > 0 {
			for _, s := range strings.Split(estr, "\n") {
				fmt.Println(epre + s)
			}
		} else {
			if r.ExitCode != 0 {
				fmt.Println(epre + "<FAILURE>")
			}
		}
	}
}