Compare commits

..

224 commits
main ... dev

Author SHA1 Message Date
ebbd106e0a Enable hsts for nextcloud 2024-12-14 03:53:59 +01:00
660f9561cf Store TrackMania in directory 2024-12-14 03:49:46 +01:00
ae101e2eb2 Fix path of nextcloud service proxy 2024-12-14 03:45:41 +01:00
a0874d9f37 Add jellyseerr by default 2024-12-13 02:43:32 +01:00
7df90179c9 Improve Nextcloud nginx config 2024-12-13 01:51:47 +01:00
99fa900c1a Fix incorrect git ssh script 2024-12-11 04:18:13 +01:00
4161fce8d7 Link gitea to forgejo 2024-12-11 04:18:00 +01:00
896c77559a Set up authentication automatically 2024-12-11 04:17:48 +01:00
ce70e66c70 Make forgejo work under Arch Linux 2024-12-11 03:30:36 +01:00
84818c2bac Refactor jellyfin nginx config 2024-12-11 02:27:49 +01:00
c349a2d5be Name forgejo user properly 2024-12-11 01:30:36 +01:00
56f7f4228b Fix ssh key permission error 2024-12-11 01:17:54 +01:00
cf717d7a50 Inherit profile script title properly 2024-12-11 01:13:02 +01:00
f0fef82fa1 Prevent PowerShell errors 2024-12-11 01:12:52 +01:00
db247315cf Fix malformed yq scripts 2024-12-08 18:04:59 +01:00
93284f2016 Disable auto login after installation 2024-12-08 17:27:03 +01:00
9a911cb93b Reboot system as root 2024-12-08 17:18:59 +01:00
da1870c250 Adjust boot label for server 2024-12-08 16:50:16 +01:00
97e372ae08 Fix permission issues 2024-12-08 06:15:43 +01:00
a8e0f37416 Return exit code properly 2024-12-08 05:48:20 +01:00
c1483d29e1 Fix typo 2024-12-08 05:20:42 +01:00
e435ce8c48 Prevent unnecessary config values 2024-12-08 04:56:41 +01:00
71a301ff0f Remove bash profile during installation script 2024-12-08 04:46:53 +01:00
2e087298a3 Normalize exit code of setup actions 2024-12-08 04:46:13 +01:00
37f3b3980b Fix malformed output 2024-12-08 03:07:54 +01:00
9007570d94 Install systemd-networkd during setup 2024-12-08 02:49:45 +01:00
73734293fd Enable DNS on the server 2024-12-08 02:49:28 +01:00
fad6cbe1d2 Fix incorrect configuration 2024-12-08 01:57:18 +01:00
bcdd7b0d8a Install networkmanager only if necessary 2024-12-08 01:47:04 +01:00
fa295f3b1a Allow configuring networkd 2024-12-08 01:03:06 +01:00
6a5ec8d5de Install NetworkManager only if enabled 2024-12-08 00:05:44 +01:00
19871a2e49 Allow configuriong systemd-networkd 2024-12-07 23:45:31 +01:00
ab8a6f8609 Allow choosing between NetworkManager and systemd-networkd 2024-12-07 23:38:17 +01:00
52fd59c017 Set profiles of btrfs volume 2024-12-07 23:02:03 +01:00
02dd399284 Forcefully write btrfs 2024-12-07 22:40:59 +01:00
7c3297b993 Collect all affected devices 2024-12-07 22:18:10 +01:00
ccbf77ce3f Fix outdated config names 2024-12-07 21:46:53 +01:00
1944356d05 Add support for partitioning btrfs volumes 2024-12-07 21:14:58 +01:00
5e7cfccff6 Add scripts for installing btrfs 2024-12-07 21:14:36 +01:00
a4fe8d78dc Remove trailing slashes properly 2024-12-07 21:09:18 +01:00
605c32e467 Fix incorrect config name 2024-12-07 20:03:58 +01:00
9caedac094 Create mount script in fileSystems module 2024-12-07 19:28:42 +01:00
f1ed876cc1 Add a separate option for mounts 2024-12-07 19:11:41 +01:00
3790fd267e Allow partitions without format 2024-12-07 18:45:44 +01:00
70a02aa8b9 Add btrfs support 2024-12-07 18:41:08 +01:00
0df6d5ece3 Remove unnecessary code 2024-12-07 18:36:54 +01:00
b16e1d420e Rename filesystem directory 2024-12-07 18:36:19 +01:00
5ffe98a56d Remove redundancy 2024-12-07 17:50:10 +01:00
7b5564a632 Store device scripts in scripts option 2024-12-07 17:49:57 +01:00
68e1990c87 Refactor terminology 2024-12-07 17:43:53 +01:00
0ce36394ac Move the script to the fileSystems module 2024-12-07 17:35:31 +01:00
ed4fa1a33d Split up disk script into multiple scripts 2024-12-07 16:12:04 +01:00
7b3b7fcdbc Remove separate os disk declaration 2024-12-07 16:11:19 +01:00
ce13e03ef1 Restructure partition config 2024-12-07 12:24:10 +01:00
77d8c350b7 Remove duplicated code 2024-12-06 16:22:05 +01:00
055955a1bf Pause tmux session on error 2024-12-06 13:52:26 +01:00
569204babe Fix permission issue 2024-12-06 13:51:08 +01:00
f3ff0cb0db Add missing location comment 2024-12-06 13:50:58 +01:00
f8eed79dd6 Disable cloud sync on the server 2024-12-06 13:40:04 +01:00
e527b33d82 Restore permissions in nixpkgs 2024-12-06 00:55:51 +01:00
19e9aecc5b Copy the .git directory to the setup environment 2024-12-05 22:36:14 +01:00
7f60744056 Ensure the nix channel directory exists 2024-12-05 20:31:56 +01:00
f3b6f3be23 Keep .git directory of nixpkgs 2024-12-05 19:40:41 +01:00
1e6bf93191 Install nginx throughout the setup 2024-12-05 18:27:10 +01:00
ad36fe02b3 Update to the most recent nixpkgs-unstable commit 2024-12-05 18:22:54 +01:00
656f21e849 Allow commits as nix versions 2024-12-05 18:19:18 +01:00
d6105a22b8 Fix permission issue 2024-12-05 18:18:57 +01:00
d0f7f6e4f9 Enable grub on the server 2024-12-05 17:08:41 +01:00
1051fe01c1 Ignore exit code of string-split0 2024-12-05 16:34:24 +01:00
6f5d13f07f Prevent unnecessary config fetches 2024-12-05 16:01:41 +01:00
eac4dba453 Update the nixpkgs version 2024-12-05 15:43:54 +01:00
87b032ed70 Add openssh as a dependency 2024-12-05 14:59:28 +01:00
800a6ed542 Install nixpkgs during setup 2024-12-05 14:13:52 +01:00
4ba2c1b1a5 Prompt backup config during install 2024-12-05 10:40:59 +01:00
ee4906cf4d Install valhalla dependencies during setup 2024-12-05 10:33:06 +01:00
8e02826f4b Adjust hook description 2024-12-05 10:25:28 +01:00
20c1f1558f Fetch missing variables 2024-12-05 10:13:35 +01:00
8b2d6a8a6a Add a function for initializing the OS 2024-12-05 10:09:35 +01:00
53c35a5742 Run OS setup first 2024-12-05 09:59:04 +01:00
4f446cc189 Create directories for ssh files 2024-12-05 09:53:31 +01:00
aebc398989 Create ssh key only if necessary 2024-12-05 09:47:32 +01:00
d52ce97c6c Fix missing variable 2024-12-05 09:45:49 +01:00
ff05734cdf Partition drives after action setup 2024-12-05 09:45:08 +01:00
a94a589c77 Create missing script 2024-12-05 09:41:33 +01:00
3758baba8b Remove unnecessary function 2024-12-05 09:41:20 +01:00
406c25b3d3 Get mount dir for preparing nix 2024-12-05 09:38:38 +01:00
45b0ed910c Fix non-existent variable 2024-12-05 09:27:53 +01:00
1c452512ef Create function for bootstrapping dependencies 2024-12-05 09:25:52 +01:00
500ab697f6 Fix incorrect repo path 2024-12-04 19:06:32 +01:00
ca2b623e1a Allow configuring backup during setup 2024-12-04 19:02:05 +01:00
a7b9572165 Make config function name more concise 2024-12-04 18:56:17 +01:00
972de35629 Use pre-existing setup user if existent 2024-12-04 18:35:15 +01:00
562c55b78f Add function for configuring backup server 2024-12-04 18:33:30 +01:00
801e010efb Enable anki-sync on the server 2024-12-04 18:31:35 +01:00
6f68f021a3 Create new ssh key implicitly 2024-12-04 18:26:45 +01:00
c75228380a Add missing docker services 2024-12-04 17:02:54 +01:00
4c23b600f2 Format files 2024-12-04 17:02:11 +01:00
3607765313 Ignore inexistent backup archives 2024-12-04 17:02:01 +01:00
a46ea0cacc Load backup user variable dynamically 2024-12-04 17:00:36 +01:00
5411281d95 Fix collabora service 2024-12-04 16:59:30 +01:00
86576476ba Add default port for terraria 2024-12-04 16:59:01 +01:00
0b2d39ea7c Fix websocket access for wekan 2024-12-04 16:58:51 +01:00
30254ea01c Configure wekan service properly 2024-12-04 16:58:41 +01:00
67ccef8474 Remove custom wekan user 2024-12-04 16:58:18 +01:00
84dc19dd95 Fix overcomplicated location config 2024-12-04 16:57:58 +01:00
2b34819227 Remove unnecessary proxy config 2024-12-04 16:57:40 +01:00
8f09b02fc2 Allow specifying comments for locations 2024-12-04 16:57:25 +01:00
1c93d4b3f4 Allow custom schemes for location settings 2024-12-04 16:55:56 +01:00
9dc93b1b8e Insert comment before location block 2024-12-04 16:54:54 +01:00
e0f4c7e74a Store rtorrent session files in volume 2024-12-04 16:53:24 +01:00
5384b38613 Normalize docker volume paths 2024-12-04 16:52:32 +01:00
0413612bce Update rtorrent and privoxy to proton community cli 2024-12-04 16:50:29 +01:00
f5001a28b7 Remove unnecessary parameter 2024-12-04 16:48:51 +01:00
9634789027 Generate extra server config with full domain 2024-12-04 16:48:35 +01:00
6d221cf07c Update script for new cgroup version 2024-12-04 16:47:11 +01:00
d2522d42a3 Fix typos 2024-12-04 16:46:57 +01:00
ba371f6417 Fix permission issues 2024-12-04 16:44:01 +01:00
7b53d0b506 Enable nix service immediately 2024-12-04 14:41:49 +01:00
351d3070d2 Normalize location of proton data 2024-11-29 02:20:26 +01:00
6abc2240be Format all files 2024-11-29 01:13:58 +01:00
046627eca4 FIx handling users with no docker services 2024-11-28 22:12:44 +01:00
084897f5ee Fix invalid git cli call 2024-11-28 22:12:15 +01:00
86fecfd3e4 Add missing function argument 2024-11-28 22:11:56 +01:00
c533b66c4e Inherit all env variables in the tmux session 2024-11-28 22:11:27 +01:00
8c9c6cd411 Back up teamspeak properly 2024-11-28 20:03:08 +01:00
91fee52e81 Force creation of an ssh key for backups 2024-11-27 05:52:42 +01:00
080cca791f Preserve PATH for setup actions 2024-11-27 05:24:53 +01:00
c9ba881ab2 Add scripts for installing a terraria server 2024-11-27 05:10:42 +01:00
f1f4364c63 Back up extra files using getExtraBackupPatterns 2024-11-27 04:07:14 +01:00
8bcce1c5a1 Remove world mounts for minecraft services 2024-11-27 04:00:20 +01:00
786e422aa6 Simplify xaseco command handling 2024-11-27 03:49:04 +01:00
53d140394a Silence unnecessary output 2024-11-27 03:48:43 +01:00
eb2436c562 Allow specifying xaseco operators and admins 2024-11-27 03:48:31 +01:00
fa98fc8f5b Normalize display name of vaultwarden mailer 2024-11-27 03:48:00 +01:00
a314e502e0 Store all game data of TrackMania service 2024-11-27 03:47:41 +01:00
59f0c8e254 Add declaration of transmission service 2024-11-27 03:47:21 +01:00
f36f26daeb Leave user of wekan container unchanged 2024-11-27 03:47:02 +01:00
c024066139 Store domain names in overrides 2024-11-27 03:41:26 +01:00
9b7f9275c9 Normalize the save path of service data 2024-11-27 03:02:59 +01:00
38d8eeedde Improve the format of the docker files 2024-11-27 02:59:07 +01:00
9a3d7d4f68 Rename secrets files to overrides 2024-11-27 02:54:44 +01:00
df74ac2337 Store Jellyfin domain in secrets 2024-11-26 16:01:38 +01:00
6fabcdc304 Allow specifying overrides for docker services 2024-11-26 15:47:38 +01:00
30c1618318 Allow specifying additional patterns to back up 2024-11-26 15:44:49 +01:00
8101b9e817 Configure forgejo runner by default 2024-11-26 15:42:18 +01:00
6a442f8392 Store all forgejo files in data/ 2024-11-26 15:42:07 +01:00
c5e15c21e4 Set forgejo domain by default 2024-11-26 15:41:51 +01:00
422f36f523 Reduce redundancy of drone setup 2024-11-26 14:54:52 +01:00
b2d6524b0b Fix order of properties in drone templates 2024-11-26 12:43:21 +01:00
d80dbadc7b Load enabled services from machine config 2024-11-25 19:11:14 +01:00
5589b6534b Ensure nix channels are functioning 2024-11-25 15:19:13 +01:00
9ed3aa6fe4 Force running actions as setup-user 2024-11-25 15:19:01 +01:00
a6414a60a2 Skip backup questions if specified 2024-11-23 17:26:12 +01:00
822008f459 Create backup whitelist for docker-compose 2024-11-23 16:57:11 +01:00
84e5a9d7c0 Add a profile for the server 2024-11-22 17:31:18 +01:00
bc914ff88e Add options for enabling docker-compose services 2024-11-22 17:31:08 +01:00
db0b8637ab Add scripts for installing woodpecker 2024-11-22 17:29:45 +01:00
a9f62c3648 Add scripts for installing wekan 2024-11-22 01:54:50 +01:00
d5bc49759b Add scripts for installing TrackMania server 2024-11-20 00:33:09 +01:00
8cd59ae6e9 Replace yq with go-yq 2024-11-20 00:30:08 +01:00
fe99897a2a Add scripts for installing TeamSpeak 2024-11-13 18:18:15 +01:00
5fd56d46fa Add scripts for installing ryot 2024-11-13 17:39:21 +01:00
5c37ec4649 Add scripts for installing nextcloud 2024-11-13 16:25:39 +01:00
941c89e896 Restructure service overrides 2024-11-13 16:22:57 +01:00
e2b08c77db Add scripts for installing Minecraft 2024-11-10 13:00:23 +01:00
83a5e144da Add settings for allowing VPN access in lxc 2024-11-10 12:56:48 +01:00
e6c28188e5 Improve look & feel of lxc config 2024-11-10 12:56:34 +01:00
9507bb1034 Add scripts for installing jellyfin 2024-11-10 12:33:36 +01:00
a538a3d3cf Add a script for installing forgejo 2024-11-07 23:58:06 +01:00
4d26c4b23e Add scripts for installing drone 2024-11-07 18:33:16 +01:00
5e1019c39e Allow configuring services with multiple domains 2024-11-07 11:54:50 +01:00
c763ce67bb Allow specifying domains per service 2024-11-07 03:31:48 +01:00
57e2052529 Fetch FQDN from configuration 2024-11-07 03:01:45 +01:00
b0a46b83c0 Generate nginx config using printf 2024-11-07 02:40:29 +01:00
dc3ecc4f69 Add a function for initializing the service installation 2024-11-07 02:39:37 +01:00
9645efd836 Rename public API 2024-11-06 19:34:27 +01:00
dcf8deaaa6 Add /etc/localtime file in test container 2024-11-06 03:33:01 +01:00
3938859b8a Add a script for installing anki-sync 2024-11-06 03:32:45 +01:00
8853e0fafa Add a script for installing nginx 2024-11-06 01:13:50 +01:00
d2e8a4561e Add a script for testing the Arch installation 2024-11-05 17:47:45 +01:00
5629bad681 Add scripts for installing Arch 2024-11-05 17:47:39 +01:00
75e0f0e419 Add a function for declaring software dependencies 2024-11-05 17:45:13 +01:00
84c05480a6 Ask for config profile in tmux 2024-11-05 17:39:06 +01:00
a949458b40 Uninstall nixpkgs only after install 2024-11-04 01:34:43 +01:00
62335b8c30 Initialize and dispose actions properly 2024-11-04 01:34:22 +01:00
f10df90b88 Inherit CONFIG_NAME properly 2024-11-03 23:41:32 +01:00
5f345337fa Prevent early disposal 2024-11-03 23:41:17 +01:00
2484541827 Download nixpkgs only if necessary 2024-11-03 22:37:33 +01:00
2d4e4c348e Fix permissions issues 2024-11-03 22:37:22 +01:00
a12b65fcc7 Rename hooks 2024-11-03 22:36:30 +01:00
929d2efdb0 Change global git config as root 2024-11-03 22:34:39 +01:00
e6efda0a55 Create a separate config file for desktops 2024-11-03 22:33:44 +01:00
a36f78dff1 Initialize installer properly 2024-11-03 22:32:47 +01:00
3332ed43ee Add a script for setting up vaultwarden 2024-11-03 03:14:47 +01:00
7063e5697d Handle nix cache properly 2024-11-03 00:39:23 +01:00
1cc07f9bda Allow fetching program config with named args 2024-11-02 22:45:22 +01:00
f47a1f56f5 Add scripts for backing up the home 2024-11-02 21:18:00 +01:00
280de3223e Allow preparing backups 2024-11-02 20:56:54 +01:00
a8b96c7219 Add backup capability for aliae 2024-11-02 18:26:33 +01:00
b96f286593 Add support for backing up and restoring software 2024-11-02 18:26:21 +01:00
43c1bdf57a Improve readability of installer actions 2024-11-02 18:25:14 +01:00
e1de6b78c6 Forward installer parameters as named arguments 2024-11-02 18:14:54 +01:00
a2f27209b5 Erase installer functions automatically 2024-11-02 13:55:21 +01:00
027e0f9fd6 Streamline fish installer script 2024-11-02 13:50:51 +01:00
421cd32373 Remove unnecessary argument 2024-11-01 16:49:52 +01:00
c0c34f7a37 Add missing import 2024-11-01 16:40:39 +01:00
f5f51e6a6b Always flag git repo as safe 2024-11-01 16:39:18 +01:00
0e5370f7ca Remove safe config section after any action 2024-11-01 15:45:56 +01:00
029ad68e20 Create a script for initiating actions 2024-11-01 15:32:43 +01:00
b2c85d71c5 Fetch nix location from nix-script 2024-11-01 14:27:32 +01:00
94b22720b6 Create a script for managing nix 2024-11-01 14:13:41 +01:00
1ded9f42bb Rename Config.ps1 to Settings.ps1 2024-11-01 13:15:00 +01:00
c4250cd27d Restructure the script directory 2024-11-01 13:12:16 +01:00
772b7adc0b Store nix version in common config file 2024-11-01 01:40:16 +01:00
1ba4113e56 Rename config script 2024-11-01 00:38:33 +01:00
3291928a11 Reset nix after installation 2024-10-31 22:55:54 +01:00
1047b5ed69 Initialize system during installation 2024-10-31 22:55:33 +01:00
bfcd7be17f Remove necessity of INSTALLER_SCRIPT variable 2024-10-31 21:58:34 +01:00
c364b53d33 Merge branch 'main' into dev 2024-10-31 21:56:14 +01:00
15bfed7f1f Run the entire setup script in tmux 2024-10-31 21:52:01 +01:00
fd5fc86b1b Allow nested tmux sessions 2024-10-31 15:16:51 +01:00
4a783e3725 Increase the waiting time for connecting to the internet 2024-10-31 15:16:41 +01:00
e24ed85fa9 Use named tmux session 2024-10-31 15:16:25 +01:00
a34ee1847b Silence unnecessary console output 2024-10-31 15:06:58 +01:00
270 changed files with 5457 additions and 1287 deletions

