diff --git a/fHDHR_web/__init__.py b/fHDHR_web/__init__.py index 0f45e8c..14ac3f9 100644 --- a/fHDHR_web/__init__.py +++ b/fHDHR_web/__init__.py @@ -34,6 +34,8 @@ class fHDHR_HTTP_Server(): # Set Secret Key For Sessions self.fhdhr.app.secret_key = self.fhdhr.config.dict["fhdhr"]["friendlyname"] + self.route_list = {} + self.fhdhr.logger.info("Loading HTTP Pages Endpoints.") self.pages = fHDHR_Pages(fhdhr) self.add_endpoints(self.pages, "pages") @@ -83,6 +85,7 @@ class fHDHR_HTTP_Server(): session["session_id"] = str(uuid.uuid4()) session["instance_id"] = self.instance_id + session["route_list"] = self.route_list session["is_internal_api"] = self.detect_internal_api(request) if session["is_internal_api"]: @@ -151,6 +154,10 @@ class fHDHR_HTTP_Server(): return False def add_endpoints(self, index_list, index_name): + + if index_name not in list(self.route_list.keys()): + self.route_list[index_name] = {} + item_list = [x for x in dir(index_list) if self.isapath(x)] for item in item_list: endpoints = eval("self." + str(index_name) + "." + str(item) + ".endpoints") @@ -158,11 +165,38 @@ class fHDHR_HTTP_Server(): endpoints = [endpoints] handler = eval("self." + str(index_name) + "." + str(item)) endpoint_name = eval("self." + str(index_name) + "." + str(item) + ".endpoint_name") + try: endpoint_methods = eval("self." + str(index_name) + "." + str(item) + ".endpoint_methods") except AttributeError: endpoint_methods = ['GET'] + + try: + endpoint_access_level = eval("self." + str(index_name) + "." + str(item) + ".endpoint_access_level") + except AttributeError: + endpoint_access_level = 0 + + try: + pretty_name = eval("self." + str(index_name) + "." + str(item) + ".pretty_name") + except AttributeError: + pretty_name = endpoint_name + + try: + endpoint_default_parameters = eval("self." + str(index_name) + "." + str(item) + ".endpoint_default_parameters") + except AttributeError: + endpoint_default_parameters = {} + self.fhdhr.logger.debug("Adding endpoint %s available at %s with %s methods." % (endpoint_name, ",".join(endpoints), ",".join(endpoint_methods))) + + if endpoint_name not in list(self.route_list[index_name].keys()): + self.route_list[index_name][endpoint_name] = {} + self.route_list[index_name][endpoint_name]["name"] = endpoint_name + self.route_list[index_name][endpoint_name]["endpoints"] = endpoints + self.route_list[index_name][endpoint_name]["endpoint_methods"] = endpoint_methods + self.route_list[index_name][endpoint_name]["endpoint_access_level"] = endpoint_access_level + self.route_list[index_name][endpoint_name]["endpoint_default_parameters"] = endpoint_default_parameters + self.route_list[index_name][endpoint_name]["pretty_name"] = pretty_name + for endpoint in endpoints: self.add_endpoint(endpoint=endpoint, endpoint_name=endpoint_name, diff --git a/fHDHR_web/api/__init__.py b/fHDHR_web/api/__init__.py index f91a5b4..a5c3ddb 100644 --- a/fHDHR_web/api/__init__.py +++ b/fHDHR_web/api/__init__.py @@ -12,6 +12,8 @@ from .tuners import Tuners from .debug import Debug_JSON from .tools import API_Tools +from .route_list import Route_List + from .images import Images @@ -33,4 +35,6 @@ class fHDHR_API(): self.debug = Debug_JSON(fhdhr) self.tools = API_Tools(fhdhr) + self.route_list = Route_List(fhdhr) + self.images = Images(fhdhr) diff --git a/fHDHR_web/api/route_list.py b/fHDHR_web/api/route_list.py new file mode 100644 index 0000000..c907f68 --- /dev/null +++ b/fHDHR_web/api/route_list.py @@ -0,0 +1,37 @@ +from flask import Response, request, redirect, session +import urllib.parse +import json + + +class Route_List(): + endpoints = ["/api/routes"] + endpoint_name = "api_routes" + endpoint_methods = ["GET", "POST"] + + def __init__(self, fhdhr): + self.fhdhr = fhdhr + + def __call__(self, *args): + return self.get(*args) + + def get(self, *args): + + method = request.args.get('method', default="get", type=str) + + redirect_url = request.args.get('redirect', default=None, type=str) + + if method == "get": + + return_json = json.dumps(session["route_list"], indent=4) + + return Response(status=200, + response=return_json, + mimetype='application/json') + + else: + return "%s Invalid Method" % method + + if redirect_url: + return redirect(redirect_url + "?retmessage=" + urllib.parse.quote("%s Success" % method)) + else: + return "%s Success" % method diff --git a/fHDHR_web/pages/channels_editor.py b/fHDHR_web/pages/channels_editor.py index 5555b8e..9043ae0 100644 --- a/fHDHR_web/pages/channels_editor.py +++ b/fHDHR_web/pages/channels_editor.py @@ -6,6 +6,8 @@ from fHDHR.tools import channel_sort class Channels_Editor_HTML(): endpoints = ["/channels_editor", "/channels_editor.html"] endpoint_name = "page_channels_editor_html" + endpoint_access_level = 2 + pretty_name = "Channels Editor" def __init__(self, fhdhr): self.fhdhr = fhdhr diff --git a/fHDHR_web/pages/channels_html.py b/fHDHR_web/pages/channels_html.py index 4115829..38c2066 100644 --- a/fHDHR_web/pages/channels_html.py +++ b/fHDHR_web/pages/channels_html.py @@ -6,6 +6,8 @@ from fHDHR.tools import channel_sort class Channels_HTML(): endpoints = ["/channels", "/channels.html"] endpoint_name = "page_channels_html" + endpoint_access_level = 0 + pretty_name = "Channels" def __init__(self, fhdhr): self.fhdhr = fhdhr diff --git a/fHDHR_web/pages/cluster_html.py b/fHDHR_web/pages/cluster_html.py index 2f96119..a8d468c 100644 --- a/fHDHR_web/pages/cluster_html.py +++ b/fHDHR_web/pages/cluster_html.py @@ -5,6 +5,8 @@ import urllib.parse class Cluster_HTML(): endpoints = ["/cluster", "/cluster.html"] endpoint_name = "page_cluster_html" + endpoint_access_level = 1 + pretty_name = "Cluster/SSDP" def __init__(self, fhdhr): self.fhdhr = fhdhr diff --git a/fHDHR_web/pages/diagnostics_html.py b/fHDHR_web/pages/diagnostics_html.py index b5886d8..7bbdd34 100644 --- a/fHDHR_web/pages/diagnostics_html.py +++ b/fHDHR_web/pages/diagnostics_html.py @@ -4,6 +4,8 @@ from flask import request, render_template, session class Diagnostics_HTML(): endpoints = ["/diagnostics", "/diagnostics.html"] endpoint_name = "page_diagnostics_html" + endpoint_access_level = 2 + pretty_name = "Diagnostics" def __init__(self, fhdhr): self.fhdhr = fhdhr @@ -15,111 +17,27 @@ class Diagnostics_HTML(): base_url = request.url_root[:-1] - button_list = [] + button_dict = {} - button_list.append({ - "label": "Debug Json", - "hdhr": None, - "rmg": None, - "other": "/api/debug", - }) + for route_group in list(session["route_list"].keys()): + if route_group not in ["pages", "brython", "files"]: + button_dict[route_group] = [] + for route_item in list(session["route_list"][route_group].keys()): + if not session["route_list"][route_group][route_item]["name"].startswith("page_"): + button_link = session["route_list"][route_group][route_item]["endpoints"][0] + parameter_index = 0 + for parameter in list(session["route_list"][route_group][route_item]["endpoint_default_parameters"].keys()): + parameter_val = session["route_list"][route_group][route_item]["endpoint_default_parameters"][parameter] + if not parameter_index: + button_link += "?" + else: + button_link += "&" + button_link += "%s=%s" % (parameter, parameter_val) + button_link = button_link.replace("", self.fhdhr.config.dict["main"]["uuid"]) + button_link = button_link.replace("", base_url) + button_dict[route_group].append({ + "label": session["route_list"][route_group][route_item]["pretty_name"], + "link": button_link, + }) - button_list.append({ - "label": "Cluster Json", - "hdhr": None, - "rmg": None, - "other": "/api/cluster?method=get", - }) - - button_list.append({ - "label": "Lineup XML", - "hdhr": "/lineup.xml", - "rmg": None, - "other": None, - }) - - button_list.append({ - "label": "Lineup JSON", - "hdhr": "/hdhr/lineup.json", - "rmg": None, - "other": None, - }) - - button_list.append({ - "label": "Lineup Status", - "hdhr": "/hdhr/lineup_status.json", - "rmg": None, - "other": None, - }) - - button_list.append({ - "label": "Discover Json", - "hdhr": "/hdhr/discover.json", - "rmg": None, - "other": None, - }) - - button_list.append({ - "label": "Device XML", - "hdhr": "/hdhr/device.xml", - "rmg": "/rmg/device.xml", - "other": None, - }) - - button_list.append({ - "label": "RMG Identification XML", - "hdhr": "", - "rmg": "/rmg", - "other": None, - }) - - button_list.append({ - "label": "RMG Devices Discover", - "hdhr": "", - "rmg": "/rmg/devices/discover", - "other": None, - }) - - button_list.append({ - "label": "RMG Devices Probe", - "hdhr": "", - "rmg": "/rmg/devices/probe?uri=%s" % base_url, - "other": None, - }) - - button_list.append({ - "label": "RMG Devices by DeviceKey", - "hdhr": "", - "rmg": "/rmg/devices/%s" % self.fhdhr.config.dict["main"]["uuid"], - "other": None, - }) - - button_list.append({ - "label": "RMG Channels by DeviceKey", - "hdhr": "", - "rmg": "/rmg/devices/%s/channels" % self.fhdhr.config.dict["main"]["uuid"], - "other": None, - }) - - button_list.append({ - "label": "RMG Scanners by DeviceKey", - "hdhr": "", - "rmg": "/rmg/devices/%s/scanners" % self.fhdhr.config.dict["main"]["uuid"], - "other": None, - }) - - button_list.append({ - "label": "RMG Networks by DeviceKey", - "hdhr": "", - "rmg": "/rmg/devices/%s/networks" % self.fhdhr.config.dict["main"]["uuid"], - "other": None, - }) - - button_list.append({ - "label": "RMG Scan by DeviceKey", - "hdhr": "", - "rmg": "/rmg/devices/%s/scan" % self.fhdhr.config.dict["main"]["uuid"], - "other": None, - }) - - return render_template('diagnostics.html', session=session, request=request, fhdhr=self.fhdhr, button_list=button_list) + return render_template('diagnostics.html', session=session, request=request, fhdhr=self.fhdhr, button_dict=button_dict, list=list) diff --git a/fHDHR_web/pages/guide_html.py b/fHDHR_web/pages/guide_html.py index 630b748..7736ca4 100644 --- a/fHDHR_web/pages/guide_html.py +++ b/fHDHR_web/pages/guide_html.py @@ -7,6 +7,8 @@ from fHDHR.tools import humanized_time, channel_sort class Guide_HTML(): endpoints = ["/guide", "/guide.html"] endpoint_name = "page_guide_html" + endpoint_access_level = 0 + pretty_name = "Guide" def __init__(self, fhdhr): self.fhdhr = fhdhr diff --git a/fHDHR_web/pages/index_html.py b/fHDHR_web/pages/index_html.py index 373ae6f..6fd6740 100644 --- a/fHDHR_web/pages/index_html.py +++ b/fHDHR_web/pages/index_html.py @@ -4,6 +4,8 @@ from flask import request, render_template, session class Index_HTML(): endpoints = ["/index", "/index.html"] endpoint_name = "page_index_html" + endpoint_access_level = 0 + pretty_name = "Index" def __init__(self, fhdhr): self.fhdhr = fhdhr diff --git a/fHDHR_web/pages/settings_html.py b/fHDHR_web/pages/settings_html.py index 5b678b8..0d34715 100644 --- a/fHDHR_web/pages/settings_html.py +++ b/fHDHR_web/pages/settings_html.py @@ -4,6 +4,8 @@ from flask import request, render_template, session class Settings_HTML(): endpoints = ["/settings", "/settings.html"] endpoint_name = "page_settings_html" + endpoint_access_level = 1 + pretty_name = "Settings" def __init__(self, fhdhr): self.fhdhr = fhdhr diff --git a/fHDHR_web/pages/tools.py b/fHDHR_web/pages/tools.py index dc8a3cc..72b9b9e 100644 --- a/fHDHR_web/pages/tools.py +++ b/fHDHR_web/pages/tools.py @@ -4,6 +4,8 @@ from flask import request, render_template, session class Tools_HTML(): endpoints = ["/tools", "/tools.html"] endpoint_name = "tools_html" + endpoint_access_level = 2 + pretty_name = "Tools" def __init__(self, fhdhr): self.fhdhr = fhdhr diff --git a/fHDHR_web/pages/tuners_html.py b/fHDHR_web/pages/tuners_html.py index f10db09..99978b9 100644 --- a/fHDHR_web/pages/tuners_html.py +++ b/fHDHR_web/pages/tuners_html.py @@ -6,6 +6,8 @@ from fHDHR.tools import humanized_filesize class Tuners_HTML(): endpoints = ["/tuners", "/tuners.html"] endpoint_name = "page_streams_html" + endpoint_access_level = 0 + pretty_name = "Tuners" def __init__(self, fhdhr): self.fhdhr = fhdhr diff --git a/fHDHR_web/pages/version_html.py b/fHDHR_web/pages/version_html.py index f2b3598..dc1cfdf 100644 --- a/fHDHR_web/pages/version_html.py +++ b/fHDHR_web/pages/version_html.py @@ -4,6 +4,8 @@ from flask import request, render_template, session class Version_HTML(): endpoints = ["/version", "/version.html"] endpoint_name = "page_version_html" + endpoint_access_level = 1 + pretty_name = "Version" def __init__(self, fhdhr): self.fhdhr = fhdhr diff --git a/fHDHR_web/pages/xmltv_html.py b/fHDHR_web/pages/xmltv_html.py index 0f4c4f5..32e0bd6 100644 --- a/fHDHR_web/pages/xmltv_html.py +++ b/fHDHR_web/pages/xmltv_html.py @@ -4,6 +4,8 @@ from flask import request, render_template, session class xmlTV_HTML(): endpoints = ["/xmltv", "/xmltv.html"] endpoint_name = "page_xmltv_html" + endpoint_access_level = 1 + pretty_name = "xmltv" def __init__(self, fhdhr): self.fhdhr = fhdhr diff --git a/fHDHR_web/rmg/devices_probe.py b/fHDHR_web/rmg/devices_probe.py index e59ec2d..6ed4c39 100644 --- a/fHDHR_web/rmg/devices_probe.py +++ b/fHDHR_web/rmg/devices_probe.py @@ -9,6 +9,9 @@ class RMG_Devices_Probe(): endpoints = ["/devices/probe", "/rmg/devices/probe"] endpoint_name = "rmg_devices_probe" endpoint_methods = ["GET", "POST"] + endpoint_default_parameters = { + "uri": "" + } def __init__(self, fhdhr): self.fhdhr = fhdhr diff --git a/fHDHR_web/templates/base.html b/fHDHR_web/templates/base.html index 4d52cbf..c514359 100644 --- a/fHDHR_web/templates/base.html +++ b/fHDHR_web/templates/base.html @@ -17,45 +17,36 @@

- + + - - - - - - - - - - - - - {% if fhdhr.config.dict["web_ui"]["advanced"] %} - - {% endif %} - - {% if fhdhr.config.dict["web_ui"]["advanced"] %} - - {% endif %} - - + {% for page_dict in session["route_list"]["pages"] %} + {% if session["route_list"]["pages"][page_dict]["name"] != "page_index_html" and fhdhr.config.dict["web_ui"]["access_level"] >= session["route_list"]["pages"][page_dict]["endpoint_access_level"] %} + + {% endif %} + {% endfor %} xmltv m3u
- - {% if fhdhr.config.dict["web_ui"]["advanced"] %} - + + + {% if fhdhr.config.dict["web_ui"]["access_level"] == 2 %} + + {% elif fhdhr.config.dict["web_ui"]["access_level"] == 1 %} + {% else %} - + {% endif %} - - {% if fhdhr.config.dict["web_ui"]["advanced"] %} - + + + {% if fhdhr.config.dict["web_ui"]["access_level"] == 2 %} + + {% elif fhdhr.config.dict["web_ui"]["access_level"] == 1 %} + {% else %} - + {% endif %}
diff --git a/fHDHR_web/templates/diagnostics.html b/fHDHR_web/templates/diagnostics.html index 163ae4d..c9683cf 100644 --- a/fHDHR_web/templates/diagnostics.html +++ b/fHDHR_web/templates/diagnostics.html @@ -4,37 +4,30 @@

