diff options
Diffstat (limited to 'krebs')
| -rw-r--r-- | krebs/3modules/Reaktor.nix | 11 | ||||
| -rw-r--r-- | krebs/3modules/buildbot/master.nix | 375 | ||||
| -rw-r--r-- | krebs/3modules/buildbot/slave.nix | 186 | ||||
| -rw-r--r-- | krebs/3modules/default.nix | 2 | ||||
| -rw-r--r-- | krebs/5pkgs/Reaktor/plugins.nix | 38 | ||||
| -rw-r--r-- | krebs/5pkgs/Reaktor/scripts/random-emoji.sh | 6 | ||||
| -rw-r--r-- | krebs/5pkgs/cacpanel/default.nix | 4 | ||||
| -rw-r--r-- | krebs/5pkgs/default.nix | 6 | ||||
| -rw-r--r-- | krebs/5pkgs/test/infest-cac-centos7/default.nix | 39 | ||||
| -rwxr-xr-x | krebs/5pkgs/test/infest-cac-centos7/notes | 116 | 
10 files changed, 780 insertions, 3 deletions
diff --git a/krebs/3modules/Reaktor.nix b/krebs/3modules/Reaktor.nix index 0fca52203..59058bffc 100644 --- a/krebs/3modules/Reaktor.nix +++ b/krebs/3modules/Reaktor.nix @@ -51,6 +51,14 @@ let          configuration appended to the default or overridden configuration        '';      }; + +    workdir = mkOption { +      default = "/var/lib/Reaktor"; +      type = types.str; +      description = '' +        Reaktor working directory +      ''; +    };      extraEnviron = mkOption {        default = {};        type = types.attrsOf types.str; @@ -79,7 +87,7 @@ let        name = "Reaktor";        uid = genid name;        description = "Reaktor user"; -      home = "/var/lib/Reaktor"; +      home = cfg.workdir;        createHome = true;      }; @@ -101,6 +109,7 @@ let          GIT_SSL_CAINFO = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt";          REAKTOR_NICKNAME = cfg.nickname;          REAKTOR_DEBUG = (if cfg.debug  then "True" else "False"); +        state_dir = cfg.workdir;          } // cfg.extraEnviron;        serviceConfig= {          ExecStartPre = pkgs.writeScript "Reaktor-init" '' diff --git a/krebs/3modules/buildbot/master.nix b/krebs/3modules/buildbot/master.nix new file mode 100644 index 000000000..7078000fe --- /dev/null +++ b/krebs/3modules/buildbot/master.nix @@ -0,0 +1,375 @@ +{ config, pkgs, lib, ... }: + +with lib; +let +  buildbot = pkgs.buildbot; +  buildbot-master-config = pkgs.writeText "buildbot-master.cfg" '' +    # -*- python -*- +    from buildbot.plugins import * +    import re +    import json +    c = BuildmasterConfig = {} + +    c['slaves'] = [] +    slaves = json.loads('${builtins.toJSON cfg.slaves}') +    slavenames = [ s for s in slaves ] +    for k,v in slaves.items(): +      c['slaves'].append(buildslave.BuildSlave(k, v)) + +    # TODO: configure protocols? +    c['protocols'] = {'pb': {'port': 9989}} + +    ####### Build Inputs +    c['change_source'] = cs = [] + +    ${ concatStringsSep "\n" +    (mapAttrsToList (n: v: '' +        #### Change_Source: Begin of ${n} +        ${v} +        #### Change_Source: End of ${n} +      '') cfg.change_source )} + +    ####### Build Scheduler +    c['schedulers'] = sched = [] + +    ${ concatStringsSep "\n" +    (mapAttrsToList (n: v: '' +        #### Schedulers: Begin of ${n} +        ${v} +        #### Schedulers: End of ${n} +      '') cfg.scheduler )} + +    ###### Builder +    c['builders'] = bu = [] +     +    # Builder Pre: Begin +    ${cfg.builder_pre} +    # Builder Pre: End + +    ${ concatStringsSep "\n" +    (mapAttrsToList (n: v: '' +        #### Builder: Begin of ${n} +        ${v} +        #### Builder: End of ${n} +      '') cfg.builder )} + + +    ####### Status +    c['status'] = st = [] + +    # If you want to configure this url, override with extraConfig +    c['buildbotURL'] = "http://${config.networking.hostName}:${toString cfg.web.port}/" + +    ${optionalString (cfg.web.enable) '' +      from buildbot.status import html +      from buildbot.status.web import authz, auth +      authz_cfg=authz.Authz( +          auth=auth.BasicAuth([ ("${cfg.web.username}","${cfg.web.password}") ]), +          # TODO: configure harder +          gracefulShutdown = False, +          forceBuild = 'auth', +          forceAllBuilds = 'auth', +          pingBuilder = False, +          stopBuild = 'auth', +          stopAllBuilds = 'auth', +          cancelPendingBuild = 'auth' +      ) +      # TODO: configure krebs.nginx +      st.append(html.WebStatus(http_port=${toString cfg.web.port}, authz=authz_cfg)) +      ''} + +    ${optionalString (cfg.irc.enable) '' +      from buildbot.status import words +      irc = words.IRC("${cfg.irc.server}", "${cfg.irc.nick}", +                      channels=${builtins.toJSON cfg.irc.channels}, +                      notify_events={ +                        'success': 1, +                        'failure': 1, +                        'exception': 1, +                        'successToFailure': 1, +                        'failureToSuccess': 1, +                      }${optionalString cfg.irc.allowForce ",allowForce=True"}) +      c['status'].append(irc) +      ''} + +    ${ concatStringsSep "\n" +    (mapAttrsToList (n: v: '' +        #### Status: Begin of ${n} +        ${v} +        #### Status: End of ${n} +      '') cfg.status )} + +    ####### PROJECT IDENTITY +    c['title'] = "${cfg.title}" +    c['titleURL'] = "http://krebsco.de" + + +    ####### DB URL +    # TODO: configure +    c['db'] = { +        'db_url' : "sqlite:///state.sqlite", +    } +    ${cfg.extraConfig} +    ''; + +  cfg = config.krebs.buildbot.master; + +  api = { +    enable = mkEnableOption "Buildbot Master"; +    title = mkOption { +      default = "Buildbot CI"; +      type = types.str; +      description = '' +        Title of the Buildbot Installation +      ''; +    }; +    workDir = mkOption { +      default = "/var/lib/buildbot/master"; +      type = types.str; +      description = '' +        Path to build bot master directory. +        Will be created on startup. +      ''; +    }; + +    slaves = mkOption { +      default = {}; +      type = types.attrsOf types.str; +      description = '' +        Attrset of slavenames with their passwords +        slavename = slavepassword +      ''; +    }; + +    change_source = mkOption { +      default = {}; +      type = types.attrsOf types.str; +      example = { +        stockholm = '' +          cs.append(changes.GitPoller( +                  'http://cgit.gum/stockholm', +                  workdir='stockholm-poller', branch='master', +                  project='stockholm', +                  pollinterval=120)) +        ''; +      }; +      description = '' +        Attrset of all the change_sources which should be configured. +        It will be directly included into the master configuration. + +        At the end an change object should be appended to <literal>cs</literal> +      ''; +    }; + +    scheduler = mkOption { +      default = {}; +      type = types.attrsOf types.str; +      example = { +        force-scheduler = '' +          sched.append(schedulers.ForceScheduler( +                                      name="force", +                                      builderNames=["full-tests"])) +        ''; +      }; +      description = '' +        Attrset of all the schedulers which should be configured. +        It will be directly included into the master configuration. + +        At the end an change object should be appended to <literal>sched</literal> +      ''; +    }; + +    builder_pre = mkOption { +      default = ""; +      type = types.lines; +      example = '' +        grab_repo = steps.Git(repourl=stockholm_repo, mode='incremental') +      ''; +      description = '' +        some code before the builders are being assembled. +        can be used to define functions used by multiple builders +      ''; +    }; + +    builder = mkOption { +      default = {}; +      type = types.attrsOf types.str; +      example = { +        fast-test = '' +        ''; +      }; +      description = '' +        Attrset of all the builder which should be configured. +        It will be directly included into the master configuration. + +        At the end an change object should be appended to <literal>bu</literal> +      ''; +    }; + +    status = mkOption { +      default = {}; +      type = types.attrsOf types.str; +      description = '' +        Attrset of all the extra status which should be configured. +        It will be directly included into the master configuration. + +        At the end an change object should be appended to <literal>st</literal> + +        Right now IRC and Web status can be configured by setting +        <literal>buildbot.master.irc.enable</literal> and +        <literal>buildbot.master.web.enable</literal> +      ''; +    }; + +    # Configurable Stati +    web = mkOption { +      default = {}; +      type = types.submodule ({ config2, ... }: { +        options = { +          enable = mkEnableOption "Buildbot Master Web Status"; +          username = mkOption { +            default = "krebs"; +            type = types.str; +            description = '' +              username for web authentication +            ''; +          }; +          hostname = mkOption { +            default = config.networking.hostName; +            type = types.str; +            description = '' +              web interface Hostname +            ''; +          }; +          password = mkOption { +            default = "bob"; +            type = types.str; +            description = '' +              password for web authentication +            ''; +          }; +          port = mkOption { +            default = 8010; +            type = types.int; +            description = '' +              port for buildbot web status +            ''; +          }; +        }; +      }); +    }; + +    irc = mkOption { +      default = {}; +      type = types.submodule ({ config, ... }: { +        options = { +          enable = mkEnableOption "Buildbot Master IRC Status"; +          channels = mkOption { +            default = [ "nix-buildbot-meetup" ]; +            type = with types; listOf str; +            description = '' +              irc channels the bot should connect to +            ''; +          }; +          allowForce = mkOption { +            default = false; +            type = types.bool; +            description = '' +              Determines if builds can be forced via IRC +            ''; +          }; +          nick = mkOption { +            default = "nix-buildbot"; +            type = types.str; +            description = '' +              nickname for IRC +            ''; +          }; +          server = mkOption { +            default = "irc.freenode.net"; +            type = types.str; +            description = '' +              Buildbot Status IRC Server to connect to +            ''; +          }; +        }; +      }); +    }; + +    extraConfig = mkOption { +      default = ""; +      type = types.lines; +      description = '' +        extra config appended to the generated master.cfg +      ''; +    }; +  }; + +  imp = { + +    users.extraUsers.buildbotMaster = { +      uid = 672626386; #genid buildbotMaster +      description = "Buildbot Master"; +      home = cfg.workDir; +      createHome = false; +    }; + +    users.extraGroups.buildbotMaster = { +      gid = 672626386; +    }; + +    systemd.services.buildbotMaster = { +      description = "Buildbot Master"; +      after = [ "network.target" ]; +      wantedBy = [ "multi-user.target" ]; +      # TODO: add extra dependencies to master like svn and cvs +      path = [ pkgs.git ]; +      environment = { +        SSL_CERT_FILE = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"; +      }; +      serviceConfig = let +        workdir="${lib.shell.escape cfg.workDir}"; +        secretsdir="${lib.shell.escape (toString <secrets>)}"; +      in { +        PermissionsStartOnly = true; +        Type = "forking"; +        PIDFile = "${workdir}/twistd.pid"; +        # TODO: maybe also prepare buildbot.tac? +        ExecStartPre = pkgs.writeScript "buildbot-master-init" '' +          #!/bin/sh +          set -efux +          if [ ! -e ${workdir} ];then +            mkdir -p ${workdir} +            ${buildbot}/bin/buildbot create-master -r -l 10 -f ${workdir} +          fi +          # always override the master.cfg +          cp ${buildbot-master-config} ${workdir}/master.cfg +          # copy secrets +          cp ${secretsdir}/cac.json ${workdir} +          cp ${secretsdir}/retiolum-ci.rsa_key.priv \ +             ${workdir}/retiolum.rsa_key.priv +          # sanity +          ${buildbot}/bin/buildbot checkconfig ${workdir} + +          # TODO: maybe upgrade? not sure about this +          #       normally we should write buildbot.tac by our own +          # ${buildbot}/bin/buildbot upgrade-master ${workdir} + +          chmod 700 -R ${workdir} +          chown buildbotMaster:buildbotMaster -R ${workdir} +        ''; +        ExecStart = "${buildbot}/bin/buildbot start ${workdir}"; +        ExecStop = "${buildbot}/bin/buildbot stop ${workdir}"; +        ExecReload = "${buildbot}/bin/buildbot reconfig ${workdir}"; +        PrivateTmp = "true"; +        User = "buildbotMaster"; +        Restart = "always"; +        RestartSec = "10"; +      }; +    }; +  }; +in +{ +  options.krebs.buildbot.master = api; +  config = mkIf cfg.enable imp; +} diff --git a/krebs/3modules/buildbot/slave.nix b/krebs/3modules/buildbot/slave.nix new file mode 100644 index 000000000..0e7796d8a --- /dev/null +++ b/krebs/3modules/buildbot/slave.nix @@ -0,0 +1,186 @@ +{ config, pkgs, lib, ... }: + +with lib; +let +  buildbot-slave-init = pkgs.writeText "buildbot-slave.tac" '' +    import os + +    from buildslave.bot import BuildSlave +    from twisted.application import service + +    basedir = '${cfg.workDir}' +    rotateLength = 10000000 +    maxRotatedFiles = 10 + +    application = service.Application('buildslave') + +    from twisted.python.logfile import LogFile +    from twisted.python.log import ILogObserver, FileLogObserver +    logfile = LogFile.fromFullPath(os.path.join(basedir, "twistd.log"), rotateLength=rotateLength, +                                  maxRotatedFiles=maxRotatedFiles) +    application.setComponent(ILogObserver, FileLogObserver(logfile).emit) + +    buildmaster_host = '${cfg.masterhost}' +    # TODO: masterport? +    port = 9989 +    slavename = '${cfg.username}' +    passwd = '${cfg.password}' +    keepalive = 600 +    usepty = 0 +    umask = None +    maxdelay = 300 +    allow_shutdown = None + +    ${cfg.extraConfig} + +    s = BuildSlave(buildmaster_host, port, slavename, passwd, basedir, +                  keepalive, usepty, umask=umask, maxdelay=maxdelay, +                  allow_shutdown=allow_shutdown) +    s.setServiceParent(application) +    ''; +  default-packages = [ pkgs.git pkgs.bash ]; +  cfg = config.krebs.buildbot.slave; + +  api = { +    enable = mkEnableOption "Buildbot Slave"; + +    workDir = mkOption { +      default = "/var/lib/buildbot/slave"; +      type = types.str; +      description = '' +        Path to build bot slave directory. +        Will be created on startup. +      ''; +    }; + +    masterhost = mkOption { +      default = "localhost"; +      type = types.str; +      description = '' +        Hostname/IP of the buildbot master +      ''; +    }; + +    username = mkOption { +      type = types.str; +      description = '' +        slavename used to authenticate with master +      ''; +    }; + +    password = mkOption { +      type = types.str; +      description = '' +        slave password used to authenticate with master +      ''; +    }; + +    contact = mkOption { +      default = "nix slave <buildslave@${config.networking.hostName}>"; +      type = types.str; +      description = '' +        contact to be announced by buildslave +      ''; +    }; + +    description = mkOption { +      default = "Nix Generated BuildSlave"; +      type = types.str; +      description = '' +        description for hostto be announced by buildslave +      ''; +    }; + +    packages = mkOption { +      default = [ pkgs.git ]; +      type = with types; listOf package; +      description = '' +        packages which should be in path for buildslave +      ''; +    }; + +    extraEnviron = mkOption { +      default = {}; +      example = { +        NIX_PATH = "nixpkgs=/path/to/my/nixpkgs"; +      }; +      type = types.attrsOf types.str; +      description = '' +        extra environment variables to be provided to the buildslave service +        if you need nixpkgs, e.g. for running nix-shell you can set NIX_PATH here. +      ''; +    }; + +    extraConfig = mkOption { +      default = ""; +      type = types.lines; +      example = '' +        port = 443 +        keepalive = 600 +      ''; +      description = '' +        extra config evaluated before calling BuildSlave init in .tac file +      ''; +    }; +  }; + +  imp = { + +    users.extraUsers.buildbotSlave = { +      uid = genid "buildbotSlave"; +      description = "Buildbot Slave"; +      home = cfg.workDir; +      createHome = false; +    }; + +    users.extraGroups.buildbotSlave = { +      gid = 1408105834; +    }; + +    systemd.services."buildbotSlave-${cfg.username}-${cfg.masterhost}" = { +      description = "Buildbot Slave for ${cfg.username}@${cfg.masterhost}"; +      after = [ "network.target" ]; +      wantedBy = [ "multi-user.target" ]; +      path = default-packages ++ cfg.packages; + +      environment = { +          SSL_CERT_FILE = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"; +          NIX_REMOTE="daemon"; +      } // cfg.extraEnviron; + +      serviceConfig = let +        workdir = "${lib.shell.escape cfg.workDir}"; +        contact = "${lib.shell.escape cfg.contact}"; +        description = "${lib.shell.escape cfg.description}"; +        buildbot = pkgs.buildbot-slave; +        # TODO:make this +      in { +        PermissionsStartOnly = true; +        Type = "forking"; +        PIDFile = "${workdir}/twistd.pid"; +        # TODO: maybe also prepare buildbot.tac? +        ExecStartPre = pkgs.writeScript "buildbot-master-init" '' +          #!/bin/sh +          set -efux +          mkdir -p ${workdir}/info +          cp ${buildbot-slave-init} ${workdir}/buildbot.tac +          echo ${contact} > ${workdir}/info/admin +          echo ${description} > ${workdir}/info/host + +          chown buildbotSlave:buildbotSlave -R ${workdir} +          chmod 700 -R ${workdir} +        ''; +        ExecStart = "${buildbot}/bin/buildslave start ${workdir}"; +        ExecStop = "${buildbot}/bin/buildslave stop ${workdir}"; +        PrivateTmp = "true"; +        User = "buildbotSlave"; +        Restart = "always"; +        RestartSec = "10"; +      }; +    }; +  }; +in +{ +  options.krebs.buildbot.slave = api; +  config = mkIf cfg.enable imp; +} diff --git a/krebs/3modules/default.nix b/krebs/3modules/default.nix index 740ba67b8..cbc1291fa 100644 --- a/krebs/3modules/default.nix +++ b/krebs/3modules/default.nix @@ -9,6 +9,8 @@ let        ./apt-cacher-ng.nix        ./bepasty-server.nix        ./build.nix +      ./buildbot/master.nix +      ./buildbot/slave.nix        ./current.nix        ./exim-retiolum.nix        ./exim-smarthost.nix diff --git a/krebs/5pkgs/Reaktor/plugins.nix b/krebs/5pkgs/Reaktor/plugins.nix new file mode 100644 index 000000000..05ede38e1 --- /dev/null +++ b/krebs/5pkgs/Reaktor/plugins.nix @@ -0,0 +1,38 @@ +{ stdenv, lib, pkgs, makeWrapper }: + +rec { +  buildReaktorPlugin = { name +                        # TODO: profiles +                        , extraConfig +                        , 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; +    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])}; +    ''; +    extraConfig = '' +      public_commands.insert(0,{ +        'capname' : "emoji", +        'pattern' : indirect_pattern.format("emoji"), +        'argv'    : ["random-emoji.sh"]) +    ''; +  }; +} diff --git a/krebs/5pkgs/Reaktor/scripts/random-emoji.sh b/krebs/5pkgs/Reaktor/scripts/random-emoji.sh new file mode 100644 index 000000000..386aa68b9 --- /dev/null +++ b/krebs/5pkgs/Reaktor/scripts/random-emoji.sh @@ -0,0 +1,6 @@ +#!/bin/sh +curl http://emojicons.com/random -s | \ +  grep data-text | \ +  sed -n 's/.*>\(.*\)<\/textarea>/\1/p' | \ +  head -n 1 | \ +  xmlstarlet unesc diff --git a/krebs/5pkgs/cacpanel/default.nix b/krebs/5pkgs/cacpanel/default.nix index 3e3e2e1fc..3df4dffed 100644 --- a/krebs/5pkgs/cacpanel/default.nix +++ b/krebs/5pkgs/cacpanel/default.nix @@ -2,11 +2,11 @@  python3Packages.buildPythonPackage rec {    name = "cacpanel-${version}"; -  version = "0.2.1"; +  version = "0.2.3";    src = pkgs.fetchurl {      url = "https://pypi.python.org/packages/source/c/cacpanel/cacpanel-${version}.tar.gz"; -    sha256 = "1zaazg5r10kgva32zh4fhpw6l6h51ijkwpa322na0kh4x6f6aqj3"; +    sha256 = "1fib7416qqv8yzrj75kxra7ccpz9abqh58b6gkaavws2fa6m3mm8";    };    propagatedBuildInputs = with python3Packages; [ diff --git a/krebs/5pkgs/default.nix b/krebs/5pkgs/default.nix index 7df7b7d3c..c4b1dafe4 100644 --- a/krebs/5pkgs/default.nix +++ b/krebs/5pkgs/default.nix @@ -26,6 +26,8 @@ subdirs // rec {      inherit (subdirs) get jq;    }; +  ReaktorPlugins = pkgs.callPackage ./Reaktor/plugins.nix {}; +    execve = name: { filename, argv, envp ? {}, destination ? "" }:      writeC name { inherit destination; } ''        #include <unistd.h> @@ -40,6 +42,10 @@ subdirs // rec {        }      ''; +  test = { +    infest-cac-centos7 = pkgs.callPackage ./test/infest-cac-centos7 {}; +  }; +    execveBin = name: cfg: execve name (cfg // { destination = "/bin/${name}"; });    writeC = name: { destination ? "" }: src: pkgs.runCommand name {} '' diff --git a/krebs/5pkgs/test/infest-cac-centos7/default.nix b/krebs/5pkgs/test/infest-cac-centos7/default.nix new file mode 100644 index 000000000..7f2e3f231 --- /dev/null +++ b/krebs/5pkgs/test/infest-cac-centos7/default.nix @@ -0,0 +1,39 @@ +{ stdenv, coreutils,makeWrapper, cac, cacpanel, gnumake, gnused, jq, openssh, ... }: + +stdenv.mkDerivation rec { +  name = "${shortname}-${version}"; +  shortname = "infest-cac-centos7"; +  version = "0.2.0"; + +  src = ./notes; + +  phases = [ +    "installPhase" +  ]; +  buildInputs = [ makeWrapper ]; + +  path = stdenv.lib.makeSearchPath "bin" [ +    coreutils +    cac +    cacpanel +    gnumake +    gnused +    jq +    openssh +  ]; + +  installPhase = +    '' +      mkdir -p $out/bin +      cp ${src} $out/bin/${shortname} +      chmod +x $out/bin/${shortname} +      wrapProgram $out/bin/${shortname} \ +              --prefix PATH : ${path} +    ''; +  meta = with stdenv.lib; { +    homepage = http://krebsco.de; +    description = "Krebs CI Scripts"; +    license = licenses.wtfpl; +    maintainers = [ maintainers.makefu ]; +  }; +} diff --git a/krebs/5pkgs/test/infest-cac-centos7/notes b/krebs/5pkgs/test/infest-cac-centos7/notes new file mode 100755 index 000000000..cfb074423 --- /dev/null +++ b/krebs/5pkgs/test/infest-cac-centos7/notes @@ -0,0 +1,116 @@ +#! /bin/sh + +# nix-shell -p gnumake jq openssh cac cacpanel +set -eufx + +# 2 secrets are required: + +krebs_cred=${krebs_cred-./cac.json} +retiolum_key=${retiolum_key-./retiolum.rsa_key.priv} + +# Sanity +if test ! -r "$krebs_cred";then +  echo "\$krebs_cred=$krebs_cred must be readable"; exit 1 +fi +if test ! -r "$retiolum_key";then +  echo "\$retiolum_key=$retiolum_key must be readable"; exit 1 +fi + +krebs_secrets=$(mktemp -d) +sec_file=$krebs_secrets/cac_config +krebs_ssh=$krebs_secrets/tempssh +export cac_resources_cache=$krebs_secrets/res_cache.json +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 + +cat > $sec_file <<EOF +cac_login="$(jq -r .email $krebs_cred)" +cac_key="$(cac-cli --config $krebs_cred panel settings | jq -r .apicode)" +EOF + +export cac_secrets=$sec_file +cac-cli --config $krebs_cred panel  add-api-ip + +# test login: +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 + +mkdir -p shared/2configs/temp +cac generatenetworking $id > \ +  shared/2configs/temp/networking.nix +# new temporary ssh key we will use to log in after infest +ssh-keygen -f $krebs_ssh -N "" +cp $retiolum_key $krebs_secrets/retiolum.rsa_key.priv +# we override the directories for secrets and stockholm +# additionally we set the ssh key we generated +ip=$(cac getserver $id | jq -r .ip) + +cat > shared/2configs/temp/dirs.nix <<EOF +_: { +  krebs.build.source.dir = { +    secrets.path = "$krebs_secrets"; +    stockholm.path = "$(pwd)"; +  }; +  users.extraUsers.root.openssh.authorizedKeys.keys = [ +    "$(cat ${krebs_ssh}.pub)" +  ]; +  krebs.build.target = "$ip"; +} +EOF + +LOGNAME=shared make eval get=krebs.infest \ +  target=derp system=test-centos7 filter=json \ +  | sed -e "s#^ssh.*<<#cac ssh $id<<#" \ +        -e "/^rsync/a -e 'cac ssh $id' \\\\"  \ +        -e "s#root.derp:#:#" > $krebs_secrets/infest +sh -x $krebs_secrets/infest + +# TODO: generate secrets directory $krebs_secrets for nix import +cac powerop $id reset + +wait_login(){ +  # timeout +  for t in `seq 90`;do +    # now we have a working cac server +    if ssh -o StrictHostKeyChecking=no \ +           -o UserKnownHostsFile=/dev/null \ +           -i $krebs_ssh \ +           -o ConnectTimeout=10 \ +           -o BatchMode=yes \ +           root@$1 nixos-version ;then +      return 0 +    fi +    sleep 10 +  done +  return 1 +} +wait_login $ip  | 
