Nieuw: laat weten als de ober gaat slapen/wakker wordt
This commit is contained in:
parent
5273c53852
commit
9753f676f4
|
@ -7,7 +7,7 @@
|
||||||
en [klant-ip] door het ip-adres van het rekentuig dat de klant draait.
|
en [klant-ip] door het ip-adres van het rekentuig dat de klant draait.
|
||||||
- Als je het programmaatje niet als root wilt uitvoeren, verander dan ook
|
- Als je het programmaatje niet als root wilt uitvoeren, verander dan ook
|
||||||
de gebruiker in dit script.
|
de gebruiker in dit script.
|
||||||
3. Plaats aiuo-shutdown.service in `/etc/systemd/system`.
|
3. Plaats aiuo-shutdown.service, aiuo-shutdown-suspend.service en aiuo-wakeup.service in `/etc/systemd/system`.
|
||||||
4. Start de de systemd-service. Als je zeker weet dat het werkt, schakel het dan in.
|
4. Start deze services met systemd. Als je zeker weet dat het werkt, schakel het dan in.
|
||||||
- Ik heb mijn rekentuig een keer onopstartbaar gemaakt, omdat het zichzelf meteen
|
- Ik heb mijn rekentuig een keer onopstartbaar gemaakt, omdat het zichzelf meteen
|
||||||
afsloot. Houd hier rekening mee!
|
afsloot. Houd hier rekening mee!
|
||||||
|
|
11
ober/aiuo-shutdown-suspend.service
Normal file
11
ober/aiuo-shutdown-suspend.service
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Notify aiuo-shutdown when system goes sleeping
|
||||||
|
StopWhenUnneeded=yes
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStop=aiuo-shutdown --notify sleep
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=sleep.target
|
12
ober/aiuo-shutdown-wakeup.service
Normal file
12
ober/aiuo-shutdown-wakeup.service
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Notify aiuo-shutdown when system wakes up
|
||||||
|
After=sleep.target
|
||||||
|
StopWhenUnneeded=yes
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStop=aiuo-shutdown --notify wakeup
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=suspend.target
|
|
@ -1,5 +1,5 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
import aio_msgpack_rpc
|
import msgpackrpc
|
||||||
import argparse
|
import argparse
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
|
@ -16,7 +16,6 @@ last_checked_value: bool = False
|
||||||
cur_timeout: float = TIMEOUT
|
cur_timeout: float = TIMEOUT
|
||||||
client = None
|
client = None
|
||||||
|
|
||||||
|
|
||||||
def count_users() -> int:
|
def count_users() -> int:
|
||||||
"""Checks if any users are logged in"""
|
"""Checks if any users are logged in"""
|
||||||
cmd = "who | wc -l"
|
cmd = "who | wc -l"
|
||||||
|
@ -53,41 +52,45 @@ def trusty_sleep(amount: float):
|
||||||
LOGGER.debug("Woke up early")
|
LOGGER.debug("Woke up early")
|
||||||
time.sleep(amount - (time.time() - last_checked))
|
time.sleep(amount - (time.time() - last_checked))
|
||||||
|
|
||||||
async def sigint_handler(*_, **__):
|
def sigterm_handler(signum, frame):
|
||||||
LOGGER.debug("Notifying of shutdown")
|
LOGGER.debug("Notifying of shutdown")
|
||||||
await client.notify("NotifyShutdown")
|
client.notify("NotifyShutdown")
|
||||||
|
|
||||||
async def main() -> None:
|
def sigusr1_handler(signum, frame):
|
||||||
|
LOGGER.debug("Going to sleep")
|
||||||
|
client.notify("NotifySleep")
|
||||||
|
|
||||||
|
def sigusr2_handler(signum, frame):
|
||||||
|
LOGGER.debug("Waking up")
|
||||||
|
client.notify("NotifyWakeup")
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
global TIMEOUT
|
global TIMEOUT
|
||||||
global CLIENT_IP
|
global CLIENT_IP
|
||||||
global last_checked
|
global last_checked
|
||||||
global last_checked_value
|
global last_checked_value
|
||||||
global client
|
global client
|
||||||
|
|
||||||
logging.basicConfig(format='[%(asctime)s %(levelname)s] %(name)s: %(message)s', level=logging.DEBUG)
|
|
||||||
argparser = argparse.ArgumentParser(description="AIUO - Automatisch In- en Uitschakelen Ober (Oberkant)")
|
|
||||||
argparser.add_argument("wachttijd", type=float, help="Wachttijd voor het uitschakelen van ober, in secondes")
|
|
||||||
argparser.add_argument("ip_klant", type=str, help="IP-adres van klant")
|
|
||||||
args = argparser.parse_args()
|
|
||||||
CLIENT_IP = args.ip_klant
|
|
||||||
TIMEOUT = args.wachttijd
|
|
||||||
|
|
||||||
LOGGER.debug("Trying to connect via RPC")
|
LOGGER.debug("Trying to connect via RPC")
|
||||||
|
|
||||||
success = False
|
success = False
|
||||||
while not success:
|
while not success:
|
||||||
try:
|
try:
|
||||||
client = aio_msgpack_rpc.Client(*await asyncio.open_connection(CLIENT_IP, 18002))
|
client = msgpackrpc.Client(msgpackrpc.Address(CLIENT_IP, 18002))
|
||||||
success = True
|
success = True
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOGGER.debug(f"Connection failed: {e}. Retrying in 10s")
|
LOGGER.debug(f"Connection failed: {e}. Retrying in 10s")
|
||||||
await asyncio.sleep(10)
|
time.sleep(10)
|
||||||
|
|
||||||
LOGGER.debug(await client.call("GetBootReason"))
|
LOGGER.debug(client.call("GetBootReason"))
|
||||||
# Alleen de klant op de hoogte stellen nadat we hebben laten weten dat we er zijn.
|
# Alleen de klant op de hoogte stellen nadat we hebben laten weten dat we er zijn.
|
||||||
LOGGER.debug("SIGINT verwerken")
|
LOGGER.debug("signalen registreren")
|
||||||
loop = asyncio.get_running_loop()
|
|
||||||
#loop.add_signal_handler(signal.SIGINT, lambda: asyncio.ensure_future(sigint_handler()))
|
#loop.add_signal_handler(signal.SIGINT, lambda: asyncio.ensure_future(sigint_handler()))
|
||||||
|
signal.signal(signal.SIGTERM, sigterm_handler)
|
||||||
|
signal.signal(signal.SIGUSR1, sigusr1_handler)
|
||||||
|
signal.signal(signal.SIGUSR2, sigusr2_handler)
|
||||||
|
|
||||||
|
|
||||||
final_verdict = False
|
final_verdict = False
|
||||||
|
@ -103,22 +106,39 @@ async def main() -> None:
|
||||||
last_checked_value = True
|
last_checked_value = True
|
||||||
else:
|
else:
|
||||||
last_checked_value = False
|
last_checked_value = False
|
||||||
await sigint_handler()
|
sigterm_handler()
|
||||||
os.system("shutdown +1 The system is going to shut down because no active sessions were found and no one is on the server")
|
os.system("shutdown +1 The system is going to shut down because no active sessions were found and no one is on the server")
|
||||||
|
|
||||||
def start_main():
|
|
||||||
#asyncio.run(main())
|
|
||||||
|
|
||||||
loop = asyncio.get_event_loop()
|
def notify(what) -> None:
|
||||||
try:
|
if what == "sleep":
|
||||||
loop.run_until_complete(main())
|
sig_to_send = "USR1"
|
||||||
except KeyboardInterrupt as e:
|
elif what == "wakeup":
|
||||||
LOGGER.debug("Keyboard interrupt")
|
sig_to_send = "USR2"
|
||||||
finally:
|
else:
|
||||||
LOGGER.debug("Notify shutdown")
|
return -1
|
||||||
loop.run_forever(sigint_handler())
|
os.system(f"systemctl kill -s {sig_to_send} aiuo-shutdown.service")
|
||||||
loop.run_until_complete(loop.shutdown_asyncgens())
|
|
||||||
loop.close()
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def start_main():
|
||||||
|
global CLIENT_IP
|
||||||
|
global TIMEOUT
|
||||||
|
|
||||||
|
logging.basicConfig(format='[%(asctime)s %(levelname)s] %(name)s: %(message)s', level=logging.DEBUG)
|
||||||
|
argparser = argparse.ArgumentParser(description="AIUO - Automatisch In- en Uitschakelen Ober (Oberkant)")
|
||||||
|
argparser.add_argument("wachttijd", type=float, nargs="?", help="Wachttijd voor het uitschakelen van ober, in secondes")
|
||||||
|
argparser.add_argument("ip_klant", type=str, nargs="?", help="IP-adres van klant")
|
||||||
|
argparser.add_argument("--notify", type=str, help="Notify before sleep (sleep) or after wakeup (wakeup)")
|
||||||
|
args = argparser.parse_args()
|
||||||
|
if args.notify:
|
||||||
|
return notify(args.notify)
|
||||||
|
else:
|
||||||
|
CLIENT_IP = args.ip_klant
|
||||||
|
TIMEOUT = args.wachttijd
|
||||||
|
|
||||||
|
return main()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
start_main()
|
start_main()
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
|
|
||||||
setup(name="AIUO-ober",
|
setup(name="AIUO-ober",
|
||||||
version="0.2",
|
version="0.3",
|
||||||
description="Automatisch In- en Uitschakelen Ober Ober",
|
description="Automatisch In- en Uitschakelen Ober Ober",
|
||||||
author="Chris Josten",
|
author="Chris Josten",
|
||||||
author_email="chris@netsoj.nl",
|
author_email="chris@netsoj.nl",
|
||||||
packages=["ober"],
|
packages=["ober"],
|
||||||
install_requires=["aio_msgpack_rpc"],
|
install_requires=["msgpack-rpc-python"],
|
||||||
entry_points={
|
entry_points={
|
||||||
"console_scripts": {
|
"console_scripts": {
|
||||||
"aiuo-shutdown = ober.autoshutdown:start_main"
|
"aiuo-shutdown = ober.autoshutdown:start_main"
|
||||||
|
|
Loading…
Reference in a new issue