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')
 |