Sidebar Plugin: display more detailed statistics about peers
This commit is contained in:
parent
b6b23d0e8e
commit
b7a3aa37e1
2 changed files with 121 additions and 33 deletions
|
@ -88,31 +88,84 @@ class UiRequestPlugin(object):
|
||||||
@PluginManager.registerTo("UiWebsocket")
|
@PluginManager.registerTo("UiWebsocket")
|
||||||
class UiWebsocketPlugin(object):
|
class UiWebsocketPlugin(object):
|
||||||
def sidebarRenderPeerStats(self, body, site):
|
def sidebarRenderPeerStats(self, body, site):
|
||||||
connected = len([peer for peer in list(site.peers.values()) if peer.connection and peer.connection.connected])
|
# Peers by status
|
||||||
connectable = len([peer_id for peer_id in list(site.peers.keys()) if not peer_id.endswith(":0")])
|
|
||||||
onion = len([peer_id for peer_id in list(site.peers.keys()) if ".onion" in peer_id])
|
|
||||||
local = len([peer for peer in list(site.peers.values()) if helper.isPrivateIp(peer.ip)])
|
|
||||||
peers_total = len(site.peers)
|
peers_total = len(site.peers)
|
||||||
|
peers_reachable = 0
|
||||||
|
peers_connectable = 0
|
||||||
|
peers_connected = 0
|
||||||
|
peers_failed = 0
|
||||||
|
# Peers by type
|
||||||
|
peers_by_type = {}
|
||||||
|
|
||||||
# Add myself
|
type_proper_names = {
|
||||||
if site.isServing():
|
'ipv4': 'IPv4',
|
||||||
peers_total += 1
|
'ipv6': 'IPv6',
|
||||||
if any(site.connection_server.port_opened.values()):
|
'onion': 'Onion',
|
||||||
connectable += 1
|
'unknown': 'Unknown'
|
||||||
if site.connection_server.tor_manager.start_onions:
|
}
|
||||||
onion += 1
|
|
||||||
|
type_defs = {
|
||||||
|
'local-ipv4': {
|
||||||
|
'order' : -21,
|
||||||
|
'color' : 'yellow'
|
||||||
|
},
|
||||||
|
'local-ipv6': {
|
||||||
|
'order' : -20,
|
||||||
|
'color' : 'orange'
|
||||||
|
},
|
||||||
|
'ipv4': {
|
||||||
|
'order' : -11,
|
||||||
|
'color' : 'blue'
|
||||||
|
},
|
||||||
|
'ipv6': {
|
||||||
|
'order' : -10,
|
||||||
|
'color' : 'darkblue'
|
||||||
|
},
|
||||||
|
'unknown': {
|
||||||
|
'order' : 10,
|
||||||
|
'color' : 'red'
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for peer in list(site.peers.values()):
|
||||||
|
# Peers by status
|
||||||
|
if peer.isConnected():
|
||||||
|
peers_connected += 1
|
||||||
|
elif peer.isConnectable():
|
||||||
|
peers_connectable += 1
|
||||||
|
elif peer.isReachable() and not peer.connection_error:
|
||||||
|
peers_reachable += 1
|
||||||
|
elif peer.isReachable() and peer.connection_error:
|
||||||
|
peers_failed += 1
|
||||||
|
# Peers by type
|
||||||
|
peer_type = peer.getIpType()
|
||||||
|
peer_readable_type = type_proper_names.get(peer_type, peer_type)
|
||||||
|
if helper.isPrivateIp(peer.ip):
|
||||||
|
peer_type = 'local-' + peer.getIpType()
|
||||||
|
peer_readable_type = 'Local ' + peer_readable_type
|
||||||
|
peers_by_type[peer_type] = peers_by_type.get(peer_type, {
|
||||||
|
'type': peer_type,
|
||||||
|
'readable_type': _[peer_readable_type],
|
||||||
|
'order': type_defs.get(peer_type, {}).get('order', 0),
|
||||||
|
'color': type_defs.get(peer_type, {}).get('color', 'purple'),
|
||||||
|
'count': 0
|
||||||
|
})
|
||||||
|
peers_by_type[peer_type]['count'] += 1
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
|
||||||
if peers_total:
|
if peers_total:
|
||||||
percent_connected = float(connected) / peers_total
|
percent_connected = float(peers_connected) / peers_total
|
||||||
percent_connectable = float(connectable) / peers_total
|
percent_connectable = float(peers_connectable) / peers_total
|
||||||
percent_onion = float(onion) / peers_total
|
percent_reachable = float(peers_reachable) / peers_total
|
||||||
|
percent_failed = float(peers_failed) / peers_total
|
||||||
|
percent_other = min(0.0, 1.0 - percent_connected - percent_connectable - percent_reachable - percent_failed)
|
||||||
else:
|
else:
|
||||||
percent_connectable = percent_connected = percent_onion = 0
|
percent_connected = 0
|
||||||
|
percent_reachable = 0
|
||||||
if local:
|
percent_connectable = 0
|
||||||
local_html = _("<li class='color-yellow'><span>{_[Local]}:</span><b>{local}</b></li>")
|
percent_failed = 0
|
||||||
else:
|
percent_other = 0
|
||||||
local_html = ""
|
|
||||||
|
|
||||||
peer_ips = [peer.key for peer in site.getConnectablePeers(20, allow_private=False)]
|
peer_ips = [peer.key for peer in site.getConnectablePeers(20, allow_private=False)]
|
||||||
peer_ips.sort(key=lambda peer_ip: ".onion:" in peer_ip)
|
peer_ips.sort(key=lambda peer_ip: ".onion:" in peer_ip)
|
||||||
|
@ -127,21 +180,55 @@ class UiWebsocketPlugin(object):
|
||||||
{_[Peers]}
|
{_[Peers]}
|
||||||
<small class="label-right"><a href='{copy_link}' id='link-copypeers' class='link-right'>{_[Copy to clipboard]}</a></small>
|
<small class="label-right"><a href='{copy_link}' id='link-copypeers' class='link-right'>{_[Copy to clipboard]}</a></small>
|
||||||
</label>
|
</label>
|
||||||
<ul class='graph'>
|
<ul class='graph graph-stacked'>
|
||||||
<li style='width: 100%' class='total back-black' title="{_[Total peers]}"></li>
|
|
||||||
<li style='width: {percent_connectable:.0%}' class='connectable back-blue' title='{_[Connectable peers]}'></li>
|
|
||||||
<li style='width: {percent_onion:.0%}' class='connected back-purple' title='{_[Onion]}'></li>
|
|
||||||
<li style='width: {percent_connected:.0%}' class='connected back-green' title='{_[Connected peers]}'></li>
|
<li style='width: {percent_connected:.0%}' class='connected back-green' title='{_[Connected peers]}'></li>
|
||||||
|
<li style='width: {percent_connectable:.0%}' class='connectable back-blue' title='{_[Peers that were recently connected succefully]}'></li>
|
||||||
|
<li style='width: {percent_reachable:.0%}' class='reachable back-yellow' title='{_[Peers available for connection]}'></li>
|
||||||
|
<li style='width: {percent_failed:.0%}' class='connectable back-red' title='{_[Peers recently failed to connect]}'></li>
|
||||||
|
<li style='width: {percent_other:.0%}' class='connectable back-black' title='{_[Peers with wrong, unknown or invalid network address]}'></li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class='graph-legend'>
|
<ul class='graph-legend'>
|
||||||
<li class='color-green'><span>{_[Connected]}:</span><b>{connected}</b></li>
|
<li class='color-green' title='{_[Connected peers]}'><span>{_[Connected]}:</span><b>{peers_connected}</b></li>
|
||||||
<li class='color-blue'><span>{_[Connectable]}:</span><b>{connectable}</b></li>
|
<li class='color-blue' title='{_[Peers that were recently connected succefully]}'><span>{_[Connectable]}:</span><b>{peers_connectable}</b></li>
|
||||||
<li class='color-purple'><span>{_[Onion]}:</span><b>{onion}</b></li>
|
<li class='color-yellow' title='{_[Peers available for connection]}'><span>{_[Reachable]}:</span><b>{peers_reachable}</b></li>
|
||||||
{local_html}
|
<li class='color-red' title='{_[Peers recently failed to connect]}'><span>{_[Failed]}:</span><b>{peers_failed}</b></li>
|
||||||
<li class='color-black'><span>{_[Total]}:</span><b>{peers_total}</b></li>
|
<li class='color-black'><span>{_[Total peers]}:</span><b>{peers_total}</b></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
"""))
|
||||||
""".replace("{local_html}", local_html)))
|
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
peers_by_type = sorted(
|
||||||
|
peers_by_type.values(),
|
||||||
|
key=lambda t: t['order'],
|
||||||
|
)
|
||||||
|
|
||||||
|
peers_by_type_graph = ''
|
||||||
|
peers_by_type_legend = ''
|
||||||
|
|
||||||
|
if peers_total:
|
||||||
|
for t in peers_by_type:
|
||||||
|
peers_by_type_graph += """
|
||||||
|
<li style='width: %.2f%%' class='%s back-%s' title='%s'></li>
|
||||||
|
""" % (float(t['count']) * 100.0 / peers_total, t['type'], t["color"], t['readable_type'])
|
||||||
|
peers_by_type_legend += """
|
||||||
|
<li class='color-%s'><span>%s:</span><b>%s</b></li>
|
||||||
|
""" % (t["color"], t['readable_type'], t['count'])
|
||||||
|
|
||||||
|
if peers_by_type_legend != '':
|
||||||
|
body.append(_("""
|
||||||
|
<li>
|
||||||
|
<label>
|
||||||
|
{_[Peer types]}
|
||||||
|
</label>
|
||||||
|
<ul class='graph graph-stacked'>
|
||||||
|
%s
|
||||||
|
</ul>
|
||||||
|
<ul class='graph-legend'>
|
||||||
|
%s
|
||||||
|
</ul>
|
||||||
|
<li>
|
||||||
|
""" % (peers_by_type_graph, peers_by_type_legend)))
|
||||||
|
|
||||||
def sidebarRenderTransferStats(self, body, site):
|
def sidebarRenderTransferStats(self, body, site):
|
||||||
recv = float(site.settings.get("bytes_recv", 0)) / 1024 / 1024
|
recv = float(site.settings.get("bytes_recv", 0)) / 1024 / 1024
|
||||||
|
@ -682,7 +769,7 @@ class UiWebsocketPlugin(object):
|
||||||
# Create position array
|
# Create position array
|
||||||
lat, lon = loc["lat"], loc["lon"]
|
lat, lon = loc["lat"], loc["lon"]
|
||||||
latlon = "%s,%s" % (lat, lon)
|
latlon = "%s,%s" % (lat, lon)
|
||||||
if latlon in placed and helper.getIpType(peer.ip) == "ipv4": # Dont place more than 1 bar to same place, fake repos using ip address last two part
|
if latlon in placed and peer.getIpType() == "ipv4": # Dont place more than 1 bar to same place, fake repos using ip address last two part
|
||||||
lat += float(128 - int(peer.ip.split(".")[-2])) / 50
|
lat += float(128 - int(peer.ip.split(".")[-2])) / 50
|
||||||
lon += float(128 - int(peer.ip.split(".")[-1])) / 50
|
lon += float(128 - int(peer.ip.split(".")[-1])) / 50
|
||||||
latlon = "%s,%s" % (lat, lon)
|
latlon = "%s,%s" % (lat, lon)
|
||||||
|
|
|
@ -621,7 +621,8 @@ class Connection(object):
|
||||||
self.waiting_requests[self.req_id] = {"evt": event, "cmd": cmd}
|
self.waiting_requests[self.req_id] = {"evt": event, "cmd": cmd}
|
||||||
if stream_to:
|
if stream_to:
|
||||||
self.waiting_streams[self.req_id] = stream_to
|
self.waiting_streams[self.req_id] = stream_to
|
||||||
self.send(data) # Send request
|
if not self.send(data): # Send request
|
||||||
|
return False
|
||||||
res = event.get() # Wait until event solves
|
res = event.get() # Wait until event solves
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue