package main import ( "encoding/json" "flag" "fmt" "log" "os" "path" "sort" "strconv" "strings" "../util" "../bfa" ) const ( DefaultURL = "http://localhost:8545" ) type Node = bfa.Node func printVotes(node *bfa.Node, useJson bool) { votes := node.GetVotes(-1) if useJson { v, err := json.MarshalIndent(votes, "", " ") util.Check(err) fmt.Println(string(v)) return } fmt.Printf("Bloque: %d\nPropuestas en curso: %d\n", votes.BlockNumber, len(votes.Proposals)) for _, proposal := range votes.Proposals { fmt.Printf("Propuesta: %v\n", proposal) for _, signer := range votes.Signers { b := votes.Votes[proposal][signer] var v string if b == nil { v = "" } else { v = strconv.FormatBool(*b) } fmt.Printf("\t%v: %v\n", signer, v) } tally := votes.Tally[proposal] fmt.Printf("A favor: %v, en contra: %v, no votaron: %v\n", tally.True, tally.False, tally.Null) } } func printSealerInfo(node *Node, sealer string) { info, err := node.SealerInfo(sealer) util.Check(err) v, err := json.MarshalIndent(info, "", " ") util.Check(err) fmt.Println(string(v)) } func printSealers(node *Node, useJson bool) { sealers := node.SealersStatus() if useJson { v, err := json.MarshalIndent(sealers, "", " ") util.Check(err) fmt.Println(string(v)) return } var list []string for sealer := range sealers { list = append(list, sealer) } sort.Slice(list, func(i, j int) bool { return sealers[list[i]] > sealers[list[j]] }) length := len(strconv.FormatInt(sealers[list[0]], 10)) for _, sealer := range list { fmt.Printf("%v: %*d\n", sealer, length, sealers[sealer]) } } func main() { var ( url string useJson bool help bool flags flag.FlagSet command = "" commands = []string{"sealers", "proposals", "sealerInfo"} desc = map[string]string{ "proposals": "Detalla el estado de una votación", "sealerInfo": "Brinda datos sobre un sealer", "sealers": "Brinda información sobre la última actividad de los selladores", } ) defer func() { if err := recover(); err != nil { log.Fatalf("Error: %s", err) } }() if len(os.Args) > 1 { command = os.Args[1] } if !util.Contains(commands, command) { fmt.Fprintf(os.Stderr, "Uso: %v <%v> [opciones]\n", path.Base(os.Args[0]), strings.Join(commands, "|")) fmt.Fprintf(os.Stderr, "For help: %v <command> -h\n", path.Base(os.Args[0])) os.Exit(1) } flags.BoolVar(&useJson, "json", false, "Produce salida en formato json") flags.StringVar(&url, "url", DefaultURL, "URL para conexión con geth. Ejemplo: /home/bfa/bfa/network/node/geth.ipc") //flags.BoolVar(&help, "h", false, "") //flags.BoolVar(&help, "help", false, "Muestra esta ayuda") flags.Parse(os.Args[2:]) if help { fmt.Fprintf(os.Stderr, "Uso: %v %v [opciones]\n%v\nOpciones: \n", path.Base(os.Args[0]), command, desc[command]) flags.PrintDefaults() return } node := bfa.Dial(url) defer node.Close() switch command { case "sealers": printSealers(node, useJson) case "proposals": printVotes(node, useJson) case "sealerInfo": for i := 0; i < flags.NArg(); i++ { printSealerInfo(node, flags.Arg(i)) } } }