From 82e9f1aa02debf94453b290984cc116006d019ea Mon Sep 17 00:00:00 2001 From: Moul <moul@moul.re> Date: Wed, 28 Apr 2021 20:39:40 +0200 Subject: [PATCH] [mod] #264: Remove 'net' command: This is a bad idea to keep code commented, since we have to maintain it with the changes brought when other parts of the software change Remove all underneath functions, there is better DuniterPy's helpers Everything is a bit dirty Changing from BMA to GVA/WS2P will anyway require a refactoring This code can still be found from the repository history --- silkaj/cli.py | 2 - silkaj/net.py | 145 ---------------------------------------- silkaj/network_tools.py | 62 ----------------- 3 files changed, 209 deletions(-) delete mode 100644 silkaj/net.py diff --git a/silkaj/cli.py b/silkaj/cli.py index 4db519ee..f7a38185 100644 --- a/silkaj/cli.py +++ b/silkaj/cli.py @@ -32,7 +32,6 @@ from silkaj.commands import ( list_blocks, ) -# from silkaj.net import network_info from silkaj.wot import received_sent_certifications, id_pubkey_correspondence from silkaj.auth import generate_auth_file from silkaj.license import license_command @@ -143,7 +142,6 @@ cli.add_command(id_pubkey_correspondence) cli.add_command(currency_info) cli.add_command(license_command) cli.add_command(send_membership) -# cli.add_command(network_info) cli.add_command(send_transaction) cli.add_command(verify_blocks_signatures) cli.add_command(received_sent_certifications) diff --git a/silkaj/net.py b/silkaj/net.py deleted file mode 100644 index 94c7493b..00000000 --- a/silkaj/net.py +++ /dev/null @@ -1,145 +0,0 @@ -""" -Copyright 2016-2021 Maël Azimi <m.a@moul.re> - -Silkaj is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Silkaj is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with Silkaj. If not, see <https://www.gnu.org/licenses/>. -""" - -""" -from click import command, option, get_terminal_size -from datetime import datetime -from os import system -from collections import OrderedDict -from tabulate import tabulate -from asyncio import sleep - -from duniterpy.api.client import Client -from duniterpy.api import bma - -from silkaj.tools import coroutine -from silkaj.wot import identity_of -from silkaj.network_tools import ( - discover_peers, - best_endpoint_address, - ClientInstance, -) -from silkaj.tools import message_exit -from silkaj.tui import convert_time -from silkaj.constants import ASYNC_SLEEP - - -def get_network_sort_key(endpoint): - t = list() - for akey in network_sort_keys: - if akey == "diffi" or akey == "block" or akey == "port": - t.append(int(endpoint[akey]) if akey in endpoint else 0) - else: - t.append(str(endpoint[akey]) if akey in endpoint else "") - return tuple(t) - - -@command("net", help="Display network view") -@option( - "--discover", "-d", is_flag=True, help="Discover the network (could take a while)" -) -@option( - "--sort", - "-s", - default="block,member,diffi,uid", - show_default=True, - help="Sort column names comma-separated", -) -@coroutine -async def network_info(discover, sort): - global network_sort_keys - network_sort_keys = sort.split(",") - width = get_terminal_size()[0] - if width < 146: - message_exit( - "Wide screen need to be larger than 146. Current width: " + str(width) - ) - # discover peers - # and make sure fields are always ordered the same - infos = [ - OrderedDict( - (i, p.get(i, None)) for i in ("domain", "port", "ip4", "ip6", "pubkey") - ) - for p in await discover_peers(discover) - ] - client = ClientInstance().client - diffi = await client(bma.blockchain.difficulties) - members = 0 - print("Getting informations about nodes:") - for i, info in enumerate(infos): - ep = info - api = "BASIC_MERKLED_API " if ep["port"] != "443" else "BMAS " - api += ep.get("domain") + " " if ep["domain"] else "" - api += ep.get("ip4") + " " if ep["ip4"] else "" - api += ep.get("ip6") + " " if ep["ip6"] else "" - api += ep.get("port") - print("{0:.0f}%".format(i / len(infos) * 100, 1), end=" ") - best_ep = best_endpoint_address(info, False) - print(best_ep if best_ep is None else info[best_ep], end=" ") - print(info["port"]) - await sleep(ASYNC_SLEEP) - try: - info["uid"] = await identity_of(info["pubkey"]) - info["uid"] = info["uid"]["uid"] - info["member"] = "yes" - members += 1 - except: - info["uid"] = None - info["member"] = "no" - info["pubkey"] = info["pubkey"][:5] + "…" - for d in diffi["levels"]: - if info.get("uid") is not None: - if info["uid"] == d["uid"]: - info["diffi"] = d["level"] - if len(info["uid"]) > 10: - info["uid"] = info["uid"][:9] + "…" - sub_client = Client(api) - current_blk = await sub_client(bma.blockchain.current) - if current_blk is not None: - info["gen_time"] = convert_time(current_blk["time"], "hour") - if width > 171: - info["mediantime"] = convert_time(current_blk["medianTime"], "hour") - if width > 185: - info["difftime"] = convert_time( - current_blk["time"] - current_blk["medianTime"], "hour" - ) - info["block"] = current_blk["number"] - info["hash"] = current_blk["hash"][:10] + "…" - summary = await sub_client(bma.node.summary) - info["version"] = summary["duniter"]["version"] - await sub_client.close() - if info.get("domain") is not None and len(info["domain"]) > 20: - info["domain"] = "…" + info["domain"][-20:] - if info.get("ip6") is not None: - if width < 156: - info.pop("ip6") - else: - info["ip6"] = info["ip6"][:8] + "…" - await client.close() - print( - len(infos), - "peers ups, with", - members, - "members and", - len(infos) - members, - "non-members at", - datetime.now().strftime("%H:%M:%S"), - ) - infos = sorted(infos, key=get_network_sort_key) - print(tabulate(infos, headers="keys", tablefmt="orgtbl", stralign="center")) - -""" diff --git a/silkaj/network_tools.py b/silkaj/network_tools.py index d269ae52..742be9ad 100644 --- a/silkaj/network_tools.py +++ b/silkaj/network_tools.py @@ -20,70 +20,17 @@ import re import socket import logging from sys import exit, stderr -from asyncio import sleep from duniterpy.api.client import Client -from duniterpy.api.bma import network from duniterpy.constants import IPV4_REGEX, IPV6_REGEX from silkaj.constants import ( G1_DEFAULT_ENDPOINT, G1_TEST_DEFAULT_ENDPOINT, CONNECTION_TIMEOUT, - ASYNC_SLEEP, FAILURE_EXIT_STATUS, ) -async def discover_peers(discover): - """ - From first node, discover his known nodes. - Remove from know nodes if nodes are down. - If discover option: scan all network to know all nodes. - display percentage discovering. - """ - client = ClientInstance().client - endpoints = await get_peers_among_leaves(client) - if discover: - print("Discovering network") - for i, endpoint in enumerate(endpoints): - if discover: - print("{0:.0f}%".format(i / len(endpoints) * 100)) - if best_endpoint_address(endpoint, False) is None: - endpoints.remove(endpoint) - elif discover: - endpoints = await recursive_discovering(endpoints, endpoint) - return endpoints - - -async def recursive_discovering(endpoints, endpoint): - """ - Discover recursively new nodes. - If new node found add it and try to found new node from his known nodes. - """ - api = generate_duniterpy_endpoint_format(endpoint) - sub_client = Client(api) - news = await get_peers_among_leaves(sub_client) - await sub_client.close() - for new in news: - if best_endpoint_address(new, False) is not None and new not in endpoints: - endpoints.append(new) - await recursive_discovering(endpoints, new) - return endpoints - - -async def get_peers_among_leaves(client): - """ - Browse among leaves of peers to retrieve the other peers’ endpoints - """ - leaves = await client(network.peers, leaves=True) - peers = list() - for leaf in leaves["leaves"]: - await sleep(ASYNC_SLEEP + 0.05) - leaf_response = await client(network.peers, leaf=leaf) - peers.append(leaf_response["leaf"]["value"]) - return parse_endpoints(peers) - - def parse_endpoints(rep): """ endpoints[]{"domain", "ip4", "ip6", "pubkey"} @@ -105,15 +52,6 @@ def parse_endpoints(rep): return endpoints -def generate_duniterpy_endpoint_format(ep): - api = "BASIC_MERKLED_API " if ep["port"] != "443" else "BMAS " - api += ep.get("domain") + " " if "domain" in ep else "" - api += ep.get("ip4") + " " if "ip4" in ep else "" - api += ep.get("ip6") + " " if "ip6" in ep else "" - api += ep.get("port") - return api - - def singleton(class_): instances = {} -- GitLab