Skip to content
Snippets Groups Projects
bfa_client.go 3.09 KiB
Newer Older
package main

import (
	"encoding/json"
	"flag"
	"fmt"
	"log"
	"os"
	"path"
	"sort"
	"strconv"
	"strings"
)

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, "", "  ")
		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
	}
	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))