diff options
Diffstat (limited to 'krebs')
| -rw-r--r-- | krebs/3modules/build.nix | 138 | ||||
| -rw-r--r-- | krebs/4lib/types.nix | 69 | ||||
| -rwxr-xr-x | krebs/5pkgs/test/infest-cac-centos7/notes | 4 | 
3 files changed, 72 insertions, 139 deletions
diff --git a/krebs/3modules/build.nix b/krebs/3modules/build.nix index 9cd095622..5924d1033 100644 --- a/krebs/3modules/build.nix +++ b/krebs/3modules/build.nix @@ -21,145 +21,9 @@ let      };      options.krebs.build.source = mkOption { -      type = with types; attrsOf (either str (submodule { -        options = { -          url = str; -          rev = str; -        }; -      })); +      type = types.attrsOf types.source;        default = {};      }; - -    options.krebs.build.populate = mkOption { -      type = types.str; -      default = let -        target-user = maybeEnv "target_user" "root"; -        target-host = maybeEnv "target_host" config.krebs.build.host.name; -        target-port = maybeEnv "target_port" "22"; -        target-path = maybeEnv "target_path" "/var/src"; -        out = '' -          #! /bin/sh -          set -eu - -          ssh=''${ssh-ssh} - -          verbose() { -            printf '%s%s\n' "$PS5$(printf ' %q' "$@")" >&2 -            "$@" -          } - -          { printf 'PS5=%q%q\n' @ "$PS5" -            echo ${shell.escape git-script} -          } | verbose $ssh -p ${shell.escape target-port} \ -                  ${shell.escape "${target-user}@${target-host}"} -T - -          unset tmpdir -          trap ' -            rm -f "$tmpdir"/* -            rmdir "$tmpdir" -            trap - EXIT INT QUIT -          '        EXIT INT QUIT -          tmpdir=$(mktemp -dt stockholm.XXXXXXXX) -          chmod 0755 "$tmpdir" - -          ${concatStringsSep "\n" (mapAttrsToList (name: symlink: '' -            verbose ln -s ${shell.escape symlink.target} \ -                          "$tmpdir"/${shell.escape name} -          '') source-by-method.symlink)} - -          verbose proot \ -              -b "$tmpdir":${shell.escape target-path} \ -              ${concatStringsSep " \\\n    " (mapAttrsToList (name: file: -                "-b ${shell.escape "${file.path}:${target-path}/${name}"}" -              ) source-by-method.file)} \ -              rsync \ -                  -f ${shell.escape "P /*"} \ -                  ${concatMapStringsSep " \\\n        " (name: -                    "-f ${shell.escape "R /${name}"}" -                  ) (attrNames source-by-method.file)} \ -                  --delete \ -                  -vFrlptD \ -                  -e "$ssh -p ${shell.escape target-port}" \ -                  ${shell.escape target-path}/ \ -                  ${shell.escape "${target-user}@${target-host}:${target-path}"} -        ''; - -        git-script = '' -          #! /bin/sh -          set -efu - -          export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt - -          verbose() { -            printf '%s%s\n' "$PS5$(printf ' %q' "$@")" >&2 -            "$@" -          } - -          fetch_git() {( -            dst_dir=$1 -            src_url=$2 -            src_ref=$3 - -            if ! test -e "$dst_dir"; then -              git clone "$src_url" "$dst_dir" -            fi - -            cd "$dst_dir" - -            if ! url=$(git config remote.origin.url); then -              git remote add origin "$src_url" -            elif test "$url" != "$src_url"; then -              git remote set-url origin "$src_url" -            fi - -            # TODO resolve src_ref to commit hash -            hash=$src_ref - -            if ! test "$(git log --format=%H -1)" = "$hash"; then -              git fetch origin -              git checkout "$hash" -- "$dst_dir" -              git checkout -f "$hash" -            fi - -            git clean -dxf -          )} - -          ${concatStringsSep "\n" (mapAttrsToList (name: git: '' -            verbose fetch_git ${concatMapStringsSep " " shell.escape [ -              "${target-path}/${name}" -              git.url -              git.rev -            ]} -          '') source-by-method.git)} -        ''; -      in out; -    }; - -  }; - -  source-by-method = let -    known-methods = ["git" "file" "symlink"]; -  in genAttrs known-methods (const {}) // recursiveUpdate source-by-scheme { -    git = source-by-scheme.http or {} // -          source-by-scheme.https or {};    }; -  source-by-scheme = foldl' (out: { k, v }: recursiveUpdate out { -    ${v.scheme}.${k} = v; -  }) {} (mapAttrsToList (k: v: { inherit k v; }) normalized-source); - -  normalized-source = mapAttrs (name: let f = x: getAttr (typeOf x) { -    path = f (toString x); -    string = f { -      url = if substring 0 1 x == "/" then "file://${x}" else x; -    }; -    set = let scheme = head (splitString ":" x.url); in recursiveUpdate x { -      inherit scheme; -    } // { -      symlink.target = removePrefix "symlink:" x.url; -      file.path = # TODO file://host/... -                  assert hasPrefix "file:///" x.url; -                  removePrefix "file://" x.url; -    }.${scheme} or {}; -  }; in f) config.krebs.build.source;  in out diff --git a/krebs/4lib/types.nix b/krebs/4lib/types.nix index aa7b7a9f5..8906eff4a 100644 --- a/krebs/4lib/types.nix +++ b/krebs/4lib/types.nix @@ -188,6 +188,75 @@ types // rec {      };    }); + +  source = submodule ({ config, ... }: { +    options = { +      type = let +        types = ["file" "git" "symlink"]; +      in mkOption { +        type = enum types; +        default = let +          cands = filter (k: config.${k} != null) types; +        in +          if length cands == 1 +            then head cands +            else throw "cannot determine type"; +      }; +      file = let +        file-path = (file-source.getSubOptions "FIXME").path.type; +      in mkOption { +        type = nullOr (either file-source file-path); +        default = null; +        apply = x: +          if file-path.check x +            then { path = x; } +            else x; +      }; +      git = mkOption { +        type = nullOr git-source; +        default = null; +      }; +      symlink = let +        symlink-target = (symlink-source.getSubOptions "FIXME").target.type; +      in mkOption { +        type = nullOr (either symlink-source symlink-target); +        default = null; +        apply = x: +          if symlink-target.check x +            then { target = x; } +            else x; +      }; +    }; +  }); + +  file-source = submodule { +    options = { +      path = mkOption { +        type = absolute-pathname; +      }; +    }; +  }; + +  git-source = submodule { +    options = { +      ref = mkOption { +        type = str; # TODO types.git.ref +      }; +      url = mkOption { +        type = str; # TODO types.git.url +      }; +    }; +  }; + +  symlink-source = submodule { +    options = { +      target = mkOption { +        type = pathname; # TODO relative-pathname +      }; +    }; +  }; + +    suffixed-str = suffs:      mkOptionType {        name = "string suffixed by ${concatStringsSep ", " suffs}"; diff --git a/krebs/5pkgs/test/infest-cac-centos7/notes b/krebs/5pkgs/test/infest-cac-centos7/notes index ab6bc557c..2a3ebd6fc 100755 --- a/krebs/5pkgs/test/infest-cac-centos7/notes +++ b/krebs/5pkgs/test/infest-cac-centos7/notes @@ -138,8 +138,8 @@ ip=$(cac-api getserver $id | jq -r .ip)  cat > shared/2configs/temp/dirs.nix <<EOF  _: {    krebs.build.source = { -    secrets = "$krebs_secrets"; -    stockholm = "$(pwd)"; +    secrets.file = "$krebs_secrets"; +    stockholm.file = "$(pwd)";    };    users.extraUsers.root.openssh.authorizedKeys.keys = [      "$(cat ${krebs_ssh}.pub)"  | 
