liminix

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

default.nix (2358B)


      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/services/outputs";
     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 }