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  }