Fix 2307 - Custom mirrors (#2350)

* Fix 2307 - Custom mirrors

* Update
This commit is contained in:
Daniel Girtler 2024-03-08 00:43:16 +11:00 committed by GitHub
parent 21dd295259
commit f927fb6e6a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 63 additions and 56 deletions

View File

@ -15,7 +15,7 @@ from .hardware import SysInfo
from .locale import LocaleConfiguration from .locale import LocaleConfiguration
from .locale import verify_keyboard_layout, verify_x11_keyboard_layout from .locale import verify_keyboard_layout, verify_x11_keyboard_layout
from .luks import Luks2 from .luks import Luks2
from .mirrors import use_mirrors, MirrorConfiguration, add_custom_mirrors from .mirrors import MirrorConfiguration
from .models.bootloader import Bootloader from .models.bootloader import Bootloader
from .models.network_configuration import Nic from .models.network_configuration import Nic
from .models.users import User from .models.users import User
@ -318,17 +318,44 @@ class Installer:
def post_install_check(self, *args: str, **kwargs: str) -> List[str]: def post_install_check(self, *args: str, **kwargs: str) -> List[str]:
return [step for step, flag in self.helper_flags.items() if flag is False] return [step for step, flag in self.helper_flags.items() if flag is False]
def set_mirrors(self, mirror_config: MirrorConfiguration): def set_mirrors(self, mirror_config: MirrorConfiguration, on_target: bool = False):
"""
Set the mirror configuration for the installation.
:param mirror_config: The mirror configuration to use.
:type mirror_config: MirrorConfiguration
:on_target: Whether to set the mirrors on the target system or the live system.
:param on_target: bool
"""
debug('Setting mirrors')
for plugin in plugins.values(): for plugin in plugins.values():
if hasattr(plugin, 'on_mirrors'): if hasattr(plugin, 'on_mirrors'):
if result := plugin.on_mirrors(mirror_config): if result := plugin.on_mirrors(mirror_config):
mirror_config = result mirror_config = result
destination = f'{self.target}/etc/pacman.d/mirrorlist' if on_target:
if mirror_config.mirror_regions: local_pacman_conf = Path(f'{self.target}/etc/pacman.conf')
use_mirrors(mirror_config.mirror_regions, destination) local_mirrorlist_conf = Path(f'{self.target}/etc/pacman.d/mirrorlist')
if mirror_config.custom_mirrors: else:
add_custom_mirrors(mirror_config.custom_mirrors) local_pacman_conf = Path('/etc/pacman.conf')
local_mirrorlist_conf = Path('/etc/pacman.d/mirrorlist')
mirrorlist_config = mirror_config.mirrorlist_config()
pacman_config = mirror_config.pacman_config()
if pacman_config:
debug(f'Pacman config: {pacman_config}')
with local_pacman_conf.open('a') as fp:
fp.write(pacman_config)
if mirrorlist_config:
debug(f'Mirrorlist: {mirrorlist_config}')
with local_mirrorlist_conf.open('a') as fp:
fp.write(mirrorlist_config)
def genfstab(self, flags: str = '-pU'): def genfstab(self, flags: str = '-pU'):
fstab_path = self.target / "etc" / "fstab" fstab_path = self.target / "etc" / "fstab"

View File

@ -5,7 +5,7 @@ from typing import Dict, Any, List, Optional, TYPE_CHECKING
from .menu import AbstractSubMenu, Selector, MenuSelectionType, Menu, ListManager, TextInput from .menu import AbstractSubMenu, Selector, MenuSelectionType, Menu, ListManager, TextInput
from .networking import fetch_data_from_url from .networking import fetch_data_from_url
from .output import info, warn, FormattedOutput from .output import warn, FormattedOutput
from .storage import storage from .storage import storage
if TYPE_CHECKING: if TYPE_CHECKING:
@ -77,6 +77,28 @@ class MirrorConfiguration:
'custom_mirrors': [c.json() for c in self.custom_mirrors] 'custom_mirrors': [c.json() for c in self.custom_mirrors]
} }
def mirrorlist_config(self) -> str:
config = ''
for region, mirrors in self.mirror_regions.items():
for mirror in mirrors:
config += f'\n\n## {region}\nServer = {mirror}\n'
for cm in self.custom_mirrors:
config += f'\n\n## {cm.name}\nServer = {cm.url}\n'
return config
def pacman_config(self) -> str:
config = ''
for mirror in self.custom_mirrors:
config += f'\n\n[{mirror.name}]\n'
config += f'SigLevel = {mirror.sign_check.value} {mirror.sign_option.value}\n'
config += f'Server = {mirror.url}\n'
return config
@classmethod @classmethod
def parse_args(cls, args: Dict[str, Any]) -> 'MirrorConfiguration': def parse_args(cls, args: Dict[str, Any]) -> 'MirrorConfiguration':
config = MirrorConfiguration() config = MirrorConfiguration()
@ -273,33 +295,6 @@ def select_custom_mirror(prompt: str = '', preset: List[CustomMirror] = []):
return custom_mirrors return custom_mirrors
def add_custom_mirrors(mirrors: List[CustomMirror]):
"""
This will append custom mirror definitions in pacman.conf
:param mirrors: A list of custom mirrors
:type mirrors: List[CustomMirror]
"""
with open('/etc/pacman.conf', 'a') as pacman:
for mirror in mirrors:
pacman.write(f"\n\n[{mirror.name}]\n")
pacman.write(f"SigLevel = {mirror.sign_check.value} {mirror.sign_option.value}\n")
pacman.write(f"Server = {mirror.url}\n")
def use_mirrors(
regions: Dict[str, List[str]],
destination: str = '/etc/pacman.d/mirrorlist'
):
with open(destination, 'w') as fp:
for region, mirrors in regions.items():
for mirror in mirrors:
fp.write(f'## {region}\n')
fp.write(f'Server = {mirror}\n')
info(f'A new package mirror-list has been created: {destination}')
def _parse_mirror_list(mirrorlist: str) -> Dict[str, List[str]]: def _parse_mirror_list(mirrorlist: str) -> Dict[str, List[str]]:
file_content = mirrorlist.split('\n') file_content = mirrorlist.split('\n')
file_content = list(filter(lambda x: x, file_content)) # filter out empty lines file_content = list(filter(lambda x: x, file_content)) # filter out empty lines

View File

@ -10,7 +10,6 @@ from archinstall.lib.global_menu import GlobalMenu
from archinstall.lib.configuration import ConfigurationOutput from archinstall.lib.configuration import ConfigurationOutput
from archinstall.lib.installer import Installer from archinstall.lib.installer import Installer
from archinstall.lib.menu import Menu from archinstall.lib.menu import Menu
from archinstall.lib.mirrors import use_mirrors, add_custom_mirrors
from archinstall.lib.models import AudioConfiguration from archinstall.lib.models import AudioConfiguration
from archinstall.lib.models.bootloader import Bootloader from archinstall.lib.models.bootloader import Bootloader
from archinstall.lib.models.network_configuration import NetworkConfiguration from archinstall.lib.models.network_configuration import NetworkConfiguration
@ -132,12 +131,8 @@ def perform_installation(mountpoint: Path):
# generate encryption key files for the mounted luks devices # generate encryption key files for the mounted luks devices
installation.generate_key_files() installation.generate_key_files()
# Set mirrors used by pacstrap (outside of installation)
if mirror_config := archinstall.arguments.get('mirror_config', None): if mirror_config := archinstall.arguments.get('mirror_config', None):
if mirror_config.mirror_regions: installation.set_mirrors(mirror_config, on_target=False)
use_mirrors(mirror_config.mirror_regions)
if mirror_config.custom_mirrors:
add_custom_mirrors(mirror_config.custom_mirrors)
installation.minimal_installation( installation.minimal_installation(
testing=enable_testing, testing=enable_testing,
@ -148,7 +143,7 @@ def perform_installation(mountpoint: Path):
) )
if mirror_config := archinstall.arguments.get('mirror_config', None): if mirror_config := archinstall.arguments.get('mirror_config', None):
installation.set_mirrors(mirror_config) # Set the mirrors in the installation medium installation.set_mirrors(mirror_config, on_target=True)
if archinstall.arguments.get('swap'): if archinstall.arguments.get('swap'):
installation.setup_swap('zram') installation.setup_swap('zram')

