func net_stats(par string) { if par == "bw" { common.PrintStats() return } else if par != "" { node_info(par) return } network.Mutex_net.Lock() fmt.Printf("%d active net connections, %d outgoing\n", len(network.OpenCons), network.OutConsActive) srt := make(network.SortedKeys, len(network.OpenCons)) cnt := 0 for k, v := range network.OpenCons { srt[cnt].Key = k srt[cnt].ConnID = v.ConnID cnt++ } sort.Sort(srt) for idx := range srt { v := network.OpenCons[srt[idx].Key] v.Mutex.Lock() fmt.Printf("%8d) ", v.ConnID) if v.Incomming { fmt.Print("<- ") } else { fmt.Print(" ->") } fmt.Printf(" %21s %5dms %7d : %-16s %7d : %-16s", v.PeerAddr.Ip(), v.GetAveragePing(), v.LastBtsRcvd, v.LastCmdRcvd, v.LastBtsSent, v.LastCmdSent) if (v.BytesReceived | v.BytesSent) != 0 { fmt.Printf("%9s %9s", common.BytesToString(v.BytesReceived), common.BytesToString(v.BytesSent)) } fmt.Print(" ", v.Node.Agent) if v.Send.Buf != nil { fmt.Print(" ", len(v.Send.Buf)) } v.Mutex.Unlock() fmt.Println() } if network.ExternalAddrLen() > 0 { fmt.Print("External addresses:") network.ExternalIpMutex.Lock() for ip, cnt := range network.ExternalIp4 { fmt.Printf(" %d.%d.%d.%d(%d)", byte(ip>>24), byte(ip>>16), byte(ip>>8), byte(ip), cnt) } network.ExternalIpMutex.Unlock() fmt.Println() } else { fmt.Println("No known external address") } network.Mutex_net.Unlock() common.PrintStats() }
func p_txs(w http.ResponseWriter, r *http.Request) { if !ipchecker(r) { return } var txloadresult string var wg sync.WaitGroup var tx2in []byte // Check if there is a tx upload request r.ParseMultipartForm(2e6) fil, _, _ := r.FormFile("txfile") if fil != nil { tx2in, _ = ioutil.ReadAll(fil) } else if len(r.Form["rawtx"]) == 1 { tx2in, _ = hex.DecodeString(r.Form["rawtx"][0]) } if len(tx2in) > 0 { wg.Add(1) req := &usif.OneUiReq{Param: string(tx2in)} req.Done.Add(1) req.Handler = func(dat string) { txloadresult = usif.LoadRawTx([]byte(dat)) wg.Done() } usif.UiChannel <- req } s := load_template("txs.html") network.TxMutex.Lock() var sum uint64 for _, v := range network.TransactionsToSend { sum += uint64(len(v.Data)) } s = strings.Replace(s, "{T2S_CNT}", fmt.Sprint(len(network.TransactionsToSend)), 1) s = strings.Replace(s, "{T2S_SIZE}", common.BytesToString(sum), 1) sum = 0 for _, v := range network.TransactionsRejected { sum += uint64(v.Size) } s = strings.Replace(s, "{TRE_CNT}", fmt.Sprint(len(network.TransactionsRejected)), 1) s = strings.Replace(s, "{TRE_SIZE}", common.BytesToString(sum), 1) s = strings.Replace(s, "{PTR1_CNT}", fmt.Sprint(len(network.TransactionsPending)), 1) s = strings.Replace(s, "{PTR2_CNT}", fmt.Sprint(len(network.NetTxs)), 1) s = strings.Replace(s, "{SPENT_OUTS_CNT}", fmt.Sprint(len(network.SpentOutputs)), 1) s = strings.Replace(s, "{AWAITING_INPUTS}", fmt.Sprint(len(network.WaitingForInputs)), 1) network.TxMutex.Unlock() wg.Wait() if txloadresult != "" { ld := load_template("txs_load.html") ld = strings.Replace(ld, "{TX_RAW_DATA}", txloadresult, 1) s = strings.Replace(s, "<!--TX_LOAD-->", ld, 1) } if common.CFG.TXPool.Enabled { s = strings.Replace(s, "<!--MEM_POOL_ENABLED-->", "Enabled", 1) } else { s = strings.Replace(s, "<!--MEM_POOL_ENABLED-->", "Disabled", 1) } if common.CFG.TXRoute.Enabled { s = strings.Replace(s, "<!--TX_ROUTE_ENABLED-->", "Enabled", 1) } else { s = strings.Replace(s, "<!--TX_ROUTE_ENABLED-->", "Disabled", 1) } write_html_head(w, r) w.Write([]byte(s)) write_html_tail(w) }
func p_home(w http.ResponseWriter, r *http.Request) { if !ipchecker(r) { return } s := load_template("home.html") wallet.LockBal() if len(wallet.MyBalance) > 0 { wal := load_template("home_wal.html") wal = strings.Replace(wal, "{TOTAL_BTC}", fmt.Sprintf("%.8f", float64(wallet.LastBalance)/1e8), 1) wal = strings.Replace(wal, "{UNSPENT_OUTS}", fmt.Sprint(len(wallet.MyBalance)), 1) s = strings.Replace(s, "<!--WALLET-->", wal, 1) } else { if wallet.MyWallet == nil { s = strings.Replace(s, "<!--WALLET-->", "You have no wallet", 1) } else { s = strings.Replace(s, "<!--WALLET-->", "Your balance is <b>zero</b>", 1) } } wallet.UnlockBal() common.Last.Mutex.Lock() s = strings.Replace(s, "{LAST_BLOCK_HASH}", common.Last.Block.BlockHash.String(), 1) s = strings.Replace(s, "{LAST_BLOCK_HEIGHT}", fmt.Sprint(common.Last.Block.Height), 1) s = strings.Replace(s, "{LAST_BLOCK_TIME}", time.Unix(int64(common.Last.Block.Timestamp), 0).Format("2006/01/02 15:04:05"), 1) s = strings.Replace(s, "{LAST_BLOCK_DIFF}", common.NumberToString(btc.GetDifficulty(common.Last.Block.Bits)), 1) s = strings.Replace(s, "{LAST_BLOCK_RCVD}", time.Now().Sub(common.Last.Time).String(), 1) common.Last.Mutex.Unlock() s = strings.Replace(s, "{BLOCKS_CACHED}", fmt.Sprint(len(network.CachedBlocks)), 1) s = strings.Replace(s, "{KNOWN_PEERS}", fmt.Sprint(network.PeerDB.Count()), 1) s = strings.Replace(s, "{NODE_UPTIME}", time.Now().Sub(common.StartTime).String(), 1) s = strings.Replace(s, "{NET_BLOCK_QSIZE}", fmt.Sprint(len(network.NetBlocks)), 1) s = strings.Replace(s, "{NET_TX_QSIZE}", fmt.Sprint(len(network.NetTxs)), 1) network.Mutex_net.Lock() s = strings.Replace(s, "{OPEN_CONNS_TOTAL}", fmt.Sprint(len(network.OpenCons)), 1) s = strings.Replace(s, "{OPEN_CONNS_OUT}", fmt.Sprint(network.OutConsActive), 1) s = strings.Replace(s, "{OPEN_CONNS_IN}", fmt.Sprint(network.InConsActive), 1) network.Mutex_net.Unlock() common.LockBw() common.TickRecv() common.TickSent() s = strings.Replace(s, "{DL_SPEED_NOW}", fmt.Sprint(common.DlBytesPrevSec>>10), 1) s = strings.Replace(s, "{DL_SPEED_MAX}", fmt.Sprint(common.DownloadLimit>>10), 1) s = strings.Replace(s, "{DL_TOTAL}", common.BytesToString(common.DlBytesTotal), 1) s = strings.Replace(s, "{UL_SPEED_NOW}", fmt.Sprint(common.UlBytesPrevSec>>10), 1) s = strings.Replace(s, "{UL_SPEED_MAX}", fmt.Sprint(common.UploadLimit>>10), 1) s = strings.Replace(s, "{UL_TOTAL}", common.BytesToString(common.UlBytesTotal), 1) common.UnlockBw() network.ExternalIpMutex.Lock() for ip, cnt := range network.ExternalIp4 { s = strings.Replace(s, "{ONE_EXTERNAL_IP}", fmt.Sprintf("%dx%d.%d.%d.%d {ONE_EXTERNAL_IP}", cnt, byte(ip>>24), byte(ip>>16), byte(ip>>8), byte(ip)), 1) } network.ExternalIpMutex.Unlock() s = strings.Replace(s, "{ONE_EXTERNAL_IP}", "", 1) var ms runtime.MemStats runtime.ReadMemStats(&ms) s = strings.Replace(s, "{HEAP_SIZE_MB}", fmt.Sprint(ms.Alloc>>20), 1) s = strings.Replace(s, "{SYSMEM_USED_MB}", fmt.Sprint(ms.Sys>>20), 1) s = strings.Replace(s, "{ECDSA_VERIFY_COUNT}", fmt.Sprint(btc.EcdsaVerifyCnt), 1) common.LockCfg() dat, _ := json.Marshal(&common.CFG) common.UnlockCfg() s = strings.Replace(s, "{CONFIG_FILE}", strings.Replace(string(dat), ",\"", ", \"", -1), 1) write_html_head(w, r) w.Write([]byte(s)) write_html_tail(w) }
func p_net(w http.ResponseWriter, r *http.Request) { if !ipchecker(r) { return } net_page := load_template("net.html") net_row := load_template("net_row.html") network.Mutex_net.Lock() srt := make(network.SortedKeys, len(network.OpenCons)) cnt := 0 for k, v := range network.OpenCons { if !v.IsBroken() { srt[cnt].Key = k srt[cnt].ConnID = v.ConnID cnt++ } } sort.Sort(srt) net_page = strings.Replace(net_page, "{OUT_CONNECTIONS}", fmt.Sprint(network.OutConsActive), 1) net_page = strings.Replace(net_page, "{IN_CONNECTIONS}", fmt.Sprint(network.InConsActive), 1) net_page = strings.Replace(net_page, "{LISTEN_TCP}", fmt.Sprint(common.IsListenTCP(), network.TCPServerStarted), 1) net_page = strings.Replace(net_page, "{EXTERNAL_ADDR}", btc.NewNetAddr(network.BestExternalAddr()).String(), 1) for idx := range srt { v := network.OpenCons[srt[idx].Key] s := net_row v.Mutex.Lock() s = strings.Replace(s, "{CONNID}", fmt.Sprint(v.ConnID), -1) if v.Incoming { s = strings.Replace(s, "{CONN_DIR_ICON}", "<img src=\"webui/incoming.png\">", 1) } else { s = strings.Replace(s, "{CONN_DIR_ICON}", "<img src=\"webui/outgoing.png\">", 1) } s = strings.Replace(s, "{PEER_ADDR}", v.PeerAddr.Ip(), 1) s = strings.Replace(s, "{PERR_PING}", fmt.Sprint(v.GetAveragePing()), 1) s = strings.Replace(s, "{LAST_RCVD_LEN}", fmt.Sprint(v.LastBtsRcvd), 1) s = strings.Replace(s, "{LAST_RCVD_CMD}", v.LastCmdRcvd, 1) s = strings.Replace(s, "{LAST_SENT_LEN}", fmt.Sprint(v.LastBtsSent), 1) s = strings.Replace(s, "{LAST_SENT_CNT}", v.LastCmdSent, 1) s = strings.Replace(s, "{TOTAL_RCVD}", common.BytesToString(v.BytesReceived), 1) s = strings.Replace(s, "{TOTAL_SENT}", common.BytesToString(v.BytesSent), 1) s = strings.Replace(s, "{NODE_VERSION}", fmt.Sprint(v.Node.Version), 1) s = strings.Replace(s, "{USER_AGENT}", v.Node.Agent, 1) if v.Send.Buf != nil { s = strings.Replace(s, "<!--SENDBUF-->", common.BytesToString(uint64(len(v.Send.Buf))), 1) } if len(v.GetBlockInProgress) > 0 { s = strings.Replace(s, "<!--BLKSINPROG-->", fmt.Sprint(len(v.GetBlockInProgress), "blks "), 1) } v.Mutex.Unlock() net_page = templ_add(net_page, "<!--PEER_ROW-->", s) } network.Mutex_net.Unlock() write_html_head(w, r) w.Write([]byte(net_page)) write_html_tail(w) }
func p_home(w http.ResponseWriter, r *http.Request) { if !ipchecker(r) { return } // The handler also gets called for /favicon.ico if r.URL.Path != "/" { http.NotFound(w, r) } s := load_template("home.html") wallet.BalanceMutex.Lock() if len(wallet.MyBalance) > 0 { wal := load_template("home_wal.html") wal = strings.Replace(wal, "{TOTAL_BTC}", fmt.Sprintf("%.8f", float64(wallet.LastBalance)/1e8), 1) wal = strings.Replace(wal, "{UNSPENT_OUTS}", fmt.Sprint(len(wallet.MyBalance)), 1) s = strings.Replace(s, "<!--WALLET-->", wal, 1) } else { if wallet.MyWallet == nil { s = strings.Replace(s, "<!--WALLET-->", "You have no wallet", 1) } else { s = strings.Replace(s, "<!--WALLET-->", "Your balance is <b>zero</b>", 1) } } wallet.BalanceMutex.Unlock() common.Last.Mutex.Lock() s = strings.Replace(s, "{LAST_BLOCK_HASH}", common.Last.Block.BlockHash.String(), 1) s = strings.Replace(s, "{LAST_BLOCK_HEIGHT}", fmt.Sprint(common.Last.Block.Height), 1) s = strings.Replace(s, "{LAST_BLOCK_TIME}", time.Unix(int64(common.Last.Block.Timestamp()), 0).Format("2006/01/02 15:04:05"), 1) s = strings.Replace(s, "{LAST_BLOCK_DIFF}", common.NumberToString(btc.GetDifficulty(common.Last.Block.Bits())), 1) s = strings.Replace(s, "{LAST_BLOCK_RCVD}", time.Now().Sub(common.Last.Time).String(), 1) common.Last.Mutex.Unlock() s = strings.Replace(s, "<--NETWORK_HASHRATE-->", usif.GetNetworkHashRate(), 1) s = strings.Replace(s, "{BLOCKS_CACHED}", fmt.Sprint(len(network.CachedBlocks)), 1) s = strings.Replace(s, "{KNOWN_PEERS}", fmt.Sprint(network.PeerDB.Count()), 1) s = strings.Replace(s, "{NODE_UPTIME}", time.Now().Sub(common.StartTime).String(), 1) s = strings.Replace(s, "{NET_BLOCK_QSIZE}", fmt.Sprint(len(network.NetBlocks)), 1) s = strings.Replace(s, "{NET_TX_QSIZE}", fmt.Sprint(len(network.NetTxs)), 1) network.Mutex_net.Lock() s = strings.Replace(s, "{OPEN_CONNS_TOTAL}", fmt.Sprint(len(network.OpenCons)), 1) s = strings.Replace(s, "{OPEN_CONNS_OUT}", fmt.Sprint(network.OutConsActive), 1) s = strings.Replace(s, "{OPEN_CONNS_IN}", fmt.Sprint(network.InConsActive), 1) network.Mutex_net.Unlock() common.LockBw() common.TickRecv() common.TickSent() s = strings.Replace(s, "{DL_SPEED_NOW}", fmt.Sprint(common.DlBytesPrevSec>>10), 1) s = strings.Replace(s, "{DL_SPEED_MAX}", fmt.Sprint(common.DownloadLimit>>10), 1) s = strings.Replace(s, "{DL_TOTAL}", common.BytesToString(common.DlBytesTotal), 1) s = strings.Replace(s, "{UL_SPEED_NOW}", fmt.Sprint(common.UlBytesPrevSec>>10), 1) s = strings.Replace(s, "{UL_SPEED_MAX}", fmt.Sprint(common.UploadLimit>>10), 1) s = strings.Replace(s, "{UL_TOTAL}", common.BytesToString(common.UlBytesTotal), 1) common.UnlockBw() network.ExternalIpMutex.Lock() for ip, rec := range network.ExternalIp4 { ips := fmt.Sprintf("<b title=\"%d times. Last seen %d min ago\">%d.%d.%d.%d</b> ", rec[0], (uint(time.Now().Unix())-rec[1])/60, byte(ip>>24), byte(ip>>16), byte(ip>>8), byte(ip)) s = templ_add(s, "<!--ONE_EXTERNAL_IP-->", ips) } network.ExternalIpMutex.Unlock() al, sy := sys.MemUsed() s = strings.Replace(s, "<!--HEAP_SIZE_MB-->", fmt.Sprint(al>>20), 1) s = strings.Replace(s, "<!--HEAPSYS_MB-->", fmt.Sprint(sy>>20), 1) s = strings.Replace(s, "<!--WDB_EXTRA_MB-->", fmt.Sprint(qdb.ExtraMemoryConsumed>>20), 1) s = strings.Replace(s, "{ECDSA_VERIFY_COUNT}", fmt.Sprint(btc.EcdsaVerifyCnt), 1) s = strings.Replace(s, "<!--NEW_BLOCK_BEEP-->", fmt.Sprint(common.CFG.Beeps.NewBlock), 1) common.LockCfg() dat, _ := json.Marshal(&common.CFG) common.UnlockCfg() s = strings.Replace(s, "{CONFIG_FILE}", strings.Replace(string(dat), ",\"", ", \"", -1), 1) write_html_head(w, r) w.Write([]byte(s)) write_html_tail(w) }
func net_stats(par string) { if par == "bw" { common.PrintStats() return } else if par != "" { node_info(par) return } network.Mutex_net.Lock() fmt.Printf("%d active net connections, %d outgoing\n", len(network.OpenCons), network.OutConsActive) srt := make(SortedKeys, len(network.OpenCons)) cnt := 0 for k, v := range network.OpenCons { srt[cnt].Key = k srt[cnt].ConnID = v.ConnID cnt++ } sort.Sort(srt) for idx := range srt { v := network.OpenCons[srt[idx].Key] v.Mutex.Lock() fmt.Printf("%8d) ", v.ConnID) if v.X.Incomming { fmt.Print("<- ") } else { fmt.Print(" ->") } fmt.Printf(" %21s %5dms %7d : %-16s %7d : %-16s", v.PeerAddr.Ip(), v.GetAveragePing(), v.X.LastBtsRcvd, v.X.LastCmdRcvd, v.X.LastBtsSent, v.X.LastCmdSent) fmt.Printf("%9s %9s", common.BytesToString(v.X.Counters["BytesReceived"]), common.BytesToString(v.X.Counters["BytesSent"])) fmt.Print(" ", v.Node.Agent) if b2s := v.BytesToSent(); b2s > 0 { fmt.Print(" ", b2s) } v.Mutex.Unlock() fmt.Println() } if network.ExternalAddrLen() > 0 { fmt.Print("External addresses:") network.ExternalIpMutex.Lock() for ip, cnt := range network.ExternalIp4 { fmt.Printf(" %d.%d.%d.%d(%d)", byte(ip>>24), byte(ip>>16), byte(ip>>8), byte(ip), cnt) } network.ExternalIpMutex.Unlock() fmt.Println() } else { fmt.Println("No known external address") } network.Mutex_net.Unlock() fmt.Print("RecentlyDisconencted:") network.HammeringMutex.Lock() for ip, ti := range network.RecentlyDisconencted { fmt.Printf(" %d.%d.%d.%d-%s", ip[0], ip[1], ip[2], ip[3], time.Now().Sub(ti).String()) } network.HammeringMutex.Unlock() fmt.Println() common.PrintStats() }