mirror of
https://github.com/basecamp/omarchy.git
synced 2026-02-17 15:25:37 +00:00
Compare commits
59 Commits
share-pick
...
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
|
#!/bin/bash
|
||||||
|
|
||||||
|
# FIXME: Update behavior
|
||||||
cd ~/.local/share/omarchy
|
cd ~/.local/share/omarchy
|
||||||
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
|
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
|
||||||
touch $migration_file
|
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)"' |
|
jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' |
|
||||||
sed -r \
|
sed -r \
|
||||||
-e 's/null//' \
|
-e 's/null//' \
|
||||||
-e 's,~/.local/share/omarchy/bin/,,' \
|
|
||||||
-e 's,uwsm app -- ,,' \
|
-e 's,uwsm app -- ,,' \
|
||||||
-e 's,uwsm-app -- ,,' \
|
-e 's,uwsm-app -- ,,' \
|
||||||
-e 's/@0//' \
|
-e 's/@0//' \
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ mkdir -p "$STATE_DIR"
|
|||||||
mkdir -p "$STATE_DIR/skipped"
|
mkdir -p "$STATE_DIR/skipped"
|
||||||
|
|
||||||
# Run any pending migrations
|
# 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")
|
filename=$(basename "$file")
|
||||||
|
|
||||||
if [[ ! -f "$STATE_DIR/$filename" && ! -f "$STATE_DIR/skipped/$filename" ]]; then
|
if [[ ! -f "$STATE_DIR/$filename" && ! -f "$STATE_DIR/skipped/$filename" ]]; then
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
# Copy and sync icon files
|
# Copy and sync icon files
|
||||||
mkdir -p ~/.local/share/icons/hicolor/48x48/apps/
|
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
|
gtk-update-icon-cache ~/.local/share/icons/hicolor &>/dev/null
|
||||||
|
|
||||||
# Copy .desktop declarations
|
# Copy .desktop declarations
|
||||||
mkdir -p ~/.local/share/applications
|
mkdir -p ~/.local/share/applications
|
||||||
cp ~/.local/share/omarchy/applications/*.desktop ~/.local/share/applications/
|
cp /usr/share/omarchy/applications/*.desktop ~/.local/share/applications/
|
||||||
cp ~/.local/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/
|
cp /usr/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/
|
||||||
|
|
||||||
update-desktop-database ~/.local/share/applications
|
update-desktop-database ~/.local/share/applications
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/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
|
config_file=$1
|
||||||
|
|
||||||
if [[ -z "$config_file" ]]; then
|
if [[ -z "$config_file" ]]; then
|
||||||
@@ -8,7 +8,7 @@ if [[ -z "$config_file" ]]; then
|
|||||||
Usage: $0 [config_file]
|
Usage: $0 [config_file]
|
||||||
|
|
||||||
Must provide a file path from the .config directory to be refreshed.
|
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
|
$0 hypr/hyprlock.conf
|
||||||
USAGE
|
USAGE
|
||||||
@@ -17,7 +17,7 @@ fi
|
|||||||
|
|
||||||
# Backup the destination file (with timestamp) to avoid clobbering (Ex: hyprlock.conf.bak.1753817951)
|
# Backup the destination file (with timestamp) to avoid clobbering (Ex: hyprlock.conf.bak.1753817951)
|
||||||
user_config_file="${HOME}/.config/$config_file"
|
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)"
|
backup_config_file="$user_config_file.bak.$(date +%s)"
|
||||||
|
|
||||||
if [[ -f "$user_config_file" ]]; then
|
if [[ -f "$user_config_file" ]]; then
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
#!/bin/bash
|
#!/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
|
#!/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
|
sudo plymouth-set-default-theme omarchy
|
||||||
|
|
||||||
if command -v limine-mkinitcpio &>/dev/null; then
|
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"
|
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
|
if gum confirm "Are you sure you want to reinstall and lose all config changes?"; then
|
||||||
echo "Resetting Omarchy repository"
|
echo "Reinstalling Omarchy Package"
|
||||||
git clone "https://github.com/basecamp/omarchy.git" ~/.local/share/omarchy-new >/dev/null
|
sudo pacman -Syu --noconfirm --needed omarchy
|
||||||
rm -rf $OMARCHY_PATH
|
|
||||||
mv ~/.local/share/omarchy-new $OMARCHY_PATH
|
|
||||||
|
|
||||||
echo "Reinstalling missing Omarchy packages"
|
echo "Reinstalling missing Omarchy packages"
|
||||||
mapfile -t packages < <(grep -v '^#' "$OMARCHY_PATH/install/omarchy-base.packages" | grep -v '^$')
|
mapfile -t packages < <(grep -v '^#' "$OMARCHY_PATH/install/omarchy-base.packages" | grep -v '^$')
|
||||||
sudo pacman -Syu --noconfirm --needed "${packages[@]}"
|
sudo pacman -Syu --noconfirm --needed "${packages[@]}"
|
||||||
|
|
||||||
echo "Resetting all Omarchy configs"
|
echo "Resetting all Omarchy configs"
|
||||||
cp -R ~/.local/share/omarchy/config/* ~/.config/
|
cp -R /etc/skel/.config/* ~/.config/
|
||||||
cp ~/.local/share/omarchy/default/bashrc ~/.bashrc
|
|
||||||
echo '[[ -f ~/.bashrc ]] && . ~/.bashrc' | tee ~/.bash_profile >/dev/null
|
|
||||||
|
|
||||||
$(bash $OMARCHY_PATH/install/config/theme.sh)
|
$(bash $OMARCHY_PATH/install/config/theme.sh)
|
||||||
$(bash $OMARCHY_PATH/install/config/git.sh)
|
$(bash $OMARCHY_PATH/install/config/git.sh)
|
||||||
|
|||||||
@@ -1,21 +1,32 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
pkill elephant
|
|
||||||
pkill walker
|
|
||||||
|
|
||||||
# Detect if we're running as root (from pacman hook)
|
# Detect if we're running as root (from pacman hook)
|
||||||
if [[ $EUID -eq 0 ]]; then
|
if [[ $EUID -eq 0 ]]; then
|
||||||
# Get the owner of this script to determine which user to run as
|
# Find all logged-in users running Hyprland
|
||||||
SCRIPT_OWNER=$(stat -c '%U' "$0")
|
for user_runtime in /run/user/*/; do
|
||||||
USER_UID=$(id -u "$SCRIPT_OWNER")
|
USER_UID=$(basename "$user_runtime")
|
||||||
|
USER_NAME=$(id -un "$USER_UID" 2>/dev/null)
|
||||||
|
|
||||||
# Restart services as the script owner
|
# Skip if we can't resolve the username or if no Hyprland session
|
||||||
systemd-run --uid="$SCRIPT_OWNER" --setenv=XDG_RUNTIME_DIR="/run/user/$USER_UID" \
|
[[ -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 "
|
bash -c "
|
||||||
setsid uwsm-app -- elephant &
|
setsid uwsm-app -- elephant &
|
||||||
setsid uwsm-app -- walker --gapplication-service &
|
setsid uwsm-app -- walker --gapplication-service &
|
||||||
"
|
"
|
||||||
|
done
|
||||||
else
|
else
|
||||||
|
# Running as user directly
|
||||||
|
pkill elephant
|
||||||
|
pkill walker
|
||||||
|
|
||||||
setsid uwsm-app -- elephant &
|
setsid uwsm-app -- elephant &
|
||||||
wait 2
|
wait 2
|
||||||
setsid uwsm-app -- walker --gapplication-service &
|
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
|
clear
|
||||||
echo -e "\033[32m"
|
echo -e "\033[32m"
|
||||||
cat <~/.local/share/omarchy/logo.txt
|
cat < /usr/share/omarchy/logo.txt
|
||||||
echo -e "\033[0m"
|
echo -e "\033[0m"
|
||||||
echo
|
echo
|
||||||
|
|||||||
19
boot.sh
19
boot.sh
@@ -19,21 +19,4 @@ echo -e "\n$ansi_art\n"
|
|||||||
|
|
||||||
sudo pacman -Syu --noconfirm --needed git
|
sudo pacman -Syu --noconfirm --needed git
|
||||||
|
|
||||||
# Use custom repo if specified, otherwise default to basecamp/omarchy
|
# FIXME: Update behavior or remove
|
||||||
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
|
|
||||||
|
|||||||
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=wayland
|
||||||
--ozone-platform-hint=wayland
|
--ozone-platform-hint=wayland
|
||||||
--enable-features=TouchpadOverscrollHistoryNavigation
|
--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
|
# Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957
|
||||||
--disable-features=WaylandWpColorManagerV1
|
--disable-features=WaylandWpColorManagerV1
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
# Learn how to configure Hyprland: https://wiki.hyprland.org/Configuring/
|
# Learn how to configure Hyprland: https://wiki.hyprland.org/Configuring/
|
||||||
|
|
||||||
# Use defaults Omarchy defaults (but don't edit these directly!)
|
# Use defaults Omarchy defaults (but don't edit these directly!)
|
||||||
source = ~/.local/share/omarchy/default/hypr/autostart.conf
|
source = /usr/share/omarchy/default/hypr/autostart.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/bindings/media.conf
|
source = /usr/share/omarchy/default/hypr/bindings/media.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/bindings/clipboard.conf
|
source = /usr/share/omarchy/default/hypr/bindings/clipboard.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/bindings/tiling-v2.conf
|
source = /usr/share/omarchy/default/hypr/bindings/tiling-v2.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/bindings/utilities.conf
|
source = /usr/share/omarchy/default/hypr/bindings/utilities.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/envs.conf
|
source = /usr/share/omarchy/default/hypr/envs.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/looknfeel.conf
|
source = /usr/share/omarchy/default/hypr/looknfeel.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/input.conf
|
source = /usr/share/omarchy/default/hypr/input.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/windows.conf
|
source = /usr/share/omarchy/default/hypr/windows.conf
|
||||||
source = ~/.config/omarchy/current/theme/hyprland.conf
|
source = ~/.config/omarchy/current/theme/hyprland.conf
|
||||||
|
|
||||||
# Change your own setup in these files (and overwrite any settings from defaults!)
|
# 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.
|
# Changes require a restart to take effect.
|
||||||
|
|
||||||
# Ensure Omarchy bins are in the path
|
# Set default OMARCHY_PATH
|
||||||
export OMARCHY_PATH=$HOME/.local/share/omarchy
|
export OMARCHY_PATH=/usr/share/omarchy
|
||||||
export PATH=$OMARCHY_PATH/bin:$PATH
|
|
||||||
|
|
||||||
# Set default terminal and editor
|
# Set default terminal and editor
|
||||||
source ~/.config/uwsm/default
|
source ~/.config/uwsm/default
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
force_keyboard_focus = true # forces keyboard forcus to stay in Walker
|
force_keyboard_focus = true # forces keyboard forcus to stay in Walker
|
||||||
selection_wrap = true # wrap list if at bottom or top
|
selection_wrap = true # wrap list if at bottom or top
|
||||||
theme = "omarchy-default" # theme to use
|
theme = "omarchy-default" # theme to use
|
||||||
additional_theme_location = "~/.local/share/omarchy/default/walker/themes/"
|
|
||||||
|
|
||||||
[placeholders]
|
[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"
|
"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 /usr/share/omarchy/default/bash/shell
|
||||||
source ~/.local/share/omarchy/default/bash/aliases
|
source /usr/share/omarchy/default/bash/aliases
|
||||||
source ~/.local/share/omarchy/default/bash/functions
|
source /usr/share/omarchy/default/bash/functions
|
||||||
source ~/.local/share/omarchy/default/bash/prompt
|
source /usr/share/omarchy/default/bash/prompt
|
||||||
source ~/.local/share/omarchy/default/bash/init
|
source /usr/share/omarchy/default/bash/init
|
||||||
source ~/.local/share/omarchy/default/bash/envs
|
source /usr/share/omarchy/default/bash/envs
|
||||||
[[ $- == *i* ]] && bind -f ~/.local/share/omarchy/default/bash/inputrc
|
[[ $- == *i* ]] && bind -f /usr/share/omarchy/default/bash/inputrc
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
# All the default Omarchy aliases and functions
|
# All the default Omarchy aliases and functions
|
||||||
# (don't mess with these directly, just overwrite them here!)
|
# (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.
|
# Add your own exports, aliases, and functions here.
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
# App-specific tweaks
|
# App-specific tweaks
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/1password.conf
|
source = /usr/share/omarchy/default/hypr/apps/1password.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/bitwarden.conf
|
source = /usr/share/omarchy/default/hypr/apps/bitwarden.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/browser.conf
|
source = /usr/share/omarchy/default/hypr/apps/browser.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/hyprshot.conf
|
source = /usr/share/omarchy/default/hypr/apps/hyprshot.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/jetbrains.conf
|
source = /usr/share/omarchy/default/hypr/apps/jetbrains.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/localsend.conf
|
source = /usr/share/omarchy/default/hypr/apps/localsend.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/pip.conf
|
source = /usr/share/omarchy/default/hypr/apps/pip.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/qemu.conf
|
source = /usr/share/omarchy/default/hypr/apps/qemu.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/retroarch.conf
|
source = /usr/share/omarchy/default/hypr/apps/retroarch.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/steam.conf
|
source = /usr/share/omarchy/default/hypr/apps/steam.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/system.conf
|
source = /usr/share/omarchy/default/hypr/apps/system.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/terminals.conf
|
source = /usr/share/omarchy/default/hypr/apps/terminals.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/walker.conf
|
source = /usr/share/omarchy/default/hypr/apps/walker.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/apps/webcam-overlay.conf
|
source = /usr/share/omarchy/default/hypr/apps/webcam-overlay.conf
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Picture-in-picture overlays
|
# 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 = float, tag:pip
|
||||||
windowrule = pin, tag:pip
|
windowrule = pin, tag:pip
|
||||||
windowrule = size 600 338, 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 -- hypridle
|
||||||
exec-once = uwsm-app -- mako
|
exec-once = uwsm-app -- mako
|
||||||
exec-once = uwsm-app -- waybar
|
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, O, Obsidian, exec, obsidian -disable-gpu
|
||||||
bindd = SUPER, SLASH, Password manager, exec, $passwordManager
|
bindd = SUPER, SLASH, Password manager, exec, $passwordManager
|
||||||
|
|
||||||
source = ~/.local/share/omarchy/default/hypr/bindings/media.conf
|
source = /usr/share/omarchy/default/hypr/bindings/media.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/bindings/tiling.conf
|
source = /usr/share/omarchy/default/hypr/bindings/tiling.conf
|
||||||
source = ~/.local/share/omarchy/default/hypr/bindings/utilities.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
|
windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
|
||||||
|
|
||||||
# App-specific tweaks
|
# 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;
|
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
|
set -eEo pipefail
|
||||||
|
|
||||||
# Define Omarchy locations
|
# 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="$OMARCHY_PATH/install"
|
||||||
export OMARCHY_INSTALL_LOG_FILE="/var/log/omarchy-install.log"
|
|
||||||
export PATH="$OMARCHY_PATH/bin:$PATH"
|
|
||||||
|
|
||||||
# Install
|
# Load helpers
|
||||||
source "$OMARCHY_INSTALL/helpers/all.sh"
|
source "$OMARCHY_INSTALL/helpers/chroot.sh"
|
||||||
source "$OMARCHY_INSTALL/preflight/all.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/packaging/all.sh"
|
||||||
source "$OMARCHY_INSTALL/config/all.sh"
|
source "$OMARCHY_INSTALL/config/all.sh"
|
||||||
source "$OMARCHY_INSTALL/login/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/theme.sh
|
||||||
run_logged $OMARCHY_INSTALL/config/branding.sh
|
|
||||||
run_logged $OMARCHY_INSTALL/config/git.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/detect-keyboard-layout.sh
|
||||||
run_logged $OMARCHY_INSTALL/config/xcompose.sh
|
run_logged $OMARCHY_INSTALL/config/xcompose.sh
|
||||||
run_logged $OMARCHY_INSTALL/config/mise-work.sh
|
run_logged $OMARCHY_INSTALL/config/mise-work.sh
|
||||||
run_logged $OMARCHY_INSTALL/config/fix-powerprofilesctl-shebang.sh
|
run_logged $OMARCHY_INSTALL/config/fix-powerprofilesctl-shebang.sh
|
||||||
run_logged $OMARCHY_INSTALL/config/docker.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/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/set-wireless-regdom.sh
|
||||||
run_logged $OMARCHY_INSTALL/config/hardware/fix-fkeys.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/nvidia.sh
|
||||||
run_logged $OMARCHY_INSTALL/config/hardware/fix-f13-amd-audio-input.sh
|
run_logged $OMARCHY_INSTALL/config/hardware/fix-f13-amd-audio-input.sh
|
||||||
run_logged $OMARCHY_INSTALL/config/hardware/fix-bcm43xx.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-suspend-nvme.sh
|
||||||
run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-t2.sh
|
run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-t2.sh
|
||||||
run_logged $OMARCHY_INSTALL/config/hardware/fix-surface-keyboard.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:
|
# Add user to docker group
|
||||||
# - 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
|
|
||||||
sudo usermod -aG docker ${USER}
|
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 --kill dirmngr || true
|
||||||
sudo gpgconf --launch 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
|
# Setup theme links
|
||||||
mkdir -p ~/.config/omarchy/themes
|
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
|
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
|
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
|
# 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
|
mkdir -p ~/.config/mako
|
||||||
ln -snf ~/.config/omarchy/current/theme/mako.ini ~/.config/mako/config
|
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
|
# Add managed policy directories for Chromium and Brave for theme changes
|
||||||
sudo mkdir -p /etc/chromium/policies/managed
|
sudo mkdir -p /etc/chromium/policies/managed
|
||||||
sudo chmod a+rw /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/presentation.sh
|
||||||
source $OMARCHY_INSTALL/helpers/errors.sh
|
|
||||||
source $OMARCHY_INSTALL/helpers/logging.sh
|
source $OMARCHY_INSTALL/helpers/logging.sh
|
||||||
|
source $OMARCHY_INSTALL/helpers/errors.sh
|
||||||
|
|||||||
@@ -122,6 +122,7 @@ catch_errors() {
|
|||||||
|
|
||||||
case "$choice" in
|
case "$choice" in
|
||||||
"Retry installation")
|
"Retry installation")
|
||||||
|
# FIXME: Update based on final setup
|
||||||
bash ~/.local/share/omarchy/install.sh
|
bash ~/.local/share/omarchy/install.sh
|
||||||
break
|
break
|
||||||
;;
|
;;
|
||||||
@@ -133,7 +134,7 @@ catch_errors() {
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
"Upload log for support")
|
"Upload log for support")
|
||||||
omarchy-upload-install-log
|
omarchy-upload-log
|
||||||
;;
|
;;
|
||||||
"Exit" | "")
|
"Exit" | "")
|
||||||
exit 1
|
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() {
|
start_log_output() {
|
||||||
local ANSI_SAVE_CURSOR="\033[s"
|
local ANSI_SAVE_CURSOR="\033[s"
|
||||||
local ANSI_RESTORE_CURSOR="\033[u"
|
local ANSI_RESTORE_CURSOR="\033[u"
|
||||||
@@ -6,6 +10,9 @@ start_log_output() {
|
|||||||
local ANSI_RESET="\033[0m"
|
local ANSI_RESET="\033[0m"
|
||||||
local ANSI_GRAY="\033[90m"
|
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
|
# Save cursor position and hide cursor
|
||||||
printf $ANSI_SAVE_CURSOR
|
printf $ANSI_SAVE_CURSOR
|
||||||
printf $ANSI_HIDE_CURSOR
|
printf $ANSI_HIDE_CURSOR
|
||||||
@@ -14,121 +21,67 @@ start_log_output() {
|
|||||||
local log_lines=20
|
local log_lines=20
|
||||||
local max_line_width=$((LOGO_WIDTH - 4))
|
local max_line_width=$((LOGO_WIDTH - 4))
|
||||||
|
|
||||||
while true; do
|
# Use tail -F to follow multiple files, even if they don't exist yet
|
||||||
# Read the last N lines into an array
|
# -F = --follow=name --retry (follows by name, waits for files to appear)
|
||||||
mapfile -t current_lines < <(tail -n $log_lines "$OMARCHY_INSTALL_LOG_FILE" 2>/dev/null)
|
# -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
|
# Build complete output buffer with escape sequences
|
||||||
output=""
|
output=""
|
||||||
for ((i = 0; i < log_lines; i++)); do
|
for ((i = 0; i < log_lines; i++)); do
|
||||||
line="${current_lines[i]:-}"
|
current_line="${current_lines[i]:-}"
|
||||||
|
|
||||||
# Truncate if needed
|
# Truncate if needed
|
||||||
if [ ${#line} -gt $max_line_width ]; then
|
if [ ${#current_line} -gt $max_line_width ]; then
|
||||||
line="${line:0:$max_line_width}..."
|
current_line="${current_line:0:$max_line_width}..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Add clear line escape and formatted output for each line
|
# Add clear line escape and formatted output for each line
|
||||||
if [ -n "$line" ]; then
|
if [ -n "$current_line" ]; then
|
||||||
output+="${ANSI_CLEAR_LINE}${ANSI_GRAY}${PADDING_LEFT_SPACES} → ${line}${ANSI_RESET}\n"
|
output+="${ANSI_CLEAR_LINE}${ANSI_GRAY}${PADDING_LEFT_SPACES} → ${current_line}${ANSI_RESET}\n"
|
||||||
else
|
else
|
||||||
output+="${ANSI_CLEAR_LINE}${PADDING_LEFT_SPACES}\n"
|
output+="${ANSI_CLEAR_LINE}${PADDING_LEFT_SPACES}\n"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
printf "${ANSI_RESTORE_CURSOR}%b" "$output"
|
printf "${ANSI_RESTORE_CURSOR}%b" "$output"
|
||||||
|
|
||||||
sleep 0.1
|
|
||||||
done
|
done
|
||||||
) &
|
) &
|
||||||
monitor_pid=$!
|
monitor_pid=$!
|
||||||
}
|
}
|
||||||
|
|
||||||
stop_log_output() {
|
stop_log_output() {
|
||||||
|
local ANSI_SHOW_CURSOR="\033[?25h"
|
||||||
|
|
||||||
if [ -n "${monitor_pid:-}" ]; then
|
if [ -n "${monitor_pid:-}" ]; then
|
||||||
kill $monitor_pid 2>/dev/null || true
|
# Disown the process to prevent "Killed" message
|
||||||
wait $monitor_pid 2>/dev/null || true
|
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
|
unset monitor_pid
|
||||||
fi
|
fi
|
||||||
}
|
|
||||||
|
# Restore cursor visibility
|
||||||
start_install_log() {
|
printf $ANSI_SHOW_CURSOR
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
run_logged $OMARCHY_INSTALL/login/plymouth.sh
|
|
||||||
run_logged $OMARCHY_INSTALL/login/default-keyring.sh
|
run_logged $OMARCHY_INSTALL/login/default-keyring.sh
|
||||||
run_logged $OMARCHY_INSTALL/login/sddm.sh
|
run_logged $OMARCHY_INSTALL/login/sddm.sh
|
||||||
run_logged $OMARCHY_INSTALL/login/limine-snapper.sh
|
run_logged $OMARCHY_INSTALL/login/limine-snapper.sh
|
||||||
|
|||||||
@@ -78,6 +78,11 @@ term_background_bright: 24283b
|
|||||||
|
|
||||||
EOF
|
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
|
# Match Snapper configs if not installing from the ISO
|
||||||
if [[ -z ${OMARCHY_CHROOT_INSTALL:-} ]]; then
|
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-beta
|
||||||
1password-cli
|
1password-cli
|
||||||
aether
|
aether
|
||||||
alacritty
|
|
||||||
asdcontrol
|
asdcontrol
|
||||||
avahi
|
avahi
|
||||||
bash-completion
|
bash-completion
|
||||||
@@ -12,7 +11,7 @@ bat
|
|||||||
blueberry
|
blueberry
|
||||||
brightnessctl
|
brightnessctl
|
||||||
btop
|
btop
|
||||||
cargo
|
rust
|
||||||
clang
|
clang
|
||||||
cups
|
cups
|
||||||
cups-browsed
|
cups-browsed
|
||||||
@@ -33,6 +32,7 @@ fd
|
|||||||
ffmpegthumbnailer
|
ffmpegthumbnailer
|
||||||
fontconfig
|
fontconfig
|
||||||
fzf
|
fzf
|
||||||
|
ghostty
|
||||||
github-cli
|
github-cli
|
||||||
gnome-calculator
|
gnome-calculator
|
||||||
gnome-keyring
|
gnome-keyring
|
||||||
@@ -45,7 +45,7 @@ gvfs-nfs
|
|||||||
gvfs-smb
|
gvfs-smb
|
||||||
hypridle
|
hypridle
|
||||||
hyprland
|
hyprland
|
||||||
hyprland-qtutils
|
hyprland-guiutils
|
||||||
hyprlock
|
hyprlock
|
||||||
hyprpicker
|
hyprpicker
|
||||||
hyprsunset
|
hyprsunset
|
||||||
@@ -64,12 +64,12 @@ less
|
|||||||
libsecret
|
libsecret
|
||||||
libyaml
|
libyaml
|
||||||
libqalculate
|
libqalculate
|
||||||
libreoffice
|
libreoffice-fresh
|
||||||
llvm
|
llvm
|
||||||
localsend
|
localsend
|
||||||
luarocks
|
luarocks
|
||||||
mako
|
mako
|
||||||
man
|
man-db
|
||||||
mariadb-libs
|
mariadb-libs
|
||||||
mise
|
mise
|
||||||
mpv
|
mpv
|
||||||
@@ -83,6 +83,7 @@ nss-mdns
|
|||||||
nvim
|
nvim
|
||||||
obs-studio
|
obs-studio
|
||||||
obsidian
|
obsidian
|
||||||
|
omarchy
|
||||||
omarchy-chromium
|
omarchy-chromium
|
||||||
omarchy-nvim
|
omarchy-nvim
|
||||||
omarchy-walker
|
omarchy-walker
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ pipewire
|
|||||||
pipewire-alsa
|
pipewire-alsa
|
||||||
pipewire-jack
|
pipewire-jack
|
||||||
pipewire-pulse
|
pipewire-pulse
|
||||||
qt5-remoteobjects
|
# qt5-remoteobjects # REMOVED: Package no longer exists in repos
|
||||||
qt6-wayland
|
qt6-wayland
|
||||||
sassc
|
sassc
|
||||||
snapper
|
snapper
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
run_logged $OMARCHY_INSTALL/packaging/base.sh
|
# 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/fonts.sh
|
||||||
run_logged $OMARCHY_INSTALL/packaging/nvim.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/webapps.sh
|
||||||
run_logged $OMARCHY_INSTALL/packaging/tuis.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
|
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
|
# Installation completed in chroot
|
||||||
|
echo "[finished] Chroot installation completed successfully"
|
||||||
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
|
|
||||||
|
|
||||||
|
# Clean up installer sudoers
|
||||||
if sudo test -f /etc/sudoers.d/99-omarchy-installer; then
|
if sudo test -f /etc/sudoers.d/99-omarchy-installer; then
|
||||||
sudo rm -f /etc/sudoers.d/99-omarchy-installer &>/dev/null
|
sudo rm -f /etc/sudoers.d/99-omarchy-installer &>/dev/null
|
||||||
fi
|
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
|
# Configure pacman
|
||||||
sudo cp -f ~/.local/share/omarchy/default/pacman/pacman.conf /etc/pacman.conf
|
sudo cp -f /usr/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/mirrorlist /etc/pacman.d/mirrorlist
|
||||||
|
|
||||||
if lspci -nn | grep -q "106b:180[12]"; then
|
if lspci -nn | grep -q "106b:180[12]"; then
|
||||||
cat <<EOF | sudo tee -a /etc/pacman.conf >/dev/null
|
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
|
OMARCHY_MIGRATIONS_STATE_PATH=~/.local/state/omarchy/migrations
|
||||||
mkdir -p $OMARCHY_MIGRATIONS_STATE_PATH
|
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")"
|
touch "$OMARCHY_MIGRATIONS_STATE_PATH/$(basename "$file")"
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ if [[ -n ${OMARCHY_ONLINE_INSTALL:-} ]]; then
|
|||||||
sudo pacman -S --needed --noconfirm base-devel
|
sudo pacman -S --needed --noconfirm base-devel
|
||||||
|
|
||||||
# Configure pacman
|
# Configure pacman
|
||||||
sudo cp -f ~/.local/share/omarchy/default/pacman/pacman.conf /etc/pacman.conf
|
sudo cp -f /usr/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/mirrorlist /etc/pacman.d/mirrorlist
|
||||||
|
|
||||||
sudo pacman-key --recv-keys 40DFB630FF42BCFFB047046CF0134EE680CAC571 --keyserver keys.openpgp.org
|
sudo pacman-key --recv-keys 40DFB630FF42BCFFB047046CF0134EE680CAC571 --keyserver keys.openpgp.org
|
||||||
sudo pacman-key --lsign-key 40DFB630FF42BCFFB047046CF0134EE680CAC571
|
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
|
text-color=#4c4f69
|
||||||
border-color=#1e66f5
|
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
|
text-color=#cad3f5
|
||||||
border-color=#c6d0f5
|
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
|
text-color=#d3c6aa
|
||||||
border-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
|
text-color=#100F0F
|
||||||
border-color=#205EA6
|
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
|
text-color=#d4be98
|
||||||
border-color=#a89984
|
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
|
text-color=#dcd7ba
|
||||||
border-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
|
text-color=#8a8a8d
|
||||||
border-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
|
text-color=#d8dee9
|
||||||
border-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
|
text-color=#C1C497
|
||||||
border-color=#214237
|
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
|
text-color=#e6d9db
|
||||||
border-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
|
text-color=#575279
|
||||||
border-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
|
text-color=#c0caf5
|
||||||
border-color=#33ccff
|
border-color=#33ccff
|
||||||
|
|||||||
Reference in New Issue
Block a user