diff options
Diffstat (limited to 'flake.nix')
-rw-r--r-- | flake.nix | 163 |
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; + } + ); +} |