2016-02-19 17:56:01 +00:00
|
|
|
# nix-shell -p gnumake jq openssh cac-api cac-panel sshpass
|
2015-12-22 22:37:12 +00:00
|
|
|
set -eufx
|
2015-12-22 15:30:23 +00:00
|
|
|
|
|
|
|
# 2 secrets are required:
|
2015-12-22 22:37:12 +00:00
|
|
|
|
2015-12-22 15:30:23 +00:00
|
|
|
krebs_cred=${krebs_cred-./cac.json}
|
|
|
|
retiolum_key=${retiolum_key-./retiolum.rsa_key.priv}
|
|
|
|
|
2015-12-28 12:23:34 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2015-12-22 15:30:23 +00:00
|
|
|
# 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
|
2015-12-22 23:06:27 +00:00
|
|
|
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
|
2015-12-22 15:30:23 +00:00
|
|
|
# we need to receive this key from buildmaster to speed up tinc bootstrap
|
2015-12-28 12:23:34 +00:00
|
|
|
defer "trap - INT TERM EXIT"
|
|
|
|
defer "rm -r $krebs_secrets"
|
2015-12-22 15:30:23 +00:00
|
|
|
|
|
|
|
cat > $sec_file <<EOF
|
|
|
|
cac_login="$(jq -r .email $krebs_cred)"
|
2016-02-04 01:55:28 +00:00
|
|
|
cac_key="$(cac-panel --config $krebs_cred settings | jq -r .apicode)"
|
2015-12-22 15:30:23 +00:00
|
|
|
EOF
|
|
|
|
|
|
|
|
export cac_secrets=$sec_file
|
2016-02-04 01:55:28 +00:00
|
|
|
cac-panel --config $krebs_cred add-api-ip
|
2015-12-22 15:30:23 +00:00
|
|
|
|
|
|
|
# test login:
|
2016-02-04 01:55:28 +00:00
|
|
|
cac-api update
|
|
|
|
cac-api servers
|
2015-12-22 15:30:23 +00:00
|
|
|
|
2015-12-28 12:23:34 +00:00
|
|
|
# preserve old trap
|
|
|
|
old_trapstr=$(clear_defer)
|
|
|
|
while true;do
|
|
|
|
# Template 26: CentOS7
|
2016-02-03 18:39:00 +00:00
|
|
|
# TODO: use cac-api templates to determine the real Centos7 template in case it changes
|
2016-02-04 01:55:28 +00:00
|
|
|
out=$(cac-api build cpu=1 ram=512 storage=10 os=26 2>&1)
|
2016-01-02 20:36:51 +00:00
|
|
|
if name=$(echo "$out" | jq -r .servername);then
|
|
|
|
id=servername:$name
|
|
|
|
echo "got a working machine, id=$id"
|
|
|
|
else
|
|
|
|
echo "Unable to build a virtual machine, retrying in 15 seconds" >&2
|
|
|
|
echo "Output of build program: $out" >&2
|
|
|
|
sleep 15
|
|
|
|
continue
|
|
|
|
fi
|
2015-12-22 15:30:23 +00:00
|
|
|
|
2015-12-28 12:23:34 +00:00
|
|
|
clear_defer >/dev/null
|
2016-02-03 18:39:00 +00:00
|
|
|
defer "cac-api delete $id"
|
2015-12-22 15:30:23 +00:00
|
|
|
|
2015-12-28 12:23:34 +00:00
|
|
|
# TODO: timeout?
|
|
|
|
|
|
|
|
wait_login_cac(){
|
2016-01-02 20:36:51 +00:00
|
|
|
# we wait for 30 minutes
|
|
|
|
for t in `seq 180`;do
|
2016-02-03 18:39:00 +00:00
|
|
|
# now we have a working cac-api server
|
|
|
|
if cac-api ssh $1 -o ConnectTimeout=10 \
|
2015-12-28 12:23:34 +00:00
|
|
|
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
|
2016-02-04 01:55:28 +00:00
|
|
|
echo "Cleaning up old image,last status: $(cac-api update;cac-api getserver $id | jq -r .status)"
|
2015-12-30 03:56:53 +00:00
|
|
|
eval "$(clear_defer | sed 's/;exit//')"
|
2016-01-02 20:36:51 +00:00
|
|
|
sleep 15
|
2015-12-28 12:23:34 +00:00
|
|
|
else
|
|
|
|
echo "got a working system" >&2
|
2015-12-30 03:56:53 +00:00
|
|
|
break
|
2015-12-28 12:23:34 +00:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
clear_defer >/dev/null
|
2016-02-04 01:55:28 +00:00
|
|
|
defer "cac-api delete $id;$old_trapstr"
|
2015-12-22 15:30:23 +00:00
|
|
|
|
|
|
|
mkdir -p shared/2configs/temp
|
2016-02-04 01:55:28 +00:00
|
|
|
cac-api generatenetworking $id > \
|
2015-12-22 15:30:23 +00:00
|
|
|
shared/2configs/temp/networking.nix
|
2016-02-19 17:56:01 +00:00
|
|
|
# new temporary ssh key we will use to log in after install
|
2015-12-22 15:30:23 +00:00
|
|
|
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
|
2016-02-04 01:55:28 +00:00
|
|
|
ip=$(cac-api getserver $id | jq -r .ip)
|
2015-12-22 15:30:23 +00:00
|
|
|
|
|
|
|
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)"
|
|
|
|
];
|
|
|
|
}
|
|
|
|
EOF
|
|
|
|
|
2016-02-19 17:56:01 +00:00
|
|
|
make install \
|
|
|
|
LOGNAME=shared \
|
|
|
|
SSHPASS="$(cac-api getserver $id | jq -r .rootpass)" \
|
|
|
|
ssh='sshpass -e ssh -S none -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' \
|
|
|
|
system=test-centos7 \
|
|
|
|
target=$ip
|
2015-12-22 15:30:23 +00:00
|
|
|
|
|
|
|
# TODO: generate secrets directory $krebs_secrets for nix import
|
2016-02-04 01:55:28 +00:00
|
|
|
cac-api powerop $id reset
|
2015-12-22 15:30:23 +00:00
|
|
|
|
|
|
|
wait_login(){
|
|
|
|
# timeout
|
2015-12-24 01:20:24 +00:00
|
|
|
for t in `seq 90`;do
|
2016-02-03 18:39:00 +00:00
|
|
|
# now we have a working cac-api server
|
2015-12-22 15:30:23 +00:00
|
|
|
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
|