diff options
Diffstat (limited to 'server.nix')
-rw-r--r-- | server.nix | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/server.nix b/server.nix new file mode 100644 index 0000000..31462cd --- /dev/null +++ b/server.nix @@ -0,0 +1,132 @@ +{ fetchurl, writeText, libguestfs-with-appliance, pkgsCross, qemu, runCommand +, writeShellApplication, sshPassword, sshPort, httpPort }: +let + updateName = "remarkable-ct-prototype-image-3.16.1.0-ferrari-public"; + + updateArchive = fetchurl { + url = + # TODO: this is not an official source. might be worth authenticating the updates + "https://storage.googleapis.com/remarkable-versions/${updateName}.swu"; + hash = ""; + }; + + xochitlConfig = writeText "xochitl.conf" '' + [General] + DeveloperPassword=${sshPassword} + wifion=false + WebInterfaceEnabled=true + IdleSuspendDelay=0 + SuspendPowerOffDelay=0 + ''; + + usbMacAddr = "52:54:00:12:34:56"; + + ifnameUdevRule = writeText "70-persistent-net.rules" '' + SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", \ + ATTR{address}=="${usbMacAddr}", \ + ATTR{type}=="1", KERNEL=="eth*", NAME="usb0" + ''; + + xochitlService = writeText "xochitl.service" '' + [Unit] + Description=reMarkable main application + After=home.mount network.target + + [Service] + ExecStart=/usr/bin/xochitl --system + Restart=always + # required to make xochitl run + # Environment=LD_PRELOAD=/usr/lib/libfakefbdev.so # TODO uncomment? + + [Install] + WantedBy=multi-user.target + ''; + + fakefbdev = pkgsCross.remarkable2.gcc11Stdenv.mkDerivation { + name = "fakefbdev"; + src = ./fakefbdev; + + installFlags = [ "DESTDIR=${placeholder "out"}" ]; + }; + + rootfsImage = runCommand "rm-rootfs.ext4" '' + cpio -i --file ${updateArchive} + gzip -dc ${updateName}.ext4.verity.gz > $out + ''; + + diskImage = runCommand "rm-disk.qcow2" { + nativeBuildInputs = [ qemu libguestfs-with-appliance ]; + } '' + qemu-img create -f qcow2 $out 8G + + guestfish --rw --blocksize=512 --add $out <<EOF + run + + part-init /dev/sda mbr + part-add /dev/sda p 2048 43007 + part-add /dev/sda p 43008 595967 + part-add /dev/sda p 595968 1148927 + part-add /dev/sda p 1148928 14942207 + + mkfs vfat /dev/sda1 + upload ${rootfsImage} /dev/sda2 + mkfs ext4 /dev/sda3 + mkfs ext4 /dev/sda4 + + mount /dev/sda2 / + + download /etc/fstab fstab + ! sed -i 's/mmcblk2p/vda/' fstab + upload fstab /etc/fstab + + upload ${ifnameUdevRule} /etc/udev/rules.d/70-persistent-net.rules + + download /lib/systemd/system/dhcpcd.service dhcpcd.service + ! sed -i 's/wlan/usb/' dhcpcd.service + upload dhcpcd.service /lib/systemd/system/dhcpcd.service + + rm /lib/systemd/system/remarkable-fail.service + rm /lib/systemd/system/rm-sync.service + upload ${xochitlService} /lib/systemd/system/xochitl.service + + upload ${fakefbdev}/lib/libfakefbdev.so /usr/lib/libfakefbdev.so + chmod 0755 /usr/lib/libfakefbdev.so + + mount /dev/sda4 /home + cp-a /etc/skel /home/root + + mkdir-p /home/root/.local/share/remarkable/xochitl + mkdir-p /home/root/.config/remarkable + upload ${xochitlConfig} /home/root/.config/remarkable/xochitl.conf + + EOF + ''; + + kernel = pkgsCross.aarch64-linux.linux_5_4; + +in writeShellApplication { + name = "reMder-server"; + + runtimeInputs = [ qemu ]; + + text = '' + qemu-img create -b ${diskImage} -F qcow2 -f qcow2 ./reMder.qcow2 + + qemu-system-aarch64 \ + -enable-kvm \ + -machine virt \ + -cpu host \ + -m 2048 \ + -kernel ${kernel}/zImage \ + -drive if=none,file=./reMder.qcow2,format=qcow2,id=hd \ + -device virtio-blk-device,drive=hd \ + -netdev user,hostfwd=tcp::${toString sshPort}-:22,hostfwd=tcp::${ + toString httpPort + }-:80,id=net \ + -device virtio-net-device,netdev=net,mac=${usbMacAddr} \ + -append "console=ttyAMA0 rootfstype=ext4 root=/dev/vda2 rw rootwait init=/sbin/init" \ + -serial stdio \ + -monitor none \ + -nographic + ''; +} |