1{ pkgs, lib, ... }: 2let 3 demo-program = pkgs.writeShellScriptBin "demo" '' 4 while ${pkgs.coreutils}/bin/sleep 3; do 5 echo Hello World > /dev/null 6 done 7 ''; 8 demo-service = pkgs.writeText "demo.service" '' 9 [Unit] 10 Description=demo service 11 Requires=demo.socket 12 After=demo.socket 13 14 [Service] 15 Type=simple 16 ExecStart=${demo-program}/bin/demo 17 Restart=always 18 19 [Install] 20 WantedBy=multi-user.target 21 Also=demo.socket 22 ''; 23 demo-socket = pkgs.writeText "demo.socket" '' 24 [Unit] 25 Description=demo socket 26 27 [Socket] 28 ListenStream=/run/demo.sock 29 SocketMode=0666 30 31 [Install] 32 WantedBy=sockets.target 33 ''; 34 demo-portable = pkgs.portableService { 35 pname = "demo"; 36 version = "1.0"; 37 description = ''A demo "Portable Service" for a shell program built with nix''; 38 units = [ 39 demo-service 40 demo-socket 41 ]; 42 }; 43in 44{ 45 46 name = "systemd-portabled"; 47 nodes.machine = { }; 48 testScript = '' 49 machine.succeed("portablectl") 50 machine.wait_for_unit("systemd-portabled.service") 51 machine.succeed("portablectl attach --now --runtime ${demo-portable}/demo_1.0.raw") 52 machine.wait_for_unit("demo.service") 53 machine.succeed("portablectl detach --now --runtime demo_1.0") 54 machine.fail("systemctl status demo.service") 55 ''; 56}