Update some functions
Here are list of changes: - Added IP/subnet validation using Python's `ipaddress` module - Added workaround for network configuration modes where user can enter DHCP or IP without brackets. - Returned local printing options for some functions to keep `The above list...` - Moved booleans for `generic_select` below options and text parameters - Imported some functions from `archinstall` to reduce the`archinstall.` part of the lines. - Reduced variable name length for simplicity - Fixed some typos
This commit is contained in:
parent
a316846121
commit
d2eacffff8
|
|
@ -1,5 +1,5 @@
|
||||||
import getpass, pathlib, os, shutil, re
|
import getpass, pathlib, os, shutil, re
|
||||||
import sys, time, signal
|
import sys, time, signal, ipaddress
|
||||||
from .exceptions import *
|
from .exceptions import *
|
||||||
from .profiles import Profile
|
from .profiles import Profile
|
||||||
from .locale_helpers import search_keyboard_layout
|
from .locale_helpers import search_keyboard_layout
|
||||||
|
|
@ -164,13 +164,25 @@ def ask_to_configure_network():
|
||||||
if nic and nic != 'Copy ISO network configuration to installation':
|
if nic and nic != 'Copy ISO network configuration to installation':
|
||||||
if nic == 'Use NetworkManager to control and manage your internet connection':
|
if nic == 'Use NetworkManager to control and manage your internet connection':
|
||||||
return {'nic': nic,'NetworkManager':True}
|
return {'nic': nic,'NetworkManager':True}
|
||||||
mode = generic_select(['DHCP (auto detect)', 'IP (static)'], f"Select which mode to configure for {nic}: ")
|
|
||||||
if mode == 'IP (static)':
|
# Current workaround:
|
||||||
|
# For selecting modes without entering text within brackets,
|
||||||
|
# printing out this part separate from options, passed in
|
||||||
|
# `generic_select`
|
||||||
|
modes = ['DHCP (auto detect)', 'IP (static)']
|
||||||
|
for index, mode in enumerate(modes):
|
||||||
|
print(f"{index}: {mode}")
|
||||||
|
|
||||||
|
mode = generic_select(['DHCP', 'IP'], f"Select which mode to configure for {nic} or leave blank for DHCP: ",
|
||||||
|
options_output=False)
|
||||||
|
if mode == 'IP':
|
||||||
while 1:
|
while 1:
|
||||||
ip = input(f"Enter the IP and subnet for {nic} (example: 192.168.0.5/24): ").strip()
|
ip = input(f"Enter the IP and subnet for {nic} (example: 192.168.0.5/24): ").strip()
|
||||||
if ip:
|
# Implemented new check for correct IP/subnet input
|
||||||
|
try:
|
||||||
|
ipaddress.ip_interface(ip)
|
||||||
break
|
break
|
||||||
else:
|
except ValueError:
|
||||||
log(
|
log(
|
||||||
"You need to enter a valid IP in IP-config mode.",
|
"You need to enter a valid IP in IP-config mode.",
|
||||||
level=LOG_LEVELS.Warning,
|
level=LOG_LEVELS.Warning,
|
||||||
|
|
@ -180,6 +192,25 @@ def ask_to_configure_network():
|
||||||
if not len(gateway := input('Enter your gateway (router) IP address or leave blank for none: ').strip()):
|
if not len(gateway := input('Enter your gateway (router) IP address or leave blank for none: ').strip()):
|
||||||
gateway = None
|
gateway = None
|
||||||
|
|
||||||
|
# Assuming that gateway (router) IP address doesn't contain subnet,
|
||||||
|
# we can implement this check for it
|
||||||
|
# Implemented new check for correct IP input
|
||||||
|
|
||||||
|
#gateway = input('Enter your gateway (router) IP address or leave blank for none: ').strip()
|
||||||
|
#while 1:
|
||||||
|
# try:
|
||||||
|
# if len(gateway) == 0:
|
||||||
|
# gateway = None
|
||||||
|
# else:
|
||||||
|
# ipaddress.ip_address(gateway)
|
||||||
|
# break
|
||||||
|
# except ValueError:
|
||||||
|
# log(
|
||||||
|
# "You need to enter a valid gateway (router) IP address.",
|
||||||
|
# level=LOG_LEVELS.Warning,
|
||||||
|
# fg='red'
|
||||||
|
# )
|
||||||
|
|
||||||
dns = None
|
dns = None
|
||||||
if len(dns_input := input('Enter your DNS servers (space separated, blank for none): ').strip()):
|
if len(dns_input := input('Enter your DNS servers (space separated, blank for none): ').strip()):
|
||||||
dns = dns_input.split(' ')
|
dns = dns_input.split(' ')
|
||||||
|
|
@ -199,7 +230,8 @@ def ask_for_disk_layout():
|
||||||
'abort' : 'Abort the installation'
|
'abort' : 'Abort the installation'
|
||||||
}
|
}
|
||||||
|
|
||||||
value = generic_select(options, "Found partitions on the selected drive, (select by number) what you want to do: ", False)
|
value = generic_select(options, "Found partitions on the selected drive, (select by number) what you want to do: ",
|
||||||
|
allow_empty_input=False)
|
||||||
return next((key for key, val in options.items() if val == value), None)
|
return next((key for key, val in options.items() if val == value), None)
|
||||||
|
|
||||||
def ask_for_main_filesystem_format():
|
def ask_for_main_filesystem_format():
|
||||||
|
|
@ -210,7 +242,8 @@ def ask_for_main_filesystem_format():
|
||||||
'f2fs' : 'f2fs'
|
'f2fs' : 'f2fs'
|
||||||
}
|
}
|
||||||
|
|
||||||
value = generic_select(options, "Select which filesystem your main partition should use (by number or name): ", False)
|
value = generic_select(options, "Select which filesystem your main partition should use (by number or name): ",
|
||||||
|
allow_empty_input=False)
|
||||||
return next((key for key, val in options.items() if val == value), None)
|
return next((key for key, val in options.items() if val == value), None)
|
||||||
|
|
||||||
def generic_select(options, input_text="Select one of the above by index or absolute value: ", allow_empty_input=True, options_output=True):
|
def generic_select(options, input_text="Select one of the above by index or absolute value: ", allow_empty_input=True, options_output=True):
|
||||||
|
|
@ -231,7 +264,7 @@ def generic_select(options, input_text="Select one of the above by index or abso
|
||||||
if type(options) not in [list, dict]:
|
if type(options) not in [list, dict]:
|
||||||
log(" * It looks like there are something wrong with provided options. Maybe it's time to open an issue on GitHub! * ", fg='red')
|
log(" * It looks like there are something wrong with provided options. Maybe it's time to open an issue on GitHub! * ", fg='red')
|
||||||
log(" * Here are the link: https://github.com/archlinux/archinstall/issues * ", fg='yellow')
|
log(" * Here are the link: https://github.com/archlinux/archinstall/issues * ", fg='yellow')
|
||||||
raise RequirementError("generic_select() reqiures list or dictionary as options.")
|
raise RequirementError("generic_select() requires list or dictionary as options.")
|
||||||
if type(options) == dict: options = sorted(list(options.values())) # To allow only `list` and `dict`, converting values of options and sorting them here. Therefore, now we can only provide the dictionary itself
|
if type(options) == dict: options = sorted(list(options.values())) # To allow only `list` and `dict`, converting values of options and sorting them here. Therefore, now we can only provide the dictionary itself
|
||||||
if len(options) == 0:
|
if len(options) == 0:
|
||||||
log(" * It looks like there are no options to choose from. Maybe it's time to open an issue on GitHub! * ", fg='red')
|
log(" * It looks like there are no options to choose from. Maybe it's time to open an issue on GitHub! * ", fg='red')
|
||||||
|
|
@ -289,7 +322,8 @@ def select_disk(dict_o_disks):
|
||||||
if len(drives) >= 1:
|
if len(drives) >= 1:
|
||||||
for index, drive in enumerate(drives):
|
for index, drive in enumerate(drives):
|
||||||
print(f"{index}: {drive} ({dict_o_disks[drive]['size'], dict_o_disks[drive].device, dict_o_disks[drive]['label']})")
|
print(f"{index}: {drive} ({dict_o_disks[drive]['size'], dict_o_disks[drive].device, dict_o_disks[drive]['label']})")
|
||||||
drive = generic_select(drives, 'Select one of the above disks (by number or full path) or leave blank to skip partitioning: ', True, False)
|
drive = generic_select(drives, 'Select one of the above disks (by number or full path) or leave blank to skip partitioning: ',
|
||||||
|
options_output=False)
|
||||||
if not drive:
|
if not drive:
|
||||||
return drive
|
return drive
|
||||||
drive = dict_o_disks[drive]
|
drive = dict_o_disks[drive]
|
||||||
|
|
@ -311,10 +345,15 @@ def select_profile(options):
|
||||||
profiles = sorted(list(options))
|
profiles = sorted(list(options))
|
||||||
|
|
||||||
if len(profiles) >= 1:
|
if len(profiles) >= 1:
|
||||||
print(' -- The below list is a set of pre-programmed profiles. --')
|
for index, profile in enumerate(profiles):
|
||||||
print(' -- They might make it easier to install things like desktop environments. --')
|
print(f"{index}: {profile}")
|
||||||
|
|
||||||
selected_profile = generic_select(profiles, 'Enter a pre-programmed profile name if you want to install one or leave blank to skip this step: ')
|
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)
|
||||||
return Profile(None, selected_profile)
|
return Profile(None, selected_profile)
|
||||||
|
|
||||||
raise RequirementError("Selecting profiles require a least one profile to be given as an option.")
|
raise RequirementError("Selecting profiles require a least one profile to be given as an option.")
|
||||||
|
|
@ -350,7 +389,8 @@ def select_language(options, show_only_country_codes=True):
|
||||||
languages_length = len(languages)
|
languages_length = len(languages)
|
||||||
|
|
||||||
print(f' -- You can enter ? ({languages_length - 2}) or help ({languages_length - 1}) to search for more languages, or skip to use US layout --')
|
print(f' -- You can enter ? ({languages_length - 2}) or help ({languages_length - 1}) to search for more languages, or skip to use US layout --')
|
||||||
selected_language = generic_select(languages, 'Select one of the above keyboard languages (by number or full name): ', True, False)
|
selected_language = generic_select(languages, 'Select one of the above keyboard languages (by number or full name): ',
|
||||||
|
options_output=False)
|
||||||
|
|
||||||
if not selected_language:
|
if not selected_language:
|
||||||
return DEFAULT_KEYBOARD_LANGUAGE
|
return DEFAULT_KEYBOARD_LANGUAGE
|
||||||
|
|
@ -398,7 +438,8 @@ def select_mirror_regions(mirrors, show_top_mirrors=True):
|
||||||
print_large_list(regions, margin_bottom=4)
|
print_large_list(regions, margin_bottom=4)
|
||||||
|
|
||||||
print(' -- You can skip this step by leaving the option blank --')
|
print(' -- You can skip this step by leaving the option blank --')
|
||||||
selected_mirror = generic_select(regions, 'Select one of the above regions to download packages from (by number or full name): ', True, False)
|
selected_mirror = generic_select(regions, 'Select one of the above regions to download packages from (by number or full name): ',
|
||||||
|
options_output=False)
|
||||||
if not selected_mirror:
|
if not selected_mirror:
|
||||||
# Returning back empty options which can be both used to
|
# Returning back empty options which can be both used to
|
||||||
# do "if x:" logic as well as do `x.get('mirror', {}).get('sub', None)` chaining
|
# do "if x:" logic as well as do `x.get('mirror', {}).get('sub', None)` chaining
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,8 @@ def _prep_function(*args, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
supported_desktops = ['gnome', 'kde', 'awesome', 'sway', 'cinnamon', 'xfce4', 'lxqt', 'i3', 'budgie', 'mate']
|
supported_desktops = ['gnome', 'kde', 'awesome', 'sway', 'cinnamon', 'xfce4', 'lxqt', 'i3', 'budgie', 'mate']
|
||||||
desktop = archinstall.generic_select(supported_desktops, 'Select your desired desktop environment: ', False)
|
desktop = archinstall.generic_select(supported_desktops, 'Select your desired desktop environment: ',
|
||||||
|
allow_empty_input=False)
|
||||||
|
|
||||||
# Temporarily store the selected desktop profile
|
# Temporarily store the selected desktop profile
|
||||||
# in a session-safe location, since this module will get reloaded
|
# in a session-safe location, since this module will get reloaded
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,8 @@ def _prep_function(*args, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
supported_configurations = ['i3-wm', 'i3-gaps']
|
supported_configurations = ['i3-wm', 'i3-gaps']
|
||||||
desktop = archinstall.generic_select(supported_configurations, 'Select your desired configuration: ', False)
|
desktop = archinstall.generic_select(supported_configurations, 'Select your desired configuration: ',
|
||||||
|
allow_empty_input=False)
|
||||||
|
|
||||||
# Temporarily store the selected desktop profile
|
# Temporarily store the selected desktop profile
|
||||||
# in a session-safe location, since this module will get reloaded
|
# in a session-safe location, since this module will get reloaded
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
# A system with "xorg" installed
|
# A system with "xorg" installed
|
||||||
|
|
||||||
import archinstall, os
|
import os
|
||||||
|
from archinstall import generic_select, sys_command, RequirementError
|
||||||
|
|
||||||
is_top_level_profile = True
|
is_top_level_profile = True
|
||||||
|
|
||||||
|
|
@ -33,10 +34,13 @@ def select_driver(options):
|
||||||
drivers = sorted(list(options))
|
drivers = sorted(list(options))
|
||||||
|
|
||||||
if len(drivers) >= 1:
|
if len(drivers) >= 1:
|
||||||
print(' -- The below list are supported graphic card drivers. --')
|
for index, driver in enumerate(drivers):
|
||||||
|
print(f"{index}: {driver}")
|
||||||
|
|
||||||
|
print(' -- The above list are supported graphic card drivers. --')
|
||||||
print(' -- You need to select (and read about) which one you need. --')
|
print(' -- You need to select (and read about) which one you need. --')
|
||||||
|
|
||||||
lspci = archinstall.sys_command(f'/usr/bin/lspci')
|
lspci = sys_command(f'/usr/bin/lspci')
|
||||||
for line in lspci.trace_log.split(b'\r\n'):
|
for line in lspci.trace_log.split(b'\r\n'):
|
||||||
if b' vga ' in line.lower():
|
if b' vga ' in line.lower():
|
||||||
if b'nvidia' in line.lower():
|
if b'nvidia' in line.lower():
|
||||||
|
|
@ -44,7 +48,8 @@ def select_driver(options):
|
||||||
elif b'amd' in line.lower():
|
elif b'amd' in line.lower():
|
||||||
print(' ** AMD card detected, suggested driver: AMD / ATI **')
|
print(' ** AMD card detected, suggested driver: AMD / ATI **')
|
||||||
|
|
||||||
selected_driver = archinstall.generic_select(drivers, 'Select your graphics card driver: ', False)
|
selected_driver = generic_select(drivers, 'Select your graphics card driver: ',
|
||||||
|
allow_empty_input=False, options_output=False)
|
||||||
initial_option = selected_driver
|
initial_option = selected_driver
|
||||||
|
|
||||||
# Disabled search for now, only a few profiles exist anyway
|
# Disabled search for now, only a few profiles exist anyway
|
||||||
|
|
@ -60,14 +65,15 @@ def select_driver(options):
|
||||||
if type(selected_driver) == dict:
|
if type(selected_driver) == dict:
|
||||||
driver_options = sorted(list(selected_driver))
|
driver_options = sorted(list(selected_driver))
|
||||||
|
|
||||||
selected_driver_package_group = archinstall.generic_select(driver_options, f'Which driver-type do you want for {initial_option}: ', False)
|
driver_package_group = generic_select(driver_options, f'Which driver-type do you want for {initial_option}: ',
|
||||||
selected_driver_package_group = selected_driver[selected_driver_package_group]
|
allow_empty_input=False)
|
||||||
|
driver_package_group = selected_driver[driver_package_group]
|
||||||
|
|
||||||
return selected_driver_package_group
|
return driver_package_group
|
||||||
|
|
||||||
return selected_driver
|
return selected_driver
|
||||||
|
|
||||||
raise archinstall.RequirementError("Selecting drivers require a least one profile to be given as an option.")
|
raise RequirementError("Selecting drivers require a least one profile to be given as an option.")
|
||||||
|
|
||||||
def _prep_function(*args, **kwargs):
|
def _prep_function(*args, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue