Fixes #690 by Clearing storage['active_boot'] if shutdown was successful (#691)

* Clear storage variable if shutdown was successful

* Adding shutdown monitoring and debug output.

* It seams systemd-run gets a connection reset from running 'shutdown now', but in a good way - so it doesn't raise any exceptions. Or at least that's what it looks like.
This commit is contained in:
Anton Hvornum 2021-11-07 11:23:29 +00:00 committed by GitHub
parent c62cef3cfd
commit 565464c72d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 3 deletions

View File

@ -691,6 +691,7 @@ class Installer:
return InstallationFile(self, filename, owner)
def set_keyboard_language(self, language: str) -> bool:
log(f"Setting keyboard language to {language}", level=logging.INFO)
if len(language.strip()):
if not verify_keyboard_layout(language):
self.log(f"Invalid keyboard language specified: {language}", fg="red", level=logging.ERROR)
@ -712,6 +713,7 @@ class Installer:
return True
def set_x11_keyboard_language(self, language: str) -> bool:
log(f"Setting x11 keyboard language to {language}", level=logging.INFO)
"""
A fallback function to set x11 layout specifically and separately from console layout.
This isn't strictly necessary since .set_keyboard_language() does this as well.

View File

@ -1,4 +1,6 @@
import logging
import time
from .exceptions import SysCallError
from .general import SysCommand, SysCommandWorker, locate_binary
from .installer import Installer
from .output import log
@ -65,8 +67,10 @@ class Boot:
'-D', self.instance.target,
'--timezone=off',
'-b',
'--no-pager',
'--machine', self.container_name
])
# '-P' or --console=pipe could help us not having to do a bunch of os.write() calls, but instead use pipes (stdin, stdout and stderr) as usual.
if not self.ready:
while self.session.is_alive():
@ -85,7 +89,14 @@ class Boot:
log(args[1], level=logging.ERROR, fg='red')
log(f"The error above occured in a temporary boot-up of the installation {self.instance}", level=logging.ERROR, fg="red")
SysCommand(f'machinectl shell {self.container_name} /bin/bash -c "shutdown now"')
shutdown = SysCommand(f'systemd-run --machine={self.container_name} --pty /bin/bash -c "shutdown now"')
while self.session.is_alive():
time.sleep(0.25)
if shutdown.exit_code == 0:
storage['active_boot'] = None
else:
raise SysCallError(f"Could not shut down temporary boot of {self.instance}", level=logging.ERROR, fg="red")
def __iter__(self):
if self.session:
@ -112,10 +123,10 @@ class Boot:
cmd[0] = locate_binary(cmd[0])
return SysCommand(["machinectl", "shell", self.container_name, *cmd], *args, **kwargs)
return SysCommand(["systemd-run", f"--machine={self.container_name}", "--pty", *cmd], *args, **kwargs)
def SysCommandWorker(self, cmd: list, *args, **kwargs):
if cmd[0][0] != '/' and cmd[0][:2] != './':
cmd[0] = locate_binary(cmd[0])
return SysCommandWorker(["machinectl", "shell", self.container_name, *cmd], *args, **kwargs)
return SysCommandWorker(["systemd-run", f"--machine={self.container_name}", "--pty", *cmd], *args, **kwargs)