diff --git a/README.md b/README.md index 2df9b98..23b8dca 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Internally, a HTTP API is exposed, and a job queue is used to distribute the che ## Todo: - [ ] Do not return empty list on / when no results from agents. -- [ ] donner un aperçu rapide de l’état de la supervision. +- [X] donner un aperçu rapide de l’état de la supervision. - [ ] Allow passing a dict to check - [ ] Rename error in unexpected error - [ ] Use background tasks for alerting @@ -29,4 +29,4 @@ Internally, a HTTP API is exposed, and a job queue is used to distribute the che - [ ] Un flag de configuration permet d’ajouter automatiquement un job de vérification de redirection 301 de la version HTTP vers HTTPS - [ ] add an "unknown" severity for check errors - [ ] Add a way to specify the severity of the alerts in the config -- [ ] Add a command to generate new authentication token \ No newline at end of file +- [ ] Add a command to generate new authentication token diff --git a/argos/server/queries.py b/argos/server/queries.py index b6cc453..eb42b4f 100644 --- a/argos/server/queries.py +++ b/argos/server/queries.py @@ -105,7 +105,7 @@ async def update_from_config(db: Session, config: schemas.Config): db.commit() -async def get_severity_counts(db: Session): +async def get_severity_counts(db: Session) -> dict: # Get the last result of each task subquery = ( db.query(Result.task_id, func.max(Result.id).label("max_result_id")) @@ -122,6 +122,10 @@ async def get_severity_counts(db: Session): # Execute the query and fetch the results task_counts_by_severity = query.all() + + counts_dict = dict(task_counts_by_severity) + for key in ("ok", "warning", "critical"): + counts_dict.setdefault(key, 0) return task_counts_by_severity diff --git a/argos/server/routes/api.py b/argos/server/routes/api.py index 1410c00..18e7b9b 100644 --- a/argos/server/routes/api.py +++ b/argos/server/routes/api.py @@ -73,8 +73,4 @@ async def get_stats(db: Session = Depends(get_db)): @route.get("/severities") async def get_severity_counts(db: Session = Depends(get_db)): """Returns the number of results per severity""" - counts = await queries.get_severity_counts(db) - counts_dict = dict(counts) - for key in ("ok", "warning", "critical"): - counts_dict.setdefault(key, 0) - return counts_dict + return await queries.get_severity_counts(db) diff --git a/argos/server/routes/views.py b/argos/server/routes/views.py index cc1cc5e..174f0c6 100644 --- a/argos/server/routes/views.py +++ b/argos/server/routes/views.py @@ -7,6 +7,7 @@ from sqlalchemy import desc from sqlalchemy.orm import Session, aliased from argos.schemas import Config +from argos.server import queries from argos.server.models import Result, Task from argos.server.routes.dependencies import get_config, get_db @@ -16,6 +17,23 @@ templates = Jinja2Templates(directory="argos/server/templates") @route.get("/") +async def get_severity_counts(request: Request, db: Session = Depends(get_db)): + """Returns the number of results per severity""" + counts_dict = await queries.get_severity_counts(db) + + agents = db.query(Result.agent_id).distinct().all() + + return templates.TemplateResponse( + "index.html", + { + "request": request, + "counts_dict": counts_dict, + "agents": agents, + }, + ) + + +@route.get("/details") async def read_tasks(request: Request, db: Session = Depends(get_db)): tasks = db.query(Task).order_by(Task.domain).all() @@ -46,7 +64,7 @@ async def read_tasks(request: Request, db: Session = Depends(get_db)): agents = db.query(Result.agent_id).distinct().all() return templates.TemplateResponse( - "index.html", + "details.html", { "request": request, "domains": domains, diff --git a/argos/server/static/styles.css b/argos/server/static/styles.css index 5ca62cb..f1d80a8 100644 --- a/argos/server/static/styles.css +++ b/argos/server/static/styles.css @@ -2,4 +2,16 @@ code { white-space: pre-wrap; -} \ No newline at end of file +} + +.grid-index { + font-size: 2rem; +} +.text-center, +.grid-index { + text-align: center; +} +.grid-index article { + margin-top: 0; + margin-bottom: 1rem; +} diff --git a/argos/server/templates/agents.html b/argos/server/templates/agents.html index 9cd6b1a..aa5d58f 100644 --- a/argos/server/templates/agents.html +++ b/argos/server/templates/agents.html @@ -9,13 +9,12 @@ - - {% for result in last_seen %} - - {{ result.agent_id }} - {{ result.submitted_at }} - - {% endfor %} + {% for result in last_seen %} + + {{ result.agent_id }} + {{ result.submitted_at }} + + {% endfor %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/argos/server/templates/base.html b/argos/server/templates/base.html index 14e48be..d8dc26b 100644 --- a/argos/server/templates/base.html +++ b/argos/server/templates/base.html @@ -1,20 +1,23 @@ - - - Argos - - - -
- - -
- {% block content %} - {% endblock %} -
-
- - \ No newline at end of file + + + Argos + + + + + +
+ +
+ {% block content %} + {% endblock %} +
+
+ + diff --git a/argos/server/templates/details.html b/argos/server/templates/details.html new file mode 100644 index 0000000..7994606 --- /dev/null +++ b/argos/server/templates/details.html @@ -0,0 +1,33 @@ +{% extends "base.html" %} +{% block content %} +
+

