diff options
author | Malte Voos <git@mal.tc> | 2024-12-19 21:57:44 +0100 |
---|---|---|
committer | Malte Voos <git@mal.tc> | 2024-12-19 21:58:25 +0100 |
commit | 806dc1ed43be0e638fc1d60881afdae812d0e4e6 (patch) | |
tree | 5dc850e823e1ebf111fd7c9600361bdcab88f70e | |
parent | df4d1f249b631d8dc19db846cdb9deb4e0d01f3b (diff) | |
download | reMder-806dc1ed43be0e638fc1d60881afdae812d0e4e6.tar.gz reMder-806dc1ed43be0e638fc1d60881afdae812d0e4e6.zip |
switch to rmpp image
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | client.nix | 33 | ||||
-rw-r--r-- | flake.lock | 17 | ||||
-rw-r--r-- | flake.nix | 204 | ||||
-rw-r--r-- | server.nix | 132 |
5 files changed, 191 insertions, 197 deletions
diff --git a/README.md b/README.md index 44e6605..45b3933 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ interface's PDF rendering functionality to render your documents. As a result, it should be able to render any reMarkable document, in particular those created on newer firmware versions. -Currently, reMder uses firmware version v3.10.2.2063. +Currently, reMder uses firmware version v3.11.2.5. ## Building diff --git a/client.nix b/client.nix new file mode 100644 index 0000000..67c083c --- /dev/null +++ b/client.nix @@ -0,0 +1,33 @@ +{ writeShellApplication, curl, openssh, sshpass, rsync, sshPassword, sshPort +, httpPort }: + +writeShellApplication { + name = "reMder-client"; + + runtimeInputs = [ curl openssh sshpass rsync ]; + + text = let + ssh = + "sshpass -p ${sshPassword} ssh -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} + + rsync --rsh="${ssh}" "$in" ${guest}:${documentDir} + ${ssh} ${guest} "unzip '${documentDir}/$in_basename' -d ${documentDir}" + doc_id="$(${ssh} ${guest} find ${documentDir} -name '\*.metadata' -exec basename {} .metadata '\;')" + + curl -f -o "$out" "http://127.0.0.1:${ + toString httpPort + }/download/$doc_id/placeholder" + ''; +} diff --git a/flake.lock b/flake.lock index 814cffa..e1d7304 100644 --- a/flake.lock +++ b/flake.lock @@ -1,21 +1,5 @@ { "nodes": { - "ddvk-stuff": { - "flake": false, - "locked": { - "lastModified": 1607373149, - "narHash": "sha256-CrP+/BP821xXz4avuGac1+qbNGhWBi1aUkTbpYxB17c=", - "owner": "ddvk", - "repo": "stuff", - "rev": "69158ac525b97294e1dc0e929bc19e50834741d9", - "type": "github" - }, - "original": { - "owner": "ddvk", - "repo": "stuff", - "type": "github" - } - }, "flake-utils": { "inputs": { "systems": "systems" @@ -52,7 +36,6 @@ }, "root": { "inputs": { - "ddvk-stuff": "ddvk-stuff", "flake-utils": "flake-utils", "nixpkgs": "nixpkgs" } diff --git a/flake.nix b/flake.nix index 0f2ca48..97a3723 100644 --- a/flake.nix +++ b/flake.nix @@ -2,184 +2,30 @@ 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 - IdleSuspendDelay=0 - SuspendPowerOffDelay=0 - ''; - - 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" - ''; - - xochitlService = pkgs.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 - - [Install] - WantedBy=multi-user.target - ''; - - 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/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 = pkgs.pkgsCross.armv7l-hf-multiplatform.linux_5_4; - - server = pkgs.writeShellApplication { - name = "reMder-server"; - - runtimeInputs = [ pkgs.qemu ]; - - text = '' - qemu-img create -b ${rootfs} -F qcow2 -f qcow2 ./reMder.qcow2 - - qemu-system-aarch64 \ - -enable-kvm \ - -machine virt \ - -cpu host,aarch64=off \ - -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 - ''; - }; - - client = pkgs.writeShellApplication { - name = "reMder-client"; - - runtimeInputs = with pkgs; [ curl openssh sshpass rsync ]; - - text = - let - ssh = "sshpass -p ${sshPassword} ssh -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} - - rsync --rsh="${ssh}" "$in" ${guest}:${documentDir} - ${ssh} ${guest} "unzip '${documentDir}/$in_basename' -d ${documentDir}" - doc_id="$(${ssh} ${guest} find ${documentDir} -name '\*.metadata' -exec basename {} .metadata '\;')" - - curl -f -o "$out" "http://127.0.0.1:${toString httpPort}/download/$doc_id/placeholder" - ''; - }; - - reMder = pkgs.symlinkJoin { - name = "reMder"; - paths = [ client server ]; - }; - in - { - packages = { - inherit reMder fakefbdev; - }; - - defaultPackage = reMder; - } - ); + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = import nixpkgs { inherit system; }; + + sshPassword = "1234"; + sshPort = 43922; + httpPort = 43980; + + server = pkgs.callPackage ./server.nix { + inherit sshPassword sshPort httpPort; + }; + client = pkgs.callPackage ./client.nix { + inherit sshPassword sshPort httpPort; + }; + + # reMder = pkgs.symlinkJoin { + # name = "reMder"; + # paths = [ client server ]; + # }; + in { + packages = { inherit server; }; + + # defaultPackage = reMder; + }); } 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 + ''; +} |