Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Hvornum <anton.feeds+github@gmail.com>2020-10-18 13:31:54 +0200
committerGitHub <noreply@github.com>2020-10-18 13:31:54 +0200
commit7dd38f167b05b413ad14e5e8a837a23490c0989e (patch)
treeadaf3b046fb4ee3fba6c083b4217ceec1ad42058
parentb6c5942da69e5eeb3db60f1af40e9f33db6800e9 (diff)
parenta69e1af4f1b13e0a47d4dc634c03b5bc383b9adc (diff)
Merge pull request #53 from Torxed/guided
Implemented early package-name-checks for guided.py
-rw-r--r--archinstall/lib/packages.py18
-rw-r--r--archinstall/lib/user_interaction.py8
-rw-r--r--examples/guided.py26
3 files changed, 43 insertions, 9 deletions
diff --git a/archinstall/lib/packages.py b/archinstall/lib/packages.py
index 3a671784..2f5ebe94 100644
--- a/archinstall/lib/packages.py
+++ b/archinstall/lib/packages.py
@@ -1,5 +1,6 @@
import urllib.request, urllib.parse
import ssl, json
+from .exceptions import *
BASE_URL = 'https://www.archlinux.org/packages/search/json/?name={package}'
@@ -24,4 +25,19 @@ def find_packages(*names):
result = {}
for package in names:
result[package] = find_package(package)
- return result \ No newline at end of file
+ return result
+
+def validate_package_list(packages :list):
+ """
+ Validates a list of given packages.
+ Raises `RequirementError` if one or more packages are not found.
+ """
+ invalid_packages = []
+ for package in packages:
+ if not find_package(package)['results']:
+ invalid_packages.append(package)
+
+ if invalid_packages:
+ raise RequirementError(f"Invalid package names: {invalid_packages}")
+
+ return True \ No newline at end of file
diff --git a/archinstall/lib/user_interaction.py b/archinstall/lib/user_interaction.py
index e01859b3..0d3a12f5 100644
--- a/archinstall/lib/user_interaction.py
+++ b/archinstall/lib/user_interaction.py
@@ -81,11 +81,9 @@ def select_profile(options):
print(' -- (Leave blank to skip this next optional step) --')
selected_profile = input('Any particular pre-programmed profile you want to install: ')
- #print(' -- You can enter ? or help to search for more profiles --')
- #if selected_profile.lower() in ('?', 'help'):
- # filter_string = input('Search for layout containing (example: "sv-"): ')
- # new_options = search_keyboard_layout(filter_string)
- # return select_language(new_options)
+ if len(selected_profile.strip()) <= 0:
+ return None
+
if selected_profile.isdigit() and (pos := int(selected_profile)) <= len(profiles)-1:
selected_profile = profiles[pos]
elif selected_profile in options:
diff --git a/examples/guided.py b/examples/guided.py
index dcc8279c..30514a71 100644
--- a/examples/guided.py
+++ b/examples/guided.py
@@ -24,7 +24,7 @@ def perform_installation(device, boot_partition, language, mirrors):
if len(packages) and packages[0] != '':
installation.add_additional_packages(packages)
- if len(profile.strip()):
+ if profile and len(profile.strip()):
installation.install_profile(profile)
for user, password in users.items():
@@ -53,6 +53,7 @@ archinstall.set_keyboard_language(keyboard_language)
# Set which region to download packages from during the installation
mirror_regions = archinstall.select_mirror_regions(archinstall.list_mirrors())
+# Ask which harddrive/block-device we will install to
harddrive = archinstall.select_disk(archinstall.all_disks())
while (disk_password := getpass.getpass(prompt='Enter disk encryption password (leave blank for no encryption): ')):
disk_password_verification = getpass.getpass(prompt='And one more time for verification: ')
@@ -61,9 +62,11 @@ while (disk_password := getpass.getpass(prompt='Enter disk encryption password (
continue
break
+# Ask for a hostname
hostname = input('Desired hostname for the installation: ')
if len(hostname) == 0: hostname = 'ArchInstall'
+# Ask for a root password (optional, but triggers requirement for super-user if skipped)
while (root_pw := getpass.getpass(prompt='Enter root password (leave blank to leave root disabled): ')):
root_pw_verification = getpass.getpass(prompt='And one more time for verification: ')
if root_pw != root_pw_verification:
@@ -71,6 +74,7 @@ while (root_pw := getpass.getpass(prompt='Enter root password (leave blank to le
continue
break
+# Ask for additional users (super-user if root pw was not set)
users = {}
new_user_text = 'Any additional users to install (leave blank for no users): '
if len(root_pw.strip()) == 0:
@@ -92,9 +96,10 @@ while 1:
users[new_user] = new_user_passwd
break
+# Ask for archinstall-specific profiles (such as desktop environments etc)
while 1:
profile = archinstall.select_profile(archinstall.list_profiles())
- if type(profile) != str: # Got a imported profile
+ if profile and type(profile) != str: # Got a imported profile
if not profile[1]._prep_function():
archinstall.log(' * Profile\'s preperation requirements was not fulfilled.', bg='black', fg='red')
continue
@@ -103,7 +108,22 @@ while 1:
else:
break
-packages = input('Additional packages aside from base (space separated): ').split(' ')
+# Additional packages (with some light weight error handling for invalid package names)
+while 1:
+ packages = [package for package in input('Additional packages aside from base (space separated): ').split(' ') if len(package)]
+
+ if not packages:
+ break
+
+ try:
+ if archinstall.validate_package_list(packages):
+ break
+ except archinstall.RequirementError as e:
+ print(e)
+
+# TODO: Print a summary here of all the options chosen.
+# Ideally, archinstall should keep track of this internally
+# and there should be something like print(archinstall.config).
"""
Issue a final warning before we continue with something un-revertable.