bundlewrap/bundles/monitored/files/downtime
2023-03-02 18:35:14 +01:00

88 lines
2.2 KiB
Python

#!/usr/bin/env python3
from requests import Session
from requests.exceptions import ConnectionError
from sys import argv
from time import sleep, time
if len(argv) > 1 and argv[1] == "remove":
action = "remove"
else:
action = "add"
duration_seconds = int(argv[1]) if len(argv) == 2 else 60 * 60 * 24
author = 'downtime-script'
node_name = '${node_name}'
api_url = 'https://${icinga_hostname}/api/v1'
session = Session()
session.auth = ('root', '${icinga_password}')
now = int(time())
# wait online
for _ in range(10):
try:
session.get(api_url).raise_for_status()
except ConnectionError as error:
print(f'{error}: retrying...')
sleep(3)
else:
break
# look for existing downtimes
response = session.get(
f'{api_url}/objects/downtimes',
headers={
'Content-Type': 'application/json',
'Accept': 'application/json',
},
json={
'filter': f'match("{node_name}", host.name), match("{author}", downtime.author)',
}
)
response.raise_for_status()
# remove existing downtimes
if response.json()['results']:
response = session.post(
f'{api_url}/actions/remove-downtime',
headers={
'Content-Type': 'application/json',
'Accept': 'application/json',
},
json={
'type': 'Downtime',
'filter': f'match("{node_name}", host.name), match("{author}", downtime.author)',
'pretty': True,
}
)
response.raise_for_status()
print('removed downtime')
# add downtime
if action == 'add':
response = session.post(
f'{api_url}/actions/schedule-downtime',
headers={
'Content-Type': 'application/json',
'Accept': 'application/json',
},
json={
'author': author,
'comment': f'downtime by {argv[0]}',
'start_time': now,
'end_time': now + duration_seconds,
'type': 'Host',
'child_options': 'DowntimeTriggeredChildren',
'all_services': True,
'filter': f'match("{node_name}", host.name)',
'pretty': True,
}
)
response.raise_for_status()
print('added downtime')