mirror of
https://github.com/basecamp/omarchy.git
synced 2026-02-17 15:25:37 +00:00
Compare commits
59 Commits
v3.2.2
...
refactor-p
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
34dbfc0d7c | ||
|
|
c7203b6714 | ||
|
|
5552be964b | ||
|
|
78bc4d34c5 | ||
|
|
27dfc23139 | ||
|
|
234f670310 | ||
|
|
080d287d74 | ||
|
|
286e6378e7 | ||
|
|
ffb080d80d | ||
|
|
6eb6c79831 | ||
|
|
98db372bce | ||
|
|
a1ed2cf37f | ||
|
|
06ee173aca | ||
|
|
a966fbbc33 | ||
|
|
b3755d423a | ||
|
|
723ea545b5 | ||
|
|
4078102b80 | ||
|
|
507062f077 | ||
|
|
49e65067d5 | ||
|
|
81687e4f34 | ||
|
|
75c0e965a0 | ||
|
|
378497c8a2 | ||
|
|
fe19eee32b | ||
|
|
14696c315e | ||
|
|
4178547bbf | ||
|
|
8984affcbe | ||
|
|
4e15165155 | ||
|
|
6fd95b3e37 | ||
|
|
42fed06d9f | ||
|
|
8963c0dd2d | ||
|
|
dc17299a69 | ||
|
|
132e42a45f | ||
|
|
36b7bc7342 | ||
|
|
b9654a9372 | ||
|
|
e4e7fae5ef | ||
|
|
46db57acc5 | ||
|
|
89c5cc2d74 | ||
|
|
7c2402ff5b | ||
|
|
b609519c83 | ||
|
|
6d583028d5 | ||
|
|
0a8bcbe40a | ||
|
|
448cf86ff3 | ||
|
|
2ac65b5273 | ||
|
|
d0af0f998b | ||
|
|
76894b9c74 | ||
|
|
b7ccb64082 | ||
|
|
de4819bd17 | ||
|
|
6f73a52510 | ||
|
|
b64046fd5e | ||
|
|
433346353e | ||
|
|
11bb11814b | ||
|
|
df3310a453 | ||
|
|
087545e17e | ||
|
|
442cd5917a | ||
|
|
21ac298e88 | ||
|
|
5ae7bad9b5 | ||
|
|
35c21d7bea | ||
|
|
29041f7a56 | ||
|
|
42bfa3582b |
@@ -1,5 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# FIXME: Update behavior
|
||||
cd ~/.local/share/omarchy
|
||||
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
|
||||
touch $migration_file
|
||||
|
||||
344
bin/omarchy-disk-config
Executable file
344
bin/omarchy-disk-config
Executable file
@@ -0,0 +1,344 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Omarchy Disk Configuration Tool
|
||||
|
||||
Interactive partition editor and validator for Omarchy installations.
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def _find_root_partition(disk_config):
|
||||
for dev_mod in disk_config.device_modifications:
|
||||
for part in dev_mod.partitions:
|
||||
if part.mountpoint == Path('/'):
|
||||
return part
|
||||
|
||||
if part.btrfs_subvols:
|
||||
for subvol in part.btrfs_subvols:
|
||||
if subvol.mountpoint == Path('/'):
|
||||
return part
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def validate_disk_config(config, interactive=True):
|
||||
from archinstall.lib.models.device import FilesystemType, Size, Unit, EncryptionType
|
||||
from archinstall.lib.output import info, warn
|
||||
|
||||
if not config.disk_config:
|
||||
return 'CONTINUE'
|
||||
|
||||
validation_warnings = []
|
||||
|
||||
boot_partition = None
|
||||
for dev_mod in config.disk_config.device_modifications:
|
||||
for part in dev_mod.partitions:
|
||||
if part.mountpoint == Path('/boot') or part.mountpoint == Path('/efi'):
|
||||
boot_partition = part
|
||||
break
|
||||
|
||||
if boot_partition:
|
||||
min_boot_size = Size(2, Unit.GiB, boot_partition.length.sector_size)
|
||||
if boot_partition.length >= min_boot_size:
|
||||
size_gb = boot_partition.length.convert(Unit.GiB).value
|
||||
info(f'✓ Boot partition size: {size_gb:.1f} GiB')
|
||||
else:
|
||||
size_mb = boot_partition.length.convert(Unit.MiB).value
|
||||
warn(f'⚠ Boot partition is only {size_mb:.0f} MiB')
|
||||
warn(' Omarchy recommends at least 2 GiB for boot partition')
|
||||
warn(' Multiple kernels may not fit')
|
||||
validation_warnings.append('boot_size')
|
||||
else:
|
||||
warn('⚠ Could not find boot partition (/boot or /efi)')
|
||||
warn(' System may not boot correctly')
|
||||
validation_warnings.append('no_boot')
|
||||
|
||||
root_partition = _find_root_partition(config.disk_config)
|
||||
|
||||
if root_partition:
|
||||
if root_partition.fs_type == FilesystemType.Btrfs:
|
||||
info('✓ Root filesystem is btrfs')
|
||||
|
||||
if root_partition.btrfs_subvols:
|
||||
subvol_names = [str(sv.name) for sv in root_partition.btrfs_subvols]
|
||||
subvol_mounts = {str(sv.mountpoint): str(sv.name) for sv in root_partition.btrfs_subvols}
|
||||
|
||||
required_subvols = {
|
||||
'/': '@',
|
||||
'/home': '@home',
|
||||
'/var/log': '@log',
|
||||
'/var/cache/pacman/pkg': '@pkg',
|
||||
}
|
||||
|
||||
missing_subvols = []
|
||||
for mount, expected_name in required_subvols.items():
|
||||
if mount not in subvol_mounts:
|
||||
missing_subvols.append(f'{expected_name} → {mount}')
|
||||
elif subvol_mounts[mount] != expected_name:
|
||||
warn(f'⚠ Subvolume at {mount} is named "{subvol_mounts[mount]}" not "{expected_name}"')
|
||||
|
||||
if missing_subvols:
|
||||
warn(f'⚠ Missing recommended subvolumes: {", ".join(missing_subvols)}')
|
||||
warn(' Omarchy recommends: @, @home, @log, @pkg')
|
||||
warn(' Some features (like Snapper) may not work optimally')
|
||||
info(f' Current subvolumes: {", ".join(subvol_names)}')
|
||||
validation_warnings.append('missing_subvols')
|
||||
else:
|
||||
info(f'✓ Btrfs subvolumes: {", ".join(subvol_names)}')
|
||||
else:
|
||||
warn('⚠ Btrfs partition has no subvolumes defined')
|
||||
warn(' Omarchy recommends subvolumes for snapshots')
|
||||
warn(' Required: @ (root), @home, @log, @pkg')
|
||||
validation_warnings.append('no_subvols')
|
||||
else:
|
||||
fs_name = root_partition.fs_type.value if root_partition.fs_type else 'unknown'
|
||||
warn(f'⚠ Root filesystem is {fs_name}, not btrfs')
|
||||
warn(' Omarchy is designed for btrfs with snapshots')
|
||||
warn(' Some features may not work correctly')
|
||||
validation_warnings.append('not_btrfs')
|
||||
|
||||
is_encrypted = False
|
||||
if config.disk_config.disk_encryption:
|
||||
enc = config.disk_config.disk_encryption
|
||||
if enc.encryption_type != EncryptionType.NoEncryption:
|
||||
is_encrypted = root_partition in enc.partitions
|
||||
|
||||
if is_encrypted:
|
||||
info('✓ Root partition is encrypted with LUKS')
|
||||
|
||||
if config.disk_config.disk_encryption.iter_time != 2000:
|
||||
old_time = config.disk_config.disk_encryption.iter_time
|
||||
config.disk_config.disk_encryption.iter_time = 2000
|
||||
info(f'✓ Adjusted iteration time: {old_time}ms → 2000ms')
|
||||
else:
|
||||
info('✓ Iteration time: 2000ms (optimal)')
|
||||
else:
|
||||
warn('⚠ Root partition is NOT encrypted')
|
||||
warn(' Omarchy recommends LUKS encryption for security')
|
||||
validation_warnings.append('no_encryption')
|
||||
else:
|
||||
warn('⚠ Could not identify root partition')
|
||||
validation_warnings.append('no_root')
|
||||
|
||||
if validation_warnings and interactive:
|
||||
import subprocess
|
||||
import shutil
|
||||
|
||||
gum_path = shutil.which('gum')
|
||||
if gum_path:
|
||||
warn('')
|
||||
|
||||
try:
|
||||
result = subprocess.run(
|
||||
['gum', 'choose', '--header', 'Validation warnings detected. What would you like to do?',
|
||||
'Re-edit partitions', 'Continue anyway', 'Abort'],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
)
|
||||
|
||||
choice = result.stdout.strip() if result.stdout else ''
|
||||
|
||||
if choice == 'Re-edit partitions':
|
||||
return 'RE_EDIT'
|
||||
elif choice == 'Abort':
|
||||
return 'ABORT'
|
||||
else:
|
||||
info('Continuing despite warnings')
|
||||
return 'CONTINUE'
|
||||
|
||||
except (subprocess.CalledProcessError, KeyboardInterrupt):
|
||||
return 'ABORT'
|
||||
|
||||
return 'CONTINUE'
|
||||
|
||||
|
||||
def apply_omarchy_partition_defaults():
|
||||
import archinstall.lib.interactions.disk_conf as disk_conf_module
|
||||
from archinstall.lib.models.device import (
|
||||
PartitionModification, ModificationStatus, PartitionType,
|
||||
Size, Unit, SectorSize, FilesystemType, PartitionFlag,
|
||||
DeviceModification, BDevice
|
||||
)
|
||||
from archinstall.lib.interactions.disk_conf import get_default_btrfs_subvols
|
||||
from archinstall.lib.disk.device_handler import device_handler
|
||||
|
||||
def _boot_partition_2gib(sector_size: SectorSize, using_gpt: bool) -> PartitionModification:
|
||||
flags = [PartitionFlag.BOOT]
|
||||
size = Size(2, Unit.GiB, sector_size)
|
||||
start = Size(1, Unit.MiB, sector_size)
|
||||
if using_gpt:
|
||||
flags.append(PartitionFlag.ESP)
|
||||
|
||||
return PartitionModification(
|
||||
status=ModificationStatus.Create,
|
||||
type=PartitionType.Primary,
|
||||
start=start,
|
||||
length=size,
|
||||
mountpoint=Path('/boot'),
|
||||
fs_type=FilesystemType.Fat32,
|
||||
flags=flags,
|
||||
)
|
||||
|
||||
def _select_main_filesystem_btrfs() -> FilesystemType:
|
||||
return FilesystemType.Btrfs
|
||||
|
||||
def _select_mount_options_compressed() -> list[str]:
|
||||
return ['compress=zstd']
|
||||
|
||||
def _suggest_single_disk_auto_subvolumes(
|
||||
device: BDevice,
|
||||
filesystem_type: FilesystemType | None = None,
|
||||
separate_home: bool | None = None,
|
||||
):
|
||||
if not filesystem_type:
|
||||
filesystem_type = FilesystemType.Btrfs
|
||||
|
||||
if filesystem_type == FilesystemType.Btrfs:
|
||||
using_subvolumes = True
|
||||
mount_options = ['compress=zstd']
|
||||
else:
|
||||
using_subvolumes = False
|
||||
mount_options = []
|
||||
|
||||
sector_size = device.device_info.sector_size
|
||||
device_modification = DeviceModification(device, wipe=True)
|
||||
using_gpt = device_handler.partition_table.is_gpt()
|
||||
|
||||
boot_partition = _boot_partition_2gib(sector_size, using_gpt)
|
||||
device_modification.add_partition(boot_partition)
|
||||
|
||||
total_size = device.device_info.total_size
|
||||
available_space = total_size - boot_partition.length - Size(1, Unit.MiB, sector_size)
|
||||
|
||||
root_partition = PartitionModification(
|
||||
status=ModificationStatus.Create,
|
||||
type=PartitionType.Primary,
|
||||
start=boot_partition.start + boot_partition.length,
|
||||
length=available_space,
|
||||
mountpoint=None if using_subvolumes else Path('/'),
|
||||
fs_type=filesystem_type,
|
||||
mount_options=mount_options,
|
||||
)
|
||||
|
||||
if using_subvolumes:
|
||||
root_partition.btrfs_subvols = get_default_btrfs_subvols()
|
||||
|
||||
device_modification.add_partition(root_partition)
|
||||
return device_modification
|
||||
|
||||
disk_conf_module._boot_partition = _boot_partition_2gib
|
||||
disk_conf_module.select_main_filesystem_format = _select_main_filesystem_btrfs
|
||||
disk_conf_module.select_mount_options = _select_mount_options_compressed
|
||||
disk_conf_module.suggest_single_disk_layout = _suggest_single_disk_auto_subvolumes
|
||||
|
||||
|
||||
def load_config(config_file: Path, creds_file: Path | None = None):
|
||||
from archinstall.lib.args import ArchConfig, Arguments
|
||||
|
||||
with open(config_file) as f:
|
||||
config_data = json.load(f)
|
||||
|
||||
if creds_file and creds_file.exists():
|
||||
with open(creds_file) as f:
|
||||
creds_data = json.load(f)
|
||||
config_data.update(creds_data)
|
||||
|
||||
args = Arguments(
|
||||
config=config_file,
|
||||
creds=creds_file,
|
||||
mountpoint=Path('/mnt'),
|
||||
silent=True,
|
||||
)
|
||||
|
||||
return ArchConfig.from_config(config_data, args)
|
||||
|
||||
|
||||
def save_config(config, output_file: Path):
|
||||
from archinstall.lib.output import info
|
||||
|
||||
try:
|
||||
config_dict = config.safe_json()
|
||||
with open(output_file, 'w') as f:
|
||||
json.dump(config_dict, f, indent=2, default=str)
|
||||
info(f'✓ Configuration saved to: {output_file}')
|
||||
except Exception as e:
|
||||
from archinstall.lib.output import error
|
||||
error(f'Failed to save config: {e}')
|
||||
raise
|
||||
|
||||
|
||||
def main():
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(description='Omarchy Disk Configuration Tool')
|
||||
parser.add_argument('--config', type=Path, required=True, help='Path to config file')
|
||||
parser.add_argument('--creds', type=Path, help='Path to credentials file')
|
||||
parser.add_argument('--output', type=Path, help='Output path (default: overwrites input)')
|
||||
parser.add_argument('--non-interactive', action='store_true', help='Skip interactive prompts')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
output_file = args.output or args.config
|
||||
|
||||
if not args.config.exists():
|
||||
print(f'ERROR: Config file not found: {args.config}', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
if args.creds and not args.creds.exists():
|
||||
print(f'ERROR: Credentials file not found: {args.creds}', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
from archinstall.lib.output import info, error
|
||||
from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu
|
||||
from archinstall.tui.curses_menu import Tui
|
||||
|
||||
apply_omarchy_partition_defaults()
|
||||
|
||||
info('Loading configuration...')
|
||||
config = load_config(args.config, args.creds)
|
||||
|
||||
if not config.disk_config:
|
||||
error('No disk configuration found in config file')
|
||||
sys.exit(1)
|
||||
|
||||
while True:
|
||||
info('Launching partition editor...')
|
||||
|
||||
with Tui():
|
||||
edited_disk_config = DiskLayoutConfigurationMenu(config.disk_config).run()
|
||||
if edited_disk_config:
|
||||
config.disk_config = edited_disk_config
|
||||
info('✓ Partition configuration updated')
|
||||
else:
|
||||
info('No changes made in partition editor')
|
||||
|
||||
interactive = not args.non_interactive
|
||||
validation_result = validate_disk_config(config, interactive=interactive)
|
||||
|
||||
if validation_result == 'RE_EDIT':
|
||||
continue
|
||||
elif validation_result == 'ABORT':
|
||||
info('Disk configuration cancelled by user')
|
||||
sys.exit(1)
|
||||
else:
|
||||
break
|
||||
|
||||
save_config(config, output_file)
|
||||
info('✓ Disk configuration complete!')
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print('\nCancelled by user', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
except Exception as e:
|
||||
print(f'ERROR: {e}', file=sys.stderr)
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
258
bin/omarchy-install
Executable file
258
bin/omarchy-install
Executable file
@@ -0,0 +1,258 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Omarchy Install
|
||||
|
||||
Installs Arch Linux with Omarchy customizations using archinstall as a library.
|
||||
For disk configuration, use omarchy-disk-config.
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def load_config(config_file: Path, creds_file: Path | None = None):
|
||||
from archinstall.lib.args import ArchConfig, Arguments
|
||||
|
||||
with open(config_file) as f:
|
||||
config_data = json.load(f)
|
||||
|
||||
if creds_file and creds_file.exists():
|
||||
with open(creds_file) as f:
|
||||
creds_data = json.load(f)
|
||||
config_data.update(creds_data)
|
||||
|
||||
args = Arguments(
|
||||
config=config_file,
|
||||
creds=creds_file,
|
||||
mountpoint=Path('/mnt'),
|
||||
silent=True,
|
||||
skip_ntp=True,
|
||||
skip_wkd=True,
|
||||
)
|
||||
|
||||
return ArchConfig.from_config(config_data, args)
|
||||
|
||||
|
||||
def load_omarchy_packages() -> list[str]:
|
||||
omarchy_path = Path('/usr/share/omarchy/install')
|
||||
packages = []
|
||||
|
||||
base_packages_file = omarchy_path / 'omarchy-base.packages'
|
||||
if base_packages_file.exists():
|
||||
with open(base_packages_file) as f:
|
||||
packages.extend([line.strip() for line in f if line.strip() and not line.startswith('#')])
|
||||
|
||||
return packages
|
||||
|
||||
|
||||
def perform_installation(config_file: Path, creds_file: Path | None = None) -> None:
|
||||
from archinstall.lib.disk.filesystem import FilesystemHandler
|
||||
from archinstall.lib.installer import Installer
|
||||
from archinstall.lib.models.device import DiskLayoutType, EncryptionType
|
||||
from archinstall.lib.output import error, info
|
||||
from archinstall.lib.profile.profiles_handler import profile_handler
|
||||
from archinstall.lib.authentication.authentication_handler import auth_handler
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
info('Loading configuration...')
|
||||
config = load_config(config_file, creds_file)
|
||||
|
||||
if not config.disk_config:
|
||||
error('No disk configuration found in config file')
|
||||
error('Use omarchy-disk-config to configure disk layout first')
|
||||
sys.exit(1)
|
||||
|
||||
disk_config = config.disk_config
|
||||
|
||||
if disk_config.config_type != DiskLayoutType.Pre_mount:
|
||||
info('Performing filesystem operations...')
|
||||
fs_handler = FilesystemHandler(disk_config)
|
||||
fs_handler.perform_filesystem_operations()
|
||||
|
||||
mountpoint = Path('/mnt')
|
||||
|
||||
info('Loading Omarchy base packages...')
|
||||
omarchy_packages = load_omarchy_packages()
|
||||
|
||||
info('Starting Omarchy installation...')
|
||||
|
||||
with Installer(
|
||||
mountpoint,
|
||||
disk_config,
|
||||
kernels=config.kernels or ['linux'],
|
||||
) as installation:
|
||||
|
||||
info('Mounting filesystems...')
|
||||
if disk_config.config_type != DiskLayoutType.Pre_mount:
|
||||
installation.mount_ordered_layout()
|
||||
|
||||
installation.sanity_check()
|
||||
|
||||
if disk_config.disk_encryption and disk_config.disk_encryption.encryption_type != EncryptionType.NoEncryption:
|
||||
info('Generating encryption keys...')
|
||||
installation.generate_key_files()
|
||||
|
||||
if config.mirror_config:
|
||||
info('Configuring mirrors...')
|
||||
installation.set_mirrors(config.mirror_config, on_target=False)
|
||||
|
||||
info('Installing base system...')
|
||||
installation.minimal_installation(
|
||||
optional_repositories=config.mirror_config.optional_repositories if config.mirror_config else [],
|
||||
mkinitcpio=not config.uki,
|
||||
hostname=config.hostname,
|
||||
locale_config=config.locale_config,
|
||||
)
|
||||
|
||||
if config.mirror_config:
|
||||
installation.set_mirrors(config.mirror_config, on_target=True)
|
||||
|
||||
if config.swap:
|
||||
info('Setting up swap...')
|
||||
installation.setup_swap('zram')
|
||||
|
||||
all_packages = omarchy_packages + (config.packages or [])
|
||||
if all_packages:
|
||||
info(f'Installing {len(all_packages)} packages...')
|
||||
installation.add_additional_packages(all_packages)
|
||||
|
||||
if config.bootloader:
|
||||
info(f'Installing bootloader: {config.bootloader.value}...')
|
||||
installation.add_bootloader(config.bootloader, config.uki)
|
||||
|
||||
if config.network_config:
|
||||
info('Configuring network...')
|
||||
config.network_config.install_network_config(installation, config.profile_config)
|
||||
|
||||
if config.auth_config and config.auth_config.users:
|
||||
info('Creating users...')
|
||||
installation.create_users(config.auth_config.users)
|
||||
auth_handler.setup_auth(installation, config.auth_config, config.hostname)
|
||||
|
||||
if config.app_config:
|
||||
info('Installing applications...')
|
||||
from archinstall.lib.applications.application_handler import application_handler
|
||||
application_handler.install_applications(installation, config.app_config)
|
||||
|
||||
if config.profile_config:
|
||||
info('Installing profile...')
|
||||
profile_handler.install_profile_config(installation, config.profile_config)
|
||||
|
||||
if config.timezone:
|
||||
installation.set_timezone(config.timezone)
|
||||
|
||||
if config.ntp:
|
||||
installation.activate_time_synchronization()
|
||||
|
||||
from archinstall.lib.installer import accessibility_tools_in_use
|
||||
if accessibility_tools_in_use():
|
||||
installation.enable_espeakup()
|
||||
|
||||
if config.auth_config and config.auth_config.root_enc_password:
|
||||
from archinstall.lib.models.users import User
|
||||
root_user = User('root', config.auth_config.root_enc_password, False)
|
||||
installation.set_user_password(root_user)
|
||||
|
||||
if config.profile_config and config.profile_config.profile:
|
||||
config.profile_config.profile.post_install(installation)
|
||||
|
||||
if config.services:
|
||||
info('Enabling services...')
|
||||
installation.enable_service(config.services)
|
||||
|
||||
if disk_config.has_default_btrfs_vols():
|
||||
btrfs_options = disk_config.btrfs_options
|
||||
snapshot_config = btrfs_options.snapshot_config if btrfs_options else None
|
||||
snapshot_type = snapshot_config.snapshot_type if snapshot_config else None
|
||||
if snapshot_type:
|
||||
installation.setup_btrfs_snapshot(snapshot_type, config.bootloader)
|
||||
|
||||
info('Mounting offline resources for chroot access...')
|
||||
from archinstall.lib.general import SysCommand
|
||||
import os
|
||||
import shutil
|
||||
|
||||
offline_mirror_src = Path('/var/cache/omarchy/mirror/offline')
|
||||
offline_mirror_dst = mountpoint / 'var/cache/omarchy/mirror/offline'
|
||||
packages_src = Path('/opt/packages')
|
||||
packages_dst = mountpoint / 'opt/packages'
|
||||
|
||||
os.makedirs(offline_mirror_dst, exist_ok=True)
|
||||
os.makedirs(packages_dst, exist_ok=True)
|
||||
|
||||
if offline_mirror_src.exists():
|
||||
SysCommand(f'mount --bind {offline_mirror_src} {offline_mirror_dst}')
|
||||
|
||||
if packages_src.exists():
|
||||
SysCommand(f'mount --bind {packages_src} {packages_dst}')
|
||||
|
||||
pacman_conf_src = Path('/etc/pacman.conf')
|
||||
pacman_conf_dst = mountpoint / 'etc/pacman.conf'
|
||||
if pacman_conf_src.exists():
|
||||
shutil.copy(pacman_conf_src, pacman_conf_dst)
|
||||
|
||||
info('Copying user info to chroot...')
|
||||
os.makedirs(mountpoint / 'tmp', exist_ok=True)
|
||||
|
||||
if os.path.exists('/tmp/omarchy-user-name.txt'):
|
||||
shutil.copy('/tmp/omarchy-user-name.txt', mountpoint / 'tmp/omarchy-user-name.txt')
|
||||
if os.path.exists('/tmp/omarchy-user-email.txt'):
|
||||
shutil.copy('/tmp/omarchy-user-email.txt', mountpoint / 'tmp/omarchy-user-email.txt')
|
||||
|
||||
if config.custom_commands:
|
||||
info('Running Omarchy custom commands...')
|
||||
from archinstall.lib.installer import run_custom_user_commands
|
||||
run_custom_user_commands(config.custom_commands, installation)
|
||||
|
||||
info('Generating fstab...')
|
||||
installation.genfstab()
|
||||
|
||||
end_time = time.time()
|
||||
duration_seconds = int(end_time - start_time)
|
||||
duration_mins = duration_seconds // 60
|
||||
duration_secs = duration_seconds % 60
|
||||
|
||||
timing_file = mountpoint / 'tmp/omarchy-install-time.txt'
|
||||
with open(timing_file, 'w') as f:
|
||||
f.write(f"{duration_mins}m {duration_secs}s\n")
|
||||
|
||||
info(f'Installation complete! Total time: {duration_mins}m {duration_secs}s')
|
||||
|
||||
|
||||
def main():
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(description='Omarchy Install')
|
||||
parser.add_argument('--config', type=Path, required=True, help='Path to config file')
|
||||
parser.add_argument('--creds', type=Path, help='Path to credentials file')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if not args.config.exists():
|
||||
print(f'ERROR: Config file not found: {args.config}', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
if args.creds and not args.creds.exists():
|
||||
print(f'ERROR: Credentials file not found: {args.creds}', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
perform_installation(
|
||||
config_file=args.config,
|
||||
creds_file=args.creds,
|
||||
)
|
||||
except KeyboardInterrupt:
|
||||
print('\nInstallation cancelled by user', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
except Exception as e:
|
||||
print(f'ERROR: Installation failed: {e}', file=sys.stderr)
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
110
bin/omarchy-install-final-configurations.sh
Executable file
110
bin/omarchy-install-final-configurations.sh
Executable file
@@ -0,0 +1,110 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Omarchy Final Configurations Installer
|
||||
#
|
||||
# This script runs from archinstall's custom_commands after base packages
|
||||
# and user creation. It switches to the created user and runs install.sh
|
||||
# to complete package installation and system configuration.
|
||||
#
|
||||
# archinstall runs custom_commands as root via:
|
||||
# arch-chroot -S /mnt bash /var/tmp/user-command.0.sh
|
||||
#
|
||||
|
||||
set -eEo pipefail
|
||||
|
||||
# Setup comprehensive logging for chroot execution
|
||||
# This ensures all output is captured even though we're running inside chroot
|
||||
CHROOT_LOG_FILE="/var/log/omarchy-install-chroot.log"
|
||||
mkdir -p "$(dirname "$CHROOT_LOG_FILE")"
|
||||
touch "$CHROOT_LOG_FILE"
|
||||
|
||||
# Redirect all output to both the log file and stdout
|
||||
# This way:
|
||||
# 1. Output is saved to /var/log/omarchy-install-chroot.log (inside chroot = /mnt/var/log on ISO)
|
||||
# 2. Output still goes to stdout so arch-chroot can potentially capture it
|
||||
# 3. We use exec to redirect the entire script's output from this point forward
|
||||
exec > >(tee -a "$CHROOT_LOG_FILE") 2>&1
|
||||
|
||||
# Log script start with timestamp
|
||||
echo "========================================"
|
||||
echo "Omarchy Chroot Install Starting"
|
||||
echo "Started at: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
echo "Log file: $CHROOT_LOG_FILE"
|
||||
echo "========================================"
|
||||
echo
|
||||
|
||||
# Find the first non-root user (UID >= 1000, < 60000)
|
||||
OMARCHY_USER=$(getent passwd | awk -F: '$3 >= 1000 && $3 < 60000 {print $1; exit}')
|
||||
|
||||
if [[ -z "$OMARCHY_USER" ]]; then
|
||||
echo "ERROR: No non-root user found!"
|
||||
echo "Users created:"
|
||||
getent passwd | awk -F: '$3 >= 1000 {print $1, $3}'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Setting up Omarchy for user: $OMARCHY_USER"
|
||||
|
||||
# Setup passwordless sudo (will be removed by post-install)
|
||||
echo "Setting up passwordless sudo..."
|
||||
mkdir -p /etc/sudoers.d
|
||||
cat >/etc/sudoers.d/99-omarchy-installer <<EOF
|
||||
root ALL=(ALL:ALL) NOPASSWD: ALL
|
||||
%wheel ALL=(ALL:ALL) NOPASSWD: ALL
|
||||
$OMARCHY_USER ALL=(ALL:ALL) NOPASSWD: ALL
|
||||
EOF
|
||||
chmod 440 /etc/sudoers.d/99-omarchy-installer
|
||||
|
||||
# Get user info from /tmp (written by configurator)
|
||||
if [[ -f /tmp/omarchy-user-name.txt ]]; then
|
||||
OMARCHY_USER_NAME=$(cat /tmp/omarchy-user-name.txt)
|
||||
else
|
||||
OMARCHY_USER_NAME=""
|
||||
fi
|
||||
|
||||
if [[ -f /tmp/omarchy-user-email.txt ]]; then
|
||||
OMARCHY_USER_EMAIL=$(cat /tmp/omarchy-user-email.txt)
|
||||
else
|
||||
OMARCHY_USER_EMAIL=""
|
||||
fi
|
||||
|
||||
# Run install.sh as the user
|
||||
echo "========================================"
|
||||
echo "Running Omarchy installation as user: $OMARCHY_USER"
|
||||
echo "========================================"
|
||||
echo
|
||||
|
||||
# Use runuser instead of su for better output handling
|
||||
# runuser doesn't go through PAM and preserves stdout/stderr better
|
||||
runuser -u "$OMARCHY_USER" -- bash -c "
|
||||
set -eEo pipefail
|
||||
export PYTHONUNBUFFERED=1
|
||||
export OMARCHY_CHROOT_INSTALL=1
|
||||
export OMARCHY_ARCHINSTALL_WRAPPER=1
|
||||
export OMARCHY_USER='$OMARCHY_USER'
|
||||
export OMARCHY_USER_NAME='$OMARCHY_USER_NAME'
|
||||
export OMARCHY_USER_EMAIL='$OMARCHY_USER_EMAIL'
|
||||
cd ~
|
||||
source /usr/share/omarchy/install.sh
|
||||
"
|
||||
|
||||
exit_code=$?
|
||||
|
||||
if [[ $exit_code -eq 0 ]]; then
|
||||
echo
|
||||
echo "========================================"
|
||||
echo "Omarchy install.sh completed successfully!"
|
||||
echo "========================================"
|
||||
echo
|
||||
echo "========================================"
|
||||
echo "Omarchy Chroot Install Completed"
|
||||
echo "Finished at: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
echo "Log file: $CHROOT_LOG_FILE"
|
||||
echo "========================================"
|
||||
else
|
||||
echo
|
||||
echo "========================================"
|
||||
echo "ERROR: Omarchy install.sh exited with code $exit_code"
|
||||
echo "========================================"
|
||||
exit $exit_code
|
||||
fi
|
||||
@@ -89,7 +89,6 @@ dynamic_bindings() {
|
||||
jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' |
|
||||
sed -r \
|
||||
-e 's/null//' \
|
||||
-e 's,~/.local/share/omarchy/bin/,,' \
|
||||
-e 's,uwsm app -- ,,' \
|
||||
-e 's,uwsm-app -- ,,' \
|
||||
-e 's/@0//' \
|
||||
|
||||
@@ -8,7 +8,7 @@ mkdir -p "$STATE_DIR"
|
||||
mkdir -p "$STATE_DIR/skipped"
|
||||
|
||||
# Run any pending migrations
|
||||
for file in ~/.local/share/omarchy/migrations/*.sh; do
|
||||
for file in /usr/share/omarchy/migrations/*.sh; do
|
||||
filename=$(basename "$file")
|
||||
|
||||
if [[ ! -f "$STATE_DIR/$filename" && ! -f "$STATE_DIR/skipped/$filename" ]]; then
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
|
||||
# Copy and sync icon files
|
||||
mkdir -p ~/.local/share/icons/hicolor/48x48/apps/
|
||||
cp ~/.local/share/omarchy/applications/icons/*.png ~/.local/share/icons/hicolor/48x48/apps/
|
||||
cp /usr/share/omarchy/applications/icons/*.png ~/.local/share/icons/hicolor/48x48/apps/
|
||||
gtk-update-icon-cache ~/.local/share/icons/hicolor &>/dev/null
|
||||
|
||||
# Copy .desktop declarations
|
||||
mkdir -p ~/.local/share/applications
|
||||
cp ~/.local/share/omarchy/applications/*.desktop ~/.local/share/applications/
|
||||
cp ~/.local/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/
|
||||
cp /usr/share/omarchy/applications/*.desktop ~/.local/share/applications/
|
||||
cp /usr/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/
|
||||
|
||||
update-desktop-database ~/.local/share/applications
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This script deploys ~/.local/share/omarchy/config/X/Y/Z -> ~/.config/X/Y/Z
|
||||
# This script deploys /etc/skel/.config/X/Y/Z -> ~/.config/X/Y/Z
|
||||
config_file=$1
|
||||
|
||||
if [[ -z "$config_file" ]]; then
|
||||
@@ -8,7 +8,7 @@ if [[ -z "$config_file" ]]; then
|
||||
Usage: $0 [config_file]
|
||||
|
||||
Must provide a file path from the .config directory to be refreshed.
|
||||
To copy ~/.local/share/omarchy/config/hypr/hyprlock.conf to ~/.config/hypr/hyprlock.conf
|
||||
To copy /etc/skel/.config/hypr/hyprlock.conf to ~/.config/hypr/hyprlock.conf
|
||||
|
||||
$0 hypr/hyprlock.conf
|
||||
USAGE
|
||||
@@ -17,7 +17,7 @@ fi
|
||||
|
||||
# Backup the destination file (with timestamp) to avoid clobbering (Ex: hyprlock.conf.bak.1753817951)
|
||||
user_config_file="${HOME}/.config/$config_file"
|
||||
default_config_file="${HOME}/.local/share/omarchy/config/$config_file"
|
||||
default_config_file="/etc/skel/.config/$config_file"
|
||||
backup_config_file="$user_config_file.bak.$(date +%s)"
|
||||
|
||||
if [[ -f "$user_config_file" ]]; then
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist /etc/pacman.d/mirrorlist
|
||||
sudo cp -f /usr/share/omarchy/default/pacman/mirrorlist /etc/pacman.d/mirrorlist
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
sudo cp ~/.local/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/
|
||||
sudo cp /usr/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/
|
||||
sudo plymouth-set-default-theme omarchy
|
||||
|
||||
if command -v limine-mkinitcpio &>/dev/null; then
|
||||
|
||||
@@ -10,19 +10,15 @@ fi
|
||||
echo -e "This will reinstall all the default Omarchy packages and reset all default configs.\nWarning: All changes to configs will be lost.\n"
|
||||
|
||||
if gum confirm "Are you sure you want to reinstall and lose all config changes?"; then
|
||||
echo "Resetting Omarchy repository"
|
||||
git clone "https://github.com/basecamp/omarchy.git" ~/.local/share/omarchy-new >/dev/null
|
||||
rm -rf $OMARCHY_PATH
|
||||
mv ~/.local/share/omarchy-new $OMARCHY_PATH
|
||||
echo "Reinstalling Omarchy Package"
|
||||
sudo pacman -Syu --noconfirm --needed omarchy
|
||||
|
||||
echo "Reinstalling missing Omarchy packages"
|
||||
mapfile -t packages < <(grep -v '^#' "$OMARCHY_PATH/install/omarchy-base.packages" | grep -v '^$')
|
||||
sudo pacman -Syu --noconfirm --needed "${packages[@]}"
|
||||
|
||||
echo "Resetting all Omarchy configs"
|
||||
cp -R ~/.local/share/omarchy/config/* ~/.config/
|
||||
cp ~/.local/share/omarchy/default/bashrc ~/.bashrc
|
||||
echo '[[ -f ~/.bashrc ]] && . ~/.bashrc' | tee ~/.bash_profile >/dev/null
|
||||
cp -R /etc/skel/.config/* ~/.config/
|
||||
|
||||
$(bash $OMARCHY_PATH/install/config/theme.sh)
|
||||
$(bash $OMARCHY_PATH/install/config/git.sh)
|
||||
|
||||
@@ -1,21 +1,32 @@
|
||||
#!/bin/bash
|
||||
|
||||
pkill elephant
|
||||
pkill walker
|
||||
|
||||
# Detect if we're running as root (from pacman hook)
|
||||
if [[ $EUID -eq 0 ]]; then
|
||||
# Get the owner of this script to determine which user to run as
|
||||
SCRIPT_OWNER=$(stat -c '%U' "$0")
|
||||
USER_UID=$(id -u "$SCRIPT_OWNER")
|
||||
# Find all logged-in users running Hyprland
|
||||
for user_runtime in /run/user/*/; do
|
||||
USER_UID=$(basename "$user_runtime")
|
||||
USER_NAME=$(id -un "$USER_UID" 2>/dev/null)
|
||||
|
||||
# Restart services as the script owner
|
||||
systemd-run --uid="$SCRIPT_OWNER" --setenv=XDG_RUNTIME_DIR="/run/user/$USER_UID" \
|
||||
# Skip if we can't resolve the username or if no Hyprland session
|
||||
[[ -z "$USER_NAME" ]] && continue
|
||||
[[ ! -S "${user_runtime}hypr/"*"/.socket.sock" ]] && continue
|
||||
|
||||
# Kill existing processes for this user
|
||||
pkill -u "$USER_NAME" elephant
|
||||
pkill -u "$USER_NAME" walker
|
||||
|
||||
# Restart services as this user
|
||||
systemd-run --uid="$USER_NAME" --setenv=XDG_RUNTIME_DIR="/run/user/$USER_UID" \
|
||||
bash -c "
|
||||
setsid uwsm-app -- elephant &
|
||||
setsid uwsm-app -- walker --gapplication-service &
|
||||
"
|
||||
done
|
||||
else
|
||||
# Running as user directly
|
||||
pkill elephant
|
||||
pkill walker
|
||||
|
||||
setsid uwsm-app -- elephant &
|
||||
wait 2
|
||||
setsid uwsm-app -- walker --gapplication-service &
|
||||
|
||||
3
bin/omarchy-set-user
Executable file
3
bin/omarchy-set-user
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
# Track active Omarchy user for package migrations
|
||||
echo "$USER:$HOME:$XDG_RUNTIME_DIR" > /tmp/omarchy-active-user
|
||||
@@ -2,6 +2,6 @@
|
||||
|
||||
clear
|
||||
echo -e "\033[32m"
|
||||
cat <~/.local/share/omarchy/logo.txt
|
||||
cat < /usr/share/omarchy/logo.txt
|
||||
echo -e "\033[0m"
|
||||
echo
|
||||
|
||||
19
boot.sh
19
boot.sh
@@ -19,21 +19,4 @@ echo -e "\n$ansi_art\n"
|
||||
|
||||
sudo pacman -Syu --noconfirm --needed git
|
||||
|
||||
# Use custom repo if specified, otherwise default to basecamp/omarchy
|
||||
OMARCHY_REPO="${OMARCHY_REPO:-basecamp/omarchy}"
|
||||
|
||||
echo -e "\nCloning Omarchy from: https://github.com/${OMARCHY_REPO}.git"
|
||||
rm -rf ~/.local/share/omarchy/
|
||||
git clone "https://github.com/${OMARCHY_REPO}.git" ~/.local/share/omarchy >/dev/null
|
||||
|
||||
# Use custom branch if instructed, otherwise default to master
|
||||
OMARCHY_REF="${OMARCHY_REF:-master}"
|
||||
if [[ $OMARCHY_REF != "master" ]]; then
|
||||
echo -e "\e[32mUsing branch: $OMARCHY_REF\e[0m"
|
||||
cd ~/.local/share/omarchy
|
||||
git fetch origin "${OMARCHY_REF}" && git checkout "${OMARCHY_REF}"
|
||||
cd -
|
||||
fi
|
||||
|
||||
echo -e "\nInstallation starting..."
|
||||
source ~/.local/share/omarchy/install.sh
|
||||
# FIXME: Update behavior or remove
|
||||
|
||||
BIN
config/.local/share/fonts/omarchy.ttf
Normal file
BIN
config/.local/share/fonts/omarchy.ttf
Normal file
Binary file not shown.
@@ -1,6 +1,6 @@
|
||||
--ozone-platform=wayland
|
||||
--ozone-platform-hint=wayland
|
||||
--enable-features=TouchpadOverscrollHistoryNavigation
|
||||
--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url
|
||||
--load-extension=/usr/share/omarchy/default/chromium/extensions/copy-url
|
||||
# Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957
|
||||
--disable-features=WaylandWpColorManagerV1
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# Learn how to configure Hyprland: https://wiki.hyprland.org/Configuring/
|
||||
|
||||
# Use defaults Omarchy defaults (but don't edit these directly!)
|
||||
source = ~/.local/share/omarchy/default/hypr/autostart.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/bindings/media.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/bindings/clipboard.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/bindings/tiling-v2.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/bindings/utilities.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/envs.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/looknfeel.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/input.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/windows.conf
|
||||
source = /usr/share/omarchy/default/hypr/autostart.conf
|
||||
source = /usr/share/omarchy/default/hypr/bindings/media.conf
|
||||
source = /usr/share/omarchy/default/hypr/bindings/clipboard.conf
|
||||
source = /usr/share/omarchy/default/hypr/bindings/tiling-v2.conf
|
||||
source = /usr/share/omarchy/default/hypr/bindings/utilities.conf
|
||||
source = /usr/share/omarchy/default/hypr/envs.conf
|
||||
source = /usr/share/omarchy/default/hypr/looknfeel.conf
|
||||
source = /usr/share/omarchy/default/hypr/input.conf
|
||||
source = /usr/share/omarchy/default/hypr/windows.conf
|
||||
source = ~/.config/omarchy/current/theme/hyprland.conf
|
||||
|
||||
# Change your own setup in these files (and overwrite any settings from defaults!)
|
||||
|
||||
36
config/mimeapps.list
Normal file
36
config/mimeapps.list
Normal file
@@ -0,0 +1,36 @@
|
||||
[Default Applications]
|
||||
image/png=imv.desktop
|
||||
image/jpeg=imv.desktop
|
||||
image/gif=imv.desktop
|
||||
image/webp=imv.desktop
|
||||
image/bmp=imv.desktop
|
||||
image/tiff=imv.desktop
|
||||
application/pdf=org.gnome.Evince.desktop
|
||||
x-scheme-handler/http=chromium.desktop
|
||||
x-scheme-handler/https=chromium.desktop
|
||||
text/html=chromium.desktop
|
||||
video/mp4=mpv.desktop
|
||||
video/x-msvideo=mpv.desktop
|
||||
video/x-matroska=mpv.desktop
|
||||
video/x-flv=mpv.desktop
|
||||
video/x-ms-wmv=mpv.desktop
|
||||
video/mpeg=mpv.desktop
|
||||
video/ogg=mpv.desktop
|
||||
video/webm=mpv.desktop
|
||||
video/quicktime=mpv.desktop
|
||||
video/3gpp=mpv.desktop
|
||||
video/3gpp2=mpv.desktop
|
||||
video/x-ms-asf=mpv.desktop
|
||||
video/x-ogm+ogg=mpv.desktop
|
||||
video/x-theora+ogg=mpv.desktop
|
||||
application/ogg=mpv.desktop
|
||||
x-scheme-handler/mailto=HEY.desktop
|
||||
|
||||
[Added Associations]
|
||||
image/png=imv.desktop;
|
||||
image/jpeg=imv.desktop;
|
||||
image/gif=imv.desktop;
|
||||
image/webp=imv.desktop;
|
||||
text/html=chromium.desktop;
|
||||
x-scheme-handler/http=chromium.desktop;
|
||||
x-scheme-handler/https=chromium.desktop;
|
||||
26
config/omarchy/branding/about.txt
Normal file
26
config/omarchy/branding/about.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
██████████████████████████████████████████████████████
|
||||
██████████████████████████████████████████████████████
|
||||
████ ████ ████
|
||||
████ ████ ████
|
||||
████ █████████████████████ ████████ ████
|
||||
████ █████████████████████ ████████ ████
|
||||
████ ████ ████ ████
|
||||
████ ████ ████ ████
|
||||
████ ████ ████ ████
|
||||
████ ████ ████ ████
|
||||
████ ████ ████ ████
|
||||
████ ████ ████ ████
|
||||
████████████ ████ ████
|
||||
████████████ ████ ████
|
||||
████ ████ ████ ████
|
||||
████ ████ ████ ████
|
||||
████ ████ ████ ████
|
||||
████ ████ ████ ████
|
||||
████ ████ ████ ████
|
||||
████ ████ ████ ████
|
||||
████ ██████████████████████████████████████ ████
|
||||
████ ██████████████████████████████████████ ████
|
||||
████ ████ ████
|
||||
████ ████ ████
|
||||
█████████████████████████████ ████████████████████
|
||||
█████████████████████████████ ████████████████████
|
||||
10
config/omarchy/branding/screensaver.txt
Normal file
10
config/omarchy/branding/screensaver.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
▄▄▄
|
||||
▄█████▄ ▄███████████▄ ▄███████ ▄███████ ▄███████ ▄█ █▄ ▄█ █▄
|
||||
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
|
||||
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █▀ ███ ███ ███ ███
|
||||
███ ███ ███ ███ ███ ▄███▄▄▄███ ▄███▄▄▄██▀ ███ ▄███▄▄▄███▄ ███▄▄▄███
|
||||
███ ███ ███ ███ ███ ▀███▀▀▀███ ▀███▀▀▀▀ ███ ▀▀███▀▀▀███ ▀▀▀▀▀▀███
|
||||
███ ███ ███ ███ ███ ███ ███ ██████████ ███ █▄ ███ ███ ▄██ ███
|
||||
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
|
||||
▀█████▀ ▀█ ███ █▀ ███ █▀ ███ ███ ███████▀ ███ █▀ ▀█████▀
|
||||
███ █▀
|
||||
@@ -1,8 +1,7 @@
|
||||
# Changes require a restart to take effect.
|
||||
|
||||
# Ensure Omarchy bins are in the path
|
||||
export OMARCHY_PATH=$HOME/.local/share/omarchy
|
||||
export PATH=$OMARCHY_PATH/bin:$PATH
|
||||
# Set default OMARCHY_PATH
|
||||
export OMARCHY_PATH=/usr/share/omarchy
|
||||
|
||||
# Set default terminal and editor
|
||||
source ~/.config/uwsm/default
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
force_keyboard_focus = true # forces keyboard forcus to stay in Walker
|
||||
selection_wrap = true # wrap list if at bottom or top
|
||||
theme = "omarchy-default" # theme to use
|
||||
additional_theme_location = "~/.local/share/omarchy/default/walker/themes/"
|
||||
|
||||
[placeholders]
|
||||
"default" = { input = " Search...", list = "No Results" } # placeholders for input and empty list, key is the providers name, so f.e. "desktopapplications" or "menus:other"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
source ~/.local/share/omarchy/default/bash/shell
|
||||
source ~/.local/share/omarchy/default/bash/aliases
|
||||
source ~/.local/share/omarchy/default/bash/functions
|
||||
source ~/.local/share/omarchy/default/bash/prompt
|
||||
source ~/.local/share/omarchy/default/bash/init
|
||||
source ~/.local/share/omarchy/default/bash/envs
|
||||
[[ $- == *i* ]] && bind -f ~/.local/share/omarchy/default/bash/inputrc
|
||||
source /usr/share/omarchy/default/bash/shell
|
||||
source /usr/share/omarchy/default/bash/aliases
|
||||
source /usr/share/omarchy/default/bash/functions
|
||||
source /usr/share/omarchy/default/bash/prompt
|
||||
source /usr/share/omarchy/default/bash/init
|
||||
source /usr/share/omarchy/default/bash/envs
|
||||
[[ $- == *i* ]] && bind -f /usr/share/omarchy/default/bash/inputrc
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
# All the default Omarchy aliases and functions
|
||||
# (don't mess with these directly, just overwrite them here!)
|
||||
source ~/.local/share/omarchy/default/bash/rc
|
||||
source /usr/share/omarchy/default/bash/rc
|
||||
|
||||
# Add your own exports, aliases, and functions here.
|
||||
#
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# App-specific tweaks
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/1password.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/bitwarden.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/browser.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/hyprshot.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/jetbrains.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/localsend.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/pip.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/qemu.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/retroarch.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/steam.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/system.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/terminals.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/walker.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/webcam-overlay.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/1password.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/bitwarden.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/browser.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/hyprshot.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/jetbrains.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/localsend.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/pip.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/qemu.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/retroarch.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/steam.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/system.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/terminals.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/walker.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps/webcam-overlay.conf
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Picture-in-picture overlays
|
||||
windowrule = tag +pip, title:(Picture.{0,1}in.{0,1}[Pp]icture)
|
||||
windowrule = tag +pip, title:(Picture.?in.?[Pp]icture)
|
||||
windowrule = float, tag:pip
|
||||
windowrule = pin, tag:pip
|
||||
windowrule = size 600 338, tag:pip
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
exec-once = omarchy-set-user
|
||||
exec-once = uwsm-app -- hypridle
|
||||
exec-once = uwsm-app -- mako
|
||||
exec-once = uwsm-app -- waybar
|
||||
|
||||
@@ -11,6 +11,6 @@ bindd = SUPER, G, Messenger, exec, $messenger
|
||||
bindd = SUPER, O, Obsidian, exec, obsidian -disable-gpu
|
||||
bindd = SUPER, SLASH, Password manager, exec, $passwordManager
|
||||
|
||||
source = ~/.local/share/omarchy/default/hypr/bindings/media.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/bindings/tiling.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/bindings/utilities.conf
|
||||
source = /usr/share/omarchy/default/hypr/bindings/media.conf
|
||||
source = /usr/share/omarchy/default/hypr/bindings/tiling.conf
|
||||
source = /usr/share/omarchy/default/hypr/bindings/utilities.conf
|
||||
|
||||
@@ -8,4 +8,4 @@ windowrule = opacity 0.97 0.9, class:.*
|
||||
windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
|
||||
|
||||
# App-specific tweaks
|
||||
source = ~/.local/share/omarchy/default/hypr/apps.conf
|
||||
source = /usr/share/omarchy/default/hypr/apps.conf
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@import "../../../../../../../.config/omarchy/current/theme/walker.css";
|
||||
@import "../../../omarchy/current/theme/walker.css";
|
||||
|
||||
* {
|
||||
all: unset;
|
||||
|
||||
750
etc/cups/cups-browsed.conf
Normal file
750
etc/cups/cups-browsed.conf
Normal file
@@ -0,0 +1,750 @@
|
||||
# All configuration options described here can also be supplied on the
|
||||
# command line of cups-browsed via the "-o" option. In case of
|
||||
# contradicting settings the setting defined in the configuration file
|
||||
# will get used.
|
||||
|
||||
# Unknown directives are ignored, also unknown values.
|
||||
|
||||
|
||||
# Where should cups-browsed save information about the print queues it had
|
||||
# generated when shutting down, like whether one of these queues was the
|
||||
# default printer, or default option settings of the queues?
|
||||
|
||||
# CacheDir /var/cache/cups
|
||||
|
||||
|
||||
# Where should cups-browsed create its debug log file (if "DebugLogging file"
|
||||
# is set)?
|
||||
|
||||
# LogDir /var/log/cups
|
||||
|
||||
|
||||
# How should debug logging be done? Into the file
|
||||
# /var/log/cups/cups-browsed_log ('file'), to stderr ('stderr'), or
|
||||
# not at all ('none')?
|
||||
|
||||
# Note that if cups-browsed is running as a system service (for
|
||||
# example via systemd) logging to stderr makes the log output going to
|
||||
# the journal or syslog. Only if you run cups-browsed from the command
|
||||
# line (for development or debugging) it will actually appear on
|
||||
# stderr.
|
||||
|
||||
# DebugLogging file
|
||||
# DebugLogging stderr
|
||||
# DebugLogging file stderr
|
||||
# DebugLogging none
|
||||
|
||||
|
||||
# Which protocols will we use to discover printers on the network?
|
||||
# Can use DNSSD or 'none'.
|
||||
|
||||
BrowseRemoteProtocols dnssd
|
||||
|
||||
|
||||
# Which protocols will we use to broadcast shared local printers to the network?
|
||||
# Can use DNSSD or 'none'.
|
||||
# Broadcasting is currently not supported, as DNSSD is done by CUPS itself
|
||||
# (we ignore DNSSD in this directive).
|
||||
|
||||
# BrowseLocalProtocols none
|
||||
|
||||
|
||||
# Settings of this directive apply to both BrowseRemoteProtocols and
|
||||
# BrowseLocalProtocols.
|
||||
# Can use DNSSD or 'none'.
|
||||
|
||||
# BrowseProtocols none
|
||||
|
||||
|
||||
# Only browse remote printers (via DNS-SD) from
|
||||
# selected servers using the "BrowseAllow", "BrowseDeny", and
|
||||
# "BrowseOrder" directives
|
||||
|
||||
# This serves for restricting the choice of printers in print dialogs
|
||||
# to trusted servers or to reduce the number of listed printers in the
|
||||
# print dialogs to a more user-friendly amount in large networks with
|
||||
# very many shared printers.
|
||||
|
||||
# This only filters the selection of remote printers for which
|
||||
# cups-browsed creates local queues. If the print dialog uses other
|
||||
# mechanisms to list remote printers as for example direct DNS-SD
|
||||
# access, cups-browsed has no influence. cups-browsed also does not
|
||||
# prevent the user from manually accessing non-listed printers.
|
||||
|
||||
# "BrowseAllow": Accept printers from these hosts or networks. If
|
||||
# there are only "BrowseAllow" lines and no "BrowseOrder" and/or
|
||||
# "BrowseDeny" lines, only servers matching at last one "BrowseAllow"
|
||||
# line are accepted.
|
||||
|
||||
# "BrowseDeny": Deny printers from these hosts or networks. If there
|
||||
# are only "BrowseDeny" lines and no "BrowseOrder" and/or
|
||||
# "BrowseAllow" lines, all servers NOT matching any of the
|
||||
# "BrowseDeny" lines are accepted.
|
||||
|
||||
# "BrowseOrder": Determine the order in which "BrowseAllow" and
|
||||
# "BrowseDeny" lines are applied. With "BrowseOrder Deny,Allow" in the
|
||||
# beginning all servers are accepted, then the "BrowseDeny" lines are
|
||||
# applied to exclude unwished servers or networks and after that the
|
||||
# "BrowseAllow" lines to re-include servers or networks. With
|
||||
# "BrowseOrder Allow,Deny" we start with denying all servers, then
|
||||
# applying the "BrowseAllow" lines and afterwards the "BrowseDeny"
|
||||
# lines.
|
||||
|
||||
# Default for "BrowseOrder" is "Deny.Allow" if there are both
|
||||
# "BrowseAllow" and "BrowseDeny" lines.
|
||||
|
||||
# If there are no "Browse..." lines at all, all servers are accepted.
|
||||
|
||||
# BrowseAllow All
|
||||
# BrowseAllow cups.example.com
|
||||
# BrowseAllow 192.168.1.12
|
||||
# BrowseAllow 192.168.1.0/24
|
||||
# BrowseAllow 192.168.1.0/255.255.255.0
|
||||
|
||||
# BrowseDeny All
|
||||
# BrowseDeny printserver.example.com
|
||||
# BrowseDeny 192.168.1.13
|
||||
# BrowseDeny 192.168.3.0/24
|
||||
# BrowseDeny 192.168.3.0/255.255.255.0
|
||||
|
||||
# BrowseOrder Deny,Allow
|
||||
# BrowseOrder Allow,Deny
|
||||
|
||||
|
||||
# The interval between browsing/broadcasting cycles, local and/or
|
||||
# remote, can be adjusted with the BrowseInterval directive.
|
||||
|
||||
# BrowseInterval 60
|
||||
|
||||
|
||||
# Browsing-related operations such as adding or removing printer queues
|
||||
# and broadcasting are each allowed to take up to a given amount of time.
|
||||
# It can be configured, in seconds, with the BrowseTimeout directive.
|
||||
|
||||
# BrowseTimeout 300
|
||||
|
||||
# Filtering of remote printers by other properties than IP addresses
|
||||
# of their servers
|
||||
|
||||
# Often the desired selection of printers cannot be reached by only
|
||||
# taking into account the IP addresses of the servers. For these cases
|
||||
# there is the BrowseFilter directive to filter by most of the known
|
||||
# properties of the printer.
|
||||
|
||||
# By default there is no BrowseFilter line meaning that no filtering
|
||||
# is applied.
|
||||
|
||||
# To do filtering one can supply one or more BrowseFilter directives
|
||||
# like this:
|
||||
|
||||
# BrowseFilter [NOT] [EXACT] <FIELD> [<VALUE>]
|
||||
|
||||
# The BrowseFilter directive always starts with the word
|
||||
# "BrowseFilter" and it must at least contain the name of the data
|
||||
# field (<FIELD>) of the printer's properties to which it should
|
||||
# apply.
|
||||
|
||||
# Available field names are:
|
||||
|
||||
# name: Name of the local print queue to be created
|
||||
# host: Host name of the remote print server
|
||||
# port: Port through which the printer is accessed on the server
|
||||
# service: DNS/SD service name of the remote printer
|
||||
# domain: Domain of the remote print server
|
||||
|
||||
# Also all field names in the TXT records of DNS-SD-advertised printers
|
||||
# are valid, like "color", "duplex", "pdl", ... If the field name of
|
||||
# the filter rule does not exist for the printer, the rule is skipped.
|
||||
|
||||
# The optional <VALUE> field is either the exact value (when the
|
||||
# option EXACT is supplied) or a regular expression (Run "man 7 regex"
|
||||
# in a terminal window) to be matched with the data field.
|
||||
|
||||
# If no <VALUE> filed is supplied, rules with field names of the TXT
|
||||
# record are considered for boolean matching (true/false) of boolean
|
||||
# field (like duplex, which can have the values "T" for true and "F"
|
||||
# for false).
|
||||
|
||||
# If the option NOT is supplied, the filter rule is fulfilled if the
|
||||
# regular expression or the exact value DOES NOT match the content of
|
||||
# the data field. In a boolean rule (without <VALUE>) the rule matches
|
||||
# false.
|
||||
|
||||
# Regular expressions are always considered case-insensitive and
|
||||
# extended POSIX regular expressions. Field names and options (NOT,
|
||||
# EXACT) are all evaluated case-insensitive. If there is an error in a
|
||||
# regular expression, the BrowseFilter line gets ignored.
|
||||
|
||||
# Especially to note is that supplying any simple string consisting of
|
||||
# only letters, numbers, spaces, and some basic special characters as
|
||||
# a regular expression matches if it is contained somewhere in the
|
||||
# data field.
|
||||
|
||||
# If there is more than one BrowseFilter directive, ALL the directives
|
||||
# need to be fulfilled for the remote printer to be accepted. If one
|
||||
# is not fulfilled, the printer will get ignored.
|
||||
|
||||
# Examples:
|
||||
|
||||
# Rules for standard data items which are supplied with any remote
|
||||
# printer advertised via DNS-SD:
|
||||
|
||||
# Print queue name must contain "hum_res_", this matches
|
||||
# "hum_res_mono" or "hum_res_color" but also "old_hum_res_mono":
|
||||
|
||||
# BrowseFilter name hum_res_
|
||||
|
||||
# This matches if the remote host name contains "printserver", like
|
||||
# "printserver.local", "printserver2.example.com", "newprintserver":
|
||||
|
||||
# BrowseFilter host printserver
|
||||
|
||||
# This matches all ports with 631 int its number, for example 631,
|
||||
# 8631, 10631,...:
|
||||
|
||||
# BrowseFilter port 631
|
||||
|
||||
# This rule matches if the DNS-SD service name contains "@ printserver":
|
||||
|
||||
# Browsefilter service @ printserver
|
||||
|
||||
# Matches all domains with "local" in their names, not only "local" but
|
||||
# also things like "printlocally.com":
|
||||
|
||||
# BrowseFilter domain local
|
||||
|
||||
# Examples for rules applying to items of the TXT record:
|
||||
|
||||
# This rule selects PostScript printers, as the "PDL" field in the TXT
|
||||
# record contains "postscript" then. This includes also remote CUPS
|
||||
# queues which accept PostScript, independent of whether the physical
|
||||
# printer behind the CUPS queue accepts PostScript or not.
|
||||
|
||||
# BrowseFilter pdl postscript
|
||||
|
||||
# Color printers usually contain a "Color" entry set to "T" (for true)
|
||||
# in the TXT record. This rule selects them:
|
||||
|
||||
# BrowseFilter color
|
||||
|
||||
# This is a similar rule to select only duplex (automatic double-sided
|
||||
# printing) printers:
|
||||
|
||||
# BrowseFilter duplex
|
||||
|
||||
# Rules with the NOT option:
|
||||
|
||||
# This rule EXCLUDES printers from all hosts containing "financial" in
|
||||
# their names, nice to get rid of the 100s of printers of the
|
||||
# financial department:
|
||||
|
||||
# BrowseFilter NOT host financial
|
||||
|
||||
# Get only monochrome printers ("Color" set to "F", meaning false, in
|
||||
# the TXT record):
|
||||
|
||||
# BrowseFilter NOT color
|
||||
|
||||
# Rules with more advanced use of regular expressions:
|
||||
|
||||
# Only queue names which BEGIN WITH "hum_res_" are accepted now, so we
|
||||
# still get "hum_res_mono" or "hum_res_color" but not
|
||||
# "old_hum_res_mono" any more:
|
||||
|
||||
# BrowseFilter name ^hum_res_
|
||||
|
||||
# Server names is accepted if it contains "print_server" OR
|
||||
# "graphics_dep_server":
|
||||
|
||||
# BrowseFilter host print_server|graphics_dep_server
|
||||
|
||||
# "printserver1", "printserver2", and "printserver3", nothing else:
|
||||
|
||||
# BrowseFilter host ^printserver[1-3]$
|
||||
|
||||
# Printers understanding at least one of PostScript, PCL, or PDF:
|
||||
|
||||
# BrowseFilter pdl postscript|pcl|pdf
|
||||
|
||||
# Examples for the EXACT option:
|
||||
|
||||
# Only printers from "printserver.local" are accepted:
|
||||
|
||||
# BrowseFilter EXACT host printserver.local
|
||||
|
||||
# Printers from all servers except "prinserver2.local" are accepted:
|
||||
|
||||
# BrowseFilter NOT EXACT host prinserver2.local
|
||||
|
||||
|
||||
# Use BrowsePoll to poll a particular CUPS server
|
||||
|
||||
# BrowsePoll cups.example.com
|
||||
# BrowsePoll cups.example.com:631
|
||||
# BrowsePoll cups.example.com:631/version=1.1
|
||||
|
||||
|
||||
# Use DomainSocket to access the local CUPS daemon via another than the
|
||||
# default domain socket. "None" or "Off" lets cups-browsed not use CUPS'
|
||||
# domain socket.
|
||||
|
||||
# DomainSocket /var/run/cups/cups.sock
|
||||
# DomainSocket None
|
||||
# DomainSocket Off
|
||||
|
||||
|
||||
# Set HTTP timeout (in seconds) for requests sent to local/remote
|
||||
# resources Note that too short timeouts can make services getting
|
||||
# missed when they are present and operations be unnecessarily
|
||||
# repeated and too long timeouts can make operations take too long
|
||||
# when the server does not respond.
|
||||
|
||||
# HttpLocalTimeout 5
|
||||
# HttpRemoteTimeout 10
|
||||
|
||||
# Set how many retries (N) should cups-browsed do for creating print
|
||||
# queues for remote printers which receive timeouts during print queue
|
||||
# creation. The printers which are not successfully set up even after
|
||||
# N retries, are skipped until the next restart of the service. Note
|
||||
# that too many retries can cause high CPU load.
|
||||
|
||||
# HttpMaxRetries 5
|
||||
|
||||
# Set OnlyUnsupportedByCUPS to "Yes" will make cups-browsed not create
|
||||
# local queues for remote printers for which CUPS creates queues by
|
||||
# itself. These printers are printers advertised via DNS-SD and doing
|
||||
# CUPS-supported (currently PWG Raster and Apple Raster) driverless
|
||||
# printing, including remote CUPS queues. Queues for other printers
|
||||
# (like for legacy PostScript/PCL printers) are always created
|
||||
# (depending on the other configuration settings of cups-browsed).
|
||||
|
||||
# With OnlyUnsupportedByCUPS set to "No", cups-browsed creates queues
|
||||
# for all printers which it supports, including printers for which
|
||||
# CUPS would create queues by itself. Temporary queues created by CUPS
|
||||
# will get overwritten. This way it is assured that any extra
|
||||
# functionality of cups-browsed will apply to these queues. As queues
|
||||
# created by cups-browsed are permanent CUPS queues this setting is
|
||||
# also recommended if applications/print dialogs which do not support
|
||||
# temporary CUPS queues are installed. This setting is the default.
|
||||
|
||||
# OnlyUnsupportedByCUPS Yes
|
||||
|
||||
|
||||
# With UseCUPSGeneratedPPDs set to "Yes" cups-browsed creates queues
|
||||
# for IPP printers with PPDs generated by the PPD generator of CUPS
|
||||
# and not with the one of cups-browsed. So any new development in
|
||||
# CUPS' PPD generator gets available. As CUPS' PPD generator is not
|
||||
# directly accessible, we need to make CUPS generate a temporary print
|
||||
# queue with the desired PPD. Therefore we can only use these PPDs
|
||||
# when our queue replaces a temporary CUPS queue, meaning that the
|
||||
# queue is for a printer on which CUPS supports driverless printing
|
||||
# (IPP 2.x, PDLs: PDF, PWG Raster, and/or Apple Raster) and that its
|
||||
# name is the same as CUPS uses for the temporary queue
|
||||
# ("LocalQueueNamingIPPPrinter DNS-SD" must be set). The directive
|
||||
# applies only to IPP printers, not to remote CUPS queues, to not
|
||||
# break clustering. Setting this directive to "No" lets cups-browsed
|
||||
# generate the PPD file. Default setting is "No".
|
||||
|
||||
# UseCUPSGeneratedPPDs No
|
||||
|
||||
|
||||
# With the directives LocalQueueNamingRemoteCUPS and
|
||||
# LocalQueueNamingIPPPrinter you can determine how the names for local
|
||||
# queues generated by cups-browsed are generated, separately for
|
||||
# remote CUPS printers and IPP printers.
|
||||
|
||||
# DNS-SD (the default in both cases) bases the naming on the service
|
||||
# name of the printer's advertised DNS-SD record. This is exactly the
|
||||
# same naming scheme as CUPS uses for its temporary queues, so the
|
||||
# local queue from cups-browsed prevents CUPS from listing and
|
||||
# creating an additional queue. As DNS-SD service names have to be
|
||||
# unique, queue names of printers from different servers will also be
|
||||
# unique and so there is no automatic clustering for load-balanced
|
||||
# printing.
|
||||
|
||||
# MakeModel bases the queue name on the printer's manufacturer and
|
||||
# model names. This scheme cups-browsed used formerly for IPP
|
||||
# printers.
|
||||
|
||||
# RemoteName is only available for remote CUPS queues and uses the
|
||||
# name of the queue on the remote CUPS server as the local queue's
|
||||
# name. This makes printers on different CUPS servers with equal queue
|
||||
# names automatically forming a load-balancing cluster as CUPS did
|
||||
# formerly (CUPS 1.5.x and older) with CUPS-broadcasted remote
|
||||
# printers. This scheme cups-browsed used formerly for remote CUPS
|
||||
# printers.
|
||||
|
||||
# LocalQueueNamingRemoteCUPS DNS-SD
|
||||
# LocalQueueNamingRemoteCUPS MakeModel
|
||||
# LocalQueueNamingRemoteCUPS RemoteName
|
||||
# LocalQueueNamingIPPPrinter DNS-SD
|
||||
# LocalQueueNamingIPPPrinter MakeModel
|
||||
|
||||
|
||||
# Set DNSSDBasedDeviceURIs to "Yes" if cups-browsed should use
|
||||
# DNS-SD-service-name-based device URIs for its local queues, as CUPS
|
||||
# also does. These queues use the DNS-SD service name of the
|
||||
# discovered printer. With this the URI is independent of network
|
||||
# interfaces and ports, giving reliable connections to always the same
|
||||
# physical device. This setting is the default.
|
||||
|
||||
# Set DNSSDBasedDeviceURIs to "No" if cups-browsed should use the
|
||||
# conventional host-name/IP-based URIs.
|
||||
|
||||
# Note that this option has only influence on URIs for printers
|
||||
# discovered via DNS-SD, not via BrowsePoll.
|
||||
# Those printers get always assigned the conventional URIs.
|
||||
|
||||
# DNSSDBasedDeviceURIs Yes
|
||||
|
||||
|
||||
# Set IPBasedDeviceURIs to "Yes" if cups-browsed should create its
|
||||
# local queues with device URIs with the IP addresses instead of the
|
||||
# host names of the remote servers. This mode is there for any
|
||||
# problems with host name resolution in the network, especially also
|
||||
# if avahi-daemon is only run for printer discovery and already
|
||||
# stopped while still printing. By default this mode is turned off,
|
||||
# meaning that we use URIs with host names.
|
||||
|
||||
# Note that the IP addresses depend on the network interface through
|
||||
# which the printer is accessed. So do not use IP-based URIs on systems
|
||||
# with many network interfaces and where interfaces can appear and
|
||||
# disappear frequently.
|
||||
|
||||
# This mode could also be useful for development and debugging.
|
||||
|
||||
# If you prefer IPv4 or IPv6 IP addresses in the URIs, you can set
|
||||
# IPBasedDeviceURIs to "IPv4" to only get IPv4 IP addresses or
|
||||
# IPBasedDeviceURIs to "IPv6" to only get IPv6 IP addresses.
|
||||
|
||||
# IPBasedDeviceURIs No
|
||||
# IPBasedDeviceURIs Yes
|
||||
# IPBasedDeviceURIs IPv4
|
||||
# IPBasedDeviceURIs IPv6
|
||||
|
||||
# The AllowResharingRemoteCUPSPrinters directive determines whether a
|
||||
# print queue pointing to a remote CUPS queue will be re-shared to the
|
||||
# local network or not. Since the queues generated using the BrowsePoll
|
||||
# directive are also pointing to remote queues, they are also shared
|
||||
# automatically if the following option is set. Default is not to share
|
||||
# remote printers.
|
||||
|
||||
# AllowResharingRemoteCUPSPrinters Yes
|
||||
|
||||
# The NewBrowsePollQueuesShared directive determines whether a print
|
||||
# queue for a newly discovered printer (discovered by the BrowsePoll directive)
|
||||
# will be shared to the local network or not. This directive will only work
|
||||
# if AllowResharingRemoteCUPSPrinters is set to yes. Default is
|
||||
# not to share printers discovered using BrowsePoll.
|
||||
|
||||
# NewBrowsePollQueuesShared Yes
|
||||
|
||||
# Set CreateRemoteRawPrinterQueues to "Yes" to let cups-browsed also
|
||||
# create local queues pointing to remote raw CUPS queues. Normally,
|
||||
# only queues pointing to remote queues with PPD/driver are created
|
||||
# as we do not use drivers on the client side, but in some cases
|
||||
# accessing a remote raw queue can make sense, for example if the
|
||||
# queue forwards the jobs by a special backend like Tea4CUPS.
|
||||
|
||||
# CreateRemoteRawPrinterQueues Yes
|
||||
|
||||
|
||||
# cups-browsed by default creates local print queues for each shared
|
||||
# CUPS print queue which it discovers on remote machines in the local
|
||||
# network(s). Set CreateRemoteCUPSPrinterQueues to "No" if you do not
|
||||
# want cups-browsed to do this. For example you can set cups-browsed
|
||||
# to only create queues for IPP network printers setting
|
||||
# CreateIPPPrinterQueues not to "No" and CreateRemoteCUPSPrinterQueues
|
||||
# to "No".
|
||||
|
||||
# CreateRemoteCUPSPrinterQueues No
|
||||
|
||||
|
||||
# Set CreateIPPPrinterQueues to "All" to let cups-browsed discover IPP
|
||||
# network printers (native printers, not CUPS queues) with known page
|
||||
# description languages (PWG Raster, PDF, PostScript, PCL XL, PCL
|
||||
# 5c/e) in the local network and auto-create print queues for them.
|
||||
|
||||
# Set CreateIPPPrinterQueues to "Everywhere" to let cups-browsed
|
||||
# discover IPP Everywhere printers in the local network (native
|
||||
# printers, not CUPS queues) and auto-create print queues for them.
|
||||
|
||||
# Set CreateIPPPrinterQueues to "AppleRaster" to let cups-browsed
|
||||
# discover Apple Raster printers in the local network (native
|
||||
# printers, not CUPS queues) and auto-create print queues for them.
|
||||
|
||||
# Set CreateIPPPrinterQueues to "Driverless" to let cups-browsed
|
||||
# discover printers designed for driverless use (currently IPP
|
||||
# Everywhere and Apple Raster) in the local network (native printers,
|
||||
# not CUPS queues) and auto-create print queues for them.
|
||||
|
||||
# Set CreateIPPPrinterQueues to "LocalOnly" to auto-create print
|
||||
# queues only for local printers made available as IPP printers. These
|
||||
# are for example IPP-over-USB printers, made available via
|
||||
# ippusbxd. This is the default.
|
||||
|
||||
# Set CreateIPPPrinterQueues to "No" to not auto-create print queues
|
||||
# for IPP network printers.
|
||||
|
||||
# The PPDs are auto-generated by cups-browsed based on properties of
|
||||
# the printer polled via IPP. In case of missing information, info
|
||||
# from the Bonjour record is used as last mean for the default values.
|
||||
|
||||
# This functionality is primarily for mobile devices running
|
||||
# CUPS to not need a printer setup tool nor a collection of printer
|
||||
# drivers and PPDs.
|
||||
|
||||
# CreateIPPPrinterQueues No
|
||||
# CreateIPPPrinterQueues LocalOnly
|
||||
# CreateIPPPrinterQueues Everywhere
|
||||
# CreateIPPPrinterQueues AppleRaster
|
||||
# CreateIPPPrinterQueues Everywhere AppleRaster
|
||||
# CreateIPPPrinterQueues Driverless
|
||||
# CreateIPPPrinterQueues All
|
||||
|
||||
|
||||
# The NewIPPPrinterQueuesShared directive determines whether a print
|
||||
# queue for a newly discovered IPP network printer (not remote CUPS
|
||||
# queue) will be shared to the local network or not. This is only
|
||||
# valid for newly discovered printers. For printers discovered in an
|
||||
# earlier cups-browsed session, cups-browsed will remember whether the
|
||||
# printer was shared, so changes by the user get conserved. Default is
|
||||
# not to share newly discovered IPP printers.
|
||||
|
||||
# NewIPPPrinterQueuesShared Yes
|
||||
|
||||
|
||||
# How to handle the print queues cups-browsed creates when
|
||||
# cups-browsed is shut down:
|
||||
|
||||
# "KeepGeneratedQueuesOnShutdown No" makes the queues being
|
||||
# removed. This makes sense as these queues only work while
|
||||
# cups-browsed is running. cups-browsed has to determine to which
|
||||
# member printer of a cluster to pass on the job.
|
||||
|
||||
# "KeepGeneratedQueuesOnShutdown Yes" (the default) makes the queues
|
||||
# not being removed. This is the recommended setting for a system
|
||||
# where cups-browsed is permanently running and only stopped for short
|
||||
# times (like log rotation) or on shutdown. This avoids the
|
||||
# re-creation of the queues when cups-browsed is restarted, which
|
||||
# often causes a clutter of CUPS notifications on the desktop.
|
||||
|
||||
# KeepGeneratedQueuesOnShutdown No
|
||||
|
||||
# If there is more than one remote CUPS printer whose local queue
|
||||
# would get the same name and AutoClustering is set to "Yes" (the
|
||||
# default) only one local queue is created which makes up a
|
||||
# load-balancing cluster of the remote printers which would get this
|
||||
# queue name (implicit class). This means that when several jobs are
|
||||
# sent to this queue they get distributed between the printers, using
|
||||
# the method chosen by the LoadBalancing directive.
|
||||
|
||||
# Note that the forming of clusters depends on the naming scheme for
|
||||
# local queues created by cups-browsed. If you have set
|
||||
# LocalQueueNamingRemoteCUPS to "DNSSD" you will not get automatic
|
||||
# clustering as the DNS-SD service names are always unique. With
|
||||
# LocalQueueNamingRemoteCUPS set to "RemoteName" local queues are
|
||||
# named as the CUPS queues on the remote servers are named and so
|
||||
# equally named queues on different servers get clustered (this is how
|
||||
# CUPS did it in version 1.5.x or older). LocalQueueNamingRemoteCUPS
|
||||
# set to "MakeModel" makes remote printers of the same model get
|
||||
# clustered. Note that then a cluster can contain more than one queue
|
||||
# of the same server.
|
||||
|
||||
# With AutoClustering set to "No", for each remote CUPS printer an
|
||||
# individual local queue is created, and to avoid name clashes when
|
||||
# using the LocalQueueNamingRemoteCUPS settings "RemoteName" or
|
||||
# "MakeModel" "@<server name>" is added to the local queue name.
|
||||
|
||||
# Only remote CUPS printers get clustered, not IPP network printers or
|
||||
# IPP-over-USB printers.
|
||||
|
||||
# AutoClustering Yes
|
||||
# AutoClustering No
|
||||
|
||||
|
||||
# Load-balancing printer cluster formation can also be manually
|
||||
# controlled by defining explicitly which remote CUPS printers should
|
||||
# get clustered together.
|
||||
|
||||
# This is done by the "Cluster" directive:
|
||||
|
||||
# Cluster <QUEUENAME>: <EXPRESSION1> <EXPRESSION2> ...
|
||||
# Cluster <QUEUENAME>
|
||||
|
||||
# If no expressions are given, <QUEUENAME> is used as the first and
|
||||
# only expression for this cluster.
|
||||
|
||||
# Discovered printers are matched against all the expressions of all
|
||||
# defined clusters. The first expression which matches the discovered
|
||||
# printer determines to which cluster it belongs. Note that this way a
|
||||
# printer can only belong to one cluster. Once matched, further
|
||||
# cluster definitions will not checked any more.
|
||||
|
||||
# With the first printer matching a cluster's expression a local queue
|
||||
# with the name <QUEUENAME> is created. If more printers are
|
||||
# discovered and match this cluster, they join the cluster. Printing
|
||||
# to this queue prints to all these printers in a load-balancing
|
||||
# manner, according to to the setting of the LoadBalancing directive.
|
||||
|
||||
# Each expression must be a string of characters without spaces. If
|
||||
# spaces are needed, replace them by underscores ('_').
|
||||
|
||||
# An expression can be matched in three ways:
|
||||
|
||||
# 1. By the name of the CUPS queue on the remote server
|
||||
# 2. By make and model name of the remote printer
|
||||
# 3. By the DNS-SD service name of the remote printer
|
||||
|
||||
# Note that the matching is done case-insensitively and any group of
|
||||
# non-alphanumerical characters is replaced by a single underscore.
|
||||
|
||||
# So if an expression is "HP_DeskJet_2540" and the remote server
|
||||
# reports "hp Deskjet-2540" the printer gets matched to this cluster.
|
||||
|
||||
# If "AutoClustering" is not set to "No" both your manual cluster
|
||||
# definitions will be followed and automatic clustering of
|
||||
# equally-named remote queues will be performed. If a printer matches
|
||||
# in both categories the match to the manually defined cluster has
|
||||
# priority. Automatic clustering of equally-named remote printers is
|
||||
# not performed if there is a manually defined cluster with this name
|
||||
# (at least as the printers do not match this cluster).
|
||||
|
||||
# Examples:
|
||||
|
||||
# To cluster all remote CUPS queues named "laserprinter" in your local
|
||||
# network but not cluster any other equally-named remote CUPS printers
|
||||
# use (Local queue will get named "laserprinter"):
|
||||
|
||||
# AutoClustering No
|
||||
# Cluster laserprinter
|
||||
|
||||
# To cluster all remote CUPS queues of HP LaserJet 4050 printers in a
|
||||
# local queue named "LJ4050":
|
||||
|
||||
# Cluster LJ4050: HP_LaserJet_4050
|
||||
|
||||
# As DNS-SD service names are unique in a network you can create a
|
||||
# cluster from exactly specified printers (spaces replaced by
|
||||
# underscores):
|
||||
|
||||
# Cluster hrdep: oldlaser_@_hr-server1 newlaser_@_hr-server2
|
||||
|
||||
|
||||
# The LoadBalancing directive switches between two methods of handling
|
||||
# load balancing between equally-named remote queues which are
|
||||
# represented by one local print queue making up a cluster of them
|
||||
# (implicit class).
|
||||
|
||||
# The two methods are:
|
||||
|
||||
# Queuing of jobs on the client (LoadBalancing QueueOnClient):
|
||||
|
||||
# Here we queue up the jobs on the client and regularly check the
|
||||
# clustered remote print queues. If we find an idle queue, we pass
|
||||
# on a job to it.
|
||||
|
||||
# This is also the method which CUPS uses for classes. Advantage is a
|
||||
# more even distribution of the job workload on the servers
|
||||
# (especially if the printing speed of the servers is very different),
|
||||
# and if a server fails, there are not several jobs stuck or
|
||||
# lost. Disadvantage is that if one takes the client (laptop, mobile
|
||||
# phone, ...) out of the local network, printing stops with the jobs
|
||||
# waiting in the local queue.
|
||||
|
||||
# Queuing of jobs on the servers (LoadBalancing QueueOnServers):
|
||||
|
||||
# Here we check the number of jobs on each of the clustered remote
|
||||
# printers and send an incoming job immediately to the remote printer
|
||||
# with the lowest amount of jobs in its queue. This way no jobs queue
|
||||
# up locally, all jobs which are waiting are waiting on one of the
|
||||
# remote servers.
|
||||
|
||||
# Not having jobs waiting locally has the advantage that we can take
|
||||
# the local machine from the network and all jobs get printed.
|
||||
# Disadvantage is that if a server with a full queue of jobs goes
|
||||
# away, the jobs go away, too.
|
||||
|
||||
# Default is queuing the jobs on the client as this is what CUPS does
|
||||
# with classes.
|
||||
|
||||
# LoadBalancing QueueOnClient
|
||||
# LoadBalancing QueueOnServers
|
||||
|
||||
|
||||
# With the DefaultOptions directive one or more option settings can be
|
||||
# defined to be applied to every print queue newly created by
|
||||
# cups-browsed. Each option is supplied as one supplies options with
|
||||
# the "-o" command line argument to the "lpadmin" command (Run "man
|
||||
# lpadmin" for more details). More than one option can be supplied
|
||||
# separating the options by spaces. By default no option settings are
|
||||
# pre-defined.
|
||||
|
||||
# Note that print queues which cups-browsed already created before
|
||||
# remember their previous settings and so these settings do not get
|
||||
# applied.
|
||||
|
||||
# DefaultOptions Option1=Value1 Option2=Value2 Option3 noOption4
|
||||
|
||||
|
||||
# The AutoShutdown directive specifies whether cups-browsed should
|
||||
# automatically terminate when it has no local raw queues set up
|
||||
# pointing to any discovered remote printers or no jobs on such queues
|
||||
# depending on AutoShutdownOn setting (auto shutdown mode). Setting it
|
||||
# to "On" activates the auto-shutdown mode, setting it to "Off"
|
||||
# deactiivates it (the default). The special mode "avahi" turns auto
|
||||
# shutdown off while avahi-daemon is running and on when avahi-daemon
|
||||
# stops. This allows running cups-browsed on-demand when avahi-daemon
|
||||
# is run on-demand.
|
||||
|
||||
# AutoShutdown Off
|
||||
# AutoShutdown On
|
||||
# AutoShutdown avahi
|
||||
|
||||
|
||||
# The AutoShutdownOn directive determines what event cups-browsed
|
||||
# considers as inactivity in auto shutdown mode. "NoQueues" (the
|
||||
# default) means that auto shutdown is initiated when there are no
|
||||
# queues for discovered remote printers generated by cups-browsed any
|
||||
# more. "NoJobs" means that all queues generated by cups-browsed are
|
||||
# without jobs.
|
||||
|
||||
# AutoShutdownOn NoQueues
|
||||
# AutoShutdownOn NoJobs
|
||||
|
||||
|
||||
# The AutoShutdownTimeout directive specifies after how many seconds
|
||||
# without local raw queues set up pointing to any discovered remote
|
||||
# printers or jobs on these queues cups-browsed should actually shut
|
||||
# down in auto shutdown mode. Default is 30 seconds, 0 means immediate
|
||||
# shutdown.
|
||||
|
||||
# AutoShutdownTimeout 30
|
||||
|
||||
# DebugLogFileSize defines the maximum size possible (in KBytes)
|
||||
# of the log files (cups-browsed_log and cups-browsed_previous_logs)
|
||||
# that is created using cups-browsed in the debugging mode.
|
||||
# Setting its value to 0 would turn off any restriction
|
||||
# on the size of the file.
|
||||
|
||||
# DebugLogFileSize 300
|
||||
|
||||
# NotifLeaseDuration defines how long the D-BUS subscription created by cups-browsed
|
||||
# in cupsd will last before cupsd cancels it. The default value is 1 day
|
||||
# in seconds - 86400. The subscription renewal is set to happen after half of
|
||||
# NotifLeaseDuration passed. The D-BUS notifications are used for watching over queues
|
||||
# and doing specific actions when a D-BUS notification comes.
|
||||
|
||||
# NotifLeaseDuration 86400
|
||||
|
||||
# FrequentNetifUpdate turns on/off the network interface update routines
|
||||
# which happen for each found entry, which can slow up cups-browsed significantly
|
||||
# if we are on a network with many shared printers or if we use BrowsePoll to a server
|
||||
# with many queues. Network interface updates after receiving D-BUS notification
|
||||
# from NetworkManager won't be turned off with the directive. The default value
|
||||
# is 'Yes'.
|
||||
#
|
||||
# FrequentNetifUpdate Yes
|
||||
|
||||
# Omarchy: Automatically create queues for discovered remote printers
|
||||
CreateRemotePrinters Yes
|
||||
6
etc/docker/daemon.json
Normal file
6
etc/docker/daemon.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"log-driver": "json-file",
|
||||
"log-opts": { "max-size": "10m", "max-file": "5" },
|
||||
"dns": ["172.17.0.1"],
|
||||
"bip": "172.17.0.1/16"
|
||||
}
|
||||
7
etc/gnupg/dirmngr.conf
Normal file
7
etc/gnupg/dirmngr.conf
Normal file
@@ -0,0 +1,7 @@
|
||||
keyserver hkps://keyserver.ubuntu.com
|
||||
keyserver hkps://pgp.surfnet.nl
|
||||
keyserver hkps://keys.mailvelope.com
|
||||
keyserver hkps://keyring.debian.org
|
||||
keyserver hkps://pgp.mit.edu
|
||||
|
||||
connect-quick-timeout 4
|
||||
1
etc/modprobe.d/omarchy-usb-autosuspend.conf
Normal file
1
etc/modprobe.d/omarchy-usb-autosuspend.conf
Normal file
@@ -0,0 +1 @@
|
||||
options usbcore autosuspend=-1
|
||||
19
etc/nsswitch.conf
Normal file
19
etc/nsswitch.conf
Normal file
@@ -0,0 +1,19 @@
|
||||
# Name Service Switch configuration file.
|
||||
# See nsswitch.conf(5) for details.
|
||||
|
||||
passwd: files systemd
|
||||
group: files [SUCCESS=merge] systemd
|
||||
shadow: files systemd
|
||||
gshadow: files systemd
|
||||
|
||||
publickey: files
|
||||
|
||||
hosts: mymachines mdns_minimal [NOTFOUND=return] resolve files myhostname dns
|
||||
networks: files
|
||||
|
||||
protocols: files
|
||||
services: files
|
||||
ethers: files
|
||||
rpc: files
|
||||
|
||||
netgroup: files
|
||||
11
etc/pacman.d/hooks/walker-restart.hook
Normal file
11
etc/pacman.d/hooks/walker-restart.hook
Normal file
@@ -0,0 +1,11 @@
|
||||
[Trigger]
|
||||
Type = Package
|
||||
Operation = Upgrade
|
||||
Target = walker
|
||||
Target = walker-debug
|
||||
Target = elephant*
|
||||
|
||||
[Action]
|
||||
Description = Restarting Walker services after system update
|
||||
When = PostTransaction
|
||||
Exec = /usr/bin/omarchy-restart-walker
|
||||
3
etc/plymouth/plymouthd.conf
Normal file
3
etc/plymouth/plymouthd.conf
Normal file
@@ -0,0 +1,3 @@
|
||||
[Daemon]
|
||||
Theme=omarchy
|
||||
ShowDelay=0
|
||||
62
etc/security/faillock.conf
Normal file
62
etc/security/faillock.conf
Normal file
@@ -0,0 +1,62 @@
|
||||
# Configuration for locking the user after multiple failed
|
||||
# authentication attempts.
|
||||
#
|
||||
# The directory where the user files with the failure records are kept.
|
||||
# The default is /var/run/faillock.
|
||||
# dir = /var/run/faillock
|
||||
#
|
||||
# Will log the user name into the system log if the user is not found.
|
||||
# Enabled if option is present.
|
||||
# audit
|
||||
#
|
||||
# Don't print informative messages.
|
||||
# Enabled if option is present.
|
||||
# silent
|
||||
#
|
||||
# Don't log informative messages via syslog.
|
||||
# Enabled if option is present.
|
||||
# no_log_info
|
||||
#
|
||||
# Only track failed user authentications attempts for local users
|
||||
# in /etc/passwd and ignore centralized (AD, IdM, LDAP, etc.) users.
|
||||
# The `faillock` command will also no longer track user failed
|
||||
# authentication attempts. Enabling this option will prevent a
|
||||
# double-lockout scenario where a user is locked out locally and
|
||||
# in the centralized mechanism.
|
||||
# Enabled if option is present.
|
||||
# local_users_only
|
||||
#
|
||||
# Deny access if the number of consecutive authentication failures
|
||||
# for this user during the recent interval exceeds n tries.
|
||||
# The default is 3.
|
||||
deny = 10
|
||||
#
|
||||
# The length of the interval during which the consecutive
|
||||
# authentication failures must happen for the user account
|
||||
# lock out is <replaceable>n</replaceable> seconds.
|
||||
# The default is 900 (15 minutes).
|
||||
# fail_interval = 900
|
||||
#
|
||||
# The access will be re-enabled after n seconds after the lock out.
|
||||
# The value 0 has the same meaning as value `never` - the access
|
||||
# will not be re-enabled without resetting the faillock
|
||||
# entries by the `faillock` command.
|
||||
# The default is 600 (10 minutes).
|
||||
unlock_time = 120
|
||||
#
|
||||
# Root account can become locked as well as regular accounts.
|
||||
# Enabled if option is present.
|
||||
# even_deny_root
|
||||
#
|
||||
# This option implies the `even_deny_root` option.
|
||||
# Allow access after n seconds to root account after the
|
||||
# account is locked. In case the option is not specified
|
||||
# the value is the same as of the `unlock_time` option.
|
||||
# root_unlock_time = 900
|
||||
#
|
||||
# If a group name is specified with this option, members
|
||||
# of the group will be handled by this module the same as
|
||||
# the root account (the options `even_deny_root>` and
|
||||
# `root_unlock_time` will apply to them.
|
||||
# By default, the option is not set.
|
||||
# admin_group = <admin_group_name>
|
||||
1
etc/sudoers.d/omarchy-asdcontrol
Normal file
1
etc/sudoers.d/omarchy-asdcontrol
Normal file
@@ -0,0 +1 @@
|
||||
%wheel ALL=(ALL) NOPASSWD: /usr/bin/asdcontrol
|
||||
1
etc/sudoers.d/omarchy-passwd-tries
Normal file
1
etc/sudoers.d/omarchy-passwd-tries
Normal file
@@ -0,0 +1 @@
|
||||
Defaults passwd_tries=10
|
||||
1
etc/sudoers.d/omarchy-tzupdate
Normal file
1
etc/sudoers.d/omarchy-tzupdate
Normal file
@@ -0,0 +1 @@
|
||||
%wheel ALL=(root) NOPASSWD: /usr/bin/tzupdate, /usr/bin/timedatectl
|
||||
1
etc/sysctl.d/99-omarchy-sysctl.conf
Normal file
1
etc/sysctl.d/99-omarchy-sysctl.conf
Normal file
@@ -0,0 +1 @@
|
||||
net.ipv4.tcp_mtu_probing=1
|
||||
4
etc/systemd/logind.conf.d/10-ignore-power-button.conf
Normal file
4
etc/systemd/logind.conf.d/10-ignore-power-button.conf
Normal file
@@ -0,0 +1,4 @@
|
||||
# Disable shutting system down on power button
|
||||
# This allows binding the power button to a custom power menu in Hyprland
|
||||
[Login]
|
||||
HandlePowerKey=ignore
|
||||
4
etc/systemd/resolved.conf.d/10-disable-multicast.conf
Normal file
4
etc/systemd/resolved.conf.d/10-disable-multicast.conf
Normal file
@@ -0,0 +1,4 @@
|
||||
# Disable multicast DNS in systemd-resolved
|
||||
# Avahi will provide mDNS instead for better network printer discovery
|
||||
[Resolve]
|
||||
MulticastDNS=no
|
||||
2
etc/systemd/resolved.conf.d/20-docker-dns.conf
Normal file
2
etc/systemd/resolved.conf.d/20-docker-dns.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
[Resolve]
|
||||
DNSStubListenerExtra=172.17.0.1
|
||||
2
etc/systemd/system.conf.d/10-faster-shutdown.conf
Normal file
2
etc/systemd/system.conf.d/10-faster-shutdown.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
[Manager]
|
||||
DefaultTimeoutStopSec=5s
|
||||
2
etc/systemd/system/docker.service.d/no-block-boot.conf
Normal file
2
etc/systemd/system/docker.service.d/no-block-boot.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
[Unit]
|
||||
DefaultDependencies=no
|
||||
31
install.sh
31
install.sh
@@ -4,14 +4,33 @@
|
||||
set -eEo pipefail
|
||||
|
||||
# Define Omarchy locations
|
||||
export OMARCHY_PATH="$HOME/.local/share/omarchy"
|
||||
export OMARCHY_PATH="/usr/share/omarchy"
|
||||
export OMARCHY_INSTALL="$OMARCHY_PATH/install"
|
||||
export OMARCHY_INSTALL_LOG_FILE="/var/log/omarchy-install.log"
|
||||
export PATH="$OMARCHY_PATH/bin:$PATH"
|
||||
|
||||
# Install
|
||||
source "$OMARCHY_INSTALL/helpers/all.sh"
|
||||
source "$OMARCHY_INSTALL/preflight/all.sh"
|
||||
# Load helpers
|
||||
source "$OMARCHY_INSTALL/helpers/chroot.sh"
|
||||
|
||||
# Simple script runner that outputs to stdout/stderr
|
||||
# archinstall captures all output in /var/log/archinstall/install.log
|
||||
run_logged() {
|
||||
local script="$1"
|
||||
local script_name=$(basename "$script")
|
||||
|
||||
echo "Running: $script_name"
|
||||
|
||||
source "$script"
|
||||
local exit_code=$?
|
||||
|
||||
if [ $exit_code -eq 0 ]; then
|
||||
echo "✓ Completed: $script_name"
|
||||
echo
|
||||
else
|
||||
echo "✗ Failed: $script_name (exit code: $exit_code)"
|
||||
return $exit_code
|
||||
fi
|
||||
}
|
||||
|
||||
# Run installation phases
|
||||
source "$OMARCHY_INSTALL/packaging/all.sh"
|
||||
source "$OMARCHY_INSTALL/config/all.sh"
|
||||
source "$OMARCHY_INSTALL/login/all.sh"
|
||||
|
||||
@@ -1,29 +1,13 @@
|
||||
run_logged $OMARCHY_INSTALL/config/config.sh
|
||||
run_logged $OMARCHY_INSTALL/config/theme.sh
|
||||
run_logged $OMARCHY_INSTALL/config/branding.sh
|
||||
run_logged $OMARCHY_INSTALL/config/git.sh
|
||||
run_logged $OMARCHY_INSTALL/config/gpg.sh
|
||||
run_logged $OMARCHY_INSTALL/config/timezones.sh
|
||||
run_logged $OMARCHY_INSTALL/config/increase-sudo-tries.sh
|
||||
run_logged $OMARCHY_INSTALL/config/increase-lockout-limit.sh
|
||||
run_logged $OMARCHY_INSTALL/config/ssh-flakiness.sh
|
||||
run_logged $OMARCHY_INSTALL/config/detect-keyboard-layout.sh
|
||||
run_logged $OMARCHY_INSTALL/config/xcompose.sh
|
||||
run_logged $OMARCHY_INSTALL/config/mise-work.sh
|
||||
run_logged $OMARCHY_INSTALL/config/fix-powerprofilesctl-shebang.sh
|
||||
run_logged $OMARCHY_INSTALL/config/docker.sh
|
||||
run_logged $OMARCHY_INSTALL/config/mimetypes.sh
|
||||
run_logged $OMARCHY_INSTALL/config/localdb.sh
|
||||
run_logged $OMARCHY_INSTALL/config/walker-elephant.sh
|
||||
run_logged $OMARCHY_INSTALL/config/fast-shutdown.sh
|
||||
run_logged $OMARCHY_INSTALL/config/sudoless-asdcontrol.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/network.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/set-wireless-regdom.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/fix-fkeys.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/bluetooth.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/printer.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/usb-autosuspend.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/ignore-power-button.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/nvidia.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/fix-f13-amd-audio-input.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/fix-bcm43xx.sh
|
||||
@@ -31,3 +15,6 @@ run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-spi-keyboard.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-suspend-nvme.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-t2.sh
|
||||
run_logged $OMARCHY_INSTALL/config/hardware/fix-surface-keyboard.sh
|
||||
|
||||
# Enable all services at the end to minimize daemon reloads
|
||||
run_logged $OMARCHY_INSTALL/config/enable-services.sh
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
# Allow the user to change the branding for fastfetch and screensaver
|
||||
mkdir -p ~/.config/omarchy/branding
|
||||
cp ~/.local/share/omarchy/icon.txt ~/.config/omarchy/branding/about.txt
|
||||
cp ~/.local/share/omarchy/logo.txt ~/.config/omarchy/branding/screensaver.txt
|
||||
@@ -1,6 +0,0 @@
|
||||
# Copy over Omarchy configs
|
||||
mkdir -p ~/.config
|
||||
cp -R ~/.local/share/omarchy/config/* ~/.config/
|
||||
|
||||
# Use default bashrc from Omarchy
|
||||
cp ~/.local/share/omarchy/default/bashrc ~/.bashrc
|
||||
@@ -1,32 +1,2 @@
|
||||
# Configure Docker daemon:
|
||||
# - limit log size to avoid running out of disk
|
||||
# - use host's DNS resolver
|
||||
sudo mkdir -p /etc/docker
|
||||
sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
|
||||
{
|
||||
"log-driver": "json-file",
|
||||
"log-opts": { "max-size": "10m", "max-file": "5" },
|
||||
"dns": ["172.17.0.1"],
|
||||
"bip": "172.17.0.1/16"
|
||||
}
|
||||
EOF
|
||||
|
||||
# Expose systemd-resolved to our Docker network
|
||||
sudo mkdir -p /etc/systemd/resolved.conf.d
|
||||
echo -e '[Resolve]\nDNSStubListenerExtra=172.17.0.1' | sudo tee /etc/systemd/resolved.conf.d/20-docker-dns.conf >/dev/null
|
||||
sudo systemctl restart systemd-resolved
|
||||
|
||||
# Start Docker automatically
|
||||
sudo systemctl enable docker
|
||||
|
||||
# Give this user privileged Docker access
|
||||
# Add user to docker group
|
||||
sudo usermod -aG docker ${USER}
|
||||
|
||||
# Prevent Docker from preventing boot for network-online.target
|
||||
sudo mkdir -p /etc/systemd/system/docker.service.d
|
||||
sudo tee /etc/systemd/system/docker.service.d/no-block-boot.conf <<'EOF'
|
||||
[Unit]
|
||||
DefaultDependencies=no
|
||||
EOF
|
||||
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
27
install/config/enable-services.sh
Normal file
27
install/config/enable-services.sh
Normal file
@@ -0,0 +1,27 @@
|
||||
# Enable all Omarchy system services
|
||||
# This is run at the end of configuration to minimize daemon reloads
|
||||
# Note: sddm and ufw are enabled in their respective setup scripts (login/sddm.sh and first-run/firewall.sh)
|
||||
|
||||
# Networking
|
||||
chrootable_systemctl_enable iwd.service
|
||||
chrootable_systemctl_enable avahi-daemon.service
|
||||
|
||||
# Bluetooth
|
||||
chrootable_systemctl_enable bluetooth.service
|
||||
|
||||
# Printing
|
||||
chrootable_systemctl_enable cups.service
|
||||
chrootable_systemctl_enable cups-browsed.service
|
||||
|
||||
# Docker
|
||||
chrootable_systemctl_enable docker.service
|
||||
|
||||
# Prevent systemd-networkd-wait-online timeout on boot
|
||||
sudo systemctl disable systemd-networkd-wait-online.service
|
||||
sudo systemctl mask systemd-networkd-wait-online.service
|
||||
|
||||
# Single daemon-reload at the end
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# Restart systemd-resolved for Docker DNS configuration
|
||||
sudo systemctl restart systemd-resolved
|
||||
@@ -1,7 +0,0 @@
|
||||
sudo mkdir -p /etc/systemd/system.conf.d
|
||||
|
||||
cat <<EOF | sudo tee /etc/systemd/system.conf.d/10-faster-shutdown.conf
|
||||
[Manager]
|
||||
DefaultTimeoutStopSec=5s
|
||||
EOF
|
||||
sudo systemctl daemon-reload
|
||||
@@ -1,6 +1,2 @@
|
||||
# Setup GPG configuration with multiple keyservers for better reliability
|
||||
sudo mkdir -p /etc/gnupg
|
||||
sudo cp ~/.local/share/omarchy/default/gpg/dirmngr.conf /etc/gnupg/
|
||||
sudo chmod 644 /etc/gnupg/dirmngr.conf
|
||||
sudo gpgconf --kill dirmngr || true
|
||||
sudo gpgconf --launch dirmngr || true
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
# Turn on bluetooth by default
|
||||
chrootable_systemctl_enable bluetooth.service
|
||||
@@ -1,2 +0,0 @@
|
||||
# Disable shutting system down on power button to bind it to power menu afterwards
|
||||
sudo sed -i 's/.*HandlePowerKey=.*/HandlePowerKey=ignore/' /etc/systemd/logind.conf
|
||||
@@ -1,6 +0,0 @@
|
||||
# Ensure iwd service will be started
|
||||
sudo systemctl enable iwd.service
|
||||
|
||||
# Prevent systemd-networkd-wait-online timeout on boot
|
||||
sudo systemctl disable systemd-networkd-wait-online.service
|
||||
sudo systemctl mask systemd-networkd-wait-online.service
|
||||
@@ -1,16 +0,0 @@
|
||||
chrootable_systemctl_enable cups.service
|
||||
|
||||
# Disable multicast dns in resolved. Avahi will provide this for better network printer discovery
|
||||
sudo mkdir -p /etc/systemd/resolved.conf.d
|
||||
echo -e "[Resolve]\nMulticastDNS=no" | sudo tee /etc/systemd/resolved.conf.d/10-disable-multicast.conf
|
||||
chrootable_systemctl_enable avahi-daemon.service
|
||||
|
||||
# Enable mDNS resolution for .local domains
|
||||
sudo sed -i 's/^hosts:.*/hosts: mymachines mdns_minimal [NOTFOUND=return] resolve files myhostname dns/' /etc/nsswitch.conf
|
||||
|
||||
# Enable automatically adding remote printers
|
||||
if ! grep -q '^CreateRemotePrinters Yes' /etc/cups/cups-browsed.conf; then
|
||||
echo 'CreateRemotePrinters Yes' | sudo tee -a /etc/cups/cups-browsed.conf
|
||||
fi
|
||||
|
||||
chrootable_systemctl_enable cups-browsed.service
|
||||
@@ -1,5 +0,0 @@
|
||||
# Disable USB autosuspend to prevent peripheral disconnection issues
|
||||
if [[ ! -f /etc/modprobe.d/disable-usb-autosuspend.conf ]]; then
|
||||
echo "options usbcore autosuspend=-1" | sudo tee /etc/modprobe.d/disable-usb-autosuspend.conf
|
||||
fi
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
# Increase lockout limit to 10 and decrease timeout to 2 minutes
|
||||
sudo sed -i 's|^\(auth\s\+required\s\+pam_faillock.so\)\s\+preauth.*$|\1 preauth silent deny=10 unlock_time=120|' "/etc/pam.d/system-auth"
|
||||
sudo sed -i 's|^\(auth\s\+\[default=die\]\s\+pam_faillock.so\)\s\+authfail.*$|\1 authfail deny=10 unlock_time=120|' "/etc/pam.d/system-auth"
|
||||
@@ -1,3 +0,0 @@
|
||||
# Give the user 10 instead of 3 tries to fat finger their password before lockout
|
||||
echo "Defaults passwd_tries=10" | sudo tee /etc/sudoers.d/passwd-tries
|
||||
sudo chmod 440 /etc/sudoers.d/passwd-tries
|
||||
@@ -1,57 +0,0 @@
|
||||
omarchy-refresh-applications
|
||||
update-desktop-database ~/.local/share/applications
|
||||
|
||||
# Open all images with imv
|
||||
xdg-mime default imv.desktop image/png
|
||||
xdg-mime default imv.desktop image/jpeg
|
||||
xdg-mime default imv.desktop image/gif
|
||||
xdg-mime default imv.desktop image/webp
|
||||
xdg-mime default imv.desktop image/bmp
|
||||
xdg-mime default imv.desktop image/tiff
|
||||
|
||||
# Open PDFs with the Document Viewer
|
||||
xdg-mime default org.gnome.Evince.desktop application/pdf
|
||||
|
||||
# Use Chromium as the default browser
|
||||
xdg-settings set default-web-browser chromium.desktop
|
||||
xdg-mime default chromium.desktop x-scheme-handler/http
|
||||
xdg-mime default chromium.desktop x-scheme-handler/https
|
||||
|
||||
# Open video files with mpv
|
||||
xdg-mime default mpv.desktop video/mp4
|
||||
xdg-mime default mpv.desktop video/x-msvideo
|
||||
xdg-mime default mpv.desktop video/x-matroska
|
||||
xdg-mime default mpv.desktop video/x-flv
|
||||
xdg-mime default mpv.desktop video/x-ms-wmv
|
||||
xdg-mime default mpv.desktop video/mpeg
|
||||
xdg-mime default mpv.desktop video/ogg
|
||||
xdg-mime default mpv.desktop video/webm
|
||||
xdg-mime default mpv.desktop video/quicktime
|
||||
xdg-mime default mpv.desktop video/3gpp
|
||||
xdg-mime default mpv.desktop video/3gpp2
|
||||
xdg-mime default mpv.desktop video/x-ms-asf
|
||||
xdg-mime default mpv.desktop video/x-ogm+ogg
|
||||
xdg-mime default mpv.desktop video/x-theora+ogg
|
||||
xdg-mime default mpv.desktop application/ogg
|
||||
|
||||
# Use Hey for mailto: links
|
||||
xdg-mime default HEY.desktop x-scheme-handler/mailto
|
||||
|
||||
# Open text files with nvim
|
||||
xdg-mime default nvim.desktop text/plain
|
||||
xdg-mime default nvim.desktop text/english
|
||||
xdg-mime default nvim.desktop text/x-makefile
|
||||
xdg-mime default nvim.desktop text/x-c++hdr
|
||||
xdg-mime default nvim.desktop text/x-c++src
|
||||
xdg-mime default nvim.desktop text/x-chdr
|
||||
xdg-mime default nvim.desktop text/x-csrc
|
||||
xdg-mime default nvim.desktop text/x-java
|
||||
xdg-mime default nvim.desktop text/x-moc
|
||||
xdg-mime default nvim.desktop text/x-pascal
|
||||
xdg-mime default nvim.desktop text/x-tcl
|
||||
xdg-mime default nvim.desktop text/x-tex
|
||||
xdg-mime default nvim.desktop application/x-shellscript
|
||||
xdg-mime default nvim.desktop text/x-c
|
||||
xdg-mime default nvim.desktop text/x-c++
|
||||
xdg-mime default nvim.desktop application/xml
|
||||
xdg-mime default nvim.desktop text/xml
|
||||
@@ -1,2 +0,0 @@
|
||||
# Solve common flakiness with SSH
|
||||
echo "net.ipv4.tcp_mtu_probing=1" | sudo tee -a /etc/sysctl.d/99-sysctl.conf
|
||||
@@ -1,3 +0,0 @@
|
||||
# Setup sudo-less controls for controlling brightness on Apple Displays
|
||||
echo "$USER ALL=(ALL) NOPASSWD: /usr/bin/asdcontrol" | sudo tee /etc/sudoers.d/asdcontrol
|
||||
sudo chmod 440 /etc/sudoers.d/asdcontrol
|
||||
@@ -4,11 +4,13 @@ sudo ln -snf /usr/share/icons/Adwaita/symbolic/actions/go-next-symbolic.svg /usr
|
||||
|
||||
# Setup theme links
|
||||
mkdir -p ~/.config/omarchy/themes
|
||||
for f in ~/.local/share/omarchy/themes/*; do ln -nfs "$f" ~/.config/omarchy/themes/; done
|
||||
for f in /usr/share/omarchy/themes/*; do ln -nfs "$f" ~/.config/omarchy/themes/; done
|
||||
|
||||
# Set initial theme
|
||||
# Set initial theme to tokyo-night
|
||||
# Theme files are managed by the package at /usr/share/omarchy/themes/
|
||||
# User's current theme selection is stored at ~/.config/omarchy/current
|
||||
mkdir -p ~/.config/omarchy/current
|
||||
ln -snf ~/.config/omarchy/themes/tokyo-night ~/.config/omarchy/current/theme
|
||||
ln -snf /usr/share/omarchy/themes/tokyo-night ~/.config/omarchy/current/theme
|
||||
ln -snf ~/.config/omarchy/current/theme/backgrounds/1-scenery-pink-lakeside-sunset-lake-landscape-scenic-panorama-7680x3215-144.png ~/.config/omarchy/current/background
|
||||
|
||||
# Set specific app links for current theme
|
||||
@@ -20,6 +22,9 @@ ln -snf ~/.config/omarchy/current/theme/btop.theme ~/.config/btop/themes/current
|
||||
mkdir -p ~/.config/mako
|
||||
ln -snf ~/.config/omarchy/current/theme/mako.ini ~/.config/mako/config
|
||||
|
||||
mkdir -p ~/.config/walker/themes
|
||||
ln -snf /usr/share/omarchy/default/walker/themes/omarchy-default ~/.config/walker/themes/omarchy-default
|
||||
|
||||
# Add managed policy directories for Chromium and Brave for theme changes
|
||||
sudo mkdir -p /etc/chromium/policies/managed
|
||||
sudo chmod a+rw /etc/chromium/policies/managed
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
# Ensure timezone can be updated without needing to sudo
|
||||
sudo tee /etc/sudoers.d/omarchy-tzupdate >/dev/null <<EOF
|
||||
%wheel ALL=(root) NOPASSWD: /usr/bin/tzupdate, /usr/bin/timedatectl
|
||||
EOF
|
||||
sudo chmod 0440 /etc/sudoers.d/omarchy-tzupdate
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Create pacman hook to restart walker after updates
|
||||
sudo mkdir -p /etc/pacman.d/hooks
|
||||
sudo tee /etc/pacman.d/hooks/walker-restart.hook > /dev/null << EOF
|
||||
[Trigger]
|
||||
Type = Package
|
||||
Operation = Upgrade
|
||||
Target = walker
|
||||
Target = walker-debug
|
||||
Target = elephant*
|
||||
|
||||
[Action]
|
||||
Description = Restarting Walker services after system update
|
||||
When = PostTransaction
|
||||
Exec = $OMARCHY_PATH/bin/omarchy-restart-walker
|
||||
EOF
|
||||
@@ -1,4 +1,5 @@
|
||||
source $OMARCHY_INSTALL/helpers/chroot.sh
|
||||
# Helper functions for ISO/non-chroot usage
|
||||
# These are used by .automated_script.sh on the ISO
|
||||
source $OMARCHY_INSTALL/helpers/presentation.sh
|
||||
source $OMARCHY_INSTALL/helpers/errors.sh
|
||||
source $OMARCHY_INSTALL/helpers/logging.sh
|
||||
source $OMARCHY_INSTALL/helpers/errors.sh
|
||||
|
||||
@@ -122,6 +122,7 @@ catch_errors() {
|
||||
|
||||
case "$choice" in
|
||||
"Retry installation")
|
||||
# FIXME: Update based on final setup
|
||||
bash ~/.local/share/omarchy/install.sh
|
||||
break
|
||||
;;
|
||||
@@ -133,7 +134,7 @@ catch_errors() {
|
||||
fi
|
||||
;;
|
||||
"Upload log for support")
|
||||
omarchy-upload-install-log
|
||||
omarchy-upload-log
|
||||
;;
|
||||
"Exit" | "")
|
||||
exit 1
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# Log output UI for .automated_script.sh
|
||||
# Tails one or more log files and displays them with pretty formatting
|
||||
# Supports multiple files: start_log_output file1 file2 file3
|
||||
# Uses tail -F so it waits for files that don't exist yet
|
||||
start_log_output() {
|
||||
local ANSI_SAVE_CURSOR="\033[s"
|
||||
local ANSI_RESTORE_CURSOR="\033[u"
|
||||
@@ -6,6 +10,9 @@ start_log_output() {
|
||||
local ANSI_RESET="\033[0m"
|
||||
local ANSI_GRAY="\033[90m"
|
||||
|
||||
# Support multiple log files, default to main install log
|
||||
local log_files=("${@:-/var/log/omarchy-install.log}")
|
||||
|
||||
# Save cursor position and hide cursor
|
||||
printf $ANSI_SAVE_CURSOR
|
||||
printf $ANSI_HIDE_CURSOR
|
||||
@@ -14,121 +21,67 @@ start_log_output() {
|
||||
local log_lines=20
|
||||
local max_line_width=$((LOGO_WIDTH - 4))
|
||||
|
||||
while true; do
|
||||
# Read the last N lines into an array
|
||||
mapfile -t current_lines < <(tail -n $log_lines "$OMARCHY_INSTALL_LOG_FILE" 2>/dev/null)
|
||||
# Use tail -F to follow multiple files, even if they don't exist yet
|
||||
# -F = --follow=name --retry (follows by name, waits for files to appear)
|
||||
# -n 0 = start from end (don't show existing content)
|
||||
# -q = quiet (no headers when switching between files)
|
||||
tail -F -n 0 -q "${log_files[@]}" 2>/dev/null | while IFS= read -r line; do
|
||||
# Keep a rolling buffer of the last N lines
|
||||
if [ ! -f /tmp/omarchy-log-buffer.txt ]; then
|
||||
touch /tmp/omarchy-log-buffer.txt
|
||||
fi
|
||||
|
||||
# Append new line and keep only last N lines
|
||||
echo "$line" >> /tmp/omarchy-log-buffer.txt
|
||||
tail -n $log_lines /tmp/omarchy-log-buffer.txt > /tmp/omarchy-log-buffer.tmp
|
||||
mv /tmp/omarchy-log-buffer.tmp /tmp/omarchy-log-buffer.txt
|
||||
|
||||
# Read current buffer
|
||||
mapfile -t current_lines < /tmp/omarchy-log-buffer.txt
|
||||
|
||||
# Build complete output buffer with escape sequences
|
||||
output=""
|
||||
for ((i = 0; i < log_lines; i++)); do
|
||||
line="${current_lines[i]:-}"
|
||||
current_line="${current_lines[i]:-}"
|
||||
|
||||
# Truncate if needed
|
||||
if [ ${#line} -gt $max_line_width ]; then
|
||||
line="${line:0:$max_line_width}..."
|
||||
if [ ${#current_line} -gt $max_line_width ]; then
|
||||
current_line="${current_line:0:$max_line_width}..."
|
||||
fi
|
||||
|
||||
# Add clear line escape and formatted output for each line
|
||||
if [ -n "$line" ]; then
|
||||
output+="${ANSI_CLEAR_LINE}${ANSI_GRAY}${PADDING_LEFT_SPACES} → ${line}${ANSI_RESET}\n"
|
||||
if [ -n "$current_line" ]; then
|
||||
output+="${ANSI_CLEAR_LINE}${ANSI_GRAY}${PADDING_LEFT_SPACES} → ${current_line}${ANSI_RESET}\n"
|
||||
else
|
||||
output+="${ANSI_CLEAR_LINE}${PADDING_LEFT_SPACES}\n"
|
||||
fi
|
||||
done
|
||||
|
||||
printf "${ANSI_RESTORE_CURSOR}%b" "$output"
|
||||
|
||||
sleep 0.1
|
||||
done
|
||||
) &
|
||||
monitor_pid=$!
|
||||
}
|
||||
|
||||
stop_log_output() {
|
||||
local ANSI_SHOW_CURSOR="\033[?25h"
|
||||
|
||||
if [ -n "${monitor_pid:-}" ]; then
|
||||
kill $monitor_pid 2>/dev/null || true
|
||||
wait $monitor_pid 2>/dev/null || true
|
||||
# Disown the process to prevent "Killed" message
|
||||
disown $monitor_pid 2>/dev/null || true
|
||||
|
||||
# Kill child processes first (tail -F) with SIGKILL
|
||||
pkill -9 -P $monitor_pid 2>/dev/null || true
|
||||
|
||||
# Kill the monitor process with SIGKILL for immediate termination
|
||||
kill -9 $monitor_pid 2>/dev/null || true
|
||||
|
||||
# Clean up temp buffer file
|
||||
rm -f /tmp/omarchy-log-buffer.txt /tmp/omarchy-log-buffer.tmp 2>/dev/null || true
|
||||
|
||||
unset monitor_pid
|
||||
fi
|
||||
}
|
||||
|
||||
start_install_log() {
|
||||
sudo touch "$OMARCHY_INSTALL_LOG_FILE"
|
||||
sudo chmod 666 "$OMARCHY_INSTALL_LOG_FILE"
|
||||
|
||||
export OMARCHY_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
|
||||
echo "=== Omarchy Installation Started: $OMARCHY_START_TIME ===" >>"$OMARCHY_INSTALL_LOG_FILE"
|
||||
start_log_output
|
||||
}
|
||||
|
||||
stop_install_log() {
|
||||
stop_log_output
|
||||
show_cursor
|
||||
|
||||
if [[ -n ${OMARCHY_INSTALL_LOG_FILE:-} ]]; then
|
||||
OMARCHY_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
echo "=== Omarchy Installation Completed: $OMARCHY_END_TIME ===" >>"$OMARCHY_INSTALL_LOG_FILE"
|
||||
echo "" >>"$OMARCHY_INSTALL_LOG_FILE"
|
||||
echo "=== Installation Time Summary ===" >>"$OMARCHY_INSTALL_LOG_FILE"
|
||||
|
||||
if [ -f "/var/log/archinstall/install.log" ]; then
|
||||
ARCHINSTALL_START=$(grep -m1 '^\[' /var/log/archinstall/install.log 2>/dev/null | sed 's/^\[\([^]]*\)\].*/\1/' || true)
|
||||
ARCHINSTALL_END=$(grep 'Installation completed without any errors' /var/log/archinstall/install.log 2>/dev/null | sed 's/^\[\([^]]*\)\].*/\1/' || true)
|
||||
|
||||
if [ -n "$ARCHINSTALL_START" ] && [ -n "$ARCHINSTALL_END" ]; then
|
||||
ARCH_START_EPOCH=$(date -d "$ARCHINSTALL_START" +%s)
|
||||
ARCH_END_EPOCH=$(date -d "$ARCHINSTALL_END" +%s)
|
||||
ARCH_DURATION=$((ARCH_END_EPOCH - ARCH_START_EPOCH))
|
||||
|
||||
ARCH_MINS=$((ARCH_DURATION / 60))
|
||||
ARCH_SECS=$((ARCH_DURATION % 60))
|
||||
|
||||
echo "Archinstall: ${ARCH_MINS}m ${ARCH_SECS}s" >>"$OMARCHY_INSTALL_LOG_FILE"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$OMARCHY_START_TIME" ]; then
|
||||
OMARCHY_START_EPOCH=$(date -d "$OMARCHY_START_TIME" +%s)
|
||||
OMARCHY_END_EPOCH=$(date -d "$OMARCHY_END_TIME" +%s)
|
||||
OMARCHY_DURATION=$((OMARCHY_END_EPOCH - OMARCHY_START_EPOCH))
|
||||
|
||||
OMARCHY_MINS=$((OMARCHY_DURATION / 60))
|
||||
OMARCHY_SECS=$((OMARCHY_DURATION % 60))
|
||||
|
||||
echo "Omarchy: ${OMARCHY_MINS}m ${OMARCHY_SECS}s" >>"$OMARCHY_INSTALL_LOG_FILE"
|
||||
|
||||
if [ -n "$ARCH_DURATION" ]; then
|
||||
TOTAL_DURATION=$((ARCH_DURATION + OMARCHY_DURATION))
|
||||
TOTAL_MINS=$((TOTAL_DURATION / 60))
|
||||
TOTAL_SECS=$((TOTAL_DURATION % 60))
|
||||
echo "Total: ${TOTAL_MINS}m ${TOTAL_SECS}s" >>"$OMARCHY_INSTALL_LOG_FILE"
|
||||
fi
|
||||
fi
|
||||
echo "=================================" >>"$OMARCHY_INSTALL_LOG_FILE"
|
||||
|
||||
echo "Rebooting system..." >>"$OMARCHY_INSTALL_LOG_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
run_logged() {
|
||||
local script="$1"
|
||||
|
||||
export CURRENT_SCRIPT="$script"
|
||||
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting: $script" >>"$OMARCHY_INSTALL_LOG_FILE"
|
||||
|
||||
# Use bash -c to create a clean subshell
|
||||
bash -c "source '$script'" </dev/null >>"$OMARCHY_INSTALL_LOG_FILE" 2>&1
|
||||
|
||||
local exit_code=$?
|
||||
|
||||
if [ $exit_code -eq 0 ]; then
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Completed: $script" >>"$OMARCHY_INSTALL_LOG_FILE"
|
||||
unset CURRENT_SCRIPT
|
||||
else
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Failed: $script (exit code: $exit_code)" >>"$OMARCHY_INSTALL_LOG_FILE"
|
||||
fi
|
||||
|
||||
return $exit_code
|
||||
|
||||
# Restore cursor visibility
|
||||
printf $ANSI_SHOW_CURSOR
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
run_logged $OMARCHY_INSTALL/login/plymouth.sh
|
||||
run_logged $OMARCHY_INSTALL/login/default-keyring.sh
|
||||
run_logged $OMARCHY_INSTALL/login/sddm.sh
|
||||
run_logged $OMARCHY_INSTALL/login/limine-snapper.sh
|
||||
|
||||
@@ -78,6 +78,11 @@ term_background_bright: 24283b
|
||||
|
||||
EOF
|
||||
|
||||
# Remove the original config file if it's not /boot/limine.conf
|
||||
if [[ "$limine_config" != "/boot/limine.conf" ]] && [[ -f "$limine_config" ]]; then
|
||||
sudo rm "$limine_config"
|
||||
fi
|
||||
|
||||
|
||||
# Match Snapper configs if not installing from the ISO
|
||||
if [[ -z ${OMARCHY_CHROOT_INSTALL:-} ]]; then
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
if [ "$(plymouth-set-default-theme)" != "omarchy" ]; then
|
||||
sudo cp -r "$HOME/.local/share/omarchy/default/plymouth" /usr/share/plymouth/themes/omarchy/
|
||||
sudo plymouth-set-default-theme omarchy
|
||||
fi
|
||||
@@ -4,7 +4,6 @@
|
||||
1password-beta
|
||||
1password-cli
|
||||
aether
|
||||
alacritty
|
||||
asdcontrol
|
||||
avahi
|
||||
bash-completion
|
||||
@@ -12,7 +11,7 @@ bat
|
||||
blueberry
|
||||
brightnessctl
|
||||
btop
|
||||
cargo
|
||||
rust
|
||||
clang
|
||||
cups
|
||||
cups-browsed
|
||||
@@ -33,6 +32,7 @@ fd
|
||||
ffmpegthumbnailer
|
||||
fontconfig
|
||||
fzf
|
||||
ghostty
|
||||
github-cli
|
||||
gnome-calculator
|
||||
gnome-keyring
|
||||
@@ -45,7 +45,7 @@ gvfs-nfs
|
||||
gvfs-smb
|
||||
hypridle
|
||||
hyprland
|
||||
hyprland-qtutils
|
||||
hyprland-guiutils
|
||||
hyprlock
|
||||
hyprpicker
|
||||
hyprsunset
|
||||
@@ -64,12 +64,12 @@ less
|
||||
libsecret
|
||||
libyaml
|
||||
libqalculate
|
||||
libreoffice
|
||||
libreoffice-fresh
|
||||
llvm
|
||||
localsend
|
||||
luarocks
|
||||
mako
|
||||
man
|
||||
man-db
|
||||
mariadb-libs
|
||||
mise
|
||||
mpv
|
||||
@@ -83,6 +83,7 @@ nss-mdns
|
||||
nvim
|
||||
obs-studio
|
||||
obsidian
|
||||
omarchy
|
||||
omarchy-chromium
|
||||
omarchy-nvim
|
||||
omarchy-walker
|
||||
|
||||
@@ -35,7 +35,7 @@ pipewire
|
||||
pipewire-alsa
|
||||
pipewire-jack
|
||||
pipewire-pulse
|
||||
qt5-remoteobjects
|
||||
# qt5-remoteobjects # REMOVED: Package no longer exists in repos
|
||||
qt6-wayland
|
||||
sassc
|
||||
snapper
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
# Skip base package installation if running from archinstall wrapper
|
||||
# The wrapper already installed base packages before user creation
|
||||
if [[ -z "$OMARCHY_ARCHINSTALL_WRAPPER" ]]; then
|
||||
run_logged $OMARCHY_INSTALL/packaging/base.sh
|
||||
fi
|
||||
|
||||
run_logged $OMARCHY_INSTALL/packaging/apps.sh
|
||||
run_logged $OMARCHY_INSTALL/packaging/fonts.sh
|
||||
run_logged $OMARCHY_INSTALL/packaging/nvim.sh
|
||||
run_logged $OMARCHY_INSTALL/packaging/icons.sh
|
||||
run_logged $OMARCHY_INSTALL/packaging/webapps.sh
|
||||
run_logged $OMARCHY_INSTALL/packaging/tuis.sh
|
||||
|
||||
1
install/packaging/apps.sh
Normal file
1
install/packaging/apps.sh
Normal file
@@ -0,0 +1 @@
|
||||
omarchy-refresh-applications
|
||||
@@ -1,4 +1 @@
|
||||
# Omarchy logo in a font for Waybar use
|
||||
mkdir -p ~/.local/share/fonts
|
||||
cp ~/.local/share/omarchy/config/omarchy.ttf ~/.local/share/fonts/
|
||||
fc-cache
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
# Copy all bundled icons to the applications/icons directory
|
||||
ICON_DIR="$HOME/.local/share/applications/icons"
|
||||
mkdir -p "$ICON_DIR"
|
||||
cp ~/.local/share/omarchy/applications/icons/*.png "$ICON_DIR/"
|
||||
@@ -1,38 +1,7 @@
|
||||
stop_install_log
|
||||
|
||||
echo_in_style() {
|
||||
echo "$1" | tte --canvas-width 0 --anchor-text c --frame-rate 640 print
|
||||
}
|
||||
|
||||
clear
|
||||
echo
|
||||
tte -i ~/.local/share/omarchy/logo.txt --canvas-width 0 --anchor-text c --frame-rate 920 laseretch
|
||||
echo
|
||||
|
||||
# Display installation time if available
|
||||
if [[ -f $OMARCHY_INSTALL_LOG_FILE ]] && grep -q "Total:" "$OMARCHY_INSTALL_LOG_FILE" 2>/dev/null; then
|
||||
echo
|
||||
TOTAL_TIME=$(tail -n 20 "$OMARCHY_INSTALL_LOG_FILE" | grep "^Total:" | sed 's/^Total:[[:space:]]*//')
|
||||
if [ -n "$TOTAL_TIME" ]; then
|
||||
echo_in_style "Installed in $TOTAL_TIME"
|
||||
fi
|
||||
else
|
||||
echo_in_style "Finished installing"
|
||||
fi
|
||||
# Installation completed in chroot
|
||||
echo "[finished] Chroot installation completed successfully"
|
||||
|
||||
# Clean up installer sudoers
|
||||
if sudo test -f /etc/sudoers.d/99-omarchy-installer; then
|
||||
sudo rm -f /etc/sudoers.d/99-omarchy-installer &>/dev/null
|
||||
fi
|
||||
|
||||
# Exit gracefully if user chooses not to reboot
|
||||
if gum confirm --padding "0 0 0 $((PADDING_LEFT + 32))" --show-help=false --default --affirmative "Reboot Now" --negative "" ""; then
|
||||
# Clear screen to hide any shutdown messages
|
||||
clear
|
||||
|
||||
if [[ -n "${OMARCHY_CHROOT_INSTALL:-}" ]]; then
|
||||
touch /var/tmp/omarchy-install-completed
|
||||
exit 0
|
||||
else
|
||||
sudo reboot 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Configure pacman
|
||||
sudo cp -f ~/.local/share/omarchy/default/pacman/pacman.conf /etc/pacman.conf
|
||||
sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist /etc/pacman.d/mirrorlist
|
||||
sudo cp -f /usr/share/omarchy/default/pacman/pacman.conf /etc/pacman.conf
|
||||
sudo cp -f /usr/share/omarchy/default/pacman/mirrorlist /etc/pacman.d/mirrorlist
|
||||
|
||||
if lspci -nn | grep -q "106b:180[12]"; then
|
||||
cat <<EOF | sudo tee -a /etc/pacman.conf >/dev/null
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
clear_logo
|
||||
gum style --foreground 3 --padding "1 0 0 $PADDING_LEFT" "Installing..."
|
||||
echo
|
||||
start_install_log
|
||||
@@ -1,6 +1,6 @@
|
||||
OMARCHY_MIGRATIONS_STATE_PATH=~/.local/state/omarchy/migrations
|
||||
mkdir -p $OMARCHY_MIGRATIONS_STATE_PATH
|
||||
|
||||
for file in ~/.local/share/omarchy/migrations/*.sh; do
|
||||
for file in /usr/share/omarchy/migrations/*.sh; do
|
||||
touch "$OMARCHY_MIGRATIONS_STATE_PATH/$(basename "$file")"
|
||||
done
|
||||
|
||||
@@ -3,8 +3,8 @@ if [[ -n ${OMARCHY_ONLINE_INSTALL:-} ]]; then
|
||||
sudo pacman -S --needed --noconfirm base-devel
|
||||
|
||||
# Configure pacman
|
||||
sudo cp -f ~/.local/share/omarchy/default/pacman/pacman.conf /etc/pacman.conf
|
||||
sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist /etc/pacman.d/mirrorlist
|
||||
sudo cp -f /usr/share/omarchy/default/pacman/pacman.conf /etc/pacman.conf
|
||||
sudo cp -f /usr/share/omarchy/default/pacman/mirrorlist /etc/pacman.d/mirrorlist
|
||||
|
||||
sudo pacman-key --recv-keys 40DFB630FF42BCFFB047046CF0134EE680CAC571 --keyserver keys.openpgp.org
|
||||
sudo pacman-key --lsign-key 40DFB630FF42BCFFB047046CF0134EE680CAC571
|
||||
|
||||
12
migrations/1762446739.sh
Normal file
12
migrations/1762446739.sh
Normal file
@@ -0,0 +1,12 @@
|
||||
echo "Remove alternative limine.conf files"
|
||||
|
||||
if omarchy-cmd-present limine; then
|
||||
if [ ! -f /boot/limine.conf ]; then
|
||||
echo "Error: /boot/limine.conf does not exist. Do not reboot without resolving this issue!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sudo rm -f /boot/EFI/limine/limine.conf
|
||||
sudo rm -f /boot/EFI/BOOT/limine.conf
|
||||
sudo rm -f /boot/limine/limine.conf
|
||||
fi
|
||||
@@ -1,4 +1,4 @@
|
||||
include=~/.local/share/omarchy/default/mako/core.ini
|
||||
include=/usr/share/omarchy/default/mako/core.ini
|
||||
|
||||
text-color=#4c4f69
|
||||
border-color=#1e66f5
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
include=~/.local/share/omarchy/default/mako/core.ini
|
||||
include=/usr/share/omarchy/default/mako/core.ini
|
||||
|
||||
text-color=#cad3f5
|
||||
border-color=#c6d0f5
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
include=~/.local/share/omarchy/default/mako/core.ini
|
||||
include=/usr/share/omarchy/default/mako/core.ini
|
||||
|
||||
text-color=#d3c6aa
|
||||
border-color=#d3c6aa
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
include=~/.local/share/omarchy/default/mako/core.ini
|
||||
include=/usr/share/omarchy/default/mako/core.ini
|
||||
|
||||
text-color=#100F0F
|
||||
border-color=#205EA6
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
include=~/.local/share/omarchy/default/mako/core.ini
|
||||
include=/usr/share/omarchy/default/mako/core.ini
|
||||
|
||||
text-color=#d4be98
|
||||
border-color=#a89984
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
include=~/.local/share/omarchy/default/mako/core.ini
|
||||
include=/usr/share/omarchy/default/mako/core.ini
|
||||
|
||||
text-color=#dcd7ba
|
||||
border-color=#dcd7ba
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
include=~/.local/share/omarchy/default/mako/core.ini
|
||||
include=/usr/share/omarchy/default/mako/core.ini
|
||||
|
||||
text-color=#8a8a8d
|
||||
border-color=#8A8A8D
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
include=~/.local/share/omarchy/default/mako/core.ini
|
||||
include=/usr/share/omarchy/default/mako/core.ini
|
||||
|
||||
text-color=#d8dee9
|
||||
border-color=#D8DEE9
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
include=~/.local/share/omarchy/default/mako/core.ini
|
||||
include=/usr/share/omarchy/default/mako/core.ini
|
||||
|
||||
text-color=#C1C497
|
||||
border-color=#214237
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
include=~/.local/share/omarchy/default/mako/core.ini
|
||||
include=/usr/share/omarchy/default/mako/core.ini
|
||||
|
||||
text-color=#e6d9db
|
||||
border-color=#e6d9db
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
include=~/.local/share/omarchy/default/mako/core.ini
|
||||
include=/usr/share/omarchy/default/mako/core.ini
|
||||
|
||||
text-color=#575279
|
||||
border-color=#575279
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
include=~/.local/share/omarchy/default/mako/core.ini
|
||||
include=/usr/share/omarchy/default/mako/core.ini
|
||||
|
||||
text-color=#c0caf5
|
||||
border-color=#33ccff
|
||||
|
||||
Reference in New Issue
Block a user