changes
This commit is contained in:
commit
5e31dd0214
37 changed files with 2082 additions and 0 deletions
17
templates/404.html
Normal file
17
templates/404.html
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}AS215085 - Router tools | 404{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section id="overview">
|
||||
<h2>404 Not found</h2>
|
||||
<center><img src="../static/img/404.jpg" alt="404 GIF" width="60%">
|
||||
<h3>Ooops! sorry this page was not found</h3>
|
||||
<br>
|
||||
<a href="/" style="text-decoration: none;">
|
||||
<button style="background-color: #07AAF9; color: white; border: none; border-radius: 25px; padding: 15px 30px; font-size: 18px;">
|
||||
Go Home
|
||||
</button>
|
||||
</a></center>
|
||||
</section>
|
||||
{% endblock %}
|
||||
38
templates/arp.html
Normal file
38
templates/arp.html
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}AS215085 - Router tools | ARP table{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<script src="../static/js/pages/arp.js"></script>
|
||||
<section id="arp">
|
||||
<h2>ARP table</h2>
|
||||
<div class="input-group mb-3">
|
||||
<input type="text" id="arpSearch" class="form-control" placeholder="Search in ARP table..." onkeyup="filterTable('arpSearch', 'arpTable')">
|
||||
<button id="refreshButton" class="btn btn-outline-primary" type="button" onclick="refreshArpTable()">
|
||||
<span id="refreshIcon">⟳</span>
|
||||
<span id="refreshSpinner" class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span>
|
||||
Refresh data
|
||||
</button>
|
||||
</div>
|
||||
<table class="striped table table-bordered" id="arpTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sortable" onclick="sortTable('arpTable', 0, this)">Address <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('arpTable', 1, this)">Interface <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('arpTable', 2, this)">Link Layer Address <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('arpTable', 3, this)">State <span class="sort-arrow"></span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="arpTableBody">
|
||||
<tr id="arp-loading-row">
|
||||
<td colspan="4" class="text-center">
|
||||
<div class="spinner-border text-primary" role="status">
|
||||
<span class="visually-hidden">Loading...</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p><a href="/arp/json">JSON version</a></p>
|
||||
</section>
|
||||
{% endblock %}
|
||||
48
templates/base.html
Normal file
48
templates/base.html
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{% block title %}AS215085 - Network tools{% endblock %}</title>
|
||||
<link rel="icon" type="image/png" href="../static/img/favicon.png">
|
||||
<script src="../static/js/bootstrap.bundle.min.js"></script>
|
||||
<link href="../static/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="../static/css/style.css" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<div class="header-content">
|
||||
<a href="/"> <img src="../static/img/as215085-logo.png" alt="AS215085 Logo" style="height: 120px; opacity: 1;!important"> </a>
|
||||
<h2><b>{{ hostname }}</b></h2>
|
||||
<p><b>Proudly delivering the backbone for PixelHosting’s services</b></p>
|
||||
</div>
|
||||
</header>
|
||||
<nav class="navbar navbar-expand-lg navbar-light" style="background-color: #07AAF9;">
|
||||
<div class="container-fluid">
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarNav">
|
||||
<ul class="navbar-nav justify-content-center w-100">
|
||||
<li class="nav-item"><a class="nav-link text-white" href="/">Home</a></li>
|
||||
<li class="nav-item"><a class="nav-link text-white" href="/bgp">BGP summary</a></li>
|
||||
<li class="nav-item"><a class="nav-link text-white" href="/bgp-route">BGP route</a></li>
|
||||
<li class="nav-item"><a class="nav-link text-white" href="/arp">ARP table</a></li>
|
||||
<li class="nav-item"><a class="nav-link text-white" href="/neighbors">Neighbor table</a></li>
|
||||
<li class="nav-item"><a class="nav-link text-white" href="/interfaces">Interfaces table</a></li>
|
||||
<li class="nav-item"><a class="nav-link text-white" href="/stats">Stats</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<main>
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
</main>
|
||||
<footer>
|
||||
<p>© 2020 – <span id="year"></span> AS215085 (PixelHosting). All rights reserved.</p>
|
||||
<script> document.getElementById("year").textContent = new Date().getFullYear(); </script>
|
||||
</footer>
|
||||
<script src="../static/js/materialize.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
22
templates/bgp-route.html
Normal file
22
templates/bgp-route.html
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}AS215085 - Router tools | BGP route lookup{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<script src="../static/js/pages/bgp-route.js"></script>
|
||||
<section id="bgp-route-lookup">
|
||||
<h2>BGP route lookup</h2>
|
||||
<div class="input-group mb-3">
|
||||
<input
|
||||
type="text"
|
||||
id="prefixInput"
|
||||
class="form-control"
|
||||
placeholder="Type the prefix here, for example, 2606:4700:4700::/48 or 1.1.1.0/24"
|
||||
aria-label="Enter a prefix"
|
||||
onkeydown="if(event.key === 'Enter') loadBGPRoute()"
|
||||
/>
|
||||
<button class="btn btn-outline-primary" type="button" onclick="loadBGPRoute()">Lookup</button>
|
||||
</div>
|
||||
<pre id="bgpOutput" aria-label="BGP Route Lookup output">Enter a prefix and click Lookup.</pre>
|
||||
</section>
|
||||
{% endblock %}
|
||||
88
templates/bgp.html
Normal file
88
templates/bgp.html
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}AS215085 - Router tools | BGP table{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<script src="../static/js/pages/bgp.js"></script>
|
||||
<section id="bgp-v4">
|
||||
<h2>IPv4 Unicast Summary</h2>
|
||||
<p id="ipv4Summary">Loading summary...</p>
|
||||
<div class="input-group mb-3">
|
||||
<input type="text" id="ipv4Search" class="form-control" placeholder="Search in IPv4 table..." onkeyup="filterTable('ipv4Search', 'ipv4Table')">
|
||||
<button id="refreshButton" class="btn btn-outline-primary" type="button" onclick="refreshBGPTable()">
|
||||
<span id="refreshIcon">⟳</span>
|
||||
<span id="refreshSpinner" class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span>
|
||||
Refresh data
|
||||
</button>
|
||||
</div>
|
||||
<table class="striped" id="ipv4Table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sortable" onclick="sortTable('ipv4Table', 0, this)">Neighbor <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv4Table', 1, this)">Version <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv4Table', 2, this)">AS Number <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv4Table', 3, this)">Messages Received <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv4Table', 4, this)">Messages Sent <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv4Table', 5, this)">Table Version <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv4Table', 6, this)">Inbound Queue <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv4Table', 7, this)">Outbound Queue <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv4Table', 8, this)">Up/Down <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv4Table', 9, this)">State/PfxRcd <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv4Table', 10, this)">Prefix Sent <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv4Table', 11, this)">Description <span class="sort-arrow"></span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="ipv4TableBody">
|
||||
<tr>
|
||||
<td colspan="12" class="text-center">
|
||||
<div class="spinner-border text-primary" role="status">
|
||||
<span class="visually-hidden">Loading...</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p><a href="/bgp/json">JSON version</a></p>
|
||||
</section>
|
||||
|
||||
<section id="bgp-v6">
|
||||
<h2>IPv6 Unicast Summary</h2>
|
||||
<p id="ipv6Summary">Loading summary...</p>
|
||||
<div class="input-group mb-3">
|
||||
<input type="text" id="ipv6Search" class="form-control" placeholder="Search in IPv6 table..." onkeyup="filterTable('ipv6Search', 'ipv6Table')">
|
||||
<button id="refreshButton" class="btn btn-outline-primary" type="button" onclick="refreshBGPTable()">
|
||||
<span id="refreshIcon2">⟳</span>
|
||||
<span id="refreshSpinner2" class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span>
|
||||
Refresh data
|
||||
</button>
|
||||
</div>
|
||||
<table class="striped" id="ipv6Table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sortable" onclick="sortTable('ipv6Table', 0, this)">Neighbor <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv6Table', 1, this)">Version <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv6Table', 2, this)">AS Number <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv6Table', 3, this)">Messages Received <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv6Table', 4, this)">Messages Sent <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv6Table', 5, this)">Table Version <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv6Table', 6, this)">Inbound Queue <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv6Table', 7, this)">Outbound Queue <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv6Table', 8, this)">Up/Down <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv6Table', 9, this)">State/PfxRcd <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv6Table', 10, this)">Prefix Sent <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('ipv6Table', 11, this)">Description <span class="sort-arrow"></span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="ipv6TableBody">
|
||||
<tr>
|
||||
<td colspan="12" class="text-center">
|
||||
<div class="spinner-border text-primary" role="status">
|
||||
<span class="visually-hidden">Loading...</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p><a href="/bgp/json">JSON version</a></p>
|
||||
</section>
|
||||
{% endblock %}
|
||||
25
templates/index.html
Normal file
25
templates/index.html
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}AS215085 - Router tools | Home{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section id="overview">
|
||||
<h2>Welcome</h2>
|
||||
<p>Welcome to the <b>AS215085 Network tools</b></p>
|
||||
<p>On this tool you cn get in depth insight into our network</p>
|
||||
<p>In case of emergency you can contact us at: noc AT pixelhosting DOT nl</p>
|
||||
<p>PeeringDB: <a href="https://www.peeringdb.com/net/35968" target="_blank" style="color: #07AAF9;">https://www.peeringdb.com/net/35968</a></p>
|
||||
<p>BGPTools: <a href="https://bgp.tools/as/215085" target="_blank" style="color: #07AAF9;">https://bgp.tools/as/215085</a></p>
|
||||
<p>Lookingglas: <a href="https://lookingglass.as215085.net" target="_blank" style="color: #07AAF9;">https://lookingglass.as215085.net</a></p>
|
||||
<p>Geofeed: <a href="https://as215085.net/geofeed.csv" target="_blank" style="color: #07AAF9;">https://as215085.net/geofeed.csv</a></p>
|
||||
</section>
|
||||
<section id="status">
|
||||
<h2>Status</h2>
|
||||
<p>Here you can find the network status of <b>AS215085</b>: <a href="https://status.as215085.net" target="_blank" style="color: #07AAF9;">https://status.as215085.net</a></p>
|
||||
<p>Here you can find the service status of <b>PixelHosting</b>: <a href="https://status.pixelhosting.nl/" target="_blank" style="color: #07AAF9;">https://status.pixelhosting.nl</a></p>
|
||||
</section>
|
||||
<section id="bgptools-map">
|
||||
<h2>BGP.Tools network map</h2>
|
||||
<img id="pathimg" usemap="#world" src="{{ bgp_image }}">
|
||||
</section>
|
||||
{% endblock %}
|
||||
42
templates/interfaces.html
Normal file
42
templates/interfaces.html
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}AS215085 - Router tools | Interfaces{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<script src="../static/js/pages/interfaces.js"></script>
|
||||
<section id="interfaces">
|
||||
<h2>Interfaces</h2>
|
||||
<div class="input-group mb-3">
|
||||
<input type="text" id="interfaceSearch" class="form-control" placeholder="Search in Interface table..." onkeyup="filterTable('interfaceSearch', 'interfaceTable')">
|
||||
<button id="refreshButton" class="btn btn-outline-primary" type="button" onclick="refreshTable()">
|
||||
<span id="refreshIcon">⟳</span>
|
||||
<span id="refreshSpinner" class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span>
|
||||
Refresh data
|
||||
</button>
|
||||
</div>
|
||||
<p></p> <p>Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down</p>
|
||||
<table class="striped table table-bordered" id="interfaceTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sortable" onclick="sortTable('interfaceTable', 0, this)">Interface <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('interfaceTable', 1, this)">IP Address <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('interfaceTable', 2, this)">MAC Address <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('interfaceTable', 3, this)">VRF <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('interfaceTable', 4, this)">MTU <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('interfaceTable', 5, this)">Status <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('interfaceTable', 6, this)">Description <span class="sort-arrow"></span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="interfaceTableBody">
|
||||
<tr id="interface-loading-row">
|
||||
<td colspan="7" class="text-center">
|
||||
<div class="spinner-border text-primary" role="status">
|
||||
<span class="visually-hidden">Loading...</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p><a href="/interfaces/json">JSON version</a></p>
|
||||
</section>
|
||||
{% endblock %}
|
||||
38
templates/neighbors.html
Normal file
38
templates/neighbors.html
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}AS215085 - Router tools | Neighbor table{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<script src="../static/js/pages/neighbors.js"></script>
|
||||
<section id="neighbor">
|
||||
<h2>Neighbor table</h2>
|
||||
<div class="input-group mb-3">
|
||||
<input type="text" id="neighborsSearch" class="form-control" placeholder="Search in Neighbors table..." onkeyup="filterTable('neighborsSearch', 'neighborsTable')">
|
||||
<button id="refreshButton" class="btn btn-outline-primary" type="button" onclick="refreshNeighborsTable()">
|
||||
<span id="refreshIcon">⟳</span>
|
||||
<span id="refreshSpinner" class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span>
|
||||
Refresh data
|
||||
</button>
|
||||
</div>
|
||||
<table class="striped table table-bordered" id="neighborsTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sortable" onclick="sortTable('neighborsTable', 0, this)">Address <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('neighborsTable', 1, this)">Interface <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('neighborsTable', 2, this)">Link Layer Address <span class="sort-arrow"></span></th>
|
||||
<th class="sortable" onclick="sortTable('neighborsTable', 3, this)">State <span class="sort-arrow"></span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="neighborsTableBody">
|
||||
<tr id="arp-loading-row">
|
||||
<td colspan="4" class="text-center">
|
||||
<div class="spinner-border text-primary" role="status">
|
||||
<span class="visually-hidden">Loading...</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p><a href="/neighbors/json">JSON version</a></p>
|
||||
</section>
|
||||
{% endblock %}
|
||||
25
templates/port.html
Normal file
25
templates/port.html
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}AS215085 - Router tools | Port{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section id="overview">
|
||||
<center>
|
||||
{% if error %}
|
||||
<div class="graph-container">
|
||||
<h2 style="color: red;"><strong>Error:</strong> Interface <strong>{{ interface_name }}</strong> not found.</h2>
|
||||
</div>
|
||||
{% else %}
|
||||
<p><b>Stats for port: {{ interface_name }}</b></p>
|
||||
<div class="graph-container">
|
||||
<p>24H</p>
|
||||
<img src="data:image/svg+xml;base64,{{ daily }}" alt="Day">
|
||||
<p>Week</p>
|
||||
<img src="data:image/svg+xml;base64,{{ weekly }}" alt="Week">
|
||||
<p>Month</p>
|
||||
<img src="data:image/svg+xml;base64,{{ monthly }}" alt="Month">
|
||||
</div>
|
||||
{% endif %}
|
||||
</center>
|
||||
</section>
|
||||
{% endblock %}
|
||||
62
templates/stats.html
Normal file
62
templates/stats.html
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}AS215085 - Router tools | Akvorado{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<script src="../static/js/chart.js"></script>
|
||||
<script src="../static/js/pages/akvorado.js"></script>
|
||||
<script src="../static/js/chartjs-adapter-date-fns"></script>
|
||||
<section id="pie-charts">
|
||||
<div class="stats-overview-container">
|
||||
<h2>Overview</h2>
|
||||
<div id="stats-container" style="text-align: right;">
|
||||
<p><span id="flowRate">Loading...</span> Flows/s</p>
|
||||
<p><span id="exporterCount">Loading...</span> Exporters</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="achart-container">
|
||||
<div class="achart-wrapper" id="src-as-chart">
|
||||
<h5>Top source AS</h5>
|
||||
<canvas id="pieChart1"></canvas>
|
||||
<div id="legend1" class="alegend"></div>
|
||||
</div>
|
||||
<div class="achart-wrapper" id="source-ports-chart">
|
||||
<h5>Top source ports</h5>
|
||||
<canvas id="pieChart2"></canvas>
|
||||
<div id="legend2" class="alegend"></div>
|
||||
</div>
|
||||
<div class="achart-wrapper" id="protocols-chart">
|
||||
<h5>Top protocols</h5>
|
||||
<canvas id="pieChart3"></canvas>
|
||||
<div id="legend3" class="alegend"></div>
|
||||
</div>
|
||||
<div class="achart-wrapper" id="source-countries-chart">
|
||||
<h5>Top source countries</h5>
|
||||
<canvas id="pieChart4"></canvas>
|
||||
<div id="legend4" class="alegend"></div>
|
||||
</div>
|
||||
<div class="achart-wrapper" id="source-etype-chart">
|
||||
<h5>IPv4/IPv6</h5>
|
||||
<canvas id="pieChart5"></canvas>
|
||||
<div id="legend5" class="alegend"></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section id="graph">
|
||||
<h2>Flow graph</h2>
|
||||
<div class="achart-wrapper-chart">
|
||||
<canvas id="liveChart"></canvas>
|
||||
</div>
|
||||
</section>
|
||||
<section id="graph-librenms">
|
||||
<h2>Interface graph</h2>
|
||||
<div>
|
||||
<center><p><b>24H LAN interface {{ interface_name }}</b></p>
|
||||
{% if error %}
|
||||
<h2 style="color: red;"><strong>Error:</strong> Interface <strong>{{ interface_name }}</strong> not found.</h2></center>
|
||||
{% else %}
|
||||
<img src="data:image/svg+xml;base64,{{ daily }}" alt="Day"></center>
|
||||
{% endif %}
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
||||
Loading…
Add table
Add a link
Reference in a new issue