mirror of
https://github.com/bunkerity/bunkerweb
synced 2026-05-24 09:28:37 +00:00
Finish migrating old core plugins' UI pages to new way of doing it
This commit is contained in:
parent
366e5d7c1c
commit
788ccb1d3a
21 changed files with 238 additions and 1595 deletions
|
|
@ -1,25 +1,26 @@
|
|||
from logging import getLogger
|
||||
from traceback import format_exc
|
||||
|
||||
|
||||
def pre_render(**kwargs):
|
||||
logger = getLogger("UI")
|
||||
ret = {
|
||||
"counter_failed_cors": {
|
||||
"value": 0,
|
||||
"title": "CORS",
|
||||
"subtitle": "Request blocked",
|
||||
"subtitle_color": "danger",
|
||||
"svg_color": "danger",
|
||||
},
|
||||
}
|
||||
try:
|
||||
data = kwargs["bw_instances_utils"].get_metrics("cors")
|
||||
return {
|
||||
"counter_failed_cors": {
|
||||
"value": data.get("counter_failed_cors", 0),
|
||||
"title": "CORS",
|
||||
"subtitle": "request blocked",
|
||||
"subtitle_color": "error",
|
||||
"svg_color": "red",
|
||||
}
|
||||
}
|
||||
ret["counter_failed_cors"]["value"] = kwargs["bw_instances_utils"].get_metrics("cors").get("counter_failed_cors", 0)
|
||||
except BaseException as e:
|
||||
logger.debug(format_exc())
|
||||
logger.error(f"Failed to get cors metrics: {e}")
|
||||
ret["error"] = str(e)
|
||||
|
||||
except BaseException:
|
||||
print(format_exc(), flush=True)
|
||||
return {
|
||||
"counter_failed_cors": {"value": "unknown", "title": "CORS", "subtitle": "request blocked", "subtitle_color": "error", "svg_color": "red"},
|
||||
"error": format_exc(),
|
||||
}
|
||||
return ret
|
||||
|
||||
|
||||
def cors(**kwargs):
|
||||
|
|
|
|||
|
|
@ -1,144 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% set read_doc_text = 'You will find more information about the cors plugin <a target="_blank" href="https://docs.bunkerweb.io/' + bw_version + '/security-tuning/#cors" class="core-card-text-doc-link">in the documentation</a>.' %}
|
||||
|
||||
{% block content %}
|
||||
<input type="csrf_token"
|
||||
name="csrf_token"
|
||||
value="{{ csrf_token }}"
|
||||
class="hidden"
|
||||
hidden />
|
||||
<div class="core-layout">
|
||||
{% if is_used and is_metrics %}
|
||||
<div class="core-card">
|
||||
<h5 class="core-card-title">INFO</h5>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %} <div class="core-layout-separator"></div>
|
||||
<div class="my-2 flex justify-center col-span-12">
|
||||
<div class="mr-1">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %}
|
||||
|
||||
|
||||
{% for key, value in pre_render.get("data", {}).items() %}
|
||||
|
||||
{% if key.startswith("ping_") %}
|
||||
<div class="core-card-status">
|
||||
<div class="core-card-status-container">
|
||||
<h5 class="core-card-status-title">{{ pre_render['data'][key].get('title', 'STATUS')}}</h5>
|
||||
<svg data-status-svg
|
||||
class="core-card-status-svg {{ 'fill-green-500' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'fill-red-500' }}"
|
||||
viewBox="0 0 100 100"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="50" cy="50" r="50" />
|
||||
</svg>
|
||||
</div>
|
||||
<p data-status-text class="core-card-text">{{ 'Active' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'Inactive' }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if key.startswith("count_") or key.startswith("counter_") %}
|
||||
<div class="core-card-metrics">
|
||||
<!-- text -->
|
||||
<div>
|
||||
<p class="core-card-metrics-name">{{pre_render['data'][key].get("title")}}</p>
|
||||
<h5 data-count class="core-card-title">{{pre_render['data'][key].get("value")}}</h5>
|
||||
<p class="core-card-metrics-subtitle">
|
||||
<span class="core-card-metrics-subtitle-content {{pre_render['data'][key].get("subtitle_color", "info")}}">{{pre_render['data'][key].get("subtitle")}}</span>
|
||||
</p>
|
||||
</div>
|
||||
<!-- end text -->
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container {{pre_render['data'][key].get("svg_color")}}">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-small core-card-metrics-svg"
|
||||
>
|
||||
<path
|
||||
d="M18.75 12.75h1.5a.75.75 0 0 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM12 6a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 6ZM12 18a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 18ZM3.75 6.75h1.5a.75.75 0 1 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM5.25 18.75h-1.5a.75.75 0 0 1 0-1.5h1.5a.75.75 0 0 1 0 1.5ZM3 12a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 3 12ZM9 3.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5ZM12.75 12a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM9 15.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if (key.startswith("top_") and pre_render['data'][key]|length > 0) or (key.startswith("list_") and pre_render['data'][key]|length > 0) %}
|
||||
<div class="core-card-list">
|
||||
<div class="core-card-list-title-container">
|
||||
<h5 class="core-card-list-title">{{ key.replace('_', ' ').upper()}}</h5>
|
||||
</div>
|
||||
<div class="core-card-list-container">
|
||||
<!-- list container-->
|
||||
<div class="core-card-list-wrap">
|
||||
<!-- header-->
|
||||
{% for val_key, val_value in pre_render['data'][key][0].items() %}
|
||||
|
||||
|
||||
<p class="core-card-list-header {{'col-span-6' if pre_render['data'][key][0].keys()|length == 2 else "col-span-4" if pre_render['data'][key][0].keys()|length == 3 else "col-span-3" if pre_render['data'][key][0].keys()|length == 4}}">{{ val_key }}</p>
|
||||
{% endfor%}
|
||||
<!-- end header-->
|
||||
<!-- list -->
|
||||
<ul class="col-span-12 w-full">
|
||||
{% for item in pre_render['data'][key] %}
|
||||
<li class="core-card-list-item">
|
||||
{% for top_key, top_value in item.items() %}
|
||||
<p class="core-card-list-item-content {{'col-span-6' if item.keys()|length == 2 else "col-span-4" if item.keys()|length == 3 else "col-span-3" if item.keys()|length == 4}}">{{ top_value }}</p>
|
||||
{% endfor %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<!-- end list-->
|
||||
</div>
|
||||
<!-- end list container-->
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="core-card">
|
||||
<div class="core-card-wrap">
|
||||
<h5 class="core-card-title">Plugin deactivated</h5>
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="core-card-deactivated-svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p data-info class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,24 +1,26 @@
|
|||
from logging import getLogger
|
||||
from traceback import format_exc
|
||||
|
||||
|
||||
def pre_render(**kwargs):
|
||||
logger = getLogger("UI")
|
||||
ret = {
|
||||
"counter_failed_country": {
|
||||
"value": 0,
|
||||
"title": "Country",
|
||||
"subtitle": "Request blocked",
|
||||
"subtitle_color": "danger",
|
||||
"svg_color": "danger",
|
||||
},
|
||||
}
|
||||
try:
|
||||
data = kwargs["bw_instances_utils"].get_metrics("country")
|
||||
return {
|
||||
"counter_failed_country": {
|
||||
"value": data.get("counter_failed_country", 0),
|
||||
"title": "Country",
|
||||
"subtitle": "request blocked",
|
||||
"subtitle_color": "error",
|
||||
"svg_color": "red",
|
||||
}
|
||||
}
|
||||
except BaseException:
|
||||
print(format_exc(), flush=True)
|
||||
return {
|
||||
"counter_failed_country": {"value": "unknown", "title": "Country", "subtitle": "request blocked", "subtitle_color": "error", "svg_color": "red"},
|
||||
"error": format_exc(),
|
||||
}
|
||||
ret["counter_failed_country"]["value"] = kwargs["bw_instances_utils"].get_metrics("country").get("counter_failed_country", 0)
|
||||
except BaseException as e:
|
||||
logger.debug(format_exc())
|
||||
logger.error(f"Failed to get country metrics: {e}")
|
||||
ret["error"] = str(e)
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
def country(**kwargs):
|
||||
|
|
|
|||
|
|
@ -1,144 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% set read_doc_text = 'You will find more information about the country plugin <a target="_blank" href="https://docs.bunkerweb.io/' + bw_version + '/security-tuning/#country" class="core-card-text-doc-link">in the documentation</a>.' %}
|
||||
|
||||
{% block content %}
|
||||
<input type="csrf_token"
|
||||
name="csrf_token"
|
||||
value="{{ csrf_token }}"
|
||||
class="hidden"
|
||||
hidden />
|
||||
<div class="core-layout">
|
||||
{% if is_used and is_metrics %}
|
||||
<div class="core-card">
|
||||
<h5 class="core-card-title">INFO</h5>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %} <div class="core-layout-separator"></div>
|
||||
<div class="my-2 flex justify-center col-span-12">
|
||||
<div class="mr-1">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %}
|
||||
|
||||
|
||||
{% for key, value in pre_render.get("data", {}).items() %}
|
||||
|
||||
{% if key.startswith("ping_") %}
|
||||
<div class="core-card-status">
|
||||
<div class="core-card-status-container">
|
||||
<h5 class="core-card-status-title">{{ pre_render['data'][key].get('title', 'STATUS')}}</h5>
|
||||
<svg data-status-svg
|
||||
class="core-card-status-svg {{ 'fill-green-500' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'fill-red-500' }}"
|
||||
viewBox="0 0 100 100"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="50" cy="50" r="50" />
|
||||
</svg>
|
||||
</div>
|
||||
<p data-status-text class="core-card-text">{{ 'Active' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'Inactive' }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if key.startswith("count_") or key.startswith("counter_") %}
|
||||
<div class="core-card-metrics">
|
||||
<!-- text -->
|
||||
<div>
|
||||
<p class="core-card-metrics-name">{{pre_render['data'][key].get("title")}}</p>
|
||||
<h5 data-count class="core-card-title">{{pre_render['data'][key].get("value")}}</h5>
|
||||
<p class="core-card-metrics-subtitle">
|
||||
<span class="core-card-metrics-subtitle-content {{pre_render['data'][key].get("subtitle_color", "info")}}">{{pre_render['data'][key].get("subtitle")}}</span>
|
||||
</p>
|
||||
</div>
|
||||
<!-- end text -->
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container {{pre_render['data'][key].get("svg_color")}}">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-small core-card-metrics-svg"
|
||||
>
|
||||
<path
|
||||
d="M18.75 12.75h1.5a.75.75 0 0 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM12 6a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 6ZM12 18a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 18ZM3.75 6.75h1.5a.75.75 0 1 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM5.25 18.75h-1.5a.75.75 0 0 1 0-1.5h1.5a.75.75 0 0 1 0 1.5ZM3 12a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 3 12ZM9 3.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5ZM12.75 12a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM9 15.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if (key.startswith("top_") and pre_render['data'][key]|length > 0) or (key.startswith("list_") and pre_render['data'][key]|length > 0) %}
|
||||
<div class="core-card-list">
|
||||
<div class="core-card-list-title-container">
|
||||
<h5 class="core-card-list-title">{{ key.replace('_', ' ').upper()}}</h5>
|
||||
</div>
|
||||
<div class="core-card-list-container">
|
||||
<!-- list container-->
|
||||
<div class="core-card-list-wrap">
|
||||
<!-- header-->
|
||||
{% for val_key, val_value in pre_render['data'][key][0].items() %}
|
||||
|
||||
|
||||
<p class="core-card-list-header {{'col-span-6' if pre_render['data'][key][0].keys()|length == 2 else "col-span-4" if pre_render['data'][key][0].keys()|length == 3 else "col-span-3" if pre_render['data'][key][0].keys()|length == 4}}">{{ val_key }}</p>
|
||||
{% endfor%}
|
||||
<!-- end header-->
|
||||
<!-- list -->
|
||||
<ul class="col-span-12 w-full">
|
||||
{% for item in pre_render['data'][key] %}
|
||||
<li class="core-card-list-item">
|
||||
{% for top_key, top_value in item.items() %}
|
||||
<p class="core-card-list-item-content {{'col-span-6' if item.keys()|length == 2 else "col-span-4" if item.keys()|length == 3 else "col-span-3" if item.keys()|length == 4}}">{{ top_value }}</p>
|
||||
{% endfor %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<!-- end list-->
|
||||
</div>
|
||||
<!-- end list container-->
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="core-card">
|
||||
<div class="core-card-wrap">
|
||||
<h5 class="core-card-title">Plugin deactivated</h5>
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="core-card-deactivated-svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p data-info class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,24 +1,26 @@
|
|||
from logging import getLogger
|
||||
from traceback import format_exc
|
||||
|
||||
|
||||
def pre_render(**kwargs):
|
||||
logger = getLogger("UI")
|
||||
ret = {
|
||||
"counter_failed_dnsbl": {
|
||||
"value": 0,
|
||||
"title": "DNSBL",
|
||||
"subtitle": "Request blocked",
|
||||
"subtitle_color": "danger",
|
||||
"svg_color": "danger",
|
||||
},
|
||||
}
|
||||
try:
|
||||
data = kwargs["bw_instances_utils"].get_metrics("dnsbl")
|
||||
return {
|
||||
"counter_failed_dnsbl": {
|
||||
"value": data.get("counter_failed_dnsbl", 0),
|
||||
"title": "DNSBL",
|
||||
"subtitle": "request blocked",
|
||||
"subtitle_color": "error",
|
||||
"svg_color": "red",
|
||||
}
|
||||
}
|
||||
except BaseException:
|
||||
print(format_exc(), flush=True)
|
||||
return {
|
||||
"counter_failed_dnsbl": {"value": "unknown", "title": "DNSBL", "subtitle": "request blocked", "subtitle_color": "error", "svg_color": "red"},
|
||||
"error": format_exc(),
|
||||
}
|
||||
ret["counter_failed_dnsbl"]["value"] = kwargs["bw_instances_utils"].get_metrics("dnsbl").get("counter_failed_dnsbl", 0)
|
||||
except BaseException as e:
|
||||
logger.debug(format_exc())
|
||||
logger.error(f"Failed to get dnsbl metrics: {e}")
|
||||
ret["error"] = str(e)
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
def dnsbl(**kwargs):
|
||||
|
|
|
|||
|
|
@ -1,144 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% set read_doc_text = 'You will find more information about the dnsbl plugin <a target="_blank" href="https://docs.bunkerweb.io/' + bw_version + '/security-tuning/#dnsbl" class="core-card-text-doc-link">in the documentation</a>.' %}
|
||||
|
||||
{% block content %}
|
||||
<input type="csrf_token"
|
||||
name="csrf_token"
|
||||
value="{{ csrf_token }}"
|
||||
class="hidden"
|
||||
hidden />
|
||||
<div class="core-layout">
|
||||
{% if is_used and is_metrics %}
|
||||
<div class="core-card">
|
||||
<h5 class="core-card-title">INFO</h5>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %} <div class="core-layout-separator"></div>
|
||||
<div class="my-2 flex justify-center col-span-12">
|
||||
<div class="mr-1">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %}
|
||||
|
||||
|
||||
{% for key, value in pre_render.get("data", {}).items() %}
|
||||
|
||||
{% if key.startswith("ping_") %}
|
||||
<div class="core-card-status">
|
||||
<div class="core-card-status-container">
|
||||
<h5 class="core-card-status-title">{{ pre_render['data'][key].get('title', 'STATUS')}}</h5>
|
||||
<svg data-status-svg
|
||||
class="core-card-status-svg {{ 'fill-green-500' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'fill-red-500' }}"
|
||||
viewBox="0 0 100 100"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="50" cy="50" r="50" />
|
||||
</svg>
|
||||
</div>
|
||||
<p data-status-text class="core-card-text">{{ 'Active' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'Inactive' }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if key.startswith("count_") or key.startswith("counter_") %}
|
||||
<div class="core-card-metrics">
|
||||
<!-- text -->
|
||||
<div>
|
||||
<p class="core-card-metrics-name">{{pre_render['data'][key].get("title")}}</p>
|
||||
<h5 data-count class="core-card-title">{{pre_render['data'][key].get("value")}}</h5>
|
||||
<p class="core-card-metrics-subtitle">
|
||||
<span class="core-card-metrics-subtitle-content {{pre_render['data'][key].get("subtitle_color", "info")}}">{{pre_render['data'][key].get("subtitle")}}</span>
|
||||
</p>
|
||||
</div>
|
||||
<!-- end text -->
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container {{pre_render['data'][key].get("svg_color")}}">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-small core-card-metrics-svg"
|
||||
>
|
||||
<path
|
||||
d="M18.75 12.75h1.5a.75.75 0 0 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM12 6a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 6ZM12 18a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 18ZM3.75 6.75h1.5a.75.75 0 1 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM5.25 18.75h-1.5a.75.75 0 0 1 0-1.5h1.5a.75.75 0 0 1 0 1.5ZM3 12a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 3 12ZM9 3.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5ZM12.75 12a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM9 15.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if (key.startswith("top_") and pre_render['data'][key]|length > 0) or (key.startswith("list_") and pre_render['data'][key]|length > 0) %}
|
||||
<div class="core-card-list">
|
||||
<div class="core-card-list-title-container">
|
||||
<h5 class="core-card-list-title">{{ key.replace('_', ' ').upper()}}</h5>
|
||||
</div>
|
||||
<div class="core-card-list-container">
|
||||
<!-- list container-->
|
||||
<div class="core-card-list-wrap">
|
||||
<!-- header-->
|
||||
{% for val_key, val_value in pre_render['data'][key][0].items() %}
|
||||
|
||||
|
||||
<p class="core-card-list-header {{'col-span-6' if pre_render['data'][key][0].keys()|length == 2 else "col-span-4" if pre_render['data'][key][0].keys()|length == 3 else "col-span-3" if pre_render['data'][key][0].keys()|length == 4}}">{{ val_key }}</p>
|
||||
{% endfor%}
|
||||
<!-- end header-->
|
||||
<!-- list -->
|
||||
<ul class="col-span-12 w-full">
|
||||
{% for item in pre_render['data'][key] %}
|
||||
<li class="core-card-list-item">
|
||||
{% for top_key, top_value in item.items() %}
|
||||
<p class="core-card-list-item-content {{'col-span-6' if item.keys()|length == 2 else "col-span-4" if item.keys()|length == 3 else "col-span-3" if item.keys()|length == 4}}">{{ top_value }}</p>
|
||||
{% endfor %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<!-- end list-->
|
||||
</div>
|
||||
<!-- end list container-->
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="core-card">
|
||||
<div class="core-card-wrap">
|
||||
<h5 class="core-card-title">Plugin deactivated</h5>
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="core-card-deactivated-svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p data-info class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,18 +1,40 @@
|
|||
from logging import getLogger
|
||||
from operator import itemgetter
|
||||
from traceback import format_exc
|
||||
|
||||
|
||||
def pre_render(**kwargs):
|
||||
logger = getLogger("UI")
|
||||
ret = {
|
||||
"top_errors": {
|
||||
"data": {},
|
||||
"order": {
|
||||
"column": 1,
|
||||
"dir": "desc",
|
||||
},
|
||||
"svg_color": "danger",
|
||||
},
|
||||
}
|
||||
try:
|
||||
# Here we will have a list { 'counter_403': X, 'counter_401': Y ... }
|
||||
data = kwargs["bw_instances_utils"].get_metrics("errors")
|
||||
# Format to fit [{code: 403, count: X}, {code: 401, count: Y} ...]
|
||||
format_data = [{"code": int(key.split("_")[1]), "count": int(value)} for key, value in data.items()]
|
||||
format_data = [
|
||||
{
|
||||
"code": int(key.split("_")[1]),
|
||||
"count": int(value),
|
||||
}
|
||||
for key, value in kwargs["bw_instances_utils"].get_metrics("errors").items()
|
||||
]
|
||||
format_data.sort(key=itemgetter("count"), reverse=True)
|
||||
return {"top_errors": format_data}
|
||||
except BaseException:
|
||||
print(format_exc(), flush=True)
|
||||
return {"top_errors": [], "error": format_exc()}
|
||||
data = {"code": [], "count": []}
|
||||
for item in format_data:
|
||||
data["code"].append(item["code"])
|
||||
data["count"].append(item["count"])
|
||||
ret["top_errors"]["data"] = data
|
||||
except BaseException as e:
|
||||
logger.debug(format_exc())
|
||||
logger.error(f"Failed to get errors metrics: {e}")
|
||||
ret["error"] = str(e)
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
def errors(**kwargs):
|
||||
|
|
|
|||
|
|
@ -1,119 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% set read_doc_text = 'You will find more information about the errors plugin <a target="_blank" href="https://docs.bunkerweb.io/' + bw_version + '/settings/#errors" class="core-card-text-doc-link">in the documentation</a>.' %}
|
||||
|
||||
{% block content %}
|
||||
<input type="csrf_token"
|
||||
name="csrf_token"
|
||||
value="{{ csrf_token }}"
|
||||
class="hidden"
|
||||
hidden />
|
||||
<div class="core-layout">
|
||||
<div class="core-card">
|
||||
<h5 class="core-card-title">INFO</h5>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %} <div class="core-layout-separator"></div>
|
||||
<div class="my-2 flex justify-center col-span-12">
|
||||
<div class="mr-1">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %}
|
||||
|
||||
|
||||
{% for key, value in pre_render.get("data", {}).items() %}
|
||||
|
||||
{% if key.startswith("ping_") %}
|
||||
<div class="core-card-status">
|
||||
<div class="core-card-status-container">
|
||||
<h5 class="core-card-status-title">{{ pre_render['data'][key].get('title', 'STATUS')}}</h5>
|
||||
<svg data-status-svg
|
||||
class="core-card-status-svg {{ 'fill-green-500' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'fill-red-500' }}"
|
||||
viewBox="0 0 100 100"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="50" cy="50" r="50" />
|
||||
</svg>
|
||||
</div>
|
||||
<p data-status-text class="core-card-text">{{ 'Active' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'Inactive' }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if key.startswith("count_") or key.startswith("counter_") %}
|
||||
<div class="core-card-metrics">
|
||||
<!-- text -->
|
||||
<div>
|
||||
<p class="core-card-metrics-name">{{pre_render['data'][key].get("title")}}</p>
|
||||
<h5 data-count class="core-card-title">{{pre_render['data'][key].get("value")}}</h5>
|
||||
<p class="core-card-metrics-subtitle">
|
||||
<span class="core-card-metrics-subtitle-content {{pre_render['data'][key].get("subtitle_color", "info")}}">{{pre_render['data'][key].get("subtitle")}}</span>
|
||||
</p>
|
||||
</div>
|
||||
<!-- end text -->
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container {{pre_render['data'][key].get("svg_color")}}">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-small core-card-metrics-svg"
|
||||
>
|
||||
<path
|
||||
d="M18.75 12.75h1.5a.75.75 0 0 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM12 6a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 6ZM12 18a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 18ZM3.75 6.75h1.5a.75.75 0 1 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM5.25 18.75h-1.5a.75.75 0 0 1 0-1.5h1.5a.75.75 0 0 1 0 1.5ZM3 12a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 3 12ZM9 3.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5ZM12.75 12a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM9 15.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if (key.startswith("top_") and pre_render['data'][key]|length > 0) or (key.startswith("list_") and pre_render['data'][key]|length > 0) %}
|
||||
<div class="core-card-list">
|
||||
<div class="core-card-list-title-container">
|
||||
<h5 class="core-card-list-title">{{ key.replace('_', ' ').upper()}}</h5>
|
||||
</div>
|
||||
<div class="core-card-list-container">
|
||||
<!-- list container-->
|
||||
<div class="core-card-list-wrap">
|
||||
<!-- header-->
|
||||
{% for val_key, val_value in pre_render['data'][key][0].items() %}
|
||||
|
||||
|
||||
<p class="core-card-list-header {{'col-span-6' if pre_render['data'][key][0].keys()|length == 2 else "col-span-4" if pre_render['data'][key][0].keys()|length == 3 else "col-span-3" if pre_render['data'][key][0].keys()|length == 4}}">{{ val_key }}</p>
|
||||
{% endfor%}
|
||||
<!-- end header-->
|
||||
<!-- list -->
|
||||
<ul class="col-span-12 w-full">
|
||||
{% for item in pre_render['data'][key] %}
|
||||
<li class="core-card-list-item">
|
||||
{% for top_key, top_value in item.items() %}
|
||||
<p class="core-card-list-item-content {{'col-span-6' if item.keys()|length == 2 else "col-span-4" if item.keys()|length == 3 else "col-span-3" if item.keys()|length == 4}}">{{ top_value }}</p>
|
||||
{% endfor %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<!-- end list-->
|
||||
</div>
|
||||
<!-- end list container-->
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,24 +1,26 @@
|
|||
from logging import getLogger
|
||||
from traceback import format_exc
|
||||
|
||||
|
||||
def pre_render(**kwargs):
|
||||
logger = getLogger("UI")
|
||||
ret = {
|
||||
"counter_failed_greylist": {
|
||||
"value": 0,
|
||||
"title": "GREYLIST",
|
||||
"subtitle": "Request blocked",
|
||||
"subtitle_color": "danger",
|
||||
"svg_color": "danger",
|
||||
},
|
||||
}
|
||||
try:
|
||||
data = kwargs["bw_instances_utils"].get_metrics("greylist")
|
||||
return {
|
||||
"counter_failed_greylist": {
|
||||
"value": data.get("counter_failed_greylist", 0),
|
||||
"title": "GREYLIST",
|
||||
"subtitle": "request blocked",
|
||||
"subtitle_color": "error",
|
||||
"svg_color": "red",
|
||||
}
|
||||
}
|
||||
except BaseException:
|
||||
print(format_exc(), flush=True)
|
||||
return {
|
||||
"counter_failed_greylist": {"value": "unknown", "title": "GREYLIST", "subtitle": "request blocked", "subtitle_color": "error", "svg_color": "red"},
|
||||
"error": format_exc(),
|
||||
}
|
||||
ret["counter_failed_greylist"]["value"] = kwargs["bw_instances_utils"].get_metrics("greylist").get("counter_failed_greylist", 0)
|
||||
except BaseException as e:
|
||||
logger.debug(format_exc())
|
||||
logger.error(f"Failed to get greylist metrics: {e}")
|
||||
ret["error"] = str(e)
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
def greylist(**kwargs):
|
||||
|
|
|
|||
|
|
@ -1,144 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% set read_doc_text = 'You will find more information about the greylist plugin <a target="_blank" href="https://docs.bunkerweb.io/' + bw_version + '/security-tuning/#greylisting" class="core-card-text-doc-link">in the documentation</a>.' %}
|
||||
|
||||
{% block content %}
|
||||
<input type="csrf_token"
|
||||
name="csrf_token"
|
||||
value="{{ csrf_token }}"
|
||||
class="hidden"
|
||||
hidden />
|
||||
<div class="core-layout">
|
||||
{% if is_used and is_metrics %}
|
||||
<div class="core-card">
|
||||
<h5 class="core-card-title">INFO</h5>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %} <div class="core-layout-separator"></div>
|
||||
<div class="my-2 flex justify-center col-span-12">
|
||||
<div class="mr-1">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %}
|
||||
|
||||
|
||||
{% for key, value in pre_render.get("data", {}).items() %}
|
||||
|
||||
{% if key.startswith("ping_") %}
|
||||
<div class="core-card-status">
|
||||
<div class="core-card-status-container">
|
||||
<h5 class="core-card-status-title">{{ pre_render['data'][key].get('title', 'STATUS')}}</h5>
|
||||
<svg data-status-svg
|
||||
class="core-card-status-svg {{ 'fill-green-500' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'fill-red-500' }}"
|
||||
viewBox="0 0 100 100"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="50" cy="50" r="50" />
|
||||
</svg>
|
||||
</div>
|
||||
<p data-status-text class="core-card-text">{{ 'Active' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'Inactive' }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if key.startswith("count_") or key.startswith("counter_") %}
|
||||
<div class="core-card-metrics">
|
||||
<!-- text -->
|
||||
<div>
|
||||
<p class="core-card-metrics-name">{{pre_render['data'][key].get("title")}}</p>
|
||||
<h5 data-count class="core-card-title">{{pre_render['data'][key].get("value")}}</h5>
|
||||
<p class="core-card-metrics-subtitle">
|
||||
<span class="core-card-metrics-subtitle-content {{pre_render['data'][key].get("subtitle_color", "info")}}">{{pre_render['data'][key].get("subtitle")}}</span>
|
||||
</p>
|
||||
</div>
|
||||
<!-- end text -->
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container {{pre_render['data'][key].get("svg_color")}}">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-small core-card-metrics-svg"
|
||||
>
|
||||
<path
|
||||
d="M18.75 12.75h1.5a.75.75 0 0 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM12 6a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 6ZM12 18a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 18ZM3.75 6.75h1.5a.75.75 0 1 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM5.25 18.75h-1.5a.75.75 0 0 1 0-1.5h1.5a.75.75 0 0 1 0 1.5ZM3 12a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 3 12ZM9 3.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5ZM12.75 12a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM9 15.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if (key.startswith("top_") and pre_render['data'][key]|length > 0) or (key.startswith("list_") and pre_render['data'][key]|length > 0) %}
|
||||
<div class="core-card-list">
|
||||
<div class="core-card-list-title-container">
|
||||
<h5 class="core-card-list-title">{{ key.replace('_', ' ').upper()}}</h5>
|
||||
</div>
|
||||
<div class="core-card-list-container">
|
||||
<!-- list container-->
|
||||
<div class="core-card-list-wrap">
|
||||
<!-- header-->
|
||||
{% for val_key, val_value in pre_render['data'][key][0].items() %}
|
||||
|
||||
|
||||
<p class="core-card-list-header {{'col-span-6' if pre_render['data'][key][0].keys()|length == 2 else "col-span-4" if pre_render['data'][key][0].keys()|length == 3 else "col-span-3" if pre_render['data'][key][0].keys()|length == 4}}">{{ val_key }}</p>
|
||||
{% endfor%}
|
||||
<!-- end header-->
|
||||
<!-- list -->
|
||||
<ul class="col-span-12 w-full">
|
||||
{% for item in pre_render['data'][key] %}
|
||||
<li class="core-card-list-item">
|
||||
{% for top_key, top_value in item.items() %}
|
||||
<p class="core-card-list-item-content {{'col-span-6' if item.keys()|length == 2 else "col-span-4" if item.keys()|length == 3 else "col-span-3" if item.keys()|length == 4}}">{{ top_value }}</p>
|
||||
{% endfor %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<!-- end list-->
|
||||
</div>
|
||||
<!-- end list container-->
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="core-card">
|
||||
<div class="core-card-wrap">
|
||||
<h5 class="core-card-title">Plugin deactivated</h5>
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="core-card-deactivated-svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p data-info class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,25 +1,37 @@
|
|||
from logging import getLogger
|
||||
from operator import itemgetter
|
||||
from traceback import format_exc
|
||||
|
||||
|
||||
def pre_render(**kwargs):
|
||||
logger = getLogger("UI")
|
||||
ret = {
|
||||
"top_limit": {
|
||||
"data": {},
|
||||
"order": {
|
||||
"column": 1,
|
||||
"dir": "desc",
|
||||
},
|
||||
"svg_color": "amber",
|
||||
},
|
||||
}
|
||||
try:
|
||||
# Here we will have a list { 'limit_uri_url1': X, 'limit_uri_url2': Y ... }
|
||||
data = kwargs["bw_instances_utils"].get_metrics("limit")
|
||||
format_data = []
|
||||
# Format to fit [{url: "url1", count: X}, {url: "url2", count: Y} ...]
|
||||
for key, value in data.items():
|
||||
key = key.split("/", 1)
|
||||
if len(key) > 1:
|
||||
key = key[1]
|
||||
else:
|
||||
key = ""
|
||||
format_data.append({"url": f"/{key}", "count": int(value)})
|
||||
format_data = [
|
||||
{"URL": f"/{key.split('/', 1)[1] if '/' in key else ''}", "count": int(value)}
|
||||
for key, value in kwargs["bw_instances_utils"].get_metrics("limit").items()
|
||||
]
|
||||
format_data.sort(key=itemgetter("count"), reverse=True)
|
||||
return {"top_limit": format_data}
|
||||
except BaseException:
|
||||
print(format_exc(), flush=True)
|
||||
return {"top_limit": [], "error": format_exc()}
|
||||
data = {"URL": [], "count": []}
|
||||
for item in format_data:
|
||||
data["URL"].append(item["URL"])
|
||||
data["count"].append(item["count"])
|
||||
ret["top_limit"]["data"] = data
|
||||
except BaseException as e:
|
||||
logger.debug(format_exc())
|
||||
logger.error(f"Failed to get limit metrics: {e}")
|
||||
ret["error"] = str(e)
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
def limit(**kwargs):
|
||||
|
|
|
|||
|
|
@ -1,144 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% set read_doc_text = 'You will find more information about the limit plugin <a target="_blank" href="https://docs.bunkerweb.io/' + bw_version + '/security-tuning/#limiting" class="core-card-text-doc-link">in the documentation</a>.' %}
|
||||
|
||||
{% block content %}
|
||||
<input type="csrf_token"
|
||||
name="csrf_token"
|
||||
value="{{ csrf_token }}"
|
||||
class="hidden"
|
||||
hidden />
|
||||
<div class="core-layout">
|
||||
{% if is_used and is_metrics %}
|
||||
<div class="core-card">
|
||||
<h5 class="core-card-title">INFO</h5>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %} <div class="core-layout-separator"></div>
|
||||
<div class="my-2 flex justify-center col-span-12">
|
||||
<div class="mr-1">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %}
|
||||
|
||||
|
||||
{% for key, value in pre_render.get("data", {}).items() %}
|
||||
|
||||
{% if key.startswith("ping_") %}
|
||||
<div class="core-card-status">
|
||||
<div class="core-card-status-container">
|
||||
<h5 class="core-card-status-title">{{ pre_render['data'][key].get('title', 'STATUS')}}</h5>
|
||||
<svg data-status-svg
|
||||
class="core-card-status-svg {{ 'fill-green-500' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'fill-red-500' }}"
|
||||
viewBox="0 0 100 100"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="50" cy="50" r="50" />
|
||||
</svg>
|
||||
</div>
|
||||
<p data-status-text class="core-card-text">{{ 'Active' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'Inactive' }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if key.startswith("count_") or key.startswith("counter_") %}
|
||||
<div class="core-card-metrics">
|
||||
<!-- text -->
|
||||
<div>
|
||||
<p class="core-card-metrics-name">{{pre_render['data'][key].get("title")}}</p>
|
||||
<h5 data-count class="core-card-title">{{pre_render['data'][key].get("value")}}</h5>
|
||||
<p class="core-card-metrics-subtitle">
|
||||
<span class="core-card-metrics-subtitle-content {{pre_render['data'][key].get("subtitle_color", "info")}}">{{pre_render['data'][key].get("subtitle")}}</span>
|
||||
</p>
|
||||
</div>
|
||||
<!-- end text -->
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container {{pre_render['data'][key].get("svg_color")}}">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-small core-card-metrics-svg"
|
||||
>
|
||||
<path
|
||||
d="M18.75 12.75h1.5a.75.75 0 0 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM12 6a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 6ZM12 18a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 18ZM3.75 6.75h1.5a.75.75 0 1 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM5.25 18.75h-1.5a.75.75 0 0 1 0-1.5h1.5a.75.75 0 0 1 0 1.5ZM3 12a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 3 12ZM9 3.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5ZM12.75 12a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM9 15.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if (key.startswith("top_") and pre_render['data'][key]|length > 0) or (key.startswith("list_") and pre_render['data'][key]|length > 0) %}
|
||||
<div class="core-card-list">
|
||||
<div class="core-card-list-title-container">
|
||||
<h5 class="core-card-list-title">{{ key.replace('_', ' ').upper()}}</h5>
|
||||
</div>
|
||||
<div class="core-card-list-container">
|
||||
<!-- list container-->
|
||||
<div class="core-card-list-wrap">
|
||||
<!-- header-->
|
||||
{% for val_key, val_value in pre_render['data'][key][0].items() %}
|
||||
|
||||
|
||||
<p class="core-card-list-header {{'col-span-6' if pre_render['data'][key][0].keys()|length == 2 else "col-span-4" if pre_render['data'][key][0].keys()|length == 3 else "col-span-3" if pre_render['data'][key][0].keys()|length == 4}}">{{ val_key }}</p>
|
||||
{% endfor%}
|
||||
<!-- end header-->
|
||||
<!-- list -->
|
||||
<ul class="col-span-12 w-full">
|
||||
{% for item in pre_render['data'][key] %}
|
||||
<li class="core-card-list-item">
|
||||
{% for top_key, top_value in item.items() %}
|
||||
<p class="core-card-list-item-content {{'col-span-6' if item.keys()|length == 2 else "col-span-4" if item.keys()|length == 3 else "col-span-3" if item.keys()|length == 4}}">{{ top_value }}</p>
|
||||
{% endfor %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<!-- end list-->
|
||||
</div>
|
||||
<!-- end list container-->
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="core-card">
|
||||
<div class="core-card-wrap">
|
||||
<h5 class="core-card-title">Plugin deactivated</h5>
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="core-card-deactivated-svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p data-info class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,39 +1,35 @@
|
|||
from logging import getLogger
|
||||
from traceback import format_exc
|
||||
|
||||
|
||||
def pre_render(**kwargs):
|
||||
logger = getLogger("UI")
|
||||
ret = {
|
||||
"counter_failed_default": {
|
||||
"value": 0,
|
||||
"title": "DEFAULT SERVER DISABLED",
|
||||
"subtitle": "Total",
|
||||
"subtitle_color": "danger",
|
||||
"svg_color": "danger",
|
||||
},
|
||||
"counter_failed_method": {
|
||||
"value": 0,
|
||||
"title": "DISALLOWED METHODS",
|
||||
"subtitle": "Count",
|
||||
"subtitle_color": "olive",
|
||||
"svg_color": "olive",
|
||||
},
|
||||
}
|
||||
try:
|
||||
data = kwargs["bw_instances_utils"].get_metrics("misc")
|
||||
ret["counter_failed_default"]["value"] = data.get("counter_failed_default", 0)
|
||||
ret["counter_failed_method"]["value"] = data.get("counter_failed_method", 0)
|
||||
except BaseException as e:
|
||||
logger.debug(format_exc())
|
||||
logger.error(f"Failed to get default metrics: {e}")
|
||||
ret["error"] = str(e)
|
||||
|
||||
return {
|
||||
"counter_failed_default": {
|
||||
"value": data.get("counter_failed_default", 0),
|
||||
"title": "DEFAULT SERVER DISABLED",
|
||||
"subtitle": "total",
|
||||
"subtitle_color": "info",
|
||||
"svg_color": "sky",
|
||||
},
|
||||
"counter_failed_method": {
|
||||
"value": data.get("counter_failed_method", 0),
|
||||
"title": "DISALLOWED METHODS",
|
||||
"subtitle": "count",
|
||||
"subtitle_color": "info",
|
||||
"svg_color": "lime",
|
||||
},
|
||||
}
|
||||
except BaseException:
|
||||
print(format_exc(), flush=True)
|
||||
return {
|
||||
"counter_failed_default": {
|
||||
"value": "unknown",
|
||||
"title": "DEFAULT SERVER DISABLED",
|
||||
"subtitle": "total",
|
||||
"subtitle_color": "info",
|
||||
"svg_color": "sky",
|
||||
},
|
||||
"counter_failed_method": {"value": "unknown", "title": "DISALLOWED METHODS", "subtitle": "count", "subtitle_color": "info", "svg_color": "lime"},
|
||||
"error": format_exc(),
|
||||
}
|
||||
return ret
|
||||
|
||||
|
||||
def misc(**kwargs):
|
||||
|
|
|
|||
|
|
@ -1,144 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% set read_doc_text = 'You will find more information about the misc plugin <a target="_blank" href="https://docs.bunkerweb.io/' + bw_version + '/settings/#miscellaneous" class="core-card-text-doc-link">in the documentation</a>.' %}
|
||||
|
||||
{% block content %}
|
||||
<input type="csrf_token"
|
||||
name="csrf_token"
|
||||
value="{{ csrf_token }}"
|
||||
class="hidden"
|
||||
hidden />
|
||||
<div class="core-layout">
|
||||
{% if is_used and is_metrics %}
|
||||
<div class="core-card">
|
||||
<h5 class="core-card-title">INFO</h5>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %} <div class="core-layout-separator"></div>
|
||||
<div class="my-2 flex justify-center col-span-12">
|
||||
<div class="mr-1">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %}
|
||||
<div class="core-layout-separator"></div>
|
||||
|
||||
{% for key, value in pre_render.get("data", {}).items() %}
|
||||
|
||||
{% if key.startswith("ping_") %}
|
||||
<div class="core-card-status">
|
||||
<div class="core-card-status-container">
|
||||
<h5 class="core-card-status-title">{{ pre_render['data'][key].get('title', 'STATUS')}}</h5>
|
||||
<svg data-status-svg
|
||||
class="core-card-status-svg {{ 'fill-green-500' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'fill-red-500' }}"
|
||||
viewBox="0 0 100 100"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="50" cy="50" r="50" />
|
||||
</svg>
|
||||
</div>
|
||||
<p data-status-text class="core-card-text">{{ 'Active' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'Inactive' }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if key.startswith("count_") or key.startswith("counter_") %}
|
||||
<div class="core-card-metrics">
|
||||
<!-- text -->
|
||||
<div>
|
||||
<p class="core-card-metrics-name">{{pre_render['data'][key].get("title")}}</p>
|
||||
<h5 data-count class="core-card-title">{{pre_render['data'][key].get("value")}}</h5>
|
||||
<p class="core-card-metrics-subtitle">
|
||||
<span class="core-card-metrics-subtitle-content {{pre_render['data'][key].get("subtitle_color", "info")}}">{{pre_render['data'][key].get("subtitle")}}</span>
|
||||
</p>
|
||||
</div>
|
||||
<!-- end text -->
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container {{pre_render['data'][key].get("svg_color")}}">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-small core-card-metrics-svg"
|
||||
>
|
||||
<path
|
||||
d="M18.75 12.75h1.5a.75.75 0 0 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM12 6a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 6ZM12 18a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 18ZM3.75 6.75h1.5a.75.75 0 1 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM5.25 18.75h-1.5a.75.75 0 0 1 0-1.5h1.5a.75.75 0 0 1 0 1.5ZM3 12a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 3 12ZM9 3.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5ZM12.75 12a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM9 15.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if (key.startswith("top_") and pre_render['data'][key]|length > 0) or (key.startswith("list_") and pre_render['data'][key]|length > 0) %}
|
||||
<div class="core-card-list">
|
||||
<div class="core-card-list-title-container">
|
||||
<h5 class="core-card-list-title">{{ key.replace('_', ' ').upper()}}</h5>
|
||||
</div>
|
||||
<div class="core-card-list-container">
|
||||
<!-- list container-->
|
||||
<div class="core-card-list-wrap">
|
||||
<!-- header-->
|
||||
{% for val_key, val_value in pre_render['data'][key][0].items() %}
|
||||
|
||||
|
||||
<p class="core-card-list-header {{'col-span-6' if pre_render['data'][key][0].keys()|length == 2 else "col-span-4" if pre_render['data'][key][0].keys()|length == 3 else "col-span-3" if pre_render['data'][key][0].keys()|length == 4}}">{{ val_key }}</p>
|
||||
{% endfor%}
|
||||
<!-- end header-->
|
||||
<!-- list -->
|
||||
<ul class="col-span-12 w-full">
|
||||
{% for item in pre_render['data'][key] %}
|
||||
<li class="core-card-list-item">
|
||||
{% for top_key, top_value in item.items() %}
|
||||
<p class="core-card-list-item-content {{'col-span-6' if item.keys()|length == 2 else "col-span-4" if item.keys()|length == 3 else "col-span-3" if item.keys()|length == 4}}">{{ top_value }}</p>
|
||||
{% endfor %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<!-- end list-->
|
||||
</div>
|
||||
<!-- end list container-->
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="core-card">
|
||||
<div class="core-card-wrap">
|
||||
<h5 class="core-card-title">Plugin deactivated</h5>
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="core-card-deactivated-svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p data-info class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,39 +1,45 @@
|
|||
from logging import getLogger
|
||||
from traceback import format_exc
|
||||
|
||||
|
||||
def pre_render(**kwargs):
|
||||
ping = {}
|
||||
data = {}
|
||||
error = ""
|
||||
logger = getLogger("UI")
|
||||
ret = {
|
||||
"ping_status": {
|
||||
"title": "REDIS STATUS",
|
||||
"value": "error",
|
||||
"col-size": "col-12 col-md-6",
|
||||
"card-classes": "h-100",
|
||||
},
|
||||
"counter_redis_nb_keys": {
|
||||
"value": 0,
|
||||
"title": "REDIS KEYS",
|
||||
"subtitle": "Keys number",
|
||||
"subtitle_color": "maroon",
|
||||
"svg_color": "maroon",
|
||||
"col-size": "col-12 col-md-6",
|
||||
"card-classes": "h-100",
|
||||
},
|
||||
}
|
||||
try:
|
||||
ping_data = kwargs["bw_instances_utils"].get_ping("redis")
|
||||
ping = {"ping_status": {"title": "REDIS STATUS", "value": ping_data["status"]}}
|
||||
except BaseException:
|
||||
print(format_exc(), flush=True)
|
||||
error = format_exc()
|
||||
ping = {"ping_status": {"title": "REDIS STATUS", "value": "error"}}
|
||||
ret["ping_status"]["value"] = ping_data["status"]
|
||||
except BaseException as e:
|
||||
logger.debug(format_exc())
|
||||
logger.error(f"Failed to get redis ping: {e}")
|
||||
ret["error"] = str(e)
|
||||
|
||||
if "error" in ret:
|
||||
return ret
|
||||
|
||||
try:
|
||||
metrics = kwargs["bw_instances_utils"].get_metrics("redis")
|
||||
data = {
|
||||
"counter_redis_nb_keys": {
|
||||
"value": metrics.get("redis_nb_keys", 0),
|
||||
"title": "REDIS KEYS",
|
||||
"subtitle": "total number",
|
||||
"subtitle_color": "info",
|
||||
"svg_color": "sky",
|
||||
}
|
||||
}
|
||||
ret["counter_redis_nb_keys"]["value"] = kwargs["bw_instances_utils"].get_metrics("redis").get("counter_redis_nb_keys", 0)
|
||||
except BaseException as e:
|
||||
logger.debug(format_exc())
|
||||
logger.error(f"Failed to get redis metrics: {e}")
|
||||
ret["error"] = str(e)
|
||||
|
||||
except BaseException:
|
||||
print(format_exc(), flush=True)
|
||||
error += format_exc()
|
||||
data = {"counter_redis_nb_keys": {"value": "unknown", "title": "REDIS KEYS", "subtitle": "total number", "subtitle_color": "info", "svg_color": "sky"}}
|
||||
|
||||
if error:
|
||||
return ping | data | {"error": error}
|
||||
|
||||
return ping | data
|
||||
return ret
|
||||
|
||||
|
||||
def redis(**kwargs):
|
||||
|
|
|
|||
|
|
@ -1,144 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% set read_doc_text = 'You will find more information about the redis plugin <a target="_blank" href="https://docs.bunkerweb.io/' + bw_version + '/settings/#redis" class="core-card-text-doc-link">in the documentation</a>.' %}
|
||||
|
||||
{% block content %}
|
||||
<input type="csrf_token"
|
||||
name="csrf_token"
|
||||
value="{{ csrf_token }}"
|
||||
class="hidden"
|
||||
hidden />
|
||||
<div class="core-layout">
|
||||
{% if is_used %}
|
||||
<div class="core-card">
|
||||
<h5 class="core-card-title">INFO</h5>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %} <div class="core-layout-separator"></div>
|
||||
<div class="my-2 flex justify-center col-span-12">
|
||||
<div class="mr-1">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %}
|
||||
|
||||
|
||||
{% for key, value in pre_render.get("data", {}).items() %}
|
||||
|
||||
{% if key.startswith("ping_") %}
|
||||
<div class="core-card-status">
|
||||
<div class="core-card-status-container">
|
||||
<h5 class="core-card-status-title">{{ pre_render['data'][key].get('title', 'STATUS')}}</h5>
|
||||
<svg data-status-svg
|
||||
class="core-card-status-svg {{ 'fill-green-500' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'fill-red-500' }}"
|
||||
viewBox="0 0 100 100"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="50" cy="50" r="50" />
|
||||
</svg>
|
||||
</div>
|
||||
<p data-status-text class="core-card-text">{{ 'Active' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'Inactive' }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if key.startswith("count_") or key.startswith("counter_") %}
|
||||
<div class="core-card-metrics">
|
||||
<!-- text -->
|
||||
<div>
|
||||
<p class="core-card-metrics-name">{{pre_render['data'][key].get("title")}}</p>
|
||||
<h5 data-count class="core-card-title">{{pre_render['data'][key].get("value")}}</h5>
|
||||
<p class="core-card-metrics-subtitle">
|
||||
<span class="core-card-metrics-subtitle-content {{pre_render['data'][key].get("subtitle_color", "info")}}">{{pre_render['data'][key].get("subtitle")}}</span>
|
||||
</p>
|
||||
</div>
|
||||
<!-- end text -->
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container {{pre_render['data'][key].get("svg_color")}}">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-small core-card-metrics-svg"
|
||||
>
|
||||
<path
|
||||
d="M18.75 12.75h1.5a.75.75 0 0 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM12 6a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 6ZM12 18a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 18ZM3.75 6.75h1.5a.75.75 0 1 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM5.25 18.75h-1.5a.75.75 0 0 1 0-1.5h1.5a.75.75 0 0 1 0 1.5ZM3 12a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 3 12ZM9 3.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5ZM12.75 12a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM9 15.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if (key.startswith("top_") and pre_render['data'][key]|length > 0) or (key.startswith("list_") and pre_render['data'][key]|length > 0) %}
|
||||
<div class="core-card-list">
|
||||
<div class="core-card-list-title-container">
|
||||
<h5 class="core-card-list-title">{{ key.replace('_', ' ').upper()}}</h5>
|
||||
</div>
|
||||
<div class="core-card-list-container">
|
||||
<!-- list container-->
|
||||
<div class="core-card-list-wrap">
|
||||
<!-- header-->
|
||||
{% for val_key, val_value in pre_render['data'][key][0].items() %}
|
||||
|
||||
|
||||
<p class="core-card-list-header {{'col-span-6' if pre_render['data'][key][0].keys()|length == 2 else "col-span-4" if pre_render['data'][key][0].keys()|length == 3 else "col-span-3" if pre_render['data'][key][0].keys()|length == 4}}">{{ val_key }}</p>
|
||||
{% endfor%}
|
||||
<!-- end header-->
|
||||
<!-- list -->
|
||||
<ul class="col-span-12 w-full">
|
||||
{% for item in pre_render['data'][key] %}
|
||||
<li class="core-card-list-item">
|
||||
{% for top_key, top_value in item.items() %}
|
||||
<p class="core-card-list-item-content {{'col-span-6' if item.keys()|length == 2 else "col-span-4" if item.keys()|length == 3 else "col-span-3" if item.keys()|length == 4}}">{{ top_value }}</p>
|
||||
{% endfor %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<!-- end list-->
|
||||
</div>
|
||||
<!-- end list container-->
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="core-card">
|
||||
<div class="core-card-wrap">
|
||||
<h5 class="core-card-title">Plugin deactivated</h5>
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="core-card-deactivated-svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p data-info class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,18 +1,40 @@
|
|||
from logging import getLogger
|
||||
from operator import itemgetter
|
||||
from traceback import format_exc
|
||||
|
||||
|
||||
def pre_render(**kwargs):
|
||||
logger = getLogger("UI")
|
||||
ret = {
|
||||
"top_reverse_scan": {
|
||||
"data": {},
|
||||
"order": {
|
||||
"column": 1,
|
||||
"dir": "desc",
|
||||
},
|
||||
"svg_color": "danger",
|
||||
},
|
||||
}
|
||||
try:
|
||||
# Here we will have a list { 'counter_403': X, 'counter_401': Y ... }
|
||||
data = kwargs["bw_instances_utils"].get_metrics("reversescan")
|
||||
# Format to fit [{code: 403, count: X}, {code: 401, count: Y} ...]
|
||||
format_data = [{"port": int(key.split("_")[-1]), "count": value} for key, value in data.items()]
|
||||
format_data = [
|
||||
{
|
||||
"port": int(key.split("_")[-1]),
|
||||
"count": int(value),
|
||||
}
|
||||
for key, value in kwargs["bw_instances_utils"].get_metrics("reversescan").items()
|
||||
]
|
||||
format_data.sort(key=itemgetter("count"), reverse=True)
|
||||
return {"top_reverse_scan": format_data}
|
||||
except BaseException:
|
||||
print(format_exc(), flush=True)
|
||||
return {"top_reverse_scan": [], "error": format_exc()}
|
||||
data = {"port": [], "count": []}
|
||||
for item in format_data:
|
||||
data["port"].append(item["port"])
|
||||
data["count"].append(item["count"])
|
||||
ret["top_reverse_scan"]["data"] = data
|
||||
except BaseException as e:
|
||||
logger.debug(format_exc())
|
||||
logger.error(f"Failed to get reversescan metrics: {e}")
|
||||
ret["error"] = str(e)
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
def reversescan(**kwargs):
|
||||
|
|
|
|||
|
|
@ -1,145 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% set read_doc_text = 'You will find more information about the redis plugin <a target="_blank" href="https://docs.bunkerweb.io/' + bw_version + '/security-tuning/#reverse-scan" class="core-card-text-doc-link">in the documentation</a>.' %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<input type="csrf_token"
|
||||
name="csrf_token"
|
||||
value="{{ csrf_token }}"
|
||||
class="hidden"
|
||||
hidden />
|
||||
<div class="core-layout">
|
||||
{% if is_used and is_metrics %}
|
||||
<div class="core-card">
|
||||
<h5 class="core-card-title">INFO</h5>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %} <div class="core-layout-separator"></div>
|
||||
<div class="my-2 flex justify-center col-span-12">
|
||||
<div class="mr-1">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %}
|
||||
|
||||
|
||||
{% for key, value in pre_render.get("data", {}).items() %}
|
||||
|
||||
{% if key.startswith("ping_") %}
|
||||
<div class="core-card-status">
|
||||
<div class="core-card-status-container">
|
||||
<h5 class="core-card-status-title">{{ pre_render['data'][key].get('title', 'STATUS')}}</h5>
|
||||
<svg data-status-svg
|
||||
class="core-card-status-svg {{ 'fill-green-500' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'fill-red-500' }}"
|
||||
viewBox="0 0 100 100"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="50" cy="50" r="50" />
|
||||
</svg>
|
||||
</div>
|
||||
<p data-status-text class="core-card-text">{{ 'Active' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'Inactive' }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if key.startswith("count_") or key.startswith("counter_") %}
|
||||
<div class="core-card-metrics">
|
||||
<!-- text -->
|
||||
<div>
|
||||
<p class="core-card-metrics-name">{{pre_render['data'][key].get("title")}}</p>
|
||||
<h5 data-count class="core-card-title">{{pre_render['data'][key].get("value")}}</h5>
|
||||
<p class="core-card-metrics-subtitle">
|
||||
<span class="core-card-metrics-subtitle-content {{pre_render['data'][key].get("subtitle_color", "info")}}">{{pre_render['data'][key].get("subtitle")}}</span>
|
||||
</p>
|
||||
</div>
|
||||
<!-- end text -->
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container {{pre_render['data'][key].get("svg_color")}}">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-small core-card-metrics-svg"
|
||||
>
|
||||
<path
|
||||
d="M18.75 12.75h1.5a.75.75 0 0 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM12 6a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 6ZM12 18a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 18ZM3.75 6.75h1.5a.75.75 0 1 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM5.25 18.75h-1.5a.75.75 0 0 1 0-1.5h1.5a.75.75 0 0 1 0 1.5ZM3 12a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 3 12ZM9 3.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5ZM12.75 12a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM9 15.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if (key.startswith("top_") and pre_render['data'][key]|length > 0) or (key.startswith("list_") and pre_render['data'][key]|length > 0) %}
|
||||
<div class="core-card-list">
|
||||
<div class="core-card-list-title-container">
|
||||
<h5 class="core-card-list-title">{{ key.replace('_', ' ').upper()}}</h5>
|
||||
</div>
|
||||
<div class="core-card-list-container">
|
||||
<!-- list container-->
|
||||
<div class="core-card-list-wrap">
|
||||
<!-- header-->
|
||||
{% for val_key, val_value in pre_render['data'][key][0].items() %}
|
||||
|
||||
|
||||
<p class="core-card-list-header {{'col-span-6' if pre_render['data'][key][0].keys()|length == 2 else "col-span-4" if pre_render['data'][key][0].keys()|length == 3 else "col-span-3" if pre_render['data'][key][0].keys()|length == 4}}">{{ val_key }}</p>
|
||||
{% endfor%}
|
||||
<!-- end header-->
|
||||
<!-- list -->
|
||||
<ul class="col-span-12 w-full">
|
||||
{% for item in pre_render['data'][key] %}
|
||||
<li class="core-card-list-item">
|
||||
{% for top_key, top_value in item.items() %}
|
||||
<p class="core-card-list-item-content {{'col-span-6' if item.keys()|length == 2 else "col-span-4" if item.keys()|length == 3 else "col-span-3" if item.keys()|length == 4}}">{{ top_value }}</p>
|
||||
{% endfor %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<!-- end list-->
|
||||
</div>
|
||||
<!-- end list container-->
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="core-card">
|
||||
<div class="core-card-wrap">
|
||||
<h5 class="core-card-title">Plugin deactivated</h5>
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="core-card-deactivated-svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p data-info class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,31 +1,26 @@
|
|||
from logging import getLogger
|
||||
from traceback import format_exc
|
||||
|
||||
|
||||
def pre_render(**kwargs):
|
||||
logger = getLogger("UI")
|
||||
ret = {
|
||||
"counter_passed_whitelist": {
|
||||
"value": 0,
|
||||
"title": "WHITELIST",
|
||||
"subtitle": "Request passed",
|
||||
"subtitle_color": "success",
|
||||
"svg_color": "emerald",
|
||||
},
|
||||
}
|
||||
try:
|
||||
data = kwargs["bw_instances_utils"].get_metrics("whitelist")
|
||||
return {
|
||||
"counter_passed_whitelist": {
|
||||
"value": data.get("counter_passed_whitelist", 0),
|
||||
"title": "WHITELIST",
|
||||
"subtitle": "request passed",
|
||||
"subtitle_color": "success",
|
||||
"svg_color": "green",
|
||||
}
|
||||
}
|
||||
ret["counter_passed_whitelist"]["value"] = kwargs["bw_instances_utils"].get_metrics("whitelist").get("counter_passed_whitelist", 0)
|
||||
except BaseException as e:
|
||||
logger.debug(format_exc())
|
||||
logger.error(f"Failed to get whitelist metrics: {e}")
|
||||
ret["error"] = str(e)
|
||||
|
||||
except BaseException:
|
||||
print(format_exc(), flush=True)
|
||||
return {
|
||||
"counter_passed_whitelist": {
|
||||
"value": "unknown",
|
||||
"title": "WHITELIST",
|
||||
"subtitle": "request passed",
|
||||
"subtitle_color": "success",
|
||||
"svg_color": "green",
|
||||
},
|
||||
"error": format_exc(),
|
||||
}
|
||||
return ret
|
||||
|
||||
|
||||
def whitelist(**kwargs):
|
||||
|
|
|
|||
|
|
@ -1,145 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% set read_doc_text = 'You will find more information about the whitelist plugin <a target="_blank" href="https://docs.bunkerweb.io/' + bw_version + '/security-tuning/#whitelisting" class="core-card-text-doc-link">in the documentation</a>.' %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<input type="csrf_token"
|
||||
name="csrf_token"
|
||||
value="{{ csrf_token }}"
|
||||
class="hidden"
|
||||
hidden />
|
||||
<div class="core-layout">
|
||||
{% if is_used and is_metrics %}
|
||||
<div class="core-card">
|
||||
<h5 class="core-card-title">INFO</h5>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ko" or "error" in pre_render.get("data", {}) or pre_render.get("data") is not mapping %} <div class="core-layout-separator"></div>
|
||||
<div class="my-2 flex justify-center col-span-12">
|
||||
<div class="mr-1">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 stroke-red-500 fill-white">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="px-1 text-white break-words">(Pre rendering error) {{ pre_render.get("data", { "error" : "No log to show" }).get("error", "No log to show") }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if pre_render.get("status", False) and pre_render.get("status", False) == "ok" and pre_render.get("data") is mapping and "error" not in pre_render.get("data", {}) %}
|
||||
|
||||
|
||||
{% for key, value in pre_render.get("data", {}).items() %}
|
||||
|
||||
{% if key.startswith("ping_") %}
|
||||
<div class="core-card-status">
|
||||
<div class="core-card-status-container">
|
||||
<h5 class="core-card-status-title">{{ pre_render['data'][key].get('title', 'STATUS')}}</h5>
|
||||
<svg data-status-svg
|
||||
class="core-card-status-svg {{ 'fill-green-500' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'fill-red-500' }}"
|
||||
viewBox="0 0 100 100"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="50" cy="50" r="50" />
|
||||
</svg>
|
||||
</div>
|
||||
<p data-status-text class="core-card-text">{{ 'Active' if pre_render['data'][key].get('value') in ('up', 'yes', 'success', 'true') else 'Inactive' }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if key.startswith("count_") or key.startswith("counter_") %}
|
||||
<div class="core-card-metrics">
|
||||
<!-- text -->
|
||||
<div>
|
||||
<p class="core-card-metrics-name">{{pre_render['data'][key].get("title")}}</p>
|
||||
<h5 data-count class="core-card-title">{{pre_render['data'][key].get("value")}}</h5>
|
||||
<p class="core-card-metrics-subtitle">
|
||||
<span class="core-card-metrics-subtitle-content {{pre_render['data'][key].get("subtitle_color", "info")}}">{{pre_render['data'][key].get("subtitle")}}</span>
|
||||
</p>
|
||||
</div>
|
||||
<!-- end text -->
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container {{pre_render['data'][key].get("svg_color")}}">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="currentColor"
|
||||
class="size-small core-card-metrics-svg"
|
||||
>
|
||||
<path
|
||||
d="M18.75 12.75h1.5a.75.75 0 0 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM12 6a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 6ZM12 18a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 18ZM3.75 6.75h1.5a.75.75 0 1 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM5.25 18.75h-1.5a.75.75 0 0 1 0-1.5h1.5a.75.75 0 0 1 0 1.5ZM3 12a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 3 12ZM9 3.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5ZM12.75 12a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM9 15.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if (key.startswith("top_") and pre_render['data'][key]|length > 0) or (key.startswith("list_") and pre_render['data'][key]|length > 0) %}
|
||||
<div class="core-card-list">
|
||||
<div class="core-card-list-title-container">
|
||||
<h5 class="core-card-list-title">{{ key.replace('_', ' ').upper()}}</h5>
|
||||
</div>
|
||||
<div class="core-card-list-container">
|
||||
<!-- list container-->
|
||||
<div class="core-card-list-wrap">
|
||||
<!-- header-->
|
||||
{% for val_key, val_value in pre_render['data'][key][0].items() %}
|
||||
|
||||
|
||||
<p class="core-card-list-header {{'col-span-6' if pre_render['data'][key][0].keys()|length == 2 else "col-span-4" if pre_render['data'][key][0].keys()|length == 3 else "col-span-3" if pre_render['data'][key][0].keys()|length == 4}}">{{ val_key }}</p>
|
||||
{% endfor%}
|
||||
<!-- end header-->
|
||||
<!-- list -->
|
||||
<ul class="col-span-12 w-full">
|
||||
{% for item in pre_render['data'][key] %}
|
||||
<li class="core-card-list-item">
|
||||
{% for top_key, top_value in item.items() %}
|
||||
<p class="core-card-list-item-content {{'col-span-6' if item.keys()|length == 2 else "col-span-4" if item.keys()|length == 3 else "col-span-3" if item.keys()|length == 4}}">{{ top_value }}</p>
|
||||
{% endfor %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<!-- end list-->
|
||||
</div>
|
||||
<!-- end list container-->
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="core-card">
|
||||
<div class="core-card-wrap">
|
||||
<h5 class="core-card-title">Plugin deactivated</h5>
|
||||
<!-- icon -->
|
||||
<div role="img" class="core-card-svg-container">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="core-card-deactivated-svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" />
|
||||
</svg>
|
||||
</div>
|
||||
<!-- end icon -->
|
||||
</div>
|
||||
<div class="core-card-text-container">
|
||||
<p data-info class="core-card-text">{{plugin.get('description')}}</p>
|
||||
</div>
|
||||
<p data-info class="core-card-text-doc">{{ read_doc_text|safe }}</p>
|
||||
</div>
|
||||
<!-- end info -->
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -30,11 +30,11 @@ plugins = Blueprint("plugins", __name__)
|
|||
|
||||
ALWAYS_USED_PLUGINS = ("errors", "headers", "misc", "php", "pro", "sessions")
|
||||
PLUGINS_SPECIFICS = {
|
||||
"country": {"BLACKLIST_COUNTRY": "", "WHITELIST_COUNTRY": ""},
|
||||
"customcert": {"USE_CUSTOM_SSL": "no"},
|
||||
"letsencrypt": {"AUTO_LETS_ENCRYPT": "no"},
|
||||
"limit": {"USE_LIMIT_REQ": "no", "USE_LIMIT_CONN": "no"},
|
||||
"selfsigned": {"GENERATE_SELF_SIGNED_SSL": "no"},
|
||||
"COUNTRY": {"BLACKLIST_COUNTRY": "", "WHITELIST_COUNTRY": ""},
|
||||
"CUSTOMCERT": {"USE_CUSTOM_SSL": "no"},
|
||||
"LETSENCRYPT": {"AUTO_LETS_ENCRYPT": "no"},
|
||||
"LIMIT": {"USE_LIMIT_REQ": "no", "USE_LIMIT_CONN": "no"},
|
||||
"SELFSIGNED": {"GENERATE_SELF_SIGNED_SSL": "no"},
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue