Skip to content

Commit

Permalink
Fix 2307 - Custom mirrors
Browse files Browse the repository at this point in the history
  • Loading branch information
svartkanin committed Jan 28, 2024
1 parent f107104 commit b7ba7e2
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 56 deletions.
24 changes: 17 additions & 7 deletions archinstall/lib/installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from .locale import LocaleConfiguration
from .locale import verify_keyboard_layout, verify_x11_keyboard_layout
from .luks import Luks2
from .mirrors import use_mirrors, MirrorConfiguration, add_custom_mirrors
from .mirrors import MirrorConfiguration
from .models.bootloader import Bootloader
from .models.network_configuration import Nic
from .models.users import User
Expand Down Expand Up @@ -318,17 +318,27 @@ def add_swapfile(self, size='4G', enable_resume=True, file='/swapfile'):
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]

def set_mirrors(self, mirror_config: MirrorConfiguration):
def set_local_mirrors(self, mirror_config: MirrorConfiguration):
local_pacman_conf = Path('/etc/pacman.conf')

if mirror_config.custom_mirrors:
config = mirror_config.custom_mirrors_to_config()

with local_pacman_conf.open('a') as fp:
fp.write(config)

def set_target_mirrors(self, mirror_config: MirrorConfiguration):
for plugin in plugins.values():
if hasattr(plugin, 'on_mirrors'):
if result := plugin.on_mirrors(mirror_config):
mirror_config = result

destination = f'{self.target}/etc/pacman.d/mirrorlist'
if mirror_config.mirror_regions:
use_mirrors(mirror_config.mirror_regions, destination)
if mirror_config.custom_mirrors:
add_custom_mirrors(mirror_config.custom_mirrors)
target_mirror_conf = Path(f'{self.target}/etc/pacman.d/mirrorlist')
mirror_list_config = mirror_config.mirror_list_config()

if mirror_list_config:
with target_mirror_conf.open('a') as fp:
fp.write(mirror_list_config)

def genfstab(self, flags: str = '-pU'):
fstab_path = self.target / "etc" / "fstab"
Expand Down
54 changes: 26 additions & 28 deletions archinstall/lib/mirrors.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from .menu import AbstractSubMenu, Selector, MenuSelectionType, Menu, ListManager, TextInput
from .networking import fetch_data_from_url
from .output import info, warn, FormattedOutput
from .output import warn, FormattedOutput
from .storage import storage

if TYPE_CHECKING:
Expand Down Expand Up @@ -77,6 +77,31 @@ def json(self) -> Dict[str, Any]:
'custom_mirrors': [c.json() for c in self.custom_mirrors]
}

def _server_config(self, name: str, url: str) -> str:
return f'\n\n## {name}\nServer = {url}'

def mirror_list_config(self) -> str:
config = ''

for region, mirrors in self.mirror_regions.items():
for mirror in mirrors:
config += self._server_config(region, mirror)

for cm in self.custom_mirrors:
config += self._server_config(cm.name, cm.url)

return config

def custom_mirrors_to_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}'

return config

@classmethod
def parse_args(cls, args: Dict[str, Any]) -> 'MirrorConfiguration':
config = MirrorConfiguration()
Expand Down Expand Up @@ -273,33 +298,6 @@ def select_custom_mirror(prompt: str = '', preset: List[CustomMirror] = []):
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]]:
file_content = mirrorlist.split('\n')
file_content = list(filter(lambda x: x, file_content)) # filter out empty lines
Expand Down
9 changes: 2 additions & 7 deletions archinstall/scripts/guided.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
from archinstall.lib.configuration import ConfigurationOutput
from archinstall.lib.installer import Installer
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.bootloader import Bootloader
from archinstall.lib.models.network_configuration import NetworkConfiguration
Expand Down Expand Up @@ -132,12 +131,8 @@ def perform_installation(mountpoint: Path):
# generate encryption key files for the mounted luks devices
installation.generate_key_files()

# Set mirrors used by pacstrap (outside of installation)
if mirror_config := archinstall.arguments.get('mirror_config', None):
if mirror_config.mirror_regions:
use_mirrors(mirror_config.mirror_regions)
if mirror_config.custom_mirrors:
add_custom_mirrors(mirror_config.custom_mirrors)
installation.set_local_mirrors(mirror_config)

installation.minimal_installation(
testing=enable_testing,
Expand All @@ -148,7 +143,7 @@ def perform_installation(mountpoint: Path):
)

if mirror_config := archinstall.arguments.get('mirror_config', None):
installation.set_mirrors(mirror_config) # Set the mirrors in the installation medium
installation.set_target_mirrors(mirror_config)

if archinstall.arguments.get('swap'):
installation.setup_swap('zram')
Expand Down
9 changes: 2 additions & 7 deletions archinstall/scripts/swiss.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import archinstall
from archinstall import SysInfo, info, debug
from archinstall.lib import mirrors
from archinstall.lib import models
from archinstall.lib import disk
from archinstall.lib import locale
Expand Down Expand Up @@ -188,12 +187,8 @@ def perform_installation(mountpoint: Path, exec_mode: ExecutionMode):
# generate encryption key files for the mounted luks devices
installation.generate_key_files()

# Set mirrors used by pacstrap (outside of installation)
if mirror_config := archinstall.arguments.get('mirror_config', None):
if mirror_config.mirror_regions:
mirrors.use_mirrors(mirror_config.mirror_regions)
if mirror_config.custom_mirrors:
mirrors.add_custom_mirrors(mirror_config.custom_mirrors)
installation.set_local_mirrors(mirror_config)

installation.minimal_installation(
testing=enable_testing,
Expand All @@ -203,7 +198,7 @@ def perform_installation(mountpoint: Path, exec_mode: ExecutionMode):
)

if mirror_config := archinstall.arguments.get('mirror_config', None):
installation.set_mirrors(mirror_config) # Set the mirrors in the installation medium
installation.set_target_mirrors(mirror_config)

if archinstall.arguments.get('swap'):
installation.setup_swap('zram')
Expand Down
9 changes: 2 additions & 7 deletions examples/interactive_installation.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from archinstall import Installer
from archinstall import profile
from archinstall import SysInfo
from archinstall import mirrors
from archinstall import disk
from archinstall import menu
from archinstall import models
Expand Down Expand Up @@ -109,12 +108,8 @@ def perform_installation(mountpoint: Path):
# generate encryption key files for the mounted luks devices
installation.generate_key_files()

# Set mirrors used by pacstrap (outside of installation)
if mirror_config := archinstall.arguments.get('mirror_config', None):
if mirror_config.mirror_regions:
mirrors.use_mirrors(mirror_config.mirror_regions)
if mirror_config.custom_mirrors:
mirrors.add_custom_mirrors(mirror_config.custom_mirrors)
installation.set_local_mirrors(mirror_config)

installation.minimal_installation(
testing=enable_testing,
Expand All @@ -124,7 +119,7 @@ def perform_installation(mountpoint: Path):
)

if mirror_config := archinstall.arguments.get('mirror_config', None):
installation.set_mirrors(mirror_config) # Set the mirrors in the installation medium
installation.set_target_mirrors(mirror_config)

if archinstall.arguments.get('swap'):
installation.setup_swap('zram')
Expand Down

0 comments on commit b7ba7e2

Please sign in to comment.