View file

@ -5,17 +5,16 @@ fi
~/.automated_script.sh
if bash -c "ls /sys/class/backlight/*/max_brightness" > /dev/null 2>&1
then
cat /sys/class/backlight/*/max_brightness > /sys/class/backlight/*/brightness
if bash -c "ls /sys/class/backlight/*/max_brightness" >/dev/null 2>&1; then
cat /sys/class/backlight/*/max_brightness >/sys/class/backlight/*/brightness
fi
cd "/root/PortValhalla" || exit
git diff -p -R --no-ext-diff --no-color --diff-filter=M \
| grep -E "^(diff|(old|new) mode)" --color=never \
| sed "/^diff/{ x; d; }; x; /./{ p; z; }; x;" \
| git apply
git diff -p -R --no-ext-diff --no-color --diff-filter=M |
grep -E "^(diff|(old|new) mode)" --color=never |
sed "/^diff/{ x; d; }; x; /./{ p; z; }; x;" |
git apply
loadkeys de_CH-latin1
./scripts/Arch/OS/setup.fish

View file

@ -1,31 +1,24 @@
#!/bin/env fish
begin
set -l nixVersion nixos-24.05
set -l dir (status dirname)
source "$dir/../../scripts/lib/config.fish"
source "$dir/../../scripts/lib/nix.fish"
set -l projectName archiso-valhalla
set -l overlayDir (mktemp -d)
set -l upperDir (mktemp -d)
set -l workDir (mktemp -d)
set -l cacheRoot ~/".cache/$projectName"
set -l nixCache "$cacheRoot/nixpkgs/$nixVersion"
set -l root airootfs
set -l rootHome "$overlayDir/$root/root"
set -l profileDir "/mnt/$projectName"
set -l projectDir "$rootHome/PortValhalla"
set -l nixDir "$profileDir/$root/nix/var/nix/profiles/per-user/root/channels/nixpkgs"
set -l nixDir "$profileDir/$root$nixPkgsDir"
mkdir -p "$rootHome"
and fish "$(status dirname)/../../scripts/copy-repo.fish" "$projectDir"
and begin
if [ ! -d "$nixCache" ]
mkdir -p "$nixCache"
and git clone https://github.com/NixOS/nixpkgs.git --depth=1 -b "$nixVersion" "$nixCache"
and rm -rf "$nixCache/.git"
end
end
and fish "$(status dirname)/../../scripts/lib/copy-repo.fish" "$projectDir"
downloadNixPkgs
and sudo mount --mkdir -t overlay overlay -o lowerdir=.:"$overlayDir",upperdir="$upperDir",workdir="$workDir" "$profileDir"
and sudo mount --mkdir --bind "$nixCache" "$nixDir"
and sudo mount --mkdir --bind "$nixPkgsCache" "$nixDir"
and sudo mkarchiso $argv "$profileDir"
sudo umount "$nixDir"
and sudo umount "$profileDir"

View file

@ -16,9 +16,8 @@ begin
and begin
git -C "$projectDir" ls-files
git -C "$projectDir" ls-files --exclude-standard --others
end | \
rsync --files-from=/dev/stdin --exclude={.gitignore,README.md,scripts,LICENSE,valhalla.patch} "$dir/.." "$contextRoot"
end &> /dev/null
end | rsync --files-from=/dev/stdin --exclude={.gitignore,README.md,scripts,LICENSE,valhalla.patch} "$dir/.." "$contextRoot"
end &>/dev/null
and git -C "$contextRoot" diff
end

View file

@ -2,5 +2,5 @@
# Updates the patch to be applicable to Arch's current `releng` template.
begin
set -l dir (status dirname)
"$dir/show-diff.fish" > "$dir/valhalla.patch"
"$dir/show-diff.fish" >"$dir/valhalla.patch"
end

View file

