aboutsummaryrefslogtreecommitdiff
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;
+ }
+ );
+}