Format all files

This commit is contained in:
Manuel Thalmann 2024-10-06 21:25:34 +02:00
parent f2abbe8561
commit 59708b8f04
110 changed files with 1439 additions and 1484 deletions

View file

@ -5,10 +5,10 @@ fi
~/.automated_script.sh ~/.automated_script.sh
if bash -c "ls /sys/class/backlight/*/max_brightness" > /dev/null 2>&1; if bash -c "ls /sys/class/backlight/*/max_brightness" > /dev/null 2>&1
then then
cat /sys/class/backlight/*/max_brightness > /sys/class/backlight/*/brightness cat /sys/class/backlight/*/max_brightness > /sys/class/backlight/*/brightness
fi; fi
cd "PortValhalla" cd "PortValhalla"

View file

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

View file

@ -1,5 +1,5 @@
diff --git a/airootfs/root/.zlogin b/airootfs/root/.zlogin diff --git a/airootfs/root/.zlogin b/airootfs/root/.zlogin
index bf6bc8f..6c333e3 100644 index bf6bc8f..0c263a9 100644
--- a/airootfs/root/.zlogin --- a/airootfs/root/.zlogin
+++ b/airootfs/root/.zlogin +++ b/airootfs/root/.zlogin
@@ -4,3 +4,18 @@ if grep -Fqa 'accessibility=' /proc/cmdline &> /dev/null; then @@ -4,3 +4,18 @@ if grep -Fqa 'accessibility=' /proc/cmdline &> /dev/null; then
@ -7,10 +7,10 @@ index bf6bc8f..6c333e3 100644
~/.automated_script.sh ~/.automated_script.sh
+ +
+if bash -c "ls /sys/class/backlight/*/max_brightness" > /dev/null 2>&1; +if bash -c "ls /sys/class/backlight/*/max_brightness" > /dev/null 2>&1
+then +then
+ cat /sys/class/backlight/*/max_brightness > /sys/class/backlight/*/brightness + cat /sys/class/backlight/*/max_brightness > /sys/class/backlight/*/brightness
+fi; +fi
+ +
+cd "PortValhalla" +cd "PortValhalla"
+ +

View file

@ -1,15 +1,12 @@
let let
inherit (nixpkgs) lib; inherit (nixpkgs) lib;
nixpkgs = import <nixpkgs> { config = {}; overlay = []; }; nixpkgs = import <nixpkgs> {
config = { };
overlay = [ ];
};
property = (builtins.getEnv "PROPERTY"); property = (builtins.getEnv "PROPERTY");
processor = if (builtins.stringLength property > 0) processor = if (builtins.stringLength property > 0) then
then (_: lib.attrsets.getAttrFromPath (lib.strings.splitString "." property) _)
(_: lib.attrsets.getAttrFromPath (lib.strings.splitString "." property) _) else
else (_: _);
(_: _); in _: processor (lib.evalModules { modules = [ _ ]; }).config
in
_: processor (lib.evalModules {
modules = [
_
];
}).config

View file

@ -1,67 +1,63 @@
{ lib, ... }: { lib, ... }:
let let inherit (lib) mkOption types;
inherit (lib) in {
mkOption options = {
types valhalla = {
; hardware = {
in { components = mkOption {
options = { type = types.listOf types.str;
valhalla = { description = "The names of the hardware components of the computer.";
hardware = { default = [ ];
components = mkOption { };
type = types.listOf types.str;
description = "The names of the hardware components of the computer.";
default = [];
};
surfaceBook = mkOption { surfaceBook = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether the system is a Surface Book 2."; description = "A value indicating whether the system is a Surface Book 2.";
default = false; default = false;
}; };
xoneReceiver = mkOption { xoneReceiver = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether an Xbox receiver is present."; description = "A value indicating whether an Xbox receiver is present.";
default = false; default = false;
}; };
eyeX = mkOption { eyeX = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether a Tobii EyeX device is present."; description = "A value indicating whether a Tobii EyeX device is present.";
default = false; default = false;
}; };
amdCPU = mkOption { amdCPU = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether an AMD CPU is present."; description = "A value indicating whether an AMD CPU is present.";
default = false; default = false;
}; };
nvidiaGPU = mkOption { nvidiaGPU = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether an NVIDIA GPU is present."; description = "A value indicating whether an NVIDIA GPU is present.";
default = false; default = false;
}; };
corsairDevice = mkOption { corsairDevice = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether a Corsair device is present."; description = "A value indicating whether a Corsair device is present.";
default = false; default = false;
}; };
elgatoWave = mkOption { elgatoWave = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether an Elgato Wave device is present."; description = "A value indicating whether an Elgato Wave device is present.";
default = false; default = false;
}; };
logitechG = mkOption { logitechG = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether a Logitech G device is present."; description = "A value indicating whether a Logitech G device is present.";
default = false; default = false;
};
}; };
}; };
}; };
} };
}

View file

@ -1,19 +1,15 @@
{ lib, ... }: { lib, ... }:
let let inherit (lib) mkOption types;
inherit (lib) in {
mkOption options = {
types valhalla = {
; i18n = {
in { localeSettings = mkOption {
options = { type = types.attrsOf types.str;
valhalla = { description = "The system wide locale settings";
i18n = { default = { };
localeSettings = mkOption {
type = types.attrsOf types.str;
description = "The system wide locale settings";
default = {};
};
}; };
}; };
}; };
} };
}

View file

@ -1,65 +1,60 @@
{ lib, ... }: { lib, ... }:
let let inherit (lib) mkOption types;
inherit (lib) in {
mkOption options = {
types valhalla = mkOption {
; type = types.submodule (
in { { extendModules, ... }: let
options = { osVariant = extendModules {
valhalla = mkOption { modules = [
type = types.submodule ( ({ config, ... }: {
{ extendModules, ... }: options = {
let config = mkOption {
osVariant = extendModules { type = types.attrs;
modules = [ description = "The configuration of the Operating System.";
({ config, ... }: { default = builtins.removeAttrs config [ "_module" "config" "linux" "windows" ];
options = { visible = false;
config = mkOption { };
type = types.attrs;
description = "The configuration of the Operating System.";
default = builtins.removeAttrs config ["_module" "config" "linux" "windows"];
visible = false;
};
};
})
];
};
linuxVariant = osVariant.extendModules {
modules = [
({ ... }: {
options = {
secureBoot = mkOption {
type = types.bool;
description = "A value indicating whether the system supports Secure Boot.";
default = false;
};
};
})
];
};
windowsVariant = osVariant.extendModules { };
in {
options = {
linux = mkOption {
inherit (linuxVariant) type;
description = "The options for setting up Linux.";
default = {};
visible = "shallow";
}; };
})
];
};
windows = mkOption { linuxVariant = osVariant.extendModules {
inherit (windowsVariant) type; modules = [
description = "The options for setting up Windows."; ({ ... }: {
default = {}; options = {
visible = "shallow"; secureBoot = mkOption {
type = types.bool;
description = "A value indicating whether the system supports Secure Boot.";
default = false;
};
}; };
}; })
}); ];
};
description = "Configuration for PortValhalla."; windowsVariant = osVariant.extendModules { };
default = {}; in {
}; options = {
linux = mkOption {
inherit (linuxVariant) type;
description = "The options for setting up Linux.";
default = { };
visible = "shallow";
};
windows = mkOption {
inherit (windowsVariant) type;
description = "The options for setting up Windows.";
default = { };
visible = "shallow";
};
};
});
description = "Configuration for PortValhalla.";
default = { };
}; };
} };
}

View file

@ -1,59 +1,55 @@
{ lib, ... }: { lib, ... }:
let let
inherit (lib) inherit (lib) mkOption types;
mkOption
types
;
gitType = types.submodule ( gitType = types.submodule ({ ... }: {
{ ... }: {
options = {
defaultBranch = mkOption {
type = types.nullOr types.str;
description = "The name of the default branch in newly created repositories.";
default = null;
};
flow = {
mainBranch = mkOption {
type = types.nullOr types.str;
description = "The name of the stable branch in git flow.";
default = null;
};
devBranch = mkOption {
type = types.nullOr types.str;
description = "The name of the development branch in git flow.";
default = null;
};
};
aliases = mkOption {
type = types.attrsOf types.str;
description = "The git command aliases to install.";
default = {};
};
};
});
gitOption = mkOption {
type = gitType;
description = "The git related options.";
default = {};
};
in {
options = { options = {
valhalla = { defaultBranch = mkOption {
git = gitOption; type = types.nullOr types.str;
description = "The name of the default branch in newly created repositories.";
default = null;
};
users = mkOption { flow = {
type = types.attrsOf (types.submodule ( mainBranch = mkOption {
{ ... }: { type = types.nullOr types.str;
options = { description = "The name of the stable branch in git flow.";
git = gitOption; default = null;
}; };
}));
devBranch = mkOption {
type = types.nullOr types.str;
description = "The name of the development branch in git flow.";
default = null;
}; };
}; };
aliases = mkOption {
type = types.attrsOf types.str;
description = "The git command aliases to install.";
default = { };
};
}; };
} });
gitOption = mkOption {
type = gitType;
description = "The git related options.";
default = { };
};
in {
options = {
valhalla = {
git = gitOption;
users = mkOption {
type = types.attrsOf (types.submodule (
{ ... }: {
options = {
git = gitOption;
};
}));
};
};
};
}

View file

@ -1,44 +1,39 @@
{ lib, ... }: { lib, ... }:
let let
inherit (lib) inherit (lib) mkEnableOption mkOption types;
mkEnableOption
mkOption
types
;
syncType = types.submodule ( syncType = types.submodule ({ ... }: {
{ ... }: {
options = {
remotePath = mkOption {
type = types.str;
description = "The path to the folder on the cloud to sync.";
};
localPath = mkOption {
type = types.str;
description = "The path to sync the cloud content to.";
};
virtualFiles = (mkEnableOption "virtual file support") // {
default = true;
};
};
});
in {
options = { options = {
valhalla.windows.users = mkOption { remotePath = mkOption {
type = types.attrsOf (types.submodule ( type = types.str;
{ ... }: { description = "The path to the folder on the cloud to sync.";
options = { };
nextcloud = {
folderSyncs = mkOption { localPath = mkOption {
type = types.listOf syncType; type = types.str;
description = "The folders to synchronize."; description = "The path to sync the cloud content to.";
default = []; };
};
}; virtualFiles = (mkEnableOption "virtual file support") // {
}; default = true;
}));
}; };
}; };
} });
in {
options = {
valhalla.windows.users = mkOption {
type = types.attrsOf (types.submodule (
{ ... }: {
options = {
nextcloud = {
folderSyncs = mkOption {
type = types.listOf syncType;
description = "The folders to synchronize.";
default = [ ];
};
};
};
}));
};
};
}

View file

@ -1,55 +1,52 @@
{ lib, ... }: { lib, ... }:
let let
inherit (lib) inherit (lib) mkOption types;
mkOption
types
;
themeType = types.submodule ( themeType = types.submodule (
{ config, ... }: { { config, ... }: {
options = { options = {
source = mkOption { source = mkOption {
type = types.path; type = types.path;
description = "The path to the oh-my-posh theme to use."; description = "The path to the oh-my-posh theme to use.";
};
name = mkOption {
type = types.nullOr types.str;
description = "The name of the theme.";
default = lib.strings.removeSuffix ".omp" (lib.strings.removeSuffix ".json" (builtins.baseNameOf config.source));
};
}; };
});
ompType = types.submodule ( name = mkOption {
{ config, ... }: { type = types.nullOr types.str;
options = { description = "The name of the theme.";
theme = mkOption { default = lib.strings.removeSuffix ".omp" (lib.strings.removeSuffix ".json" (builtins.baseNameOf config.source));
type = types.nullOr (types.either types.str themeType);
description = "The default theme.";
default = null;
};
additionalThemes = mkOption {
type = types.listOf themeType;
description = "A set of additional themes to install.";
default = [];
};
}; };
});
in {
options = {
valhalla.users = mkOption {
type = types.attrsOf (types.submodule (
{ ... }: {
options = {
oh-my-posh = mkOption {
type = ompType;
description = "The Oh My Posh configuration to apply.";
default = {};
};
};
}));
}; };
});
ompType = types.submodule (
{ config, ... }: {
options = {
theme = mkOption {
type = types.nullOr (types.either types.str themeType);
description = "The default theme.";
default = null;
};
additionalThemes = mkOption {
type = types.listOf themeType;
description = "A set of additional themes to install.";
default = [ ];
};
};
});
in {
options = {
valhalla.users = mkOption {
type = types.attrsOf (types.submodule (
{ ... }: {
options = {
oh-my-posh = mkOption {
type = ompType;
description = "The Oh My Posh configuration to apply.";
default = { };
};
};
}));
}; };
} };
}

View file

@ -1,40 +1,37 @@
{ lib, ... }: { lib, ... }:
let let
inherit (lib) inherit (lib) mkOption types;
mkOption
types
;
syncType = types.submodule ( syncType = types.submodule (
{ ... }: { { ... }: {
options = { options = {
dirName = mkOption { dirName = mkOption {
type = types.str; type = types.str;
description = "The name of the directory to sync the remote files to."; description = "The name of the directory to sync the remote files to.";
};
cacheDuration = mkOption {
type = types.nullOr types.str;
description = "The amount of time to keep cached files.";
default = null;
};
}; };
});
in { cacheDuration = mkOption {
options = { type = types.nullOr types.str;
valhalla.linux.users = mkOption { description = "The amount of time to keep cached files.";
type = types.attrsOf (types.submodule ( default = null;
{ ... }: { };
options = { };
rclone = { });
configurations = mkOption { in {
type = types.attrsOf syncType; options = {
description = "The configurations of the rclone mounts."; valhalla.linux.users = mkOption {
default = {}; type = types.attrsOf (types.submodule (
}; { ... }: {
options = {
rclone = {
configurations = mkOption {
type = types.attrsOf syncType;
description = "The configurations of the rclone mounts.";
default = { };
}; };
}; };
})); };
}; }));
}; };
} };
}

View file

@ -16,16 +16,16 @@ function chooseDisk -a outFile message selectScript
cat | while read disk cat | while read disk
set -l diskInfo (string split -n " " $disk) set -l diskInfo (string split -n " " $disk)
if contains "$diskInfo[3]" "disk" if contains "$diskInfo[3]" disk
set -a disks "$disk" set -a disks "$disk"
end end
end end
end end
select "$header" "$outFile" "$message" "No valid disk found!" "$(string collect $disks)" "false" select "$header" "$outFile" "$message" "No valid disk found!" "$(string collect $disks)" false
and begin and begin
set -l disk (string split -n " " (cat "$outFile")) set -l disk (string split -n " " (cat "$outFile"))
echo "/dev/$disk[1]" > $outFile echo "/dev/$disk[1]" >$outFile
return return
end end
end end

View file

@ -5,18 +5,19 @@ function confirm -a message default
while true while true
read -l value -P "$message $options " read -l value -P "$message $options "
or exit 1 or exit 1
set value (string lower "$value") set value (string lower "$value")
if [ -z "$value" ] if [ -z "$value" ]
set value $default set value $default
end end
if contains "$value" "0" "false" "n" "no" if contains "$value" 0 false n no
false false
return return
end end
if contains "$value" "1" "true" "y" "yes" if contains "$value" 1 true y yes
true true
return return
end end

View file