@ -1,23 +1,22 @@
diff --git a/airootfs/root/.zlogin b/airootfs/root/.zlogin
index bf6bc8f..bdbe55c 100644
index bf6bc8f..e71dc26 100644
--- a/airootfs/root/.zlogin
+++ b/airootfs/root/.zlogin
@@ -4,3 +4,18 @@ if grep -Fqa 'accessibility=' /proc/cmdline &> /dev/null; then
@@ -4,3 +4,17 @@ if grep -Fqa 'accessibility=' /proc/cmdline &> /dev/null; then
fi
~/.automated_script.sh
+
+if bash -c "ls /sys/class/backlight/*/max_brightness" > /dev/null 2>&1
+then
+ cat /sys/class/backlight/*/max_brightness > /sys/class/backlight/*/brightness
+if bash -c "ls /sys/class/backlight/*/max_brightness" >/dev/null 2>&1; then
+ cat /sys/class/backlight/*/max_brightness >/sys/class/backlight/*/brightness
+fi
+
+cd "/root/PortValhalla" || exit
+
+git diff -p -R --no-ext-diff --no-color --diff-filter=M \
+ | grep -E "^(diff|(old|new) mode)" --color=never \
+ | sed "/^diff/{ x; d; }; x; /./{ p; z; }; x;" \
+ | git apply
+git diff -p -R --no-ext-diff --no-color --diff-filter=M |
+ grep -E "^(diff|(old|new) mode)" --color=never |
+ sed "/^diff/{ x; d; }; x; /./{ p; z; }; x;" |
+ git apply
+
+loadkeys de_CH-latin1
+./scripts/Arch/OS/setup.fish

View file

@ -45,6 +45,7 @@
valhalla = {
DerGeret = import ./profiles/machines/manuel/DerGeret/Arch/config.nix;
ManuSurface = import ./profiles/machines/manuel/ManuSurface/Arch/config.nix;
server = import ./profiles/machines/manuel/server.nix;
};
};
}

View file

@ -5,8 +5,10 @@ let
overlay = [ ];
};
property = (builtins.getEnv "PROPERTY");
processor = if (builtins.stringLength property > 0) then
processor =
if (builtins.stringLength property > 0) then
(_: lib.attrsets.getAttrFromPath (lib.strings.splitString "." property) _)
else
(_: _);
in _: processor (lib.evalModules { modules = [ _ ]; }).config
in
_: processor (lib.evalModules { modules = [ _ ]; }).config

120
lib/modules/fileSystems.nix Normal file
View file

@ -0,0 +1,120 @@
{ lib, config, ... }:
let
inherit (lib) types mkOption;
cfg = config.valhalla.fileSystems;
mountType = types.submodule (
{ config, name, ... }: {
options = {
device = mkOption {
type = types.nullOr types.str;
description = "The device to mount.";
default = null;
};
mountPoint = mkOption {
type = types.str;
description = "The path to mount the device to.";
default = name;
};
fsType = mkOption {
type = types.nullOr types.str;
description = "The file system type of the mount.";
default = null;
};
options = mkOption {
type = types.listOf types.str;
description = "The options of the mount.";
default = [ ];
};
};
}
);
in
{
imports = [
./fileSystems/btrfs.nix
./fileSystems/disks.nix
];
options = {
valhalla = {
fileSystems = {
rootDir = mkOption {
type = types.str;
description = "The root of the installation directory to mount disks into.";
default = "/mnt";
};
mounts = mkOption {
type = types.attrsOf mountType;
description = "The devices to mount.";
default = { };
};
script = mkOption {
type = types.str;
description = "The script for preparing the system's mounts.";
};
};
};
};
config = {
valhalla = {
fileSystems = {
script =
let
inherit (lib.strings) normalizePath removeSuffix;
devices = (builtins.attrValues cfg.diskSetup.devices);
mountScript = lib.strings.concatLines (
(builtins.concatMap
(
_: [
"partprobe 2> /dev/null || true"
"udevadm trigger"
(builtins.concatStringsSep " " (
[ "sudo" "mount" "--mkdir" ] ++
(lib.optionals (_.fsType == "ntfs") [ "-t" "ntfs3" ]) ++
[
(builtins.concatStringsSep " " (builtins.map (_: "-o ${_}") _.options))
(_.device)
(removeSuffix "/" (normalizePath "/${cfg.rootDir}/${_.mountPoint}"))
]
))
]
)
(builtins.attrValues cfg.mounts))
);
affected = (builtins.map (_: _.deviceVariable) devices) ++
(builtins.concatMap
(_: builtins.map (_: lib.escapeShellArg _) _.devices)
(builtins.attrValues cfg.btrfs.volumes));
in
''
#!/bin/bash
set -o errexit
${cfg.diskSetup.scripts.init}
${lib.strings.concatLines (lib.optionals ((builtins.length devices) > 0) [
''echo "$(tput setaf 3)=== WARNING ====$(tput sgr0)"''
(''echo "Continuing this script will alter the partitions of ''
+ (lib.strings.concatStringsSep ", " (lib.lists.init affected))
+ (if (builtins.length affected) > 1 then " and " else "") + (lib.lists.last affected) + ''"'')
''
if ! fish ${./fileSystems/confirm.fish} "Are you sure you want to continue?" "n"; then
exit 1
fi
''
])}
${cfg.diskSetup.scripts.partition}
${cfg.btrfs.script}
${mountScript}
${cfg.diskSetup.scripts.swap}
'';
};
};
};
}

View file

@ -0,0 +1,108 @@
{ lib, config, ... }:
let
inherit (lib) types mkOption;
cfg = config.valhalla.fileSystems.btrfs;
profileType = types.enum [
"raid0"
"raid1"
"raid1c3"
"raid1c4"
"raid5"
"raid6"
"raid10"
"dup"
"single"
];
volumeType = types.submodule (
{ config, name, ... }: {
options = {
mountPoint = mkOption {
type = types.nullOr types.str;
description = "The path to mount the volume to.";
default = null;
};
devices = mkOption {
type = types.listOf types.str;
description = "The devices of the btrfs volume.";
};
label = mkOption {
type = types.nullOr types.str;
description = "The label of the volume.";
default = name;
};
dataProfile = mkOption {
type = types.nullOr profileType;
description = "The data profile.";
default = null;
};
metadataProfile = mkOption {
type = types.nullOr profileType;
description = "The metadata profile.";
default = null;
};
};
}
);
in
{
options = {
valhalla = {
fileSystems.btrfs = {
volumes = mkOption {
type = types.attrsOf volumeType;
description = "The btrfs volumes of the system.";
default = { };
};
script = mkOption {
type = types.str;
description = "The script for creating the btrfs volumes.";
default = lib.strings.concatLines (
builtins.map
(
_: builtins.concatStringsSep " " (
[ "mkfs.btrfs" "--force" ] ++
(lib.optionals (_.metadataProfile != null) [ "--metadata" "${_.metadataProfile}" ]) ++
(lib.optionals (_.dataProfile != null) [ "--data" "${_.dataProfile}" ]) ++
(lib.optionals (_.label != null) [ "--label" "${_.label}" ]) ++
_.devices
)
)
(builtins.attrValues cfg.volumes)
);
};
};
};
};
config = {
valhalla = {
linux.programs.btrfs = lib.optionalAttrs
(builtins.any
(_: (builtins.length _.devices) > 1)
(builtins.attrValues cfg.volumes))
{
enable = true;
pools = true;
};
fileSystems.mounts = lib.attrsets.concatMapAttrs
(
name: volume:
if (volume.mountPoint != null) then {
${volume.mountPoint} = {
device = builtins.elemAt volume.devices 0;
fsType = "btrfs";
};
} else { }
)
cfg.volumes;
};
};
}

View file

@ -22,7 +22,7 @@ function chooseDisk -a outFile message selectScript
end
end
select "$header" "$outFile" "$message" "No valid disk found!" "$(string collect $disks)" false
select "$header" "$outFile" "$message" "No valid device found!" "$(string collect $disks)" false
and begin
set -l disk (string split -n " " (cat "$outFile"))
echo "/dev/$disk[1]" >$outFile

View file

@ -0,0 +1,375 @@
{ lib, config, ... }:
let
inherit (lib) types mkOption;
fs = import ./fs.nix;
cfg = config.valhalla.fileSystems;
deviceListVarName = "myDevices";
isSwap = partition: builtins.elem partition.type [ fs.swap 19 ];
probeScript = builtins.concatStringsSep "\n" [
"partprobe 2> /dev/null || true"
"udevadm trigger"
];
mkDeviceType = types.submodule (
{ config, name, ... }: {
options = {
id = mkOption {
type = types.str;
description = "The internal identifier of the device.";
internal = true;
};
wipe = mkOption {
type = types.bool;
description = "A value indicating whether the device should be wiped.";
default = !(lib.lists.any (_: _.keepExisting) (builtins.attrValues config.partitions));
};
name = mkOption {
type = types.nullOr types.str;
description = "The name of the device.";
default = name;
};
path = mkOption {
type = types.nullOr types.str;
description = "The path to the device.";
default =
if config.name == null then
null
else
"/dev/${config.name}";
};
deviceScript = mkOption {
type = types.str;
description = "A command for loading the device path into the device variable";
internal = true;
};
deviceVariable = mkOption {
type = types.str;
description = "The name of the variable holding the name of the disk";
internal = true;
};
partitions = mkOption {
type = types.attrsOf (types.nullOr partitionType);
description = "The partitions of the disk.";
default = { };
};
scripts = {
init = mkOption {
type = types.str;
description = "A script for loading the device path into the device variable";
};
partition = mkOption {
type = types.str;
description = "A script for partitioning and formatting the device.";
};
};
};
config =
let
deviceVarName = "${deviceListVarName}[${config.id}]";
deviceVar = "\${${deviceVarName}}";
deviceSelector = ''
result="$(mktemp)"
fish ${./choose-device.fish} "$result" "Please select the \"${name}\" device:" ${./select.fish}
${deviceVarName}="$(cat "$result")"
'';
partitions = lib.lists.sortOn (_: _.index)
(builtins.filter (_: _ != null)
(builtins.attrValues config.partitions));
mkType = type:
lib.strings.escapeShellArg (
if builtins.isInt type then
"${lib.trivial.toHexString type}"
else
type
);
fdiskCommand = arguments: "sudo sfdisk ${arguments}";
fdiskScript = script: args: append:
"echo ${script} | ${
fdiskCommand "${builtins.concatStringsSep " " args} ${
if append then "--append" else ""
} ${deviceVar}"
}";
appendScript = index: script: fdiskScript script [ "-N" (builtins.toString index) ] true;
cleanup = lib.strings.concatLines (builtins.map
(partition: "${fdiskCommand "--delete ${deviceVar} ${toString partition.index}"} || true")
(lib.lists.sortOn
(partition: partition.index * -1)
(builtins.filter (_: !_.keepExisting) partitions)));
fdiskCommands = lib.strings.concatLines
(lib.optionals config.wipe [
cleanup
(fdiskScript "label: gpt" [ ] false)
] ++ (builtins.concatMap
(
partition:
let
inherit (partition) format index keepExisting label sizeScript type;
partVarName = "myPartition";
partVar = "\${${partVarName}}";
sizeOption = ''
${sizeScript} | sed -e "s/.*[^[:space:]]/size=\0/"
'';
formatScripts = {
${fs.ext4} = "mkfs.ext4 -F ${partVar}";
${fs.btrfs} = "mkfs.btrfs --force ${partVar}";
${fs.swap} = "mkswap ${partVar}";
${fs.ntfs} = "mkfs.ntfs -F ${partVar}";
${fs.fat32} = "mkfs.fat -F 32 ${partVar}";
};
labelScripts = {
${fs.ext4} = label: "e2label ${partVar} ${label}";
${fs.btrfs} = label: "btrfs filesystem label ${partVar} ${label}";
${fs.swap} = label: "swaplabel ${partVar} --label ${label}";
${fs.ntfs} = label: "ntfslabel ${partVar} ${label}";
${fs.fat32} = label: "fatlabel ${partVar} ${label}";
};
create = lib.strings.concatLines ([
(appendScript index ''${toString index}: "$(${sizeOption})" type=${mkType type}'')
probeScript
] ++ (lib.optionals (format != null) [
"sudo ${formatScripts.${format}}"
]));
fallback = ''
if ! { ls "${partVar}" 2>&1; } > /dev/null
then
${create}
fi
'';
in
[
''local diskPath="$(find -L /dev/disk/by-diskseq -samefile ${deviceVar})"''
''local ${partVarName}="$diskPath-part${toString index}"''
(if keepExisting then fallback else create)
] ++ (lib.optionals (format != null) [
"sudo ${labelScripts.${format} label}"
])
)
partitions));
fixType = lib.strings.concatLines (builtins.concatMap
(
partition:
lib.optional
(partition.keepExisting && !(builtins.isNull partition.type))
''sudo sfdisk --part-type ${deviceVar} ${toString partition.index} ${mkType partition.type}''
)
partitions);
in
{
id = "disk-${name}";
deviceVariable = deviceVar;
scripts = {
init =
if config.path == null then ''
${deviceSelector}
'' else ''
${deviceVarName}=${config.path}
if [ ! -b ${deviceVar} ]; then
function fallback() {
echo "Couldn't find the specified disk \"${deviceVar}\"."
if fish ${./confirm.fish} "Do you want to choose a different \"${name}\" disk?"; then
${deviceSelector}
else
exit 1
fi
}
fallback
fi
'';
partition = lib.mkDefault ''
function partition() {
${if (!config.wipe) then cleanup else ""}
${probeScript}
${fdiskCommands}
${fixType}
}
partition
'';
};
};
}
);
partitionType = types.submodule (
{ name, config, ... }: {
options = {
index = mkOption {
type = types.int;
description = "The index of the partition.";
};
label = mkOption {
type = types.str;
description = "The label of the partition.";
default = name;
};
keepExisting = mkOption {
type = types.bool;
description = "A value indicating whether the partition should be left untouched if it already exists.";
default = false;
};
type = mkOption {
type = types.nullOr (types.either types.str types.int);
description = "The type of the partition.";
default = null;
};
format = mkOption {
type = types.nullOr (types.enum (builtins.attrValues fs));
description = "The file system format of the partition.";
default =
if (isSwap config) then
fs.swap
else
null;
};
size = mkOption {
type = types.nullOr types.str;
description = "The size of the partition.";
default = null;
};
sizeScript = mkOption {
type = types.str;
description = "A script for printing the size to the console.";
internal = true;
};
useSwap = mkOption {
type = types.bool;
description = "A value indicating whether this partition should be used as swap.";
default = isSwap config;
};
mountPoint = mkOption {
type = types.nullOr types.str;
description = "The mountpoint of the partition.";
default = null;
};
mountOptions = mkOption {
type = types.listOf types.str;
description = "The options to apply to the mount.";
default = [ ];
};
};
config = {
sizeScript = (if isSwap config then
''echo "$(cat /proc/meminfo | awk -F " " '/^MemTotal/ { print $2 }' | awk '{ print int((($1 / 1024 / 1024) * 0.75) + 0.5)}')"G''
else
"echo ${lib.strings.escapeShellArg (toString config.size)}");
};
}
);
in
{
options = {
valhalla = {
fileSystems = {
diskSetup = {
devices = mkOption {
type = types.attrsOf (mkDeviceType);
description = "The disk devices to format.";
default = { };
};
scripts = {
init = mkOption {
type = types.str;
description = "The script for initializing the disk partitioning script.";
};
partition = mkOption {
type = types.str;
description = "The script for partitioning the disks.";
};
swap = mkOption {
type = types.str;
description = "The script for enabling swap devices.";
};
};
};
};
};
};
config = {
valhalla = {
fileSystems = {
mounts = (lib.attrsets.concatMapAttrs
(
name: device:
lib.attrsets.concatMapAttrs
(
name: partition:
if partition.mountPoint != null then {
${partition.mountPoint} = {
device = "/dev/disk/by-label/${partition.label}";
fsType = partition.format;
options = partition.mountOptions;
};
} else { }
)
device.partitions
)
cfg.diskSetup.devices);
diskSetup = {
scripts =
let
partPath = part: "/dev/disk/by-label/${part.label}";
disks = ((builtins.attrValues cfg.diskSetup.devices));
partitions = (builtins.concatMap (_: (builtins.attrValues _.partitions)) disks);
in
{
init = lib.strings.concatLines (builtins.map (_: _.scripts.init) disks);
partition = lib.strings.concatLines (builtins.map (_: _.scripts.partition) disks);
swap = lib.strings.concatLines (
(builtins.map
(
_: ''
${probeScript}
sudo swapon ${partPath _}
''
)
(builtins.filter (_: _.useSwap) partitions))
);
};
};
};
};
};
}

