add warning to web interface
[p2pool.git] / web-static / index.html
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4     <head>
5         <title>P2Pool</title>
6         <script type="text/javascript" src="d3.v2.min.js"></script>
7         <script type="text/javascript">
8             // based on goblin's p2pool-stats project
9             
10             function values(o){ res = []; for(var x in o) res.push(o[x]); return res; }
11             
12             d3.json('/global_stats', function(global_stats) {
13                 d3.select('#pool_rate').text(d3.format('.3s')(global_stats.pool_hash_rate) + 'H/s');
14                 d3.select('#pool_stale').text(d3.format('.2p')(global_stats.pool_stale_prop));
15                 d3.select('#difficulty').text(d3.format('.3r')(global_stats.min_difficulty));
16             });
17             
18             d3.json('/local_stats', function(local_stats) {
19                 d3.select('#peers_in').text(local_stats.peers.incoming);
20                 d3.select('#peers_out').text(local_stats.peers.outgoing);
21                 
22                 var local = d3.sum(values(local_stats.miner_hash_rates));
23                 var local_dead = d3.sum(values(local_stats.miner_dead_hash_rates));
24                 d3.select('#local_rate').text(d3.format('.3s')(local) + 'H/s');
25                 d3.select('#local_doa').text(d3.format('.2p')(local_dead/local));
26                 
27                 d3.select('#shares_total').text(local_stats.shares.total);
28                 d3.select('#shares_orphan').text(local_stats.shares.orphan);
29                 d3.select('#shares_dead').text(local_stats.shares.dead);
30                 
31                 d3.select('#efficiency').text(local_stats.efficiency != null ? d3.format('.4p')(local_stats.efficiency) : '???')
32                 d3.select('#uptime_days').text(d3.format('.3f')(local_stats.uptime / 60 / 60 / 24));
33                 d3.select('#block_value').text(local_stats.block_value);
34                 
35                 d3.select('#warnings').selectAll().data(local_stats.warnings).enter().append('p')
36                     .text(function(w){ return 'Warning: ' + w })
37                     .attr('style', 'color:red;border:1px solid red;padding:5px');
38             });
39             
40             d3.json('/current_payouts', function(pays) {
41                 d3.json('/payout_addr', function(addr) {
42                     d3.select('#payout_addr').text(addr);
43                     d3.select('#payout_amount').text(addr in pays ? pays[addr] : 0);
44                 });
45                 
46                 var arr = []; for(var i in pays) arr.push(i); arr.sort(function(a, b){return pays[b] - pays[a]});
47                 
48                 var tr = d3.select('#payouts').selectAll().data(arr).enter().append('tr');
49                 tr.append('td').append('a').text(function(addr){return addr}).attr('href', function(addr){return 'http://blockexplorer.com/address/' + addr});
50                 tr.append('td').text(function(addr){return pays[addr]});
51                 
52                 var total_tr = d3.select('#payouts').append('tr');
53                 total_tr.append('td').append('strong').text('Total');
54                 total_tr.append('td').text(d3.sum(arr, function(addr){return pays[addr]}).toFixed(8));
55             });
56             
57             d3.json('/recent_blocks', function(blocks) {
58                 var tr = d3.select('#blocks').selectAll().data(blocks).enter().append('tr');
59                 tr.append('td').text(function(block){return new Date(1000*block.ts).toString()})
60                 tr.append('td').append('a').text(function(block){return block.hash}).attr('href', function(block){return 'http://blockexplorer.com/block/' + block.hash});
61             });
62             
63             d3.json('/web/best_share_hash', function(c) {
64                 d3.select('#best_share').append('a').attr('href', 'share.html#' + c).text(c.substr(-8));
65             });
66             
67             function fill(url, id) {
68                 d3.json(url, function(d) {
69                     d.sort()
70                     d3.select(id).selectAll().data(d).enter().append('span').text(' ').append('a').attr('href', function(c){return 'share.html#' + c}).text(function(c){return c.substr(-8)});
71                 });
72             }
73             fill('/web/verified_heads', '#verified_heads');
74             fill('/web/heads', '#heads');
75             fill('/web/verified_tails', '#verified_tails');
76             fill('/web/tails', '#tails');
77         </script>
78     </head>
79     <body>
80         <h1>P2Pool</h1>
81         <p><a href="graphs.html">Graphs</a></p>
82         <p>Pool rate: <span id="pool_rate"></span> (<span id="pool_stale"></span> stale) Share difficulty: <span id="difficulty"></span></p>
83         <p>Node uptime: <span id="uptime_days"></span> days Peers: <span id="peers_out"></span> out, <span id="peers_in"></span> in</p>
84         <p>Local rate: <span id="local_rate"></span> (<span id="local_doa"></span> DOA)</p>
85         <p>Shares: <span id="shares_total"></span> total (<span id="shares_orphan"></span> orphaned, <span id="shares_dead"></span> dead) Efficiency: <span id="efficiency"></span></p>
86         <p>Payout if a block were found NOW: <span id="payout_amount"></span> BTC to <span id="payout_addr"></span></p>
87         <p>Current block value: <span id="block_value"></span> BTC</p>
88         <div id="warnings"></div>
89         
90         <h2>Share explorer</h2>
91         <p>Best share: <span id="best_share"></span></p>
92         <p>Verified heads: <span id="verified_heads"></span></p>
93         <p>Heads: <span id="heads"></span></p>
94         <p>Verified tails: <span id="verified_tails"></span></p>
95         <p>Tails: <span id="tails"></span></p>
96         
97         <h2>Blocks found in last day:</h2>
98         <p>Note that blocks may have been orphaned from the P2Pool chain and so not be here.</p>
99         <table border="1" id="blocks">
100             <tr><th>time</th><th>hash</th></tr>
101         </table>
102         
103         <h2>Payouts if a block were found NOW:</h2>
104         <table border="1" id="payouts">
105             <tr><th>address</th><th>amount in BTC</th></tr>
106         </table>
107     </body>
108 </html>