Newer
Older
package main
import (
"encoding/json"
"flag"
"fmt"
"log"
"os"
"path"
"sort"
"strconv"
"strings"
)
const (
DefaultURL = "http://localhost:8545"
)
func printVotes(node *bfa.Node, useJson bool) {
votes := node.GetVotes(-1)
if useJson {
v, err := json.MarshalIndent(votes, "", " ")
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, "", " ")
fmt.Println(string(v))
}
func printSealers(node *Node, useJson bool) {
sealers := node.SealersStatus()
if useJson {
v, err := json.MarshalIndent(sealers, "", " ")
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
}
defer node.Close()
switch command {
case "sealers":
printSealers(node, useJson)
case "proposals":
printVotes(node, useJson)
case "sealerInfo":
for i := 0; i < flags.NArg(); i++ {