{
  stdenv
, python3
, qemu
, fetchzip
, writeShellApplication
}:
let
  chr-image = fetchzip {
    url = "https://download.mikrotik.com/routeros/7.7/chr-7.7.img.zip";
    hash = "sha256-utBQMUgNvl/UTG+GjnQShlGgVtHmRKtnhSTWW/JyeiY=";
    curlOpts = "-L";
  };
  ros-exec-script = stdenv.mkDerivation {
    name = "ros-exec-script";
    src = ./.;
    buildInputs = [python3];
    buildPhase = ":";
    installPhase = ''
      mkdir -p $out/bin
      cp ros-exec-script.py $out/bin/ros-exec-script
      chmod +x $out/bin/ros-exec-script
    '';
  };
  routeros = writeShellApplication {
    name = "routeros";
    runtimeInputs = [ qemu ros-exec-script ];
    text = ''
    RUNTIME_DIRECTORY=$1
    test -d "$RUNTIME_DIRECTORY" || exit 1
    ${qemu}/bin/qemu-system-x86_64 \
      -M q35  \
      -m 1024 \
      -accel kvm \
      -display none \
      -daemonize \
      -pidfile "$RUNTIME_DIRECTORY/pid" \
      -serial "unix:$RUNTIME_DIRECTORY/console,server,nowait"\
      -monitor "unix:$RUNTIME_DIRECTORY/monitor,server,nowait" \
      -snapshot -drive file=${chr-image}/chr-7.7.img,format=raw,if=virtio \
      -chardev "socket,path=$RUNTIME_DIRECTORY/qmp,server=on,wait=off,id=qga0" \
      -device virtio-serial \
      -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 \
      -netdev socket,id=access,mcast=230.0.0.1:1234,localaddr=127.0.0.1 \
      -device virtio-net-pci,disable-legacy=on,disable-modern=off,netdev=access,mac=ba:ad:1d:ea:11:02 \
      -netdev socket,id=world,mcast=230.0.0.1:1236,localaddr=127.0.0.1 \
      -device virtio-net-pci,disable-legacy=on,disable-modern=off,netdev=world,mac=ba:ad:1d:ea:11:01
    ros-exec-script "$RUNTIME_DIRECTORY/qmp" ${./routeros.config}
    '';
  };
in {
  inherit routeros ros-exec-script;
}