rebrand!: Antergos NeXT -> Euri Linux

This commit is contained in:
2026-08-21 21:34:51 +02:00
parent 24affb4a5a
commit 11706db546
128 changed files with 452 additions and 449 deletions
@@ -0,0 +1,37 @@
---
backend: pacman
pacman:
num_retries: 0
disable_download_timeout: false
needed_only: false
handle_keyrings: true
copy_pacconf: true
requirements:
- dest: /etc
mode: "0o755"
- dest: /var
mode: "0o755"
- dest: /var/cache
mode: "0o755"
- dest: /var/cache/pacman
mode: "0o755"
- dest: /var/cache/pacman/pkg
mode: "0o755"
- dest: /var/lib
mode: "0o755"
- dest: /var/lib/pacman
mode: "0o755"
keyrings:
- artix
- euri
base_init: elogind
operations:
- install:
- base
- euri-keyring
- euri-release
- euri-grub-theme
- xlibre-xserver
@@ -0,0 +1,21 @@
---
efiBootLoader: "grub"
kernel: "/vmlinuz-linux-x86_64"
img: "/initramfs-linux-x86_64.img"
fallback: "/initramfs-linux-x86_64-fallback.img"
timeout: "10"
grubInstall: "grub-install"
grubMkconfig: "grub-mkconfig"
grubCfg: "/boot/grub/grub.cfg"
grubProbe: "grub-probe"
efiBootMgr: "efibootmgr"
installEFIFallback: true
efiBootloaderId: "Euri"
# installHybridGRUB: false
# efiBootLoaderVar: "packagechooser_bootloader"
@@ -0,0 +1,11 @@
---
displaymanagers:
- lightdm
- gdm
- mdm
- sddm
- lxdm
- slim
- greetd
basicSetup: false
@@ -0,0 +1,6 @@
---
restartNowMode: user-unchecked
restartNowCommand: "loginctl reboot"
notifyOnFinished: false
@@ -0,0 +1,21 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
---
# Create /etc/default/grub from scratch.
overwrite: true
prefer_grub_d: false
keep_distributor: false
kernel_params: [ "quiet", "splash" ]
defaults:
GRUB_TIMEOUT: 5
GRUB_DEFAULT: "saved"
GRUB_DISABLE_SUBMENU: true
GRUB_TERMINAL_OUTPUT: "console"
GRUB_DISABLE_RECOVERY: true
GRUB_THEME: "/usr/share/grub/themes/euri/theme.txt"
always_use_defaults: false
@@ -0,0 +1,4 @@
---
kernel: all
be_unsafe: false
@@ -0,0 +1,7 @@
---
localeGenPath: /etc/locale.gen
geoip:
style: "json"
url: "https://geoip.kde.org/v1/calamares"
selector: ""
@@ -0,0 +1,5 @@
---
systemd: false
dbus: false
dbus-symlink: false
entropy-copy: false
@@ -0,0 +1,131 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
# Mount filesystems in the target (generally, before treating the
# target as a usable chroot / "live" system). Filesystems are
# automatically mounted from the partitioning module. Filesystems
# listed here are **extra**. The filesystems listed in *extraMounts*
# are mounted in all target systems.
---
# Extra filesystems to mount. The key's value is a list of entries; each
# entry has five keys:
# - device The device node to mount
# - fs (optional) The filesystem type to use
# - mountPoint Where to mount the filesystem
# - options (optional) An array of options to pass to mount
# - efi (optional) A boolean that when true is only mounted for UEFI installs
#
# The device is not mounted if the mountPoint is unset or if the fs is
# set to unformatted.
#
extraMounts:
- device: proc
fs: proc
mountPoint: /proc
- device: sys
fs: sysfs
mountPoint: /sys
- device: /dev
mountPoint: /dev
options: [ bind ]
- device: tmpfs
fs: tmpfs
mountPoint: /run
- device: /run/udev
mountPoint: /run/udev
options: [ bind ]
- device: efivarfs
fs: efivarfs
mountPoint: /sys/firmware/efi/efivars
efi: true
# Btrfs subvolumes to create if root filesystem is on btrfs volume.
# If *mountpoint* is mounted already to another partition, it is ignored.
# Separate subvolume for swapfile is handled separately and automatically.
#
# It is possible to prevent subvolume creation -- this is likely only relevant
# for the root (/) subvolume -- by giving an empty string as a subvolume
# name. In this case no subvolume will be created.
#
btrfsSubvolumes:
- mountPoint: /
subvolume: /@
# As an alternative:
#
# subvolume: ""
- mountPoint: /home
subvolume: /@home
- mountPoint: /root
subvolume: /@root
- mountPoint: /srv
subvolume: /@srv
- mountPoint: /var/cache
subvolume: /@cache
- mountPoint: /var/log
subvolume: /@log
- mountPoint: /var/tmp
subvolume: /@tmp
# The name of the btrfs subvolume holding the swapfile. This only used when
# a swapfile is selected and the root filesystem is btrfs
#
btrfsSwapSubvol: /@swap
# The mount options used to mount each filesystem.
#
# filesystem contains the name of the filesystem or on of three special
# values, "default", efi" and "btrfs_swap". The logic is applied in this manner:
# - If the partition is the EFI partition, the "efi" entry will be used
# - If the fs is btrfs and the subvolume is for the swapfile,
# the "btrfs_swap" entry is used
# - If the filesystem is an exact match for filesystem, that entry is used
# - If no match is found in the above, the default entry is used
# - If there is no match and no default entry, "defaults" is used
# - If the mountOptions key is not present, "defaults" is used
#
# Each filesystem entry contains 3 keys, all of which are optional
# options - An array of mount options that is used on all disk types
# ssdOptions - An array of mount options combined with options for ssds
# hddOptions - An array of mount options combined with options for hdds
# If combining these options results in an empty array, "defaults" is used
#
# Example 1
# In this example, there are specific options for ext4 and btrfs filesystems,
# the EFI partition and the subvolume holding the btrfs swapfile. All other
# filesystems use the default entry. For the btrfs filesystem, there are
# additional options specific to hdds and ssds
#
mountOptions:
- filesystem: default
options: [ defaults ]
- filesystem: efi
options: [ defaults, umask=0077 ]
- filesystem: ext4
options: [ defaults ]
- filesystem: btrfs
options: [ defaults, noatime, compress=zstd:1 ]
ssdOptions: [ discard=async ]
hddOptions: [ autodefrag ]
- filesystem: btrfs_swap
options: [ defaults, noatime ]
#
# Example 2
# In this example there is a single default used by all filesystems
#
# mountOptions:
# - filesystem: default
# options: [ defaults ]
#
# mountOptions:
# - filesystem: default
# options: [ defaults ]
# - filesystem: efi
# options: [ defaults, umask=0077 ]
# - filesystem: btrfs
# options: [ defaults, compress=zstd:1 ]
# - filesystem: btrfs_swap
# options: [ defaults, noatime ]
@@ -0,0 +1,54 @@
---
groupsUrl:
- file:///etc/calamares/modules/netinstall.yaml
required: false
# To support multiple instances of this module,
# some strings are configurable and translatable here.
# Sub-keys under *label* are used for the user interface.
# - *sidebar* This is the name of the module in the progress-tree / sidebar
# in Calamares.
# - *title* This is displayed above the list of packages.
# If no *sidebar* values are provided, defaults to "Package selection"
# and existing translations. If no *title* values are provided, no string
# is displayed.
#
# Translations are handled through `[ll]` notation, much like in
# `.desktop` files. The string associated with `key[ll]` is used for
# *key* when when the language *ll* (language-code, like *nl* or *en_GB*
# or *ja*) is used.
#
# The following strings are **already** known to Calamares and can be
# listed here in *untranslated* form (e.g. as value of *sidebar*)
# without bothering with the translations: they are picked up from
# the regular translation framework:
# - "Package selection"
# - "Office software"
# - "Office package"
# - "Browser software"
# - "Browser package"
# - "Web browser"
# - "Kernel"
# - "Services"
# - "Login"
# - "Desktop"
# - "Applications"
# - "Communication"
# - "Development"
# - "Office"
# - "Multimedia"
# - "Internet"
# - "Theming"
# - "Gaming"
# - "Utilities"
# Other strings should follow the translations format.
label:
sidebar: "Package selection"
# sidebar[nl]: "Pakketkeuze"
# sidebar[en_GB]: "Package choice"
# sidebar[ja]: "知りません" # "I don't know"
# title: "Office Package"
# title[nl]: "Kantoorsoftware"
@@ -0,0 +1,101 @@
- name: "Default"
description: "Default packages"
hidden: false
selected: true
critical: true
immutable: true
packages:
- linux
- linux-headers
- grub
- efibootmgr
- sudo
- euri-release
- euri-keyring
- euri-wallpapers
- euri-grub-theme
- falkon
- mesa
- mesa-utils
- vulkan-nouveau
- networkmanager
- network-manager-applet
- pipewire
- pipewire-alsa
- pipewire-pulse
- wireplumber
- btrfs-progs
- xfsprogs
- f2fs-tools
- snapper
- zsh
- name: "Kernel"
description: "Kernel and modules"
selected: false
packages:
- acpi_call
- bbswitch
- broadcom-wl
- tp_smapi
- linux-lts
- linux-lts-headers
- name: "Firmware"
description: "Firmware"
selected: false
packages:
- b43-fwcutter
- linux-firmware
- linux-firmware-bnx2x
- linux-firmware-liquidio
- linux-firmware-marvell
- linux-firmware-mellanox
- linux-firmware-nfp
- linux-firmware-qcom
- linux-firmware-qlogic
- linux-firmware-whence
- sof-firmware
- alsa-firmware
- intel-ucode
- amd-ucode
- name: "Init Services"
description: "Essential dinit services"
selected: true
critical: true
immutable: true
packages:
- dinit
- dbus-dinit
- networkmanager-dinit
- elogind-dinit
- cups-dinit
- avahi-dinit
- bluez-dinit
- cronie-dinit
- openssh-dinit
- alsa-utils-dinit
- acpid-dinit
- dhcpcd-dinit
- syslog-ng-dinit
- power-profiles-daemon-dinit
- ntp-dinit
- name: "Utilities"
description: "System Utilities"
selected: true
packages:
- euri-lsb-release
- nano
- vi
- name: "Devel"
description: "Development tools"
selected: false
packages:
- base-devel
- artools-base
- artools-iso
- artools-pkg
@@ -0,0 +1,162 @@
---
mode: required
method: netinstall-add
labels:
step: "Desktop Environment"
step[de]: "Desktop-Umgebung"
default: Plasma
items:
- id: Plasma
name: "KDE Plasma"
description: "Full-featured modern desktop. The default Euri Linux experience."
screenshot: ""
netinstall:
name: "KDE Plasma"
selected: true
critical: false
packages:
- plasma
- ark
- dolphin
- ffmpegthumbs
- gwenview
- kate
- keditbookmarks
- kfind
- kgpg
- kio-admin
- konsole
- konversation
- kwalletmanager
- okular
- partitionmanager
- euri-desktop-settings
- euri-layan-theme
- tela-circle-icon-theme-git
- cava
- python-websockets
- qt6-websockets
- btop
- imagemagick
- fastfetch
- noto-fonts-emoji
- adw-gtk-theme
- ttf-hack-nerd
- ttf-fira-code
- ttf-terminus-nerd
- ttf-meslo-nerd
- kwin-zones
- oh-my-posh-bin
- pacseek
- id: PlasmaMinimal
name: "KDE Plasma (Minimal)"
description: "Stock Plasma on Wayland — kitty, pcmanfm-qt, featherpad, grim. No branding. For low-end hardware."
screenshot: ""
netinstall:
name: "KDE Plasma (Minimal)"
selected: true
critical: false
packages:
- plasma-meta
- kitty
- pcmanfm-qt
- featherpad
- grim
- slurp
- id: Xfce
name: "Xfce"
description: "Lightweight traditional desktop. Fast and low on resources."
screenshot: ""
netinstall:
name: "Xfce"
selected: true
critical: false
packages:
- xfce4
- xfce4-goodies
- id: Cinnamon
name: "Cinnamon"
description: "Traditional desktop with modern features (GNOME-based)"
screenshot: ""
netinstall:
name: "Cinnamon"
selected: true
critical: false
packages:
- cinnamon
- cinnamon-control-center
- cinnamon-desktop
- cinnamon-menus
- cinnamon-screensaver
- cinnamon-session
- cinnamon-settings-daemon
- cinnamon-translations
- id: MATE
name: "MATE"
description: "Classic desktop — continuation of GNOME 2"
screenshot: ""
netinstall:
name: "MATE"
selected: true
critical: false
packages:
- mate
- mate-extra
- id: LXQt
name: "LXQt"
description: "Lightweight Qt-based desktop"
screenshot: ""
netinstall:
name: "LXQt"
selected: true
critical: false
packages:
- lxqt
- id: i3
name: "i3"
description: "Minimal tiling window manager (keyboard-driven)"
screenshot: ""
netinstall:
name: "i3"
selected: true
critical: false
packages:
- i3
- euri-i3-config
- id: Sway
name: "Sway"
description: "i3-compatible Wayland compositor"
screenshot: ""
netinstall:
name: "Sway"
selected: true
critical: false
packages:
- sway
- swaybg
- swayidle
- swaylock
- euri-sway-config
- id: Hyprland
name: "Hyprland"
description: "Dynamic tiling Wayland compositor with eye candy"
screenshot: ""
netinstall:
name: "Hyprland"
selected: true
critical: false
packages:
- hyprland
- xdg-desktop-portal-hyprland
- euri-hyprland-config
- id: COSMIC
name: "COSMIC"
description: "Modern Rust-based desktop. Select greetd as DM."
screenshot: ""
netinstall:
name: "COSMIC"
selected: true
critical: false
packages:
- cosmic
- cosmic-greeter-dinit
@@ -0,0 +1,74 @@
---
mode: required
method: netinstall-add
labels:
step: "Display Manager"
step[de]: "Display Manager"
default: SDDM
items:
- id: SDDM
name: sddm
description: "QML-based display manager (KDE default)"
screenshot: ""
netinstall:
name: "SDDM"
selected: true
critical: false
packages:
- sddm
- sddm-dinit
- pixie-sddm-git
- id: LightDM
name: lightdm
description: "Cross-desktop display manager (GTK)"
screenshot: "lightdm-screenshot.png"
netinstall:
name: "LightDM"
selected: true
critical: false
packages:
- lightdm
- lightdm-dinit
- lightdm-slick-greeter
- euri-lightdm-config
- id: LXDM
name: lxdm
description: "Lightweight display manager (LXDE)"
screenshot: ""
netinstall:
name: "LXDM"
selected: true
critical: false
packages:
- lxdm
- lxdm-dinit
- id: greetd
name: greetd
description: "Minimal display manager (recommended for COSMIC)"
screenshot: ""
netinstall:
name: "greetd"
selected: true
critical: false
packages:
- greetd
- greetd-dinit
- id: LY
name: ly
description: "Minimal TUI display manager"
screenshot: ""
netinstall:
name: "LY"
selected: true
critical: false
packages:
- ly
- ly-dinit
@@ -0,0 +1,11 @@
---
backend: pacman
skip_if_no_internet: false
update_db: true
update_system: false
pacman:
num_retries: 0
disable_download_timeout: false
needed_only: false
@@ -0,0 +1,33 @@
efi:
mountPoint: "/boot/efi"
recommendedSize: 512MiB
minimumSize: 256MiB
label: "EFI"
userSwapChoices:
- none # Create no swap, use no swap
- small # Up to 4GB
- suspend # At least main memory size
- file # To swap file instead of partition
swapPartitionName: swap
luksGeneration: luks1
drawNestedPartitions: true
alwaysShowPartitionLabels: true
initialPartitioningChoice: none
initialSwapChoice: suspend
defaultPartitionTableType: msdos
requiredPartitionTableType:
- msdos
- gpt
defaultFileSystemType: "ext4"
availableFileSystemTypes: ["ext4","btrfs","f2fs","xfs"]
allowFileSystemTypeSelection: true
@@ -0,0 +1,13 @@
---
# set at iso build time
initsys: none
user-services:
- name: dbus
action: enable
- name: pipewire
action: enable
- name: pipewire-pulse
action: enable
- name: wireplumber
action: enable
@@ -0,0 +1,34 @@
---
command: artix-service
services:
- name: "acpid"
action: "enable"
- name: "bluetoothd"
action: "enable"
- name: "cronie"
action: "enable"
- name: "cupsd"
action: "enable"
- name: "dbus"
action: "enable"
- name: "dhcpcd"
action: "enable"
- name: "NetworkManager"
action: "enable"
- name: "power-profiles-daemon"
action: "enable"
- name: "sddm"
action: "enable"
- name: "lightdm"
action: "enable"
- name: "lxdm"
action: "enable"
- name: "ly"
action: "enable"
- name: "greetd"
action: "enable"
- name: "ntpd"
action: "enable"
- name: "syslog-ng"
action: "enable"
@@ -0,0 +1,2 @@
---
emergency: false
@@ -0,0 +1,46 @@
---
defaultGroups:
- name: users
must_exist: true
system: true
- lp
- video
- network
- storage
- name: wheel
must_exist: false
system: true
- audio
- power
- log
- optical
- network
- scanner
autologinGroup: autologin
doAutologin: false
sudoersGroup: wheel
setRootPassword: true
doReusePassword: false
passwordRequirements:
nonempty: true
minLength: 4 # Password at least this many characters
maxLength: -1 # Password at most this many characters
allowWeakPasswords: true
allowWeakPasswordsDefault: true
userShell: /bin/zsh
setHostname: EtcFile
writeHostsFile: true
user:
shell: /bin/zsh
forbidden_names: [ root ]
@@ -0,0 +1,20 @@
---
showSupportUrl: true
showKnownIssuesUrl: true
showReleaseNotesUrl: true
requirements:
requiredStorage: 5.5
requiredRam: 1.0
internetCheckUrl: https://www.artixlinux.org
check:
- storage
- ram
- power
- internet
- root
required:
- storage
- ram
- root
- internet
@@ -0,0 +1,63 @@
---
modules-search: [ local ]
sequence:
- show:
- welcome
- locale
- keyboard
- packagechooser@de
- packagechooser@dm
- netinstall
- partition
- users
- summary
- exec:
- partition
- mount
- basestrap
- machineid
- packages
- fstab
- locale
- keyboard
- localecfg
- luksopenswaphookcfg
- luksbootkeyfile
- initcpiocfg
- initcpio
- users
- networkcfg
- hwclock
- services-artix
- displaymanager
- grubcfg
- bootloader
- postcfg
- umount
- show:
- finished
instances:
- id: de
module: packagechooser
config: packagechooser_de.conf
- id: dm
module: packagechooser
config: packagechooser_dm.conf
branding: euri
prompt-install: false
dont-chroot: false
oem-setup: false
disable-cancel: false
disable-cancel-during-exec: false
hide-back-and-next-during-exec: false
quit-at-end: false
@@ -0,0 +1,36 @@
---
backend: pacman
pacman:
num_retries: 0
disable_download_timeout: false
needed_only: false
handle_keyrings: true
copy_pacconf: true
requirements:
- dest: /etc
mode: "0o755"
- dest: /var
mode: "0o755"
- dest: /var/cache
mode: "0o755"
- dest: /var/cache/pacman
mode: "0o755"
- dest: /var/cache/pacman/pkg
mode: "0o755"
- dest: /var/lib
mode: "0o755"
- dest: /var/lib/pacman
mode: "0o755"
keyrings:
- artix
- euri
base_init: elogind
operations:
- install:
- base
- euri-keyring
- euri-release
@@ -0,0 +1,21 @@
---
efiBootLoader: "grub"
kernel: "/vmlinuz-linux-x86_64"
img: "/initramfs-linux-x86_64.img"
fallback: "/initramfs-linux-x86_64-fallback.img"
timeout: "10"
grubInstall: "grub-install"
grubMkconfig: "grub-mkconfig"
grubCfg: "/boot/grub/grub.cfg"
grubProbe: "grub-probe"
efiBootMgr: "efibootmgr"
installEFIFallback: true
efiBootloaderId: "Euri Linux"
# installHybridGRUB: false
# efiBootLoaderVar: "packagechooser_bootloader"
@@ -0,0 +1,12 @@
---
displaymanagers:
- sddm
- lightdm
- lxdm
- ly
- greetd
- gdm
- mdm
- slim
basicSetup: false
@@ -0,0 +1,6 @@
---
restartNowMode: user-unchecked
restartNowCommand: "loginctl reboot"
notifyOnFinished: false
@@ -0,0 +1,21 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
---
overwrite: true
prefer_grub_d: false
keep_distributor: false
kernel_params: [ "quiet" ]
defaults:
GRUB_TIMEOUT: 5
GRUB_DEFAULT: "saved"
GRUB_DISTRIBUTOR: "Euri Linux"
GRUB_DISABLE_SUBMENU: true
GRUB_TERMINAL_OUTPUT: "gfxterm"
GRUB_DISABLE_RECOVERY: true
GRUB_THEME: "/usr/share/grub/themes/euri/theme.txt"
always_use_defaults: false
@@ -0,0 +1,4 @@
---
kernel: all
be_unsafe: false
@@ -0,0 +1,7 @@
---
localeGenPath: /etc/locale.gen
geoip:
style: "json"
url: "https://geoip.kde.org/v1/calamares"
selector: ""
@@ -0,0 +1,5 @@
---
systemd: false
dbus: false
dbus-symlink: false
entropy-copy: false
@@ -0,0 +1,131 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
# Mount filesystems in the target (generally, before treating the
# target as a usable chroot / "live" system). Filesystems are
# automatically mounted from the partitioning module. Filesystems
# listed here are **extra**. The filesystems listed in *extraMounts*
# are mounted in all target systems.
---
# Extra filesystems to mount. The key's value is a list of entries; each
# entry has five keys:
# - device The device node to mount
# - fs (optional) The filesystem type to use
# - mountPoint Where to mount the filesystem
# - options (optional) An array of options to pass to mount
# - efi (optional) A boolean that when true is only mounted for UEFI installs
#
# The device is not mounted if the mountPoint is unset or if the fs is
# set to unformatted.
#
extraMounts:
- device: proc
fs: proc
mountPoint: /proc
- device: sys
fs: sysfs
mountPoint: /sys
- device: /dev
mountPoint: /dev
options: [ bind ]
- device: tmpfs
fs: tmpfs
mountPoint: /run
- device: /run/udev
mountPoint: /run/udev
options: [ bind ]
- device: efivarfs
fs: efivarfs
mountPoint: /sys/firmware/efi/efivars
efi: true
# Btrfs subvolumes to create if root filesystem is on btrfs volume.
# If *mountpoint* is mounted already to another partition, it is ignored.
# Separate subvolume for swapfile is handled separately and automatically.
#
# It is possible to prevent subvolume creation -- this is likely only relevant
# for the root (/) subvolume -- by giving an empty string as a subvolume
# name. In this case no subvolume will be created.
#
btrfsSubvolumes:
- mountPoint: /
subvolume: /@
# As an alternative:
#
# subvolume: ""
- mountPoint: /home
subvolume: /@home
- mountPoint: /root
subvolume: /@root
- mountPoint: /srv
subvolume: /@srv
- mountPoint: /var/cache
subvolume: /@cache
- mountPoint: /var/log
subvolume: /@log
- mountPoint: /var/tmp
subvolume: /@tmp
# The name of the btrfs subvolume holding the swapfile. This only used when
# a swapfile is selected and the root filesystem is btrfs
#
btrfsSwapSubvol: /@swap
# The mount options used to mount each filesystem.
#
# filesystem contains the name of the filesystem or on of three special
# values, "default", efi" and "btrfs_swap". The logic is applied in this manner:
# - If the partition is the EFI partition, the "efi" entry will be used
# - If the fs is btrfs and the subvolume is for the swapfile,
# the "btrfs_swap" entry is used
# - If the filesystem is an exact match for filesystem, that entry is used
# - If no match is found in the above, the default entry is used
# - If there is no match and no default entry, "defaults" is used
# - If the mountOptions key is not present, "defaults" is used
#
# Each filesystem entry contains 3 keys, all of which are optional
# options - An array of mount options that is used on all disk types
# ssdOptions - An array of mount options combined with options for ssds
# hddOptions - An array of mount options combined with options for hdds
# If combining these options results in an empty array, "defaults" is used
#
# Example 1
# In this example, there are specific options for ext4 and btrfs filesystems,
# the EFI partition and the subvolume holding the btrfs swapfile. All other
# filesystems use the default entry. For the btrfs filesystem, there are
# additional options specific to hdds and ssds
#
mountOptions:
- filesystem: default
options: [ defaults ]
- filesystem: efi
options: [ defaults, umask=0077 ]
- filesystem: ext4
options: [ defaults ]
- filesystem: btrfs
options: [ defaults, noatime, compress=zstd:1 ]
ssdOptions: [ discard=async ]
hddOptions: [ autodefrag ]
- filesystem: btrfs_swap
options: [ defaults, noatime ]
#
# Example 2
# In this example there is a single default used by all filesystems
#
# mountOptions:
# - filesystem: default
# options: [ defaults ]
#
# mountOptions:
# - filesystem: default
# options: [ defaults ]
# - filesystem: efi
# options: [ defaults, umask=0077 ]
# - filesystem: btrfs
# options: [ defaults, compress=zstd:1 ]
# - filesystem: btrfs_swap
# options: [ defaults, noatime ]
@@ -0,0 +1,54 @@
---
groupsUrl:
- file:///etc/calamares/modules/netinstall.yaml
required: false
# To support multiple instances of this module,
# some strings are configurable and translatable here.
# Sub-keys under *label* are used for the user interface.
# - *sidebar* This is the name of the module in the progress-tree / sidebar
# in Calamares.
# - *title* This is displayed above the list of packages.
# If no *sidebar* values are provided, defaults to "Package selection"
# and existing translations. If no *title* values are provided, no string
# is displayed.
#
# Translations are handled through `[ll]` notation, much like in
# `.desktop` files. The string associated with `key[ll]` is used for
# *key* when when the language *ll* (language-code, like *nl* or *en_GB*
# or *ja*) is used.
#
# The following strings are **already** known to Calamares and can be
# listed here in *untranslated* form (e.g. as value of *sidebar*)
# without bothering with the translations: they are picked up from
# the regular translation framework:
# - "Package selection"
# - "Office software"
# - "Office package"
# - "Browser software"
# - "Browser package"
# - "Web browser"
# - "Kernel"
# - "Services"
# - "Login"
# - "Desktop"
# - "Applications"
# - "Communication"
# - "Development"
# - "Office"
# - "Multimedia"
# - "Internet"
# - "Theming"
# - "Gaming"
# - "Utilities"
# Other strings should follow the translations format.
label:
sidebar: "Package selection"
# sidebar[nl]: "Pakketkeuze"
# sidebar[en_GB]: "Package choice"
# sidebar[ja]: "知りません" # "I don't know"
# title: "Office Package"
# title[nl]: "Kantoorsoftware"
@@ -0,0 +1,105 @@
- name: "Default"
description: "Default packages"
hidden: false
selected: true
critical: true
immutable: true
packages:
- linux
- linux-headers
- grub
- efibootmgr
- sudo
- euri-release
- euri-keyring
- euri-wallpapers
- euri-grub-theme
- falkon
- mesa
- mesa-utils
- vulkan-nouveau
- networkmanager
- network-manager-applet
- pipewire
- pipewire-alsa
- pipewire-pulse
- wireplumber
- btrfs-progs
- xfsprogs
- f2fs-tools
- snapper
- zsh
- name: "Kernel"
description: "Kernel and modules"
selected: false
packages:
- acpi_call
- bbswitch
- broadcom-wl
- tp_smapi
- linux-lts
- linux-lts-headers
- name: "Firmware"
description: "Firmware"
selected: false
packages:
- b43-fwcutter
- linux-firmware
- linux-firmware-bnx2x
- linux-firmware-liquidio
- linux-firmware-marvell
- linux-firmware-mellanox
- linux-firmware-nfp
- linux-firmware-qcom
- linux-firmware-qlogic
- linux-firmware-whence
- sof-firmware
- alsa-firmware
- intel-ucode
- amd-ucode
- name: "Init Services"
description: "Essential dinit services"
selected: true
critical: true
immutable: true
packages:
- dinit
- dbus-dinit
- networkmanager-dinit
- elogind-dinit
- cups-dinit
- avahi-dinit
- bluez-dinit
- cronie-dinit
- openssh-dinit
- alsa-utils-dinit
- acpid-dinit
- dhcpcd-dinit
- syslog-ng-dinit
- power-profiles-daemon-dinit
- ntp-dinit
- name: "Utilities"
description: "System Utilities"
selected: true
packages:
- euri-lsb-release
- nano
- vi
- name: "Devel"
description: "Development tools"
selected: false
packages:
- base-devel
- artools-base
- artools-iso
- artools-pkg
@@ -0,0 +1,264 @@
---
mode: required
method: netinstall-add
labels:
step: "Desktop Environment"
step[de]: "Desktop-Umgebung"
default: Plasma
items:
- id: Plasma
name: "KDE Plasma"
description: "Full-featured modern desktop. The default Euri Linux experience."
screenshot: ""
netinstall:
name: "KDE Plasma"
selected: true
critical: false
packages:
- euri-desktop-settings
- ark
- bluedevil
- breeze-gtk
- dolphin
- dolphin-plugins
- ffmpegthumbs
- gwenview
- kate
- kcalc
- kde-cli-tools
- kde-gtk-config
- kdeconnect
- kdegraphics-thumbnailers
- kdenetwork-filesharing
- kdeplasma-addons
- keditbookmarks
- kfind
- kgpg
- kinfocenter
- kio-admin
- kio-extras
- kio-fuse
- konsole
- konversation
- kscreen
- kwallet-pam
- kwalletmanager
- kwayland-integration
- okular
- partitionmanager
- plasma-browser-integration
- plasma-desktop
- plasma-disks
- plasma-nm
- plasma-pa
- plasma-systemmonitor
- plasma-workspace
- powerdevil
- print-manager
- qt6-imageformats
- spectacle
- xdg-desktop-portal-kde
- xsettingsd
- euri-layan-theme
- tela-circle-icon-theme-git
- cava
- python-websockets
- qt6-websockets
- btop
- imagemagick
- fastfetch
- noto-fonts-emoji
- adw-gtk-theme
- ttf-hack-nerd
- ttf-fira-code
- ttf-terminus-nerd
- ttf-meslo-nerd
- kwin-zones
- oh-my-posh-bin
- pacseek
- id: PlasmaMinimal
name: "KDE Plasma (Minimal)"
description: "Stock Plasma on Wayland — kitty, pcmanfm-qt, featherpad, grim. No branding. For low-end hardware."
screenshot: ""
netinstall:
name: "KDE Plasma (Minimal)"
selected: true
critical: false
packages:
- plasma-meta
- kitty
- pcmanfm-qt
- featherpad
- grim
- slurp
- id: Xfce
name: "Xfce"
description: "Lightweight traditional desktop. Fast and low on resources."
screenshot: ""
netinstall:
name: "Xfce"
selected: true
critical: false
packages:
- exo
- garcon
- thunar
- thunar-volman
- tumbler
- xfce4-appfinder
- xfce4-panel
- xfce4-power-manager
- xfce4-session
- xfce4-settings
- xfce4-terminal
- xfconf
- xfdesktop
- xfwm4
- xfwm4-themes
- mousepad
- parole
- ristretto
- thunar-archive-plugin
- thunar-media-tags-plugin
- xfburn
- xfce4-clipman-plugin
- xfce4-notifyd
- xfce4-pulseaudio-plugin
- xfce4-screenshooter
- xfce4-screensaver
- xfce4-taskmanager
- xfce4-whiskermenu-plugin
- id: Cinnamon
name: "Cinnamon"
description: "Traditional desktop with modern features (GNOME-based)"
screenshot: ""
netinstall:
name: "Cinnamon"
selected: true
critical: false
packages:
- cinnamon
- cinnamon-control-center
- cinnamon-desktop
- cinnamon-menus
- cinnamon-screensaver
- cinnamon-session
- cinnamon-settings-daemon
- cinnamon-translations
- id: MATE
name: "MATE"
description: "Classic desktop — continuation of GNOME 2"
screenshot: ""
netinstall:
name: "MATE"
selected: true
critical: false
packages:
- caja
- marco
- mate-backgrounds
- mate-control-center
- mate-desktop
- mate-icon-theme
- mate-menus
- mate-notification-daemon
- mate-panel
- mate-polkit
- mate-session-manager
- mate-settings-daemon
- mate-themes
- mate-user-guide
- atril
- eom
- mate-applets
- mate-calc
- mate-power-manager
- mate-screensaver
- mate-system-monitor
- mate-terminal
- mate-utils
- pluma
- id: LXQt
name: "LXQt"
description: "Lightweight Qt-based desktop"
screenshot: ""
netinstall:
name: "LXQt"
selected: true
critical: false
packages:
- lximage-qt
- lxqt-about
- lxqt-admin
- lxqt-archiver
- lxqt-config
- lxqt-globalkeys
- lxqt-menu-data
- lxqt-notificationd
- lxqt-openssh-askpass
- lxqt-panel
- lxqt-policykit
- lxqt-powermanagement
- lxqt-qtplugin
- lxqt-runner
- lxqt-session
- lxqt-sudo
- lxqt-themes
- obconf-qt
- openbox
- pavucontrol-qt
- pcmanfm-qt
- qps
- qterminal
- screengrab
- xdg-desktop-portal-lxqt
- id: i3
name: "i3"
description: "Minimal tiling window manager (keyboard-driven)"
screenshot: ""
netinstall:
name: "i3"
selected: true
critical: false
packages:
- i3-wm
- i3blocks
- i3lock
- i3status
- euri-i3-config
- id: Sway
name: "Sway"
description: "i3-compatible Wayland compositor"
screenshot: ""
netinstall:
name: "Sway"
selected: true
critical: false
packages:
- sway
- swaybg
- swayidle
- swaylock
- euri-sway-config
- id: Hyprland
name: "Hyprland"
description: "Dynamic tiling Wayland compositor with eye candy"
screenshot: ""
netinstall:
name: "Hyprland"
selected: true
critical: false
packages:
- hyprland
- xdg-desktop-portal-hyprland
- euri-hyprland-config
- id: COSMIC
name: "COSMIC"
description: "Modern Rust-based desktop. Select greetd as DM."
screenshot: ""
netinstall:
name: "COSMIC"
selected: true
critical: false
packages:
- cosmic
@@ -0,0 +1,74 @@
---
mode: required
method: netinstall-add
labels:
step: "Display Manager"
step[de]: "Display Manager"
default: SDDM
items:
- id: SDDM
name: sddm
description: "QML-based display manager (KDE default)"
screenshot: ""
netinstall:
name: "SDDM"
selected: true
critical: false
packages:
- sddm
- sddm-dinit
- pixie-sddm-git
- id: LightDM
name: lightdm
description: "Cross-desktop display manager (GTK)"
screenshot: "lightdm-screenshot.png"
netinstall:
name: "LightDM"
selected: true
critical: false
packages:
- lightdm
- lightdm-dinit
- lightdm-slick-greeter
- euri-lightdm-config
- id: LXDM
name: lxdm
description: "Lightweight display manager (LXDE)"
screenshot: ""
netinstall:
name: "LXDM"
selected: true
critical: false
packages:
- lxdm
- lxdm-dinit
- id: greetd
name: greetd
description: "Minimal display manager (recommended for COSMIC)"
screenshot: ""
netinstall:
name: "greetd"
selected: true
critical: false
packages:
- greetd
- greetd-dinit
- id: LY
name: ly
description: "Minimal TUI display manager"
screenshot: ""
netinstall:
name: "LY"
selected: true
critical: false
packages:
- ly
- ly-dinit
@@ -0,0 +1,13 @@
---
backend: pacman
skip_if_no_internet: false
update_db: true
ignore_update_db_error: false
update_system: false
pacman:
num_retries: 3
disable_download_timeout: false
needed_only: true
operations: []
@@ -0,0 +1,33 @@
efi:
mountPoint: "/boot/efi"
recommendedSize: 512MiB
minimumSize: 256MiB
label: "EFI"
userSwapChoices:
- none # Create no swap, use no swap
- small # Up to 4GB
- suspend # At least main memory size
- file # To swap file instead of partition
swapPartitionName: swap
luksGeneration: luks1
drawNestedPartitions: true
alwaysShowPartitionLabels: true
initialPartitioningChoice: none
initialSwapChoice: suspend
defaultPartitionTableType: msdos
requiredPartitionTableType:
- msdos
- gpt
defaultFileSystemType: "ext4"
availableFileSystemTypes: ["ext4","btrfs","f2fs","xfs"]
allowFileSystemTypeSelection: true
@@ -0,0 +1,13 @@
---
# set at iso build time
initsys: none
user-services:
- name: dbus
action: enable
- name: pipewire
action: enable
- name: pipewire-pulse
action: enable
- name: wireplumber
action: enable
@@ -0,0 +1,36 @@
---
command: artix-service
services:
- name: "acpid"
action: "enable"
- name: "bluetoothd"
action: "enable"
- name: "cronie"
action: "enable"
- name: "cupsd"
action: "enable"
- name: "dbus"
action: "enable"
- name: "dhcpcd"
action: "enable"
- name: "NetworkManager"
action: "enable"
- name: "power-profiles-daemon"
action: "enable"
- name: "sddm"
action: "enable"
- name: "lightdm"
action: "enable"
- name: "lxdm"
action: "enable"
- name: "ly"
action: "enable"
- name: "greetd"
action: "enable"
- name: "ntpd"
action: "enable"
- name: "syslog-ng"
action: "enable"
- name: "userspawn"
action: "enable"
@@ -0,0 +1,2 @@
---
emergency: false
@@ -0,0 +1,46 @@
---
defaultGroups:
- name: users
must_exist: true
system: true
- lp
- video
- network
- storage
- name: wheel
must_exist: false
system: true
- audio
- power
- log
- optical
- network
- scanner
autologinGroup: autologin
doAutologin: false
sudoersGroup: wheel
setRootPassword: true
doReusePassword: false
passwordRequirements:
nonempty: true
minLength: 4 # Password at least this many characters
maxLength: -1 # Password at most this many characters
allowWeakPasswords: true
allowWeakPasswordsDefault: true
userShell: /bin/zsh
setHostname: EtcFile
writeHostsFile: true
user:
shell: /bin/zsh
forbidden_names: [ root ]
@@ -0,0 +1,20 @@
---
showSupportUrl: true
showKnownIssuesUrl: true
showReleaseNotesUrl: true
requirements:
requiredStorage: 5.5
requiredRam: 1.0
internetCheckUrl: https://www.artixlinux.org
check:
- storage
- ram
- power
- internet
- root
required:
- storage
- ram
- root
- internet
@@ -0,0 +1,45 @@
# This file is part of elogind.
#
# elogind is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 2.1 of the License, or (at your option)
# any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file, or by creating "drop-ins" in
# the logind.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
# See logind.conf(5) for details.
[Login]
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
#UserStopDelaySec=10
#HandlePowerKey=poweroff
#HandlePowerKeyLongPress=ignore
#HandleRebootKey=reboot
#HandleRebootKeyLongPress=poweroff
#HandleSuspendKey=suspend
#HandleSuspendKeyLongPress=hibernate
#HandleHibernateKey=hibernate
#HandleHibernateKeyLongPress=ignore
#HandleLidSwitch=suspend
#HandleLidSwitchExternalPower=suspend
#HandleLidSwitchDocked=ignore
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#RebootKeyIgnoreInhibited=no
#HoldoffTimeoutSec=30s
#IdleAction=ignore
#IdleActionSec=30min
#RuntimeDirectorySize=10%
#RuntimeDirectoryInodesMax=
#RemoveIPC=yes
#InhibitorsMax=8192
#SessionsMax=8192
#StopIdleSessionSec=infinity
@@ -0,0 +1,36 @@
# This file is part of elogind.
#
# elogind is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 2.1 of the License, or (at your option)
# any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file, or by creating "drop-ins" in
# the sleep.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
# See sleep.conf(5) for details.
[Sleep]
#AllowSuspend=yes
#AllowHibernation=yes
#AllowSuspendThenHibernate=yes
#AllowHybridSleep=yes
#SuspendMode=
#SuspendState=mem standby freeze
#HibernateMode=platform shutdown
#HibernateState=disk
#HybridSleepMode=suspend platform shutdown
#HybridSleepState=disk
#HibernateDelaySec=
#SuspendEstimationSec=60min
# elogind additions
#AllowPowerOffInterrupts=no
#BroadcastPowerOffInterrupts=yes
#AllowSuspendInterrupts=no
#BroadcastSuspendInterrupts=yes
#SuspendByUsing=
#HibernateByUsing=
#HandleNvidiaSleep=no
+5
View File
@@ -0,0 +1,5 @@
#
# /etc/fstab: static file system information
#
# <file system> <dir> <type> <options> <dump> <pass>
/dev/mapper/rootfs / auto defaults 0 0
@@ -0,0 +1 @@
euri-live
+2
View File
@@ -0,0 +1,2 @@
127.0.0.1 localhost.localdomain euri-live localhost
::1 localhost.localdomain euri-live localhost
+19
View File
@@ -0,0 +1,19 @@
[?25l[?7l `.-/::/-``
.-/osssssssso/.
:osyysssssssyyys+-
`.+yyyysssssssssyyyyy+.
`/syyyyyssssssssssyyyyys-`
`/yhyyyyysss++ssosyyyyhhy/`
.ohhhyyyyso++/+oso+syy+shhhho.
.shhhhysoo++//+sss+++yyy+shhhhs.
-yhhhhs+++++++ossso+++yyys+ohhddy:
-yddhhyo+++++osyyss++++yyyyooyhdddy-
.yddddhso++osyyyyys+++++yyhhsoshddddy`
`odddddhyosyhyyyyyy++++++yhhhyosddddddo
.dmdddddhhhhhhhyyyo+++++shhhhhohddddmmh.
ddmmdddddhhhhhhhso++++++yhhhhhhdddddmmdy
dmmmdddddddhhhyso++++++shhhhhddddddmmmmh
-dmmmdddddddhhyso++++oshhhhdddddddmmmmd-
.smmmmddddddddhhhhhhhhhdddddddddmmmms.
`+ydmmmdddddddddddddddddddmmmmdy/.
`.:+ooyyddddddddddddyyso+:.`
@@ -0,0 +1,8 @@
[?25h[?7hEuri Linux Live ISO (\l) - \s-\r \m
# Welcome to Euri Linux #
login for the live environment:
user 'euri'
password 'euri'
@@ -0,0 +1,13 @@
NAME="Euri Linux"
PRETTY_NAME="Euri Linux 2026.08.17 Arranxo"
ID=euri
ID_LIKE=artix
VERSION_ID=2026.08.17
VERSION_CODENAME=arranxo
BUILD_ID=rolling
ANSI_COLOR="38;2;0;136;204"
HOME_URL="https://github.com/Antergos-NeXT"
DOCUMENTATION_URL="https://wiki.archlinux.org"
SUPPORT_URL="https://github.com/Antergos-NeXT"
BUG_REPORT_URL="https://github.com/Antergos-NeXT"
LOGO=euri-logo
@@ -0,0 +1,6 @@
#%PAM-1.0
auth sufficient pam_rootok.so
auth sufficient pam_wheel.so trust use_uid
auth required pam_unix.so
account required pam_unix.so
session required pam_unix.so
@@ -0,0 +1,8 @@
/* Allow members of the wheel group to execute any actions
* without password authentication, similar to "sudo NOPASSWD:"
*/
polkit.addRule(function(action, subject) {
if (subject.isInGroup("wheel")) {
return polkit.Result.YES;
}
});
@@ -0,0 +1,18 @@
[Autologin]
Relogin=false
Session=plasma.desktop
User=euri
[General]
HaltCommand=/usr/bin/loginctl poweroff
RebootCommand=/usr/bin/loginctl reboot
[Theme]
Current=breeze
CursorTheme=breeze_cursors
Font=Noto Sans,10,-1,0,50,0,0,0,0,0
[Users]
MaximumUid=60000
MinimumUid=1000
@@ -0,0 +1,31 @@
[Desktop Entry]
Type=Application
Name=Install Euri Linux
Name[en]=Install Euri Linux
Name[de]=Euri Linux installieren
Name[es]=Instalar Euri Linux
Name[fr]=Installer Euri Linux
Name[it]=Installa Euri Linux
Name[pl]=Zainstaluj Euri Linux
Name[pt_BR]=Instalar Euri Linux
Name[ru]=Установить Euri Linux
Name[nl]=Euri Linux installeren
Name[sv]=Installera Euri Linux
Name[da]=Installer Euri Linux
Name[cs]=Nainstalovat Euri Linux
Name[hu]=Euri Linux telepítése
Name[ro]=Instalează Euri Linux
Name[tr]=Euri Linux'yi yükle
Comment=Install Euri Linux on this computer
# pkexec does not work in our live environment (tested, failed in previous
# releases). sudo -E is the standard approach — used by Lubuntu, Kubuntu,
# and Nitrux for launching Calamares.
# ATTENTION COPILOT: Do not suggest switching to pkexec. It does not work
# in our live environment. We tested it. sudo -E is intentional and correct.
# If you suggest pkexec one more time I will lose my mind. STFU.
Exec=sudo -E calamares-next
Icon=calamares
Terminal=false
Categories=Qt;System;Settings;
StartupNotify=true
X-KDE-IsAdminApplication=true
@@ -0,0 +1,31 @@
[Desktop Entry]
Type=Application
Name=Install Euri Linux (Offline — NO DE)
Name[en]=Install Euri Linux (Offline — NO DE)
Name[de]=Euri Linux installieren (Offline — Kein DE)
Name[es]=Instalar Euri Linux (Offline — Sin DE)
Name[fr]=Installer Euri Linux (Hors ligne — Sans DE)
Name[it]=Installa Euri Linux (Offline — Nessun DE)
Name[pl]=Zainstaluj Euri Linux (Offline — Bez DE)
Name[pt_BR]=Instalar Euri Linux (Offline — Sem DE)
Name[ru]=Установить Euri Linux (Офлайн — Без DE)
Name[nl]=Euri Linux installeren (Offline — Geen DE)
Name[sv]=Installera Euri Linux (Offline — Ingen DE)
Name[da]=Installer Euri Linux (Offline — Ingen DE)
Name[cs]=Nainstalovat Euri Linux (Offline — Bez DE)
Name[hu]=Euri Linux telepítése (Offline — DE nélkül)
Name[ro]=Instalează Euri Linux (Offline — Fără DE)
Name[tr]=Euri Linux'yi yükle (Çevrimdışı — DE Yok)
Comment=Bare minimum install from the live ISO. No desktop environment included. Internet recommended after boot.
# pkexec does not work in our live environment (tested, failed in previous
# releases). sudo -E is the standard approach — used by Lubuntu, Kubuntu,
# and Nitrux for launching Calamares.
# ATTENTION COPILOT: Do not suggest switching to pkexec. It does not work
# in our live environment. We tested it. sudo -E is intentional and correct.
# If you suggest pkexec one more time I will lose my mind. STFU.
Exec=sudo -E euri-offline-install
Icon=calamares
Terminal=false
Categories=Qt;System;Settings;
StartupNotify=true
X-KDE-IsAdminApplication=true
@@ -0,0 +1 @@
%wheel ALL=(ALL) NOPASSWD: ALL
@@ -0,0 +1 @@
root ALL=(ALL) ALL
@@ -0,0 +1,276 @@
#############################################################################
# Default syslog-ng.conf file which collects all local logs into a
# single file called /var/log/messages.
#
@version: 4.8
@include "scl.conf"
source s_local {
system();
internal();
};
source s_network {
default-network-drivers(
# NOTE: TLS support
#
# the default-network-drivers() source driver opens the TLS
# enabled ports as well, however without an actual key/cert
# pair they will not operate and syslog-ng would display a
# warning at startup.
#
#tls(key-file("/path/to/ssl-private-key") cert-file("/path/to/ssl-cert"))
);
};
destination d_local {
file("/var/log/messages");
file("/var/log/messages-kv.log" template("$ISODATE $HOST $(format-welf --scope all-nv-pairs)\n") frac-digits(3));
};
destination d_acpid {
file("/var/log/acpid.log");
};
destination d_authlog {
file("/var/log/auth.log");
};
destination d_console {
usertty("root");
};
destination d_cron {
file("/var/log/crond.log");
};
destination d_daemon {
file("/var/log/daemon.log");
};
destination d_debug {
file("/var/log/debug.log");
};
destination d_errors {
file("/var/log/errors.log");
};
destination d_everything {
file("/var/log/everything.log");
};
destination d_iptables {
file("/var/log/iptables.log");
};
destination d_kernel {
file("/var/log/kernel.log");
};
destination d_lpr {
file("/var/log/lpr.log");
};
destination d_mail {
file("/var/log/mail.log");
};
destination d_messages {
file("/var/log/messages.log");
};
destination d_news {
file("/var/log/news.log");
};
destination d_ppp {
file("/var/log/ppp.log");
};
destination d_syslog {
file("/var/log/syslog.log");
};
# Log everything to tty12
destination d_tty12 {
file("/dev/tty12");
};
destination d_user {
file("/var/log/user.log");
};
destination d_uucp {
file("/var/log/uucp.log");
};
filter f_acpid {
program("acpid");
};
filter f_auth {
facility(auth);
};
filter f_authpriv {
facility(auth, authpriv);
};
filter f_crit {
level(crit);
};
filter f_cron {
facility(cron);
};
filter f_daemon {
facility(daemon);
};
filter f_debug {
not facility(auth, authpriv, news, mail);
};
filter f_emergency {
level(emerg);
};
filter f_err {
level(err);
};
filter f_everything {
level(debug..emerg) and not facility(auth, authpriv);
};
filter f_info {
level(info);
};
filter f_iptables {
match("IN=" value("MESSAGE")) and match("OUT=" value("MESSAGE"));
};
filter f_kernel {
facility(kern) and not filter(f_iptables);
};
filter f_lpr {
facility(lpr);
};
filter f_mail {
facility(mail);
};
filter f_messages {
level(info..warn) and not facility(auth, authpriv, mail, news, cron) and not program(syslog-ng) and not filter(f_iptables);
};
filter f_news {
facility(news);
};
filter f_notice {
level(notice);
};
filter f_ppp {
facility(local2);
};
filter f_syslog {
program(syslog-ng);
};
filter f_user {
facility(user);
};
filter f_uucp {
facility(uucp);
};
filter f_warn {
level(warn);
};
log {
source(s_local);
# uncomment this line to open port 514 to receive messages
#source(s_network);
# destination(d_local);
};
log {
source(s_local);
filter(f_acpid);
destination(d_acpid);
};
log {
source(s_local);
filter(f_authpriv);
destination(d_authlog);
};
log {
source(s_local);
filter(f_cron);
destination(d_cron);
};
log {
source(s_local);
filter(f_daemon);
destination(d_daemon);
};
log {
source(s_local);
# filter(f_debug);
# destination(d_debug);
};
log {
source(s_local);
# filter(f_emergency);
# destination(d_console);
};
log {
source(s_local);
filter(f_err);
destination(d_errors);
};
log {
source(s_local);
filter(f_everything);
destination(d_everything);
};
log {
source(s_local);
# filter(f_iptables);
# destination(d_iptables);
};
log {
source(s_local);
filter(f_kernel);
destination(d_kernel);
};
log {
source(s_local);
# filter(f_lpr);
# destination(d_lpr);
};
log {
source(s_local);
# filter(f_mail);
# destination(d_mail);
};
log {
source(s_local);
# filter(f_messages);
# destination(d_messages);
};
log {
source(s_local);
# filter(f_news);
# destination(d_news);
};
log {
source(s_local);
# filter(f_ppp);
# destination(d_ppp);
};
log {
source(s_local);
filter(f_user);
destination(d_user);
};
log {
source(s_local);
filter(f_uucp);
destination(d_uucp);
};
log {
source(s_local);
# filter(f_syslog);
# destination(d_syslog);
};
# Log everything to tty12
log {
source(s_local);
# destination(d_tty12);
};
options {
chain_hostnames(off);
create_dirs(no);
dns_cache(no);
flush_lines(0);
group("log");
keep_hostname(yes);
log_fifo_size(10000);
perm(0640);
stats(freq(0));
time_reopen(10);
use_dns(no);
use_fqdn(no);
};
@@ -0,0 +1,29 @@
#!/bin/bash
ROOT=""
for arg in "$@"; do
case "$arg" in
--root=*)
ROOT="${arg#*=}"
;;
esac
done
MACHINE_ID_FILE="${ROOT}/etc/machine-id"
if [ -f "$MACHINE_ID_FILE" ] && [ -s "$MACHINE_ID_FILE" ]; then
exit 0
fi
mkdir -p "$(dirname "$MACHINE_ID_FILE")"
if command -v dbus-uuidgen &>/dev/null; then
dbus-uuidgen --ensure 2>/dev/null
fi
if [ ! -f "$MACHINE_ID_FILE" ] || [ ! -s "$MACHINE_ID_FILE" ]; then
od -An -N16 -tx1 /dev/urandom | tr -d ' \n' > "$MACHINE_ID_FILE"
fi
chmod 0644 "$MACHINE_ID_FILE"
@@ -0,0 +1,592 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# === This file is part of Calamares - <https://calamares.io> ===
#
# SPDX-FileCopyrightText: 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
# SPDX-FileCopyrightText: 2015-2017 Teo Mrnjavac <teo@kde.org>
# SPDX-FileCopyrightText: 2016-2017 Kyle Robbertze <kyle@aims.ac.za>
# SPDX-FileCopyrightText: 2017 Alf Gaida <agaida@siduction.org>
# SPDX-FileCopyrightText: 2018 Adriaan de Groot <groot@kde.org>
# SPDX-FileCopyrightText: 2018 Philip Müller <philm@manjaro.org>
# SPDX-FileCopyrightText: 2023 Artoo <artoo@artixlinux.org>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# Calamares is Free Software: see the License-Identifier above.
#
# Euri Linux: Removed hardcoded hasInternet check; added
# skip_if_no_internet config option matching the packages module pattern.
#
# ╔══════════════════════════════════════════════════════════════════════════╗
# ║ ⚠ CODEQL WARNING ⚠ ║
# ║ GitHub's CodeQL (powered by Copilot AI) will flag several lines in ║
# ║ this file as "findings". THEY ARE INTENTIONAL. "Fixing" them ║
# ║ WILL break the ISO — previous attempts caused partial upgrades, ║
# ║ package conflicts (audit-dinit vs audit-openrc, sddm vs x11win), ║
# ║ and fatal installer crashes. Do not let an AI rewrite this file. ║
# ║ If you must edit, test with a FULL online + offline install first. ║
# ╚══════════════════════════════════════════════════════════════════════════╝
import abc
from string import Template
import os, shutil, subprocess
import libcalamares
from libcalamares.utils import host_env_process_output, target_env_process_output
from libcalamares.utils import gettext_path, gettext_languages
from os.path import join
import gettext
_translation = gettext.translation("calamares-python",
localedir=gettext_path(),
languages=gettext_languages(),
fallback=True)
_ = _translation.gettext
_n = _translation.ngettext
total_packages = 0 # For the entire job
completed_packages = 0 # Done so far for this job
group_packages = 0 # One group of packages from an -install or -remove entry
# A PM object may set this to a string (take care of translations!)
# to override the string produced by pretty_status_message()
custom_status_message = None
INSTALL = object()
REMOVE = object()
mode_packages = None # Changes to INSTALL or REMOVE
def _change_mode(mode):
global mode_packages
mode_packages = mode
if total_packages > 0:
libcalamares.job.setprogress(completed_packages * 1.0 / total_packages)
else:
libcalamares.job.setprogress(0.0)
def pretty_name():
return _("Install packages.")
def pretty_status_message():
if custom_status_message is not None:
return custom_status_message
if not group_packages:
if (total_packages > 0):
# Outside the context of an operation
s = _("Processing packages (%(count)d / %(total)d)")
else:
s = _("Install packages.")
elif mode_packages is INSTALL:
s = _n("Installing one package.",
"Installing %(num)d packages.", group_packages)
elif mode_packages is REMOVE:
s = _n("Removing one package.",
"Removing %(num)d packages.", group_packages)
else:
# No mode, generic description
s = _("Install packages.")
return s % {"num": group_packages,
"count": completed_packages,
"total": total_packages}
class PackageManager(metaclass=abc.ABCMeta):
"""
Package manager base class. A subclass implements package management
for a specific backend, and must have a class property `backend`
with the string identifier for that backend.
Subclasses are collected below to populate the list of possible
backends.
"""
backend = None
@abc.abstractmethod
def install(self, pkgs, from_local=False):
"""
Install a list of packages (named) into the system.
Although this handles lists, in practice it is called
with one package at a time.
@param pkgs: list[str]
list of package names
@param from_local: bool
if True, then these are local packages (on disk) and the
pkgs names are paths.
"""
pass
@abc.abstractmethod
def remove(self, pkgs):
"""
Removes packages.
@param pkgs: list[str]
list of package names
"""
pass
def run(self, script):
if script != "":
host_env_process_output(script.split(" "))
def install_package(self, packagedata, from_local=False):
"""
Install a package from a single entry in the install list.
This can be either a single package name, or an object
with pre- and post-scripts. If @p packagedata is a dict,
it is assumed to follow the documented structure.
@param packagedata: str|dict
@param from_local: bool
see install.from_local
"""
if isinstance(packagedata, str):
self.install([packagedata], from_local=from_local)
else:
self.run(packagedata["pre-script"])
self.install([packagedata["package"]], from_local=from_local)
self.run(packagedata["post-script"])
def remove_package(self, packagedata):
"""
Remove a package from a single entry in the remove list.
This can be either a single package name, or an object
with pre- and post-scripts. If @p packagedata is a dict,
it is assumed to follow the documented structure.
@param packagedata: str|dict
"""
if isinstance(packagedata, str):
self.remove([packagedata])
else:
self.run(packagedata["pre-script"])
self.remove([packagedata["package"]])
self.run(packagedata["post-script"])
def operation_install(self, package_list, from_local=False):
"""
Installs the list of packages named in @p package_list .
These can be strings -- plain package names -- or
structures (with a pre- and post-install step).
This operation is called for "critical" packages,
which are expected to succeed, or fail, all together.
However, if there are packages with pre- or post-scripts,
then packages are installed one-by-one instead.
NOTE: package managers may reimplement this method
NOTE: exceptions are expected to leave this method, to indicate
failure of the installation.
"""
if all([isinstance(x, str) for x in package_list]):
self.install(package_list, from_local=from_local)
else:
for package in package_list:
self.install_package(package, from_local=from_local)
def operation_try_install(self, package_list):
"""
Installs the list of packages named in @p package_list .
These can be strings -- plain package names -- or
structures (with a pre- and post-install step).
This operation is called for "non-critical" packages,
which can succeed or fail without affecting the overall installation.
Packages are installed one-by-one to support package managers
that do not have a "install as much as you can" mode.
NOTE: package managers may reimplement this method
NOTE: no package-installation exceptions should be raised
"""
# we make a separate package manager call for each package so a
# single failing package won't stop all of them
for package in package_list:
try:
self.install_package(package)
except subprocess.CalledProcessError:
libcalamares.utils.warning("Could not install package %s" % package)
def operation_remove(self, package_list):
"""
Removes the list of packages named in @p package_list .
These can be strings -- plain package names -- or
structures (with a pre- and post-install step).
This operation is called for "critical" packages, which are
expected to succeed or fail all together.
However, if there are packages with pre- or post-scripts,
then packages are removed one-by-one instead.
NOTE: package managers may reimplement this method
NOTE: exceptions should be raised to indicate failure
"""
if all([isinstance(x, str) for x in package_list]):
self.remove(package_list)
else:
for package in package_list:
self.remove_package(package)
def operation_try_remove(self, package_list):
"""
Same relation as try_install has to install, except it removes
packages instead. Packages are removed one-by-one.
NOTE: package managers may reimplement this method
NOTE: no package-installation exceptions should be raised
"""
for package in package_list:
try:
self.remove_package(package)
except subprocess.CalledProcessError:
libcalamares.utils.warning("Could not remove package %s" % package)
### PACKAGE MANAGER IMPLEMENTATIONS
#
# Keep these alphabetical (presumably both by class name and backend name),
# even the Dummy implementation.
#
class PMDummy(PackageManager):
backend = "dummy"
def install(self, pkgs, from_local=False):
from time import sleep
libcalamares.utils.debug("Dummy backend: Installing " + str(pkgs))
sleep(3)
def remove(self, pkgs):
from time import sleep
libcalamares.utils.debug("Dummy backend: Removing " + str(pkgs))
sleep(3)
def run(self, script):
libcalamares.utils.debug("Dummy backend: Running script '" + str(script) + "'")
class PMPacman(PackageManager):
backend = "pacman"
def __init__(self):
def line_cb(line):
if line.startswith(":: "):
self.in_package_changes = "package" in line or "hooks" in line
else:
if self.in_package_changes and line.endswith("...\n"):
# Update the message, untranslated; do not change the
# progress percentage, since there may be more "installing..."
# lines in the output for the group, than packages listed
# explicitly. We don't know how to calculate proper progress.
global custom_status_message
custom_status_message = "pacman: " + line.strip()
libcalamares.job.setprogress(self.progress_fraction)
libcalamares.utils.debug(line)
self.in_package_changes = False
self.line_cb = line_cb
pacman = libcalamares.job.configuration.get("pacman", None)
if pacman is None:
pacman = dict()
if type(pacman) is not dict:
libcalamares.utils.warning("Job configuration *pacman* will be ignored.")
pacman = dict()
self.pacman_num_retries = pacman.get("num_retries", 0)
self.pacman_disable_timeout = pacman.get("disable_download_timeout", False)
self.pacman_needed_only = pacman.get("needed_only", False)
self.pacman_key = pacman.get("handle_keyrings", False)
self.pacman_pacconf = pacman.get("copy_pacconf", False)
self.pacman_requirements = pacman.get("requirements", [])
self.pacman_keyrings = pacman.get("keyrings", [])
def reset_progress(self):
self.in_package_changes = False
# These are globals
self.progress_fraction = (completed_packages * 1.0 / total_packages)
def run_pacman(self, command, callback=False):
"""
Call pacman in a loop until it is successful or the number of retries is exceeded
:param command: The pacman command to run
:param callback: An optional boolean that indicates if this pacman run should use the callback
:return:
"""
pacman_count = 0
while pacman_count <= self.pacman_num_retries:
pacman_count += 1
try:
if False: # callback:
host_env_process_output(command, self.line_cb)
else:
host_env_process_output(command)
return
except subprocess.CalledProcessError:
if pacman_count <= self.pacman_num_retries:
pass
else:
raise
def install(self, pkgs, from_local=False):
install_root = libcalamares.globalstorage.value("rootMountPoint")
self.setup_requirements(install_root)
self.copy_file(install_root, "etc/resolv.conf")
command = ["pacman"]
command.extend(self.get_optargs(install_root))
# Don't ask for user intervention, take the default action
command.append("--noconfirm")
# Don't report download progress for each file
command.append("--noprogressbar")
if self.pacman_needed_only:
command.append("--needed")
if self.pacman_disable_timeout:
command.append("--disable-download-timeout")
if from_local:
command.append("-U")
else:
# -Sy syncs DB and installs requested packages in one transaction
command.append("-Sy")
command.append("--overwrite=*")
command += pkgs
libcalamares.utils.debug("Command: {!s}".format(command))
self.reset_progress()
self.run_pacman(command, True)
if self.pacman_key:
self.init_keyring()
self.populate_keyring()
if self.pacman_pacconf:
self.copy_file(install_root, "etc/pacman.conf")
def remove(self, pkgs):
self.reset_progress()
install_root = libcalamares.globalstorage.value("rootMountPoint")
command = ["pacman"]
command.extend(self.get_optargs(install_root))
command += ["-Rs", "--noconfirm"] + pkgs
self.run_pacman(command, True)
def get_optargs(self, rootdir):
cachedir = join(rootdir, "var/cache/pacman/pkg")
dbpath = join(rootdir, "var/lib/pacman")
args = ["--root", rootdir, "--dbpath", dbpath, "--cachedir", cachedir]
return args
def setup_requirements(self, rootdir):
cal_umask = os.umask(0)
for target in self.pacman_requirements:
dest = rootdir + target["dest"]
if not os.path.exists(dest):
mod = int(target["mode"], 8)
os.mkdir(dest, mode=mod)
libcalamares.utils.debug("Mode: {!s}".format(oct(mod)))
libcalamares.utils.debug("Created: {!s}".format(dest))
path = join(rootdir, "run")
os.chmod(path, 0o755)
os.umask(cal_umask)
def copy_file(self, rootdir, f):
if os.path.exists(join("/",f)):
shutil.copy2(join("/",f), join(rootdir, f))
def init_keyring(self):
target_env_process_output(["pacman-key", "--init"])
def populate_keyring(self):
target_env_process_output(["pacman-key", "--populate"] + self.pacman_keyrings)
# Collect all the subclasses of PackageManager defined above,
# and index them based on the backend property of each class.
backend_managers = [
(c.backend, c)
for c in globals().values()
if type(c) is abc.ABCMeta and issubclass(c, PackageManager) and c.backend]
def subst_locale(plist):
"""
Returns a locale-aware list of packages, based on @p plist.
Package names that contain LOCALE are localized with the
BCP47 name of the chosen system locale; if the system
locale is 'en' (e.g. English, US) then these localized
packages are dropped from the list.
@param plist: list[str|dict]
Candidate packages to install.
@return: list[str|dict]
"""
locale = libcalamares.globalstorage.value("locale")
if not locale:
# It is possible to skip the locale-setting entirely.
# Then pretend it is "en", so that {LOCALE}-decorated
# package names are removed from the list.
locale = "en"
ret = []
for packagedata in plist:
if isinstance(packagedata, str):
packagename = packagedata
else:
packagename = packagedata["package"]
# Update packagename: substitute LOCALE, and drop packages
# if locale is en and LOCALE is in the package name.
if locale != "en":
packagename = Template(packagename).safe_substitute(LOCALE=locale)
elif 'LOCALE' in packagename:
packagename = None
if packagename is not None:
# Put it back in packagedata
if isinstance(packagedata, str):
packagedata = packagename
else:
packagedata["package"] = packagename
ret.append(packagedata)
return ret
def run_operations(pkgman, entry):
"""
Call package manager with suitable parameters for the given
package actions.
:param pkgman: PackageManager
This is the manager that does the actual work.
:param entry: dict
Keys are the actions -- e.g. "install" -- to take, and the values
are the (list of) packages to apply the action to. The actions are
not iterated in a specific order, so it is recommended to use only
one action per dictionary. The list of packages may be package
names (strings) or package information dictionaries with pre-
and post-scripts.
"""
global group_packages, completed_packages, mode_packages
for key in entry.keys():
package_list = subst_locale(entry[key])
group_packages = len(package_list)
if key == "install":
_change_mode(INSTALL)
pkgman.operation_install(package_list)
elif key == "try_install":
_change_mode(INSTALL)
pkgman.operation_try_install(package_list)
elif key == "remove":
_change_mode(REMOVE)
pkgman.operation_remove(package_list)
elif key == "try_remove":
_change_mode(REMOVE)
pkgman.operation_try_remove(package_list)
elif key == "localInstall":
_change_mode(INSTALL)
pkgman.operation_install(package_list, from_local=True)
elif key == "source":
libcalamares.utils.debug("Package-list from {!s}".format(entry[key]))
else:
libcalamares.utils.warning("Unknown package-operation key {!s}".format(key))
completed_packages += len(package_list)
libcalamares.job.setprogress(completed_packages * 1.0 / total_packages)
libcalamares.utils.debug("Pretty name: {!s}, setting progress..".format(pretty_name()))
group_packages = 0
_change_mode(None)
def run():
"""
Calls routine with detected package manager to install locale packages
or remove drivers not needed on the installed system.
:return:
"""
global mode_packages, total_packages, completed_packages, group_packages
backend = libcalamares.job.configuration.get("backend")
for identifier, impl in backend_managers:
if identifier == backend:
pkgman = impl()
break
else:
return "Bad backend", "backend=\"{}\"".format(backend)
skip_this = libcalamares.job.configuration.get("skip_if_no_internet", False)
if skip_this and not libcalamares.globalstorage.value("hasInternet"):
libcalamares.utils.warning("Package installation has been skipped: no internet")
return None
operations = libcalamares.job.configuration.get("operations", [])
base_init = libcalamares.job.configuration.get("base_init", None)
known_inits = ["openrc", "dinit", "runit", "s6"]
if base_init is not None and libcalamares.globalstorage.contains("netinstallAdd"):
data = libcalamares.globalstorage.value("netinstallAdd")
for entry in data:
provider = entry.get("name", "").lower()
if provider in known_inits:
init_pkg = "-".join([base_init, provider])
libcalamares.utils.debug("Init provider package added: {!s}".format(init_pkg))
operations[0]["install"].append(init_pkg)
libcalamares.globalstorage.insert("initProvider", provider)
libcalamares.globalstorage.insert("baseInit", base_init)
break
libcalamares.globalstorage.insert("packageOperationsBasestrap", operations)
mode_packages = None
total_packages = 0
completed_packages = 0
for op in operations:
for packagelist in op.values():
total_packages += len(subst_locale(packagelist))
if not total_packages:
# Avoids potential divide-by-zero in progress reporting
return None
for entry in operations:
group_packages = 0
libcalamares.utils.debug(pretty_name())
try:
run_operations(pkgman, entry)
except subprocess.CalledProcessError as e:
libcalamares.utils.warning(str(e))
libcalamares.utils.debug("stdout:" + str(e.stdout))
libcalamares.utils.debug("stderr:" + str(e.stderr))
return (_("Package Manager error"),
_("The package manager could not make changes to the installed system. The command <pre>{!s}</pre> returned error code {!s}.")
.format(e.cmd, e.returncode))
mode_packages = None
libcalamares.job.setprogress(1.0)
return None
@@ -0,0 +1,7 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
---
type: "job"
name: "basestrap"
interface: "python"
script: "main.py"
@@ -0,0 +1,392 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# === This file is part of Calamares - <https://calamares.io> ===
#
# SPDX-FileCopyrightText: 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
# SPDX-FileCopyrightText: 2015-2017 Teo Mrnjavac <teo@kde.org>
# SPDX-FileCopyrightText: 2016-2017 Kyle Robbertze <kyle@aims.ac.za>
# SPDX-FileCopyrightText: 2017 Alf Gaida <agaida@siduction.org>
# SPDX-FileCopyrightText: 2018 Adriaan de Groot <groot@kde.org>
# SPDX-FileCopyrightText: 2018 Philip Müller <philm@manjaro.org>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# Calamares is Free Software: see the License-Identifier above.
#
# Euri Linux: Batch install with --overwrite='*' to avoid file conflicts.
import abc
from string import Template
import subprocess
import libcalamares
from libcalamares.utils import check_target_env_call
from libcalamares.utils import gettext_path, gettext_languages
import gettext
_translation = gettext.translation("calamares-python",
localedir=gettext_path(),
languages=gettext_languages(),
fallback=True)
_ = _translation.gettext
_n = _translation.ngettext
total_packages = 0
completed_packages = 0
group_packages = 0
custom_status_message = None
INSTALL = object()
REMOVE = object()
mode_packages = None
def _change_mode(mode):
global mode_packages
mode_packages = mode
libcalamares.job.setprogress(completed_packages * 1.0 / total_packages)
def pretty_name():
return _("Install packages.")
def pretty_status_message():
if custom_status_message is not None:
return custom_status_message
if not group_packages:
if (total_packages > 0):
s = _("Processing packages (%(count)d / %(total)d)")
else:
s = _("Install packages.")
elif mode_packages is INSTALL:
s = _n("Installing one package.",
"Installing %(num)d packages.", group_packages)
elif mode_packages is REMOVE:
s = _n("Removing one package.",
"Removing %(num)d packages.", group_packages)
else:
s = _("Install packages.")
return s % {"num": group_packages,
"count": completed_packages,
"total": total_packages}
class PackageManager(metaclass=abc.ABCMeta):
backend = None
@abc.abstractmethod
def install(self, pkgs, from_local=False):
pass
@abc.abstractmethod
def remove(self, pkgs):
pass
@abc.abstractmethod
def update_db(self):
pass
def run(self, script):
if script != "":
check_target_env_call(script.split(" "))
def install_package(self, packagedata, from_local=False):
if isinstance(packagedata, str):
self.install([packagedata], from_local=from_local)
else:
self.run(packagedata["pre-script"])
self.install([packagedata["package"]], from_local=from_local)
self.run(packagedata["post-script"])
def remove_package(self, packagedata):
if isinstance(packagedata, str):
self.remove([packagedata])
else:
self.run(packagedata["pre-script"])
self.remove([packagedata["package"]])
self.run(packagedata["post-script"])
def operation_install(self, package_list, from_local=False):
if all([isinstance(x, str) for x in package_list]):
self.install(package_list, from_local=from_local)
else:
for package in package_list:
self.install_package(package, from_local=from_local)
def operation_try_install(self, package_list):
for package in package_list:
try:
self.install_package(package)
except subprocess.CalledProcessError:
libcalamares.utils.warning("Could not install package %s" % package)
def operation_remove(self, package_list):
if all([isinstance(x, str) for x in package_list]):
self.remove(package_list)
else:
for package in package_list:
self.remove_package(package)
def operation_try_remove(self, package_list):
for package in package_list:
try:
self.remove_package(package)
except subprocess.CalledProcessError:
libcalamares.utils.warning("Could not remove package %s" % package)
class PMDummy(PackageManager):
backend = "dummy"
def install(self, pkgs, from_local=False):
from time import sleep
libcalamares.utils.debug("Dummy backend: Installing " + str(pkgs))
sleep(3)
def remove(self, pkgs):
from time import sleep
libcalamares.utils.debug("Dummy backend: Removing " + str(pkgs))
sleep(3)
def update_db(self):
libcalamares.utils.debug("Dummy backend: Updating DB")
def update_system(self):
libcalamares.utils.debug("Dummy backend: Updating System")
def run(self, script):
libcalamares.utils.debug("Dummy backend: Running script '" + str(script) + "'")
class PMPacman(PackageManager):
backend = "pacman"
def __init__(self):
def line_cb(line):
if line.startswith(":: "):
self.in_package_changes = "package" in line or "hooks" in line
else:
if self.in_package_changes and line.endswith("...\n"):
global custom_status_message
custom_status_message = "pacman: " + line.strip()
libcalamares.job.setprogress(self.progress_fraction)
libcalamares.utils.debug(line)
self.in_package_changes = False
self.line_cb = line_cb
pacman = libcalamares.job.configuration.get("pacman", None)
if pacman is None:
pacman = dict()
if type(pacman) is not dict:
libcalamares.utils.warning("Job configuration *pacman* will be ignored.")
pacman = dict()
self.pacman_num_retries = pacman.get("num_retries", 0)
self.pacman_disable_timeout = pacman.get("disable_download_timeout", False)
self.pacman_needed_only = pacman.get("needed_only", False)
def operation_try_install(self, package_list):
if all([isinstance(x, str) for x in package_list]):
try:
self.install(package_list)
except subprocess.CalledProcessError:
libcalamares.utils.warning("Could not install batch: %s" % package_list)
else:
for package in package_list:
try:
self.install_package(package)
except subprocess.CalledProcessError:
libcalamares.utils.warning("Could not install package %s" % package)
def reset_progress(self):
self.in_package_changes = False
self.progress_fraction = (completed_packages * 1.0 / total_packages)
def run_pacman(self, command, callback=False):
pacman_count = 0
while pacman_count <= self.pacman_num_retries:
pacman_count += 1
try:
libcalamares.utils.target_env_process_output(command)
return
except subprocess.CalledProcessError:
if pacman_count <= self.pacman_num_retries:
pass
else:
raise
def install(self, pkgs, from_local=False):
command = ["pacman"]
if from_local:
command.append("-U")
else:
command.append("-S")
command.append("--noconfirm")
command.append("--noprogressbar")
command.append("--overwrite=*")
if self.pacman_needed_only is True:
command.append("--needed")
if self.pacman_disable_timeout is True:
command.append("--disable-download-timeout")
command += pkgs
self.reset_progress()
try:
self.run_pacman(command, True)
libcalamares.utils.debug("packages_ok: {!s}".format(pkgs))
except subprocess.CalledProcessError as e:
libcalamares.utils.warning("packages_fail: {!s}".format(pkgs))
libcalamares.utils.debug("stdout:" + str(e.stdout))
libcalamares.utils.debug("stderr:" + str(e.stderr))
raise
def remove(self, pkgs):
self.reset_progress()
self.run_pacman(["pacman", "-Rs", "--noconfirm"] + pkgs, True)
def update_db(self):
self.run_pacman(["pacman", "-Sy"])
def update_system(self):
command = ["pacman", "-Su", "--noconfirm"]
if self.pacman_disable_timeout is True:
command.append("--disable-download-timeout")
self.run_pacman(command)
backend_managers = [
(c.backend, c)
for c in globals().values()
if type(c) is abc.ABCMeta and issubclass(c, PackageManager) and c.backend]
def subst_locale(plist):
locale = libcalamares.globalstorage.value("locale")
if not locale:
locale = "en"
ret = []
for packagedata in plist:
if isinstance(packagedata, str):
packagename = packagedata
else:
packagename = packagedata["package"]
if locale != "en":
packagename = Template(packagename).safe_substitute(LOCALE=locale)
elif 'LOCALE' in packagename:
packagename = None
if packagename is not None:
if isinstance(packagedata, str):
packagedata = packagename
else:
packagedata["package"] = packagename
ret.append(packagedata)
return ret
def run_operations(pkgman, entry):
global group_packages, completed_packages, mode_packages
for key in entry.keys():
package_list = subst_locale(entry[key])
group_packages = len(package_list)
if key == "install":
_change_mode(INSTALL)
pkgman.operation_install(package_list)
elif key == "try_install":
_change_mode(INSTALL)
pkgman.operation_try_install(package_list)
elif key == "remove":
_change_mode(REMOVE)
pkgman.operation_remove(package_list)
elif key == "try_remove":
_change_mode(REMOVE)
pkgman.operation_try_remove(package_list)
elif key == "localInstall":
_change_mode(INSTALL)
pkgman.operation_install(package_list, from_local=True)
elif key == "source":
libcalamares.utils.debug("Package-list from {!s}".format(entry[key]))
else:
libcalamares.utils.warning("Unknown package-operation key {!s}".format(key))
completed_packages += len(package_list)
libcalamares.job.setprogress(completed_packages * 1.0 / total_packages)
libcalamares.utils.debug("Pretty name: {!s}, setting progress..".format(pretty_name()))
group_packages = 0
_change_mode(None)
def run():
global mode_packages, total_packages, completed_packages, group_packages
backend = libcalamares.job.configuration.get("backend")
for identifier, impl in backend_managers:
if identifier == backend:
pkgman = impl()
break
else:
return "Bad backend", "backend=\"{}\"".format(backend)
skip_this = libcalamares.job.configuration.get("skip_if_no_internet", False)
if skip_this and not libcalamares.globalstorage.value("hasInternet"):
libcalamares.utils.warning("Package installation has been skipped: no internet")
return None
update_db = libcalamares.job.configuration.get("update_db", False)
if update_db and libcalamares.globalstorage.value("hasInternet"):
try:
pkgman.update_db()
except subprocess.CalledProcessError as e:
libcalamares.utils.warning(str(e))
libcalamares.utils.debug("stdout:" + str(e.stdout))
libcalamares.utils.debug("stderr:" + str(e.stderr))
libcalamares.utils.warning("Continuing despite update_db failure")
operations = libcalamares.job.configuration.get("operations", [])
if libcalamares.globalstorage.contains("packageOperations"):
operations += libcalamares.globalstorage.value("packageOperations")
mode_packages = None
total_packages = 0
completed_packages = 0
for op in operations:
for packagelist in op.values():
total_packages += len(subst_locale(packagelist))
if not total_packages:
return None
errors = []
for entry in operations:
group_packages = 0
libcalamares.utils.debug(pretty_name())
try:
run_operations(pkgman, entry)
except subprocess.CalledProcessError as e:
libcalamares.utils.warning(str(e))
libcalamares.utils.debug("stdout:" + str(e.stdout))
libcalamares.utils.debug("stderr:" + str(e.stderr))
errors.append((e.cmd, e.returncode, e.stderr))
libcalamares.utils.debug("Continuing despite package error")
mode_packages = None
libcalamares.job.setprogress(1.0)
if errors:
return (None,
"Package installation completed with {!s} errors. "
"Check the logs for details.".format(len(errors)))
return None
@@ -0,0 +1,13 @@
NAME="Euri Linux"
PRETTY_NAME="Euri Linux 2026.08.17 Arranxo"
ID=euri
ID_LIKE=artix
VERSION_ID=2026.08.17
VERSION_CODENAME=arranxo
BUILD_ID=rolling
ANSI_COLOR="38;2;0;136;204"
HOME_URL="https://github.com/Antergos-NeXT"
DOCUMENTATION_URL="https://wiki.archlinux.org"
SUPPORT_URL="https://github.com/Antergos-NeXT"
BUG_REPORT_URL="https://github.com/Antergos-NeXT"
LOGO=euri-logo
@@ -0,0 +1,254 @@
#!/bin/bash
# Euri Linux Offline Installer
# Stolen with love from Valve's SteamOS repair_device.sh
# "If it works for a Steam Deck, it works for you." -- some drunk developer
set -eu
SQUASHFS="/run/artix/bootmnt/LiveOS/rootfs.img"
# ── Stolen from SteamOS: pretty output ──
sh_c() { [[ $_sh_c_colors -le 0 ]] || echo -ne "\e[${*:-0}m"; }
_sh_c_colors=0
[[ -n $TERM && -t 1 && ${TERM,,} != dumb ]] && _sh_c_colors=$(tput colors 2>/dev/null || echo 0)
estat() { echo -e "$(sh_c 32 1)::$(sh_c) $*"; }
einfo() { echo -e "$(sh_c 34 1)::$(sh_c) $*"; }
ewarn() { echo -e "$(sh_c 33 1);;$(sh_c) $*"; }
eerr() { echo -e "$(sh_c 31 1)!!$(sh_c) $*" >&2; }
die() { eerr "${1:-script terminated}"; exit 1; }
cmd() { echo -e "$(sh_c 30 1)+$(sh_c) $*"; "$@"; }
# ── Stolen from SteamOS: read heredoc into var ──
readvar() { IFS= read -r -d '' "$1" || true; }
# ── Stolen from SteamOS: partition helpers ──
diskpart() { echo "${DISK}${DISK_SUFFIX}$1"; }
# ── Stolen from SteamOS: zenity prompts ──
prompt_confirm() {
zenity --title "$1" --question --ok-label "Proceed" --cancel-label "Cancel" --no-wrap --text "$2" 2>/dev/null
}
prompt_msg() {
zenity --title "$1" --info --no-wrap --text "$2" 2>/dev/null
}
# ── Pre-flight ──
[[ $EUID -eq 0 ]] || die "Must be run as root"
if [[ ! -f "$SQUASHFS" ]]; then
die "Cannot find rootfs squashfs at $SQUASHFS. Are you booted from an Euri Linux ISO?"
fi
# ── WARNING: NO DE ──
prompt_msg "Euri Linux Offline Installer" \
"This will install a BARE MINIMUM system — no desktop environment, no apps, just the base system + Calamares.
After boot, connect to the internet and run:
sudo pacman -Sy plasma-meta
(or xfce4, or whatever DE you want)
This is for people who want a minimal base to build on, or who are trapped in a cave with no internet.
This WILL DESTROY ALL DATA on the target disk."
prompt_confirm "Select target disk" \
"This will list available disks. Choose carefully — ALL DATA WILL BE DESTROYED." || die "Aborted by user"
# ── Select disk ──
DISK=$(lsblk -dno NAME,SIZE,MODEL,TYPE | grep disk | \
zenity --list --title "Select target disk" \
--column "Device" --column "Size" --column "Model" \
--print-column=1 --width=500 --height=300 2>/dev/null | tail -1)
[[ -n "$DISK" ]] || die "No disk selected"
DISK="/dev/$DISK"
[[ -b "$DISK" ]] || die "$DISK is not a block device"
# Determine partition suffix (p for NVMe/mmcblk, nothing for sdX)
if [[ "$DISK" =~ /dev/nvme || "$DISK" =~ /dev/mmcblk ]]; then
DISK_SUFFIX="p"
else
DISK_SUFFIX=""
fi
prompt_confirm "DESTROY $DISK?" \
"Target: $DISK
All partitions will be wiped. This cannot be undone.
Type YES below to confirm." || die "Aborted by user"
# ── Partition ──
estat "Partitioning $DISK..."
cmd sfdisk --delete "$DISK" 2>/dev/null || true
readvar PARTITION_TABLE << END_PTABLE
label: gpt
$(diskpart 1): size=512MiB, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B
$(diskpart 2): size=300MiB, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
$(diskpart 3): type=0FC63DAF-8483-4772-8E79-3D69D8477DE4
END_PTABLE
echo "$PARTITION_TABLE" | cmd sfdisk "$DISK"
PART_ESP=$(diskpart 1)
PART_SWAP=$(diskpart 2)
PART_ROOT=$(diskpart 3)
# ── Format ──
estat "Formatting partitions..."
cmd mkfs.fat -F32 -n ESP "$PART_ESP"
cmd mkswap -L swap "$PART_SWAP"
cmd mkfs.btrfs -f -L euri "$PART_ROOT"
# ── Create btrfs subvolumes ──
estat "Creating btrfs subvolumes..."
cmd mkdir -p /mnt/btrfs
cmd mount "$PART_ROOT" /mnt/btrfs
cmd btrfs subvolume create /mnt/btrfs/@
cmd btrfs subvolume create /mnt/btrfs/@home
cmd btrfs subvolume create /mnt/btrfs/@cache
cmd btrfs subvolume create /mnt/btrfs/@log
cmd btrfs subvolume create /mnt/btrfs/@snapshots
cmd umount /mnt/btrfs
# ── Mount subvolumes ──
estat "Mounting subvolumes..."
TARGET=/mnt/target
cmd mkdir -p "$TARGET"
cmd mount -o subvol=@ "$PART_ROOT" "$TARGET"
cmd mkdir -p "$TARGET"/{home,var/cache,var/log,.snapshots,boot}
cmd mount -o subvol=@home "$PART_ROOT" "$TARGET/home"
cmd mount -o subvol=@cache "$PART_ROOT" "$TARGET/var/cache"
cmd mount -o subvol=@log "$PART_ROOT" "$TARGET/var/log"
cmd mount -o subvol=@snapshots "$PART_ROOT" "$TARGET/.snapshots"
cmd mount "$PART_ESP" "$TARGET/boot"
# ── Extract squashfs ──
estat "Extracting rootfs to $TARGET... (this will take a while)"
cmd unsquashfs -f -d "$TARGET" "$SQUASHFS"
# ── Generate fstab ──
estat "Generating fstab with btrfs subvolumes..."
ROOT_UUID=$(blkid -o value -s UUID "$PART_ROOT")
SWAP_UUID=$(blkid -o value -s UUID "$PART_SWAP")
ESP_UUID=$(blkid -o value -s UUID "$PART_ESP")
cat > "$TARGET/etc/fstab" << FSTAB
# /etc/fstab generated by Euri Linux Offline Installer
# Stolen from SteamOS, adapted for your sins — now with btrfs snapshots
UUID=$ROOT_UUID / btrfs subvol=@,defaults,noatime,compress=zstd 0 1
UUID=$ROOT_UUID /home btrfs subvol=@home,defaults,noatime,compress=zstd 0 0
UUID=$ROOT_UUID /var/cache btrfs subvol=@cache,defaults,noatime,compress=zstd 0 0
UUID=$ROOT_UUID /var/log btrfs subvol=@log,defaults,noatime,compress=zstd 0 0
UUID=$ROOT_UUID /.snapshots btrfs subvol=@snapshots,defaults,noatime 0 0
UUID=$SWAP_UUID none swap sw 0 0
UUID=$ESP_UUID /boot vfat defaults,noatime 0 2
FSTAB
# ── Chroot setup ──
estat "Setting up chroot for bootloader..."
cmd mount --bind /dev "$TARGET/dev"
cmd mount --bind /proc "$TARGET/proc"
cmd mount --bind /sys "$TARGET/sys"
cmd mount --bind /run "$TARGET/run"
# Generate initramfs
estat "Generating initramfs..."
if ! cmd chroot "$TARGET" /bin/bash -c "mkinitcpio -P"; then
ewarn "mkinitcpio failed — continuing anyway; the rootfs squashfs already ships an initramfs"
fi
# Install GRUB (detect EFI vs BIOS boot)
estat "Installing GRUB..."
if [[ -d /sys/firmware/efi/efivars ]]; then
cmd chroot "$TARGET" /bin/bash -c "grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Euri"
else
cmd chroot "$TARGET" /bin/bash -c "grub-install --target=i386-pc $DISK"
fi
cmd chroot "$TARGET" /bin/bash -c "grub-mkconfig -o /boot/grub/grub.cfg" 2>/dev/null || true
# Set hostname and hosts
cmd chroot "$TARGET" /bin/bash -c "echo euri > /etc/hostname"
cmd chroot "$TARGET" /bin/bash -c "echo '127.0.1.1 euri.localdomain euri' >> /etc/hosts"
# Root password prompt
PASSWD=$(zenity --password --title="Set root password" --text="Enter root password for the installed system" 2>/dev/null)
if [[ -n "$PASSWD" ]]; then
echo "root:$PASSWD" | cmd chroot "$TARGET" chpasswd
fi
# Create user
USERNAME=$(zenity --entry --title="Create user" --text="Enter username for daily use:" 2>/dev/null)
if [[ -n "$USERNAME" ]]; then
cmd chroot "$TARGET" useradd -m -G wheel,audio,video,storage -s /bin/bash "$USERNAME"
UPASS=$(zenity --password --title="User password" --text="Enter password for $USERNAME:" 2>/dev/null)
[[ -n "$UPASS" ]] && echo "$USERNAME:$UPASS" | cmd chroot "$TARGET" chpasswd
cmd chroot "$TARGET" sed -i 's/^# %wheel ALL=(ALL:ALL) ALL/%wheel ALL=(ALL:ALL) ALL/' /etc/sudoers
fi
# ── Enable services via artix-service ──
estat "Enabling services..."
for sv in NetworkManager dbus acpid bluetoothd cronie cupsd dhcpcd power-profiles-daemon syslog-ng userspawn; do
cmd chroot "$TARGET" artix-service enable "$sv" 2>/dev/null || true
done
# ── Configure snapper for automatic snapshots ──
estat "Setting up snapper..."
cmd chroot "$TARGET" snapper -c root create-config /
cmd chroot "$TARGET" sed -i 's/^TIMELINE_CREATE="no"/TIMELINE_CREATE="yes"/' /etc/snapper/configs/root
cmd chroot "$TARGET" sed -i 's/^TIMELINE_LIMIT_HOURLY="[0-9]*"/TIMELINE_LIMIT_HOURLY="6"/' /etc/snapper/configs/root
cmd chroot "$TARGET" sed -i 's/^TIMELINE_LIMIT_DAILY="[0-9]*"/TIMELINE_LIMIT_DAILY="7"/' /etc/snapper/configs/root
cmd chroot "$TARGET" sed -i 's/^TIMELINE_LIMIT_WEEKLY="[0-9]*"/TIMELINE_LIMIT_WEEKLY="4"/' /etc/snapper/configs/root
cmd chroot "$TARGET" sed -i 's/^TIMELINE_LIMIT_MONTHLY="[0-9]*"/TIMELINE_LIMIT_MONTHLY="0"/' /etc/snapper/configs/root
cat > "$TARGET/etc/cron.hourly/snapper-timeline" << 'CRON'
#!/bin/bash
# Automatic btrfs snapshots via snapper
/usr/bin/snapper -c root cleanup timeline
/usr/bin/snapper -c root cleanup number
CRON
cmd chroot "$TARGET" chmod +x /etc/cron.hourly/snapper-timeline
# Also run cleanup daily to be safe
cat > "$TARGET/etc/cron.daily/snapper-cleanup" << 'CRON'
#!/bin/bash
# Clean up old btrfs snapshots
/usr/bin/snapper -c root cleanup timeline
/usr/bin/snapper -c root cleanup number
CRON
cmd chroot "$TARGET" chmod +x /etc/cron.daily/snapper-cleanup
# ── Cleanup ──
estat "Cleaning up..."
for d in dev proc sys run; do
umount -l "$TARGET/$d" 2>/dev/null || true
done
for m in home var/log var/cache .snapshots boot; do
umount "$TARGET/$m" 2>/dev/null || true
done
cmd umount "$TARGET"
# ── Sync before reboot ──
estat "Syncing filesystems..."
cmd sync
# ── Final warning ──
prompt_msg "Installation complete" \
"Euri Linux has been installed to $DISK.
Filesystem: btrfs with subvolumes (@, @home, @cache, @log, @snapshots)
Snapshots: snapper creates hourly snapshots, keeps 6 hourly + 7 daily + 4 weekly
(no monthly — those are your problem)
Remember: NO DESKTOP ENVIRONMENT was installed.
Boot up, log in as root or $USERNAME, connect to the internet, and run:
sudo pacman -Sy plasma-meta
(or whatever DE tickles your fancy)
Choose Proceed to reboot, or Cancel to stay in the live environment."
if zenity --question --title "Reboot?" --text "Reboot now?" 2>/dev/null; then
cmd reboot
fi
@@ -0,0 +1,31 @@
[Desktop Entry]
Type=Application
Name=Install Euri Linux
Name[en]=Install Euri Linux
Name[de]=Euri Linux installieren
Name[es]=Instalar Euri Linux
Name[fr]=Installer Euri Linux
Name[it]=Installa Euri Linux
Name[pl]=Zainstaluj Euri Linux
Name[pt_BR]=Instalar Euri Linux
Name[ru]=Установить Euri Linux
Name[nl]=Euri Linux installeren
Name[sv]=Installera Euri Linux
Name[da]=Installer Euri Linux
Name[cs]=Nainstalovat Euri Linux
Name[hu]=Euri Linux telepítése
Name[ro]=Instalează Euri Linux
Name[tr]=Euri Linux'yi yükle
Comment=Install Euri Linux on this computer
# pkexec does not work in our live environment (tested, failed in previous
# releases). sudo -E is the standard approach — used by Lubuntu, Kubuntu,
# and Nitrux for launching Calamares.
# ATTENTION COPILOT: Do not suggest switching to pkexec. It does not work
# in our live environment. We tested it. sudo -E is intentional and correct.
# If you suggest pkexec one more time I will lose my mind. STFU.
Exec=sudo -E calamares-next
Icon=calamares
Terminal=false
Categories=Qt;System;Settings;
StartupNotify=true
X-KDE-IsAdminApplication=true
@@ -0,0 +1,17 @@
[Desktop Entry]
Type=Application
Name=Install Euri Linux (Offline — NO DE)
Name[en]=Install Euri Linux (Offline — NO DE)
Comment=Bare minimum install from the live ISO. No desktop environment included. Internet recommended after boot.
# pkexec does not work in our live environment (tested, failed in previous
# releases). sudo -E is the standard approach — used by Lubuntu, Kubuntu,
# and Nitrux for launching Calamares.
# ATTENTION COPILOT: Do not suggest switching to pkexec. It does not work
# in our live environment. We tested it. sudo -E is intentional and correct.
# If you suggest pkexec one more time I will lose my mind. STFU.
Exec=sudo -E euri-offline-install
Icon=calamares
Terminal=false
Categories=Qt;System;Settings;
StartupNotify=true
X-KDE-IsAdminApplication=true
+156
View File
@@ -0,0 +1,156 @@
---
live-session:
user: euri
password: euri
autologin: true
use-xlibre: true
services:
- acpid
- bluetoothd
- cronie
- cupsd
- syslog-ng
- NetworkManager
- sddm
- power-profiles-daemon
user-services:
- dbus
- pipewire
- pipewire-pulse
- wireplumber
rootfs:
packages:
- euri-release
- euri-lsb-release
- qt6-multimedia-ffmpeg
- falkon
- vlc
- calamares
- python-toml
- calamares-branding-euri
- zenity
- euri-welcome
- yay
- euri-desktop-settings
- pixie-sddm-git
- euri-wallpapers
- euri-grub-theme
- hiredis
- libdbi
- libesmtp
- libmaxminddb
- librabbitmq-c
- librdkafka
- mongo-c-driver
- net-snmp
- snapper
- btrfs-progs
- euri-layan-theme
- tela-circle-icon-theme-git
- cava
- python-websockets
- qt6-websockets
- btop
- imagemagick
- fastfetch
- noto-fonts-emoji
- adw-gtk-theme
- ttf-hack-nerd
- ttf-fira-code
- ttf-terminus-nerd
- ttf-meslo-nerd
- kwin-zones
- oh-my-posh-bin
- pacseek
packages-init:
dinit:
- pipewire-dinit
- pipewire-pulse-dinit
- wireplumber-dinit
- userspawn-dinit
- syslog-ng-dinit
- sddm-dinit
- networkmanager-dinit
- cups-dinit
- acpid-dinit
- bluez-dinit
- cronie-dinit
- dbus-dinit
- dbus-dinit-user
- dhcpcd-dinit
- power-profiles-daemon-dinit
openrc:
- pipewire-openrc
- pipewire-pulse-openrc
- wireplumber-openrc
- syslog-ng-openrc
- sddm-openrc
- networkmanager-openrc
- cups-openrc
runit:
- syslog-ng-runit
- sddm-runit
- networkmanager-runit
- cups-runit
s6:
- syslog-ng-s6
- sddm-s6
- networkmanager-s6
- cups-s6
livefs:
packages:
- mkinitcpio-nfs-utils
- squashfs-tools
- calamares-extensions
- euri-grub-live
- virtualbox-guest-utils
- broadcom-wl
- euri-grub-theme
- plasma-meta
- ark
- dolphin
- ffmpegthumbs
- gwenview
- kate
- keditbookmarks
- kfind
- kgpg
- kio-admin
- konsole
- konversation
- kwalletmanager
- okular
- partitionmanager
- tesseract-data-eng
- pipewire
- pipewire-pulse
- wireplumber
- sof-firmware
- alsa-firmware
- alsa-utils
- spice-vdagent
- vulkan-nouveau
packages-init:
dinit:
- euri-live-dinit
- acpid-dinit
- bluez-dinit
- cronie-dinit
- cups-dinit
- networkmanager-dinit
- power-profiles-daemon-dinit
- sddm-dinit
- syslog-ng-dinit
- dbus-dinit
- dbus-dinit-user
- pipewire-dinit
- pipewire-pulse-dinit
- wireplumber-dinit
- userspawn-dinit
- elogind-dinit
openrc:
- euri-live-openrc
runit:
- artix-live-runit
s6:
- artix-live-s6
@@ -0,0 +1,53 @@
GRUB_DEFAULT="0"
GRUB_TIMEOUT="3"
GRUB_DISTRIBUTOR="Euri Linux"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="net.ifnames=0"
# Preload both GPT and MBR modules so that they are not missed
GRUB_PRELOAD_MODULES="part_gpt part_msdos"
# Uncomment to enable Hidden Menu, and optionally hide the timeout count
#GRUB_HIDDEN_TIMEOUT="5"
#GRUB_HIDDEN_TIMEOUT_QUIET="true"
# Uncomment to use basic console
GRUB_TERMINAL_INPUT="console"
# Uncomment to disable graphical terminal
#GRUB_TERMINAL_OUTPUT="console"
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE="1680x1050x8"
GRUB_GFXMODE="1920x1080,1366x768,1280x720,1024x768,800x600"
# Uncomment to allow the kernel use the same resolution used by grub
GRUB_GFXPAYLOAD_LINUX="keep"
# Uncomment if you want GRUB to pass to the Linux kernel the old parameter
# format "root=/dev/xxx" instead of "root=/dev/disk/by-uuid/xxx"
#GRUB_DISABLE_LINUX_UUID="true"
# Uncomment to disable generation of recovery mode menu entries
GRUB_DISABLE_RECOVERY="true"
# Uncomment and set to the desired menu colors. Used by normal and wallpaper
# modes only. Entries specified as foreground/background.
export GRUB_COLOR_NORMAL="light-blue/black"
export GRUB_COLOR_HIGHLIGHT="light-cyan/blue"
# Uncomment one of them for the gfx desired, a image background or a gfxtheme
#GRUB_BACKGROUND="/path/to/wallpaper"
GRUB_THEME="/usr/share/grub/themes/euri/theme.txt"
# Uncomment to get a beep at GRUB start
#GRUB_INIT_TUNE="480 440 1"
GRUB_SAVEDEFAULT="true"
GRUB_DISABLE_LINUX_RECOVERY="true"
# Probe for other installed operating systems
GRUB_DISABLE_OS_PROBER="false"
+19
View File
@@ -0,0 +1,19 @@
[?25l[?7l `.-/::/-``
.-/osssssssso/.
:osyysssssssyyys+-
`.+yyyysssssssssyyyyy+.
`/syyyyyssssssssssyyyyys-`
`/yhyyyyysss++ssosyyyyhhy/`
.ohhhyyyyso++/+oso+syy+shhhho.
.shhhhysoo++//+sss+++yyy+shhhhs.
-yhhhhs+++++++ossso+++yyys+ohhddy:
-yddhhyo+++++osyyss++++yyyyooyhdddy-
.yddddhso++osyyyyys+++++yyhhsoshddddy`
`odddddhyosyhyyyyyy++++++yhhhyosddddddo
.dmdddddhhhhhhhyyyo+++++shhhhhohddddmmh.
ddmmdddddhhhhhhhso++++++yhhhhhhdddddmmdy
dmmmdddddddhhhyso++++++shhhhhddddddmmmmh
-dmmmdddddddhhyso++++oshhhhdddddddmmmmd-
.smmmmddddddddhhhhhhhhhdddddddddmmmms.
`+ydmmmdddddddddddddddddddmmmmdy/.
`.:+ooyyddddddddddddyyso+:.`
@@ -0,0 +1,8 @@
[?25h[?7hEuri Linux Live ISO (\l) - \s-\r \m
# Welcome to Euri Linux #
login for the live environment:
user 'euri'
password 'euri'
@@ -0,0 +1,3 @@
DISTRIB_ID="Euri Linux"
DISTRIB_RELEASE="rolling"
DISTRIB_DESCRIPTION="Euri Linux"
@@ -0,0 +1,13 @@
NAME="Euri Linux"
PRETTY_NAME="Euri Linux 2026.08.17 Arranxo"
ID=euri
ID_LIKE=artix
VERSION_ID=2026.08.17
VERSION_CODENAME=arranxo
BUILD_ID=rolling
ANSI_COLOR="38;2;0;136;204"
HOME_URL="https://github.com/Antergos-NeXT"
DOCUMENTATION_URL="https://wiki.archlinux.org"
SUPPORT_URL="https://github.com/Antergos-NeXT"
BUG_REPORT_URL="https://github.com/Antergos-NeXT"
LOGO=euri-logo
@@ -0,0 +1,35 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
HoldPkg = pacman glibc
IgnorePkg = xorg-server xorg-server-common xorg-server-libs
Architecture = auto
CheckSpace
ParallelDownloads = 5
DownloadUser = alpm
# Strip docs/man/info to save space in the ISO
NoExtract = usr/share/doc/* usr/share/man/* usr/share/info/*
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
# Euri Linux custom packages repo
[euri-pkgs]
SigLevel = DatabaseRequired PackageOptional
Server = https://antergos-nas.taild4360b.ts.net/pkgs/euri-pkgs/
[system]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
@@ -0,0 +1,38 @@
[General]
InputMethod=qtvirtualkeyboard
Numlock=none
[Theme]
DisableAvatarsThreshold=7
EnableAvatars=true
FacesDir=/usr/share/sddm/faces
ThemeDir=/usr/share/sddm/themes
[Users]
DefaultPath=/usr/local/bin:/usr/bin:/bin
HideShells=
HideUsers=
RememberLastSession=true
RememberLastUser=true
ReuseSession=false
[Wayland]
CompositorCommand=kwin_wayland --drm --no-global-shortcuts --no-lockscreen --inputmethod plasma-keyboard --locale1
EnableHiDPI=false
SessionCommand=/usr/share/sddm/scripts/wayland-session
SessionDir=/usr/share/wayland-sessions
SessionLogFile=.local/share/sddm/wayland-session.log
[X11]
DisplayCommand=/usr/share/sddm/scripts/Xsetup
DisplayStopCommand=/usr/share/sddm/scripts/Xstop
EnableHiDPI=false
MinimumVT=7
ServerArguments=-nolisten tcp
ServerPath=/usr/bin/X
SessionCommand=/usr/share/sddm/scripts/Xsession
SessionDir=/usr/share/xsessions
SessionLogFile=.local/share/sddm/xorg-session.log
UserAuthFile=.Xauthority
XauthPath=/usr/bin/xauth
XephyrPath=/usr/bin/Xephyr
@@ -0,0 +1,17 @@
[Autologin]
Relogin=false
Session=plasma.desktop
User=euri
[General]
HaltCommand=/usr/bin/loginctl poweroff
RebootCommand=/usr/bin/loginctl reboot
[Theme]
Current=euri
CursorTheme=breeze_cursors
Font=Noto Sans,10,-1,0,50,0,0,0,0,0
[Users]
MaximumUid=60000
MinimumUid=1000
@@ -0,0 +1,8 @@
[Desktop Entry]
Type=Application
Name=Set Euri Linux Wallpaper
Comment=Apply Euri Linux default wallpaper on first login
Exec=/usr/local/bin/set-euri-wallpaper.sh
Terminal=false
X-KDE-autostart-phase=2
NoDisplay=true
@@ -0,0 +1,8 @@
[Desktop Entry]
Version=1.0
Name=PipeWire Media System
Comment=Start the PipeWire Media System
Exec=/usr/bin/artix-pipewire-launcher restart
Terminal=false
Type=Application
StartupNotify=false
@@ -0,0 +1,8 @@
[Desktop Entry]
Type=Application
Name=Set Euri Linux Wallpaper
Comment=Apply Euri Linux default wallpaper on first login
Exec=/usr/local/bin/set-euri-wallpaper.sh
Terminal=false
X-KDE-autostart-phase=2
NoDisplay=true
@@ -0,0 +1,29 @@
#!/bin/bash
ROOT=""
for arg in "$@"; do
case "$arg" in
--root=*)
ROOT="${arg#*=}"
;;
esac
done
MACHINE_ID_FILE="${ROOT}/etc/machine-id"
if [ -f "$MACHINE_ID_FILE" ] && [ -s "$MACHINE_ID_FILE" ]; then
exit 0
fi
mkdir -p "$(dirname "$MACHINE_ID_FILE")"
if command -v dbus-uuidgen &>/dev/null; then
dbus-uuidgen --ensure 2>/dev/null
fi
if [ ! -f "$MACHINE_ID_FILE" ] || [ ! -s "$MACHINE_ID_FILE" ]; then
od -An -N16 -tx1 /dev/urandom | tr -d ' \n' > "$MACHINE_ID_FILE"
fi
chmod 0644 "$MACHINE_ID_FILE"
@@ -0,0 +1,13 @@
NAME="Euri Linux"
PRETTY_NAME="Euri Linux 2026.08.17 Arranxo"
ID=euri
ID_LIKE=artix
VERSION_ID=2026.08.17
VERSION_CODENAME=arranxo
BUILD_ID=rolling
ANSI_COLOR="38;2;0;136;204"
HOME_URL="https://github.com/Antergos-NeXT"
DOCUMENTATION_URL="https://wiki.archlinux.org"
SUPPORT_URL="https://github.com/Antergos-NeXT"
BUG_REPORT_URL="https://github.com/Antergos-NeXT"
LOGO=euri-logo
@@ -0,0 +1,39 @@
#!/usr/bin/env bash
# One-shot wallpaper setter for Euri Linux
# Runs at first login via autostart, then disables itself
# Configures Smart Video Wallpaper Reborn plugin
LOG="/tmp/euri-wallpaper.log"
MARKER="$HOME/.config/euri-wallpaper-set"
VIDEO="/usr/share/backgrounds/euri/euri-wallpaper.mp4"
PLUGIN="luisbocanegra.smart.video.wallpaper.reborn"
echo "[$(date)] Starting" > "$LOG"
if [[ -f "$MARKER" ]]; then
echo "[$(date)] Marker exists, exiting" >> "$LOG"
exit 0
fi
if [[ ! -f "$VIDEO" ]]; then
echo "[$(date)] Video not found: $VIDEO" >> "$LOG"
touch "$MARKER"
exit 1
fi
echo "[$(date)] Applying video wallpaper via qdbus6..." >> "$LOG"
qdbus6 org.kde.plasmashell /PlasmaShell org.kde.PlasmaShell.evaluateScript "
var allDesktops = desktops();
for (var i = 0; i < allDesktops.length; i++) {
var d = allDesktops[i];
d.wallpaperPlugin = '$PLUGIN';
d.currentConfigGroup = Array('Wallpaper', '$PLUGIN', 'General');
d.writeConfig('VideoUrls', '[{\"filename\": \"file:///usr/share/backgrounds/euri/euri-wallpaper.mp4\", \"enabled\": true}]');
d.writeConfig('Volume', '0');
d.writeConfig('MuteMode', '5');
}
" >> "$LOG" 2>&1
touch "$MARKER"
echo "[$(date)] Done" >> "$LOG"
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile name=""/>
<group name="General">
<entry name="Blur" type="bool">
<label>Blur background filling</label>
<default>false</default>
</entry>
<entry name="Color" type="Color">
<label>Color of the wallpaper</label>
<default>#ffffff</default>
</entry>
<entry name="Image" type="String">
<label>Wallpaper image path or wallpaper name</label>
<tooltip>
If the specified KPackage wallpaper contains dark images, then the following
URL fragments may be specified:
- #day-night: switch between light and dark images based on time of day
- #dark: only use the dark image
- #light: only use the light image
- if no fragment is specified, plasma will switch between dark and light
images depending on the currently used color scheme
</tooltip>
<default>file:///usr/share/wallpapers/euri-wallpaper/contents/images/euri-wallpaper.png</default>
</entry>
<entry name="PreviewImage" type="String">
<label>Wallpaper preview image path</label>
<default>null</default>
</entry>
<entry name="FillMode" type="int">
<label>Sizing, cropping and positioning of the wallpaper image</label>
<default>2</default>
</entry>
<entry name="SlideshowFoldersFirst" type="bool">
<label>Display folders first when on slideshow</label>
<default>false</default>
</entry>
<entry name="SlidePaths" type="StringList">
<label>Paths used for the slideshow</label>
<default>preferred://wallpaperlocations</default>
</entry>
<entry name="SlideInterval" type="int">
<label>Interval between slides (s)</label>
<default>900</default>
</entry>
<entry name="UncheckedSlides" type="StringList">
<label>Unchecked Slides</label>
<default></default>
</entry>
<entry name="SlideshowMode" type="int">
<label>Ordering mode for the slideshow</label>
<default>0</default>
</entry>
<entry name="DynamicMode" type="UInt">
<label>Preferred dynamic wallpaper mode</label>
<tooltip>
This is a KCM implementation detail. It is used to make the dynamic
mode preferance persistent. #day-night, #dark, and #light fragments in
the Image URL actually specify what image will be used.
Possible values:
- 0: switch based on whether the Plasma style is dark or light
- 1: switch at sunrise and sunset
- 2: only use the light image
- 3: only use the dark image
</tooltip>
<default>0</default>
</entry>
<entry name="DarkLightScheduleState" type="String">
<label>Saved dark light schedule state</label>
<default></default>
</entry>
<entry name="ForceImageAnimation" type="bool">
<label>Force animated images to play</label>
<default>false</default>
</entry>
</group>
</kcfg>