diff --git a/merlin/arthur/arthur.go b/merlin/arthur/arthur.go index 11f28bf..2fda336 100644 --- a/merlin/arthur/arthur.go +++ b/merlin/arthur/arthur.go @@ -21,7 +21,7 @@ type RepoStatusInfo struct { Name string `json:"name"` IsRunning bool `json:"is_running"` LastAttemptStartTime int64 `json:"last_attempt_time"` - LastAttemptExit int `json:"last_attempt_exit"` + LastAttemptExit string `json:"last_attempt_exit"` LastSuccessfulAttemptStartTime int64 `json:"last_successful_attempt_time"` NextSyncTime int64 `json:"next_sync_time"` } @@ -72,7 +72,7 @@ func SendStatus(conn net.Conn) { Name: name, IsRunning: repo.State.IsRunning, LastAttemptStartTime: repo.State.LastAttemptStartTime, - LastAttemptExit: repo.State.LastAttemptExit, + LastAttemptExit: config.StatusToString(repo.State.LastAttemptExit), LastSuccessfulAttemptStartTime: repo.State.LastSuccessfulAttemptStartTime, } if repo.State.LastAttemptStartTime != 0 { diff --git a/merlin/arthur/arthur_test.go b/merlin/arthur/arthur_test.go index c1c4d37..1aeff5f 100644 --- a/merlin/arthur/arthur_test.go +++ b/merlin/arthur/arthur_test.go @@ -106,22 +106,25 @@ func TestSendStatus(t *testing.T) { IsRunning: true, LastAttemptStartTime: 1620000000, NextSyncTime: 1620604803, + LastAttemptExit: "completed", }, { Name: "eeeee", IsRunning: true, LastAttemptStartTime: 1600000000, NextSyncTime: 1602592000, + LastAttemptExit: "completed", }, { Name: "lnux", LastAttemptStartTime: 1640000000, NextSyncTime: 1640086400, + LastAttemptExit: "completed", }, }, } if !reflect.DeepEqual(&expected, &statusInfo) { - t.Errorf("Expected:\n%v\nGot:%v\n", &expected, &statusInfo) + t.Errorf("Expected:\n%+v\nGot:%+v\n", &expected, &statusInfo) } } diff --git a/merlin/cmd/arthur/arthur.go b/merlin/cmd/arthur/arthur.go index 2375074..9f1a80f 100644 --- a/merlin/cmd/arthur/arthur.go +++ b/merlin/cmd/arthur/arthur.go @@ -12,14 +12,13 @@ import ( "time" serverArthurPkg "git.csclub.uwaterloo.ca/public/merlin/arthur" - "git.csclub.uwaterloo.ca/public/merlin/config" ) // var DEFAULT_SOCKET_PATH = "/home/mirror/merlin/merlin.sock" var DEFAULT_SOCKET_PATH = "/mirror/merlin/run/merlin-go.sock" var HELP_MESSAGE = `USAGE: -arthur [-h|--help] [--sock ] COMMAND +arthur [-h|--help] [-json] [-sock ] COMMAND COMMANDS: sync:[repo] @@ -42,18 +41,22 @@ func main() { sockPath := flag.String("sock", DEFAULT_SOCKET_PATH, "alternate socket file") + var shouldOutputJson bool + flag.BoolVar(&shouldOutputJson, "json", false, "JSON output") + flag.Parse() if flag.NArg() < 1 { os.Exit(1) } + command := os.Args[1] conn, err := net.Dial("unix", *sockPath) if err != nil { log.Fatal(err) } - _, err = conn.Write([]byte(os.Args[1])) + _, err = conn.Write([]byte(command)) if err != nil { log.Fatal(err) } @@ -70,6 +73,16 @@ func main() { log.Fatal(err) } + if command == "status" && shouldOutputJson { + jsonOutput, jsonErr := json.MarshalIndent(&statusInfo, "", " ") + if jsonErr == nil { + fmt.Println(string(jsonOutput)) + } else { + log.Fatal(jsonErr) + } + return + } + writer := tabwriter.NewWriter(os.Stdout, 5, 5, 5, ' ', 0) // print out the state of each repo in the config (last and next sync time + if it is currently running) fmt.Fprintf(writer, "Repository\tLast Synced\tNext Expected Sync\tLast Exit\tRunning\n") @@ -78,7 +91,7 @@ func main() { repo.Name, unixTimeToStr(repo.LastAttemptStartTime), unixTimeToStr(repo.NextSyncTime), - config.StatusToString(repo.LastAttemptExit), + repo.LastAttemptExit, repo.IsRunning, ) }