Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Hvornum <anton@hvornum.se>2021-06-14 16:05:19 +0200
committerAnton Hvornum <anton@hvornum.se>2021-06-14 16:05:19 +0200
commit00b1dfde6df8382ba18f1be8a63791a9d6f9fdaf (patch)
treec5d17e4ffc628670f32b88269533ac81743248d1
parent0c203384e0d9b856eb57b34b700f937e645920da (diff)
parent630dedadd115ff865a17811028f80dec96e18e0e (diff)
Merged in master
-rw-r--r--README.md2
-rw-r--r--archinstall/lib/networking.py1
-rw-r--r--archinstall/lib/profiles.py17
-rw-r--r--archinstall/lib/user_interaction.py54
-rw-r--r--examples/guided.py17
-rw-r--r--profiles/desktop.py34
6 files changed, 66 insertions, 59 deletions
diff --git a/README.md b/README.md
index c430ac0e..7876fdc9 100644
--- a/README.md
+++ b/README.md
@@ -149,7 +149,7 @@ After this, running archinstall with `python -m archinstall` will run against wh
To test this without a live ISO, the simplest approach is to use a local image and create a loop device.<br>
This can be done by installing `pacman -S arch-install-scripts util-linux` locally and doing the following:
- # dd if=/dev/zero of=./testimage.img bs=1G count=5
+ # truncate -s 20G testimage.img
# losetup -fP ./testimage.img
# losetup -a | grep "testimage.img" | awk -F ":" '{print $1}'
# pip install --upgrade archinstall
diff --git a/archinstall/lib/networking.py b/archinstall/lib/networking.py
index 64bcb58e..ded5ebe6 100644
--- a/archinstall/lib/networking.py
+++ b/archinstall/lib/networking.py
@@ -29,6 +29,7 @@ def list_interfaces(skip_loopback=True):
def check_mirror_reachable():
+ log("Testing connectivity to the Arch Linux mirrors ...", level=logging.INFO)
if (exit_code := SysCommand("pacman -Sy").exit_code) == 0:
return True
elif os.geteuid() != 0:
diff --git a/archinstall/lib/profiles.py b/archinstall/lib/profiles.py
index 8434a0ab..ebb08990 100644
--- a/archinstall/lib/profiles.py
+++ b/archinstall/lib/profiles.py
@@ -23,6 +23,23 @@ def grab_url_data(path):
return response.read()
+def is_desktop_profile(profile) -> bool:
+ if str(profile) == 'Profile(desktop)':
+ return True
+
+ desktop_profile = Profile(None, "desktop")
+ with open(desktop_profile.path, 'r') as source:
+ source_data = source.read()
+
+ if '__name__' in source_data and '__supported__' in source_data:
+ with desktop_profile.load_instructions(namespace=f"{desktop_profile.namespace}.py") as imported:
+ if hasattr(imported, '__supported__'):
+ desktop_profiles = imported.__supported__
+ return str(profile) in [f"Profile({s})" for s in desktop_profiles]
+
+ return False
+
+
def list_profiles(filter_irrelevant_macs=True, subpath='', filter_top_level_profiles=False):
# TODO: Grab from github page as well, not just local static files
if filter_irrelevant_macs:
diff --git a/archinstall/lib/user_interaction.py b/archinstall/lib/user_interaction.py
index 2903152f..c2ac7b33 100644
--- a/archinstall/lib/user_interaction.py
+++ b/archinstall/lib/user_interaction.py
@@ -12,11 +12,12 @@ import time
from .disk import BlockDevice, valid_fs_type, find_partition_by_mountpoint, suggest_single_disk_layout, suggest_multi_disk_layout
from .exceptions import *
from .general import SysCommand
-from .hardware import AVAILABLE_GFX_DRIVERS, has_uefi
+from .hardware import AVAILABLE_GFX_DRIVERS, has_uefi, has_amd_graphics, has_intel_graphics, has_nvidia_graphics
from .locale_helpers import list_keyboard_languages, verify_keyboard_layout, search_keyboard_layout
from .networking import list_interfaces
from .output import log
from .profiles import Profile, list_profiles
+from .storage import *
# TODO: Some inconsistencies between the selection processes.
# Some return the keys from the options, some the values?
@@ -389,11 +390,12 @@ def ask_for_bootloader() -> str:
return bootloader
-def ask_for_audio_selection():
- audio = "pulseaudio" # Default for most desktop environments
- pipewire_choice = input("Would you like to install pipewire instead of pulseaudio as the default audio server? [Y/n] ").lower()
- if pipewire_choice in ("y", ""):
- audio = "pipewire"
+def ask_for_audio_selection(desktop=True):
+ audio = 'pipewire' if desktop else 'none'
+ choices = ['pipewire', 'pulseaudio'] if desktop else ['pipewire', 'pulseaudio', 'none']
+ selection = generic_select(choices, f'Choose an audio server or leave blank to use {audio}: ', options_output=True)
+ if selection != "":
+ audio = selection
return audio
@@ -893,32 +895,22 @@ def select_driver(options=AVAILABLE_GFX_DRIVERS):
"""
drivers = sorted(list(options))
- default_option = options["All open-source (default)"]
-
+
if drivers:
- for line in SysCommand('/usr/bin/lspci'):
- if b' vga ' in line.lower():
- if b'nvidia' in line.lower():
- print(' ** nvidia card detected, suggested driver: nvidia **')
- elif b'amd' in line.lower():
- print(' ** AMD card detected, suggested driver: AMD / ATI **')
-
- initial_option = generic_select(drivers, input_text="Select your graphics card driver: ")
-
- if not initial_option:
- return default_option
-
- selected_driver = options[initial_option]
-
- if type(selected_driver) == dict:
- driver_options = sorted(list(selected_driver))
-
- driver_package_group = generic_select(driver_options, f'Which driver-type do you want for {initial_option}: ', allow_empty_input=False)
- driver_package_group = selected_driver[driver_package_group]
-
- return driver_package_group
-
- return selected_driver
+ arguments = storage.get('arguments', {})
+ if has_amd_graphics():
+ print('For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options.')
+ if has_intel_graphics():
+ print('For the best compatibility with your Intel hardware, you may want to use either the all open-source or Intel options.')
+ if has_nvidia_graphics():
+ print('For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.')
+
+ arguments['gfx_driver'] = generic_select(drivers, input_text="Select your graphics card driver: ")
+
+ if arguments.get('gfx_driver', None) is None:
+ arguments['gfx_driver'] = "All open-source (default)"
+
+ return options.get(arguments.get('gfx_driver'))
raise RequirementError("Selecting drivers require a least one profile to be given as an option.")
diff --git a/examples/guided.py b/examples/guided.py
index 4136ca6e..0d409657 100644
--- a/examples/guided.py
+++ b/examples/guided.py
@@ -7,7 +7,7 @@ import archinstall
from archinstall.lib.general import run_custom_user_commands
from archinstall.lib.hardware import *
from archinstall.lib.networking import check_mirror_reachable
-from archinstall.lib.profiles import Profile
+from archinstall.lib.profiles import Profile, is_desktop_profile
if archinstall.arguments.get('help'):
print("See `man archinstall` for help.")
@@ -136,13 +136,8 @@ def ask_user_questions():
# Ask about audio server selection if one is not already set
if not archinstall.arguments.get('audio', None):
- # only ask for audio server selection on a desktop profile
- if str(archinstall.arguments['profile']) == 'Profile(desktop)':
- archinstall.arguments['audio'] = archinstall.ask_for_audio_selection()
- else:
- # packages installed by a profile may depend on audio and something may get installed anyways, not much we can do about that.
- # we will not try to remove packages post-installation to not have audio, as that may cause multiple issues
- archinstall.arguments['audio'] = None
+ # The argument to ask_for_audio_selection lets the library know if it's a desktop profile
+ archinstall.arguments['audio'] = archinstall.ask_for_audio_selection(is_desktop_profile(archinstall.arguments['profile']))
# Ask for preferred kernel:
@@ -196,10 +191,10 @@ def perform_filesystem_operations():
with open("/var/log/archinstall/user_configuration.json", "w") as config_file:
config_file.write(user_configuration)
print()
-
+
if archinstall.arguments.get('dry_run'):
exit(0)
-
+
if not archinstall.arguments.get('silent'):
input('Press Enter to continue.')
@@ -340,7 +335,7 @@ if not check_mirror_reachable():
archinstall.log(f"Arch Linux mirrors are not reachable. Please check your internet connection and the log file '{log_file}'.", level=logging.INFO, fg="red")
exit(1)
-if archinstall.arguments.get('silent', None) is None:
+if not archinstall.arguments.get('silent'):
ask_user_questions()
else:
# Workarounds if config is loaded from a file
diff --git a/profiles/desktop.py b/profiles/desktop.py
index 73df9256..eaf145c2 100644
--- a/profiles/desktop.py
+++ b/profiles/desktop.py
@@ -21,6 +21,21 @@ __packages__ = [
'xdg-utils',
]
+__supported__ = [
+ 'gnome',
+ 'kde',
+ 'awesome',
+ 'sway',
+ 'cinnamon',
+ 'xfce4',
+ 'lxqt',
+ 'i3',
+ 'budgie',
+ 'mate',
+ 'deepin',
+ 'enlightenment',
+]
+
def _prep_function(*args, **kwargs):
"""
@@ -30,22 +45,7 @@ def _prep_function(*args, **kwargs):
for more input before any other installer steps start.
"""
- supported_desktops = [
- 'gnome',
- 'kde',
- 'awesome',
- 'sway',
- 'cinnamon',
- 'xfce4',
- 'lxqt',
- 'i3',
- 'budgie',
- 'mate',
- 'deepin',
- 'enlightenment',
- ]
-
- desktop = archinstall.generic_select(supported_desktops, 'Select your desired desktop environment: ', allow_empty_input=False, sort=True)
+ desktop = archinstall.generic_select(__supported__, 'Select your desired desktop environment: ', allow_empty_input=False, sort=True)
# Temporarily store the selected desktop profile
# in a session-safe location, since this module will get reloaded
@@ -54,6 +54,8 @@ def _prep_function(*args, **kwargs):
archinstall.storage['_desktop_profile'] = desktop
profile = archinstall.Profile(None, desktop)
+ # Set the resolved profile path to the actual desktop environment
+ archinstall.arguments['profile'] = profile
# Loading the instructions with a custom namespace, ensures that a __name__ comparison is never triggered.
with profile.load_instructions(namespace=f"{desktop}.py") as imported:
if hasattr(imported, '_prep_function'):