@ -1,376 +1,353 @@
{ lib, config, ... }: { lib, config, ... }:
let let
inherit (lib) inherit (lib) types mkOption;
types
mkOption
;
fs = import ./fs.nix; fs = import ./fs.nix;
diskListVarName = "myDisks"; diskListVarName = "myDisks";
isSwap = partition: builtins.elem partition.type [fs.swap 19]; isSwap = partition: builtins.elem partition.type [ fs.swap 19 ];
probeScript = builtins.concatStringsSep "\n" [ probeScript = builtins.concatStringsSep "\n" [
"partprobe 2> /dev/null || true" "partprobe 2> /dev/null || true"
"udevadm trigger" "udevadm trigger"
]; ];
mkDiskType = osDisk: types.submodule ( mkDiskType = osDisk: types.submodule (
{ config, name, ... }: { { config, name, ... }: {
options = { options = {
id = mkOption { id = mkOption {
type = types.str; type = types.str;
description = "The internal identifier of the disk."; description = "The internal identifier of the disk.";
internal = true; 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 = wipe = mkOption {
let type = types.bool;
diskVarName = "${diskListVarName}[${config.id}]"; description = "A value indicating whether the disk should be wiped.";
diskVar = ''''${${diskVarName}}''; default = !(lib.lists.any (_: _.keepExisting) (builtins.attrValues config.partitions));
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: append: "echo ${script} | ${fdiskCommand "${if append then "--append" else ""} ${diskVar}"}";
wipeScript = script: fdiskScript script false;
appendScript = script: fdiskScript script true;
cleanup = lib.strings.concatLines (builtins.map
(partition: "${fdiskCommand "--delete ${diskVar} ${toString partition.index}"} || true")
(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 "${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 ""}
${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 = { deviceName = mkOption {
sizeScript = ( type = types.nullOr types.str;
if isSwap config description = "The name of the device.";
then default = if osDisk then null else name;
''echo "$(cat /proc/meminfo | awk -F " " '/^MemTotal/ { print $2 }' | awk '{ print int((($1 / 1024 / 1024) * 0.75) + 0.5)}')"G'' };
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 else
"echo ${lib.strings.escapeShellArg (toString config.size)}" type);
);
};
}
);
in {
options = {
valhalla = {
partition = {
rootDir = mkOption {
type = types.str;
description = "The root of the installation directory to mount disks into.";
default = "/mnt";
};
os = mkOption { fdiskCommand = arguments: "sudo sfdisk ${arguments}";
type = mkDiskType true; fdiskScript = script: append: "echo ${script} | ${fdiskCommand "${if append then "--append" else ""} ${diskVar}"}";
description = "The partition layout of the OS disk."; wipeScript = script: fdiskScript script false;
}; appendScript = script: fdiskScript script true;
disks = mkOption { cleanup = lib.strings.concatLines (builtins.map
type = types.attrsOf (mkDiskType false); (partition: "${fdiskCommand "--delete ${diskVar} ${toString partition.index}"} || true")
description = "The additional disks to format."; (builtins.filter (_: !_.keepExisting) partitions));
default = {};
};
script = mkOption { fdiskCommands = lib.strings.concatLines
type = types.str; (lib.optionals config.wipe [
description = "The script for partitioning the system's disks."; cleanup
}; (wipeScript "label: gpt")
}; ] ++ (builtins.concatMap (
}; partition:
}; let
inherit (partition) format index keepExisting label sizeScript type;
config = { partVarName = "myPartition";
valhalla = { partVar = "\${${partVarName}}";
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}"; sizeOption = ''
disks = ([os] ++ (builtins.attrValues cfg.disks)); ${sizeScript} | sed -e "s/.*[^[:space:]]/size=\0/"
partitions = (builtins.concatMap (_: (builtins.attrValues _.partitions)) disks); '';
mountScript = lib.strings.concatLines ( formatScripts = {
builtins.concatMap ${fs.ext4} = "mkfs.ext4 -F ${partVar}";
(_: [ ${fs.swap} = "mkswap ${partVar}";
probeScript ${fs.ntfs} = "mkfs.ntfs -F ${partVar}";
(builtins.concatStringsSep " " ([ ${fs.fat32} = "mkfs.fat -F 32 ${partVar}";
"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 ( labelScripts = {
builtins.map ${fs.ext4} = label: "e2label ${partVar} ${label}";
(_: '' ${fs.swap} = label: "swaplabel ${partVar} --label ${label}";
${probeScript} ${fs.ntfs} = label: "ntfslabel ${partVar} ${label}";
sudo swapon ${partPath _} ${fs.fat32} = label: "fatlabel ${partVar} ${label}";
'') };
(builtins.filter (_: _.useSwap) partitions));
in lib.strings.concatLines ([ create = lib.strings.concatLines [
"#!/bin/bash" (appendScript ''${toString index}: "$(${sizeOption})" type=${mkType type}'')
"set -o errexit" probeScript
] ++ "sudo ${formatScripts.${format}}"
(builtins.map (_: _.deviceScript) disks) ++ ];
lib.optionals ((builtins.length disks) > 0) [
''echo "$(tput setaf 3)==== WARNING ====$(tput sgr0)"'' fallback = ''
(''echo "Continuing this script will alter the partitions of '' + ( if ! { ls "${partVar}" 2>&1; } > /dev/null
lib.strings.concatStringsSep ", " (builtins.map (_: "${_.deviceVariable}") (lib.lists.init disks)) then
) + (if (builtins.length disks) > 1 then " and " else "") + (lib.lists.last disks).deviceVariable + ''"'') ${create}
''
if ! fish ${./confirm.fish} "Are you sure you want to continue?" "n"; then
exit 1
fi fi
'' '';
] ++ in [
(builtins.map (_: _.script) disks) ++ [ ''local diskPath="$(find -L /dev/disk/by-diskseq -samefile ${diskVar})"''
mountScript ''local ${partVarName}="$diskPath-part${toString index}"''
swapScript (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 ""}
${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

@ -1,6 +1,6 @@
function select -a header outFile message error choices loop function select -a header outFile message error choices loop
if [ -z "$loop" ] if [ -z "$loop" ]
set loop "true" set loop true
end end
while true while true
@ -24,9 +24,9 @@ function select -a header outFile message error choices loop
read -lP "Your choice: " choice read -lP "Your choice: " choice
or exit 1 or exit 1
if math "0+$choice" &> /dev/null if math "0+$choice" &>/dev/null
if [ "$choice" -ge 1 ] && [ "$choice" -le "$count" ] if [ "$choice" -ge 1 ] && [ "$choice" -le "$count" ]
echo "$items[$choice]" > $outFile echo "$items[$choice]" >$outFile
return return
end end
end end

View file

@ -1,96 +1,85 @@
{ lib, config, ... }: { lib, config, ... }:
let let
inherit (lib) inherit (lib) mkOption types;
mkOption cfg = config.valhalla;
types in {
; options = {
valhalla = {
software = let
inherit (cfg.software) coding common desktopExperience school server;
in {
essential = mkOption {
type = types.bool;
description = "A value indicating whether essentials should be installed.";
default = true;
};
cfg = config.valhalla; common = mkOption {
in { type = types.bool;
options = { description = "A value indicating whether common software should be installed.";
valhalla = { default = true;
software = };
let
inherit (cfg.software)
coding
common
desktopExperience
school
server
;
in {
essential = mkOption {
type = types.bool;
description = "A value indicating whether essentials should be installed.";
default = true;
};
common = mkOption { server = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether common software should be installed."; description = "A value indicating whether server applications should be installed.";
default = true; default = false;
}; };
server = mkOption { desktopExperience = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether server applications should be installed."; description = "A value indicating whether GUI apps should be installed.";
default = false; default = common && !server;
}; };
desktopExperience = mkOption { fileSync = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether GUI apps should be installed."; description = "A value indicating whether file syncs should be installed.";
default = common && !server; default = common && !server;
}; };
fileSync = mkOption { school = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether file syncs should be installed."; description = "A value indicating whether software for studies should be installed.";
default = common && !server; default = false;
}; };
school = mkOption { productivity = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether software for studies should be installed."; description = "A value indicating whether productivity apps should be installed.";
default = false; default = common || school;
}; };
productivity = mkOption { socialMedia = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether productivity apps should be installed."; description = "A value indicating whether social media apps should be installed.";
default = common || school; default = common && desktopExperience;
}; };
socialMedia = mkOption { media = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether social media apps should be installed."; description = "A value indicating whether media apps should be installed.";
default = common && desktopExperience; default = common && desktopExperience;
}; };
media = mkOption { gaming = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether media apps should be installed."; description = "A value indicating whether gaming apps should be installed.";
default = common && desktopExperience; default = common && desktopExperience;
}; };
gaming = mkOption { coding = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether gaming apps should be installed."; description = "A value indicating whether development apps should be installed.";
default = common && desktopExperience; default = common;
}; };
coding = mkOption { python = mkOption {
type = types.bool; type = types.bool;
description = "A value indicating whether development apps should be installed."; description = "A value indicating whether apps for coding python should be installed.";
default = common; default = coding;
}; };
python = mkOption {
type = types.bool;
description = "A value indicating whether apps for coding python should be installed.";
default = coding;
};
};
}; };
}; };
} };
}

View file

@ -1,90 +1,82 @@
{ lib, ... }: { lib, ... }:
let let
inherit (lib) inherit (lib) mkOption types;
mkOption
types
;
capitalize = (import ../text.nix { inherit lib; }).capitalize; capitalize = (import ../text.nix { inherit lib; }).capitalize;
userType = types.submodule ( userType = types.submodule (
{ ... } : { { ... }: {
options = { options = {
displayName = mkOption { displayName = mkOption {
type = types.nullOr types.str; type = types.nullOr types.str;
description = "The human-readable name of the user."; description = "The human-readable name of the user.";
default = null; default = null;
};
mailAddress = mkOption {
type = types.nullOr types.str;
description = "The mail address of the user.";
default = null;
};
groups = mkOption {
type = types.listOf types.str;
description = "The additional groups of the user.";
default = [];
};
};
});
linuxUserType = types.submodule (
{ ... }: {
options = {
defaultShell = mkOption {
type = types.nullOr types.str;
description = "The default shell of the user.";
default = null;
};
};
});
winUserType = types.submodule (
{ ... }: {
options = {
microsoftAccount = mkOption {
type = types.bool;
description = "A value indicating whether this user is a Microsoft Account.";
default = false;
};
};
});
in {
options = {
valhalla = {
users = mkOption {
type = types.attrsOf userType;
description = "The users to create on the machine.";
default = {};
}; };
linux.users = mkOption { mailAddress = mkOption {
type = types.attrsOf linuxUserType; type = types.nullOr types.str;
description = "The mail address of the user.";
default = null;
}; };
windows = mkOption { groups = mkOption {
type = types.submoduleWith { type = types.listOf types.str;
modules = [ description = "The additional groups of the user.";
({ config, options, ... }: { default = [ ];
options = { };
users = mkOption { };
type = types.attrsOf winUserType; });
};
winUsers = mkOption { linuxUserType = types.submodule (
type = options.users.type; { ... }: {
default = (lib.attrsets.concatMapAttrs ( options = {
name: options: { defaultShell = mkOption {
${capitalize name} = options; type = types.nullOr types.str;
}) config.users); description = "The default shell of the user.";
}; default = null;
};
};
});
winUserType = types.submodule (
{ ... }: {
options = {
microsoftAccount = mkOption {
type = types.bool;
description = "A value indicating whether this user is a Microsoft Account.";
default = false;
};
};
});
in {
options = {
valhalla = {
users = mkOption {
type = types.attrsOf userType;
description = "The users to create on the machine.";
default = { };
};
linux.users = mkOption { type = types.attrsOf linuxUserType; };
windows = mkOption {
type = types.submoduleWith {
modules = [
({ config, options, ... }: {
options = {
users = mkOption { type = types.attrsOf winUserType; };
winUsers = mkOption {
type = options.users.type;
default = (lib.attrsets.concatMapAttrs
(name: options: { ${capitalize name} = options; })
config.users);
}; };
}) };
]; })
}; ];
}; };
}; };
}; };
} };
}

View file

@ -1,83 +1,79 @@
{ lib, ... }: { lib, ... }:
let let inherit (lib) mkOption types;
inherit (lib) in {
mkOption imports = [
types ./hardware.nix
; ./i18n.nix
in { ./os.nix
imports = [ ./packages/git.nix
./hardware.nix ./packages/nextcloud.nix
./i18n.nix ./packages/oh-my-posh.nix
./os.nix ./packages/rclone.nix
./packages/git.nix ./partition.nix
./packages/nextcloud.nix ./software.nix
./packages/oh-my-posh.nix ./users.nix
./packages/rclone.nix ./windows.nix
./partition.nix ];
./software.nix
./users.nix
./windows.nix
];
options = { options = {
valhalla = { valhalla = {
boot = { boot = {
efiMountPoint = mkOption { efiMountPoint = mkOption {
type = types.str;
description = "The mountpoint of the efi partition.";
default = "/boot";
};
label = mkOption {
type = types.str;
description = "The label of the boot entry.";
default = "OS";
};
};
hostname = mkOption {
type = types.str; type = types.str;
description = "The hostname of the system."; description = "The mountpoint of the efi partition.";
default = "valhalla"; default = "/boot";
}; };
setupUser = { label = mkOption {
name = mkOption { type = types.str;
type = types.str; description = "The label of the boot entry.";
description = "The name of the user used to set up the system."; default = "OS";
default = "heimdall";
};
id = mkOption {
type = types.int;
description = "The UID of the user used to set up the system.";
default = 420;
};
};
timeZone = mkOption {
type = types.nullOr types.str;
description = "The time zone of the system.";
default = null;
};
keyMap = mkOption {
type = types.nullOr types.str;
description = "The console key map of the system.";
default = null;
};
keyboardLayout = mkOption {
type = types.nullOr types.str;
description = "The X11 keyboard layout of the system.";
default = null;
};
hidpi = mkOption {
type = types.bool;
description = "A value indicating whether the screen is hidpi.";
default = false;
}; };
}; };
hostname = mkOption {
type = types.str;
description = "The hostname of the system.";
default = "valhalla";
};
setupUser = {
name = mkOption {
type = types.str;
description = "The name of the user used to set up the system.";
default = "heimdall";
};
id = mkOption {
type = types.int;
description = "The UID of the user used to set up the system.";
default = 420;
};
};
timeZone = mkOption {
type = types.nullOr types.str;
description = "The time zone of the system.";
default = null;
};
keyMap = mkOption {
type = types.nullOr types.str;
description = "The console key map of the system.";
default = null;
};
keyboardLayout = mkOption {
type = types.nullOr types.str;
description = "The X11 keyboard layout of the system.";
default = null;
};
hidpi = mkOption {
type = types.bool;
description = "A value indicating whether the screen is hidpi.";
default = false;
};
}; };
} };
}

View file

@ -1,47 +1,40 @@
{ lib, config, ... }: { lib, config, ... }:
let let
inherit (lib) inherit (lib) mkDefault mkEnableOption mkIf mkOption types;
mkDefault capitalize = (import ../text.nix { inherit lib; }).capitalize;
mkEnableOption in {
mkIf options = {
mkOption valhalla = {
types windows = {
; dualboot = {
enable = mkEnableOption "dual boot";
capitalize = (import ../text.nix { inherit lib; }).capitalize; linuxPercentage = mkOption {
in { type = types.number;
options = { description = "The percentage of the disk size reserved for Linux.";
valhalla = {
windows = {
dualboot = {
enable = mkEnableOption "dual boot";
linuxPercentage = mkOption {
type = types.number;
description = "The percentage of the disk size reserved for Linux.";
};
}; };
showFileExt = mkOption {
type = types.bool;
description = "A value indicating whether file extensions should be displayed in Windows Explorer.";
default = true;
};
legacyIconSpacing = mkEnableOption "legacy icon spacing" // {
default = true;
};
dynamicLighting = mkEnableOption "dynamic lighting";
adware = mkEnableOption "adware"; # Fuck you for displaying ads on an OS I fricking paid for!
}; };
};
};
config = { showFileExt = mkOption {
valhalla.windows = { type = types.bool;
setupUser.name = mkDefault (capitalize config.valhalla.setupUser.name); description = "A value indicating whether file extensions should be displayed in Windows Explorer.";
dualboot.linuxPercentage = mkIf (!config.valhalla.windows.dualboot.enable) (mkDefault 0); default = true;
};
legacyIconSpacing = mkEnableOption "legacy icon spacing" // {
default = true;
};
dynamicLighting = mkEnableOption "dynamic lighting";
adware = mkEnableOption "adware"; # Fuck you for displaying ads on an OS I fricking paid for!
}; };
}; };
} };
config = {
valhalla.windows = {
setupUser.name = mkDefault (capitalize config.valhalla.setupUser.name);
dualboot.linuxPercentage = mkIf (!config.valhalla.windows.dualboot.enable) (mkDefault 0);
};
};
}

View file

@ -1,30 +1,30 @@
{ pkgs, fetchFromGitLab, ... }: pkgs.stdenv.mkDerivation ( { pkgs, fetchFromGitLab, ... }:
rec { pkgs.stdenv.mkDerivation (rec {
pname = "archiso"; pname = "archiso";
version = "79"; version = "79";
src = fetchFromGitLab { src = fetchFromGitLab {
domain = "gitlab.archlinux.org"; domain = "gitlab.archlinux.org";
owner = "archlinux"; owner = "archlinux";
repo = pname; repo = pname;
rev = "v${version}"; rev = "v${version}";
sha256 = "5YNzHz9QEK+0x7Qjd2ajyE6gV1gD1MyI0ojZnuafmaw="; sha256 = "5YNzHz9QEK+0x7Qjd2ajyE6gV1gD1MyI0ojZnuafmaw=";
}; };
dontPatchShebangs = true; dontPatchShebangs = true;
preInstall = "export PREFIX=$out"; preInstall = "export PREFIX=$out";
nativeBuildInputs = with pkgs; [ nativeBuildInputs = with pkgs; [
docutils docutils
git git
]; ];
propagatedBuildInputs = with pkgs; [ propagatedBuildInputs = with pkgs; [
arch-install-scripts arch-install-scripts
dosfstools dosfstools
libisoburn libisoburn
mtools mtools
pacman pacman
squashfsTools squashfsTools
]; ];
}) })

View file

@ -1,9 +1,7 @@
{ lib, ... }: { { lib, ... }: {
capitalize = text: capitalize = text:
let let chars = lib.strings.stringToCharacters text;
chars = lib.strings.stringToCharacters text; in lib.strings.concatStrings
in lib.strings.concatStrings ( ([ (lib.strings.toUpper (builtins.elemAt chars 0)) ]
[(lib.strings.toUpper (builtins.elemAt chars 0))] ++ ++ (lib.lists.drop 1 chars));
(lib.lists.drop 1 chars)
);
} }

View file

@ -1,7 +1,5 @@
{ lib, ... }: { { lib, ... }: {
imports = [ imports = [ ../defaults.nix ];
../defaults.nix
];
config = { config = {
valhalla = { valhalla = {
@ -18,7 +16,7 @@
users.manuel = { users.manuel = {
microsoftAccount = true; microsoftAccount = true;
groups = ["Administrators"]; groups = [ "Administrators" ];
}; };
}; };
@ -31,7 +29,7 @@
label = "OS"; label = "OS";
format = "ntfs"; format = "ntfs";
mountPoint = "/win"; mountPoint = "/win";
mountOptions = ["force"]; mountOptions = [ "force" ];
keepExisting = true; keepExisting = true;
}; };
}; };

View file

@ -1,7 +1,5 @@
{ ... }: { { ... }: {
imports = [ imports = [ ../config.nix ];
../config.nix
];
config = { config = {
valhalla.boot.label = "Arch"; valhalla.boot.label = "Arch";

View file

@ -1,95 +1,89 @@
{ lib, config, ... }: { lib, config, ... }:
let let fs = import ../../../../lib/modules/partition/fs.nix;
fs = import ../../../../lib/modules/partition/fs.nix; in {
in { imports = [ ../defaults.nix ];
imports = [
../defaults.nix
];
config = { config = {
valhalla = { valhalla = {
partition = { partition = {
os = { os = {
partitions = { partitions = {
Boot = { Boot = {
index = 1; index = 1;
type = "uefi"; type = "uefi";
size = "+1G"; size = "+1G";
format = fs.fat32; format = fs.fat32;
mountPoint = config.valhalla.boot.efiMountPoint; mountPoint = config.valhalla.boot.efiMountPoint;
}; };
Swap = { Swap = {
index = 2; index = 2;
type = "swap"; type = "swap";
}; };
OS = { OS = {
index = 3; index = 3;
label = lib.mkDefault config.valhalla.boot.label; label = lib.mkDefault config.valhalla.boot.label;
type = "linux"; type = "linux";
format = fs.ext4; format = fs.ext4;
mountPoint = "/"; mountPoint = "/";
};
}; };
}; };
}; };
};
timeZone = "Europe/Zurich"; timeZone = "Europe/Zurich";
keyMap = "de_CH-latin1"; keyMap = "de_CH-latin1";
keyboardLayout = "ch"; keyboardLayout = "ch";
i18n = { i18n = {
localeSettings = localeSettings = let defaultLocale = "en_US.UTF-8";
let defaultLocale = "en_US.UTF-8"; in {
in { LANG = "de_CH.UTF-8";
LANG = "de_CH.UTF-8"; LANGUAGE = defaultLocale;
LANGUAGE = defaultLocale; LC_MESSAGE = defaultLocale;
LC_MESSAGE = defaultLocale; };
}; };
git = let defaultBranch = "main";
in {
inherit defaultBranch;
flow = {
mainBranch = defaultBranch;
devBranch = "dev";
}; };
git = aliases = {
let ahfange = "init";
defaultBranch = "main"; tuedezue = "add";
in { beschuldig = "blame";
inherit defaultBranch; zieh = "pull";
druck = "push";
flow = { machnah = "clone";
mainBranch = defaultBranch; hol = "fetch";
devBranch = "dev"; zwiigab = "branch";
}; buechiih = "commit";
eich = "rebase";
aliases = { erd = "rebase";
ahfange = "init"; gahufwiifelde = "rebase";
tuedezue = "add"; vergliich = "diff";
beschuldig = "blame"; tuezemme = "merge";
zieh = "pull"; versorg = "stash";
druck = "push"; markier = "tag";
machnah = "clone"; pflueckoepfel = "cherry-pick";
hol = "fetch"; pflueckhimbeeri = "cherry-pick";
zwiigab = "branch"; buechuus = "checkout";
buechiih = "commit"; quaetsch = "merge --squash";
eich = "rebase"; pfudle = "push --force";
erd = "rebase"; beschuldigung = "blame";
gahufwiifelde = "rebase"; zwiigli = "branch";
vergliich = "diff"; tagebuech = "log";
tuezemme = "merge"; versteck = "stash";
versorg = "stash"; zuestand = "status";
markier = "tag"; markierig = "tag";
pflueckoepfel = "cherry-pick"; };
pflueckhimbeeri = "cherry-pick";
buechuus = "checkout";
quaetsch = "merge --squash";
pfudle = "push --force";
beschuldigung = "blame";
zwiigli = "branch";
tagebuech = "log";
versteck = "stash";
zuestand = "status";
markierig = "tag";
};
};
}; };
}; };
} };
}

View file

@ -1,5 +1,3 @@
{ ... }: { { ... }: {
imports = [ imports = [ ../config.nix ];
../config.nix
];
} }

View file

@ -1,7 +1,5 @@
{ ... }: { { ... }: {
imports = [ imports = [ ../Generic/Arch/config.nix ];
../Generic/Arch/config.nix
];
config = { config = {
valhalla = { valhalla = {
@ -13,9 +11,7 @@
surfaceBook = true; surfaceBook = true;
xoneReceiver = true; xoneReceiver = true;
components = [ components = [ "Logitech G903" ];
"Logitech G903"
];
}; };
partition.os.deviceName = "nvme0n1"; partition.os.deviceName = "nvme0n1";

View file

@ -1,7 +1,5 @@
{ ... }: { { ... }: {
imports = [ imports = [ ../../../lib/modules/valhalla.nix ];
../../../lib/modules/valhalla.nix
];
config = { config = {
valhalla = { valhalla = {
@ -40,21 +38,20 @@
windows.users.manuel = { windows.users.manuel = {
nextcloud = { nextcloud = {
folderSyncs = folderSyncs = let
let localPath = "C:/tools/RetroArch-Win64";
localPath = "C:/tools/RetroArch-Win64"; remotePath = "/Saved Games/RetroArch";
remotePath = "/Saved Games/RetroArch"; in [
in [ {
{ remotePath = "${remotePath}/Saves";
remotePath = "${remotePath}/Saves"; localPath = "${localPath}/saves";
localPath = "${localPath}/saves"; virtualFiles = false;
virtualFiles = false; }
} {
{ remotePath = "${remotePath}/System";
remotePath = "${remotePath}/System"; localPath = "${localPath}/system";
localPath = "${localPath}/system"; }
} ];
];
}; };
}; };
}; };

View file

@ -4,7 +4,7 @@ begin
source "$dir/../../Scripts/software.fish" source "$dir/../../Scripts/software.fish"
function installSW -V dir function installSW -V dir
set -l repo "linux-surface" set -l repo linux-surface
set -l file "/etc/pacman.conf" set -l file "/etc/pacman.conf"
curl -s https://raw.githubusercontent.com/linux-surface/linux-surface/master/pkg/keys/surface.asc \ curl -s https://raw.githubusercontent.com/linux-surface/linux-surface/master/pkg/keys/surface.asc \
@ -19,7 +19,7 @@ begin
"" \ "" \
"[$repo]" \ "[$repo]" \
"Server = https://pkg.surfacelinux.com/arch/" "Server = https://pkg.surfacelinux.com/arch/"
end | sudo tee -a $file > /dev/null end | sudo tee -a $file >/dev/null
sudo pacinst sudo pacinst

View file

@ -14,7 +14,7 @@ begin
printf %s\n \ printf %s\n \
"# vim:set ft=sh" \ "# vim:set ft=sh" \
"MODULES+=(pinctrl_sunrisepoint surface_dtx)" "MODULES+=(pinctrl_sunrisepoint surface_dtx)"
end | sudo tee /etc/mkinitcpio.conf.d/surface-book-2.conf > /dev/null end | sudo tee /etc/mkinitcpio.conf.d/surface-book-2.conf >/dev/null
fish "$dir/../../../Common/Drivers/SurfaceBook2/main.fish" configure fish "$dir/../../../Common/Drivers/SurfaceBook2/main.fish" configure
sudo systemctl enable surface-dtx-daemon.service sudo systemctl enable surface-dtx-daemon.service

View file

@ -3,7 +3,7 @@ begin
set -l dir (status dirname) set -l dir (status dirname)
function getDeploymentScript -V dir function getDeploymentScript -V dir
echo "$dir/../Scripts/deploy.fish"; echo "$dir/../Scripts/deploy.fish"
end end
function initialize -V dir function initialize -V dir

View file

@ -14,7 +14,7 @@ begin
function installDrivers -S function installDrivers -S
if isOSEnabled hardware.surfaceBook if isOSEnabled hardware.surfaceBook
pacstrap -K "$mountDir" linux-firmware-marvell; pacstrap -K "$mountDir" linux-firmware-marvell
end end
end end
@ -51,7 +51,7 @@ begin
man-pages \ man-pages \
texinfo texinfo
and genfstab -U "$mountDir" >> "$mountDir/etc/fstab" and genfstab -U "$mountDir" >>"$mountDir/etc/fstab"
and arch-chroot "$mountDir" systemctl enable NetworkManager and arch-chroot "$mountDir" systemctl enable NetworkManager
and if set -q timezone and if set -q timezone
@ -72,13 +72,13 @@ begin
and begin and begin
getOSConfig i18n.localeSettings --json | \ getOSConfig i18n.localeSettings --json | \
jq --raw-output '[keys[] as $key | "\($key)=\(.[$key])"] | join("\n")' jq --raw-output '[keys[] as $key | "\($key)=\(.[$key])"] | join("\n")'
end | arch-chroot "$mountDir" tee /etc/locale.conf > /dev/null end | arch-chroot "$mountDir" tee /etc/locale.conf >/dev/null
and if set -q keyMap and if set -q keyMap
echo "KEYMAP=$keyMap" | arch-chroot "$mountDir" tee /etc/vconsole.conf > /dev/null echo "KEYMAP=$keyMap" | arch-chroot "$mountDir" tee /etc/vconsole.conf >/dev/null
end end
and echo (getOSConfig hostname) | arch-chroot "$mountDir" tee /etc/hostname > /dev/null and echo (getOSConfig hostname) | arch-chroot "$mountDir" tee /etc/hostname >/dev/null
and arch-chroot "$mountDir" mkinitcpio -P and arch-chroot "$mountDir" mkinitcpio -P
and runHook installDrivers "Installing drivers..." || true and runHook installDrivers "Installing drivers..." || true
@ -105,7 +105,7 @@ begin
"[Service]" \ "[Service]" \
"ExecStart=" \ "ExecStart=" \
"ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --autologin root %I \$TERM" "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 "$file" >/dev/null
end end
if not type -q getInstallerScript if not type -q getInstallerScript

View file

@ -3,7 +3,7 @@ function deploySoftware -d "Deploys a the specified software action" -a action
. "$dir/software.fish" . "$dir/software.fish"
if [ -z "$action" ] if [ -z "$action" ]
set action "install" set action install
end end
set -l isInstall ( set -l isInstall (

View file

@ -14,7 +14,7 @@ begin
set -l indicator "$pattern$patch" set -l indicator "$pattern$patch"
set -l file /usr/share/applications/pennywise.desktop set -l file /usr/share/applications/pennywise.desktop
if ! grep "$indicator" "$file" > /dev/null if ! grep "$indicator" "$file" >/dev/null
sudo sed -i "/$pattern/s/$pattern/\0 --no-sandbox/" "$file" sudo sed -i "/$pattern/s/$pattern/\0 --no-sandbox/" "$file"
end end
end end

View file

@ -16,7 +16,7 @@ begin
printf %s\n \ printf %s\n \
"OPTIONS+=(!debug)" \ "OPTIONS+=(!debug)" \
"MAKEFLAGS=\"-j\$(nproc)\"" "MAKEFLAGS=\"-j\$(nproc)\""
end | sudo tee "$customFile" > /dev/null end | sudo tee "$customFile" >/dev/null
end end
end end

View file

@ -11,7 +11,7 @@ begin
if not type -q logo-ls if not type -q logo-ls
begin begin
pushd "$contextRoot" > /dev/null pushd "$contextRoot" >/dev/null
yay -G -f "$pkgName" yay -G -f "$pkgName"
cd "$pkgName" cd "$pkgName"
cp "$dirName/$patchName" . cp "$dirName/$patchName" .
@ -27,7 +27,7 @@ begin
PKGBUILD PKGBUILD
makepkg --noconfirm -si --force makepkg --noconfirm -si --force
popd > /dev/null popd >/dev/null
end end
rm -rf "$contextRoot" rm -rf "$contextRoot"

View file

@ -18,8 +18,8 @@ begin
' if [ "${HOOKS[i]}" = "kms" ]; then' \ ' if [ "${HOOKS[i]}" = "kms" ]; then' \
' unset "HOOKS[i]"' \ ' unset "HOOKS[i]"' \
" fi" \ " fi" \
"done" done
end | sudo tee /etc/mkinitcpio.conf.d/nvidia.conf > /dev/null end | sudo tee /etc/mkinitcpio.conf.d/nvidia.conf >/dev/null
fish "$dir/../../../Common/Software/nvidia-dkms/main.fish" configure fish "$dir/../../../Common/Software/nvidia-dkms/main.fish" configure
end end

View file

@ -16,7 +16,7 @@ begin
printf %s\n \ printf %s\n \
"#!/bin/bash" \ "#!/bin/bash" \
'export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"' 'export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"'
end | sudo tee "/etc/profile.d/openssh.sh" > /dev/null end | sudo tee "/etc/profile.d/openssh.sh" >/dev/null
end end
runInstaller $argv runInstaller $argv

View file

@ -16,7 +16,7 @@ begin
printf %s\n \ printf %s\n \
"#!/bin/bash" \ "#!/bin/bash" \
"export STEAM_FORCE_DESKTOPUI_SCALING=2.0" "export STEAM_FORCE_DESKTOPUI_SCALING=2.0"
end | sudo tee /etc/profile.d/steam.sh > /dev/null end | sudo tee /etc/profile.d/steam.sh >/dev/null
end end
end end

View file

@ -8,7 +8,7 @@ begin
end end
function configureSW function configureSW
echo "%wheel ALL=(ALL:ALL) ALL" | sudo tee /etc/sudoers.d/wheel > /dev/null echo "%wheel ALL=(ALL:ALL) ALL" | sudo tee /etc/sudoers.d/wheel >/dev/null
end end
runInstaller $argv runInstaller $argv

View file

@ -11,7 +11,7 @@ begin
set homeDir ~"$user" set homeDir ~"$user"
set flags -u "$user" set flags -u "$user"
else else
set homeDir "/etc/skel" set homeDir /etc/skel
end end
for bin in $bins for bin in $bins
@ -19,7 +19,7 @@ begin
begin begin
set -l file "$homeDir/.config/$bin-flags.conf" set -l file "$homeDir/.config/$bin-flags.conf"
sudo $flags mkdir -p (dirname "$file") sudo $flags mkdir -p (dirname "$file")
echo "--touch-events" | sudo $flags tee "$file" > /dev/null echo --touch-events | sudo $flags tee "$file" >/dev/null
end end
end end
end end

View file

@ -5,15 +5,15 @@ begin
function installSW function installSW
yayinst ( yayinst (
# Waydroid prerequisite: https://wiki.archlinux.org/title/Waydroid#DKMS_modules # Waydroid prerequisite: https://wiki.archlinux.org/title/Waydroid#DKMS_modules
) binder_linux-dkms \ ) binder_linux-dkms \
waydroid ( waydroid (
# For installing ARM suppot on waydroid # For installing ARM suppot on waydroid
) waydroid-script-git ( ) waydroid-script-git (
# Clipboard support: https://wiki.archlinux.org/title/Waydroid#Failed_to_start_Clipboard_manager_service # Clipboard support: https://wiki.archlinux.org/title/Waydroid#Failed_to_start_Clipboard_manager_service
) python-pyclip ( ) python-pyclip (
# Wayland clipboard support: https://github.com/spyoungtech/pyclip?tab=readme-ov-file#linux # Wayland clipboard support: https://github.com/spyoungtech/pyclip?tab=readme-ov-file#linux
) wl-clipboard ) wl-clipboard
end end
runInstaller $argv runInstaller $argv

View file

@ -8,14 +8,14 @@ begin
set -l repo https://github.com/manuth/xone.git set -l repo https://github.com/manuth/xone.git
yayinst cabextract yayinst cabextract
if not dkms status --all | grep xone > /dev/null if not dkms status --all | grep xone >/dev/null
git clone "$repo" "$contextRoot" git clone "$repo" "$contextRoot"
sudo env -C "$contextRoot" ./install.sh --release sudo env -C "$contextRoot" ./install.sh --release
sudo chmod -R a+rx /usr/src/xone* sudo chmod -R a+rx /usr/src/xone*
yes "" | sudo xone-get-firmware.sh yes "" | sudo xone-get-firmware.sh
end end
rm -rf "$contextRoot" > /dev/null rm -rf "$contextRoot" >/dev/null
end end
runInstaller $argv runInstaller $argv

View file

@ -9,9 +9,9 @@ begin
pacinst git pacinst git
git clone https://aur.archlinux.org/yay.git "$contextRoot" git clone https://aur.archlinux.org/yay.git "$contextRoot"
pushd "$contextRoot" > /dev/null pushd "$contextRoot" >/dev/null
makepkg --noconfirm -si makepkg --noconfirm -si
popd > /dev/null popd >/dev/null
rm -rf "$contextRoot" rm -rf "$contextRoot"
end end

View file

@ -8,23 +8,22 @@ if [ (id -u) -eq 0 ]
set -l sudoConfig "/etc/sudoers.d/PortValhalla" set -l sudoConfig "/etc/sudoers.d/PortValhalla"
rm ~/.bash_profile rm ~/.bash_profile
runHook createUser || \ runHook createUser || begin
begin echo "Creating setup user"
echo "Creating setup user";
and useradd \ and useradd \
--comment "PortValhalla Setup User" \ --comment "PortValhalla Setup User" \
--system \ --system \
--no-user-group \ --no-user-group \
--groups nix-users \ --groups nix-users \
--create-home \ --create-home \
--uid (getOSConfig setupUser.id --json) \ --uid (getOSConfig setupUser.id --json) \
"$name" "$name"
end end
and begin and begin
echo "$name ALL=(ALL:ALL) NOPASSWD: ALL" echo "$name ALL=(ALL:ALL) NOPASSWD: ALL"
end > "$sudoConfig" end >"$sudoConfig"
and sudo --preserve-env --set-home --user "$name" "$INSTALLER_SCRIPT" and sudo --preserve-env --set-home --user "$name" "$INSTALLER_SCRIPT"
rm "$sudoConfig" rm "$sudoConfig"

View file

@ -36,8 +36,8 @@ function runSetup
end end
function runInOS -S function runInOS -S
set -l script "/root/run_once" set -l script /root/run_once
wrapScript $argv | chroot "$mountDir" tee "$script" > /dev/null wrapScript $argv | chroot "$mountDir" tee "$script" >/dev/null
and runChroot "$mountDir" chmod +x "$script" and runChroot "$mountDir" chmod +x "$script"
and runChroot "$mountDir" "$script" and runChroot "$mountDir" "$script"
and runChroot "$mountDir" rm "$script" and runChroot "$mountDir" rm "$script"
@ -50,7 +50,7 @@ function runSetup
end end
echo "Partitioning drives..." echo "Partitioning drives..."
and getOSConfig partition.script > "$script" and getOSConfig partition.script >"$script"
and "$script" and "$script"
and rm "$script" and rm "$script"
@ -83,7 +83,7 @@ function runSetup
"CONFIG_NAME=$(string escape "$CONFIG_NAME")" \ "CONFIG_NAME=$(string escape "$CONFIG_NAME")" \
(string escape $script)) (string escape $script))
end | runChroot "$mountDir" tee /root/.bash_profile > /dev/null end | runChroot "$mountDir" tee /root/.bash_profile >/dev/null
and echo "Setup finished!" and echo "Setup finished!"
and echo "This machine will reboot in 5 seconds..." and echo "This machine will reboot in 5 seconds..."

View file

@ -12,7 +12,7 @@ for name in (echo "$users" | jq '.[]' --raw-output0 | string split0)
getUserConfig "$name" "$config" $argv[2..] getUserConfig "$name" "$config" $argv[2..]
end end
set -l groups (getUserInfo groups --apply 'builtins.concatStringsSep ","'); set -l groups (getUserInfo groups --apply 'builtins.concatStringsSep ","')
set -l displayName (getUserInfo displayName --json) set -l displayName (getUserInfo displayName --json)
set -l shell (getUserInfo defaultShell --json) set -l shell (getUserInfo defaultShell --json)
@ -28,7 +28,7 @@ for name in (echo "$users" | jq '.[]' --raw-output0 | string split0)
end end
) "$name" ) "$name"
if echo "$shell" | jq --exit-status > /dev/null if echo "$shell" | jq --exit-status >/dev/null
sudo chsh "$name" --shell (which (echo "$shell" | jq --raw-output)) sudo chsh "$name" --shell (which (echo "$shell" | jq --raw-output))
end end

View file

@ -82,7 +82,8 @@ $null = New-Module {
} }
return $false; return $false;
} else { }
else {
return $true; return $true;
} }
}; };
@ -145,7 +146,8 @@ $null = New-Module {
if ($ButtonSelector -is [string]) { if ($ButtonSelector -is [string]) {
$selector = [OpenQA.Selenium.By]::CssSelector($ButtonSelector); $selector = [OpenQA.Selenium.By]::CssSelector($ButtonSelector);
} else { }
else {
$selector = $ButtonSelector; $selector = $ButtonSelector;
} }
@ -156,7 +158,8 @@ $null = New-Module {
if ($element) { if ($element) {
break; break;
} else { }
else {
Start-Sleep 1; Start-Sleep 1;
} }
} }
@ -167,7 +170,8 @@ $null = New-Module {
if ($element) { if ($element) {
$Browser.FindElement($selector).Click(); $Browser.FindElement($selector).Click();
} else { }
else {
Write-Error "Unable to find download button!"; Write-Error "Unable to find download button!";
} }
}; };

View file

@ -16,7 +16,8 @@ $null = New-Module {
$profiles = & { $profiles = & {
if (-not $IsWindows -or (Test-Command "wsl")) { if (-not $IsWindows -or (Test-Command "wsl")) {
return Invoke-ConfigScript "getProfiles"; return Invoke-ConfigScript "getProfiles";
} else { }
else {
return Get-ChildItem "$PSScriptRoot/../../../.config" | ForEach-Object { Split-Path -LeafBase $_ }; return Get-ChildItem "$PSScriptRoot/../../../.config" | ForEach-Object { Split-Path -LeafBase $_ };
} }
}; };
@ -36,7 +37,8 @@ $null = New-Module {
"Which profile do you wish to set up?"; "Which profile do you wish to set up?";
} }
} }
} else { }
else {
"Please select a profile:"; "Please select a profile:";
} }
}), }),
@ -51,7 +53,8 @@ $null = New-Module {
if ($choice -eq $profiles.Count) { if ($choice -eq $profiles.Count) {
exit; exit;
} else { }
else {
$env:CONFIG_NAME = $profiles[$choice]; $env:CONFIG_NAME = $profiles[$choice];
} }
} }
@ -75,7 +78,8 @@ $null = New-Module {
if (-not $IsWindows) { if (-not $IsWindows) {
$escapedPath = (fish -c 'string escape $argv' "$scriptPath"); $escapedPath = (fish -c 'string escape $argv' "$scriptPath");
fish -c ". $escapedPath; $Script"; fish -c ". $escapedPath; $Script";
} else { }
else {
if (-not $env:VALHALLA_FLAKE_ROOT) { if (-not $env:VALHALLA_FLAKE_ROOT) {
$cleanup = { }; $cleanup = { };
$projectRoot = "$PSScriptRoot/../../.."; $projectRoot = "$PSScriptRoot/../../..";
@ -98,18 +102,21 @@ $null = New-Module {
if (-not $?) { if (-not $?) {
Write-Error "The configuration could not be retrieved!"; Write-Error "The configuration could not be retrieved!";
} else { }
else {
$output; $output;
} }
} }
} };
if (-not ($output -and ($output | Test-Json))) { if (-not ($output -and ($output | Test-Json))) {
Write-Error "The value ``$output`` is not valid JSON."; Write-Error "The value ``$output`` is not valid JSON.";
} else { }
else {
$output | ConvertFrom-Json; $output | ConvertFrom-Json;
} }
} else { }
else {
$null; $null;
} }
} }
@ -189,7 +196,8 @@ $null = New-Module {
if ((Get-Users) -contains $UserName) { if ((Get-Users) -contains $UserName) {
Get-Config "$(Get-UserConfigRoot).$UserName.$Name"; Get-Config "$(Get-UserConfigRoot).$UserName.$Name";
} else { }
else {
return $null; return $null;
} }
} }

View file

@ -21,17 +21,18 @@ $null = New-Module {
$modules = @( $modules = @(
@("PSScriptAnalyzer") @("PSScriptAnalyzer")
) + (& { ) + (& {
if (-not $IsWindows) { if (-not $IsWindows) {
@() @();
} else { }
@( else {
@("KnownFolders"), @(
@("PSWindowsUpdate"), @("KnownFolders"),
@("LocalAccounts", $true), @("PSWindowsUpdate"),
@("NuGet") @("LocalAccounts", $true),
) @("NuGet")
} );
}); }
});
for ($i = 0; $i -lt $modules.Count; $i++) { for ($i = 0; $i -lt $modules.Count; $i++) {
if ($modules[$i] -is [string]) { if ($modules[$i] -is [string]) {
@ -185,7 +186,7 @@ $null = New-Module {
$command = $args[0]; $command = $args[0];
$flags = ($args | Select-Object -Skip 1); $flags = ($args | Select-Object -Skip 1);
& $command @flags; & $command @flags;
} -args $ArgumentList } -args $ArgumentList;
} }
New-Alias -Force "sudo" -Scope Global Invoke-Sudo; New-Alias -Force "sudo" -Scope Global Invoke-Sudo;
@ -284,12 +285,13 @@ $null = New-Module {
$initialized = $true; $initialized = $true;
} }
} };
} }
if ($taskPending) { if ($taskPending) {
Start-OneShot; Start-OneShot;
} else { }
else {
& $Action; & $Action;
} }

View file

@ -33,19 +33,19 @@ function ConvertTo-Injection {
#> #>
function Write-PSScript { function Write-PSScript {
param( param(
[Parameter(Mandatory=$true)] [Parameter(Mandatory = $true)]
[Parameter(ParameterSetName="Common")] [Parameter(ParameterSetName = "Common")]
[Parameter(ParameterSetName="Replace")] [Parameter(ParameterSetName = "Replace")]
[Parameter(ParameterSetName="Append")] [Parameter(ParameterSetName = "Append")]
[string] $FileName, [string] $FileName,
[Parameter(Mandatory=$true)] [Parameter(Mandatory = $true)]
[Parameter(ParameterSetName="Common")] [Parameter(ParameterSetName = "Common")]
[Parameter(ParameterSetName="Replace")] [Parameter(ParameterSetName = "Replace")]
[Parameter(ParameterSetName="Append")] [Parameter(ParameterSetName = "Append")]
[string] $Script, [string] $Script,
[Parameter(ParameterSetName="Replace", Mandatory=$true)] [Parameter(ParameterSetName = "Replace", Mandatory = $true)]
[switch] $Replace, [switch] $Replace,
[Parameter(ParameterSetName="Append", Mandatory=$true)] [Parameter(ParameterSetName = "Append", Mandatory = $true)]
[switch] $Append [switch] $Append
) )
@ -61,10 +61,12 @@ function Write-PSScript {
if ($exists -and ($Append.IsPresent)) { if ($exists -and ($Append.IsPresent)) {
Add-Content -Force $FileName "`n$content"; Add-Content -Force $FileName "`n$content";
} else { }
else {
if ((-not $exists) -or $Replace.IsPresent) { if ((-not $exists) -or $Replace.IsPresent) {
Set-Content -Force $FileName $content; Set-Content -Force $FileName $content;
} else { }
else {
Write-Host "The file ``$FileName`` already exists!"; Write-Host "The file ``$FileName`` already exists!";
} }
} }

View file

@ -25,7 +25,8 @@ $null = New-Module {
[InstallerAction] $Action = & { [InstallerAction] $Action = & {
if ($null -ne $Action) { if ($null -ne $Action) {
$Action; $Action;
} else { }
else {
[InstallerAction]::Install; [InstallerAction]::Install;
} }
}; };
@ -47,7 +48,8 @@ $null = New-Module {
if ($null -ne $Name) { if ($null -ne $Name) {
$DisplayName = "``$Name``"; $DisplayName = "``$Name``";
} else { }
else {
$DisplayName = "unknown software"; $DisplayName = "unknown software";
} }
@ -55,14 +57,14 @@ $null = New-Module {
$Context ??= @{ }; $Context ??= @{ };
$argumentList = @{ $argumentList = @{
name = $Name; name = $Name;
installer = $installHandler; installer = $installHandler;
arguments = $Arguments; arguments = $Arguments;
context = $Context; context = $Context;
}; };
switch ($Action) { switch ($Action) {
([InstallerAction]::Backup) { ([InstallerAction]::Backup) {
if ($Backup) { if ($Backup) {
Write-Host "Backing up $DisplayName"; Write-Host "Backing up $DisplayName";
& $Backup @argumentList; & $Backup @argumentList;

View file

@ -6,7 +6,7 @@ end
function selectProfile -S -a result function selectProfile -S -a result
source "$(status dirname)/../../../lib/modules/partition/select.fish" source "$(status dirname)/../../../lib/modules/partition/select.fish"
set -l file (mktemp) set -l file (mktemp)
set -l header "NAME" set -l header NAME
set -l profiles set -l profiles
getProfiles | jq ".[]" --raw-output0 | string split0 | while read profile getProfiles | jq ".[]" --raw-output0 | string split0 | while read profile
@ -23,7 +23,7 @@ function selectProfile -S -a result
end end
function getProfiles -S function getProfiles -S
source "$(status dirname)/eval-flake.fish"; source "$(status dirname)/eval-flake.fish"
evalFlake "" "" --apply "builtins.attrNames" --json evalFlake "" "" --apply "builtins.attrNames" --json
end end
@ -48,12 +48,12 @@ function getUsers -S
getAttributes "$(getOSConfigRoot).users" getAttributes "$(getOSConfigRoot).users"
end end
function getUserConfig -S -a name property function getUserConfig -S -a name property
getOSConfig "users.$name.$property" $argv[3..] getOSConfig "users.$name.$property" $argv[3..]
end end
function isSet -S -a property function isSet -S -a property
not test "$(getConfig "$property" --json)" = "null" not test "$(getConfig "$property" --json)" = null
end end
function isOSSet -S -a property function isOSSet -S -a property
@ -65,7 +65,7 @@ function isUserSet -S -a name property
end end
function isEnabled -S -a property function isEnabled -S -a property
getConfig "$property" --json | jq --exit-status > /dev/null getConfig "$property" --json | jq --exit-status >/dev/null
end end
function isOSEnabled -S -a property function isOSEnabled -S -a property

View file

@ -1,8 +1,8 @@
#!/bin/env fish #!/bin/env fish
function evalFlake --argument-names config property function evalFlake --argument-names config property
set -l argv $argv[3..] set -l argv $argv[3..]
set -l flakePath "$(realpath (status dirname))/../../.."; set -l flakePath "$(realpath (status dirname))/../../.."
argparse --ignore-unknown "apply=" "json" -- $argv argparse --ignore-unknown "apply=" json -- $argv
if [ -z "$_flag_json" ] if [ -z "$_flag_json" ]
set -a argv --raw set -a argv --raw
@ -24,7 +24,7 @@ function evalFlake --argument-names config property
end end
PROPERTY="$property" \ PROPERTY="$property" \
nix eval --impure --extra-experimental-features "nix-command flakes" \ nix eval --impure --extra-experimental-features "nix-command flakes" \
--apply "$_flag_apply" \ --apply "$_flag_apply" \
"$flakePath#valhalla$config" \ "$flakePath#valhalla$config" \
$argv $argv

View file

@ -20,7 +20,7 @@ begin
"#!$shellBin" \ "#!$shellBin" \
"# $title" \ "# $title" \
(processContent "$content") (processContent "$content")
end > "$file" end >"$file"
sudo install -Dm755 "$file" "$profileRoot/$name.$extension" sudo install -Dm755 "$file" "$profileRoot/$name.$extension"
end end

View file

@ -19,23 +19,23 @@ begin
function runInstallerAction -V dir -a name action function runInstallerAction -V dir -a name action
source "$dir/config.fish" source "$dir/config.fish"
if [ -z "$action" ] || [ "$action" = "install" ] if [ -z "$action" ] || [ "$action" = install ]
if functions -q installSW if functions -q installSW
echo "Installing `$name`..." echo "Installing `$name`..."
installSW $argv[3..] installSW $argv[3..]
end end
runInstallerAction $name "configure" runInstallerAction $name configure
if not isConfigured || [ "$USER" != (getConfig "valhalla.setupUser.name") ] if not isConfigured || [ "$USER" != (getConfig "valhalla.setupUser.name") ]
runInstallerAction $name userConfig runInstallerAction $name userConfig
end end
else if [ "$action" = "configure" ] else if [ "$action" = configure ]
if functions -q configureSW if functions -q configureSW
echo "Configuring `$name`..." echo "Configuring `$name`..."
configureSW $argv[3..] configureSW $argv[3..]
end end
else if [ "$action" = "userConfig" ] else if [ "$action" = userConfig ]
set -l user $argv[3] set -l user $argv[3]
if [ -z "$user" ] if [ -z "$user" ]

View file

@ -6,7 +6,7 @@ function waitNetwork -a witness
function testNetwork function testNetwork
# Ping digitalcourage DNS server # Ping digitalcourage DNS server
# https://digitalcourage.de/ # https://digitalcourage.de/
ping -q -c1 5.9.164.112 > /dev/null ping -q -c1 5.9.164.112 >/dev/null
end end
if [ -z "$witness" ] if [ -z "$witness" ]
@ -16,7 +16,7 @@ function waitNetwork -a witness
set -l pid "$last_pid" set -l pid "$last_pid"
function witnessHandler -V codeFile --on-process-exit "$pid" -a event pid code function witnessHandler -V codeFile --on-process-exit "$pid" -a event pid code
echo "$code" > "$codeFile" echo "$code" >"$codeFile"
if [ "$code" -gt 0 ] if [ "$code" -gt 0 ]
echo "Unable to connect to the internet!" echo "Unable to connect to the internet!"
@ -34,13 +34,13 @@ function waitNetwork -a witness
set x (math $x + 1) set x (math $x + 1)
if testNetwork if testNetwork
tmux kill-session &> /dev/null tmux kill-session &>/dev/null
break break
else else
not tmux list-sessions &> /dev/null not tmux list-sessions &>/dev/null
or test "$x" -gt 10 or test "$x" -gt 10
and begin and begin
tmux kill-session &> /dev/null tmux kill-session &>/dev/null
exit 1 exit 1
end end
end end

View file

@ -1,23 +1,23 @@
function installExtension -d "Installs a Chromium extension for the browser with the specified information" -a name dir bin policyDir extensionDir function installExtension -d "Installs a Chromium extension for the browser with the specified information" -a name dir bin policyDir extensionDir
[ -n "$bin" ] [ -n "$bin" ]
or set -l bin "google-chrome-stable" or set -l bin google-chrome-stable
[ -n "$policyDir" ] [ -n "$policyDir" ]
or set -l policyDir "/opt/google/chrome/extensions" or set -l policyDir /opt/google/chrome/extensions
[ -n "$extensionDir" ] [ -n "$extensionDir" ]
or set -l extensionDir "/usr/local/share/chromium-extensions" or set -l extensionDir /usr/local/share/chromium-extensions
set -l keyFile "$dir.pem" set -l keyFile "$dir.pem"
set -l extensionFile "$dir.crx" set -l extensionFile "$dir.crx"
set -l manifestFile "$dir/manifest.json" set -l manifestFile "$dir/manifest.json"
set -l destination "$extensionDir/$name.crx" set -l destination "$extensionDir/$name.crx"
rm "$keyFile" &> /dev/null rm "$keyFile" &>/dev/null
$bin --pack-extension="$dir" $bin --pack-extension="$dir"
# Tamper manifest file # Tamper manifest file
begin begin
set -l manifest (cat "$manifestFile" | KEY=(openssl rsa -in "$keyFile" -pubout -outform DER | openssl base64 -A) jq ". + { key: env.KEY }") set -l manifest (cat "$manifestFile" | KEY=(openssl rsa -in "$keyFile" -pubout -outform DER | openssl base64 -A) jq ". + { key: env.KEY }")
echo "$manifest" > "$manifestFile" echo "$manifest" >"$manifestFile"
$bin --pack-extension="$dir" --pack-extension-key="$keyFile" $bin --pack-extension="$dir" --pack-extension-key="$keyFile"
end end
@ -26,7 +26,7 @@ function installExtension -d "Installs a Chromium extension for the browser with
# Install and configure extension # Install and configure extension
begin begin
set -l property "external_crx" set -l property external_crx
sudo mkdir -p "$extensionDir" sudo mkdir -p "$extensionDir"
sudo cp "$extensionFile" "$destination" sudo cp "$extensionFile" "$destination"
sudo chmod -R a+rx "$extensionDir" sudo chmod -R a+rx "$extensionDir"
@ -40,10 +40,10 @@ function installExtension -d "Installs a Chromium extension for the browser with
end end
begin begin
echo "null" | \ echo null | \
FILE="$destination" \ FILE="$destination" \
VERSION="$extVersion" \ VERSION="$extVersion" \
jq '{ external_crx: env.FILE, external_version: env.VERSION }' jq '{ external_crx: env.FILE, external_version: env.VERSION }'
end | sudo tee "$policyDir/$id.json" > /dev/null end | sudo tee "$policyDir/$id.json" >/dev/null
end end
end end

View file

@ -1,6 +1,5 @@
#!/bin/bash #!/bin/bash
if [ "$XDG_SESSION_TYPE" == "wayland" ] if [ "$XDG_SESSION_TYPE" == "wayland" ]; then
then
export MOZ_ENABLE_WAYLAND=1 export MOZ_ENABLE_WAYLAND=1
else else
export MOZ_USE_XINPUT2=1 export MOZ_USE_XINPUT2=1

View file

@ -6,7 +6,7 @@ function addInputConfig -a vendorID productID name
set statements (cat) set statements (cat)
end end
if not cat $file | grep "\\[$name\\]" &> /dev/null if not cat $file | grep "\\[$name\\]" &>/dev/null
begin begin
printf %s\n \ printf %s\n \
(if [ -f $file ] && [ -n (cat $file) ] (if [ -f $file ] && [ -n (cat $file) ]
@ -14,6 +14,6 @@ function addInputConfig -a vendorID productID name
end) \ end) \
"[Libinput][$vendorID][$productID][$name]" \ "[Libinput][$vendorID][$productID][$name]" \
"$statements" "$statements"
end | sudo tee $file > /dev/null end | sudo tee $file >/dev/null
end end
end end

View file

@ -15,7 +15,7 @@ Start-SoftwareInstaller @args `
"# Oh My Posh!", "# Oh My Posh!",
(Get-ScriptInitializer "oh-my-posh init pwsh"), (Get-ScriptInitializer "oh-my-posh init pwsh"),
(Get-ScriptInitializer "oh-my-posh completion powershell") (Get-ScriptInitializer "oh-my-posh completion powershell")
) -join [System.Environment]::NewLine) ) -join [System.Environment]::NewLine);
} ` } `
-UserConfigurator { -UserConfigurator {
param( param(
@ -32,7 +32,7 @@ Start-SoftwareInstaller @args `
if ($IsWindows) { if ($IsWindows) {
sudo -u "$user" pwsh -c 'Write-Host $env:AppData'; sudo -u "$user" pwsh -c 'Write-Host $env:AppData';
} else { } else {
sudo -u "$user" bash -c 'realpath ~/.config' sudo -u "$user" bash -c 'realpath ~/.config';
} }
})/oh-my-posh"; })/oh-my-posh";
@ -43,7 +43,8 @@ Start-SoftwareInstaller @args `
& { & {
if ($IsWindows) { if ($IsWindows) {
wsl cat $info.source | Out-String; wsl cat $info.source | Out-String;
} else { }
else {
Get-Content -Raw $info.source; Get-Content -Raw $info.source;
} }
})); }));
@ -52,7 +53,7 @@ Start-SoftwareInstaller @args `
} }
foreach ($additionalTheme in (Get-UserConfig -UserName "$user" "oh-my-posh.additionalThemes")) { foreach ($additionalTheme in (Get-UserConfig -UserName "$user" "oh-my-posh.additionalThemes")) {
Write-Host "creating theme $additionalTheme" Write-Host "creating theme $additionalTheme";
$null = New-Theme $additionalTheme; $null = New-Theme $additionalTheme;
} }
@ -65,7 +66,8 @@ Start-SoftwareInstaller @args `
if ($IsWindows) { if ($IsWindows) {
[System.Environment]::SetEnvironmentVariable($varName, "%AppData%/$([System.IO.Path]::GetRelativePath($env:AppData, $theme))", "User"); [System.Environment]::SetEnvironmentVariable($varName, "%AppData%/$([System.IO.Path]::GetRelativePath($env:AppData, $theme))", "User");
} else { }
else {
. "$PSScriptRoot/../aliae/Manage.ps1"; . "$PSScriptRoot/../aliae/Manage.ps1";
$value = $theme; $value = $theme;
$relativePath = sudo -u "$user" fish -c 'realpath --relative-base ~ $argv' $theme; $relativePath = sudo -u "$user" fish -c 'realpath --relative-base ~ $argv' $theme;

View file

@ -12,13 +12,13 @@ begin
'set -x POSH_THEME $POSH_THEME' \ 'set -x POSH_THEME $POSH_THEME' \
"oh-my-posh init fish | source" \ "oh-my-posh init fish | source" \
"oh-my-posh completion fish | source" "oh-my-posh completion fish | source"
end | installFishProfile "oh-my-posh" end | installFishProfile oh-my-posh
begin begin
printf %s\n \ printf %s\n \
'eval "$(oh-my-posh init bash)"' \ 'eval "$(oh-my-posh init bash)"' \
'eval "$(oh-my-posh completion bash)"' 'eval "$(oh-my-posh completion bash)"'
end | installBashProfile "oh-my-posh" end | installBashProfile oh-my-posh
sudo -HE pwsh "$dir/Manage.ps1" Configure sudo -HE pwsh "$dir/Manage.ps1" Configure
end end

View file

@ -9,7 +9,8 @@ Start-SoftwareInstaller @args `
if (-not $IsWindows) { if (-not $IsWindows) {
$globalDir = '"/etc/powershell/conf.d"'; $globalDir = '"/etc/powershell/conf.d"';
} else { }
else {
$globalDir = '"$env:ProgramData/PowerShell/conf.d"'; $globalDir = '"$env:ProgramData/PowerShell/conf.d"';
} }
@ -17,22 +18,22 @@ Start-SoftwareInstaller @args `
Add-PowerShellProfileStatement ` Add-PowerShellProfileStatement `
-DefaultUser ` -DefaultUser `
-Script (@( -Script (@(
$indicator, $indicator,
"`$globalDir = $globalDir", "`$globalDir = $globalDir",
({ ({
$profileRoot = Split-Path -Parent $PROFILE; $profileRoot = Split-Path -Parent $PROFILE;
$profilePaths = @( $profilePaths = @(
"$profileRoot/conf.d/*.ps1", "$profileRoot/conf.d/*.ps1",
"$globalDir/*.ps1" "$globalDir/*.ps1"
) )
foreach ($profilePath in $profilePaths) { foreach ($profilePath in $profilePaths) {
if (Test-Path $profilePath) { if (Test-Path $profilePath) {
Get-Item $profilePath | ForEach-Object { . $_; }; Get-Item $profilePath | ForEach-Object { . $_; };
}
} }
} }).ToString()) -join "`n") `
}).ToString()) -join "`n") ` -Append;
-Append;
} }
}; };

View file

@ -24,11 +24,11 @@ $null = New-Module {
) )
@{ @{
context = @{ context = @{
name = $Name; name = $Name;
nativeOnly = $NativeOnly; nativeOnly = $NativeOnly;
}; };
installer = { installer = {
param( param(
[hashtable] $Context [hashtable] $Context
) )

View file

@ -53,16 +53,19 @@ $null = New-Module {
if ($IsWindows) { if ($IsWindows) {
# ToDo Change to "PowerShell" # ToDo Change to "PowerShell"
$configRoot = "$env:ProgramData"; $configRoot = "$env:ProgramData";
} else { }
else {
$configRoot = "/etc"; $configRoot = "/etc";
} }
$profiles = @("$configRoot/powershell/."); $profiles = @("$configRoot/powershell/.");
} else { }
else {
if ($DefaultUser) { if ($DefaultUser) {
if (-not $IsWindows) { if (-not $IsWindows) {
$HomeDir = "/etc/skel"; $HomeDir = "/etc/skel";
} else { }
else {
$HomeDir = "C:/Users/Default"; $HomeDir = "C:/Users/Default";
} }
} }
@ -89,7 +92,7 @@ $null = New-Module {
} }
$profiles | ForEach-Object { $profiles | ForEach-Object {
$arguments = @{}; $arguments = @{ };
if ($Replace.IsPresent) { if ($Replace.IsPresent) {
$null = $arguments.Add("Replace", $Replace); $null = $arguments.Add("Replace", $Replace);
@ -114,7 +117,7 @@ $null = New-Module {
#> #>
function Get-ScriptInitializer { function Get-ScriptInitializer {
param ( param (
[Parameter(Position=0, Mandatory=$true)] [Parameter(Position = 0, Mandatory = $true)]
$Initializer $Initializer
) )

View file

@ -5,7 +5,7 @@ begin
function configureSW function configureSW
begin begin
sudo virsh net-info default | grep "^Active:\s*yes\$" > /dev/null sudo virsh net-info default | grep "^Active:\s*yes\$" >/dev/null
end || sudo virsh net-start default end || sudo virsh net-start default
and sudo virsh net-autostart default and sudo virsh net-autostart default

View file

@ -24,7 +24,8 @@ Start-SoftwareInstaller @args `
$userPath = & { $userPath = & {
if ($env:ALIAE_CONFIG) { if ($env:ALIAE_CONFIG) {
$env:ALIAE_CONFIG; $env:ALIAE_CONFIG;
} else { }
else {
"~/.aliae.yaml"; "~/.aliae.yaml";
} }
}; };

View file

@ -23,11 +23,11 @@ $null = New-Module {
Edit-Config ` Edit-Config `
-Variables @{ -Variables @{
Name = "$Name"; Name = "$Name";
Value = "$Value"; Value = "$Value";
} ` } `
".alias |= [((. // [])[] | select(.name != env.Name))] + [{ name: env.Name, value: env.Value }]" ` -User $User `
-User $User; ".alias |= [((. // [])[] | select(.name != env.Name))] + [{ name: env.Name, value: env.Value }]";
} }
<# <#
@ -49,11 +49,11 @@ $null = New-Module {
Edit-Config ` Edit-Config `
-Variables @{ -Variables @{
Name = "$Name"; Name = "$Name";
Value = "$Value"; Value = "$Value";
} ` } `
".env |= [((. // [])[] | select(.name != env.Name))] + [{ name: env.Name, value: env.Value }]" ` -User $User `
-User $User; ".env |= [((. // [])[] | select(.name != env.Name))] + [{ name: env.Name, value: env.Value }]";
} }
<# <#
@ -78,7 +78,8 @@ $null = New-Module {
if ($User) { if ($User) {
$flags = @("-u", "$User") $flags = @("-u", "$User")
$path = "$($IsWindows ? "~" : "$(sudo @flags bash -c "realpath ~")")/.aliae.yaml"; $path = "$($IsWindows ? "~" : "$(sudo @flags bash -c "realpath ~")")/.aliae.yaml";
} else { }
else {
$path = Get-GlobalConfigPath; $path = Get-GlobalConfigPath;
} }
@ -97,5 +98,5 @@ $null = New-Module {
} | Receive-Job -Wait; } | Receive-Job -Wait;
} }
Export-ModuleMember -Function Add-Alias,Add-EnvironmentVariable; Export-ModuleMember -Function Add-Alias, Add-EnvironmentVariable;
}; };

View file

@ -6,37 +6,37 @@ begin
function configureSW -V dir function configureSW -V dir
source "$dir/../bash/profile.fish" source "$dir/../bash/profile.fish"
source "$dir/../fish/profile.fish" source "$dir/../fish/profile.fish"
set -l file (pwsh -CommandWithArgs '. $args[0]; Get-GlobalConfigPath' "$dir/Constants.ps1"); set -l file (pwsh -CommandWithArgs '. $args[0]; Get-GlobalConfigPath' "$dir/Constants.ps1")
sudo install -Dm644 "$dir/aliae.yml" "$file" sudo install -Dm644 "$dir/aliae.yml" "$file"
begin begin
printf %s\n \ printf %s\n \
"if [ -f $(string escape $file) ]" \ "if [ -f $(string escape $file) ]" \
'then' \ then \
" eval \"\$(aliae init bash --config $(string escape $file))\"" \ " eval \"\$(aliae init bash --config $(string escape $file))\"" \
'fi' \ fi \
'' \ '' \
'if [ -n "$ALIAE_CONFIG" ] && [ -f "$ALIAE_CONFIG" ] || [ -f ~/.aliae.yaml ]' \ 'if [ -n "$ALIAE_CONFIG" ] && [ -f "$ALIAE_CONFIG" ] || [ -f ~/.aliae.yaml ]' \
'then' \ then \
' eval "$(aliae init bash)"' \ ' eval "$(aliae init bash)"' \
'fi' \ fi \
'' \ '' \
'eval "$(aliae completion bash)"' 'eval "$(aliae completion bash)"'
end | installBashProfile "aliae" "aliae" end | installBashProfile aliae aliae
if type -q fish if type -q fish
begin begin
printf %s\n \ printf %s\n \
"if [ -f $(string escape $file) ]" \ "if [ -f $(string escape $file) ]" \
" eval \"\$(aliae init bash --config $(string escape $file))\"" \ " eval \"\$(aliae init bash --config $(string escape $file))\"" \
'end' \ end \
'' \ '' \
'if [ -n "$ALIAE_CONFIG" ] && [ -f "$ALIAE_CONFIG" ] || [ -f ~/.aliae.yaml ]' \ 'if [ -n "$ALIAE_CONFIG" ] && [ -f "$ALIAE_CONFIG" ] || [ -f ~/.aliae.yaml ]' \
' aliae init fish | source' \ ' aliae init fish | source' \
'end' \ end \
'' \ '' \
"aliae completion fish | source" "aliae completion fish | source"
end | installFishProfile "aliae" "aliae" end | installFishProfile aliae aliae
end end
sudo -HE pwsh "$dir/Main.ps1" Configure sudo -HE pwsh "$dir/Main.ps1" Configure

View file

@ -9,10 +9,10 @@ begin
"" \ "" \
"# profile" \ "# profile" \
"while IFS= read -r -d '' file;" \ "while IFS= read -r -d '' file;" \
"do" \ do \
' source "$file";' \ ' source "$file";' \
'done < <(find {/etc,~/.config}/bash/conf.d/* -print0 2> /dev/null);' 'done < <(find {/etc,~/.config}/bash/conf.d/* -print0 2> /dev/null);'
end | sudo tee -a /etc/bash.bashrc &> /dev/null end | sudo tee -a /etc/bash.bashrc &>/dev/null
end end
runInstaller $argv runInstaller $argv

View file

@ -14,13 +14,13 @@ begin
printf %s\n \ printf %s\n \
"" \ "" \
'if test "$BASH"' \ 'if test "$BASH"' \
"then" then
echo "$statements" | while read -l line echo "$statements" | while read -l line
echo " $line" echo " $line"
end end
echo "fi" echo fi
end end
end end

View file

@ -14,7 +14,8 @@
$getConfig = { Get-UserConfig -UserName $User @args }; $getConfig = { Get-UserConfig -UserName $User @args };
$sudoArgs = @("-u", $User); $sudoArgs = @("-u", $User);
$configArgs = @("--global"); $configArgs = @("--global");
} else { }
else {
$getConfig = { Get-OSConfig @args }; $getConfig = { Get-OSConfig @args };
$sudoArgs = @(); $sudoArgs = @();
$configArgs = @("--system"); $configArgs = @("--system");
@ -69,7 +70,7 @@
} | Out-Null; } | Out-Null;
if ($mainBranch) { if ($mainBranch) {
git -C "$dir" branch $mainBranch | Out-Null;; git -C "$dir" branch $mainBranch | Out-Null;
sudo @sudoArgs git -C "$dir" flow config set @configArgs master $mainBranch; sudo @sudoArgs git -C "$dir" flow config set @configArgs master $mainBranch;
} }

View file

@ -4,8 +4,8 @@ begin
source "$dir/../../Scripts/software.fish" source "$dir/../../Scripts/software.fish"
function configureSW -V dir function configureSW -V dir
source "$dir/../bash/profile.fish"; source "$dir/../bash/profile.fish"
source "$dir/../fish/profile.fish"; source "$dir/../fish/profile.fish"
set -l functionName _PortValhalla_ls_ set -l functionName _PortValhalla_ls_
function dump_header function dump_header
@ -34,7 +34,7 @@ begin
"" ""
dump_aliases dump_aliases
end | installBashProfile "logo-ls" end | installBashProfile logo-ls
if type -q fish if type -q fish
begin begin
@ -47,11 +47,11 @@ begin
" else" \ " else" \
' command ls --color=auto $argv' \ ' command ls --color=auto $argv' \
" end" \ " end" \
"end" \ end \
"" ""
dump_aliases dump_aliases
end | installFishProfile "logo-ls" end | installFishProfile logo-ls
end end
end end

View file

@ -11,18 +11,18 @@ sleep_secs="1"
# * 'ehci-pci' - USB 2.0 # * 'ehci-pci' - USB 2.0
# * 'xhci_hcd' - USB 3.0 # * 'xhci_hcd' - USB 3.0
echo "Looking for USB standards ..." echo "Looking for USB standards ..."
for usb_std in "$base/"?hci[-_]?c* for usb_std in "$base/"?hci[-_]?c*; do
do
echo "* USB standard '$usb_std' ..." echo "* USB standard '$usb_std' ..."
for dev_path in "$usb_std/"*:*
do for dev_path in "$usb_std/"*:*; do
dev="$(basename "$dev_path")" dev="$(basename "$dev_path")"
echo " - Resetting device '$dev' ..." echo " - Resetting device '$dev' ..."
printf '%s' "$dev" | sudo tee "$usb_std/unbind" > /dev/null printf '%s' "$dev" | sudo tee "$usb_std/unbind" >/dev/null
sleep "$sleep_secs" sleep "$sleep_secs"
printf '%s' "$dev" | sudo tee "$usb_std/bind" > /dev/null printf '%s' "$dev" | sudo tee "$usb_std/bind" >/dev/null
echo " done." echo " done."
done done
echo " done." echo " done."
done done
echo "done." echo "done."

View file

@ -12,14 +12,14 @@ begin
printf %s\n \ printf %s\n \
"options nvidia NVreg_PreserveVideoMemoryAllocations=1" \ "options nvidia NVreg_PreserveVideoMemoryAllocations=1" \
"options nvidia NVreg_TemporaryFilePath=/var/tmp" "options nvidia NVreg_TemporaryFilePath=/var/tmp"
end | sudo tee /etc/modprobe.d/nvidia-power-management.conf > /dev/null end | sudo tee /etc/modprobe.d/nvidia-power-management.conf >/dev/null
sudo systemctl enable \ sudo systemctl enable \
nvidia-suspend.service \ nvidia-suspend.service \
nvidia-hibernate.service \ nvidia-hibernate.service \
nvidia-resume.service nvidia-resume.service
if ! cat /etc/default/grub | grep "$indicator.*$config" > /dev/null if ! cat /etc/default/grub | grep "$indicator.*$config" >/dev/null
sudo sed -i /etc/default/grub \ sudo sed -i /etc/default/grub \
-e "/$indicator/{" \ -e "/$indicator/{" \
-e "s/\($indicator.*[^ ]\)\(\"\)/\1 \2/" \ -e "s/\($indicator.*[^ ]\)\(\"\)/\1 \2/" \

View file

@ -17,10 +17,10 @@ begin
'export PYENV_ROOT="$HOME/.pyenv"' \ 'export PYENV_ROOT="$HOME/.pyenv"' \
'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' \ 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' \
'eval "$(pyenv init -)"' 'eval "$(pyenv init -)"'
end | installBashProfile "pyenv" > /dev/null end | installBashProfile pyenv >/dev/null
if type -q fish if type -q fish
installFishProfile "pyenv" "pyenv" "pyenv init - | source" installFishProfile pyenv pyenv "pyenv init - | source"
end end
end end

View file

@ -13,7 +13,7 @@ begin
set -l configs (getUserConfig "$name" "$key" --apply "builtins.attrNames" --json) set -l configs (getUserConfig "$name" "$key" --apply "builtins.attrNames" --json)
if [ (echo "$configs" | jq "length") -gt 0 ] if [ (echo "$configs" | jq "length") -gt 0 ]
if [ "$XDG_SESSION_TYPE" = "tty" ] if [ "$XDG_SESSION_TYPE" = tty ]
set -l sessionPid set -l sessionPid
set -l freeTty set -l freeTty
set -l service set -l service
@ -38,7 +38,7 @@ begin
"[General]" \ "[General]" \
"LastSeenVersion=1.0.0" \ "LastSeenVersion=1.0.0" \
"ShowUpdatePage=false" "ShowUpdatePage=false"
end | sudo -u "$name" tee "$welcomeConfig" > /dev/null end | sudo -u "$name" tee "$welcomeConfig" >/dev/null
begin begin
printf %s\n \ printf %s\n \
@ -53,7 +53,7 @@ begin
"CONFIG_NAME=$(echo "$CONFIG_NAME" | string escape)" \ "CONFIG_NAME=$(echo "$CONFIG_NAME" | string escape)" \
"konsole -e fish $(realpath (status filename) | string escape) userConfig" "konsole -e fish $(realpath (status filename) | string escape) userConfig"
) )
end | sudo -u "$name" tee "$entryPoint" > /dev/null end | sudo -u "$name" tee "$entryPoint" >/dev/null
sudo chmod +x "$entryPoint" sudo chmod +x "$entryPoint"
@ -62,7 +62,7 @@ begin
"[Service]" \ "[Service]" \
"ExecStart=" \ "ExecStart=" \
"ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --autologin $name %I \$TERM" "ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --autologin $name %I \$TERM"
end | sudo tee "$sessionConfig" > /dev/null end | sudo tee "$sessionConfig" >/dev/null
sudo systemctl daemon-reload sudo systemctl daemon-reload
sudo systemctl restart $service sudo systemctl restart $service

View file

@ -1,4 +1,4 @@
#!/bin/env fish #!/bin/env fish
begin begin
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="0483", MODE="0666"'; echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="0483", MODE="0666"'
end | sudo tee /etc/udev/rules.d/50-ct-board.rules > /dev/null; end | sudo tee /etc/udev/rules.d/50-ct-board.rules >/dev/null

View file

@ -7,9 +7,9 @@ begin
set -l configFile /etc/vimrc set -l configFile /etc/vimrc
set -l indicator "set clipboard" set -l indicator "set clipboard"
if not grep "\b$indicator\b" "$configFile" > /dev/null if not grep "\b$indicator\b" "$configFile" >/dev/null
# As described in https://wiki.archlinux.org/title/Vim#Clipboard # As described in https://wiki.archlinux.org/title/Vim#Clipboard
echo "$indicator+=unnamed,unnamedplus" | sudo tee -a "$configFile" > /dev/null; echo "$indicator+=unnamed,unnamedplus" | sudo tee -a "$configFile" >/dev/null
end end
end end

View file

@ -6,8 +6,8 @@ begin
function configureSW -V dir function configureSW -V dir
source "$dir/../bash/profile.fish" source "$dir/../bash/profile.fish"
source "$dir/../fish/profile.fish" source "$dir/../fish/profile.fish"
echo 'eval "$(zoxide init bash)"' | installBashProfile "zoxide" echo 'eval "$(zoxide init bash)"' | installBashProfile zoxide
echo "zoxide init fish | source" | installFishProfile "zoxide" echo "zoxide init fish | source" | installFishProfile zoxide
sudo -HE pwsh -NoProfile "$dir/Main.ps1" Configure sudo -HE pwsh -NoProfile "$dir/Main.ps1" Configure
end end

View file

@ -63,10 +63,10 @@ $null = New-Module {
& { & {
switch ($Action) { switch ($Action) {
([WindowsInstallerAction]::Backup) { ([WindowsInstallerAction]::Backup) {
"Please select the path you wish to store your backup at" "Please select the path you wish to store your backup at";
} }
([WindowsInstallerAction]::Install) { ([WindowsInstallerAction]::Install) {
"Please select an archive you wish to restore from, if you wish to restore from a backup" "Please select an archive you wish to restore from, if you wish to restore from a backup";
} }
} }
})); }));
@ -183,7 +183,8 @@ $null = New-Module {
Disable-Autologin; Disable-Autologin;
Restart-Intermediate; Restart-Intermediate;
return; return;
} else { }
else {
Deploy-SoftwareAction -Action ([InstallerAction]::BackupUser); Deploy-SoftwareAction -Action ([InstallerAction]::BackupUser);
Remove-LocalGroupMember -Member "$user" @adminGroup; Remove-LocalGroupMember -Member "$user" @adminGroup;

View file

@ -59,11 +59,11 @@ function Start-Setup {
} }
function Get-PathInjection($path) { function Get-PathInjection($path) {
"(Join-Path `$env:SystemDrive $(ConvertTo-Injection $path))" "(Join-Path `$env:SystemDrive $(ConvertTo-Injection $path))";
} }
function Get-ScriptPathInjection($path) { function Get-ScriptPathInjection($path) {
Get-PathInjection (Get-RemoteScriptPath $path) Get-PathInjection (Get-RemoteScriptPath $path);
} }
function Get-DiskConfig { function Get-DiskConfig {
@ -76,21 +76,21 @@ function Start-Setup {
$modifications = $node.SelectSingleNode("./ua:ModifyPartitions", $namespace); $modifications = $node.SelectSingleNode("./ua:ModifyPartitions", $namespace);
@{ @{
PartitionCreationContainer = $creations; PartitionCreationContainer = $creations;
PartitionCreations = $creations.SelectNodes("./ua:CreatePartition", $namespace); PartitionCreations = $creations.SelectNodes("./ua:CreatePartition", $namespace);
PartitionModificationContainer = $modifications; PartitionModificationContainer = $modifications;
PartitionModifications = $modifications.SelectNodes("./ua:ModifyPartition", $namespace); PartitionModifications = $modifications.SelectNodes("./ua:ModifyPartition", $namespace);
}; };
} }
function Move-PartitionRange { function Move-PartitionRange {
param ( param (
[int] $Disk = (Get-InstallDisk), [int] $Disk = (Get-InstallDisk),
[Parameter(Position=0)] [Parameter(Position = 0)]
[int] $From = 0, [int] $From = 0,
[Parameter(Position=1)] [Parameter(Position = 1)]
[System.Nullable[int]] $To = $null, [System.Nullable[int]] $To = $null,
[Parameter(Position=2)] [Parameter(Position = 2)]
[int] $By = 1 [int] $By = 1
) )
@ -104,8 +104,9 @@ function Start-Setup {
} }
} }
foreach ($config in @(@($diskInfo.PartitionCreations, @("Order")), foreach ($config in @(
@($diskInfo.PartitionModifications, @("Order", "PartitionID")))) { @($diskInfo.PartitionCreations, @("Order")),
@($diskInfo.PartitionModifications, @("Order", "PartitionID")))) {
foreach ($partition in $config[0]) { foreach ($partition in $config[0]) {
foreach ($property in $config[1]) { foreach ($property in $config[1]) {
$partitionNode = $partition.SelectSingleNode("./ua:$property", $namespace); $partitionNode = $partition.SelectSingleNode("./ua:$property", $namespace);
@ -127,11 +128,11 @@ function Start-Setup {
function Add-Partition { function Add-Partition {
param ( param (
[int] $Disk = (Get-InstallDisk), [int] $Disk = (Get-InstallDisk),
[Parameter(Position=0)] [Parameter(Position = 0)]
[int] $Index, [int] $Index,
[Parameter(Position=1)] [Parameter(Position = 1)]
[int] $Size, [int] $Size,
[Parameter(Position=2)] [Parameter(Position = 2)]
[string] $Type = "Primary" [string] $Type = "Primary"
) )
@ -169,9 +170,9 @@ function Start-Setup {
function Move-Partition { function Move-Partition {
param ( param (
[int] $Disk = (Get-InstallDisk), [int] $Disk = (Get-InstallDisk),
[Parameter(Position=0)] [Parameter(Position = 0)]
[int] $From, [int] $From,
[Parameter(Position=1)] [Parameter(Position = 1)]
[int] $To [int] $To
) )
@ -210,7 +211,7 @@ function Start-Setup {
$target = $setupConfig.SelectSingleNode("./ua:ImageInstall/ua:OSImage/ua:InstallTo", $namespace); $target = $setupConfig.SelectSingleNode("./ua:ImageInstall/ua:OSImage/ua:InstallTo", $namespace);
@{ @{
Disk = $target.SelectSingleNode("./ua:DiskID", $namespace); Disk = $target.SelectSingleNode("./ua:DiskID", $namespace);
Partition = $target.SelectSingleNode("./ua:PartitionID", $namespace); Partition = $target.SelectSingleNode("./ua:PartitionID", $namespace);
}; };
}; };
@ -223,21 +224,21 @@ function Start-Setup {
$oobeSettings = (Get-Component (Get-PassSettings "oobeSystem") "Microsoft-Windows-Shell-Setup"); $oobeSettings = (Get-Component (Get-PassSettings "oobeSystem") "Microsoft-Windows-Shell-Setup");
foreach ($xpath in @("./ua:AutoLogon/ua:Username", foreach ($xpath in @("./ua:AutoLogon/ua:Username",
"./ua:UserAccounts/ua:LocalAccounts/ua:LocalAccount/ua:Name", "./ua:UserAccounts/ua:LocalAccounts/ua:LocalAccount/ua:Name",
"./ua:UserAccounts/ua:LocalAccounts/ua:LocalAccount/ua:DisplayName")) { "./ua:UserAccounts/ua:LocalAccounts/ua:LocalAccount/ua:DisplayName")) {
$oobeSettings.SelectSingleNode($xpath, $namespace).InnerText = $valhallaConfig.setupUser.name; $oobeSettings.SelectSingleNode($xpath, $namespace).InnerText = $valhallaConfig.setupUser.name;
} }
Add-StartupCommand ` Add-StartupCommand `
-Script ( -Script (
"powershell -Command " + "powershell -Command " +
($env:DEBUG ? "`$env:DEBUG = $([int]$env:DEBUG);" : "") + ($env:DEBUG ? "`$env:DEBUG = $([int]$env:DEBUG);" : "") +
"`$env:VALHALLA_ROOT = $(Get-PathInjection $env:REMOTE_PROJECT_PATH);" + "`$env:VALHALLA_ROOT = $(Get-PathInjection $env:REMOTE_PROJECT_PATH);" +
"`$env:PWSH_PATH = $(Get-PathInjection $env:PWSH_PATH);" + "`$env:PWSH_PATH = $(Get-PathInjection $env:PWSH_PATH);" +
"`$env:INSTALLER_SCRIPT = $(Get-ScriptPathInjection $env:SETUP_SCRIPT_NAME);" + "`$env:INSTALLER_SCRIPT = $(Get-ScriptPathInjection $env:SETUP_SCRIPT_NAME);" +
"`$env:CONFIG_NAME = $(ConvertTo-Injection $env:CONFIG_NAME);" + "`$env:CONFIG_NAME = $(ConvertTo-Injection $env:CONFIG_NAME);" +
"& (Join-Path `$env:PWSH_PATH pwsh) `$env:INSTALLER_SCRIPT;") ` "& (Join-Path `$env:PWSH_PATH pwsh) `$env:INSTALLER_SCRIPT;") `
-Description "Install PowerShell Core and git and run setup script"; -Description "Install PowerShell Core and git and run setup script";
if ($valhallaConfig.dualboot.enable) { if ($valhallaConfig.dualboot.enable) {
$diskSize = [long](ConvertFrom-Csv (wmic diskdrive where "Index=$(Get-InstallDisk)" get Size | ForEach-Object { "$_".Trim(); })).Size; $diskSize = [long](ConvertFrom-Csv (wmic diskdrive where "Index=$(Get-InstallDisk)" get Size | ForEach-Object { "$_".Trim(); })).Size;
@ -261,8 +262,8 @@ function Start-Setup {
$unattendedConfig.PreserveWhitespace = $true; $unattendedConfig.PreserveWhitespace = $true;
$unattendedConfig.Save($unattendedConfigFile); $unattendedConfig.Save($unattendedConfigFile);
Write-Warning "Attention: This program will completely wipe your current disk #1 and install Windows on it. Are you sure you want to do this?" Write-Warning "Attention: This program will completely wipe your current disk #1 and install Windows on it. Are you sure you want to do this?";
Read-Host -Prompt "Hit enter to continue or CTRL+C to abort" Read-Host -Prompt "Hit enter to continue or CTRL+C to abort";
& "$SETUP_DRIVE\setup.exe" /Unattend:$unattendedConfigFile; & "$SETUP_DRIVE\setup.exe" /Unattend:$unattendedConfigFile;
} }

View file

@ -24,7 +24,7 @@ $null = New-Module {
} }
"$rootSelector/$associationSelector$filter"; "$rootSelector/$associationSelector$filter";
} };
<# <#
.SYNOPSIS .SYNOPSIS
@ -64,7 +64,8 @@ $null = New-Module {
if ($candidates.Count -eq 1) { if ($candidates.Count -eq 1) {
$association = $candidates[0]; $association = $candidates[0];
} else { }
else {
$association = $document.SelectSingleNode($rootSelector).AppendChild($document.CreateElement($associationElementName)); $association = $document.SelectSingleNode($rootSelector).AppendChild($document.CreateElement($associationElementName));
foreach ($attributeName in @("Identifier", "ProgId", "ApplicationName")) { foreach ($attributeName in @("Identifier", "ProgId", "ApplicationName")) {
@ -95,7 +96,7 @@ $null = New-Module {
$associations = $root.SelectNodes((& $getSelector)); $associations = $root.SelectNodes((& $getSelector));
# Reorder associations by their Identifier # Reorder associations by their Identifier
$null = $associations | ForEach-Object { $root.RemoveChild($_) } | Sort-Object -Property "Identifier" | ForEach-Object { $root.AppendChild($_); }; $null = $associations | ForEach-Object { $root.RemoveChild($_) } | Sort-Object -Property "Identifier" | ForEach-Object { $root.AppendChild($_) };
$configFile = New-TemporaryFile; $configFile = New-TemporaryFile;
$writerSettings = [XmlWriterSettings]::new(); $writerSettings = [XmlWriterSettings]::new();

View file

@ -21,7 +21,8 @@ function Deploy-SoftwareAction {
if ($null -ne $Action) { if ($null -ne $Action) {
$install = ($Action -eq ([InstallerAction]::Install)); $install = ($Action -eq ([InstallerAction]::Install));
$null = $arguments.Add("action", $Action); $null = $arguments.Add("action", $Action);
} else { }
else {
$install = $true; $install = $true;
} }
@ -138,7 +139,7 @@ function Deploy-SoftwareAction {
keepass ` keepass `
; ;
Install-ChocoPackage bitwarden -ArgumentList '--install-arguments="/ALLUSERS=1"' Install-ChocoPackage bitwarden -ArgumentList '--install-arguments="/ALLUSERS=1"';
Install-WingetPackage ` Install-WingetPackage `
SomePythonThings.WingetUIStore ` SomePythonThings.WingetUIStore `
@ -233,7 +234,7 @@ function Deploy-SoftwareAction {
Remove-DesktopIcon "VLC*"; Remove-DesktopIcon "VLC*";
# When installing Jellyfin Media Player after iCUE, Jellyfin will try to reboot automatically # When installing Jellyfin Media Player after iCUE, Jellyfin will try to reboot automatically
Install-ChocoPackage jellyfin-media-player -ArgumentList "--install-args","/norestart"; Install-ChocoPackage jellyfin-media-player -ArgumentList "--install-args", "/norestart";
Remove-DesktopIcon "Jellyfin Media Player*"; Remove-DesktopIcon "Jellyfin Media Player*";
Install-WingetPackage Ytmdesktop.Ytmdesktop; Install-WingetPackage Ytmdesktop.Ytmdesktop;
Remove-DesktopIcon "Youtube Music*"; Remove-DesktopIcon "Youtube Music*";

View file

@ -12,7 +12,7 @@ function Invoke-Hook() {
if (Get-Command "$Name" -ErrorAction SilentlyContinue) { if (Get-Command "$Name" -ErrorAction SilentlyContinue) {
$parameters = { $parameters = {
fallback = $scriptBlock fallback = $scriptBlock;
}; };
Write-Host "Running Hook ``$Name``"; Write-Host "Running Hook ``$Name``";

View file

@ -30,13 +30,15 @@ $null = New-Module {
if ($UserKey) { if ($UserKey) {
$path = Join-Path ($UserKey.PSPath) $runOncePath; $path = Join-Path ($UserKey.PSPath) $runOncePath;
} else { }
else {
$path = $systemRunOncePath; $path = $systemRunOncePath;
} }
if (-not (Test-Path $path)) { if (-not (Test-Path $path)) {
New-Item $path; New-Item $path;
} else { }
else {
Get-Item $path; Get-Item $path;
} }
} }
@ -122,14 +124,14 @@ $null = New-Module {
#> #>
function Register-Setup { function Register-Setup {
param( param(
[Parameter(ParameterSetName="System")] [Parameter(ParameterSetName = "System")]
[switch] $System, [switch] $System,
[Parameter(ParameterSetName="DefaultUser", Mandatory)] [Parameter(ParameterSetName = "DefaultUser", Mandatory)]
[switch] $DefaultUser, [switch] $DefaultUser,
[Parameter(ParameterSetName="User", Mandatory)] [Parameter(ParameterSetName = "User", Mandatory)]
[switch] $User, [switch] $User,
[Parameter(ParameterSetName="User")] [Parameter(ParameterSetName = "User")]
[Parameter(ParameterSetName="SpecificUser", Mandatory)] [Parameter(ParameterSetName = "SpecificUser", Mandatory)]
[RegistryKey] $UserKey [RegistryKey] $UserKey
) )
@ -151,7 +153,8 @@ $null = New-Module {
} }
$key = Get-RunOnceKey $UserKey; $key = Get-RunOnceKey $UserKey;
} else { }
else {
$key = Get-RunOnceKey; $key = Get-RunOnceKey;
} }
@ -193,8 +196,8 @@ $null = New-Module {
} }
$options = @{ $options = @{
$domainOption = ""; $domainOption = "";
$userOption = $Name; $userOption = $Name;
$passwordOption = ""; $passwordOption = "";
}; };
@ -221,20 +224,22 @@ $null = New-Module {
#> #>
function Restart-Intermediate { function Restart-Intermediate {
param( param(
[Parameter(ParameterSetName="None")] [Parameter(ParameterSetName = "None")]
[switch] $NoRegister, [switch] $NoRegister,
[Parameter(ParameterSetName="Default", Mandatory)] [Parameter(ParameterSetName = "Default", Mandatory)]
[switch] $DefaultUser, [switch] $DefaultUser,
[Parameter(ParameterSetName="Current", Mandatory)] [Parameter(ParameterSetName = "Current", Mandatory)]
[switch] $CurrentUser [switch] $CurrentUser
) )
if (-not $NoRegister.IsPresent) { if (-not $NoRegister.IsPresent) {
if ($DefaultUser.IsPresent) { if ($DefaultUser.IsPresent) {
Register-Setup -DefaultUser; Register-Setup -DefaultUser;
} elseif ($CurrentUser.IsPresent) { }
elseif ($CurrentUser.IsPresent) {
Register-Setup -User; Register-Setup -User;
} else { }
else {
Register-Setup; Register-Setup;
} }
} }

View file

@ -53,7 +53,7 @@ $null = New-Module {
) )
$rootPath = "HKLM:\DefaultUser"; $rootPath = "HKLM:\DefaultUser";
$regRootPath = $rootPath -replace "^(\w+):([\\/]|$)","`$1`$2"; $regRootPath = $rootPath -replace "^(\w+):([\\/]|$)", "`$1`$2";
$hivePath = "$env:SystemDrive\Users\Default\NTUSER.dat"; $hivePath = "$env:SystemDrive\Users\Default\NTUSER.dat";
$null = & reg load $regRootPath $hivePath; $null = & reg load $regRootPath $hivePath;
[RegistryKey] $root = Get-Item $rootPath; [RegistryKey] $root = Get-Item $rootPath;
@ -81,7 +81,8 @@ $null = New-Module {
[AccessControlType]::Allow)); [AccessControlType]::Allow));
Set-Acl $configRoot $acl; Set-Acl $configRoot $acl;
} else { }
else {
$key = Get-Item $configRoot; $key = Get-Item $configRoot;
} }
@ -106,7 +107,7 @@ $null = New-Module {
$options = @{ $options = @{
legalnoticecaption = $Caption; legalnoticecaption = $Caption;
legalnoticetext = $Message; legalnoticetext = $Message;
}; };
foreach ($key in $options.Keys) { foreach ($key in $options.Keys) {
@ -141,7 +142,8 @@ $null = New-Module {
if ($key.GetValueNames().Contains($Name)) { if ($key.GetValueNames().Contains($Name)) {
return $key.GetValue($Name); return $key.GetValue($Name);
} else { }
else {
return $null; return $null;
} }
} }
@ -166,7 +168,8 @@ $null = New-Module {
if ($null -eq $Value) { if ($null -eq $Value) {
Remove-ItemProperty $key -Name $Name; Remove-ItemProperty $key -Name $Name;
} else { }
else {
$null = Set-ItemProperty $key -Name $Name -Value $Value; $null = Set-ItemProperty $key -Name $Name -Value $Value;
} }
} }
@ -371,4 +374,4 @@ $null = New-Module {
Set-SetupOption $finishedOption $true; Set-SetupOption $finishedOption $true;
} }
} };

View file

@ -12,7 +12,8 @@ $null = New-Module {
if ($User) { if ($User) {
$result = "Users/$User"; $result = "Users/$User";
} else { }
else {
$result = "System"; $result = "System";
} }
@ -89,7 +90,8 @@ $null = New-Module {
if (Test-Path -PathType Container $Source) { if (Test-Path -PathType Container $Source) {
$null = New-Item -ItemType Junction $fullPath -Target $Source; $null = New-Item -ItemType Junction $fullPath -Target $Source;
} elseif (Test-Path -PathType Leaf $Source) { }
elseif (Test-Path -PathType Leaf $Source) {
Copy-Item $Source $fullPath; Copy-Item $Source $fullPath;
} }

View file

@ -11,7 +11,7 @@ $null = New-Module {
) )
Set-ItemProperty -Path $systemPolicyPath -Name $uacOption -Value ([int]$Value); Set-ItemProperty -Path $systemPolicyPath -Name $uacOption -Value ([int]$Value);
} };
<# <#
.SYNOPSIS .SYNOPSIS
@ -58,7 +58,8 @@ $null = New-Module {
(& { (& {
if (Test-Path -PathType Container $Path) { if (Test-Path -PathType Container $Path) {
[InheritanceFlags]::ObjectInherit -bor [InheritanceFlags]::ContainerInherit [InheritanceFlags]::ObjectInherit -bor [InheritanceFlags]::ContainerInherit
} else { }
else {
0 0
} }
}), }),

View file

@ -48,10 +48,10 @@ $null = New-Module {
$Names.AddRange($AdditionalNames); $Names.AddRange($AdditionalNames);
[string[]] $arguments = $ArgumentList + (& { [string[]] $arguments = $ArgumentList + (& {
if ($Action -eq 'install') { if ($Action -eq 'install') {
@("--accept-package-agreements") @("--accept-package-agreements");
}; };
}); });
foreach ($name in $Names) { foreach ($name in $Names) {
if ($Force.IsPresent -or (& $Guard $name $PSBoundParameters)) { if ($Force.IsPresent -or (& $Guard $name $PSBoundParameters)) {
@ -59,7 +59,7 @@ $null = New-Module {
--accept-source-agreements ` --accept-source-agreements `
--source winget ` --source winget `
@arguments ` @arguments `
--exact --id $name ; --exact --id $name;
} }
} }
}; };
@ -74,8 +74,8 @@ $null = New-Module {
$output = winget source update winget; $output = winget source update winget;
$? -and -not ([System.Linq.Enumerable]::Any( $? -and -not ([System.Linq.Enumerable]::Any(
[string[]]($output), [string[]]($output),
[System.Func[string,bool]]{ param($line) $line -eq "Cancelled"; })); [System.Func[string, bool]] { param($line) $line -eq "Cancelled" }));
}); });
} }
@ -90,7 +90,7 @@ $null = New-Module {
[OutputType([bool])] [OutputType([bool])]
param( param(
[string] $Name [string] $Name
); )
-not [string]::IsNullOrEmpty((choco list --limit-output --exact $name)); -not [string]::IsNullOrEmpty((choco list --limit-output --exact $name));
} }
@ -123,7 +123,7 @@ $null = New-Module {
param( param(
[switch] $Force, [switch] $Force,
[string[]] $ArgumentList, [string[]] $ArgumentList,
[Parameter(Position=0)] [Parameter(Position = 0)]
[string] $Name, [string] $Name,
[Parameter(ValueFromRemainingArguments = $true)] [Parameter(ValueFromRemainingArguments = $true)]
[string[]] $AdditionalNames = @() [string[]] $AdditionalNames = @()
@ -132,9 +132,10 @@ $null = New-Module {
& $chocoRunner @PSBoundParameters -Guard { & $chocoRunner @PSBoundParameters -Guard {
param($Name) param($Name)
if (Test-ChocoPackage $Name) { if (Test-ChocoPackage $Name) {
Write-Host "Package ``$Name`` is already installed" Write-Host "Package ``$Name`` is already installed";
$false; $false;
} else { }
else {
$true; $true;
} }
}; };
@ -147,7 +148,7 @@ $null = New-Module {
function Uninstall-ChocoPackage { function Uninstall-ChocoPackage {
param( param(
[string[]] $ArgumentList, [string[]] $ArgumentList,
[Parameter(Position=0)] [Parameter(Position = 0)]
[string] $Name, [string] $Name,
[Parameter(ValueFromRemainingArguments = $true)] [Parameter(ValueFromRemainingArguments = $true)]
[string[]] $AdditionalNames = @() [string[]] $AdditionalNames = @()
@ -157,7 +158,8 @@ $null = New-Module {
param($Name) param($Name)
if (Test-ChocoPackage $Name) { if (Test-ChocoPackage $Name) {
$true; $true;
} else { }
else {
Write-Host "Package ``$Name`` is not installed"; Write-Host "Package ``$Name`` is not installed";
$false; $false;
} }
@ -175,22 +177,22 @@ $null = New-Module {
param( param(
[switch] $Force, [switch] $Force,
[string[]] $ArgumentList, [string[]] $ArgumentList,
[Parameter(Position=0)] [Parameter(Position = 0)]
[string] $Name, [string] $Name,
[Parameter(ValueFromRemainingArguments = $true)] [Parameter(ValueFromRemainingArguments = $true)]
[string[]] $AdditionalNames = @() [string[]] $AdditionalNames = @()
) )
& $wingetRunner @PSBoundParameters ` & $wingetRunner @PSBoundParameters -Guard {
-Guard { param($Name, $Parameters)
param($Name, $Parameters) if (Test-WingetPackage -Name $Name @Parameters) {
if (Test-WingetPackage -Name $Name @Parameters) { Write-Host "Package ``$Name`` is already installed";
Write-Host "Package ``$Name`` is already installed" $false;
$false; }
} else { else {
$true; $true;
} }
}; };
} }
<# <#
@ -200,7 +202,7 @@ $null = New-Module {
function Uninstall-WingetPackage { function Uninstall-WingetPackage {
param( param(
[string[]] $ArgumentList, [string[]] $ArgumentList,
[Parameter(Position=0)] [Parameter(Position = 0)]
[string] $Name, [string] $Name,
[Parameter(ValueFromRemainingArguments = $true)] [Parameter(ValueFromRemainingArguments = $true)]
[string[]] $AdditionalNames = @() [string[]] $AdditionalNames = @()
@ -210,8 +212,9 @@ $null = New-Module {
param($Name, $Parameters) param($Name, $Parameters)
if (Test-WingetPackage -Name $Name @Parameters) { if (Test-WingetPackage -Name $Name @Parameters) {
$true; $true;
} else { }
Write-Host "Package ``$Name`` is not installed" else {
Write-Host "Package ``$Name`` is not installed";
$false; $false;
} }
}; };
@ -249,7 +252,8 @@ $null = New-Module {
Write-Host "Downloading setup file from ``$Source``"; Write-Host "Downloading setup file from ``$Source``";
Invoke-WebRequest $Source -OutFile $filePath; Invoke-WebRequest $Source -OutFile $filePath;
} else { }
else {
$filePath = $Source; $filePath = $Source;
} }
@ -321,7 +325,8 @@ $null = New-Module {
try { try {
& $download; & $download;
} catch { }
catch {
$null = $Browser.ExecuteScript("document.querySelector('$cookieBannerSelector').remove()"); $null = $Browser.ExecuteScript("document.querySelector('$cookieBannerSelector').remove()");
& $download; & $download;
} }

View file

@ -30,7 +30,8 @@ $null = New-Module {
if ($task) { if ($task) {
return [OneShotTask]$task; return [OneShotTask]$task;
} else { }
else {
return $null; return $null;
} }
} }
@ -104,7 +105,7 @@ $null = New-Module {
} }
} ` } `
-MessageData @{ -MessageData @{
Trigger = $oneShotTrigger; Trigger = $oneShotTrigger;
Identifier = $identifier; Identifier = $identifier;
}; };

View file

@ -25,7 +25,8 @@ function Update-WindowsInstallation {
Write-Host "A Reboot is Required!"; Write-Host "A Reboot is Required!";
Write-Host "Windows will reboot now and the installation will be continued automatically."; Write-Host "Windows will reboot now and the installation will be continued automatically.";
return; return;
} else { }
else {
Write-Host "Updating Windows finished successfully!"; Write-Host "Updating Windows finished successfully!";
return; return;
} }

View file

@ -36,7 +36,7 @@ $null = New-Module {
([UserStage]::Create) { ([UserStage]::Create) {
if ($env:UserName -ne $name) { if ($env:UserName -ne $name) {
$userInfo = @{ $userInfo = @{
name = $name; name = $name;
msAccount = $msAccount; msAccount = $msAccount;
}; };
@ -44,12 +44,14 @@ $null = New-Module {
if ($msAccount) { if ($msAccount) {
logoff; logoff;
} else { }
else {
Restart-Intermediate; Restart-Intermediate;
} }
exit; exit;
} else { }
else {
if ($msAccount) { if ($msAccount) {
if (-not (Test-Admin)) { if (-not (Test-Admin)) {
Invoke-OneShot DisableUAC; Invoke-OneShot DisableUAC;
@ -166,7 +168,8 @@ $null = New-Module {
0) -eq 1) { 0) -eq 1) {
return $newUser; return $newUser;
} }
} else { }
else {
$result = $Host.UI.PromptForChoice( $result = $Host.UI.PromptForChoice(
"Select your User", "Select your User",
"Which one is your user?", "Which one is your user?",
@ -184,7 +187,8 @@ $null = New-Module {
return $newUsers[$result - 1]; return $newUsers[$result - 1];
} }
} }
} else { }
else {
Write-Host ""; Write-Host "";
Write-Host "Unable to determine the new user"; Write-Host "Unable to determine the new user";
Write-Host "Retrying…"; Write-Host "Retrying…";
@ -218,7 +222,8 @@ $null = New-Module {
Add-MicrosoftAccount $Name; Add-MicrosoftAccount $Name;
Set-SetupOption $loggedInUserOption $env:UserName; Set-SetupOption $loggedInUserOption $env:UserName;
Invoke-OneShot ([OneShotTask]::InitializeMSAccount); Invoke-OneShot ([OneShotTask]::InitializeMSAccount);
} else { }
else {
New-LocalUser -NoPassword $Name; New-LocalUser -NoPassword $Name;
Set-LocalUser $Name -PasswordNeverExpires $true; Set-LocalUser $Name -PasswordNeverExpires $true;
Set-LocalUser $Name -PasswordNeverExpires $false; Set-LocalUser $Name -PasswordNeverExpires $false;
@ -246,7 +251,7 @@ $null = New-Module {
if ($msAccount) { if ($msAccount) {
$accountName = Get-MSAccountName; $accountName = Get-MSAccountName;
Write-Host "Renaming ``$accountName`` to ``$name``" Write-Host "Renaming ``$accountName`` to ``$name``";
Rename-LocalUser $accountName $name; Rename-LocalUser $accountName $name;
} }
@ -254,7 +259,8 @@ $null = New-Module {
if ($msAccount) { if ($msAccount) {
Disable-LocalUser (Get-SetupOption $loggedInUserOption); Disable-LocalUser (Get-SetupOption $loggedInUserOption);
} else { }
else {
Disable-LocalUser $env:UserName; Disable-LocalUser $env:UserName;
} }
@ -266,7 +272,8 @@ $null = New-Module {
if ($msAccount) { if ($msAccount) {
Disable-Autologin; Disable-Autologin;
Set-BootMessage -Caption "Please Log In" -Message "Please log in using your new Microsoft Account ``$name``."; Set-BootMessage -Caption "Please Log In" -Message "Please log in using your new Microsoft Account ``$name``.";
} else { }
else {
Set-AutologinUser "$name"; Set-AutologinUser "$name";
} }
} }

View file

@ -3,7 +3,7 @@
. "$PSScriptRoot/../../../Common/Scripts/Software.ps1"; . "$PSScriptRoot/../../../Common/Scripts/Software.ps1";
Start-SoftwareInstaller @args ` Start-SoftwareInstaller @args `
-Installer { -Installer {
Install-ChocoPackage firefox; Install-ChocoPackage firefox;
} ` } `
-Configurator { -Configurator {

View file

@ -13,19 +13,19 @@
param() param()
$hubName = "lghub_system_tray.exe"; $hubName = "lghub_system_tray.exe";
$candidates = Get-Process | Where-Object { $_.Path -and ((Split-Path -Leaf $_.Path) -eq $hubName) }; $candidates = Get-Process | Where-Object { $_.Path -and ((Split-Path -Leaf $_.Path) -eq $hubName) };
if ($candidates.Count -gt 0) { if ($candidates.Count -gt 0) {
$lghubPath = $candidates[0].Path; $lghubPath = $candidates[0].Path;
} else { }
else {
$lghubPath = $null; $lghubPath = $null;
} }
$mainProcesses = Get-Process | Where-Object { $mainProcesses = Get-Process | Where-Object {
$_.Path -and $_.Path -and
(@("lghub.exe", "lghub_agent.exe", "lghub_updater.exe", $hubName) -contains (Split-Path -Leaf $_.Path)) -and (@("lghub.exe", "lghub_agent.exe", "lghub_updater.exe", $hubName) -contains (Split-Path -Leaf $_.Path)) -and
(($_.Parent.ProcessName -eq "explorer") -or ($null -eq $_.Parent)) (($_.Parent.ProcessName -eq "explorer") -or ($null -eq $_.Parent));
}; };
$null = $mainProcesses | ForEach-Object { $_.Kill($true) }; $null = $mainProcesses | ForEach-Object { $_.Kill($true) };
@ -64,7 +64,7 @@
Edit-LGHubConfig { Edit-LGHubConfig {
Add-BackupArtifacts -User $Arguments.Name -Source $configPath -Path "$Name" ` Add-BackupArtifacts -User $Arguments.Name -Source $configPath -Path "$Name" `
-Include @("settings.db", "icon_cache") -Include @("settings.db", "icon_cache");
}; };
} ` } `
-UserConfigurator { -UserConfigurator {

View file

@ -9,15 +9,15 @@ Start-SoftwareInstaller @args `
$configPath = "HKLM:\SOFTWARE\Robert Maehl Software\MSEdgeRedirect"; $configPath = "HKLM:\SOFTWARE\Robert Maehl Software\MSEdgeRedirect";
[hashtable] $options = @{ [hashtable] $options = @{
NoBing = 1; NoBing = 1;
NoImgs = 1; NoImgs = 1;
NoNews = 1; NoNews = 1;
NoPDFs = 1; NoPDFs = 1;
Search = "StartPage"; Search = "StartPage";
Images = "Custom"; Images = "Custom";
ImagePath = "https://startpage.com/sp/search?cat=images&query="; ImagePath = "https://startpage.com/sp/search?cat=images&query=";
News = "Google"; News = "Google";
PDFApp = "C:\Program Files\Mozilla Firefox\firefox.exe"; PDFApp = "C:\Program Files\Mozilla Firefox\firefox.exe";
}; };
foreach ($key in $options.Keys) { foreach ($key in $options.Keys) {

View file

@ -34,7 +34,7 @@
$folderID = ( $folderID = (
$oldContent | ` $oldContent | `
Where-Object { $_ -match "$pattern" } | ` Where-Object { $_ -match "$pattern" } | `
ForEach-Object { $_ -replace "$pattern.*$","`$1" } | ` ForEach-Object { $_ -replace "$pattern.*$", "`$1" } | `
Sort-Object -Unique | ` Sort-Object -Unique | `
Measure-Object -Maximum).Maximum + 1; Measure-Object -Maximum).Maximum + 1;
@ -80,7 +80,7 @@
Start-SoftwareInstaller @args ` Start-SoftwareInstaller @args `
-Installer { -Installer {
Install-ChocoPackage nextcloud-client -ArgumentList "-y","--params='/KeepUpdateCheck'"; Install-ChocoPackage nextcloud-client -ArgumentList "-y", "--params='/KeepUpdateCheck'";
} ` } `
-UserConfigurator { -UserConfigurator {
param($Arguments) param($Arguments)

View file

@ -7,7 +7,7 @@
Start-SoftwareInstaller @args ` Start-SoftwareInstaller @args `
-Installer { -Installer {
Install-WingetPackage JanDeDobbeleer.OhMyPosh -ArgumentList "--scope","machine"; Install-WingetPackage JanDeDobbeleer.OhMyPosh -ArgumentList "--scope", "machine";
} ` } `
-Configurator { -Configurator {
. $base -Action ([InstallerAction]::Configure) @args; . $base -Action ([InstallerAction]::Configure) @args;

View file

@ -6,7 +6,7 @@ using namespace Microsoft.Win32;
Start-SoftwareInstaller @args ` Start-SoftwareInstaller @args `
-Installer { -Installer {
Install-ChocoPackage thunderbird -ArgumentList "--params",'"/NoTaskbarShortcut /NoDesktopShortcut"' Install-ChocoPackage thunderbird -ArgumentList "--params", '"/NoTaskbarShortcut /NoDesktopShortcut"';
} ` } `
-Configurator { -Configurator {
Write-Host "Making Thunderbird the default mail program…"; Write-Host "Making Thunderbird the default mail program…";

View file

@ -19,12 +19,12 @@ function Get-TMForeverInstallerComponents {
) )
@{ @{
context = @{ context = @{
iconName = $IconName; iconName = $IconName;
userDirectory = $UserDirectory; userDirectory = $UserDirectory;
installer = $Installer; installer = $Installer;
}; };
installer = { installer = {
param([hashtable] $Context) param([hashtable] $Context)
$iconName = $Context.IconName; $iconName = $Context.IconName;
@ -38,7 +38,7 @@ function Get-TMForeverInstallerComponents {
& $Context.Installer; & $Context.Installer;
Remove-DesktopIcon "*$iconName*"; Remove-DesktopIcon "*$iconName*";
}; };
userBackup = { userBackup = {
param( param(
[string] $Name, [string] $Name,
[hashtable] $Context [hashtable] $Context

View file

@ -6,9 +6,9 @@ Start-SoftwareInstaller @args `
-Installer { -Installer {
Write-Information "Downgrading AutoHotkey…"; Write-Information "Downgrading AutoHotkey…";
$id = "AutoHotkey.AutoHotkey"; $id = "AutoHotkey.AutoHotkey";
$uninstall = { winget uninstall --accept-source-agreements -e --id "$id"; }; $uninstall = { winget uninstall --accept-source-agreements -e --id "$id" };
& $uninstall; & $uninstall;
Install-WingetPackage $id -ArgumentList "--version","1.1.37.00"; Install-WingetPackage $id -ArgumentList "--version", "1.1.37.00";
Install-ChocoPackage temurin11jre; Install-ChocoPackage temurin11jre;
Write-Host "Installing UniFi Controller…"; Write-Host "Installing UniFi Controller…";

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