From 565464c72df713db7df94809a75b313aed3a7621 Mon Sep 17 00:00:00 2001 From: Anton Hvornum Date: Sun, 7 Nov 2021 11:23:29 +0000 Subject: 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. --- archinstall/lib/installer.py | 2 ++ archinstall/lib/systemd.py | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index c2c30f7c..1318cb16 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -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. diff --git a/archinstall/lib/systemd.py b/archinstall/lib/systemd.py index a7e35839..7f732c99 100644 --- a/archinstall/lib/systemd.py +++ b/archinstall/lib/systemd.py @@ -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) -- cgit v1.2.3-70-g09d2