Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall/default_profiles/profile.py
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2024-05-10 15:56:28 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2024-05-10 15:56:28 +0200
commit683da22298abbd90f51d4dd38a7ec4b0dfb04555 (patch)
treeec2ac04967f9277df038edc362201937b331abe5 /archinstall/default_profiles/profile.py
parentaf7ab9833c9f9944874f0162ae0975175ddc628d (diff)
parent3381cd55673e5105697d354cf4a1be9a7bcef062 (diff)
merged with upstreamHEADmaster
Diffstat (limited to 'archinstall/default_profiles/profile.py')
-rw-r--r--archinstall/default_profiles/profile.py205
1 files changed, 205 insertions, 0 deletions
diff --git a/archinstall/default_profiles/profile.py b/archinstall/default_profiles/profile.py
new file mode 100644
index 00000000..4c85b0c7
--- /dev/null
+++ b/archinstall/default_profiles/profile.py
@@ -0,0 +1,205 @@
+from __future__ import annotations
+
+from enum import Enum, auto
+from typing import List, Optional, Any, Dict, TYPE_CHECKING, TypeVar
+
+from archinstall.lib.utils.util import format_cols
+
+if TYPE_CHECKING:
+ from archinstall.lib.installer import Installer
+ _: Any
+
+
+TProfile = TypeVar('TProfile', bound='Profile')
+
+
+class ProfileType(Enum):
+ # top level default_profiles
+ Server = 'Server'
+ Desktop = 'Desktop'
+ Xorg = 'Xorg'
+ Minimal = 'Minimal'
+ Custom = 'Custom'
+ # detailed selection default_profiles
+ ServerType = 'ServerType'
+ WindowMgr = 'Window Manager'
+ DesktopEnv = 'Desktop Environment'
+ CustomType = 'CustomType'
+ # special things
+ Tailored = 'Tailored'
+ Application = 'Application'
+
+
+class GreeterType(Enum):
+ Lightdm = 'lightdm-gtk-greeter'
+ LightdmSlick = 'lightdm-slick-greeter'
+ Sddm = 'sddm'
+ Gdm = 'gdm'
+ Ly = 'ly'
+
+
+class SelectResult(Enum):
+ NewSelection = auto()
+ SameSelection = auto()
+ ResetCurrent = auto()
+
+
+class Profile:
+ def __init__(
+ self,
+ name: str,
+ profile_type: ProfileType,
+ description: str = '',
+ current_selection: List[TProfile] = [],
+ packages: List[str] = [],
+ services: List[str] = [],
+ support_gfx_driver: bool = False,
+ support_greeter: bool = False
+ ):
+ self.name = name
+ self.description = description
+ self.profile_type = profile_type
+ self.custom_settings: Dict[str, Any] = {}
+
+ self._support_gfx_driver = support_gfx_driver
+ self._support_greeter = support_greeter
+
+ # self.gfx_driver: Optional[str] = None
+
+ self._current_selection = current_selection
+ self._packages = packages
+ self._services = services
+
+ # Only used for custom default_profiles
+ self.custom_enabled = False
+
+ @property
+ def current_selection(self) -> List[TProfile]:
+ return self._current_selection
+
+ @property
+ def packages(self) -> List[str]:
+ """
+ Returns a list of packages that should be installed when
+ this profile is among the chosen ones
+ """
+ return self._packages
+
+ @property
+ def services(self) -> List[str]:
+ """
+ Returns a list of services that should be enabled when
+ this profile is among the chosen ones
+ """
+ return self._services
+
+ @property
+ def default_greeter_type(self) -> Optional[GreeterType]:
+ """
+ Setting a default greeter type for a desktop profile
+ """
+ return None
+
+ def install(self, install_session: 'Installer'):
+ """
+ Performs installation steps when this profile was selected
+ """
+
+ def post_install(self, install_session: 'Installer'):
+ """
+ Hook that will be called when the installation process is
+ finished and custom installation steps for specific default_profiles
+ are needed
+ """
+
+ def json(self) -> Dict:
+ """
+ Returns a json representation of the profile
+ """
+ return {}
+
+ def do_on_select(self) -> SelectResult:
+ """
+ Hook that will be called when a profile is selected
+ """
+ return SelectResult.NewSelection
+
+ def set_custom_settings(self, settings: Dict[str, Any]):
+ """
+ Set the custom settings for the profile.
+ This is also called when the settings are parsed from the config
+ and can be overridden to perform further actions based on the profile
+ """
+ self.custom_settings = settings
+
+ def current_selection_names(self) -> List[str]:
+ if self._current_selection:
+ return [s.name for s in self._current_selection]
+ return []
+
+ def reset(self):
+ self.set_current_selection([])
+
+ def set_current_selection(self, current_selection: List[TProfile]):
+ self._current_selection = current_selection
+
+ def is_top_level_profile(self) -> bool:
+ top_levels = [ProfileType.Desktop, ProfileType.Server, ProfileType.Xorg, ProfileType.Minimal, ProfileType.Custom]
+ return self.profile_type in top_levels
+
+ def is_desktop_profile(self) -> bool:
+ return self.profile_type == ProfileType.Desktop
+
+ def is_server_type_profile(self) -> bool:
+ return self.profile_type == ProfileType.ServerType
+
+ def is_desktop_type_profile(self) -> bool:
+ return self.profile_type == ProfileType.DesktopEnv or self.profile_type == ProfileType.WindowMgr
+
+ def is_xorg_type_profile(self) -> bool:
+ return self.profile_type == ProfileType.Xorg
+
+ def is_tailored(self) -> bool:
+ return self.profile_type == ProfileType.Tailored
+
+ def is_custom_type_profile(self) -> bool:
+ return self.profile_type == ProfileType.CustomType
+
+ def is_graphic_driver_supported(self) -> bool:
+ if not self._current_selection:
+ return self._support_gfx_driver
+ else:
+ if any([p._support_gfx_driver for p in self._current_selection]):
+ return True
+ return False
+
+ def is_greeter_supported(self) -> bool:
+ return self._support_greeter
+
+ def preview_text(self) -> Optional[str]:
+ """
+ Override this method to provide a preview text for the profile
+ """
+ return self.packages_text()
+
+ def packages_text(self, include_sub_packages: bool = False) -> Optional[str]:
+ header = str(_('Installed packages'))
+
+ text = ''
+ packages = []
+
+ if self.packages:
+ packages = self.packages
+
+ if include_sub_packages:
+ for p in self.current_selection:
+ if p.packages:
+ packages += p.packages
+
+ text += format_cols(sorted(set(packages)))
+
+ if text:
+ text = f'{header}: \n{text}'
+ return text
+
+ return None