diff --git a/builder/build/filesystem.py b/builder/build/filesystem.py index a0145ba..a86b492 100644 --- a/builder/build/filesystem.py +++ b/builder/build/filesystem.py @@ -139,7 +139,7 @@ def add_file(ctx: ArchBuilderContext, file: dict): src = os.path.join(ctx.dir, src) log.debug(f"copy {src} to {real}") if folder: - shutil.copytree(src, real, symlinks=follow) + shutil.copytree(src, real, symlinks=follow, dirs_exist_ok=True) else: shutil.copyfile(src, real, follow_symlinks=follow) else: diff --git a/builder/component/pacman.py b/builder/component/pacman.py index 5108277..c4d0120 100644 --- a/builder/component/pacman.py +++ b/builder/component/pacman.py @@ -52,17 +52,23 @@ class PacmanRepo(SerializableDict): name: str = None priority: int = 10000 servers: list[PacmanRepoServer] = None + publickey: str = None + keyid: str = None def __init__( self, name: str = None, priority: int = None, - servers: list[PacmanRepoServer] = None + servers: list[PacmanRepoServer] = None, + publickey: str = None, + keyid: str = None ): if name is not None: self.name = name if priority is not None: self.priority = priority if servers is not None: self.servers = servers else: self.servers = [] + if publickey is not None: self.publickey = publickey + if keyid is not None: self.keyid = keyid def add_server( self, @@ -136,6 +142,19 @@ class Pacman: log.info("initializing pacman keyring") self.pacman_key(["--init"]) + # Download and add public keys + for repo in self.repos: + if repo.publickey is not None: + keypath = os.path.join(self.ctx.work, f"{repo.name}.pub") + cmds = ["wget", repo.publickey, "-O", keypath] + ret = self.ctx.run_external(cmds) + if ret != 0: raise OSError(f"wget failed with {ret}") + self.pacman_key(["--add", keypath]) + self.lsign_key(repo.keyid) + elif repo.keyid is not None: + self.recv_keys(repo.keyid) + self.lsign_key(repo.keyid) + def init_config(self): """ Create host pacman.conf @@ -282,6 +301,16 @@ class Pacman: if "priority" in repo: pacman_repo.priority = repo["priority"] + # add public key url and id + if "publickey" in repo and "keyid" not in repo: + raise ArchBuilderConfigError("publickey is provided without keyid") + + if "publickey" in repo: + pacman_repo.publickey = repo["publickey"] + + if "keyid" in repo: + pacman_repo.keyid = repo["keyid"] + originals: list[str] = [] servers: list[str] = [] diff --git a/configs/common/pacman-init.yaml b/configs/common/pacman-init.yaml new file mode 100644 index 0000000..d889090 --- /dev/null +++ b/configs/common/pacman-init.yaml @@ -0,0 +1,17 @@ +filesystem: + files: + - path: /etc/systemd/system/pacman-init.service + content: | + [Unit] + Description=Initializes Pacman keyring + Requires=etc-pacman.d-gnupg.mount + After=etc-pacman.d-gnupg.mount time-sync.target + BindsTo=etc-pacman.d-gnupg.mount + Before=archlinux-keyring-wkd-sync.service + [Service] + Type=oneshot + RemainAfterExit=yes + ExecStart=/usr/bin/pacman-key --init + ExecStart=/usr/bin/pacman-key --populate + [Install] + WantedBy=multi-user.target diff --git a/configs/desktop/plasma.yaml b/configs/desktop/plasma.yaml index c5a518d..7294565 100644 --- a/configs/desktop/plasma.yaml +++ b/configs/desktop/plasma.yaml @@ -2,6 +2,8 @@ pacman: install: - plasma + - konsole + - dolphin - sddm - packagekit-qt6 systemd: @@ -17,3 +19,4 @@ filesystem: +also: # Ensure NetworkManager is enabled - packages/network-manager +- packages/firefox diff --git a/configs/locale/en-US.yaml b/configs/locale/en-US.yaml new file mode 100644 index 0000000..23b403e --- /dev/null +++ b/configs/locale/en-US.yaml @@ -0,0 +1,29 @@ +# I18N for English (US) +locale: + enable: + - "en_US.UTF-8 UTF-8" + default: en_US.UTF-8 + +filesystem: + files: + # Wireless regulatory + - path: /etc/conf.d/wireless-regdom + content: | + WIRELESS_REGDOM="US" + # Windows NTP Server + - path: /etc/systemd/timesyncd.conf.d/windows-ntp.conf + content: | + [Time] + NTP=time.windows.com + +sysconf: + environments: + GTK_IM_MODULE: ibus + QT_IM_MODULE: ibus + XMODIFIERS: '@im=ibus' + COUNTRY: US + LANG: en_US.UTF-8 + LANGUAGE: en_US.UTF-8 + LC_ALL: en_US.UTF-8 + TZ: US/Eastern +timezone: US/Eastern diff --git a/configs/locale/ru-RU.yaml b/configs/locale/ru-RU.yaml new file mode 100644 index 0000000..a25c5c9 --- /dev/null +++ b/configs/locale/ru-RU.yaml @@ -0,0 +1,29 @@ +# I18N for Russian +locale: + enable: + - "ru_RU.UTF-8 UTF-8" + - "en_US.UTF-8 UTF-8" + default: en_US.UTF-8 + +filesystem: + files: + # Wireless regulatory + - path: /etc/conf.d/wireless-regdom + content: | + WIRELESS_REGDOM="RU" + - path: /etc/systemd/timesyncd.conf.d/ntp-pool-ntp.conf + content: | + [Time] + NTP=0.ru.pool.ntp.org + +sysconf: + environments: + GTK_IM_MODULE: ibus + QT_IM_MODULE: ibus + XMODIFIERS: '@im=ibus' + COUNTRY: RU + LANG: ru_RU.UTF-8 + LANGUAGE: ru_RU.UTF-8 + LC_ALL: ru_RU.UTF-8 + TZ: Europe/Moscow +timezone: Europe/Moscow diff --git a/configs/packages/firefox.yaml b/configs/packages/firefox.yaml new file mode 100644 index 0000000..570aa9b --- /dev/null +++ b/configs/packages/firefox.yaml @@ -0,0 +1,4 @@ +# Firefox +pacman: + install: + - firefox diff --git a/configs/packages/nvim.yaml b/configs/packages/nvim.yaml new file mode 100644 index 0000000..2e4798c --- /dev/null +++ b/configs/packages/nvim.yaml @@ -0,0 +1,10 @@ +pacman: + install: + - neovim + - neovide + - less +sysconf: + environments: + EDITOR: nvim + VISUAL: neovide + PAGER: less diff --git a/configs/shell/bash.yaml b/configs/shell/bash.yaml new file mode 100644 index 0000000..87ec5b6 --- /dev/null +++ b/configs/shell/bash.yaml @@ -0,0 +1,3 @@ +pacman: + install: + - bash diff --git a/configs/shell/fish.yaml b/configs/shell/fish.yaml new file mode 100644 index 0000000..b1c1aa6 --- /dev/null +++ b/configs/shell/fish.yaml @@ -0,0 +1,4 @@ +pacman: + install: + - fish + - fisher