Merge remote-tracking branch 'gum/master'
This commit is contained in:
commit
4238054697
@ -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;
|
||||
|
286
krebs/3modules/backup.nix
Normal file
286
krebs/3modules/backup.nix
Normal file
@ -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
|
@ -308,7 +308,7 @@ let
|
||||
imp = {
|
||||
|
||||
users.extraUsers.buildbotMaster = {
|
||||
uid = 672626386; #genid buildbotMaster
|
||||
uid = genid "buildbotMaster";
|
||||
description = "Buildbot Master";
|
||||
home = cfg.workDir;
|
||||
createHome = false;
|
||||
|
@ -7,6 +7,7 @@ let
|
||||
out = {
|
||||
imports = [
|
||||
./apt-cacher-ng.nix
|
||||
./backup.nix
|
||||
./bepasty-server.nix
|
||||
./build.nix
|
||||
./buildbot/master.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};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@ -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'))
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
@ -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)
|
||||
# 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
|
||||
|
||||
id=servername:$name
|
||||
trap "cac delete $id;$TRAP;exit" INT TERM EXIT
|
||||
# TODO: timeout?
|
||||
clear_defer >/dev/null
|
||||
defer "cac delete $id"
|
||||
|
||||
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
|
||||
# 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 > \
|
||||
|
11
krebs/Zhosts/bobby
Normal file
11
krebs/Zhosts/bobby
Normal file
@ -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-----
|
@ -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
|
||||
|
@ -26,6 +26,7 @@
|
||||
# services
|
||||
../2configs/git/brain-retiolum.nix
|
||||
../2configs/tor.nix
|
||||
# ../2configs/buildbot-standalone.nix
|
||||
|
||||
# hardware specifics are in here
|
||||
../2configs/hw/tp-x220.nix
|
||||
@ -36,14 +37,14 @@
|
||||
];
|
||||
nixpkgs.config.packageOverrides = pkgs: {
|
||||
tinc = pkgs.tinc_pre;
|
||||
buildbot = let
|
||||
pkgs1509 = import (fetchTarball https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable.tar.gz) {};
|
||||
in pkgs1509.buildbot;
|
||||
};
|
||||
makefu.buildbot.master.enable = true;
|
||||
|
||||
#krebs.Reaktor.enable = true;
|
||||
#krebs.Reaktor.nickname = "makefu|r";
|
||||
krebs.Reaktor = {
|
||||
enable = true;
|
||||
nickname = "makefu|r";
|
||||
plugins = with pkgs.ReaktorPlugins; [ nixos-version random-emoji ];
|
||||
};
|
||||
|
||||
# nix.binaryCaches = [ "http://acng.shack/nixos" "https://cache.nixos.org" ];
|
||||
|
||||
environment.systemPackages = with pkgs;[
|
||||
|
@ -1,18 +0,0 @@
|
||||
_:
|
||||
{
|
||||
# implementation of the complete Reaktor bot
|
||||
imports = [
|
||||
#./stockholmLentil.nix
|
||||
./simpleExtend.nix
|
||||
./random-emoji.nix
|
||||
./titlebot.nix
|
||||
./shack-correct.nix
|
||||
./sed-plugin.nix
|
||||
];
|
||||
krebs.Reaktor.nickname = "Reaktor|bot";
|
||||
krebs.Reaktor.enable = true;
|
||||
|
||||
krebs.Reaktor.extraEnviron = {
|
||||
REAKTOR_CHANNELS = "#krebs,#binaergewitter,#shackspace";
|
||||
};
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with pkgs;
|
||||
let
|
||||
rpkg = pkgs.substituteAll( {
|
||||
name="random-emoji";
|
||||
dir= "bin";
|
||||
isExecutable=true;
|
||||
src= ./random-emoji.sh;
|
||||
});
|
||||
rpkg-path = lib.makeSearchPath "bin" (with pkgs; [
|
||||
coreutils
|
||||
gnused
|
||||
gnugrep
|
||||
xmlstarlet
|
||||
curl]);
|
||||
in {
|
||||
# TODO: make origin a variable, <- module is generic enough to handle different origins, not only stockholm
|
||||
krebs.Reaktor.extraConfig = ''
|
||||
public_commands.insert(0,{
|
||||
'capname' : "emoji",
|
||||
'pattern' : indirect_pattern.format("emoji"),
|
||||
'argv' : ["${rpkg}/bin/random-emoji"],
|
||||
'env' : { 'PATH':'${rpkg-path}' } })
|
||||
'';
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
curl http://emojicons.com/random -s | \
|
||||
grep data-text | \
|
||||
sed -n 's/.*>\(.*\)<\/textarea>/\1/p' | \
|
||||
head -n 1 | \
|
||||
xmlstarlet unesc
|
@ -1,18 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with pkgs;
|
||||
let
|
||||
script = ./sed-plugin.py;
|
||||
in {
|
||||
#TODO: this will eat up the last regex, fix Reaktor
|
||||
krebs.Reaktor.extraConfig = ''
|
||||
public_commands.append({
|
||||
'capname' : "sed-plugin",
|
||||
# only support s///gi
|
||||
'pattern' : '^(?P<args>.*)$$',
|
||||
'argv' : ["${pkgs.python3}/bin/python3","${script}"],
|
||||
'env' : { 'state_dir' : workdir,
|
||||
'PATH':'${lib.makeSearchPath "bin" [pkgs.gnused]}' }})
|
||||
'';
|
||||
}
|
||||
|
@ -1,20 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with pkgs;
|
||||
let
|
||||
script = pkgs.substituteAll ( {
|
||||
name="shack-correct";
|
||||
isExecutable=true;
|
||||
dir = "";
|
||||
src = ./shack-correct.sh;
|
||||
});
|
||||
in {
|
||||
krebs.Reaktor.extraConfig = ''
|
||||
public_commands.insert(0,{
|
||||
'capname' : "shack-correct",
|
||||
'pattern' : '^(?P<args>.*Shack.*)$$',
|
||||
'argv' : ["${script}"],
|
||||
'env' : { }})
|
||||
'';
|
||||
}
|
||||
|
@ -1,19 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with pkgs;
|
||||
let
|
||||
nixos-version-script = pkgs.writeScript "nix-version" ''
|
||||
#! /bin/sh
|
||||
. /etc/os-release
|
||||
echo "$PRETTY_NAME"
|
||||
'';
|
||||
in {
|
||||
krebs.Reaktor.extraConfig = ''
|
||||
public_commands.insert(0,{
|
||||
'capname' : "nixos-version",
|
||||
'pattern' : indirect_pattern.format("nixos-version"),
|
||||
'argv' : ["${nixos-version-script}"],
|
||||
'env' : { 'state_dir': workdir } })
|
||||
'';
|
||||
}
|
||||
|
@ -1,27 +0,0 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with pkgs;
|
||||
let
|
||||
random-issue = pkgs.substituteAll( {
|
||||
name="random-issue";
|
||||
dir= "bin";
|
||||
isExecutable=true;
|
||||
src= ./random-issue.sh;
|
||||
});
|
||||
random-issue-path = lib.makeSearchPath "bin" (with pkgs; [
|
||||
coreutils
|
||||
git
|
||||
gnused
|
||||
lentil]);
|
||||
in {
|
||||
# TODO: make origin a variable, <- module is generic enough to handle different origins, not only stockholm
|
||||
krebs.Reaktor.extraConfig = ''
|
||||
public_commands.insert(0,{
|
||||
'capname' : "stockholm-issue",
|
||||
'pattern' : indirect_pattern.format("stockholm-issue"),
|
||||
'argv' : ["${random-issue}/bin/random-issue"],
|
||||
'env' : { 'state_dir': workdir,
|
||||
'PATH':'${random-issue-path}',
|
||||
'origin':'http://cgit.pnp/stockholm' } })
|
||||
'';
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
{ stdenv,config, lib, pkgs, ... }:
|
||||
|
||||
with pkgs;
|
||||
let
|
||||
pypkgs = pkgs.python3Packages;
|
||||
titlebot_cmds = pypkgs.buildPythonPackage {
|
||||
name = "titlebot_cmds";
|
||||
propagatedBuildInputs = with pypkgs; [ setuptools ];
|
||||
src = fetchurl {
|
||||
# https://github.com/makefu/reaktor-titlebot tag 2.1.0
|
||||
url = "https://github.com/makefu/reaktor-titlebot/archive/2.1.0.tar.gz";
|
||||
sha256 = "0wvf09wmk8b52f9j65qrw81nwrhs9pfhijwrlkzp5l7l2q8cjkp6";
|
||||
};
|
||||
};
|
||||
pub_cmds = ["up" "help" "list" "top" "highest" "undo" ];
|
||||
priv_cmds = [ "clear" ];
|
||||
in {
|
||||
# TODO: write identify file in
|
||||
# {config.users.extraUsers.Reaktor.home}/state/admin.lst
|
||||
krebs.Reaktor.extraConfig = ''
|
||||
def titlebot_cmd(cmd):
|
||||
return {
|
||||
'capname': cmd,
|
||||
'env': {
|
||||
'TITLEDB':
|
||||
'${config.users.extraUsers.Reaktor.home}/suggestions.json'
|
||||
},
|
||||
'pattern': '^\\.' + cmd + '\\s*(?:\\s+(?P<args>.*))?$$',
|
||||
'argv': [ '${titlebot_cmds}/bin/' + cmd ] }
|
||||
# TODO: for each element in ${titlebot_cmds}/bin/*
|
||||
public_commands.insert(0,titlebot_cmd('up'))
|
||||
public_commands.insert(0,titlebot_cmd('help'))
|
||||
public_commands.insert(0,titlebot_cmd('list'))
|
||||
public_commands.insert(0,titlebot_cmd('top'))
|
||||
public_commands.insert(0,titlebot_cmd('new'))
|
||||
commands.insert(0,titlebot_cmd('clear'))
|
||||
'';
|
||||
}
|
@ -12,7 +12,7 @@
|
||||
http://git.sysphere.org/vicious/log/?qt=grep&q=Next+release
|
||||
https://pypi.python.org/simple/bepasty/
|
||||
https://pypi.python.org/simple/xstatic/
|
||||
http://cvs2svn.tigris.org/servlets/ProjectDocumentList?folderID=2976
|
||||
http://cvs2svn.tigris.org/svn/cvs2svn/tags/
|
||||
];
|
||||
};
|
||||
}
|
||||
|
42
tv/2configs/backup.nix
Normal file
42
tv/2configs/backup.nix
Normal file
@ -0,0 +1,42 @@
|
||||
{ config, lib, ... }:
|
||||
with lib;
|
||||
{
|
||||
krebs.backup.plans = addNames {
|
||||
xu-test-cd = {
|
||||
method = "push";
|
||||
|
||||
src = { host = config.krebs.hosts.xu; path = "/tmp/xu-test"; };
|
||||
dst = { host = config.krebs.hosts.cd; path = "/tmp/backups/xu-test"; };
|
||||
|
||||
#startAt = "0,6,12,18:00";
|
||||
startAt = "minutely";
|
||||
snapshots = {
|
||||
minutely = { format = "%Y-%m-%dT%H:%M"; retain = 5; };
|
||||
hourly = { format = "%Y-%m-%dT%H"; retain = 4; };
|
||||
daily = { format = "%Y-%m-%d"; retain = 7; };
|
||||
weekly = { format = "%YW%W"; retain = 4; };
|
||||
monthly = { format = "%Y-%m"; retain = 12; };
|
||||
yearly = { format = "%Y"; };
|
||||
};
|
||||
};
|
||||
#xu-test-wu = {
|
||||
# method = "push";
|
||||
# dst = { user = tv; host = wu; path = "/krebs/backup/xu-test"; };
|
||||
#};
|
||||
cd-test-xu = {
|
||||
method = "pull";
|
||||
src = { host = config.krebs.hosts.cd; path = "/tmp/cd-test"; };
|
||||
dst = { host = config.krebs.hosts.xu; path = "/tmp/backups/cd-test"; };
|
||||
startAt = "minutely";
|
||||
snapshots = {
|
||||
minutely = { format = "%Y-%m-%dT%H:%M"; retain = 5; };
|
||||
hourly = { format = "%Y-%m-%dT%H"; retain = 4; };
|
||||
daily = { format = "%Y-%m-%d"; retain = 7; };
|
||||
weekly = { format = "%YW%W"; retain = 4; };
|
||||
monthly = { format = "%Y-%m"; retain = 12; };
|
||||
yearly = { format = "%Y"; };
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
}
|
@ -28,6 +28,7 @@ with lib;
|
||||
|
||||
imports = [
|
||||
<secrets>
|
||||
./backup.nix
|
||||
./vim.nix
|
||||
{
|
||||
# stockholm dependencies
|
||||
|
@ -4,7 +4,7 @@ with lib;
|
||||
let
|
||||
out = {
|
||||
environment.systemPackages = [
|
||||
pkgs.vim
|
||||
vim
|
||||
];
|
||||
|
||||
# Nano really is just a stupid name for Vim.
|
||||
@ -22,14 +22,38 @@ let
|
||||
"${pkgs.vimPlugins.undotree}/share/vim-plugins/undotree"
|
||||
];
|
||||
|
||||
dirs = {
|
||||
backupdir = "$HOME/.cache/vim/backup";
|
||||
swapdir = "$HOME/.cache/vim/swap";
|
||||
undodir = "$HOME/.cache/vim/undo";
|
||||
};
|
||||
files = {
|
||||
viminfo = "$HOME/.cache/vim/info";
|
||||
};
|
||||
|
||||
mkdirs = let
|
||||
dirOf = s: let out = concatStringsSep "/" (init (splitString "/" s));
|
||||
in assert out != ""; out;
|
||||
alldirs = attrValues dirs ++ map dirOf (attrValues files);
|
||||
in unique (sort lessThan alldirs);
|
||||
|
||||
vim = pkgs.writeScriptBin "vim" ''
|
||||
#! ${pkgs.dash}/bin/dash
|
||||
set -f
|
||||
umask 0077
|
||||
${concatStringsSep "\n" (map (x: "mkdir -p ${x}") mkdirs)}
|
||||
umask 0022
|
||||
exec ${pkgs.vim}/bin/vim "$@"
|
||||
'';
|
||||
|
||||
vimrc = pkgs.writeText "vimrc" ''
|
||||
set nocompatible
|
||||
|
||||
set autoindent
|
||||
set backspace=indent,eol,start
|
||||
set backup
|
||||
set backupdir=$HOME/.vim/backup/
|
||||
set directory=$HOME/.vim/cache//
|
||||
set backupdir=${dirs.backupdir}/
|
||||
set directory=${dirs.swapdir}//
|
||||
set hlsearch
|
||||
set incsearch
|
||||
set mouse=a
|
||||
@ -40,11 +64,11 @@ let
|
||||
set showcmd
|
||||
set showmatch
|
||||
set ttimeoutlen=0
|
||||
set undodir=$HOME/.vim/undo
|
||||
set undodir=${dirs.undodir}
|
||||
set undofile
|
||||
set undolevels=1000000
|
||||
set undoreload=1000000
|
||||
set viminfo='20,<1000,s100,h,n$HOME/.vim/cache/info
|
||||
set viminfo='20,<1000,s100,h,n${files.viminfo}
|
||||
set visualbell
|
||||
set wildignore+=*.o,*.class,*.hi,*.dyn_hi,*.dyn_o
|
||||
set wildmenu
|
||||
|
@ -48,7 +48,7 @@ let
|
||||
"slock"
|
||||
];
|
||||
|
||||
systemd.services.display-manager = mkForce {};
|
||||
systemd.services.display-manager.enable = false;
|
||||
|
||||
services.xserver.enable = true;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user