Add root index generation

This commit is contained in:
Jordan Wages 2025-07-18 02:46:26 -05:00
commit 21762bf1bd
3 changed files with 94 additions and 0 deletions

View file

@ -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

View file

@ -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
View 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>