View file

@ -1,5 +1,6 @@
{
ext4 = "ext4";
btrfs = "btrfs";
swap = "swap";
ntfs = "ntfs";
fat32 = "fat32";

View file

@ -3,7 +3,8 @@ let
inherit (lib) mkOption types;
optionalAttrs = lib.attrsets.optionalAttrs;
hw = config.valhalla.hardware;
in {
in
{
options = {
valhalla = {
hardware = {

View file

@ -4,7 +4,8 @@ in {
options = {
valhalla = mkOption {
type = types.submodule (
{ extendModules, ... }: let
{ extendModules, ... }:
let
osVariant = extendModules {
modules = [
({ config, ... }: {
@ -35,7 +36,8 @@ in {
};
windowsVariant = osVariant.extendModules { };
in {
in
{
options = {
linux = mkOption {
inherit (linuxVariant) type;
@ -51,7 +53,8 @@ in {
visible = "shallow";
};
};
});
}
);
description = "Configuration for PortValhalla.";
default = { };

View file

@ -1,5 +0,0 @@
{ ... }: {
imports = [
./partition/disks.nix
];
}

View file

@ -1,360 +0,0 @@
{ lib, config, ... }:
let
inherit (lib) types mkOption;
fs = import ./fs.nix;
diskListVarName = "myDisks";
isSwap = partition: builtins.elem partition.type [ fs.swap 19 ];
probeScript = builtins.concatStringsSep "\n" [
"partprobe 2> /dev/null || true"
"udevadm trigger"
];
mkDiskType = osDisk: types.submodule (
{ config, name, ... }: {
options = {
id = mkOption {
type = types.str;
description = "The internal identifier of the disk.";
internal = true;
};
wipe = mkOption {
type = types.bool;
description = "A value indicating whether the disk should be wiped.";
default = !(lib.lists.any (_: _.keepExisting) (builtins.attrValues config.partitions));
};
deviceName = mkOption {
type = types.nullOr types.str;
description = "The name of the device.";
default = if osDisk then null else name;
};
devicePath = mkOption {
type = if osDisk then
types.nullOr types.str
else
types.str;
description = "The path to the device.";
default = if osDisk && config.deviceName == null then
null
else
"/dev/${config.deviceName}";
};
deviceScript = mkOption {
type = types.str;
description = "A command for loading the device path into the device variable";
internal = true;
};
deviceVariable = mkOption {
type = types.str;
description = "The name of the variable holding the name of the disk";
internal = true;
};
partitions = mkOption {
type = types.attrsOf (types.nullOr partitionType);
description = "The partitions of the disk.";
default = { };
};
script = mkOption {
type = types.str;
description = "The script for formatting the disk.";
};
};
config = let
diskVarName = "${diskListVarName}[${config.id}]";
diskVar = "\${${diskVarName}}";
diskSelector = ''
result="$(mktemp)"
fish ${./choose-disk.fish} "$result" "Which disk do you wish to install the OS on?" ${./select.fish}
${diskVarName}="$(cat "$result")"
'';
partitions = lib.lists.sortOn (_: _.index)
(builtins.filter (_: _ != null)
(builtins.attrValues config.partitions));
mkType = type:
lib.strings.escapeShellArg (
if builtins.isInt type then
"${lib.trivial.toHexString type}"
else
type);
fdiskCommand = arguments: "sudo sfdisk ${arguments}";
fdiskScript = script: args: append:
"echo ${script} | ${
fdiskCommand "${builtins.concatStringsSep " " args} ${
if append then "--append" else ""
} ${diskVar}"
}";
wipeScript = script: fdiskScript script [] false;
appendScript = index: script: fdiskScript script ["-N" (builtins.toString index)] true;
cleanup = lib.strings.concatLines (builtins.map
(partition: "${fdiskCommand "--delete ${diskVar} ${toString partition.index}"} || true")
(lib.lists.sortOn
(partition: partition.index * -1)
(builtins.filter (_: !_.keepExisting) partitions)));
fdiskCommands = lib.strings.concatLines
(lib.optionals config.wipe [
cleanup
(wipeScript "label: gpt")
] ++ (builtins.concatMap (
partition:
let
inherit (partition) format index keepExisting label sizeScript type;
partVarName = "myPartition";
partVar = "\${${partVarName}}";
sizeOption = ''
${sizeScript} | sed -e "s/.*[^[:space:]]/size=\0/"
'';
formatScripts = {
${fs.ext4} = "mkfs.ext4 -F ${partVar}";
${fs.swap} = "mkswap ${partVar}";
${fs.ntfs} = "mkfs.ntfs -F ${partVar}";
${fs.fat32} = "mkfs.fat -F 32 ${partVar}";
};
labelScripts = {
${fs.ext4} = label: "e2label ${partVar} ${label}";
${fs.swap} = label: "swaplabel ${partVar} --label ${label}";
${fs.ntfs} = label: "ntfslabel ${partVar} ${label}";
${fs.fat32} = label: "fatlabel ${partVar} ${label}";
};
create = lib.strings.concatLines [
(appendScript index ''${toString index}: "$(${sizeOption})" type=${mkType type}'')
probeScript
"sudo ${formatScripts.${format}}"
];
fallback = ''
if ! { ls "${partVar}" 2>&1; } > /dev/null
then
${create}
fi
'';
in [
''local diskPath="$(find -L /dev/disk/by-diskseq -samefile ${diskVar})"''
''local ${partVarName}="$diskPath-part${toString index}"''
(if keepExisting then fallback else create)
"sudo ${labelScripts.${format} label}"
]) partitions));
fixType = lib.strings.concatLines (builtins.concatMap (
partition:
lib.optional
(partition.keepExisting && !(builtins.isNull partition.type))
''sudo sfdisk --part-type ${diskVar} ${toString partition.index} ${mkType partition.type}'')
partitions);
in {
id = if osDisk then "os" else "disk-${name}";
deviceVariable = diskVar;
deviceScript = if osDisk && config.devicePath == null then ''
${diskSelector}
'' else ''
${diskVarName}=${config.devicePath}
${if osDisk then ''
if [ ! -b ${diskVar} ]; then
function fallback() {
echo "Couldn't find the specified disk \"${diskVar}\"."
if fish ${./confirm.fish} "Do you want to install the OS on another disk?"; then
${diskSelector}
else
exit 1
fi
}
fallback
fi
'' else
""}
'';
script = lib.mkDefault ''
function partition() {
${if (!config.wipe) then cleanup else ""}
${probeScript}
${fdiskCommands}
${fixType}
}
partition
'';
};
});
partitionType = types.submodule (
{ name, config, ... }: {
options = {
index = mkOption {
type = types.int;
description = "The index of the partition.";
};
label = mkOption {
type = types.str;
description = "The label of the partition.";
default = name;
};
keepExisting = mkOption {
type = types.bool;
description = "A value indicating whether the partition should be left untouched if it already exists.";
default = false;
};
type = mkOption {
type = types.nullOr (types.either types.str types.int);
description = "The type of the partition.";
default = null;
};
format = mkOption {
type = types.enum (builtins.attrValues fs);
description = "The file system format of the partition.";
default = if (isSwap config) then
fs.swap
else
throw ("Partition format not specified.");
};
size = mkOption {
type = types.nullOr types.str;
description = "The size of the partition.";
default = null;
};
sizeScript = mkOption {
type = types.str;
description = "A script for printing the size to the console.";
internal = true;
};
useSwap = mkOption {
type = types.bool;
description = "A value indicating whether this partition should be used as swap.";
default = isSwap config;
};
mountPoint = mkOption {
type = types.nullOr types.str;
description = "The mountpoint of the partition.";
default = null;
};
mountOptions = mkOption {
type = types.listOf types.str;
description = "The options to apply to the mount.";
default = [ ];
};
};
config = {
sizeScript = (if isSwap config then
''echo "$(cat /proc/meminfo | awk -F " " '/^MemTotal/ { print $2 }' | awk '{ print int((($1 / 1024 / 1024) * 0.75) + 0.5)}')"G''
else
"echo ${lib.strings.escapeShellArg (toString config.size)}");
};
});
in {
options = {
valhalla = {
partition = {
rootDir = mkOption {
type = types.str;
description = "The root of the installation directory to mount disks into.";
default = "/mnt";
};
os = mkOption {
type = mkDiskType true;
description = "The partition layout of the OS disk.";
};
disks = mkOption {
type = types.attrsOf (mkDiskType false);
description = "The additional disks to format.";
default = { };
};
script = mkOption {
type = types.str;
description = "The script for partitioning the system's disks.";
};
};
};
};
config = {
valhalla = {
partition = {
script = lib.mkDefault (let
cfg = config.valhalla.partition;
inherit (cfg) os rootDir;
inherit (lib.strings) normalizePath;
partPath = part: "/dev/disk/by-label/${part.label}";
disks = ([ os ] ++ (builtins.attrValues cfg.disks));
partitions = (builtins.concatMap (_: (builtins.attrValues _.partitions)) disks);
mountScript = lib.strings.concatLines (builtins.concatMap (
_: [
probeScript
(builtins.concatStringsSep " " ([
"sudo"
"mount"
"--mkdir"
] ++ (lib.optionals (_.format == "ntfs") [
"-t" "ntfs3"
]) ++ [
(builtins.concatStringsSep " " (builtins.map (_: "-o ${_}") _.mountOptions))
(partPath _)
(normalizePath "/${rootDir}/${_.mountPoint}")
]))
]) (lib.lists.sortOn
(_: normalizePath "/${_.mountPoint}")
(builtins.filter (_: _.mountPoint != null) partitions)));
swapScript = lib.strings.concatLines (builtins.map (
_: ''
${probeScript}
sudo swapon ${partPath _}
'') (builtins.filter (_: _.useSwap) partitions));
in lib.strings.concatLines ([
"#!/bin/bash"
"set -o errexit"
]
++ (builtins.map (_: _.deviceScript) disks)
++ lib.optionals ((builtins.length disks) > 0) [
''echo "$(tput setaf 3)==== WARNING ====$(tput sgr0)"''
(''echo "Continuing this script will alter the partitions of ''
+ (lib.strings.concatStringsSep ", " (builtins.map (_: "${_.deviceVariable}") (lib.lists.init disks)))
+ (if (builtins.length disks) > 1 then " and " else "") + (lib.lists.last disks).deviceVariable + ''"'')
''
if ! fish ${./confirm.fish} "Are you sure you want to continue?" "n"; then
exit 1
fi
''
] ++ (builtins.map (_: _.script) disks) ++ [
mountScript
swapScript
]));
};
};
};
}

View file

@ -5,88 +5,103 @@ let
mkUsersOption = programs: osConfig: mkOption {
type = types.attrsOf (types.submodule (
{ ... }: {
{ config, ... }: {
options = {
inherit programs;
};
config = {
programs = builtins.mapAttrs (
name: config: {
enable = mkDefault config.enable;
}) osConfig.programs;
programs = lib.attrsets.concatMapAttrs
(
name: program:
if (builtins.elem name (builtins.attrNames config.programs)) then {
${name} = {
enable = mkDefault program.enable;
};
}));
} else { }
)
osConfig.programs;
};
}
));
};
mkPrograms = infos: builtins.foldl' (programs: info:
mkPrograms = infos: builtins.foldl'
(programs: info:
programs // {
${builtins.elemAt info 0} = {
enable = mkEnableOption (builtins.elemAt info 1);
};
}) { } infos;
})
{ }
infos;
programs = mkPrograms [
["aliae" "aliae"]
["brave" "Brave Browser"]
["discord" "Discord"]
["docker" "docker"]
["firefox" "Firefox Web Browser"]
["openssh" "OpenSSH"]
["osu!lazer" "osu!lazer"]
["pennywise" "Pennywise"]
["powershell" "PowerShell Core"]
["retroarch" "RetroArch"]
["steam" "Steam"]
["thunderbird" "Thunderbird"]
["vscode" "Visual Studio Code"]
["zoxide" "zoxide"]
[ "aliae" "aliae" ]
[ "brave" "Brave Browser" ]
[ "discord" "Discord" ]
[ "firefox" "Firefox Web Browser" ]
[ "openssh" "OpenSSH" ]
[ "osu!lazer" "osu!lazer" ]
[ "pennywise" "Pennywise" ]
[ "powershell" "PowerShell Core" ]
[ "retroarch" "RetroArch" ]
[ "steam" "Steam" ]
[ "thunderbird" "Thunderbird" ]
[ "vscode" "Visual Studio Code" ]
[ "zoxide" "zoxide" ]
];
linuxPrograms = mkPrograms [
["bash" "Bash"]
["fish" "fish"]
["icedtea" "IcedTea"]
["grub" "GRUB"]
["logo-ls" "logo-ls"]
["lutris" "Lutris"]
["minegrub-theme" "Minegrub Theme"]
["nodejs-n" "n"]
["nuke-usb" "nuke-usb"]
["nvidia-dkms" "Nvidia Drivers"]
["plasma" "Plasma"]
["pyenv" "pyenv"]
["sddm" "SDDM"]
["vim" "Vim"]
["virt-manager" "Virtual Machine Manager"]
["waydroid" "Waydroid"]
["xone" "xone"]
[ "bash" "Bash" ]
[ "fish" "fish" ]
[ "icedtea" "IcedTea" ]
[ "grub" "GRUB" ]
[ "logo-ls" "logo-ls" ]
[ "lutris" "Lutris" ]
[ "minegrub-theme" "Minegrub Theme" ]
[ "networkmanager" "NetworkManager" ]
[ "nginx" "nginx" ]
[ "nodejs-n" "n" ]
[ "nuke-usb" "nuke-usb" ]
[ "nvidia-dkms" "Nvidia Drivers" ]
[ "plasma" "Plasma" ]
[ "pyenv" "pyenv" ]
[ "sddm" "SDDM" ]
[ "vim" "Vim" ]
[ "virt-manager" "Virtual Machine Manager" ]
[ "waydroid" "Waydroid" ]
[ "xone" "xone" ]
];
windowsPrograms = mkPrograms [
["lghub" "Logitech G Hub"]
["maniaplanet" "ManiaPlanet"]
["msedge-redirect" "MSEdgeRedirect"]
["nvs" "Node Version Switcher"]
["osu!" "Osu!"]
["posh-git" "posh-git"]
["putty" "PuTTY"]
["rewasd" "reWASD"]
["terminal-icons" "Terminal Icons"]
["tm-nations-forever" "TrackMania Nations Forever"]
["tm-united-forever" "TrackMania United Forever"]
["tobii-gamehub" "Tobii Game Hub"]
["tobii-ghost" "Tobii Ghost"]
["ubiquiti-unifi-controller" "Ubiquiti UniFi Controller"]
["visualstudio" "Visual Studio"]
["winscp" "WinSCP"]
[ "lghub" "Logitech G Hub" ]
[ "maniaplanet" "ManiaPlanet" ]
[ "msedge-redirect" "MSEdgeRedirect" ]
[ "nvs" "Node Version Switcher" ]
[ "osu!" "Osu!" ]
[ "posh-git" "posh-git" ]
[ "putty" "PuTTY" ]
[ "rewasd" "reWASD" ]
[ "terminal-icons" "Terminal Icons" ]
[ "tm-nations-forever" "TrackMania Nations Forever" ]
[ "tm-united-forever" "TrackMania United Forever" ]
[ "tobii-gamehub" "Tobii Game Hub" ]
[ "tobii-ghost" "Tobii Ghost" ]
[ "ubiquiti-unifi-controller" "Ubiquiti UniFi Controller" ]
[ "visualstudio" "Visual Studio" ]
[ "winscp" "WinSCP" ]
];
in {
in
{
imports = [
./programs/btrfs.nix
./programs/docker.nix
./programs/git.nix
./programs/nextcloud.nix
./programs/oh-my-posh.nix
./programs/rclone.nix
./programs/systemd-networkd.nix
];
options = {

View file

@ -0,0 +1,14 @@
{ lib, ... }:
let
inherit (lib) mkEnableOption;
in
{
options = {
valhalla = {
linux.programs.btrfs = {
enable = mkEnableOption "btrfs tools";
pools = mkEnableOption "btrfs pool support in bootloaders";
};
};
};
}

View file

@ -0,0 +1,47 @@
{ lib, ... }:
let
inherit (lib) mkEnableOption mkOption types;
commonOptions = {
enable = mkEnableOption "docker";
};
in
{
options = {
valhalla = {
programs.docker = commonOptions;
users = mkOption {
type = types.attrsOf (types.submodule (
{ ... }: {
options = {
programs.docker = commonOptions;
};
}
));
};
linux = {
programs = {
docker = {
services = {
anki-sync.enable = mkEnableOption "Anki Sync server";
drone.enable = mkEnableOption "drone server";
forgejo.enable = mkEnableOption "Forgejo server";
jellyfin.enable = mkEnableOption "Jellyfin media server";
minecraft.enable = mkEnableOption "Minecraft server";
nextcloud.enable = mkEnableOption "Nextcloud server";
ryot.enable = mkEnableOption "ryot server";
teamspeak.enable = mkEnableOption "TeamSpeak server";
terraria.enable = mkEnableOption "Terraria server";
trackmania.enable = mkEnableOption "TrackMania server";
vaultwarden.enable = mkEnableOption "Vaultwarden server";
wekan.enable = mkEnableOption "Wekan server";
woodpecker.enable = mkEnableOption "Woodpecker CI server";
};
};
};
};
};
};
}

View file

@ -31,7 +31,8 @@ let
default = { };
};
};
in {
in
{
options = {
valhalla = {
programs.git = gitOption;
@ -42,7 +43,8 @@ in {
options = {
programs.git = gitOption;
};
}));
}
));
};
};
};

View file

@ -31,7 +31,8 @@ let
default = [ ];
};
};
in {
in
{
options = {
valhalla = {
programs.nextcloud = commonOptions;
@ -42,7 +43,8 @@ in {
options = {
programs.nextcloud = commonOptions;
};
}));
}
));
};
windows.users = mkOption {
@ -51,7 +53,8 @@ in {
options = {
programs.nextcloud = userOptions;
};
}));
}
));
};
};
};

