88 lines
2.2 KiB
Nix
88 lines
2.2 KiB
Nix
{ config, pkgs, lib, ... }:
|
|
|
|
let installer = pkgs.writeShellApplication {
|
|
name = "cascade-installer";
|
|
runtimeInputs = with pkgs; [
|
|
btrfs-progs
|
|
coreutils
|
|
cryptsetup
|
|
dig
|
|
dosfstools
|
|
e2fsprogs
|
|
git
|
|
lvm2
|
|
nix
|
|
parted
|
|
util-linux
|
|
];
|
|
|
|
text =
|
|
let
|
|
shq = lib.escapeShellArg;
|
|
partedMin = cmd: ''
|
|
parted -f -a minimal "$DEVICE" --script ${cmd}
|
|
'';
|
|
partedOpt = cmd: ''
|
|
parted -f -a optimal "$DEVICE" --script ${cmd}
|
|
'';
|
|
in
|
|
''
|
|
if [ "$#" -ne 2 ];then
|
|
1>&2 echo "usage: $0 hostname full-disk-device"
|
|
exit 1
|
|
fi
|
|
HOSTNAME="$1"
|
|
DEVICE="$2"
|
|
LABEL="$HOSTNAME"-luks0
|
|
LV="$HOSTNAME"-luks
|
|
|
|
echo ABOUT TO DESTROY THIS MACHINE
|
|
sleep 10 || exit 1
|
|
|
|
wipefs -a "$DEVICE"
|
|
|
|
${partedMin "mklabel gpt"}
|
|
${partedMin "mkpart ESP fat32 0% 1GB"}
|
|
${partedMin "set 1 esp on"}
|
|
${partedOpt "mkpart \"$HOSTNAME\"-luks0 ext4 1GB 100%"}
|
|
|
|
sleep 1
|
|
|
|
cryptsetup -q luksFormat --type luks2 /dev/disk/by-partlabel/"$LABEL" -d /dev/zero -l 32
|
|
cryptsetup -q luksOpen /dev/disk/by-partlabel/"$LABEL" "$LABEL" -d /dev/zero -l 32
|
|
|
|
pvcreate /dev/mapper/"$LABEL"
|
|
vgcreate "$LV" /dev/mapper/"$LABEL"
|
|
lvcreate -L 20G -n "$HOSTNAME"-root "$LV"
|
|
|
|
mkfs.fat -F 32 -n BOOT /dev/disk/by-partlabel/ESP
|
|
mkfs.ext4 -L "$HOSTNAME"-root /dev/"$LV"/"$HOSTNAME"-root
|
|
|
|
sleep 1
|
|
|
|
# note to future self who "fixes" this:
|
|
# the -p is to prevent error if the path exists, not to create / which obviously exists.
|
|
# this is a scenario that happens when rerunning these commands during debugging. just
|
|
# leave the -p, future me. please just leave it.
|
|
mkdir -p /mnt
|
|
mount /dev/disk/by-label/"$HOSTNAME"-root /mnt
|
|
mkdir -p /mnt/boot
|
|
mount /dev/disk/by-label/BOOT /mnt/boot
|
|
mkdir -p /mnt/root
|
|
|
|
TOKEN="$(dig +short lan-git-token.cascade TXT | tr -d '"')"
|
|
umask 0077
|
|
mkdir -p /root
|
|
printf 'machine git.strudelline.net\nlogin james\npassword %s\n' "$TOKEN" > /root/.netrc
|
|
printf 'machine git.strudelline.net\nlogin james\npassword %s\n' "$TOKEN" > /mnt/root/.netrc
|
|
|
|
nixos-install --flake git+https://git.strudelline.net/cascade/nixos#"$HOSTNAME" --impure --no-root-password
|
|
'';
|
|
};
|
|
in
|
|
{
|
|
environment.systemPackages = [
|
|
installer
|
|
];
|
|
}
|