From 240f688ccefa7bddb56efe5bc41a457c96792e42 Mon Sep 17 00:00:00 2001 From: Anton Hvornum Date: Sun, 2 Jan 2022 16:36:50 +0100 Subject: Adding a Pipewire application profile (#821) * Adding a Pipewire application profile This to better manage the pipewire setup process and minimize guided a bit. This also adds the concept of @archinstall.plugin decorators to add a plugin in run-time. Which pipewire uses to detect user creation and enable the pipewire-pulse service for new users. * Forgot to run .install() on pipewire Application() * Backwards compatible variable insertion for installation session --- archinstall/__init__.py | 6 +++++- archinstall/lib/installer.py | 9 ++++++++- examples/guided.py | 4 +--- profiles/applications/pipewire.py | 14 ++++++++++++++ 4 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 profiles/applications/pipewire.py diff --git a/archinstall/__init__.py b/archinstall/__init__.py index 865e9844..9d7e238d 100644 --- a/archinstall/__init__.py +++ b/archinstall/__init__.py @@ -172,7 +172,11 @@ define_arguments() arguments = get_arguments() post_process_arguments(arguments) -# TODO: Learn the dark arts of argparse... (I summon thee dark spawn of cPython) +# @archinstall.plugin decorator hook to programmatically add +# plugins in runtime. Useful in profiles and other things. +def plugin(f, *args, **kwargs): + plugins[f.__name__] = f + def run_as_a_module(): """ diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 9d89c375..c02d5717 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -109,7 +109,9 @@ class Installer: self.post_base_install = [] + # TODO: Figure out which one of these two we'll use.. But currently we're mixing them.. storage['session'] = self + storage['installation_session'] = self self.MODULES = [] self.BINARIES = [] @@ -782,13 +784,18 @@ class Installer: handled_by_plugin = False for plugin in plugins.values(): if hasattr(plugin, 'on_user_create'): - if result := plugin.on_user_create(user): + if result := plugin.on_user_create(self, user): handled_by_plugin = result if not handled_by_plugin: self.log(f'Creating user {user}', level=logging.INFO) SysCommand(f'/usr/bin/arch-chroot {self.target} useradd -m -G wheel {user}') + for plugin in plugins.values(): + if hasattr(plugin, 'on_user_created'): + if result := plugin.on_user_created(self, user): + handled_by_plugin = result + if password: self.user_set_pw(user, password) diff --git a/examples/guided.py b/examples/guided.py index d36b4cbc..57409644 100644 --- a/examples/guided.py +++ b/examples/guided.py @@ -295,9 +295,7 @@ def perform_installation(mountpoint): if archinstall.arguments.get('audio', None) is not None: installation.log(f"This audio server will be used: {archinstall.arguments.get('audio', None)}", level=logging.INFO) if archinstall.arguments.get('audio', None) == 'pipewire': - print('Installing pipewire ...') - - installation.add_additional_packages(["pipewire", "pipewire-alsa", "pipewire-jack", "pipewire-media-session", "pipewire-pulse", "gst-plugin-pipewire", "libpulse"]) + archinstall.Application(installation, 'pipewire').install() elif archinstall.arguments.get('audio', None) == 'pulseaudio': print('Installing pulseaudio ...') installation.add_additional_packages("pulseaudio") diff --git a/profiles/applications/pipewire.py b/profiles/applications/pipewire.py new file mode 100644 index 00000000..38554000 --- /dev/null +++ b/profiles/applications/pipewire.py @@ -0,0 +1,14 @@ +import archinstall +import logging + +# Define the package list in order for lib to source +# which packages will be installed by this profile +__packages__ = ["pipewire", "pipewire-alsa", "pipewire-jack", "pipewire-media-session", "pipewire-pulse", "gst-plugin-pipewire", "libpulse"] + +archinstall.log('Installing pipewire', level=logging.INFO) +archinstall.storage['installation_session'].add_additional_packages(__packages__) + +@archinstall.plugin +def on_user_created(installation :archinstall.Installer, user :str): + archinstall.log(f"Enabling pipewire-pulse for {user}", level=logging.INFO) + installation.chroot('systemctl enable --user pipewire-pulse.service', run_as=user) \ No newline at end of file -- cgit v1.2.3-70-g09d2