Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archinstall/lib/installer.py2
-rw-r--r--archinstall/lib/profiles.py46
-rw-r--r--docs/archinstall/general.rst3
-rw-r--r--docs/index.rst2
-rw-r--r--docs/installing/guided.rst2
-rw-r--r--examples/guided.py4
-rw-r--r--profiles/applications/kde-wayland.py7
-rw-r--r--profiles/applications/kde.py5
-rw-r--r--profiles/awesome.py5
-rw-r--r--profiles/desktop.py2
-rw-r--r--profiles/gnome.py2
-rw-r--r--profiles/kde-wayland.py34
-rw-r--r--profiles/kde.py10
-rw-r--r--profiles/minimal.py20
-rw-r--r--profiles/xorg.py2
15 files changed, 99 insertions, 47 deletions
diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py
index 16d48183..66cac12c 100644
--- a/archinstall/lib/installer.py
+++ b/archinstall/lib/installer.py
@@ -52,7 +52,7 @@ class Installer():
'user' : False # Root counts as a user, if additional users are skipped.
}
- self.base_packages = base_packages.split(' ')
+ self.base_packages = base_packages.split(' ') if type(base_packages) is str else base_packages
self.post_base_install = []
storage['session'] = self
diff --git a/archinstall/lib/profiles.py b/archinstall/lib/profiles.py
index 4ef6c533..abf10f8e 100644
--- a/archinstall/lib/profiles.py
+++ b/archinstall/lib/profiles.py
@@ -177,6 +177,52 @@ class Profile(Script):
if hasattr(imported, '_prep_function'):
return True
return False
+"""
+ def has_post_install(self):
+ with open(self.path, 'r') as source:
+ source_data = source.read()
+
+ # Some crude safety checks, make sure the imported profile has
+ # a __name__ check and if so, check if it's got a _prep_function()
+ # we can call to ask for more user input.
+ #
+ # If the requirements are met, import with .py in the namespace to not
+ # trigger a traditional:
+ # if __name__ == 'moduleName'
+ if '__name__' in source_data and '_post_install' in source_data:
+ with self.load_instructions(namespace=f"{self.namespace}.py") as imported:
+ if hasattr(imported, '_post_install'):
+ return True
+"""
+
+ def is_top_level_profile(self):
+ with open(self.path, 'r') as source:
+ source_data = source.read()
+
+ # TODO: I imagine that there is probably a better way to write this.
+ return 'top_level_profile = True' in source_data
+
+ @property
+ def packages(self) -> list:
+ """
+ Returns a list of packages baked into the profile definition.
+ If no package definition has been done, .packages() will return None.
+ """
+ with open(self.path, 'r') as source:
+ source_data = source.read()
+
+ # Some crude safety checks, make sure the imported profile has
+ # a __name__ check before importing.
+ #
+ # If the requirements are met, import with .py in the namespace to not
+ # trigger a traditional:
+ # if __name__ == 'moduleName'
+ if '__name__' in source_data and '__packages__' in source_data:
+ with self.load_instructions(namespace=f"{self.namespace}.py") as imported:
+ if hasattr(imported, '__packages__'):
+ return imported.__packages__
+ return None
+
class Application(Profile):
def __repr__(self, *args, **kwargs):
diff --git a/docs/archinstall/general.rst b/docs/archinstall/general.rst
index 0403ae30..312c03af 100644
--- a/docs/archinstall/general.rst
+++ b/docs/archinstall/general.rst
@@ -24,6 +24,9 @@ Locale related
.. autofunction:: archinstall.set_keyboard_language
+..
+ autofunction:: archinstall.Installer.set_keyboard_layout
+
Services
========
diff --git a/docs/index.rst b/docs/index.rst
index deb2734e..a5d07901 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -2,7 +2,7 @@ python-archinstall Documentation
================================
| **python-archinstall** *(or, archinstall for short)* is a helper library to install Arch Linux and manage services, packages and other things.
-| It comes packaged with different pre-configured installers, such as the :ref:`guided <installing.guided>` installer.
+| It comes packaged with different pre-configured installers, such as the `Guided installation`_ installer.
|
| A demo can be viewed here: `https://www.youtube.com/watch?v=9Xt7X_Iqg6E <https://www.youtube.com/watch?v=9Xt7X_Iqg6E>`_ which uses the default guided installer.
diff --git a/docs/installing/guided.rst b/docs/installing/guided.rst
index 2e1cda09..8699ae62 100644
--- a/docs/installing/guided.rst
+++ b/docs/installing/guided.rst
@@ -1,5 +1,3 @@
-.. _installing.guided:
-
Guided installation
===================
diff --git a/examples/guided.py b/examples/guided.py
index ed838a29..a28aa50e 100644
--- a/examples/guided.py
+++ b/examples/guided.py
@@ -1,5 +1,7 @@
import getpass, time, json, sys, signal, os
import archinstall
+from archinstall.lib.hardware import hasUEFI
+from archinstall.lib.profiles import Profile
"""
This signal-handler chain (and global variable)
@@ -166,7 +168,7 @@ def ask_user_questions():
# Ask for archinstall-specific profiles (such as desktop environments etc)
if not archinstall.arguments.get('profile', None):
- archinstall.arguments['profile'] = archinstall.select_profile(archinstall.list_profiles())
+ archinstall.arguments['profile'] = archinstall.select_profile(filter(lambda profile: (Profile(None, profile).is_top_level_profile()), archinstall.list_profiles()))
else:
archinstall.arguments['profile'] = archinstall.list_profiles()[archinstall.arguments['profile']]
diff --git a/profiles/applications/kde-wayland.py b/profiles/applications/kde-wayland.py
deleted file mode 100644
index 6a9be294..00000000
--- a/profiles/applications/kde-wayland.py
+++ /dev/null
@@ -1,7 +0,0 @@
-import archinstall
-packages = "plasma-meta kde-applications-meta plasma-wayland-session sddm"
-# if the package selection can be reduced go for it
-if "nvidia" in _gfx_driver_packages:
- packages = packages + " egl-wayland"
-installation.add_additional_packages(packages)
-# We'll support plasma-desktop-wayland (minimal) later
diff --git a/profiles/applications/kde.py b/profiles/applications/kde.py
index 87a266b0..af1e6597 100644
--- a/profiles/applications/kde.py
+++ b/profiles/applications/kde.py
@@ -1,2 +1,5 @@
import archinstall
-installation.add_additional_packages("plasma-meta kde-applications-meta sddm") # We'll support plasma-desktop (minimal) later iirc sddm should be part of plasma-meta
+packages = "plasma-meta konsole kate dolphin sddm plasma-wayland-session"
+if "nvidia" in _gfx_driver_packages:
+ packages = packages + " egl-wayland"
+installation.add_additional_packages(packages)
diff --git a/profiles/awesome.py b/profiles/awesome.py
index a565ccb3..c54aa827 100644
--- a/profiles/awesome.py
+++ b/profiles/awesome.py
@@ -2,6 +2,11 @@
import archinstall
+is_top_level_profile = False
+
+# New way of defining packages for a profile, which is iterable and can be used out side
+# of the profile to get a list of "what packages will be installed".
+__packages__ = ['nano', 'nemo', 'gpicview-gtk3', 'openssh', 'sshfs', 'htop', 'scrot', 'wget']
def _prep_function(*args, **kwargs):
"""
diff --git a/profiles/desktop.py b/profiles/desktop.py
index 41a2ad8b..e7536629 100644
--- a/profiles/desktop.py
+++ b/profiles/desktop.py
@@ -2,6 +2,8 @@
import archinstall, os
+is_top_level_profile = True
+
def _prep_function(*args, **kwargs):
"""
Magic function called by the importing installer
diff --git a/profiles/gnome.py b/profiles/gnome.py
index b37679de..c75cafee 100644
--- a/profiles/gnome.py
+++ b/profiles/gnome.py
@@ -2,6 +2,8 @@
import archinstall
+is_top_level_profile = False
+
def _prep_function(*args, **kwargs):
"""
Magic function called by the importing installer
diff --git a/profiles/kde-wayland.py b/profiles/kde-wayland.py
deleted file mode 100644
index e21f62c8..00000000
--- a/profiles/kde-wayland.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# A desktop environment using "KDE".
-import archinstall, os
-
-# TODO: Remove hard dependency of bash (due to .bash_profile)
-
-def _prep_function(*args, **kwargs):
- """
- Magic function called by the importing installer
- before continuing any further. It also avoids executing any
- other code in this stage. So it's a safe way to ask the user
- for more input before any other installer steps start.
- """
-
- # KDE requires a functioning Xorg installation.
- profile = archinstall.Profile(None, 'xorg')
- with profile.load_instructions(namespace='xorg.py') as imported:
- if hasattr(imported, '_prep_function'):
- return imported._prep_function()
- else:
- print('Deprecated (??): xorg profile has no _prep_function() anymore')
-
-# Ensures that this code only gets executed if executed
-# through importlib.util.spec_from_file_location("kde", "/somewhere/kde.py")
-# or through conventional import kde
-if __name__ == 'kde-wayland':
- # Install dependency profiles
- installation.install_profile('xorg')
-
- # Install the application kde from the template under /applications/
- kde = archinstall.Application(installation, 'kde-wayland')
- kde.install()
- print("when you login, select Plasma (Wayland) for the wayland session")
- # Enable autostart of KDE for all users
- installation.enable_service('sddm')
diff --git a/profiles/kde.py b/profiles/kde.py
index 32819bd5..6654dfa7 100644
--- a/profiles/kde.py
+++ b/profiles/kde.py
@@ -2,6 +2,8 @@
import archinstall, os
+is_top_level_profile = False
+
# TODO: Remove hard dependency of bash (due to .bash_profile)
def _prep_function(*args, **kwargs):
@@ -20,6 +22,14 @@ def _prep_function(*args, **kwargs):
else:
print('Deprecated (??): xorg profile has no _prep_function() anymore')
+"""
+def _post_install(*args, **kwargs):
+ if "nvidia" in _gfx_driver_packages:
+ print("Plasma Wayland has known compatibility issues with the proprietary Nvidia driver")
+ print("After booting, you can choose between Wayland and Xorg using the drop-down menu")
+ return True
+"""
+
# Ensures that this code only gets executed if executed
# through importlib.util.spec_from_file_location("kde", "/somewhere/kde.py")
# or through conventional import kde
diff --git a/profiles/minimal.py b/profiles/minimal.py
new file mode 100644
index 00000000..79821a89
--- /dev/null
+++ b/profiles/minimal.py
@@ -0,0 +1,20 @@
+# Used to do a minimal install
+
+import archinstall, os
+
+is_top_level_profile = True
+
+def _prep_function(*args, **kwargs):
+ """
+ Magic function called by the importing installer
+ before continuing any further. For minimal install,
+ we don't need to do anything special here, but it
+ needs to exist and return True.
+ """
+ return True # Do nothing and just return True
+
+if __name__ == 'minimal':
+ """
+ This "profile" is a meta-profile.
+ It is used for a custom minimal installation, without any desktop-specific packages.
+ """
diff --git a/profiles/xorg.py b/profiles/xorg.py
index 1282b8a5..e905d533 100644
--- a/profiles/xorg.py
+++ b/profiles/xorg.py
@@ -2,6 +2,8 @@
import archinstall, os
+is_top_level_profile = True
+
AVAILABLE_DRIVERS = {
# Sub-dicts are layer-2 options to be selected
# and lists are a list of packages to be installed