first commit
This commit is contained in:
parent
64ecbd1f19
commit
c9ad686bd1
96
cachetupdater.py
Normal file
96
cachetupdater.py
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
#!/usr/lib/python3
|
||||||
|
from configparser import ConfigParser
|
||||||
|
import requests
|
||||||
|
|
||||||
|
COMPONENT_PATH = "%(cachet_url)s/api/v1/components/%(component_id)s"
|
||||||
|
|
||||||
|
|
||||||
|
def checker(config, section):
|
||||||
|
"""Main entry point to check and update a target status
|
||||||
|
|
||||||
|
:param dict config: a dict like object with whole configuration
|
||||||
|
:param str section: the section to check
|
||||||
|
"""
|
||||||
|
config_section = config[section]
|
||||||
|
result = http_checker(config_section)
|
||||||
|
update(config, section, result)
|
||||||
|
|
||||||
|
|
||||||
|
def http_checker(conf):
|
||||||
|
"""Check an http/https endpoint
|
||||||
|
|
||||||
|
:param dict conf: a dict like object with the target configuration
|
||||||
|
:rtype: boolean
|
||||||
|
:returns: True if the target was reachable witin timeout and the status
|
||||||
|
code was 200 or 204
|
||||||
|
"""
|
||||||
|
url = conf["url"]
|
||||||
|
timeout = conf.get('timeout', 2)
|
||||||
|
try:
|
||||||
|
result = requests.get(url, timeout=timeout)
|
||||||
|
except requests.exceptions.Timeout:
|
||||||
|
return False
|
||||||
|
return result.status_code in (200, 204)
|
||||||
|
|
||||||
|
|
||||||
|
def update(config, section, result):
|
||||||
|
"""Update the cachet instance with the given result
|
||||||
|
"""
|
||||||
|
cachet_url = config["cachetupdater"]["url"]
|
||||||
|
cachet_token = config["cachetupdater"]["token"]
|
||||||
|
component_id = config[section]["id"]
|
||||||
|
status = 1 if result else 4
|
||||||
|
url = COMPONENT_PATH % {
|
||||||
|
"cachet_url": cachet_url,
|
||||||
|
"component_id": component_id,
|
||||||
|
}
|
||||||
|
|
||||||
|
if need_update(url, status):
|
||||||
|
headers = {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"X-Cachet-Token": cachet_token,
|
||||||
|
}
|
||||||
|
payload = {
|
||||||
|
"status": 1 if result else 4
|
||||||
|
}
|
||||||
|
requests.request("PUT", url, json=payload, headers=headers)
|
||||||
|
|
||||||
|
|
||||||
|
def need_update(url, status):
|
||||||
|
response = requests.request("GET", url)
|
||||||
|
current = response.json()
|
||||||
|
current_status = int(current.get("data", {}).get("status", None))
|
||||||
|
if current_status == status or current_status not in (1, 4):
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def main(args):
|
||||||
|
"""Entry point for the script
|
||||||
|
|
||||||
|
:param configParser args: tha argmuents given via the command line
|
||||||
|
"""
|
||||||
|
config = get_configuration(args.configuration)
|
||||||
|
for section in config.sections():
|
||||||
|
if section != "cachetupdater":
|
||||||
|
checker(config, section)
|
||||||
|
|
||||||
|
|
||||||
|
def get_configuration(config_path):
|
||||||
|
"""Reads the configuration and returns it
|
||||||
|
|
||||||
|
:param str config_path: path to retrieve the configuration file
|
||||||
|
:rtype: a dict like object
|
||||||
|
:returns: a dict like object containing the configuration
|
||||||
|
"""
|
||||||
|
config = ConfigParser()
|
||||||
|
config.read(config_path)
|
||||||
|
return config
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import argparse
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("configuration", help="path to the config file")
|
||||||
|
main(parser.parse_args())
|
15
config/cachetupdater.ini
Normal file
15
config/cachetupdater.ini
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
[cachetupdater]
|
||||||
|
url = https://status.example.com
|
||||||
|
token = XXXXXXXXXXXXXXXXXXXX
|
||||||
|
|
||||||
|
[katzei.fr]
|
||||||
|
id = 1
|
||||||
|
url = https://katzei.fr
|
||||||
|
|
||||||
|
[bw.katzei.fr]
|
||||||
|
id = 2
|
||||||
|
url = https://bw.katzei.fr
|
||||||
|
|
||||||
|
[cloud.katzei.fr]
|
||||||
|
id = 3
|
||||||
|
url = https://cloud.katzei.fr
|
1
requirement.txt
Normal file
1
requirement.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
requests
|
Loading…
Reference in New Issue
Block a user