Add root index generation
This commit is contained in:
parent
02f6b400ac
commit
21762bf1bd
3 changed files with 94 additions and 0 deletions
|
@ -32,6 +32,9 @@ python scripts/generate_reports.py daily --all-domains
|
||||||
python scripts/generate_reports.py weekly --all-domains
|
python scripts/generate_reports.py weekly --all-domains
|
||||||
python scripts/generate_reports.py monthly --all-domains
|
python scripts/generate_reports.py monthly --all-domains
|
||||||
|
|
||||||
|
# Generate root index
|
||||||
|
python scripts/generate_reports.py index
|
||||||
|
|
||||||
# Deactivate to keep cron environment clean
|
# Deactivate to keep cron environment clean
|
||||||
if type deactivate >/dev/null 2>&1; then
|
if type deactivate >/dev/null 2>&1; then
|
||||||
deactivate
|
deactivate
|
||||||
|
|
|
@ -128,6 +128,26 @@ def _generate_all_domains(interval: str) -> None:
|
||||||
_generate_interval(interval, domain)
|
_generate_interval(interval, domain)
|
||||||
|
|
||||||
|
|
||||||
|
def _generate_root_index() -> None:
|
||||||
|
"""Render the top-level index listing all intervals and domains."""
|
||||||
|
intervals = [p.name for p in OUTPUT_DIR.iterdir() if p.is_dir() and p.name != "domains"]
|
||||||
|
intervals.sort()
|
||||||
|
|
||||||
|
domains_dir = OUTPUT_DIR / "domains"
|
||||||
|
domains: List[str] = []
|
||||||
|
if domains_dir.is_dir():
|
||||||
|
domains = [p.name for p in domains_dir.iterdir() if p.is_dir()]
|
||||||
|
domains.sort()
|
||||||
|
|
||||||
|
env = Environment(loader=FileSystemLoader(TEMPLATE_DIR))
|
||||||
|
template = env.get_template("index.html")
|
||||||
|
|
||||||
|
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
|
out_path = OUTPUT_DIR / "index.html"
|
||||||
|
out_path.write_text(template.render(intervals=intervals, domains=domains))
|
||||||
|
typer.echo(f"Generated root index at {out_path}")
|
||||||
|
|
||||||
|
|
||||||
@app.command()
|
@app.command()
|
||||||
def hourly(
|
def hourly(
|
||||||
domain: Optional[str] = typer.Option(
|
domain: Optional[str] = typer.Option(
|
||||||
|
@ -192,5 +212,11 @@ def monthly(
|
||||||
_generate_interval("monthly", domain)
|
_generate_interval("monthly", domain)
|
||||||
|
|
||||||
|
|
||||||
|
@app.command()
|
||||||
|
def index() -> None:
|
||||||
|
"""Generate the root index page linking all reports."""
|
||||||
|
_generate_root_index()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
app()
|
app()
|
||||||
|
|
65
templates/index.html
Normal file
65
templates/index.html
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>ngxstat Reports</title>
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
|
||||||
|
</head>
|
||||||
|
<body class="section">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title">ngxstat Reports</h1>
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column is-one-quarter">
|
||||||
|
<aside class="menu">
|
||||||
|
<p class="menu-label">Intervals</p>
|
||||||
|
<ul class="menu-list" id="interval-list">
|
||||||
|
{% for interval in intervals %}
|
||||||
|
<li><a href="#" data-interval="{{ interval }}"><span class="icon"><i data-feather="clock"></i></span>{{ interval.title() }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
<p class="menu-label">Domains</p>
|
||||||
|
<ul class="menu-list" id="domain-list">
|
||||||
|
<li><a href="#" data-domain=""><span class="icon"><i data-feather="globe"></i></span>All Domains</a></li>
|
||||||
|
{% for domain in domains %}
|
||||||
|
<li><a href="#" data-domain="{{ domain }}"><span class="icon"><i data-feather="server"></i></span>{{ domain }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
<div class="column">
|
||||||
|
<iframe id="report-frame" src="" style="width:100%;height:80vh;border:none;"></iframe>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
||||||
|
<script>
|
||||||
|
const intervalLinks = document.querySelectorAll('#interval-list a');
|
||||||
|
const domainLinks = document.querySelectorAll('#domain-list a');
|
||||||
|
let currentInterval = intervalLinks.length ? intervalLinks[0].dataset.interval : '';
|
||||||
|
let currentDomain = '';
|
||||||
|
function updateFrame() {
|
||||||
|
let path = currentInterval;
|
||||||
|
if (currentDomain) {
|
||||||
|
path = 'domains/' + currentDomain + '/' + currentInterval;
|
||||||
|
}
|
||||||
|
document.getElementById('report-frame').src = path + '/index.html';
|
||||||
|
}
|
||||||
|
intervalLinks.forEach(a => {
|
||||||
|
a.addEventListener('click', e => {
|
||||||
|
e.preventDefault();
|
||||||
|
currentInterval = a.dataset.interval;
|
||||||
|
updateFrame();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
domainLinks.forEach(a => {
|
||||||
|
a.addEventListener('click', e => {
|
||||||
|
e.preventDefault();
|
||||||
|
currentDomain = a.dataset.domain;
|
||||||
|
updateFrame();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
updateFrame();
|
||||||
|
feather.replace();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Add table
Add a link
Reference in a new issue