{ fetchurl, writeText, libguestfs-with-appliance-nix, pkgsCross, qemu, runCommand, cpio, writeShellApplication, sshPassword, sshPort, httpPort, writeScript, }: let updateName = "remarkable-production-image-3.27.1.0-rm2-public"; updateArchive = fetchurl { url = # TODO: this is not an official source. might be worth authenticating the updates "https://remarkable-software.s3.us-east-2.amazonaws.com/${updateName}.swu"; hash = "sha256-QPS2n/S1RqkXe0Tg8bAODnvcG5aUOYsAtPvKYwEYGsI="; }; xochitlConfig = writeText "xochitl.conf" '' [General] DeveloperPassword=${sshPassword} AirplaneMode=true 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" ''; mmcSymlinkUdevRule = writeText "" '' ACTION=="add", KERNEL=="vda", SYMLINK+="mmcblk2" ACTION=="add", KERNEL=="vda[0-9]", SYMLINK+="mmcblk2p%n" ''; usbNetworkConfig = writeText "10-usb.network" '' [Match] Name=usb* [Network] DHCP=yes ''; usbWaitOnlineService = writeText "usb0-wait-online.service" '' [Unit] Description=Wait for usb0 to be routable Before=network-online.target [Service] Type=oneshot ExecStart=/bin/sh -c 'until ip -4 addr show usb0 | grep -q "inet "; do sleep 1; done' RemainAfterExit=yes [Install] WantedBy=network-online.target ''; xochitlService = writeText "xochitl.service" '' [Unit] Description=reMarkable main application DefaultDependencies=no Conflicts=shutdown.target Before=shutdown.target # add network-online.target to the original dependencies so that xochitl # can bind to the usb0 interface when it starts Wants=rm-sync.service network-online.target After=var-lib-uboot.mount dbus.socket network-online.target Requires=dbus.socket [Service] ExecStart=/usr/bin/xochitl --system Restart=on-failure NotifyAccess=all # required to make xochitl run Environment=LD_PRELOAD=/usr/lib/libfakefbdev.so [Install] WantedBy=multi-user.target ''; fakefbdev = pkgsCross.armv7l-hf-multiplatform.stdenv.mkDerivation { name = "fakefbdev"; src = ./fakefbdev; installFlags = [ "DESTDIR=${placeholder "out"}" ]; }; doNothing = writeScript "do-nothing" '' #!/bin/sh ''; kernel = pkgsCross.armv7l-hf-multiplatform.linux; rootfsImage = runCommand "rm-rootfs.ext4" { nativeBuildInputs = [ cpio ]; } '' cpio -i --file ${updateArchive} gzip -dc ${updateName}.ext4.gz > $out ''; diskImage = runCommand "rm-disk.qcow2" { nativeBuildInputs = [ qemu libguestfs-with-appliance-nix ]; } '' qemu-img create -f qcow2 $out 8G guestfish --rw --blocksize=512 --add $out <