github.com/loomnetwork/gamechain@v0.0.0-20200406110549-36c47eb97a92/tools/gamechain-debugger/cmd/root.go (about) 1 package cmd 2 3 import ( 4 "encoding/base64" 5 "fmt" 6 "io/ioutil" 7 "net/http" 8 "os" 9 10 "github.com/gorilla/mux" 11 "github.com/loomnetwork/gamechain/tools/gamechain-debugger/controller" 12 13 "github.com/spf13/cobra" 14 "github.com/spf13/viper" 15 ) 16 17 var rootCmdArgs struct { 18 privateKeyFilePath string 19 port string 20 cliFilePath string 21 } 22 23 func verifyFlag() error { 24 if err := readKeyFile(); err != nil { 25 return err 26 } 27 if err := checkCli(); err != nil { 28 return err 29 } 30 return nil 31 } 32 33 func checkCli() error { 34 if _, err := os.Stat(rootCmdArgs.cliFilePath); os.IsNotExist(err) { 35 fmt.Println("Cli file doesn't exist, please use flag -b [file path]") 36 return err 37 } 38 return nil 39 } 40 41 func readKeyFile() error { 42 fileContents, err := ioutil.ReadFile(rootCmdArgs.privateKeyFilePath) 43 if err != nil { 44 fmt.Printf("Cannot read file, please use flag -k [key path]") 45 return err 46 } 47 48 decodeBuffer := make([]byte, len(fileContents)) 49 _, err = base64.StdEncoding.Decode(decodeBuffer, fileContents) 50 if err != nil { 51 return fmt.Errorf("invalid base64 content in private key file: %s", 52 rootCmdArgs.privateKeyFilePath) 53 } 54 55 return nil 56 } 57 58 var rootCmd = &cobra.Command{ 59 Use: "gamechain-debugger", 60 Short: "A tool for gamestate debugging", 61 Run: func(cmd *cobra.Command, args []string) { 62 if verifyFlag() != nil { 63 return 64 } 65 Serve() 66 }, 67 } 68 69 func Execute() error { 70 rootCmd.PersistentFlags().StringVarP(&rootCmdArgs.privateKeyFilePath, "key", "k", "priv", "Private key file path") 71 rootCmd.PersistentFlags().StringVarP(&rootCmdArgs.port, "port", "p", "3000", "Running port for web server") 72 rootCmd.PersistentFlags().StringVarP(&rootCmdArgs.cliFilePath, "cli", "b", "./zb-cli", "path to zb-cli") 73 viper.BindPFlag("key", rootCmd.PersistentFlags().Lookup("key")) 74 viper.BindPFlag("port", rootCmd.PersistentFlags().Lookup("port")) 75 viper.BindPFlag("cli", rootCmd.PersistentFlags().Lookup("cli")) 76 return rootCmd.Execute() 77 } 78 79 func Serve() { 80 fmt.Println("Gamechain Debugger is running on port " + rootCmdArgs.port) 81 r := mux.NewRouter() 82 mc := controller.NewMainController(rootCmdArgs.cliFilePath, rootCmdArgs.privateKeyFilePath) 83 r.HandleFunc("/", mc.GamechainDebugger) 84 r.HandleFunc("/client_state", mc.ClientStateDebugger) 85 r.HandleFunc("/cli", mc.CliDebugger) 86 r.HandleFunc("/get_state/{MatchId}", mc.GetState) 87 r.HandleFunc("/save_state/{MatchId}", mc.SaveState) 88 r.HandleFunc("/run_cli", mc.RunCli) 89 http.ListenAndServe(":"+rootCmdArgs.port, r) 90 }