86 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from ipaddress import ip_interface
 | |
| 
 | |
| 
 | |
| defaults = {
 | |
|     'apt': {
 | |
|         'packages': {
 | |
|             'jq': {},
 | |
|             'ethtool': {},
 | |
|             'net-tools': {},
 | |
|         },
 | |
|     },
 | |
|     'systemd': {
 | |
|         'units': {
 | |
|             'wakeonlan-remove-downtime.service': {
 | |
|                 'Unit': {
 | |
|                     'Description': 'remove icinga downtime after wakeup',
 | |
|                     'After': {
 | |
|                         'network-online.target',
 | |
|                         'suspend.target',
 | |
|                     },
 | |
|                 },
 | |
|                 'Service': {
 | |
|                     'ExecStart': '/usr/local/bin/downtime remove',
 | |
|                 },
 | |
|                 'Install': {
 | |
|                     'WantedBy': {
 | |
|                         'suspend.target',
 | |
|                     },
 | |
|                 },
 | |
|             },
 | |
|         },
 | |
|     },
 | |
|     'systemd-timers': {
 | |
|         'suspend-if-idle': {
 | |
|             'command': f'suspend_if_idle',
 | |
|             'when': 'minutely',
 | |
|             'success_exit_status': '75',
 | |
|             'env': {
 | |
|                 'THIS_SERVICE': 'suspend-if-idle.service',
 | |
|             },
 | |
|         },
 | |
|     },
 | |
| }
 | |
| 
 | |
| 
 | |
| @metadata_reactor.provides(
 | |
|     'wol-sleeper/wake_command',
 | |
| )
 | |
| def wake_command(metadata):
 | |
|     waker_hostname = repo.get_node(metadata.get('wol-sleeper/waker')).hostname
 | |
|     mac = metadata.get(f"network/{metadata.get('wol-sleeper/network')}/mac")
 | |
|     ip = ip_interface(metadata.get(f"network/{metadata.get('wol-sleeper/network')}/ipv4")).ip
 | |
| 
 | |
|     return {
 | |
|         'wol-sleeper': {
 | |
|             'wake_command': f"ssh -o StrictHostKeyChecking=no wol@{waker_hostname} 'wakeonlan {mac} && while ! ping {ip} -c1 -W3; do true; done'",
 | |
|         },
 | |
|     }
 | |
| 
 | |
| 
 | |
| @metadata_reactor.provides(
 | |
|     'systemd/units/wakeonline-setup.service',
 | |
|     'systemd/services/wakeonline-setup.service',
 | |
| )
 | |
| def systemd(metadata):
 | |
|     interface = metadata.get(f"network/{metadata.get('wol-sleeper/network')}/interface")
 | |
| 
 | |
|     return {
 | |
|         'systemd': {
 | |
|             'units': {
 | |
|                 'wakeonline-setup.service': {
 | |
|                     'Unit': {
 | |
|                         'After': 'network.target',
 | |
|                     },
 | |
|                     'Service': {
 | |
|                         'Type': 'oneshot',
 | |
|                         'RemainAfterExit': 'yes',
 | |
|                         'ExecStart': f'ethtool -s {interface} wol g',
 | |
|                     },
 | |
|                 },
 | |
|             },
 | |
|             'services': {
 | |
|                 'wakeonline-setup.service': {},
 | |
|             },
 | |
|         },
 | |
|     }
 |