diff options
Diffstat (limited to 'krebs')
| -rw-r--r-- | krebs/3modules/Reaktor.nix | 5 | ||||
| -rw-r--r-- | krebs/3modules/backup.nix | 286 | ||||
| -rw-r--r-- | krebs/3modules/buildbot/master.nix | 2 | ||||
| -rw-r--r-- | krebs/3modules/default.nix | 1 | ||||
| -rw-r--r-- | krebs/4lib/types.nix | 17 | ||||
| -rw-r--r-- | krebs/5pkgs/Reaktor/plugins.nix | 124 | ||||
| -rw-r--r-- | krebs/5pkgs/Reaktor/scripts/random-issue.sh | 20 | ||||
| -rw-r--r-- | krebs/5pkgs/Reaktor/scripts/sed-plugin.py | 53 | ||||
| -rw-r--r-- | krebs/5pkgs/Reaktor/scripts/shack-correct.sh | 6 | ||||
| -rwxr-xr-x | krebs/5pkgs/test/infest-cac-centos7/notes | 77 | ||||
| -rw-r--r-- | krebs/Zhosts/bobby | 11 | ||||
| -rw-r--r-- | krebs/default.nix | 21 | 
12 files changed, 567 insertions, 56 deletions
diff --git a/krebs/3modules/Reaktor.nix b/krebs/3modules/Reaktor.nix index 59058bffc..607eb7cac 100644 --- a/krebs/3modules/Reaktor.nix +++ b/krebs/3modules/Reaktor.nix @@ -9,6 +9,7 @@ let        ${cfg.overrideConfig}        '' else ""}        ## Extra Config +      ${concatStringsSep "\n" (map (plug: plug.config) cfg.plugins)}        ${cfg.extraConfig}      '';    cfg = config.krebs.Reaktor; @@ -35,7 +36,6 @@ let        '';      }; -      overrideConfig = mkOption {        default = null;        type = types.nullOr types.str; @@ -44,6 +44,9 @@ let          Reaktor default cfg can be retrieved via `reaktor get-config`        '';      }; +    plugins = mkOption { +      default = [pkgs.ReaktorPlugins.nixos-version]; +    };      extraConfig = mkOption {        default = "";        type = types.string; diff --git a/krebs/3modules/backup.nix b/krebs/3modules/backup.nix new file mode 100644 index 000000000..01bb16a2b --- /dev/null +++ b/krebs/3modules/backup.nix @@ -0,0 +1,286 @@ +{ config, lib, pkgs, ... }: +with lib; +let +  out = { +    options.krebs.backup = api; +    config = mkIf cfg.enable imp; +  }; + +  cfg = config.krebs.backup; + +  api = { +    enable = mkEnableOption "krebs.backup" // { default = true; }; +    plans = mkOption { +      default = {}; +      type = types.attrsOf (types.submodule ({ +        # TODO enable = mkEnableOption "TODO" // { default = true; }; +        options = { +          method = mkOption { +            type = types.enum ["pull" "push"]; +          }; +          name = mkOption { +            type = types.str; +          }; +          src = mkOption { +            type = types.krebs.file-location; +          }; +          dst = mkOption { +            type = types.krebs.file-location; +          }; +          startAt = mkOption { +            type = types.str; +          }; +          snapshots = mkOption { +            type = types.attrsOf (types.submodule { +              options = { +                format = mkOption { +                  type = types.str; # TODO date's +FORMAT +                }; +                retain = mkOption { +                  type = types.nullOr types.int; +                  default = null; # null = retain all snapshots +                }; +              }; +            }); +          }; +        }; +      })); +    }; +  }; + +  imp = { +    users.groups.backup.gid = genid "backup"; +    users.users = {} +      // { +        root.openssh.authorizedKeys.keys = +          map (plan: plan.dst.host.ssh.pubkey) +              (filter isPullSrc (attrValues cfg.plans)) +          ++ +          map (plan: plan.src.host.ssh.pubkey) +              (filter isPushDst (attrValues cfg.plans)) +          ; +      } +      ; +    systemd.services = +      flip mapAttrs' (filterAttrs (_:isPullDst) cfg.plans) (name: plan: { +        name = "backup.${name}.pull"; +        value = makePullService plan; +      }) +      // +      flip mapAttrs' (filterAttrs (_:isPushSrc) cfg.plans) (name: plan: { +        name = "backup.${name}.push"; +        value = makePushService plan; +      }) +      ; +  }; + +  isPushSrc = plan: +    plan.method == "push" && +    plan.src.host.name == config.krebs.build.host.name; + +  isPullSrc = plan: +    plan.method == "pull" && +    plan.src.host.name == config.krebs.build.host.name; + +  isPushDst = plan: +    plan.method == "push" && +    plan.dst.host.name == config.krebs.build.host.name; + +  isPullDst = plan: +    plan.method == "pull" && +    plan.dst.host.name == config.krebs.build.host.name; + +  # TODO push destination needs this in the dst.user's PATH +  service-path = [ +    pkgs.coreutils +    pkgs.gnused +    pkgs.openssh +    pkgs.rsync +    pkgs.utillinux +  ]; + +  # TODO if there is plan.user, then use its privkey +  makePushService = plan: assert isPushSrc plan; { +    path = service-path; +    serviceConfig = { +      ExecStart = push plan; +      Type = "oneshot"; +    }; +    startAt = plan.startAt; +  }; + +  makePullService = plan: assert isPullDst plan; { +    path = service-path; +    serviceConfig = { +      ExecStart = pull plan; +      Type = "oneshot"; +    }; +    startAt = plan.startAt; +  }; + +  push = plan: let +    # We use writeDashBin and return the absolute path so systemd will produce +    # nice names in the log, i.e. without the Nix store hash. +    out = "${main}/bin/${main.name}"; + +    main = writeDashBin "backup.${plan.name}.push" '' +      set -efu +      dst=${shell.escape plan.dst.path} + +      mkdir -m 0700 -p "$dst" +      exec flock -n "$dst" ${critical-section} +    ''; + +    critical-section = writeDash "backup.${plan.name}.push.critical-section" '' +      # TODO check if there is a previous +      set -efu +      identity=${shell.escape plan.src.host.ssh.privkey.path} +      src=${shell.escape plan.src.path} +      dst_target=${shell.escape "root@${getFQDN plan.dst.host}"} +      dst_path=${shell.escape plan.dst.path} +      dst=$dst_target:$dst_path + +      # Export NOW so runtime of rsync doesn't influence snapshot naming. +      export NOW +      NOW=$(date +%s) + +      echo >&2 "update snapshot: current; $src -> $dst" +      rsync >&2 \ +          -aAXF --delete \ +          -e "ssh -F /dev/null -i $identity" \ +          --rsync-path ${shell.escape +            "mkdir -m 0700 -p ${shell.escape plan.dst.path} && rsync"} \ +          --link-dest="$dst_path/current" \ +          "$src/" \ +          "$dst/.partial" + +      exec ssh -F /dev/null \ +          -i "$identity" \ +          "$dst_target" \ +          -T \ +          env NOW="$NOW" /bin/sh < ${remote-snapshot} +      EOF +    ''; + +    remote-snapshot = writeDash "backup.${plan.name}.push.remote-snapshot" '' +      set -efu +      dst=${shell.escape plan.dst.path} + +      if test -e "$dst/current"; then +        mv "$dst/current" "$dst/.previous" +      fi +      mv "$dst/.partial" "$dst/current" +      rm -fR "$dst/.previous" +      echo >&2 + +      (${(take-snapshots plan).text}) +    ''; + +  in out; + +  # TODO admit plan.dst.user and its ssh identity +  pull = plan: let +    # We use writeDashBin and return the absolute path so systemd will produce +    # nice names in the log, i.e. without the Nix store hash. +    out = "${main}/bin/${main.name}"; + +    main = writeDashBin "backup.${plan.name}.pull" '' +      set -efu +      dst=${shell.escape plan.dst.path} + +      mkdir -m 0700 -p "$dst" +      exec flock -n "$dst" ${critical-section} +    ''; + +    critical-section = writeDash "backup.${plan.name}.pull.critical-section" '' +      # TODO check if there is a previous +      set -efu +      identity=${shell.escape plan.dst.host.ssh.privkey.path} +      src=${shell.escape "root@${getFQDN plan.src.host}:${plan.src.path}"} +      dst=${shell.escape plan.dst.path} + +      # Export NOW so runtime of rsync doesn't influence snapshot naming. +      export NOW +      NOW=$(date +%s) + +      echo >&2 "update snapshot: current; $dst <- $src" +      mkdir -m 0700 -p ${shell.escape plan.dst.path} +      rsync >&2 \ +          -aAXF --delete \ +          -e "ssh -F /dev/null -i $identity" \ +          --link-dest="$dst/current" \ +          "$src/" \ +          "$dst/.partial" +      mv "$dst/current" "$dst/.previous" +      mv "$dst/.partial" "$dst/current" +      rm -fR "$dst/.previous" +      echo >&2 + +      exec ${take-snapshots plan} +    ''; +  in out; + +  take-snapshots = plan: writeDash "backup.${plan.name}.take-snapshots" '' +    set -efu +    NOW=''${NOW-$(date +%s)} +    dst=${shell.escape plan.dst.path} + +    snapshot() {( +      : $ns $format $retain +      name=$(date --date="@$NOW" +"$format") +      if ! test -e "$dst/$ns/$name"; then +        echo >&2 "create snapshot: $ns/$name" +        mkdir -m 0700 -p "$dst/$ns" +        rsync >&2 \ +            -aAXF --delete \ +            --link-dest="$dst/current" \ +            "$dst/current/" \ +            "$dst/$ns/.partial.$name" +        mv "$dst/$ns/.partial.$name" "$dst/$ns/$name" +        echo >&2 +      fi +      case $retain in +        ([0-9]*) +          delete_from=$(($retain + 1)) +          ls -r "$dst/$ns" \ +            | sed -n "$delete_from,\$p" \ +            | while read old_name; do +                echo >&2 "delete snapshot: $ns/$old_name" +                rm -fR "$dst/$ns/$old_name" +              done +          ;; +        (ALL) +          : +          ;; +      esac +    )} + +    ${concatStringsSep "\n" (mapAttrsToList (ns: { format, retain ? null, ... }: +      toString (map shell.escape [ +        "ns=${ns}" +        "format=${format}" +        "retain=${if retain == null then "ALL" else toString retain}" +        "snapshot" +      ])) +      plan.snapshots)} +  ''; + +  # TODO getFQDN: admit hosts in other domains +  getFQDN = host: "${host.name}.${config.krebs.search-domain}"; + +  writeDash = name: text: pkgs.writeScript name '' +    #! ${pkgs.dash}/bin/dash +    ${text} +  ''; + +  writeDashBin = name: text: pkgs.writeTextFile { +    executable = true; +    destination = "/bin/${name}"; +    name = name; +    text = '' +      #! ${pkgs.dash}/bin/dash +      ${text} +    ''; +  }; + +in out diff --git a/krebs/3modules/buildbot/master.nix b/krebs/3modules/buildbot/master.nix index 7078000fe..5870c3145 100644 --- a/krebs/3modules/buildbot/master.nix +++ b/krebs/3modules/buildbot/master.nix @@ -308,7 +308,7 @@ let    imp = {      users.extraUsers.buildbotMaster = { -      uid = 672626386; #genid buildbotMaster +      uid = genid "buildbotMaster";        description = "Buildbot Master";        home = cfg.workDir;        createHome = false; diff --git a/krebs/3modules/default.nix b/krebs/3modules/default.nix index cbc1291fa..ba1f425d9 100644 --- a/krebs/3modules/default.nix +++ b/krebs/3modules/default.nix @@ -7,6 +7,7 @@ let    out = {      imports = [        ./apt-cacher-ng.nix +      ./backup.nix        ./bepasty-server.nix        ./build.nix        ./buildbot/master.nix diff --git a/krebs/4lib/types.nix b/krebs/4lib/types.nix index c52afa246..81ce659bd 100644 --- a/krebs/4lib/types.nix +++ b/krebs/4lib/types.nix @@ -177,4 +177,21 @@ types // rec {    addr6 = str;    hostname = str;    label = str; + +  krebs.file-location = types.submodule { +    options = { +      # TODO user +      host = mkOption { +        type = host; +      }; +      # TODO merge with ssl.privkey.path +      path = mkOption { +        type = types.either types.path types.str; +        apply = x: { +          path = toString x; +          string = x; +        }.${typeOf x}; +      }; +    }; +  };  } diff --git a/krebs/5pkgs/Reaktor/plugins.nix b/krebs/5pkgs/Reaktor/plugins.nix index 05ede38e1..5c7b89f5c 100644 --- a/krebs/5pkgs/Reaktor/plugins.nix +++ b/krebs/5pkgs/Reaktor/plugins.nix @@ -1,38 +1,118 @@  { stdenv, lib, pkgs, makeWrapper }:  rec { -  buildReaktorPlugin = { name -                        # TODO: profiles -                        , extraConfig +  # Begin API +  buildBaseReaktorPlugin = { name +                        , config # python extra configuration for plugin                          , phases ? []                          , ... } @ attrs:      stdenv.mkDerivation (attrs // {        name = "Reaktor-plugin-" + name; -      phases = phases ++ [ "installPhase" ];        isReaktorPlugin = true;      }); -  random-emoji = buildReaktorPlugin rec { -    name = "random-emoji"; -    src = ./scripts/random-emoji.sh; +  buildSimpleReaktorPlugin = name: { script +                        , path ? [] +                        , env ? {} +                        , pattern ? "" +                        , ... } @ attrs: +    let +      path_env = { "PATH" = lib.makeSearchPath "bin" (path ++ [ pkgs.coreutils ]); }; +      src_dir = pkgs.substituteAll ( { +        inherit name; +        dir = "bin"; +        isExecutable = true; +        src = script; +      }); +      src_file = "${src_dir}/bin/${name}"; +      config = '' +        public_commands.insert(0,{ +          'capname' : "${name}", +          'pattern' : ${if pattern == "" then +                          ''indirect_pattern.format("${name}")'' else +                          ''"${pattern}"'' }, +          'argv'    : ["${src_file}"], +          'env'     : ${builtins.toJSON (path_env // env)} }) +      ''; +      config_file = pkgs.writeText "plugin.py" config; +    in buildBaseReaktorPlugin (attrs // rec { +      inherit name config; + +      phases = [ "installPhase" ]; +      buildInputs = [ makeWrapper ]; +      installPhase = '' +        mkdir -p $out/bin $out/etc/Reaktor +        ln -s ${src_file} $out/bin +        wrapProgram $out/bin/${name} \ +          --prefix PATH : ${path_env.PATH} +        ln -s ${config_file} $out/etc/Reaktor/plugin.py +      ''; + +    }); +  # End API + +  # Begin Plugins +  random-emoji = buildSimpleReaktorPlugin "emoji" { +    path = with pkgs; [ gnused gnugrep xmlstarlet curl ]; +    script = ./scripts/random-emoji.sh; +  }; + +  sed-plugin = buildSimpleReaktorPlugin "sed-plugin" { +    path = [ pkgs.gnused ]; +    # only support s///gi the plugin needs to see every msg +    # TODO: this will eat up the last regex, fix Reaktor to support fallthru +    pattern = "^(?P<args>.*)$$"; +    script = ./scripts/sed-plugin.py; +  }; + +  shack-correct = buildSimpleReaktorPlugin "shack-correct" { +    path = [ pkgs.gnused ]; +    pattern = "^(?P<args>.*Shack.*)$$"; +    script = ./scripts/shack-correct.sh; +  }; + +  nixos-version = buildSimpleReaktorPlugin "nixos-version" { +    script = pkgs.writeScript "nixos-version" '' +      #! /bin/sh +      . /etc/os-release +      echo "$PRETTY_NAME" +      ''; +  }; +  stockholm-issue = buildSimpleReaktorPlugin "stockholm-issue" { +    script = ./scripts/random-issue.sh; +    path = with pkgs; [ git gnused lentil ]; +    env = { "origin" = "http://cgit.gum/stockholm"; }; +  }; + +  titlebot = +  let +    pypkgs = pkgs.python3Packages; +    titlebot_cmds =  pypkgs.buildPythonPackage { +      name = "titlebot_cmds"; +      propagatedBuildInputs =  with pypkgs; [ setuptools ]; +      src = pkgs.fetchurl { +        url = "https://github.com/makefu/reaktor-titlebot/archive/2.1.0.tar.gz"; +        sha256 = "0wvf09wmk8b52f9j65qrw81nwrhs9pfhijwrlkzp5l7l2q8cjkp6"; +        }; +      }; +  in buildBaseReaktorPlugin rec { +    name = "titlebot";      phases = [ "installPhase" ]; -    buildInputs = [ makeWrapper ];      installPhase = '' -      mkdir -p $out/bin -      install -vm 755 ${src} $out/bin/random-emoji.sh -      wrapProgram $out/bin/random-emoji.sh \ -        --prefix PATH : ${lib.makeSearchPath "bin" (with pkgs; [ -                          coreutils -                          gnused -                          gnugrep -                          xmlstarlet -                          curl])}; +      mkdir -p $out +      ln -s ${titlebot_cmds}/* $out      ''; -    extraConfig = '' -      public_commands.insert(0,{ -        'capname' : "emoji", -        'pattern' : indirect_pattern.format("emoji"), -        'argv'    : ["random-emoji.sh"]) +    config = '' +      def titlebot_cmd(cmd): +        from os import environ +        return {  'capname': cmd, +                  'env': { 'TITLEDB': +                    environ['state_dir']+'/suggestions.json' }, +                  'pattern': '^\\.' + cmd + '\\s*(?:\\s+(?P<args>.*))?$$', +                  'argv': [ '${titlebot_cmds}/bin/' + cmd ] } +      for i in ['up','help','list','top','new']: +        public_commands.insert(0,titlebot_cmd(i)) +      commands.insert(0,titlebot_cmd('clear'))      '';    };  } diff --git a/krebs/5pkgs/Reaktor/scripts/random-issue.sh b/krebs/5pkgs/Reaktor/scripts/random-issue.sh new file mode 100644 index 000000000..5c47c6156 --- /dev/null +++ b/krebs/5pkgs/Reaktor/scripts/random-issue.sh @@ -0,0 +1,20 @@ +#! /bin/sh +set -eu +# requires env: +#   $state_dir +#   $origin + +# in PATH: git,lentil,coreutils +subdir=`echo "$1" | tr -dc "[:alnum:]"` +name=`echo "$origin" | tr -dc "[:alnum:]"` +track="$state_dir/$name-checkout" +(if test -e "$track" ;then +  cd "$track" +  git fetch origin master +  git reset --hard origin/master +else +  git clone "$origin" "$track" +fi) >&2 + +cd "$track" +lentil "${subdir:-.}" -f csv | sed 1d | shuf | head -1 diff --git a/krebs/5pkgs/Reaktor/scripts/sed-plugin.py b/krebs/5pkgs/Reaktor/scripts/sed-plugin.py new file mode 100644 index 000000000..8103c9585 --- /dev/null +++ b/krebs/5pkgs/Reaktor/scripts/sed-plugin.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 + +# Usage: +# _from=krebs state_dir=. python sed-plugin.py 'dick butt' +# _from=krebs state_dir=. python sed-plugin.py 's/t/l/g' +## dick bull +import shelve +from os import environ +from os.path import join +from sys import argv +d = shelve.open(join(environ['state_dir'],'sed-plugin.shelve'),writeback=True) +usr = environ['_from'] +import re + +def is_regex(line): +    myre = re.compile(r'^s/((?:\\/|[^/])+)/((?:\\/|[^/])*)/([ig]*)$') +    return myre.match(line) + +line = argv[1] +m = is_regex(line) + +if m: +    f,t,flagstr = m.groups() +    fn = f.replace('\/','/') +    tn = t.replace('\/','/') +    flags =  0 +    count = 1 +    if flagstr: +        if 'i' in flagstr: +            flags = re.IGNORECASE +        if 'g' in flagstr: +            count = 0 +    else: +        flagstr = '' +    last = d.get(usr,None) +    if last: +        #print(re.sub(fn,tn,last,count=count,flags=flags)) +        from subprocess import Popen,PIPE +        p = Popen(['sed','s/{}/{}/{}'.format(f,t,flagstr)],stdin=PIPE,stdout=PIPE ) +        so,se = p.communicate(bytes("{}\n".format(last),"UTF-8")) +        if p.returncode: +            print("something went wrong when trying to process your regex: {}".format(se.decode())) +        ret = so.decode() +        print("\x1b[1m{}\x1b[0m meinte: {}".format(usr,ret.strip())) +        if ret: +            d[usr] = ret + +    else: +        print("no last message") +else: +    d[usr] = line + +d.close() diff --git a/krebs/5pkgs/Reaktor/scripts/shack-correct.sh b/krebs/5pkgs/Reaktor/scripts/shack-correct.sh new file mode 100644 index 000000000..3b4d04f80 --- /dev/null +++ b/krebs/5pkgs/Reaktor/scripts/shack-correct.sh @@ -0,0 +1,6 @@ +#! /bin/sh +set -eu +printf "Sie meinten wohl \"" +echo -n $@ | sed 's/Shack/shack/g' +echo "\"" +echo "${_from}--" diff --git a/krebs/5pkgs/test/infest-cac-centos7/notes b/krebs/5pkgs/test/infest-cac-centos7/notes index cfb074423..3f4fcd859 100755 --- a/krebs/5pkgs/test/infest-cac-centos7/notes +++ b/krebs/5pkgs/test/infest-cac-centos7/notes @@ -8,6 +8,17 @@ set -eufx  krebs_cred=${krebs_cred-./cac.json}  retiolum_key=${retiolum_key-./retiolum.rsa_key.priv} +clear_defer(){ +  echo "${trapstr:-exit}" +  trap - INT TERM EXIT KILL +} +defer(){ +  if test -z "${debug:-}"; then +    trapstr="$1;${trapstr:-exit}" +    trap "$trapstr" INT TERM EXIT KILL +  fi +} +  # Sanity  if test ! -r "$krebs_cred";then    echo "\$krebs_cred=$krebs_cred must be readable"; exit 1 @@ -24,8 +35,8 @@ export cac_servers_cache=$krebs_secrets/servers_cache.json  export cac_tasks_cache=$krebs_secrets/tasks_cache.json  export cac_templates_cache=$krebs_secrets/templates_cache.json  # we need to receive this key from buildmaster to speed up tinc bootstrap -TRAP="rm -r $krebs_secrets;trap - INT TERM EXIT" -trap "$TRAP" INT TERM EXIT +defer "trap - INT TERM EXIT" +defer "rm -r $krebs_secrets"  cat > $sec_file <<EOF  cac_login="$(jq -r .email $krebs_cred)" @@ -39,30 +50,44 @@ cac-cli --config $krebs_cred panel  add-api-ip  cac update  cac servers -# Template 26: CentOS7 -# TODO: use cac templates to determine the real Centos7 template in case it changes -name=$( cac build cpu=1 ram=512 storage=10 os=26 2>&1\ -  | jq -r .servername) - -id=servername:$name -trap "cac delete $id;$TRAP;exit" INT TERM EXIT -# TODO: timeout? - -wait_login_cac(){ -  # timeout -  for t in `seq 180`;do -    # now we have a working cac server -    if cac ssh $1 -o ConnectTimeout=10 \ -                  cat /etc/redhat-release | \ -                    grep CentOS ;then -      return 0 -    fi -    sleep 10 -  done -  return 1 -} -# die on timeout -wait_login_cac $id +# preserve old trap +old_trapstr=$(clear_defer) +while true;do +  # Template 26: CentOS7 +  # TODO: use cac templates to determine the real Centos7 template in case it changes +  name=$( cac build cpu=1 ram=512 storage=10 os=26 2>&1\ +    | jq -r .servername) +  id=servername:$name + +  clear_defer >/dev/null +  defer "cac delete $id" + +  # TODO: timeout? + +  wait_login_cac(){ +    # we wait for 15 minutes +    for t in `seq 90`;do +      # now we have a working cac server +      if cac ssh $1 -o ConnectTimeout=10 \ +                    cat /etc/redhat-release | \ +                      grep CentOS ;then +        return 0 +      fi +      sleep 10 +    done +    return 1 +  } +  # die on timeout +  if ! wait_login_cac $id;then +    echo "unable to boot a working system within time frame, retrying..." >&2 +    echo "Cleaning up old image,last status: $(cac update;cac getserver $id | jq -r .status)" +    eval "$(clear_defer)" +  else +    echo "got a working system" >&2 +  fi +done +clear_defer >/dev/null +defer "cac delete $id;$old_trapstr"  mkdir -p shared/2configs/temp  cac generatenetworking $id > \ diff --git a/krebs/Zhosts/bobby b/krebs/Zhosts/bobby new file mode 100644 index 000000000..aac6e377b --- /dev/null +++ b/krebs/Zhosts/bobby @@ -0,0 +1,11 @@ +Subnet = 10.243.111.112/32 +Subnet = 42:0:0:0:0:0:111:112/128 + +-----BEGIN RSA PUBLIC KEY----- +MIIBCgKCAQEA+AScnIqFdzGl+iRZTNZ7r91n/r1H4GzDsrAupUvJ4mi7nDN4eP8s +uLvKtJp22RxfuF3Kf4KhHb8LHQ8bLLN/KDaNDXrCNBc69d7vvLsjoY+wfGLJNu4Y +Ad/8J4r3rdb83mTA3IHb47T/70MERPBr2gF84YiG6ZoQrPQuTk4lHxaI83SOhjny +0F0ucS/rBV6Vv9y5/756TKi1cFPSpY4X+qeWc8xWrBGJcJiiqYb8ZX2o/lkAJ5c+ +jI/VdybGFVGY9+bp4Jw5xBIo5KGuFnm8+blRmSDDl3joRneKQSx9FAu7RUwoajBu +cEbi1529NReQzIFT6Vt22ymbHftxOiuh4QIDAQAB +-----END RSA PUBLIC KEY----- diff --git a/krebs/default.nix b/krebs/default.nix index ad0205426..81ddd3ea6 100644 --- a/krebs/default.nix +++ b/krebs/default.nix @@ -36,6 +36,7 @@ let out = {      { system ? current-host-name      , target ? system      }@args: let +      config = get-config system;      in ''        #! /bin/sh        # ${current-date} ${current-user-name}@${current-host-name} @@ -47,6 +48,10 @@ let out = {          ${builtins.readFile ./4lib/infest/install-nix.sh}        ''} +      # Prepare target source via bind-mounting + +      (${populate (args // { infesting = true;}) }) +        (${nixos-install args})        ${rootssh target '' @@ -98,7 +103,6 @@ let out = {        #! /bin/sh        # ${current-date} ${current-user-name}@${current-host-name}        # krebs.nixos-install -      (${populate args})        ${rootssh target ''          export PATH; PATH=/root/.nix-profile/bin:$PATH @@ -205,6 +209,7 @@ let out = {    populate =      { system ? current-host-name      , target ? system +    , infesting ? false      }@args:      let out = ''          #! /bin/sh @@ -217,6 +222,8 @@ let out = {              ["dir" "git"])}        ''; + +      target_prefix=lib.optionalString infesting "/mnt";        config = get-config system;        current-host = config.krebs.hosts.${current-host-name}; @@ -225,17 +232,18 @@ let out = {        methods.dir = config:          let            can-push = config.host.name == current-host.name; +          target-path = target_prefix + config.target-path;            push-method = ''              rsync \                --exclude .git \                --exclude .graveyard \                --exclude old \                --exclude tmp \ -              --rsync-path='mkdir -p ${config.target-path} && rsync' \ +              --rsync-path='mkdir -p ${target-path} && rsync' \                --delete-excluded \                -vrLptgoD \                ${config.path}/ \ -              root@${target}:${config.target-path} +              root@${target}:${target-path}            '';          in          if can-push then push-method else @@ -244,9 +252,10 @@ let out = {          throw "No way to push ${dir} from ${current-host.name} to ${target}";        methods.git = config: -        rootssh target '' -          mkdir -p ${config.target-path} -          cd ${config.target-path} +        let target-path = target_prefix + config.target-path; +        in rootssh target '' +          mkdir -p ${target-path} +          cd ${target-path}            if ! test -e .git; then              git init            fi  | 
