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:
+
+
+ Icon |
+ Nickname / Checksum |
+ Launched |
+ Last Seen |
+ Fleet State |
+
+ {% for node in known_nodes -%}
+
+ {{ node.nickname_icon }} |
+
+ {{ node.nickname }}
+ {{ node.checksum_address }}
+ |
+ {{ node.timestamp }} |
+ {{ node.last_seen }} |
+ {{ node.fleet_state_icon }} |
+
+ {%- endfor %}
+
+
+
\ No newline at end of file