fHDHR Diagnostic Links

-
- - - - - - - - + {% for route_group in list(button_dict.keys()) %} - {% for button_item in button_list %} - - - {% if button_item["hdhr"] %} - - {% else %} - - {% endif %} - {% if button_item["rmg"] %} - - {% else %} - - {% endif %} - {% if button_item["other"] %} - - {% else %} - - {% endif %} - - {% endfor %} - -
ItemHDHRRMGNon-Specific
{{ button_item["label"] }}
+

{{ route_group }}

+ +
+ + + + + + + + + {% for button_item in button_dict[route_group] %} + + + + + + {% endfor %} + +
Link
+ + {% endfor %} + {% endblock %} diff --git a/fHDHR_web/templates/settings.html b/fHDHR_web/templates/settings.html index 504038b..c85a3a1 100644 --- a/fHDHR_web/templates/settings.html +++ b/fHDHR_web/templates/settings.html @@ -66,6 +66,8 @@ {% endfor %} + +
{% endfor %} diff --git a/fHDHR_web/web_ui_conf.json b/fHDHR_web/web_ui_conf.json index ab5413c..7bacc73 100644 --- a/fHDHR_web/web_ui_conf.json +++ b/fHDHR_web/web_ui_conf.json @@ -5,8 +5,8 @@ "config_file": true, "config_web": true }, - "advanced":{ - "value": false, + "access_level":{ + "value": 0, "config_file": true, "config_web": true }