Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md4
-rw-r--r--archinstall/__init__.py27
-rw-r--r--archinstall/lib/general.py4
-rw-r--r--archinstall/lib/installer.py3
-rw-r--r--archinstall/lib/user_interaction.py19
-rw-r--r--examples/guided.py33
6 files changed, 56 insertions, 34 deletions
diff --git a/README.md b/README.md
index 0aef2097..c9ca63fa 100644
--- a/README.md
+++ b/README.md
@@ -24,7 +24,7 @@ Or use `pip install --upgrade archinstall` to use as a library.
Assuming you are on an Arch Linux live-ISO and booted into EFI mode.
- # python -m archinstall --script guided
+ # archinstall
## Running from a declarative configuration file or URL
@@ -34,7 +34,7 @@ Prequisites:
Assuming you are on a Arch Linux live-ISO and booted into EFI mode.
- # python -m archinstall --config <path to config file or URL> --vars '<space_seperated KEY=VALUE pairs>'
+ # archinstall --config <path to config file or URL> [optional: --vars '<space_seperated KEY=VALUE pairs>']
# Help?
diff --git a/archinstall/__init__.py b/archinstall/__init__.py
index ee4748f6..b914c7ec 100644
--- a/archinstall/__init__.py
+++ b/archinstall/__init__.py
@@ -23,7 +23,7 @@ from .lib.user_interaction import *
parser = ArgumentParser()
-__version__ = "2.2.0.dev1"
+__version__ = "2.2.0.RC1"
def initialize_arguments():
@@ -32,16 +32,7 @@ def initialize_arguments():
parser.add_argument("--silent", action="store_true",
help="Warning!!! No prompts, ignored if config is not passed")
parser.add_argument("--script", default="guided", nargs="?", help="Script to run for installation", type=str)
- parser.add_argument("--vars",
- metavar="KEY=VALUE",
- nargs='?',
- help="Set a number of key-value pairs "
- "(do not put spaces before or after the = sign). "
- "If a value contains spaces, you should define "
- "it with double quotes: "
- 'foo="this is a sentence". Note that '
- "values are always treated as strings.")
- args = parser.parse_args()
+ args, unknowns = parser.parse_known_args()
if args.config is not None:
try:
# First, let's check if this is a URL scheme instead of a filename
@@ -57,13 +48,13 @@ def initialize_arguments():
print(e)
# Installation can't be silent if config is not passed
config["silent"] = args.silent
- if args.vars is not None:
- try:
- for var in args.vars.split(' '):
- key, val = var.split("=")
- config[key] = val
- except Exception as e:
- print(e)
+ for arg in unknowns:
+ if '--' == arg[:2]:
+ if '=' in arg:
+ key, val = [x.strip() for x in arg[2:].split('=', 1)]
+ else:
+ key, val = arg[2:], True
+ config[key] = val
config["script"] = args.script
return config
diff --git a/archinstall/lib/general.py b/archinstall/lib/general.py
index 249c7890..3b62c891 100644
--- a/archinstall/lib/general.py
+++ b/archinstall/lib/general.py
@@ -333,6 +333,10 @@ class SysCommand:
while self.session.ended is None:
self.session.poll()
+ if self.peak_output:
+ sys.stdout.write('\n')
+ sys.stdout.flush()
+
except SysCallError:
return False
diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py
index 29b3bc1a..1be398e9 100644
--- a/archinstall/lib/installer.py
+++ b/archinstall/lib/installer.py
@@ -453,6 +453,7 @@ class Installer:
self.pacstrap('efibootmgr')
o = b''.join(SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB'))
SysCommand('/usr/bin/arch-chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg')
+ self.helper_flags['bootloder'] = True
return True
else:
root_device = subprocess.check_output(f'basename "$(readlink -f /sys/class/block/{root_partition.path.replace("/dev/", "")}/..)"', shell=True).decode().strip()
@@ -460,7 +461,7 @@ class Installer:
root_device = f"{root_partition.path}"
o = b''.join(SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --target=i386-pc /dev/{root_device}'))
SysCommand('/usr/bin/arch-chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg')
- self.helper_flags['bootloader'] = bootloader
+ self.helper_flags['bootloader'] = True
return True
else:
raise RequirementError(f"Unknown (or not yet implemented) bootloader requested: {bootloader}")
diff --git a/archinstall/lib/user_interaction.py b/archinstall/lib/user_interaction.py
index 50c62aa9..0a4cd0f9 100644
--- a/archinstall/lib/user_interaction.py
+++ b/archinstall/lib/user_interaction.py
@@ -17,7 +17,7 @@ from .hardware import AVAILABLE_GFX_DRIVERS, has_uefi
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
+from .profiles import Profile, list_profiles
# TODO: Some inconsistencies between the selection processes.
@@ -563,28 +563,25 @@ def select_disk(dict_o_disks):
raise DiskError('select_disk() requires a non-empty dictionary of disks to select from.')
-def select_profile(options):
+def select_profile():
"""
- Asks the user to select a profile from the `options` dictionary parameter.
- Usually this is combined with :ref:`archinstall.list_profiles`.
-
- :param options: A `dict` where keys are the profile name, value should be a dict containing profile information.
- :type options: dict
+ Asks the user to select a profile from the available profiles.
:return: The name/dictionary key of the selected profile
:rtype: str
"""
- profiles = sorted(list(options))
+ shown_profiles = sorted(list(list_profiles(filter_top_level_profiles=True)))
+ actual_profiles_raw = shown_profiles + sorted([profile for profile in list_profiles() if profile not in shown_profiles])
- if len(profiles) >= 1:
- for index, profile in enumerate(profiles):
+ if len(shown_profiles) >= 1:
+ for index, profile in enumerate(shown_profiles):
print(f"{index}: {profile}")
print(' -- The above list is a set of pre-programmed profiles. --')
print(' -- They might make it easier to install things like desktop environments. --')
print(' -- (Leave blank and hit enter to skip this step and continue) --')
- selected_profile = generic_select(profiles, 'Enter a pre-programmed profile name if you want to install one: ', options_output=False)
+ selected_profile = generic_select(actual_profiles_raw, 'Enter a pre-programmed profile name if you want to install one: ', options_output=False)
if selected_profile:
return Profile(None, selected_profile)
else:
diff --git a/examples/guided.py b/examples/guided.py
index f61548e1..c3e5848b 100644
--- a/examples/guided.py
+++ b/examples/guided.py
@@ -12,6 +12,9 @@ from archinstall.lib.profiles import Profile
if archinstall.arguments.get('help'):
print("See `man archinstall` for help.")
exit(0)
+if os.getuid() != 0:
+ print("Archinstall requires root privileges to run. See --help for more.")
+ exit(1)
# For support reasons, we'll log the disk layout pre installation to match against post-installation layout
archinstall.log(f"Disk states before installing: {archinstall.disk_layouts()}", level=logging.DEBUG)
@@ -48,6 +51,17 @@ def ask_user_questions():
selected_region = archinstall.arguments['mirror-region']
archinstall.arguments['mirror-region'] = {selected_region: archinstall.list_mirrors()[selected_region]}
+ if not archinstall.arguments.get('sys-language', None) and archinstall.arguments.get('advanced', False):
+ archinstall.arguments['sys-language'] = input("Enter a valid locale (language) for your OS, (Default: en_US): ").strip()
+ archinstall.arguments['sys-encoding'] = input("Enter a valid system default encoding for your OS, (Default: utf-8): ").strip()
+ archinstall.log("Keep in mind that if you want multiple locales, post configuration is required.", fg="yellow")
+
+ if not archinstall.arguments.get('sys-language', None):
+ archinstall.arguments['sys-language'] = 'en_US'
+ if not archinstall.arguments.get('sys-encoding', None):
+ archinstall.arguments['sys-encoding'] = 'utf-8'
+
+
# Ask which harddrive/block-device we will install to
if archinstall.arguments.get('harddrive', None):
archinstall.arguments['harddrive'] = archinstall.BlockDevice(archinstall.arguments['harddrive'])
@@ -179,7 +193,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(filter_top_level_profiles=True))
+ archinstall.arguments['profile'] = archinstall.select_profile()
else:
archinstall.arguments['profile'] = Profile(installer=None, path=archinstall.arguments['profile'])
@@ -234,6 +248,12 @@ def ask_user_questions():
if not archinstall.arguments.get('timezone', None):
archinstall.arguments['timezone'] = archinstall.ask_for_a_timezone()
+ if archinstall.arguments['timezone']:
+ if not archinstall.arguments.get('ntp', False):
+ archinstall.arguments['ntp'] = input("Would you like to use automatic time synchronization (NTP) with the default time servers? [Y/n]: ").strip().lower() in ('y', 'yes')
+ if archinstall.arguments['ntp']:
+ archinstall.log("Hardware time and other post-configuration steps might be required in order for NTP to work. For more information, please check the Arch wiki.", fg="yellow")
+
def perform_installation_steps():
print()
@@ -319,6 +339,7 @@ def perform_installation(mountpoint):
if archinstall.arguments.get('mirror-region', None):
archinstall.use_mirrors(archinstall.arguments['mirror-region']) # Set the mirrors for the live medium
if installation.minimal_installation():
+ installation.set_locale(archinstall.arguments['sys-language'], archinstall.arguments['sys-encoding'].upper())
installation.set_hostname(archinstall.arguments['hostname'])
if archinstall.arguments['mirror-region'].get("mirrors", None) is not None:
installation.set_mirrors(archinstall.arguments['mirror-region']) # Set the mirrors in the installation medium
@@ -366,6 +387,9 @@ def perform_installation(mountpoint):
if timezone := archinstall.arguments.get('timezone', None):
installation.set_timezone(timezone)
+ if archinstall.arguments.get('ntp', False):
+ installation.activate_ntp()
+
if (root_pw := archinstall.arguments.get('!root-password', None)) and len(root_pw):
installation.user_set_pw('root', root_pw)
@@ -421,5 +445,10 @@ else:
archinstall.arguments['profile'] = archinstall.Profile(None, archinstall.arguments.get('profile', None))
else:
archinstall.arguments['profile'] = None
-
+ if archinstall.arguments.get('mirror-region', None) is not None:
+ selected_region = archinstall.arguments.get('mirror-region', None)
+ archinstall.arguments['mirror-region'] = {selected_region: archinstall.list_mirrors()[selected_region]}
+ archinstall.arguments['sys-language'] = archinstall.arguments.get('sys-language', 'en_US')
+ archinstall.arguments['sys-encoding'] = archinstall.arguments.get('sys-encoding', 'utf-8')
+
perform_installation_steps()