+ {{ domains | length}} domains, + {{ total_task_count }} tasks, + {{ agents | length }} agent{% if agents | length > 1 %}s{% endif %} +

+ + + + + + + + + + + {% for (domain, status) in domains %} + + + + + + {% endfor %} + +
DomainCurrent statusLast check
+ {{ domain }} + + {% if status == "ok" %}✅ OK {% elif statuts == "warning"%}⚠ Warning{% elif status == "critical"%}❌ Critical{% elif status == "to-process" %}⏱︎ Waiting for the jobs{% endif %} + {{ last_checks.get(domain) }}
+
+{% endblock %} diff --git a/argos/server/templates/domain.html b/argos/server/templates/domain.html index 5d1d4b0..36b669d 100644 --- a/argos/server/templates/domain.html +++ b/argos/server/templates/domain.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% block title %}

{{domain}}

{% endblock %} +{% block title %}

{{ domain }}

{% endblock %} {% block content %}
@@ -19,12 +19,13 @@ - + {% endfor %} - -
{{ task.url }} {{ task.check }} {{ task.expected }}{% if task.status == "success" %}✅ Success {% elif task.status == "error"%}⚠ Error{% elif task.status == "failure"%}❌ Failure{% endif %} + {% if task.status == "success" %}✅ Success {% elif task.status == "error"%}⚠ Error{% elif task.status == "failure"%}❌ Failure{% endif %} + view all
+
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/argos/server/templates/index.html b/argos/server/templates/index.html index 64a2d36..9d347ef 100644 --- a/argos/server/templates/index.html +++ b/argos/server/templates/index.html @@ -2,34 +2,27 @@ {% block content %}

- {{domains | length}} domains, - {{ total_task_count }} tasks, - {{ agents |length }} agent{% if agents|length > 1 %}s{% endif %} + {{ agents | length }} agent{% if agents| length > 1 %}s{% endif %} +

+
+
+
+
✅ OK
+ {{ counts_dict['ok'] }} +
+
+
⚠️ Warning
+ {{ counts_dict['warning'] }} +
+
+
❌ Critical
+ {{ counts_dict['critical'] }} +
+
+

+ Details

- - - - - - - - - - - {% for (domain, status) in domains %} - - - - - - - {% endfor %} - - -
DomainCurrent statusLast check
- - {{ domain }} - {% if status == "ok" %}✅ OK {% elif statuts == "warning"%}⚠ Warning{% elif status == "critical"%}❌ Critical{% elif status == "to-process" %}⏱︎ Waiting for the jobs{% endif %}{{ last_checks.get(domain) }}
+
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/argos/server/templates/result.html b/argos/server/templates/result.html index a6b3eb6..3154eaa 100644 --- a/argos/server/templates/result.html +++ b/argos/server/templates/result.html @@ -1,17 +1,16 @@ {% extends "base.html" %} -{% block title %}

{{result}}

{% endblock %} +{% block title %}

{{ result }}

{% endblock %} {% block content %}
Task
-
{{result.task}}
+
{{ result.task }}
Submitted at
-
{{result.submitted_at}}
+
{{ result.submitted_at }}
Status
-
{{result.status}}
+
{{ result.status }}
Severity
-
{{result.severity}}
+
{{ result.severity }}
Context
-
{{result.context}}
+
{{ result.context }}
- -{% endblock %} \ No newline at end of file +{% endblock %}