From e8d73d83ef393bd4702ed69d65003c39370ed267 Mon Sep 17 00:00:00 2001 From: David Hill Date: Tue, 8 Oct 2013 21:18:49 -0400 Subject: [PATCH] Add btcctl; currently a barebones utility to send commands to btcd. --- util/btcctl/btcctl.go | 147 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 util/btcctl/btcctl.go diff --git a/util/btcctl/btcctl.go b/util/btcctl/btcctl.go new file mode 100644 index 00000000..71348743 --- /dev/null +++ b/util/btcctl/btcctl.go @@ -0,0 +1,147 @@ +package main + +import ( + "errors" + "flag" + "fmt" + "github.com/conformal/btcjson" + "github.com/davecgh/go-spew/spew" + "strconv" +) + +const ( + User = "rpcuser" + Password = "rpcpass" + Server = "127.0.0.1:8332" +) + +var ( + ErrNoData = errors.New("No data returned.") +) + +func main() { + flag.Parse() + + args := flag.Args() + if len(args) < 1 { + usage() + return + } + + switch args[0] { + default: + usage() + case "getblock": + if len(args) != 2 { + usage() + break + } + msg, err := btcjson.CreateMessage("getblock", args[1]) + if err != nil { + fmt.Printf("CreateMessage: %v\n", err) + break + } + reply, err := send(msg) + if err != nil { + fmt.Printf("RpcCommand: %v\n", err) + break + } + spew.Dump(reply.(btcjson.BlockResult)) + case "getblockcount": + msg, err := btcjson.CreateMessage("getblockcount") + if err != nil { + fmt.Printf("CreateMessage: %v\n", err) + break + } + reply, err := send(msg) + if err != nil { + fmt.Printf("RpcCommand: %v\n", err) + break + } + fmt.Printf("%d\n", int(reply.(float64))) + case "getblockhash": + if len(args) != 2 { + usage() + break + } + idx, err := strconv.Atoi(args[1]) + if err != nil { + fmt.Printf("Atoi: %v\n", err) + break + } + msg, err := btcjson.CreateMessage("getblockhash", idx) + if err != nil { + fmt.Printf("CreateMessage: %v\n", err) + break + } + reply, err := send(msg) + if err != nil { + fmt.Printf("RpcCommand: %v\n", err) + break + } + fmt.Printf("%v\n", reply) + case "getgenerate": + msg, err := btcjson.CreateMessage("getgenerate") + if err != nil { + fmt.Printf("CreateMessage: %v\n", err) + break + } + reply, err := send(msg) + if err != nil { + fmt.Printf("RpcCommand: %v\n", err) + break + } + fmt.Printf("%v\n", reply.(bool)) + case "getrawtransaction": + if len(args) != 2 { + usage() + break + } + msg, err := btcjson.CreateMessage("getrawtransaction", args[1], 1) + if err != nil { + fmt.Printf("CreateMessage: %v\n", err) + break + } + reply, err := send(msg) + if err != nil { + fmt.Printf("RpcCommand: %v\n", err) + break + } + spew.Dump(reply) + case "stop": + msg, err := btcjson.CreateMessage("stop") + if err != nil { + fmt.Printf("CreateMessage: %v\n", err) + break + } + reply, err := send(msg) + if err != nil { + fmt.Printf("RpcCommand: %v\n", err) + break + } + fmt.Printf("%s\n", reply.(string)) + } +} + +func send(msg []byte) (interface{}, error) { + reply, err := btcjson.RpcCommand(User, Password, Server, msg) + if err != nil { + return 0, err + } + if reply.Result == nil { + err := ErrNoData + return 0, err + } + return reply.Result, nil +} + +func usage() { + fmt.Printf( + "usage:\n" + + "\tgetblock \n" + + "\tgetblockcount\n" + + "\tgetblockhash \n" + + "\tgetgenerate\n" + + "\tgetrawtransaction \n" + + "\tstop\n") +}