about summary refs log tree commit diff
path: root/flake.nix
diff options
context:
space:
mode:
Diffstat (limited to 'flake.nix')
-rw-r--r--flake.nix163
1 files changed, 163 insertions, 0 deletions
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..09774ee
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,163 @@
+{
+  inputs = {
+    nixpkgs.url = "github:malte-v/nixpkgs/libguestfs-appliance-fix";
+    flake-utils.url = "github:numtide/flake-utils";
+    ddvk-stuff = {
+      url = "github:ddvk/stuff";
+      flake = false;
+    };
+  };
+  outputs = { self, nixpkgs, flake-utils, ddvk-stuff }: flake-utils.lib.eachDefaultSystem (system:
+    let
+      pkgs = import nixpkgs { inherit system; };
+
+      updateArchive = pkgs.fetchurl {
+        url = "https://updates-download.cloud.remarkable.engineering/build/reMarkable%20Device/reMarkable2/3.10.2.2063/3.10.2.2063_reMarkable2-zKnOgdh8c5.signed";
+        hash = "sha256-2w2hE4EG1i8B5TORn+n0gAIHNhsey/NHMsv+cCApHVQ=";
+      };
+
+      sshPassword = "1234";
+      sshPort = 43922;
+      httpPort = 43980;
+
+      xochitlConfig = pkgs.writeText "xochitl.conf" ''
+        [General]
+        DeveloperPassword=${sshPassword}
+        wifion=false
+        WebInterfaceEnabled=true
+      '';
+
+      usbMacAddr = "52:54:00:12:34:56";
+
+      ifnameUdevRule = pkgs.writeText "70-persistent-net.rules" ''
+        SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", \
+          ATTR{address}=="${usbMacAddr}", \
+          ATTR{type}=="1", KERNEL=="eth*", NAME="usb0"
+      '';
+
+      fakefbdev = pkgs.pkgsCross.remarkable2.gcc11Stdenv.mkDerivation {
+        name = "fakefbdev";
+        src = ./fakefbdev;
+
+        installFlags = [ "DESTDIR=${placeholder "out"}" ];
+      };
+
+      rootfs = pkgs.runCommand "rm-rootfs.qcow2"
+        {
+          nativeBuildInputs = with pkgs; [
+            (python3.withPackages (pypkgs: [ pypkgs.protobuf ]))
+            qemu
+            libguestfs-with-appliance
+          ];
+        } ''
+        python3 ${ddvk-stuff}/extractor/extractor.py ${updateArchive} rootfs.ext4
+
+        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 rootfs.ext4 /dev/sda2
+        mkfs ext4 /dev/sda3
+        mkfs ext4 /dev/sda4
+
+        mount /dev/sda2 /
+
+        download /etc/fstab fstab
+        ! sed -i 's/mmcblk2/mmcblk1/' 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/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 = pkgs.pkgsCross.armv7l-hf-multiplatform.linux_5_4.override {
+        defconfig = "imx_v6_v7_defconfig";
+      };
+
+      server = pkgs.writeShellApplication {
+        name = "reMder-server";
+
+        runtimeInputs = [ pkgs.qemu ];
+
+        text = ''
+          qemu-img create -b ${rootfs} -F qcow2 -f qcow2 ./reMder.qcow2
+
+          qemu-system-arm \
+              -machine mcimx7d-sabre \
+              -cpu cortex-a9 \
+              -m 2048 \
+              -kernel ${kernel}/zImage \
+              -dtb ${kernel}/dtbs/imx7d-sbc-imx7.dtb \
+              -drive if=sd,file=./reMder.qcow2,format=qcow2,index=2 \
+              -append "console=ttymxc0 video=vfb: rootfstype=ext4 root=/dev/mmcblk1p2 rw rootwait init=/sbin/init" \
+              -nic user,hostfwd=tcp::${toString sshPort}-:22,hostfwd=tcp::${toString httpPort}-:80,mac=${usbMacAddr} \
+              -nographic
+        '';
+      };
+
+      client = pkgs.writeShellApplication {
+        name = "reMder-client";
+
+        runtimeInputs = with pkgs; [ curl openssh sshpass ];
+
+        text =
+          let
+            ssh = "sshpass -p ${sshPassword} ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${toString sshPort}";
+            scp = "sshpass -p ${sshPassword} scp -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -P ${toString sshPort}";
+            guest = "root@127.0.0.1";
+            documentDir = "/home/root/.local/share/remarkable/xochitl";
+          in
+          ''
+            in="$1"
+            out="$2"
+
+            in_basename="$(basename "$in")"
+
+            ${ssh} ${guest} rm -rf "${documentDir}"
+            ${ssh} ${guest} mkdir "${documentDir}"
+
+            ${scp} "$in" ${guest}:${documentDir} 
+            ${ssh} ${guest} unzip "${documentDir}/$in_basename" -d ${documentDir}
+            doc_id="$(${ssh} ${guest} find ${documentDir} -mindepth 1 -type d ! -name '\*.\*' -exec basename {} '\;')"
+
+            curl -o "$out" "http://127.0.0.1:${toString httpPort}/download/$doc_id/placeholder"
+          '';
+      };
+
+      package = pkgs.symlinkJoin {
+        name = "reMder";
+        paths = [ client server ];
+      };
+    in
+    {
+      packages.reMder = package;
+      defaultPackage = package;
+    }
+  );
+}