diff options
| author | Nick White <git@njw.name> | 2019-09-24 18:25:56 +0100 | 
|---|---|---|
| committer | Nick White <git@njw.name> | 2019-09-24 18:25:56 +0100 | 
| commit | 7ae391451e8245f6b51758b48f924e51b68c15fa (patch) | |
| tree | d2aa8ad9842e7d16ead2f12d8a2af560a9aefbff | |
| parent | 95b00283a25a005e76931d61ffe064d9a1dce7f0 (diff) | |
Get ssh logs from all running servers
| -rw-r--r-- | bookpipeline/cmd/lspipeline/main.go | 52 | 
1 files changed, 39 insertions, 13 deletions
| diff --git a/bookpipeline/cmd/lspipeline/main.go b/bookpipeline/cmd/lspipeline/main.go index a491cbc..9fb7a78 100644 --- a/bookpipeline/cmd/lspipeline/main.go +++ b/bookpipeline/cmd/lspipeline/main.go @@ -4,13 +4,13 @@ import (  	"flag"  	"fmt"  	"log" -	"os" +	"os/exec"  	"strings"  	"rescribe.xyz/go.git/bookpipeline"  ) -const usage = `Usage: lspipeline [-v] +const usage = `Usage: lspipeline [-i key] [-n num]  Lists useful things related to the pipeline. @@ -18,7 +18,7 @@ Lists useful things related to the pipeline.  - Messages in each queue  - Books not completed  - Books done -- Last 5 lines of bookpipeline logs from each running instance (with -v) +- Last n lines of bookpipeline logs from each running instance  `  type LsPipeliner interface { @@ -144,8 +144,25 @@ func getBookStatusChan(conn LsPipeliner, inprogressc chan string, donec chan str  	close(donec)  } +func getRecentSSHLogs(ip string, id string, n int) (string, error) { +	addr := fmt.Sprintf("%s@%s", "admin", ip) +	logcmd := fmt.Sprintf("journalctl -n %d -u bookpipeline", n) +	var cmd *exec.Cmd +	if id == "" { +		cmd = exec.Command("ssh", addr, logcmd) +	} else { +		cmd = exec.Command("ssh", "-i", id, addr, logcmd) +	} +	out, err := cmd.Output() +	if err != nil { +		return "", err +	} +	return string(out), nil +} +  func main() { -	verbose := flag.Bool("v", false, "verbose") +	keyfile := flag.String("i", "", "private key file for SSH") +	lognum := flag.Int("n", 5, "number of lines to include in SSH logs")  	flag.Usage = func() {  		fmt.Fprintf(flag.CommandLine.Output(), usage)  		flag.PrintDefaults() @@ -153,12 +170,8 @@ func main() {  	flag.Parse()  	var verboselog *log.Logger -	if *verbose { -		verboselog = log.New(os.Stdout, "", 0) -	} else { -		var n NullWriter -		verboselog = log.New(n, "", 0) -	} +	var n NullWriter +	verboselog = log.New(n, "", 0)  	var conn LsPipeliner  	conn = &bookpipeline.AwsConn{Region: "eu-west-2", Logger: verboselog} @@ -169,13 +182,15 @@ func main() {  	instances := make(chan bookpipeline.InstanceDetails, 100)  	queues := make(chan queueDetails) -	inprogress := make(chan string) -	done := make(chan string) +	inprogress := make(chan string, 100) +	done := make(chan string, 100)  	go getInstances(conn, instances)  	go getQueueDetails(conn, queues)  	go getBookStatusChan(conn, inprogress, done) +	var ips []string +  	fmt.Println("# Instances")  	for i := range instances {  		fmt.Printf("ID: %s, Type: %s, LaunchTime: %s, State: %s", i.Id, i.Type, i.LaunchTime, i.State) @@ -184,6 +199,7 @@ func main() {  		}  		if i.Ip != "" {  			fmt.Printf(", IP: %s", i.Ip) +			ips = append(ips, i.Ip)  		}  		if i.Spot != "" {  			fmt.Printf(", SpotRequest: %s", i.Spot) @@ -206,5 +222,15 @@ func main() {  		fmt.Println(i)  	} -	// TODO: See remaining items in the usage statement +	if len(ips) > 0 { +		fmt.Println("\n# Recent logs") +		for _, ip := range ips { +			logs, err := getRecentSSHLogs(ip, *keyfile, *lognum) +			if err != nil { +				log.Printf("Error running ssh for %s: %v\n", ip, err) +				continue +			} +			fmt.Printf("\n%s\n%s\n", ip, logs) +		} +	}  } | 
