mirror of
https://framagit.org/framasoft/framaspace/argos.git
synced 2025-04-28 18:02:41 +02:00
Make it possible to specify the frequency with '1d'
This commit is contained in:
parent
ca6584c803
commit
daa22708c4
5 changed files with 134 additions and 14 deletions
|
@ -16,7 +16,8 @@ Features :
|
||||||
- [x] Change the naming and use service/agent.
|
- [x] Change the naming and use service/agent.
|
||||||
- [x] Packaging (and `argos agent` / `argos service` commands)
|
- [x] Packaging (and `argos agent` / `argos service` commands)
|
||||||
- [x] Endpoints are protected by an authentication token
|
- [x] Endpoints are protected by an authentication token
|
||||||
- [ ] Find a way to define when the task should be checked again (via config ? stored on the tasks themselves ?)
|
- [ ] Task frequency can be defined in the configuration
|
||||||
|
- [ ] Add a command to generate new authentication tokens
|
||||||
- [ ] Local task for database cleanup (to run periodically)
|
- [ ] Local task for database cleanup (to run periodically)
|
||||||
- [ ] Handles multiple alerting backends (email, sms, gotify) ;
|
- [ ] Handles multiple alerting backends (email, sms, gotify) ;
|
||||||
- [ ] Exposes a simple read-only website.
|
- [ ] Exposes a simple read-only website.
|
||||||
|
|
|
@ -7,6 +7,8 @@ import yaml
|
||||||
from pydantic import BaseModel, Field, HttpUrl, validator
|
from pydantic import BaseModel, Field, HttpUrl, validator
|
||||||
from yamlinclude import YamlIncludeConstructor
|
from yamlinclude import YamlIncludeConstructor
|
||||||
|
|
||||||
|
from argos.schemas.utils import string_to_duration
|
||||||
|
|
||||||
# XXX Find a way to check without having cirular imports
|
# XXX Find a way to check without having cirular imports
|
||||||
|
|
||||||
# This file contains the pydantic schemas. For the database models, check in argos.model.
|
# This file contains the pydantic schemas. For the database models, check in argos.model.
|
||||||
|
@ -21,17 +23,9 @@ class SSL(BaseModel):
|
||||||
@validator("thresholds", each_item=True, pre=True)
|
@validator("thresholds", each_item=True, pre=True)
|
||||||
def parse_threshold(cls, value):
|
def parse_threshold(cls, value):
|
||||||
for duration_str, severity in value.items():
|
for duration_str, severity in value.items():
|
||||||
num = int("".join(filter(str.isdigit, duration_str)))
|
days = string_to_duration(duration_str, "days")
|
||||||
if "d" in duration_str:
|
|
||||||
num = num
|
|
||||||
elif "w" in duration_str:
|
|
||||||
num = num * 7
|
|
||||||
elif "m" in duration_str:
|
|
||||||
num = num * 30
|
|
||||||
else:
|
|
||||||
raise ValueError("Invalid duration value")
|
|
||||||
# Return here because it's one-item dicts.
|
# Return here because it's one-item dicts.
|
||||||
return (num, severity)
|
return (days, severity)
|
||||||
|
|
||||||
|
|
||||||
class WebsiteCheck(BaseModel):
|
class WebsiteCheck(BaseModel):
|
||||||
|
@ -63,8 +57,7 @@ class WebsitePath(BaseModel):
|
||||||
|
|
||||||
@validator("checks", each_item=True, pre=True)
|
@validator("checks", each_item=True, pre=True)
|
||||||
def parse_checks(cls, value):
|
def parse_checks(cls, value):
|
||||||
from argos.checks import \
|
from argos.checks import get_registered_checks # To avoid circular imports
|
||||||
get_registered_checks # To avoid circular imports
|
|
||||||
|
|
||||||
available_names = get_registered_checks().keys()
|
available_names = get_registered_checks().keys()
|
||||||
|
|
||||||
|
@ -95,6 +88,10 @@ class General(BaseModel):
|
||||||
frequency: str
|
frequency: str
|
||||||
alerts: Alert
|
alerts: Alert
|
||||||
|
|
||||||
|
@validator("frequency", pre=True)
|
||||||
|
def parse_frequency(cls, value):
|
||||||
|
return string_to_duration(value, "hours")
|
||||||
|
|
||||||
|
|
||||||
class Config(BaseModel):
|
class Config(BaseModel):
|
||||||
general: General
|
general: General
|
||||||
|
|
30
argos/schemas/utils.py
Normal file
30
argos/schemas/utils.py
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
from typing import Literal
|
||||||
|
|
||||||
|
|
||||||
|
def string_to_duration(value: str, target: Literal["days", "hours"]):
|
||||||
|
"""Convert a string to a number of hours, or days"""
|
||||||
|
num = int("".join(filter(str.isdigit, value)))
|
||||||
|
|
||||||
|
if target == "hours":
|
||||||
|
reconvert = True
|
||||||
|
|
||||||
|
if "h" in value:
|
||||||
|
if target == "days":
|
||||||
|
raise ValueError("Invalid duration value", value)
|
||||||
|
num = num
|
||||||
|
reconvert = False
|
||||||
|
elif "d" in value:
|
||||||
|
num = num
|
||||||
|
elif "w" in value:
|
||||||
|
num = num * 7
|
||||||
|
elif "m" in value:
|
||||||
|
num = num * 30
|
||||||
|
elif "y" in value:
|
||||||
|
num = num * 365
|
||||||
|
else:
|
||||||
|
raise ValueError("Invalid duration value", value)
|
||||||
|
|
||||||
|
if target == "hours" and reconvert:
|
||||||
|
num = num * 24
|
||||||
|
|
||||||
|
return num
|
73
config.yaml
73
config.yaml
|
@ -19,4 +19,75 @@ ssl:
|
||||||
- "1d": critical
|
- "1d": critical
|
||||||
"5d": warning
|
"5d": warning
|
||||||
|
|
||||||
websites: !include websites.yaml
|
# It's also possible to define the checks in another file
|
||||||
|
# with the include syntax:
|
||||||
|
#
|
||||||
|
# websites: !include websites.yaml
|
||||||
|
#
|
||||||
|
websites:
|
||||||
|
- domain: "https://mypads.framapad.org"
|
||||||
|
paths:
|
||||||
|
- path: "/mypads/"
|
||||||
|
checks:
|
||||||
|
- status-is: 200
|
||||||
|
- body-contains: '<div id= "mypads"></div>'
|
||||||
|
- ssl-certificate-expiration: "on-check"
|
||||||
|
- path: "/admin/"
|
||||||
|
checks:
|
||||||
|
- status-is: 401
|
||||||
|
- domain: "https://munin.framasoft.org"
|
||||||
|
paths:
|
||||||
|
- path: "/"
|
||||||
|
checks:
|
||||||
|
- status-is: 301
|
||||||
|
- path: "/munin/"
|
||||||
|
checks:
|
||||||
|
- status-is: 401
|
||||||
|
- domain: "https://framagenda.org"
|
||||||
|
paths:
|
||||||
|
- path: "/status.php"
|
||||||
|
checks:
|
||||||
|
- status-is: 200
|
||||||
|
# Là, idéalement, il faudrait un json-contains,
|
||||||
|
# qui serait une table de hachage
|
||||||
|
- body-contains: '"maintenance":false'
|
||||||
|
- ssl-certificate-expiration: "on-check"
|
||||||
|
- path: "/"
|
||||||
|
checks:
|
||||||
|
- status-is: 302
|
||||||
|
- path: "/login"
|
||||||
|
checks:
|
||||||
|
- status-is: 200
|
||||||
|
- domain: "https://framadrive.org"
|
||||||
|
paths:
|
||||||
|
- path: "/status.php"
|
||||||
|
checks:
|
||||||
|
- status-is: 200
|
||||||
|
- body-contains: '"maintenance":false'
|
||||||
|
- ssl-certificate-expiration: "on-check"
|
||||||
|
- path: "/"
|
||||||
|
checks:
|
||||||
|
- status-is: 302
|
||||||
|
- path: "/login"
|
||||||
|
checks:
|
||||||
|
- status-is: 200
|
||||||
|
- domain: "https://cloud.framabook.org"
|
||||||
|
paths:
|
||||||
|
- path: "/status.php"
|
||||||
|
checks:
|
||||||
|
- status-is: 200
|
||||||
|
- body-contains: '"maintenance":false'
|
||||||
|
- ssl-certificate-expiration: "on-check"
|
||||||
|
- path: "/"
|
||||||
|
checks:
|
||||||
|
- status-is: 302
|
||||||
|
- path: "/login"
|
||||||
|
checks:
|
||||||
|
- status-is: 200
|
||||||
|
- domain: "https://framasoft.org"
|
||||||
|
paths:
|
||||||
|
- path: "/"
|
||||||
|
checks:
|
||||||
|
- status-is: 200
|
||||||
|
- ssl-certificate-expiration: "on-check"
|
||||||
|
|
||||||
|
|
21
tests/test_schemas_utils.py
Normal file
21
tests/test_schemas_utils.py
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from argos.schemas.utils import string_to_duration
|
||||||
|
|
||||||
|
|
||||||
|
def test_string_to_duration_days():
|
||||||
|
assert string_to_duration("1d", target="days") == 1
|
||||||
|
assert string_to_duration("1w", target="days") == 7
|
||||||
|
assert string_to_duration("3w", target="days") == 21
|
||||||
|
assert string_to_duration("3m", target="days") == 90
|
||||||
|
assert string_to_duration("1y", target="days") == 365
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
string_to_duration("3h", target="days")
|
||||||
|
|
||||||
|
|
||||||
|
def test_string_to_duration_hours():
|
||||||
|
assert string_to_duration("1h", target="hours") == 1
|
||||||
|
assert string_to_duration("1d", target="hours") == 24
|
||||||
|
assert string_to_duration("1w", target="hours") == 7 * 24
|
||||||
|
assert string_to_duration("3w", target="hours") == 21 * 24
|
||||||
|
assert string_to_duration("3m", target="hours") == 3 * 30 * 24
|
Loading…
Reference in a new issue