about summary refs log tree commit diff
path: root/server.nix
diff options
context:
space:
mode:
Diffstat (limited to 'server.nix')
-rw-r--r--server.nix132
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
+  '';
+}