88 lines
2.2 KiB
Python
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')
|