69 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env python3
 | |
| 
 | |
| from bundlewrap.repo import Repository
 | |
| from os.path import realpath, dirname
 | |
| from ipaddress import ip_interface
 | |
| 
 | |
| repo = Repository(dirname(dirname(realpath(__file__))))
 | |
| nodes = [
 | |
|     node
 | |
|         for node in sorted(repo.nodes_in_group('debian'))
 | |
|         if not node.dummy
 | |
| ]
 | |
| reboot_nodes = []
 | |
| 
 | |
| print('updating nodes:', sorted(node.name for node in nodes))
 | |
| 
 | |
| # UPDATE
 | |
| 
 | |
| for node in nodes:
 | |
|     print('--------------------------------------')
 | |
|     print('updating', node.name)
 | |
|     print('--------------------------------------')
 | |
|     repo.libs.wol.wake(node)
 | |
|     print(node.run('DEBIAN_FRONTEND=noninteractive apt update').stdout.decode())
 | |
|     print(node.run('DEBIAN_FRONTEND=noninteractive apt list --upgradable').stdout.decode())
 | |
|     if int(node.run('DEBIAN_FRONTEND=noninteractive apt list --upgradable 2> /dev/null | grep upgradable | wc -l').stdout.decode()):
 | |
|         print(node.run('DEBIAN_FRONTEND=noninteractive apt -y dist-upgrade').stdout.decode())
 | |
|         reboot_nodes.append(node)
 | |
| 
 | |
| # REBOOT IN ORDER
 | |
| 
 | |
| wireguard_servers = [
 | |
|     node
 | |
|         for node in reboot_nodes
 | |
|         if node.has_bundle('wireguard')
 | |
|         and (
 | |
|             ip_interface(node.metadata.get('wireguard/my_ip')).network.prefixlen <
 | |
|             ip_interface(node.metadata.get('wireguard/my_ip')).network.max_prefixlen
 | |
|         )
 | |
| ]
 | |
| 
 | |
| wireguard_s2s = [
 | |
|     node
 | |
|         for node in reboot_nodes
 | |
|         if node.has_bundle('wireguard')
 | |
|         and (
 | |
|             ip_interface(node.metadata.get('wireguard/my_ip')).network.prefixlen ==
 | |
|             ip_interface(node.metadata.get('wireguard/my_ip')).network.max_prefixlen
 | |
|         )
 | |
| ]
 | |
| 
 | |
| everything_else = [
 | |
|     node
 | |
|         for node in reboot_nodes
 | |
|         if not node.has_bundle('wireguard')
 | |
| ]
 | |
| 
 | |
| print('======================================')
 | |
| 
 | |
| for node in [
 | |
|     *everything_else,
 | |
|     *wireguard_s2s,
 | |
|     *wireguard_servers,
 | |
| ]:
 | |
|     print('rebooting', node.name)
 | |
|     try:
 | |
|         print(node.run('systemctl reboot').stdout.decode())
 | |
|     except Exception as e:
 | |
|         print(e)
 | 
