default.nix (2355B)
1 { 2 stdenvNoCC 3 , s6-rc 4 , s6 5 , lib 6 , callPackage 7 , writeScript 8 , serviceFns 9 }: 10 let 11 inherit (builtins) concatStringsSep; 12 prefix = "/run/service-state"; 13 output = service: name: "${prefix}/${service.name}/${name}"; 14 serviceScript = commands : '' 15 #!/bin/sh 16 exec 2>&1 17 . ${serviceFns} 18 ${commands} 19 ''; 20 cleanupScript = name : '' 21 if test -d ${prefix}/${name} ; then rm -rf ${prefix}/${name} ; fi 22 ''; 23 service = { 24 name 25 , serviceType 26 , run ? null 27 , up ? null 28 , down ? null 29 , outputs ? [] 30 , notification-fd ? null 31 , producer-for ? null 32 , consumer-for ? null 33 , pipeline-name ? null 34 , dependencies ? [] 35 , contents ? [] 36 , buildInputs ? [] 37 } @ args: 38 stdenvNoCC.mkDerivation { 39 # we use stdenvNoCC to avoid generating derivations with names 40 # like foo.service-mips-linux-musl 41 inherit name serviceType up down run notification-fd 42 producer-for consumer-for pipeline-name; 43 buildInputs = buildInputs ++ dependencies ++ contents; 44 dependencies = builtins.map (d: d.name) dependencies; 45 contents = builtins.map (d: d.name) contents; 46 builder = ./builder.sh; 47 }; 48 49 longrun = { 50 name 51 , run 52 , outputs ? [] 53 , notification-fd ? null 54 , dependencies ? [] 55 , ... 56 } @ args: 57 let logger = service { 58 serviceType = "longrun"; 59 name = "${name}-log"; 60 run = serviceScript "${s6}/bin/s6-log -d 10 -- p${name} 1"; 61 notification-fd = 10; 62 consumer-for = name; 63 pipeline-name = "${name}-pipeline"; 64 }; 65 in service (args // { 66 buildInputs = [ logger ]; 67 serviceType = "longrun"; 68 run = serviceScript "${run}\n${cleanupScript name}"; 69 producer-for = "${name}-log"; 70 }); 71 72 oneshot = { 73 name 74 , up 75 , down ? "" 76 , outputs ? [] 77 , dependencies ? [] 78 , ... 79 } @ args : service (args // { 80 serviceType = "oneshot"; 81 up = writeScript "${name}-up" (serviceScript up); 82 down = writeScript 83 "${name}-down" 84 "${serviceScript down}\n${cleanupScript name}"; 85 }); 86 bundle = { 87 name 88 , contents ? [] 89 , dependencies ? [] 90 , ... 91 } @ args: service (args // { 92 serviceType = "bundle"; 93 inherit contents dependencies; 94 }); 95 target = bundle; 96 in { 97 inherit target bundle oneshot longrun output; 98 }