diff --git a/nucypher/network/server.py b/nucypher/network/server.py index 47aee1ae9..92fa45c24 100644 --- a/nucypher/network/server.py +++ b/nucypher/network/server.py @@ -16,20 +16,23 @@ along with nucypher. If not, see . """ import binascii +import os from typing import Tuple -import os -from bytestring_splitter import VariableLengthBytestring -from constant_sorrow import constants -from constant_sorrow.constants import FLEET_STATES_MATCH, NO_KNOWN_NODES from flask import Flask, Response from flask import request -from hendrix.experience import crosstown_traffic +from jinja2 import Template, TemplateError from twisted.logger import Logger from umbral import pre from umbral.keys import UmbralPublicKey from umbral.kfrags import KFrag +from bytestring_splitter import VariableLengthBytestring +from constant_sorrow import constants +from constant_sorrow.constants import FLEET_STATES_MATCH, NO_KNOWN_NODES +from hendrix.experience import crosstown_traffic + +import nucypher from nucypher.config.storages import ForgetfulNodeStorage from nucypher.crypto.kits import UmbralMessageKit from nucypher.crypto.powers import KeyPairBasedPower, PowerUpError @@ -42,6 +45,13 @@ from nucypher.network import LEARNING_LOOP_VERSION from nucypher.network.exceptions import NodeSeemsToBeDown from nucypher.network.protocols import InterfaceInfo +HERE = BASE_DIR = os.path.abspath(os.path.dirname(__file__)) +TEMPLATES_DIR = os.path.join(HERE, "templates") + +with open(os.path.join(TEMPLATES_DIR, "basic_status.j2"), "r") as f: + _status_template_content = f.read() +status_template = Template(_status_template_content) + class ProxyRESTServer: SERVER_VERSION = LEARNING_LOOP_VERSION @@ -371,6 +381,23 @@ def make_rest_app( log.info("Bad TreasureMap ID; not storing {}".format(treasure_map_id)) assert False + @rest_app.route('/status') + def status(): + headers = {"Content-Type": "text/html", "charset": "utf-8"} + previous_states = list(reversed(this_node.known_nodes.states.values()))[:5] + + try: + content = status_template.render(this_node=this_node, + known_nodes=this_node.known_nodes, + previous_states=previous_states, + domains=serving_domains, + version=nucypher.__version__) + except Exception as e: + log.debug("Template Rendering Exception: ".format(str(e))) + raise TemplateError(str(e)) from e + + return Response(response=content, headers=headers) + return rest_app, datastore diff --git a/nucypher/network/templates/basic_status.j2 b/nucypher/network/templates/basic_status.j2 new file mode 100644 index 000000000..79b1d8fb6 --- /dev/null +++ b/nucypher/network/templates/basic_status.j2 @@ -0,0 +1,156 @@ + + + + + + + + + +
+

{{ this_node.nickname}}

+ {{ this_node.nickname_icon }} +

v{{ version }}

+

Domains: {% for domain in domains %}{{ domain }} {% endfor %}

+ +

Fleet State

+
+

{{ known_nodes.nickname }}

+ {{ known_nodes.icon }} +
+ {{ known_nodes.updated }} + +
+ +
+

Previous States

+ {% for state in previous_states %} +
+
{{ state.nickname }}
+ {{ state.icon }} +
+ {{ state.updated }} +
+ {% endfor %} +
+
+
+

Known Nodes:

+ + + + + + + + + {% for node in known_nodes -%} + + + + + + + + {%- endfor %} +
IconNickname / ChecksumLaunchedLast SeenFleet State
{{ node.nickname_icon }} + {{ node.nickname }} +
{{ node.checksum_address }} +
{{ node.timestamp }}{{ node.last_seen }}{{ node.fleet_state_icon }}
+
+ \ No newline at end of file