View File

@ -4,7 +4,6 @@ from typing import TYPE_CHECKING, Any, Dict, Optional
import archinstall import archinstall
from archinstall import SysInfo, info, debug from archinstall import SysInfo, info, debug
from archinstall.lib import mirrors
from archinstall.lib import models from archinstall.lib import models
from archinstall.lib import disk from archinstall.lib import disk
from archinstall.lib import locale from archinstall.lib import locale
@ -188,12 +187,8 @@ def perform_installation(mountpoint: Path, exec_mode: ExecutionMode):
# generate encryption key files for the mounted luks devices # generate encryption key files for the mounted luks devices
installation.generate_key_files() installation.generate_key_files()
# Set mirrors used by pacstrap (outside of installation)
if mirror_config := archinstall.arguments.get('mirror_config', None): if mirror_config := archinstall.arguments.get('mirror_config', None):
if mirror_config.mirror_regions: installation.set_mirrors(mirror_config)
mirrors.use_mirrors(mirror_config.mirror_regions)
if mirror_config.custom_mirrors:
mirrors.add_custom_mirrors(mirror_config.custom_mirrors)
installation.minimal_installation( installation.minimal_installation(
testing=enable_testing, testing=enable_testing,
@ -203,7 +198,7 @@ def perform_installation(mountpoint: Path, exec_mode: ExecutionMode):
) )
if mirror_config := archinstall.arguments.get('mirror_config', None): if mirror_config := archinstall.arguments.get('mirror_config', None):
installation.set_mirrors(mirror_config) # Set the mirrors in the installation medium installation.set_mirrors(mirror_config, on_target=True)
if archinstall.arguments.get('swap'): if archinstall.arguments.get('swap'):
installation.setup_swap('zram') installation.setup_swap('zram')

View File

@ -5,7 +5,6 @@ import archinstall
from archinstall import Installer from archinstall import Installer
from archinstall import profile from archinstall import profile
from archinstall import SysInfo from archinstall import SysInfo
from archinstall import mirrors
from archinstall import disk from archinstall import disk
from archinstall import menu from archinstall import menu
from archinstall import models from archinstall import models
@ -109,12 +108,8 @@ def perform_installation(mountpoint: Path):
# generate encryption key files for the mounted luks devices # generate encryption key files for the mounted luks devices
installation.generate_key_files() installation.generate_key_files()
# Set mirrors used by pacstrap (outside of installation)
if mirror_config := archinstall.arguments.get('mirror_config', None): if mirror_config := archinstall.arguments.get('mirror_config', None):
if mirror_config.mirror_regions: installation.set_mirrors(mirror_config)
mirrors.use_mirrors(mirror_config.mirror_regions)
if mirror_config.custom_mirrors:
mirrors.add_custom_mirrors(mirror_config.custom_mirrors)
installation.minimal_installation( installation.minimal_installation(
testing=enable_testing, testing=enable_testing,
@ -124,7 +119,7 @@ def perform_installation(mountpoint: Path):
) )
if mirror_config := archinstall.arguments.get('mirror_config', None): if mirror_config := archinstall.arguments.get('mirror_config', None):
installation.set_mirrors(mirror_config) # Set the mirrors in the installation medium installation.set_mirrors(mirror_config, on_target=True)
if archinstall.arguments.get('swap'): if archinstall.arguments.get('swap'):
installation.setup_swap('zram') installation.setup_swap('zram')