diff --git a/plugins/Sidebar/SidebarPlugin.py b/plugins/Sidebar/SidebarPlugin.py index 4ecca75a..f5b40e2d 100644 --- a/plugins/Sidebar/SidebarPlugin.py +++ b/plugins/Sidebar/SidebarPlugin.py @@ -88,31 +88,84 @@ class UiRequestPlugin(object): @PluginManager.registerTo("UiWebsocket") class UiWebsocketPlugin(object): def sidebarRenderPeerStats(self, body, site): - connected = len([peer for peer in list(site.peers.values()) if peer.connection and peer.connection.connected]) - 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 by status 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 - if site.isServing(): - peers_total += 1 - if any(site.connection_server.port_opened.values()): - connectable += 1 - if site.connection_server.tor_manager.start_onions: - onion += 1 + type_proper_names = { + 'ipv4': 'IPv4', + 'ipv6': 'IPv6', + 'onion': 'Onion', + 'unknown': 'Unknown' + } + + 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: - percent_connected = float(connected) / peers_total - percent_connectable = float(connectable) / peers_total - percent_onion = float(onion) / peers_total + percent_connected = float(peers_connected) / peers_total + percent_connectable = float(peers_connectable) / 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: - percent_connectable = percent_connected = percent_onion = 0 - - if local: - local_html = _("