View file

@ -16,7 +16,8 @@ let
default = lib.strings.removeSuffix ".omp" (lib.strings.removeSuffix ".json" (builtins.baseNameOf config.source));
};
};
});
}
);
commonOptions = {
enable = mkEnableOption "Oh My Posh";
@ -35,7 +36,8 @@ let
default = [ ];
};
};
in {
in
{
options = {
valhalla = {
programs.oh-my-posh = commonOptions;
@ -46,7 +48,8 @@ in {
options = {
programs.oh-my-posh = userOptions;
};
}));
}
));
};
};
};

View file

@ -16,7 +16,8 @@ let
default = null;
};
};
});
}
);
commonOptions = {
enable = mkEnableOption "rclone";
@ -29,7 +30,8 @@ let
default = { };
};
};
in {
in
{
options = {
valhalla.linux = {
programs.rclone = commonOptions;
@ -40,7 +42,8 @@ in {
options = {
programs.rclone = userOptions;
};
}));
}
));
};
};
};

View file

@ -0,0 +1,26 @@
{ lib, config, ... }:
let
inherit (lib) mkEnableOption mkOption types;
in
{
options = {
valhalla = {
linux.programs.systemd-networkd = {
enable = mkEnableOption "systemd-networkd";
networks = mkOption {
type = types.attrsOf types.attrs;
description = "The networks to configure.";
};
networkFiles = mkOption {
type = types.attrsOf types.str;
description = "The files for configuring the networks.";
default = builtins.mapAttrs
(name: network: lib.generators.toINI { listsAsDuplicateKeys = true; } network)
config.valhalla.linux.programs.systemd-networkd.networks;
};
};
};
};
}

View file

@ -1,6 +1,6 @@
{ lib, ... }:
let inherit (lib) mkOption types;
in {
let inherit (lib) mkOption types;
in {
imports = [
./programs.nix
];
@ -12,13 +12,18 @@
let
optionalAttrs = lib.attrsets.optionalAttrs;
cfg = config;
inherit (cfg.software) coding desktopExperience essential gaming socialMedia;
inherit (cfg.software) coding desktopExperience essential gaming server socialMedia;
mkPrograms = programs: builtins.foldl' (
mkPrograms = programs: builtins.foldl'
(
programs: name: programs // {
${name}.enable = true;
}) {} programs;
in {
}
)
{ }
programs;
in
{
options = {
software = {
essential = mkOption {
@ -109,6 +114,7 @@
"vim"
])) // (optionalAttrs desktopExperience (mkPrograms [
"icedtea"
"networkmanager"
"plasma"
"sddm"
"waydroid"
@ -118,6 +124,8 @@
"pyenv"
])) // (optionalAttrs gaming (mkPrograms [
"lutris"
])) // (optionalAttrs server (mkPrograms [
"nginx"
]));
# Essentials
@ -142,7 +150,8 @@
"tm-united-forever"
]));
};
});
};
};
}
);
};
};
}

