Added more offline functionality, such as skipping package search (#1296)

* Added more offline functionality, such as skipping package search

* Disabled list_mirrors() from going online if --offline is given. Defaults to /etc/pacman.d/mirrorlist instead.

* Forgot import of pathlib

* Made list_mirrors() open /etc/pacman.d/mirrorlist in byte mode to better emulate the result of urllib response reading.

* Forgot variable declaration

* Made list_mirrors include activated server definitions
This commit is contained in:
Anton Hvornum 2022-06-02 13:32:42 +02:00 committed by GitHub
parent c2be07e7dc
commit 7943dd8236
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 25 deletions

View File

@ -81,6 +81,8 @@ def define_arguments():
parser.add_argument("--script", default="guided", nargs="?", help="Script to run for installation", type=str)
parser.add_argument("--mount-point","--mount_point", nargs="?", type=str, help="Define an alternate mount point for installation")
parser.add_argument("--debug", action="store_true", default=False, help="Adds debug info into the log")
parser.add_argument("--offline", action="store_true", default=False, help="Disabled online upstream services such as package search and key-ring auto update.")
parser.add_argument("--no-pkg-lookups", action="store_true", default=False, help="Disabled package validation specifically prior to starting installation.")
parser.add_argument("--plugin", nargs="?", type=str)
def parse_unspecified_argument_list(unknowns :list, multiple :bool = False, error :bool = False) -> dict:
@ -172,6 +174,7 @@ def get_arguments() -> Dict[str, Any]:
# avoiding a compatibility issue
if 'dry-run' in config:
del config['dry-run']
return config
def load_config():

View File

@ -1,10 +1,12 @@
import logging
import pathlib
import urllib.error
import urllib.request
from typing import Union, Mapping, Iterable, Dict, Any, List
from .general import SysCommand
from .output import log
from .storage import storage
def sort_mirrorlist(raw_data :bytes, sort_order=["https", "http"]) -> bytes:
"""
@ -144,16 +146,22 @@ def re_rank_mirrors(
def list_mirrors(sort_order :List[str] = ["https", "http"]) -> Dict[str, Any]:
url = "https://archlinux.org/mirrorlist/?protocol=https&protocol=http&ip_version=4&ip_version=6&use_mirror_status=on"
regions = {}
try:
response = urllib.request.urlopen(url)
except urllib.error.URLError as err:
log(f'Could not fetch an active mirror-list: {err}', level=logging.WARNING, fg="orange")
return regions
if storage['arguments']['offline']:
with pathlib.Path('/etc/pacman.d/mirrorlist').open('rb') as fh:
mirrorlist = fh.read()
else:
url = "https://archlinux.org/mirrorlist/?protocol=https&protocol=http&ip_version=4&ip_version=6&use_mirror_status=on"
try:
response = urllib.request.urlopen(url)
except urllib.error.URLError as err:
log(f'Could not fetch an active mirror-list: {err}', level=logging.WARNING, fg="orange")
return regions
mirrorlist = response.read()
mirrorlist = response.read()
if sort_order:
mirrorlist = sort_mirrorlist(mirrorlist, sort_order=sort_order)
@ -170,5 +178,10 @@ def list_mirrors(sort_order :List[str] = ["https", "http"]) -> Dict[str, Any]:
url = line.lstrip('#Server = ')
regions[region][url] = True
elif line.startswith('Server = '):
regions.setdefault(region, {})
url = line.lstrip('Server = ')
regions[region][url] = True
return regions

View File

@ -3,8 +3,6 @@ from __future__ import annotations
import logging
from typing import List, Any, Optional, Dict, TYPE_CHECKING
import archinstall
from ..menu.menu import MenuSelectionType
from ..menu.text_input import TextInput
@ -17,6 +15,8 @@ from ..mirrors import list_mirrors
from ..translation import Translation
from ..packages.packages import validate_package_list
from ..storage import storage
if TYPE_CHECKING:
_: Any
@ -155,11 +155,11 @@ def select_profile(preset) -> Optional[Profile]:
case MenuSelectionType.Selection:
return options[selection.value] if selection.value is not None else None
case MenuSelectionType.Ctrl_c:
archinstall.storage['profile_minimal'] = False
archinstall.storage['_selected_servers'] = []
archinstall.storage['_desktop_profile'] = None
archinstall.arguments['desktop-environment'] = None
archinstall.arguments['gfx_driver_packages'] = None
storage['profile_minimal'] = False
storage['_selected_servers'] = []
storage['_desktop_profile'] = None
storage['arguments']['desktop-environment'] = None
storage['arguments']['gfx_driver_packages'] = None
return None
case MenuSelectionType.Esc:
return None
@ -178,17 +178,18 @@ def ask_additional_packages_to_install(pre_set_packages: List[str] = []) -> List
pre_set_packages = pre_set_packages if pre_set_packages else []
packages = read_packages(pre_set_packages)
while True:
if len(packages):
# Verify packages that were given
print(_("Verifying that additional packages exist (this might take a few seconds)"))
valid, invalid = validate_package_list(packages)
if not storage['arguments']['offline'] and not storage['arguments']['no_pkg_lookups']:
while True:
if len(packages):
# Verify packages that were given
print(_("Verifying that additional packages exist (this might take a few seconds)"))
valid, invalid = validate_package_list(packages)
if invalid:
log(f"Some packages could not be found in the repository: {invalid}", level=logging.WARNING, fg='red')
packages = read_packages(valid)
continue
break
if invalid:
log(f"Some packages could not be found in the repository: {invalid}", level=logging.WARNING, fg='red')
packages = read_packages(valid)
continue
break
return packages

View File

@ -274,7 +274,7 @@ if not (archinstall.check_mirror_reachable() or archinstall.arguments.get('skip-
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 not archinstall.arguments.get('offline', False):
if not archinstall.arguments['offline']:
latest_version_archlinux_keyring = max([k.pkg_version for k in archinstall.find_package('archlinux-keyring')])
# If we want to check for keyring updates