View file

@ -25,7 +25,8 @@ let
default = [ ];
};
};
});
}
);
linuxUserType = types.submodule (
{ ... }: {
@ -36,7 +37,8 @@ let
default = null;
};
};
});
}
);
winUserType = types.submodule (
{ ... }: {
@ -47,8 +49,10 @@ let
default = false;
};
};
});
in {
}
);
in
{
options = {
valhalla = {
users = mkOption {

View file

@ -1,11 +1,11 @@
{ lib, ... }:
{ config, lib, ... }:
let inherit (lib) mkOption types;
in {
imports = [
./fileSystems.nix
./hardware.nix
./i18n.nix
./os.nix
./partition.nix
./programs.nix
./software.nix
./users.nix
@ -28,6 +28,12 @@ in {
};
};
fqdn = mkOption {
type = types.str;
description = "The FQDN of the system.";
default = config.valhalla.hostname;
};
hostname = mkOption {
type = types.str;
description = "The hostname of the system.";

View file

@ -2,7 +2,8 @@
let
inherit (lib) mkDefault mkEnableOption mkIf mkOption types;
capitalize = (import ../text.nix { inherit lib; }).capitalize;
in {
in
{
options = {
valhalla = {
windows = {

View file

@ -25,7 +25,7 @@
};
};
partition.os.partitions = {
fileSystems.diskSetup.devices.OS.partitions = {
# Keep Windows' boot partition
Boot.keepExisting = true;

View file

@ -1,12 +1,12 @@
{ lib, config, ... }:
let fs = import ../../../../lib/modules/partition/fs.nix;
let fs = import ../../../../lib/modules/fileSystems/fs.nix;
in {
imports = [ ../defaults.nix ];
config = {
valhalla = {
partition = {
os = {
fileSystems.diskSetup.devices = {
OS = {
partitions = {
Boot = {
index = 1;
@ -37,7 +37,8 @@ in {
keyboardLayout = "ch";
i18n = {
localeSettings = let defaultLocale = "en_US.UTF-8";
localeSettings =
let defaultLocale = "en_US.UTF-8";
in {
LANG = "de_CH.UTF-8";
LANGUAGE = defaultLocale;
@ -58,7 +59,8 @@ in {
linux.programs.grub.enable = true;
programs = {
git = let defaultBranch = "main";
git =
let defaultBranch = "main";
in {
inherit defaultBranch;

View file

@ -1,6 +1,5 @@
{ ... }: {
imports = [
../../users/manuel/config.nix
../../../lib/modules/valhalla.nix
../../users/manuel/desktop.nix
];
}

View file

@ -0,0 +1,127 @@
{ lib, config, ... }:
let fs = import ../../../lib/modules/fileSystems/fs.nix;
in {
imports = [ ../../users/manuel/config.nix ];
config = {
valhalla = {
boot.label = "Arch";
fileSystems = {
diskSetup.devices = {
OS = {
path = "/dev/sda";
partitions = {
Boot = {
index = 1;
type = "uefi";
size = "+1G";
format = fs.fat32;
mountPoint = config.valhalla.boot.efiMountPoint;
};
Swap = {
index = 2;
type = "swap";
};
OS = {
index = 3;
label = lib.mkDefault config.valhalla.boot.label;
type = "linux";
};
};
};
};
btrfs = {
volumes = {
OS = {
mountPoint = "/";
devices = [ "/dev/sda3" "/dev/sdb" ];
metadataProfile = "raid1";
dataProfile = "single";
};
};
};
};
hostname = "nuth.ch";
timeZone = "Europe/Zurich";
keyMap = "de_CH-latin1";
keyboardLayout = "ch";
i18n = {
localeSettings =
let defaultLocale = "en_US.UTF-8";
in {
LANG = "de_CH.UTF-8";
LANGUAGE = defaultLocale;
LC_MESSAGE = defaultLocale;
};
};
software = {
essential = true;
server = true;
};
programs.docker.enable = true;
linux.programs = {
grub.enable = true;
systemd-networkd = {
enable = true;
networks =
let device = "enp0s31f6";
in {
${device} = {
Match = {
Name = device;
};
Network = {
Address = "2a01:4f8:10b:2644::2/64";
Gateway = [
"94.130.48.193"
"fe80::1"
];
DNS = [
"5.9.164.112"
"1.1.1.1"
];
};
Address = {
Address = "94.130.48.251";
Peer = "94.130.48.193/32";
};
};
};
};
docker = {
services = {
anki-sync.enable = true;
drone.enable = true;
forgejo.enable = true;
jellyfin.enable = true;
minecraft.enable = true;
nextcloud.enable = true;
ryot.enable = true;
teamspeak.enable = true;
terraria.enable = true;
trackmania.enable = true;
vaultwarden.enable = true;
wekan.enable = true;
woodpecker.enable = true;
};
};
};
};
};
}

View file

@ -3,14 +3,6 @@
config = {
valhalla = {
programs = {
nextcloud.enable = true;
};
linux.programs = {
rclone.enable = true;
};
users.manuel = {
displayName = "Manuel Thalmann";
mailAddress = "m@nuth.ch";
@ -31,42 +23,6 @@
"wheel"
"nix-users"
];
programs = {
rclone = {
configurations = {
nextcloud = {
dirName = "Nextcloud";
};
proton = {
dirName = "Proton";
cacheDuration = "2w";
};
};
};
};
};
windows.users.manuel = {
programs = {
nextcloud = {
folderSyncs = let
localPath = "C:/tools/RetroArch-Win64";
remotePath = "/Saved Games/RetroArch";
in [
{
remotePath = "${remotePath}/Saves";
localPath = "${localPath}/saves";
virtualFiles = false;
}
{
remotePath = "${remotePath}/System";
localPath = "${localPath}/system";
}
];
};
};
};
};
};

View file

@ -0,0 +1,53 @@
{ ... }: {
imports = [ ./config.nix ];
config = {
valhalla = {
programs = {
nextcloud.enable = true;
};
linux.programs = {
rclone.enable = true;
};
linux.users.manuel.programs = {
rclone = {
configurations = {
nextcloud = {
dirName = "Nextcloud";
};
proton = {
dirName = "Proton";
cacheDuration = "2w";
};
};
};
};
windows.users.manuel = {
programs = {
nextcloud = {
folderSyncs =
let
localPath = "C:/tools/RetroArch-Win64";
remotePath = "/Saved Games/RetroArch";
in
[
{
remotePath = "${remotePath}/Saves";
localPath = "${localPath}/saves";
virtualFiles = false;
}
{
remotePath = "${remotePath}/System";
localPath = "${localPath}/system";
}
];
};
};
};
};
};
}

View file

@ -1,14 +1,14 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW -V dir
yayinst secureboot-grub
end
function configureSW -V dir
source "$dir/../../../Common/Scripts/config.fish"
source "$dir/../../../lib/settings.fish"
set -l label (getOSConfig boot.label)
set -l efiDir (getOSConfig boot.efiMountPoint)
set -l bootNums (efibootmgr | sed "/$label/{ s/^.*Boot\([[:digit:]]\+\)\*.*\$/\1/; p; }; d")
@ -20,11 +20,11 @@ begin
sudo sed -i \
-e "/esp=/{" \
-e "a esp=$(echo "$efiDir" | string escape)" \
-e "d" \
-e d \
-e "}" \
-e "/bootloader_id=/{" \
-e "a bootloader_id=$(echo "$label" | string escape)" \
-e "d" \
-e d \
-e "}" \
/etc/secureboot.conf

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW -V dir
set -l repo linux-surface

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW -V dir
yayinst \
@ -21,6 +21,9 @@ begin
sudo systemctl enable --global surface-dtx-userd.service
end
runInstaller --force $argv
function installSWDependencies
fish "$dir/../Surface/main.fish" $argv
end
runInstaller --force $argv
end

15
scripts/Arch/OS/backup.fish Executable file
View file

@ -0,0 +1,15 @@
#!/bin/env fish
begin
set -l dir (status dirname)
function installValhallaDeps -V dir
source "$dir/../lib/software.fish"
and pacinst fish git jq nix sudo tmux
end
function getDeploymentScript -V dir
echo "$dir/../lib/deploy.fish"
end
source "$dir/../../Common/OS/backup.fish"
end

View file

@ -1,18 +1,18 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../lib/dependencies.fish"
function getDeploymentScript -V dir
echo "$dir/../Scripts/deploy.fish"
echo "$dir/../lib/deploy.fish"
end
function initialize -V dir
source "$dir/../../Common/Scripts/wait-network.fish"
source "$dir/../../lib/wait-network.fish"
waitNetwork
or exit
sudo systemctl enable --now nix-daemon
and source "$dir/../Scripts/software.fish"
and source "$dir/../lib/software.fish"
and source "$dir/../Software/base-devel/main.fish"
and source "$dir/../Software/pacman/main.fish"
and source "$dir/../Software/yay/main.fish"
@ -22,7 +22,7 @@ begin
and yayinst \
linux-headers \
pacman-contrib \
yq
go-yq
end
source "$dir/../../Common/OS/install.fish"

View file

@ -1,20 +1,22 @@
#!/bin/env fish
begin
set -l dir (status dirname)
set -l autologinConfig /etc/systemd/system/getty@tty1.service.d/autologin.conf
source "$dir/../lib/dependencies.fish"
source "$dir/../../Common/OS/setup.fish"
source "$dir/../../Common/Scripts/config.fish"
source "$dir/../../lib/settings.fish"
function runChroot -S
arch-chroot $argv
end
function installValhallaDeps -S
pacstrap -K "$mountDir" fish git jq nix sudo tmux
function bootstrapSetup -S
pacstrap -K (getOSConfig fileSystems.rootDir) fish
end
function installDrivers -S
if isOSEnabled hardware.surfaceBook
pacstrap -K "$mountDir" linux-firmware-marvell
pacstrap -K (getOSConfig fileSystems.rootDir) linux-firmware-marvell
end
end
@ -22,9 +24,30 @@ begin
echo "$dir/install.fish"
end
function initOS -V dir
source "$dir/../lib/dependencies.fish"
source "$dir/../../lib/wait-network.fish"
set -l mountDir (getOSConfig fileSystems.rootDir)
waitNetwork
and pacman-key --init
and pacman-key --populate
and pacstrap -K "$mountDir" \
base \
linux \
linux-firmware \
man-db \
man-pages \
texinfo
installValhallaDeps "$mountDir"
end
function setupOS -S -V dir -S
source "$dir/../../Common/Scripts/hooks.fish"
source "$dir/../../Common/Scripts/wait-network.fish"
source "$dir/../../lib/hooks.fish"
source "$dir/../../lib/wait-network.fish"
set -l mountDir (getOSConfig fileSystems.rootDir)
waitNetwork
and begin
@ -39,20 +62,12 @@ begin
timedatectl set-timezone "$timezone"
end
and pacman-key --init
and pacman-key --populate
and pacstrap -K "$mountDir" \
base \
linux \
linux-firmware \
networkmanager \
man-db \
man-pages \
texinfo
and genfstab -U "$mountDir" >>"$mountDir/etc/fstab"
and arch-chroot "$mountDir" systemctl enable NetworkManager
and if isProgramEnabled "networkmanager"
and pacstrap -K "$mountDir" networkmanager
arch-chroot "$mountDir" systemctl enable NetworkManager
end
and if set -q timezone
arch-chroot "$mountDir" ln -sf "/usr/share/zoneinfo/$timezone" /etc/localtime
@ -61,7 +76,7 @@ begin
and arch-chroot "$mountDir" hwclock --systohc
and begin
getOSConfig i18n.localeSettings --json | \
getOSConfig i18n.localeSettings --json |
jq --raw-output '[.[] | split(".") | .[0]] | unique | join("\\\\|")'
end | begin
read LOCALES
@ -70,7 +85,7 @@ begin
end
and begin
getOSConfig i18n.localeSettings --json | \
getOSConfig i18n.localeSettings --json |
jq --raw-output '[keys[] as $key | "\($key)=\(.[$key])"] | join("\n")'
end | arch-chroot "$mountDir" tee /etc/locale.conf >/dev/null
@ -80,6 +95,8 @@ begin
and echo (getOSConfig hostname) | arch-chroot "$mountDir" tee /etc/hostname >/dev/null
and runInOS fish "$tempDir/../Software/systemd-networkd/main.fish"
and runInOS fish "$tempDir/../Software/btrfs/main.fish"
and arch-chroot "$mountDir" mkinitcpio -P
and runInOS fish "$tempDir/../Software/grub/main.fish"
@ -95,16 +112,20 @@ begin
end
end
function autologin -S
set -l file "/etc/systemd/system/getty@tty1.service.d/autologin.conf"
arch-chroot "$mountDir" mkdir -p (dirname "$file")
function autologin -S -V autologinConfig
set -l mountDir (getOSConfig fileSystems.rootDir)
arch-chroot "$mountDir" mkdir -p (dirname "$autologinConfig")
and begin
printf %s\n \
"[Service]" \
"ExecStart=" \
"ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --autologin root %I \$TERM"
end | arch-chroot "$mountDir" tee "$file" >/dev/null
end | arch-chroot "$mountDir" tee "$autologinConfig" >/dev/null
end
function getAutologinDisableCommand -V autologinConfig
echo "rm -rf $(string escape (dirname "$autologinConfig"))"
end
if not type -q getInstallerScript

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/aliae/main.fish"
function installSW

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
pacinst base-devel

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/brave/main.fish"
function installSW

View file

@ -0,0 +1,19 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../lib/software.fish"
function installSW
pacinst btrfs-progs
end
function configureSW -V dir
source "$dir/../../../lib/settings.fish"
if isOSEnabled "programs.btrfs.pools"
echo "HOOKS+=(btrfs)" | sudo tee /etc/mkinitcpio.conf.d/btrfs.conf >/dev/null
end
end
runInstaller $argv
end

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/docker/main.fish"
function installSW
@ -10,6 +10,8 @@ begin
docker-compose \
docker-buildx \
docker-scan
installSWBase $argv
end
runInstaller $argv

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/firefox/main.fish"
function installSW -V dir

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/git/main.fish"
function installSW

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/grub/main.fish"
function installSW -V dir

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
yayinst \

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/logo-ls/main.fish"
function installSW -V dir

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
yayinst \

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/minegrub-theme/main.fish"
function installSW

View file

@ -0,0 +1,23 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/aliae/main.fish"
function installSW
yayinst nginx
end
function configureSW
set -l file "/etc/nginx/nginx.conf"
set -l config "include /etc/nginx/conf.d/*.conf;"
if not grep --fixed-strings "$config" "$file" >/dev/null
sudo sed -i "$file" -e "/^http {/,/^}/{ /^}/{" -e "i\\" -e "" -e "i \ $config" -e "} }"
end
sudo systemctl enable --now nginx
end
runInstaller $argv
end

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/nix/main.fish"
function installSW
@ -14,7 +14,7 @@ begin
function configureSW -V dir
sudo systemctl enable --now nix-daemon
configureSWBase configure $argv
configureSWBase $argv
end
runInstaller $argv

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
yayinst nodejs-n

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/nvidia-dkms/main.fish"
function installSW

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/oh-my-posh/main.fish"
function installSW

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
yayinst \

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
configureSW

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
yayinst \

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
yayinst \

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/powershell/main.fish"
function installSW

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/pyenv/main.fish"
function installSW

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/rclone/main.fish"
function installSW

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
# `git` version

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
yayinst steam
@ -9,7 +9,7 @@ begin
function configureSW -V dir
. "$dir/../../../Common/Scripts/config.fish"
. "$dir/../../../lib/settings.fish"
if isOSEnabled hidpi
begin

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
pacinst sudo

View file

@ -0,0 +1,14 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../../lib/software.fish"
inherit "$dir/../../../Common/Software/systemd-networkd/main.fish"
function configureSW -V dir
sudo systemctl enable systemd-networkd
sudo systemctl enable systemd-resolved
configureSWBase $argv
end
runInstaller $argv
end

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/vim/main.fish"
function installSW

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/virt-manager/main.fish"
function installSW

View file

@ -1,9 +1,11 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function setFlags -a user
function setFlags
argparse -i "user=" -- $argv
set -l user "$_flag_user"
set -l flags
set -l bins codium code

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
yayinst (

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
set -l contextRoot (mktemp -d)

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
function installSW
if not type -q yay

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../lib/software.fish"
inherit "$dir/../../../Common/Software/zoxide/main.fish"
function installSW

View file

@ -0,0 +1,11 @@
function installValhallaDeps -V dir -a mountDir
source "$dir/../lib/software.fish"
set -l args
if [ -n "$mountDir" ]
set -a args --root "$mountDir"
end
and pacinst $args fish git jq nix openssh sudo tmux
sudo systemctl enable --now nix-daemon
end

View file

@ -1,6 +1,7 @@
function deploySoftware -d "Deploys a the specified software action" -a action
set -l dir (status dirname)
. "$dir/software.fish"
. "$dir/../../lib/settings.fish"
if [ -z "$action" ]
set action install
@ -30,7 +31,7 @@ function deploySoftware -d "Deploys a the specified software action" -a action
source "$dir/../Software/xone/main.fish" $argv
end
and for component in (getOSConfig hardware.components --json | jq '.[]' --raw-output0 | string split0)
and for component in (getOSConfig hardware.components --json | jq '.[]' --raw-output0 | string split0 || true)
switch "$component"
case "Logitech G903"
source "$dir/../../Common/Drivers/Logitech G903/main.fish" $argv
@ -70,6 +71,8 @@ function deploySoftware -d "Deploys a the specified software action" -a action
end
and source "$dir/../../Common/Software/bash/main.fish" $argv
and source "$dir/../Software/systemd-networkd/main.fish" $argv
and source "$dir/../Software/btrfs/main.fish" $argv
and source "$dir/../../Common/Software/nuke-usb/main.fish" $argv
and source "$dir/../Software/sudo/main.fish" $argv
and source "$dir/../Software/aliae/main.fish" $argv
@ -79,6 +82,7 @@ function deploySoftware -d "Deploys a the specified software action" -a action
and source "$dir/../Software/git/main.fish" $argv
and source "$dir/../Software/zoxide/main.fish" $argv
and source "$dir/../Software/logo-ls/main.fish" $argv
and source "$dir/../../Common/Software/linux/main.fish" $argv
# GRUB Shenanigans - if that's not essential I don't know what is!
and source "$dir/../Software/minegrub-theme/main.fish" $argv
@ -145,10 +149,13 @@ function deploySoftware -d "Deploys a the specified software action" -a action
and yayinst propertree-git # mac .plist config file editor
end
and if isProgramEnabled "thunderbird" && $isInstall
and if isProgramEnabled thunderbird && $isInstall
yayinst thunderbird
end
# Server
and source "$dir/../Software/nginx/main.fish" $argv
# School & Studies
and if collectionActive school && $isInstall
yayinst \
@ -198,7 +205,7 @@ function deploySoftware -d "Deploys a the specified software action" -a action
audius-client-bin
end
and if isProgramEnabled "nextcloud"
and if isProgramEnabled nextcloud
yayinst nextcloud-client
end
end
@ -282,7 +289,7 @@ function deploySoftware -d "Deploys a the specified software action" -a action
yayinst osu-lazer-bin
end
and if isProgramEnabled "retroarch"
and if isProgramEnabled retroarch
yayinst libretro
end
end

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Common/Scripts/software.fish"
source "$dir/../../lib/software.fish"
function runYay -d "Run yay with pre-configured defaults"
if not isatty 0

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../../lib/software.fish"
function configureSW -V dir
. "$dir/../../Software/plasma/input.fish"

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../../lib/software.fish"
function configureSW -V dir
. "$dir/../../Software/plasma/input.fish"

View file

@ -0,0 +1,37 @@
#!/bin/env fish
set -l dir (status dirname)
source "$dir/../../lib/action.fish"
function backupAction -V dir
source "$dir/../../lib/hooks.fish"
source "$dir/../../lib/restoration.fish"
if not type -q getDeploymentScript
function getDeploymentScript
echo "No deployment script specified! No software will be installed." 1>&2
false
end
end
set -l deployScript (getDeploymentScript)
initBackupConfig --action backup
runHook backupSoftware || begin
echo "Backing up software..."
and if [ -n "$deployScript" ]
source $deployScript backup
end
end
runHook backupUsers || begin
if [ -n "$deployScript" ]
for name in (getUsers | jq '.[]' --raw-output0 | string split0 || true)
echo "Backing up user `$name`..."
and source $deployScript userBackup --user $name
end
end
end
end
runSetupUserAction backupAction

View file

@ -1,34 +1,11 @@
#!/bin/env fish
set -l dir (status dirname)
source "$dir/../Scripts/config.fish"
source "$dir/../Scripts/hooks.fish"
source "$dir/../../lib/action.fish"
if [ (id -u) -eq 0 ]
set -l name (getOSConfig setupUser.name)
set -l sudoConfig "/etc/sudoers.d/PortValhalla"
rm ~/.bash_profile
function installAction -V dir
source "$dir/../../lib/hooks.fish"
source "$dir/../../lib/restoration.fish"
begin
echo "Creating setup user"
and useradd \
--comment "PortValhalla Setup User" \
--system \
--no-user-group \
--groups nix-users \
--create-home \
--uid (getOSConfig setupUser.id --json) \
"$name"
end
and begin
echo "$name ALL=(ALL:ALL) NOPASSWD: ALL"
end >"$sudoConfig"
and sudo --preserve-env --set-home --user "$name" "$INSTALLER_SCRIPT"
rm "$sudoConfig"
userdel -rf "$name"
else
if not type -q getDeploymentScript
function getDeploymentScript
echo "No deployment script specified! No software will be installed." 1>&2
@ -37,6 +14,7 @@ else
end
set -l deployScript (getDeploymentScript)
initBackupConfig --action restore
runHook initialize || true
and runHook installOS || true
@ -54,28 +32,29 @@ else
runHook initializeUsers || begin
if [ -n "$deployScript" ]
source "$dir/../Scripts/config.fish"
source "$dir/../../lib/settings.fish"
for name in (getUsers | jq '.[]' --raw-output0 | string split0)
for name in (getUsers | jq '.[]' --raw-output0 | string split0 || true)
echo "Configuring user `$name`..."
and source $deployScript userConfig $name
and source $deployScript userConfig --user $name
end
end
end
and runHook postInstall || true
and sudo git config remove-section --system safe || true
and begin
echo "Cleaning installation scripts..."
set -l projectPath (realpath "$(status dirname)/../../..")
cd (dirname "$projectPath")
sudo rm -rf "$projectPath"
# sudo rm -rf "$projectPath"
end
and echo "The installation finished successfully!"
and echo "This machine will reboot in 5 seconds..."
and echo "Press CTRL-C to abort..."
and sleep 5
and systemctl reboot -i
and sudo systemctl reboot -i
end
runSetupUserAction installAction

View file

@ -1,20 +1,17 @@
#!/bin/env fish
function runSetup
set -l dir (status dirname)
source "$dir/../Scripts/config.fish"
source "$dir/../Scripts/hooks.fish"
if [ -z "$CONFIG_NAME" ]
selectProfile config
set -x CONFIG_NAME "$config"
end
set -l mountDir (getOSConfig partition.rootDir)
source "$dir/../../lib/action.fish"
set -l projectRoot (realpath "$dir/../../..")
set -l projectName (basename "$projectRoot")
set -l PROJECT_CLONE_ROOT "/opt/$(basename "$projectName")"
set -l script (mktemp)
chmod +x "$script"
function setupAction -V dir -V projectRoot -V PROJECT_CLONE_ROOT
source "$dir/../../lib/hooks.fish"
source "$dir/../../lib/nix.fish"
source "$dir/../../lib/restoration.fish"
source "$dir/../../lib/settings.fish"
set -l mountDir (getOSConfig fileSystems.rootDir)
if not type -q runChroot
function runChroot -S
@ -22,6 +19,12 @@ function runSetup
end
end
if not type -q getAutologinDisableCommand
function getAutologinDisableCommand
echo "true"
end
end
function getCloneFile -S -a path
set -l relativeDir (realpath --relative-to "$projectRoot" "$dir")
set -l relativePath (realpath --relative-to "$dir" "$path")
@ -42,45 +45,82 @@ function runSetup
"$argv"
end
initBackupConfig --action restore
echo "Partitioning drives..."
and getOSConfig partition.script >"$script"
begin
set -l script (mktemp)
chmod +x "$script"
and getOSConfig fileSystems.script >"$script"
and "$script"
and rm "$script"
# Copy `nixpkgs` channel
and echo "Preparing nix..."
and begin
set -l channelDir /nix/var/nix/profiles/per-user/root/channels/nixpkgs
mkdir -p (dirname "$mountDir/$channelDir")
cp -r "$channelDir" "$mountDir/$channelDir"
end
and echo "Installing dependencies..."
and runHook --force installValhallaDeps 'Please set up a function `installValhallaDeps` for installing `fish`, `git`, `jq`, `nix`, `sudo` and `tmux`.'
if [ -n "$VALHALLA_BACKUP_SERVER_KEY" ]
set -l knownHosts /root/.ssh/known_hosts
mkdir -p (dirname "$mountDir$VALHALLA_BACKUP_SERVER_KEY")
mkdir -p (dirname "$mountDir$knownHosts")
cp "$VALHALLA_BACKUP_SERVER_KEY" "$mountDir$VALHALLA_BACKUP_SERVER_KEY"
cp $knownHosts "$mountDir$knownHosts"
end
and echo "Cloning project..."
and source "$dir/../../copy-repo.fish" "$mountDir$PROJECT_CLONE_ROOT"
runChroot "$mountDir" git config --system --add safe.directory "$PROJECT_CLONE_ROOT"
and source "$dir/../../lib/copy-repo.fish" "$mountDir$PROJECT_CLONE_ROOT"
and begin
set -l path "$mountDir/$nixPkgsDir"
and mkdir -p (dirname "$path")
and cp -r "$nixPkgsDir" "$path"
and git -C "$path" reset --hard
end
and runHook initOS "Please set up a function `initOS` for initializing the mounted OS and installing valhalla dependencies"
and runChroot "$mountDir" git config --system --add safe.directory "$PROJECT_CLONE_ROOT"
and runHook --force bootstrapSetup "Please set up a function `bootstrapSetup` for installing `fish` into the "
and runHook setupOS
and echo "Preparing auto-login..."
and runHook --force autologin "Please set up a function `autologin` for setting up autologin for the `root` user"
and begin
set -l profile "/root/.bash_profile"
begin
set -l profile (string escape "$profile")
set -l tmp (string escape "$profile""_")
set -l script (string escape (getCloneFile (getInstallerScript)))
wrapScript (
printf "%s\n" \
"mv $profile $tmp" \
(wrapScript (
string join " " \
"INSTALLER_SCRIPT=$(string escape "$script")" \
"CONFIG_NAME=$(string escape "$CONFIG_NAME")" \
(string escape $script))
(begin
for var in \
CONFIG_NAME \
VALHALLA_BACKUP_DISABLED \
VALHALLA_BACKUP_DIR \
VALHALLA_BACKUP_SERVER \
VALHALLA_BACKUP_SERVER_PORT \
VALHALLA_BACKUP_SERVER_USER \
VALHALLA_BACKUP_SERVER_KEY
echo "$var=$(string escape "$$var")"
end
end) \
(string escape $script) "&&")) \
"rm $tmp &&" \
"$(getAutologinDisableCommand) ||" \
"mv $tmp $profile"
end | runChroot "$mountDir" tee "$profile" >/dev/null
end
end
end | runChroot "$mountDir" tee /root/.bash_profile >/dev/null
and echo "Setup finished!"
function actionPostRun
echo "Setup finished!"
and echo "This machine will reboot in 5 seconds..."
and echo "Press CTRL-C to abort..."
and sleep 5
and systemctl reboot
end
runAction setupAction
end

View file

@ -1,11 +1,11 @@
#!/bin/env fish
set -l dir (status dirname)
source "$dir/../Scripts/config.fish"
source "$dir/../../lib/settings.fish"
set -l users (getUsers)
echo "Creating users..."
for name in (echo "$users" | jq '.[]' --raw-output0 | string split0)
for name in (echo "$users" | jq '.[]' --raw-output0 | string split0 || true)
echo "Creating user `$name`..."
function getUserInfo -V name -a config

View file

@ -1,100 +0,0 @@
#!/bin/env fish
begin
set -l dir (status dirname)
functions -e installSW
functions -e configureSW
functions -e userConfig
function runPSUserAction -a script action name
pwsh -CommandWithArgs '& $args[0] $args[1] @{ name=$args[2]; }' "$script" "$action" "$name"
end
function runPSUserConfig -a script name
runPSUserAction "$script" ConfigureUser "$name"
end
function inherit -a script -d "Inherits the installer from the specified script."
set -l actions \
installSW \
install \
configureSW \
configure \
userConfig \
userConfig
for i in (seq 1 2 (count $actions))
set -l functionName "$actions[$i]Base"
function $functionName -V script -V actions -V i
fish "$script" $actions[(math $i + 1)] $argv
end
function $actions[$i] -V functionName
$functionName $argv
end
end
end
function runInstaller -V dir -a action
set -l path (status stack-trace | head -n4 | tail -n1 | string replace --regex -- '^\s*called on line \d+ of file (.*)$' '$1')
set -l name (basename (dirname $path))
runInstallerAction $name $argv
end
function runInstallerAction -V dir
argparse "force" -- $argv
set -l install
set -l args $_flag_force
set -l name $argv[1]
set -l action $argv[2]
source "$dir/config.fish"
if [ -n "$_flag_force" ]
set force true
else
set force false
end
if isProgramEnabled $name || $force
set install true
else
set install false
end
if [ -z "$action" ] || [ "$action" = install ]
if functions -q installSW && $install
echo "Installing `$name`..."
installSW $argv[3..]
end
runInstallerAction $args $name configure
if not isConfigured || [ "$USER" != (getConfig "valhalla.setupUser.name") ]
runInstallerAction $args $name userConfig
end
else if [ "$action" = configure ]
if functions -q configureSW && $install
echo "Configuring `$name`..."
configureSW $argv[3..]
end
else if [ "$action" = userConfig ]
set -l user $argv[3]
if [ -z "$user" ]
set user "$USER"
end
if isProgramEnabled "$name" "$user" || $force
set install true
else
set install false
end
if functions -q userConfig && $install
echo "Configuring `$name` for `$user`..."
userConfig "$user" $argv[4..]
end
end
end
end

View file

@ -1,6 +1,6 @@
. "$PSScriptRoot/Constants.ps1";
. "$PSScriptRoot/../powershell/Profile.ps1";
. "$PSScriptRoot/../../Scripts/Software.ps1";
. "$PSScriptRoot/../../../lib/Software.ps1";
Start-SoftwareInstaller @args `
-Configurator {

View file

@ -27,7 +27,7 @@ $null = New-Module {
Value = "$Value";
} `
-User $User `
".alias |= [((. // [])[] | select(.name != env.Name))] + [{ name: env.Name, value: env.Value }]";
'.alias |= [((. // [])[] | select(.name != env(Name)))] + [{ "name": strenv(Name), "value": strenv(Value) }]';
}
<#
@ -53,7 +53,7 @@ $null = New-Module {
Value = "$Value";
} `
-User $User `
".env |= [((. // [])[] | select(.name != env.Name))] + [{ name: env.Name, value: env.Value }]";
'.env |= [((. // [])[] | select(.name != env(Name)))] + [{ "name": strenv(Name), "value": strenv(Value) }]';
}
<#
@ -92,7 +92,7 @@ $null = New-Module {
}
sudo @using:flags pwsh -CommandWithArgs 'Get-Content -Raw $args[0]' $using:path | Set-Content $file;
yq -yi $using:Script $file;
yq -i $using:Script $file;
sudo @using:flags pwsh -CommandWithArgs 'Set-Content $args[0] -Value $args[1]' $using:path (Get-Content -Raw $file);
Remove-Item $file;
} | Receive-Job -Wait;

View file

@ -1,12 +1,12 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../../lib/software.fish"
function configureSW -V dir
source "$dir/../bash/profile.fish"
source "$dir/../fish/profile.fish"
set -l file (pwsh -CommandWithArgs '. $args[0]; Get-GlobalConfigPath' "$dir/Constants.ps1")
set -l file (pwsh -NoProfile -CommandWithArgs '. $args[0]; Get-GlobalConfigPath' "$dir/Constants.ps1")
sudo install -Dm644 "$dir/aliae.yml" "$file"
begin
@ -42,8 +42,17 @@ begin
sudo -HE pwsh "$dir/Main.ps1" Configure
end
function userConfig -V dir -a user
runPSUserConfig "$dir/Main.ps1" $user
function getBackupArgs
printf "%s\n" --full-path "/etc/aliae/aliae.yml" /
end
function userConfig -V dir
runPSUserConfig "$dir/Main.ps1" $argv
end
function getUserBackupArgs
argparse -i "user=" -- $argv
printf "%s\n" --base-directory ~"$_flag_user" --hidden --exact-depth 1 --glob ".aliae.yaml"
end
runInstaller $argv

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../../lib/software.fish"
function configureSW -V dir
begin

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/profile-base.fish"
source "$dir/../../../lib/profile-base.fish"
function getBashStatements
end

View file

@ -1,7 +1,7 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../../lib/software.fish"
function configureSW -V dir
set -l bin

View file

@ -33,7 +33,7 @@ function installExtension -d "Installs a Chromium extension for the browser with
sudo chmod -R u+w "$extensionDir"
sudo mkdir -p "$policyDir"
for manifest in (find "$policyDir" -name "*.json" -print0 | string split0)
for manifest in (find "$policyDir" -name "*.json" -print0 | string split0 || true)
if [ (cat "$manifest" | jq -r ".$property") = "$destination" ]
sudo rm "$manifest"
end

View file

@ -1,14 +1,29 @@
#!/bin/env fish
begin
set -l dir (status dirname)
source "$dir/../../Scripts/software.fish"
source "$dir/../../../lib/software.fish"
function configureSW -V dir
sudo systemctl enable --now docker
end
function userConfig -a name
sudo usermod -aG docker "$name"
function userConfig
argparse -i "user=" -- $argv
sudo usermod -aG docker "$_flag_user"
end
function installSWDependencies -V dir -V args
source "$dir/../../../lib/settings.fish"
set -la argv $args
argparse -i "name=" "user=" -- $argv
set -l services (getProgramConfig --name "$_flag_name" --json | jq '.services')
for service in (echo "$services" | jq '. // {} | keys[]' --raw-output0 | string split0 || true)
if echo "$services" | SERVICE=$service jq --exit-status ".[env.SERVICE].enable" >/dev/null
fish "$dir/services/$service/main.fish" $argv
end
end
end
runInstaller $argv

View file

@ -0,0 +1,6 @@
services:
anki:
image: yangchuansheng/anki-sync-server
restart: unless-stopped
volumes:
- ./data:/ankisyncdir

View file

@ -0,0 +1,6 @@
services:
anki:
environment:
SYNC_USER1: scott:tiger
ports:
- 127.0.0.1:1337:8080

View file

@ -0,0 +1,34 @@
#!/bin/env fish
begin
set -l name anki
set -l dir (status dirname)
set -l source "$dir/docker-compose.overrides.yml"
source "$dir/../service.fish"
function installSW -V dir -V source
set -l pw (nix-shell -p keepassxc --run "keepassxc-cli generate --length 32")
set -l userKey ".services.anki.environment.SYNC_USER1"
set -l user (yq "$userKey" "$source" | sed "s/:.*\$/:$pw/")
initializeServiceInstallation $argv
sudo cp "$dir/docker-compose.base.yml" (getServiceRoot $argv)
USER=$user yq "$userKey = env(USER)" "$source" |
sudo tee (getServiceOverrides $argv) >/dev/null
installDockerService $argv
end
function configureSW -V dir
configureDockerService $argv
end
function getServiceServers -V name
printf "$name" ""
end
function getServiceLocations -V name
printf "%s\0" "$name" /
end
runInstaller --force $argv
end

View file

@ -0,0 +1,4 @@
include:
- path:
- docker-compose.base.yml
- docker-compose.overrides.yml

View file

@ -0,0 +1 @@
data/

Some files were not shown because too many files have changed in this diff Show more