rewrite infest-cac-CentOS-7-64bit
This commit is contained in:
parent
bb7343cd89
commit
45a0cb01d3
32
README.md
Normal file
32
README.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
|
||||||
|
# Turn a Cloud at Cost CentOS-7-64bit server into NixOS
|
||||||
|
|
||||||
|
1. Configure the system (`$systemname`) you'd like to install (see Configuration below).
|
||||||
|
2. Create new server instance (either Custom or cloudpro) using "CentOS-7-64bit".
|
||||||
|
Note the servername (something like c731445864-cloudpro-388922936).
|
||||||
|
3. `cac_login=xxx cac_key=yyy ./infest-cac-CentOS-7-64bit.sh servername:$servername $systename`
|
||||||
|
4. Enjoy. (`ssh root@$systename`)
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
|
||||||
|
Configure your system in modules/$systemname
|
||||||
|
See modules/cd/default.nix as an example.
|
||||||
|
|
||||||
|
Notice that modules/$systemname/networking will be autogenerated (but not committed).
|
||||||
|
|
||||||
|
secrets/$systemname/nix/foo can be accessed as `<secrets/foo>` from within the configuration.
|
||||||
|
|
||||||
|
You might want `secrets/$systemname/rsync/etc/tinc/retiolum/rsa_key.priv`.
|
||||||
|
|
||||||
|
You might want `secrets/$systemname/nix/hashedPasswords.nix`, which looks like
|
||||||
|
|
||||||
|
```nix
|
||||||
|
_: { users.extraUsers.root.hashedPassword = "XXX"; }
|
||||||
|
```
|
||||||
|
|
||||||
|
`XXX` can be generated with e.g.
|
||||||
|
|
||||||
|
```
|
||||||
|
mkpasswd -m sha-512 -S $(openssl rand -base64 16 | tr -d '+=' | head -c 16)
|
||||||
|
```
|
@ -1,10 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
|
|
||||||
exec _cac_exec curl -fsS "$1" "https://panel.cloudatcost.com/api/v1/$2.php" $(
|
|
||||||
shift 2
|
|
||||||
set -- "$@" login="$cac_login" key="$cac_key"
|
|
||||||
for arg; do
|
|
||||||
echo -d $(printf '%s' "$arg" | urlencode)
|
|
||||||
done
|
|
||||||
)
|
|
@ -1,8 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
|
|
||||||
if test -z "${cac_via-}"; then
|
|
||||||
exec "$@"
|
|
||||||
else
|
|
||||||
exec ssh -q "$cac_via" -t "$@"
|
|
||||||
fi
|
|
@ -1,3 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
exec _cac_curl_api_v1 -G "$@"
|
|
@ -1,3 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
exec _cac_curl_api_v1 -XPOST "$@"
|
|
@ -1,5 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
|
|
||||||
# default os=26 is CentOS-7-64bit
|
|
||||||
exec _cac_post_api_v1 cloudpro/build cpu="$1" ram="$2" storage="$3" os="${4-26}"
|
|
@ -1,3 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
exec _cac_post_api_v1 cloudpro/delete sid="$1"
|
|
@ -1,3 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
exec _cac_get_api_v1 cloudpro/resources
|
|
@ -1,3 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
exec _cac_post_api_v1 console sid="$1"
|
|
@ -1,17 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
|
|
||||||
cac-listservers \
|
|
||||||
| jq \
|
|
||||||
--arg k "$1" \
|
|
||||||
--arg v "$2" \
|
|
||||||
'
|
|
||||||
map(select(.[$k]==$v)) |
|
|
||||||
if (. | length) == 0 then
|
|
||||||
null
|
|
||||||
elif (. | length) == 1 then
|
|
||||||
.[0]
|
|
||||||
else
|
|
||||||
.
|
|
||||||
end
|
|
||||||
'
|
|
@ -1,12 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
|
|
||||||
listservers=$(_cac_get_api_v1 listservers)
|
|
||||||
status=$(echo "$listservers" | jq -r .status)
|
|
||||||
|
|
||||||
if [ "$status" = ok ]; then
|
|
||||||
echo "$listservers" | jq -r .data
|
|
||||||
else
|
|
||||||
echo "$0: bad listservers status: $status" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
@ -1,3 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
exec _cac_get_api_v1 listtasks
|
|
@ -1,4 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
|
|
||||||
exec _cac_get_api_v1 listtemplates
|
|
@ -1,3 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
exec _cac_post_api_v1 powerop sid="$1" action="$2"
|
|
@ -1,3 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
exec _cac_post_api_v1 rdns sid="$1" hostname="$2"
|
|
@ -1,3 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
exec _cac_post_api_v1 renameserver sid="$1" name="$2"
|
|
@ -1,3 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
exec _cac_post_api_v1 rdns sid="$1" mode="$2"
|
|
17
bin/cac-ssh
17
bin/cac-ssh
@ -1,17 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
|
|
||||||
server=$1
|
|
||||||
shift
|
|
||||||
|
|
||||||
address=$(echo $server | jq -r .ip)
|
|
||||||
target=root@$address
|
|
||||||
|
|
||||||
SSHPASS=$(echo $server | jq -r .rootpass)
|
|
||||||
export SSHPASS
|
|
||||||
|
|
||||||
exec sshpass -e ssh \
|
|
||||||
-o StrictHostKeyChecking=no \
|
|
||||||
-o UserKnownHostsFile=/dev/null \
|
|
||||||
"$target" \
|
|
||||||
"$@"
|
|
@ -1,28 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# cacnixos-networking : cac-server x hostname -> nixos-module
|
|
||||||
# TODO use label for hostname
|
|
||||||
set -euf
|
|
||||||
|
|
||||||
server=$1
|
|
||||||
hostname=$2
|
|
||||||
|
|
||||||
address=$(echo $server | jq -r .ip)
|
|
||||||
gateway=$(echo $server | jq -r .gateway)
|
|
||||||
nameserver=8.8.8.8
|
|
||||||
netmask=$(echo $server | jq -r .netmask)
|
|
||||||
prefix=$(netmask-to-prefix $netmask)
|
|
||||||
|
|
||||||
printf '{...}:\n'
|
|
||||||
printf '{\n'
|
|
||||||
printf ' networking.hostName = "%s";\n' $hostname
|
|
||||||
printf ' networking.interfaces.enp2s1.ip4 = [\n'
|
|
||||||
printf ' {\n'
|
|
||||||
printf ' address = "%s";\n' $address
|
|
||||||
printf ' prefixLength = %d;\n' $prefix
|
|
||||||
printf ' }\n'
|
|
||||||
printf ' ];\n'
|
|
||||||
printf ' networking.defaultGateway = "%s";\n' $gateway
|
|
||||||
printf ' networking.nameservers = [\n'
|
|
||||||
printf ' "%s"\n' $nameserver
|
|
||||||
printf ' ];\n'
|
|
||||||
printf '}\n'
|
|
@ -1,150 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
|
|
||||||
server=$1
|
|
||||||
hostname=$2
|
|
||||||
|
|
||||||
address=$(echo $server | jq -r .ip)
|
|
||||||
RSYNC_RSH='sshpass -e ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
|
|
||||||
SSHPASS=$(echo $server | jq -r .rootpass)
|
|
||||||
export SSHPASS
|
|
||||||
export RSYNC_RSH
|
|
||||||
|
|
||||||
main="modules/$hostname/default.nix"
|
|
||||||
target="root@$address"
|
|
||||||
|
|
||||||
cacnixos-networking "$server" $hostname \
|
|
||||||
> modules/$hostname/networking.nix
|
|
||||||
|
|
||||||
echo '(
|
|
||||||
set -xeuf
|
|
||||||
type bzip2 || yum install -y bzip2
|
|
||||||
type rsync || yum install -y rsync
|
|
||||||
)' \
|
|
||||||
| sshpass -e ssh \
|
|
||||||
-o StrictHostKeyChecking=no \
|
|
||||||
-o UserKnownHostsFile=/dev/null \
|
|
||||||
"root@$address" \
|
|
||||||
/bin/sh
|
|
||||||
|
|
||||||
make-rsync-filter "$main" \
|
|
||||||
| rsync -f '. -' -zvrlptD --delete-excluded ./ "$target":/etc/nixos/
|
|
||||||
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
echo '(
|
|
||||||
set -xeuf
|
|
||||||
groupadd -g 30000 nixbld || :
|
|
||||||
for i in `seq 1 10`; do
|
|
||||||
useradd -c "foolsgarden Nix build user $i" \
|
|
||||||
-d /var/empty \
|
|
||||||
-s /sbin/nologin \
|
|
||||||
-g 30000 \
|
|
||||||
-G 30000 \
|
|
||||||
-l -u $(expr 30000 + $i) \
|
|
||||||
nixbld$i || :
|
|
||||||
rm -f /var/spool/mail/nixbld$i
|
|
||||||
done
|
|
||||||
|
|
||||||
#curl https://nixos.org/nix/install | sh
|
|
||||||
nix_tar=$nix_basename.tar.bz2
|
|
||||||
if ! echo $nix_sha256 $nix_tar | sha256sum -c; then
|
|
||||||
curl -O -C - $nix_url || :
|
|
||||||
if ! echo $nix_sha256 $nix_tar | sha256sum -c; then
|
|
||||||
curl -O $nix_url || :
|
|
||||||
if ! echo $nix_sha256 $nix_tar | sha256sum -c; then
|
|
||||||
echo $0: cannot download $nix_url >&2
|
|
||||||
exit 5
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! test -d $nix_basename; then
|
|
||||||
tar jxf $nix_basename.tar.bz2
|
|
||||||
fi
|
|
||||||
|
|
||||||
nix_find=$nix_basename.find.txt
|
|
||||||
if ! echo $nix_find_sha1sum $nix_find | sha1sum -c; then
|
|
||||||
find $nix_basename | sort > $nix_find
|
|
||||||
if ! echo $nix_find_sha1sum $nix_find | sha1sum -c; then
|
|
||||||
echo $0: cannot unpack $nix_basename.tar.bz2 >&2
|
|
||||||
# TODO we could retry
|
|
||||||
exit 6
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p bin
|
|
||||||
PATH=$HOME/bin:$PATH
|
|
||||||
export PATH
|
|
||||||
|
|
||||||
# generate fake sudo because
|
|
||||||
# sudo: sorry, you must have a tty to run sudo
|
|
||||||
{
|
|
||||||
echo "#! /bin/sh"
|
|
||||||
echo "exec env \"\$@\""
|
|
||||||
} > bin/sudo
|
|
||||||
chmod +x bin/sudo
|
|
||||||
|
|
||||||
./$nix_basename/install
|
|
||||||
|
|
||||||
. /root/.nix-profile/etc/profile.d/nix.sh
|
|
||||||
|
|
||||||
nixpkgs_expr="import <nixpkgs> { system = builtins.currentSystem; }"
|
|
||||||
nixpkgs_path=$(
|
|
||||||
find /nix/store -mindepth 1 -maxdepth 1 -name *-nixpkgs-* -type d
|
|
||||||
)
|
|
||||||
|
|
||||||
for i in nixos-generate-config nixos-install; do
|
|
||||||
nix-env \
|
|
||||||
--arg config "{ nix.package = ($nixpkgs_expr).nix; }" \
|
|
||||||
--arg pkgs "$nixpkgs_expr" \
|
|
||||||
--arg modulesPath "throw \"no modulesPath\"" \
|
|
||||||
-f $nixpkgs_path/nixpkgs/nixos/modules/installer/tools/tools.nix \
|
|
||||||
-iA config.system.build.$i
|
|
||||||
done
|
|
||||||
|
|
||||||
# TODO following fail when aborted in-between
|
|
||||||
if ! test -d /int; then
|
|
||||||
mkdir -p /int
|
|
||||||
mount --bind /int /mnt
|
|
||||||
fi
|
|
||||||
if ! test -d /mnt/boot; then
|
|
||||||
mkdir -p /mnt/boot
|
|
||||||
mount /dev/sda1 /mnt/boot
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p /mnt/etc/nixos
|
|
||||||
rsync -zvrlptD --delete-excluded /etc/nixos/ /mnt/etc/nixos/
|
|
||||||
|
|
||||||
mkdir -m 0444 -p /mnt/var/empty
|
|
||||||
|
|
||||||
ln -s $main /mnt/etc/nixos/configuration.nix
|
|
||||||
nixos-install \
|
|
||||||
-I secrets=/etc/nixos/secrets
|
|
||||||
|
|
||||||
find / \
|
|
||||||
1> /root/pre-rsync-find.out \
|
|
||||||
2> /root/pre-rsync-find.err
|
|
||||||
|
|
||||||
rsync -va --force /int/ /
|
|
||||||
|
|
||||||
# find / -type f -mtime +1 -exec rm -v {} \; 2>&1 > rm.log
|
|
||||||
# ^ too aggressive, kills journal which is bad
|
|
||||||
# shutdown -r now
|
|
||||||
# nix-channel --add https://nixos.org/channels/nixos-unstable nixos
|
|
||||||
# nix-channel --remove nixpkgs
|
|
||||||
# nix-channel --update
|
|
||||||
|
|
||||||
)' \
|
|
||||||
| sshpass -e ssh \
|
|
||||||
-o StrictHostKeyChecking=no \
|
|
||||||
-o UserKnownHostsFile=/dev/null \
|
|
||||||
"root@$address" \
|
|
||||||
-T /usr/bin/env \
|
|
||||||
nix_url="$nix_url" \
|
|
||||||
nix_basename="$(basename $nix_url .tar.bz2)" \
|
|
||||||
nix_sha256="$nix_sha256" \
|
|
||||||
nix_find_sha1sum="$nix_find_sha1sum" \
|
|
||||||
main="$main" \
|
|
||||||
/bin/sh
|
|
@ -1,21 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
set -euf
|
|
||||||
|
|
||||||
server=$(cac-get-server-by servername "$1")
|
|
||||||
hostname=$2
|
|
||||||
|
|
||||||
serverstatus=$(echo $server | jq -r .status)
|
|
||||||
case $serverstatus in
|
|
||||||
'Powered On') : ;;
|
|
||||||
*)
|
|
||||||
echo $0: bad server status: $serverstatus >&2
|
|
||||||
exit 2
|
|
||||||
esac
|
|
||||||
|
|
||||||
template=$(echo $server | jq -r .template)
|
|
||||||
case $template in
|
|
||||||
'CentOS-7-64bit') infest-"$template" "$server" "$hostname";;
|
|
||||||
*)
|
|
||||||
echo $0: bad template: $template >&2
|
|
||||||
exit 3
|
|
||||||
esac
|
|
337
cac
Executable file
337
cac
Executable file
@ -0,0 +1,337 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
set -euf
|
||||||
|
|
||||||
|
PATH=$PWD/bin:$PATH
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
cac_listservers_cache=$PWD/tmp/cac_listservers_cache.json
|
||||||
|
|
||||||
|
|
||||||
|
cac() {
|
||||||
|
__cac_cli__command=$1
|
||||||
|
shift
|
||||||
|
__cac_cli__"$__cac_cli__command" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# WIP
|
||||||
|
__cac_cli__help() {(
|
||||||
|
exec sed < "$0" -n '
|
||||||
|
s/^__cac_cli__\([^(]\+\)().*/\1/p
|
||||||
|
'
|
||||||
|
)}
|
||||||
|
|
||||||
|
# usage: console
|
||||||
|
__cac_cli__console() {(
|
||||||
|
server=$(__cac_cli__getserver "$1")
|
||||||
|
sid=$(echo $server | jq -r .sid)
|
||||||
|
# TODO check reply status == ok
|
||||||
|
_cac_post_api_v1 console sid="$sid" | jq -r .console
|
||||||
|
)}
|
||||||
|
|
||||||
|
__cac_cli__listservers() {
|
||||||
|
jq -r . $cac_listservers_cache
|
||||||
|
}
|
||||||
|
|
||||||
|
__cac_cli__update() {(
|
||||||
|
umask 0077
|
||||||
|
servers=$(_cac_listservers)
|
||||||
|
echo $servers > $cac_listservers_cache.tmp
|
||||||
|
mv $cac_listservers_cache.tmp $cac_listservers_cache
|
||||||
|
)}
|
||||||
|
|
||||||
|
__cac_cli__getserver() {(
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
*:*)
|
||||||
|
k=${1%%:*}
|
||||||
|
v=${1#*:}
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
k=label
|
||||||
|
v=${1#*:}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if result=$(jq \
|
||||||
|
-e \
|
||||||
|
--arg k "$k" \
|
||||||
|
--arg v "$v" \
|
||||||
|
'
|
||||||
|
map(select(.[$k]==$v)) |
|
||||||
|
if (. | length) == 1 then
|
||||||
|
.[0]
|
||||||
|
else
|
||||||
|
null
|
||||||
|
end
|
||||||
|
' \
|
||||||
|
$cac_listservers_cache); then
|
||||||
|
echo $result | jq -r .
|
||||||
|
else
|
||||||
|
echo "$0 getserver $k:$v => not unique server found" >&2
|
||||||
|
exit 23
|
||||||
|
fi
|
||||||
|
)}
|
||||||
|
|
||||||
|
__cac_cli__generatenetworking() {(
|
||||||
|
server=$(__cac_cli__getserver "$1")
|
||||||
|
|
||||||
|
hostname=$(echo $server | jq -r .label)
|
||||||
|
|
||||||
|
address=$(echo $server | jq -r .ip)
|
||||||
|
gateway=$(echo $server | jq -r .gateway)
|
||||||
|
nameserver=8.8.8.8
|
||||||
|
netmask=$(echo $server | jq -r .netmask)
|
||||||
|
prefix=$(netmask-to-prefix $netmask)
|
||||||
|
|
||||||
|
#printf '# Generated file: %s generatenetworking %s %s\n' "$0" "$1" "$2"
|
||||||
|
#printf '# on %s\n' "$(date -Is)"
|
||||||
|
#printf '\n'
|
||||||
|
printf '_:\n'
|
||||||
|
printf '\n'
|
||||||
|
printf '{\n'
|
||||||
|
printf ' networking.hostName = "%s";\n' $hostname
|
||||||
|
printf ' networking.interfaces.enp2s1.ip4 = [\n'
|
||||||
|
printf ' {\n'
|
||||||
|
printf ' address = "%s";\n' $address
|
||||||
|
printf ' prefixLength = %d;\n' $prefix
|
||||||
|
printf ' }\n'
|
||||||
|
printf ' ];\n'
|
||||||
|
printf ' networking.defaultGateway = "%s";\n' $gateway
|
||||||
|
printf ' networking.nameservers = [\n'
|
||||||
|
printf ' "%s"\n' $nameserver
|
||||||
|
printf ' ];\n'
|
||||||
|
printf '}\n'
|
||||||
|
)}
|
||||||
|
|
||||||
|
__cac_cli__powerop() {(
|
||||||
|
server=$(__cac_cli__getserver "$1")
|
||||||
|
action=$2
|
||||||
|
|
||||||
|
sid=$(echo $server | jq -r .sid)
|
||||||
|
|
||||||
|
reply=$(_cac_post_api_v1 powerop sid="$sid" action="$action")
|
||||||
|
|
||||||
|
case $(echo $reply | jq -r .status) in
|
||||||
|
ok)
|
||||||
|
echo $reply | jq -r . >&2
|
||||||
|
__cac_cli__update
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo bad reply: >&2
|
||||||
|
echo $reply | jq -r . >&2
|
||||||
|
exit 23
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
)}
|
||||||
|
__cac_cli__pushconfig() {(
|
||||||
|
server=$(__cac_cli__getserver "$1")
|
||||||
|
|
||||||
|
prefix=${2-/}
|
||||||
|
|
||||||
|
hostname=$(echo $server | jq -r .label)
|
||||||
|
|
||||||
|
address=$(echo $server | jq -r .ip)
|
||||||
|
target=root@$address
|
||||||
|
|
||||||
|
RSYNC_RSH='sshpass -e ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'
|
||||||
|
SSHPASS=$(echo $server | jq -r .rootpass)
|
||||||
|
export RSYNC_RSH SSHPASS
|
||||||
|
|
||||||
|
pushgit . $prefix/etc/nixos/
|
||||||
|
pushgit hosts $prefix/etc/nixos/hosts/
|
||||||
|
pushgit tmp/nixpkgs/$hostname $prefix/etc/nixos/nixpkgs/
|
||||||
|
pushdir secrets/$hostname/nix $prefix/etc/nixos/secrets/
|
||||||
|
pushdir secrets/$hostname/rsync $prefix/
|
||||||
|
echo "_:{imports=[./modules/$hostname];}" \
|
||||||
|
| $RSYNC_RSH "$target" tee "$prefix/etc/nixos/configuration.nix" \
|
||||||
|
> /dev/null
|
||||||
|
|
||||||
|
## TODO chmod and chown secrets
|
||||||
|
)}
|
||||||
|
|
||||||
|
__cac_cli__setlabel() {(
|
||||||
|
server=$(__cac_cli__getserver "$1")
|
||||||
|
label=$2
|
||||||
|
|
||||||
|
sid=$(echo $server | jq -r .sid)
|
||||||
|
|
||||||
|
reply=$(_cac_post_api_v1 renameserver sid="$sid" name="$label")
|
||||||
|
|
||||||
|
case $(echo $reply | jq -r .status) in
|
||||||
|
ok)
|
||||||
|
echo $reply | jq -r . >&2
|
||||||
|
__cac_cli__update
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo bad reply: >&2
|
||||||
|
echo $reply | jq -r . >&2
|
||||||
|
exit 23
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
)}
|
||||||
|
|
||||||
|
__cac_cli__setmode() {(
|
||||||
|
server=$(__cac_cli__getserver "$1")
|
||||||
|
mode=$2
|
||||||
|
|
||||||
|
sid=$(echo $server | jq -r .sid)
|
||||||
|
|
||||||
|
reply=$(_cac_post_api_v1 runmode sid="$sid" mode="$mode")
|
||||||
|
|
||||||
|
case $(echo $reply | jq -r .status) in
|
||||||
|
ok)
|
||||||
|
echo $reply | jq -r . >&2
|
||||||
|
__cac_cli__update
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo bad reply: >&2
|
||||||
|
echo $reply | jq -r .
|
||||||
|
exit 23
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
)}
|
||||||
|
|
||||||
|
__cac_cli__ssh() {(
|
||||||
|
server=$(__cac_cli__getserver "$1")
|
||||||
|
shift
|
||||||
|
|
||||||
|
address=$(echo $server | jq -r .ip)
|
||||||
|
target=root@$address
|
||||||
|
|
||||||
|
SSHPASS=$(echo $server | jq -r .rootpass)
|
||||||
|
export SSHPASS
|
||||||
|
|
||||||
|
exec sshpass -e ssh \
|
||||||
|
-S none \
|
||||||
|
-o StrictHostKeyChecking=no \
|
||||||
|
-o UserKnownHostsFile=/dev/null \
|
||||||
|
$target \
|
||||||
|
"$@"
|
||||||
|
)}
|
||||||
|
|
||||||
|
|
||||||
|
# usage: ./cac waitstatus mode:Safe 'Powered On'
|
||||||
|
# blocks until server has specfied state
|
||||||
|
__cac_cli__waitstatus() {
|
||||||
|
server=$(__cac_cli__getserver "$1")
|
||||||
|
status=$(echo $server | jq -r .status)
|
||||||
|
|
||||||
|
case $status in
|
||||||
|
$2)
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "$(date -Is) Waiting for status: $2; current status: $status ..." >&2
|
||||||
|
|
||||||
|
__cac_cli__waitforcacheupdate __cac_cli__waitstatus "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# XXX for __cac_cli__waitforcacheupdate and __cac_cli__poll cache means $cac_listservers_cache
|
||||||
|
|
||||||
|
# blocks until cache has been updated then executes "$@"
|
||||||
|
__cac_cli__waitforcacheupdate() {
|
||||||
|
case $(inotifywait --format %f -q -e moved_to $(dirname $cac_listservers_cache)) in
|
||||||
|
$(basename $cac_listservers_cache)) "$@";;
|
||||||
|
*) __cac_cli__waitforcacheupdate "$@";;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# usage: with cac ./cac poll 60s
|
||||||
|
# continuously update cache, sleeping at least $1 between updates
|
||||||
|
__cac_cli__poll() {
|
||||||
|
__cac_cli__update
|
||||||
|
t=${1-1m}
|
||||||
|
echo "$(date -Is) cache updated; sleeping $t ..." >&2
|
||||||
|
sleep "$t"
|
||||||
|
__cac_cli__poll "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_cac_listservers() {(
|
||||||
|
servers=$(_cac_get_api_v1 listservers)
|
||||||
|
status=$(echo $servers | jq -r .status)
|
||||||
|
|
||||||
|
if [ "$status" = ok ]; then
|
||||||
|
echo "$servers" | jq -r .data
|
||||||
|
else
|
||||||
|
echo "cac_listservers: bad listservers status: $status" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
)}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# rsyncfiles : lines filename |> local-dir x remote-dir -> ? |> ?
|
||||||
|
rsyncfiles() {(
|
||||||
|
set -x
|
||||||
|
rsync \
|
||||||
|
--rsync-path="mkdir -p \"$2\" && rsync" \
|
||||||
|
-vzrlptD \
|
||||||
|
--files-from=- \
|
||||||
|
"$1"/ \
|
||||||
|
"$target:$2"
|
||||||
|
)}
|
||||||
|
|
||||||
|
|
||||||
|
# gitfiles : git-work-tree -> lines filename
|
||||||
|
gitfiles() {
|
||||||
|
git -C "$1" archive --format=tar HEAD | tar t | sed '/\/$/d'
|
||||||
|
}
|
||||||
|
|
||||||
|
# pushgit : git-work-tree x remote-dir -> ?
|
||||||
|
pushgit() {
|
||||||
|
gitfiles "$1" | rsyncfiles "$1" "$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
# dirfiles : local-dir -> lines filename
|
||||||
|
dirfiles() {(
|
||||||
|
cd "$1"
|
||||||
|
find . -type f | sed 's/^\.\///'
|
||||||
|
)}
|
||||||
|
|
||||||
|
# pushgit : local-dir x remote-dir -> ?
|
||||||
|
pushdir() {
|
||||||
|
dirfiles "$1" | rsyncfiles "$1" "$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_cac_get_api_v1() {
|
||||||
|
_cac_curl_api_v1 -G "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
_cac_post_api_v1() {
|
||||||
|
_cac_curl_api_v1 -XPOST "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
_cac_curl_api_v1() {
|
||||||
|
_cac_exec curl -sS "$1" "https://panel.cloudatcost.com/api/v1/$2.php" $(
|
||||||
|
shift 2
|
||||||
|
set -- "$@" login="$cac_login" key="$cac_key"
|
||||||
|
for arg; do
|
||||||
|
echo -d $(printf '%s' "$arg" | urlencode)
|
||||||
|
done
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
_cac_exec() {
|
||||||
|
if test -z "${cac_via-}"; then
|
||||||
|
env -- "$@"
|
||||||
|
else
|
||||||
|
ssh -q "$cac_via" -t "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
case ${run-true} in
|
||||||
|
true) cac "$@";;
|
||||||
|
esac
|
15
infest
15
infest
@ -1,15 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
#
|
|
||||||
# usage: ./infest cac-servername hostname
|
|
||||||
#
|
|
||||||
set -euf
|
|
||||||
|
|
||||||
PATH="$PWD/bin${PATH+:$PATH}"
|
|
||||||
export PATH
|
|
||||||
|
|
||||||
nix_url=https://nixos.org/releases/nix/nix-1.8/nix-1.8-x86_64-linux.tar.bz2
|
|
||||||
nix_sha256=52fab207b4ce4d098a12d85357d0353e972c492bab0aa9e08e1600363e76fefb
|
|
||||||
nix_find_sha1sum=86f8775bd4f0841edd4c816df861cebf509d58c3
|
|
||||||
export nix_url nix_sha256 nix_find_sha1sum
|
|
||||||
|
|
||||||
exec infest-cac "$@"
|
|
33
infest-cac-CentOS-7-64bit.sh
Executable file
33
infest-cac-CentOS-7-64bit.sh
Executable file
@ -0,0 +1,33 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
set -xeuf
|
||||||
|
|
||||||
|
serverspec=$1
|
||||||
|
systemname=$2
|
||||||
|
|
||||||
|
./cac poll 10s 2>/dev/null &
|
||||||
|
pollpid=$!
|
||||||
|
trap "kill $pollpid; trap - EXIT" EXIT
|
||||||
|
|
||||||
|
./cac waitstatus $serverspec 'Powered On'
|
||||||
|
|
||||||
|
# TODO don't set label/mode if they're already good
|
||||||
|
./cac setlabel $serverspec $systemname
|
||||||
|
./cac setmode $systemname normal
|
||||||
|
./cac generatenetworking $systemname > modules/$systemname/networking.nix
|
||||||
|
|
||||||
|
cat infest.d/cac-CentOS-7-64bit/prepare.sh | ./cac ssh $systemname \
|
||||||
|
nix_url=https://nixos.org/releases/nix/nix-1.9/nix-1.9-x86_64-linux.tar.bz2 \
|
||||||
|
nix_sha256=5c76611c631e79aef5faf3db2d253237998bbee0f61fa093f925fa32203ae32b \
|
||||||
|
/bin/sh
|
||||||
|
|
||||||
|
./cac pushconfig $systemname /mnt
|
||||||
|
|
||||||
|
# This needs to be run twice because (at least):
|
||||||
|
# Initialized empty Git repository in /var/lib/git/$reponame
|
||||||
|
# chown: invalid user: 'git:nogroup'
|
||||||
|
cat infest.d/nixos-install.sh | ./cac ssh $systemname || :
|
||||||
|
cat infest.d/nixos-install.sh | ./cac ssh $systemname
|
||||||
|
|
||||||
|
cat infest.d/cac-CentOS-7-64bit/finalize.sh | ./cac ssh $systemname
|
||||||
|
|
||||||
|
./cac powerop $systemname reset
|
66
infest.d/cac-CentOS-7-64bit/finalize.sh
Normal file
66
infest.d/cac-CentOS-7-64bit/finalize.sh
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
set -eu
|
||||||
|
{
|
||||||
|
umount /mnt2
|
||||||
|
umount /mnt/nix
|
||||||
|
umount /mnt/boot
|
||||||
|
umount /mnt
|
||||||
|
umount /boot
|
||||||
|
|
||||||
|
PATH=$(for i in /nix/store/*coreutils*/bin; do :; done; echo $i)
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
mkdir /oldshit
|
||||||
|
|
||||||
|
mv /bin /oldshit/
|
||||||
|
mv /newshit/bin /
|
||||||
|
|
||||||
|
# TODO ensure /boot is empty
|
||||||
|
rmdir /newshit/boot
|
||||||
|
|
||||||
|
# skip /dev
|
||||||
|
rmdir /newshit/dev
|
||||||
|
|
||||||
|
mv /etc /oldshit/
|
||||||
|
mv /newshit/etc /
|
||||||
|
|
||||||
|
# TODO ensure /home is empty
|
||||||
|
rmdir /newshit/home
|
||||||
|
|
||||||
|
# skip /nix (it's already there)
|
||||||
|
rmdir /newshit/nix
|
||||||
|
|
||||||
|
# skip /proc
|
||||||
|
rmdir /newshit/proc
|
||||||
|
|
||||||
|
# skip /run
|
||||||
|
rmdir /newshit/run
|
||||||
|
|
||||||
|
# skip /sys
|
||||||
|
rmdir /newshit/sys
|
||||||
|
|
||||||
|
# skip /tmp
|
||||||
|
# TODO rmdir /newshit/tmp
|
||||||
|
|
||||||
|
mv /usr /oldshit/
|
||||||
|
mv /newshit/usr /
|
||||||
|
|
||||||
|
mv /var /oldshit/
|
||||||
|
mv /newshit/var /
|
||||||
|
|
||||||
|
mv /root /oldshit/
|
||||||
|
mv /newshit/root /
|
||||||
|
|
||||||
|
mv /lib /oldshit/
|
||||||
|
mv /lib64 /oldshit/
|
||||||
|
mv /sbin /oldshit/
|
||||||
|
mv /mnt2 /oldshit/
|
||||||
|
mv /srv /oldshit/
|
||||||
|
mv /opt /oldshit/
|
||||||
|
|
||||||
|
|
||||||
|
mv /newshit /root/ # TODO this one shoult be empty
|
||||||
|
mv /oldshit /root/
|
||||||
|
|
||||||
|
sync
|
||||||
|
}
|
104
infest.d/cac-CentOS-7-64bit/prepare.sh
Normal file
104
infest.d/cac-CentOS-7-64bit/prepare.sh
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
set -euf
|
||||||
|
|
||||||
|
: $nix_url
|
||||||
|
: $nix_sha256
|
||||||
|
|
||||||
|
{
|
||||||
|
#
|
||||||
|
# prepare host
|
||||||
|
#
|
||||||
|
|
||||||
|
type bzip2 2>/dev/null || yum install -y bzip2
|
||||||
|
type rsync 2>/dev/null || yum install -y rsync
|
||||||
|
|
||||||
|
if ! getent group nixbld >/dev/null; then
|
||||||
|
groupadd -g 30000 -r nixbld
|
||||||
|
fi
|
||||||
|
for i in `seq 1 10`; do
|
||||||
|
if ! getent passwd nixbld$i 2>/dev/null; then
|
||||||
|
useradd \
|
||||||
|
-c "CentOS Nix build user $i" \
|
||||||
|
-d /var/empty \
|
||||||
|
-g 30000 \
|
||||||
|
-G 30000 \
|
||||||
|
-l \
|
||||||
|
-M \
|
||||||
|
-s /sbin/nologin \
|
||||||
|
-u $(expr 30000 + $i) \
|
||||||
|
nixbld$i
|
||||||
|
rm -f /var/spool/mail/nixbld$i
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# generate fake sudo because
|
||||||
|
# sudo: sorry, you must have a tty to run sudo
|
||||||
|
mkdir -p bin
|
||||||
|
printf '#! /bin/sh\nexec env "$@"\n' > bin/sudo
|
||||||
|
chmod +x bin/sudo
|
||||||
|
|
||||||
|
PATH=$PWD/bin:$PATH
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
# install nix on host (cf. https://nixos.org/nix/install)
|
||||||
|
if ! test -e /root/.nix-profile/etc/profile.d/nix.sh; then
|
||||||
|
(
|
||||||
|
verify() {
|
||||||
|
echo $nix_sha256 $(basename $nix_url) | sha256sum -c
|
||||||
|
}
|
||||||
|
if ! verify; then
|
||||||
|
curl -C - -O "$nix_url"
|
||||||
|
verify
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
tar jxf $(basename $nix_url)
|
||||||
|
$(basename $nix_url .tar.bz2)/install
|
||||||
|
fi
|
||||||
|
|
||||||
|
MANPATH=/var/empty . /root/.nix-profile/etc/profile.d/nix.sh
|
||||||
|
|
||||||
|
if ! type nixos-install 2>/dev/null; then
|
||||||
|
nixpkgs_expr='import <nixpkgs> { system = builtins.currentSystem; }'
|
||||||
|
nixpkgs_path=$(find /nix/store -mindepth 1 -maxdepth 1 -name *-nixpkgs-* -type d)
|
||||||
|
nix-env \
|
||||||
|
--arg config "{ nix.package = ($nixpkgs_expr).nix; }" \
|
||||||
|
--arg pkgs "$nixpkgs_expr" \
|
||||||
|
--arg modulesPath 'throw "no modulesPath"' \
|
||||||
|
-f $nixpkgs_path/nixpkgs/nixos/modules/installer/tools/tools.nix \
|
||||||
|
-iA config.system.build.nixos-install
|
||||||
|
fi
|
||||||
|
|
||||||
|
#
|
||||||
|
# mount install directory
|
||||||
|
#
|
||||||
|
|
||||||
|
if ! mount | grep -Fq '/dev/mapper/centos-root on /mnt type xfs'; then
|
||||||
|
mkdir -p /newshit
|
||||||
|
mount --bind /newshit /mnt
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! mount | grep -Fq '/dev/sda1 on /mnt/boot type xfs'; then
|
||||||
|
mkdir -p /mnt/boot
|
||||||
|
mount /dev/sda1 /mnt/boot
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! mount | grep -Fq '/dev/mapper/centos-root on /mnt/nix type xfs'; then
|
||||||
|
mkdir -p /mnt/nix
|
||||||
|
mount --bind /nix /mnt/nix
|
||||||
|
fi
|
||||||
|
|
||||||
|
mount | grep 'on /mnt\>' >&2
|
||||||
|
|
||||||
|
#
|
||||||
|
# prepare install directory
|
||||||
|
#
|
||||||
|
# XXX This should be done by (?)
|
||||||
|
# remote_dir=/mnt ./cac pushconfig servername:c731445864-cloudpro-134581046 rmdir
|
||||||
|
|
||||||
|
mkdir -p /mnt/etc/nixos
|
||||||
|
mkdir -m 0555 -p /mnt/var/empty
|
||||||
|
|
||||||
|
# add eye candy
|
||||||
|
address=$(echo $SSH_CONNECTION | awk '{print$3}')
|
||||||
|
echo 'PS1='\''\[\e[1;31m\]\u@'"$address"'\[\e[m\] \[\e[1;32m\]\w\[\e[m\] '\' > .bashrc
|
||||||
|
}
|
8
infest.d/nixos-install.sh
Normal file
8
infest.d/nixos-install.sh
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# usage: cat infest-nixos-install.sh | ./cac ssh ...
|
||||||
|
set -euf
|
||||||
|
nixos-install \
|
||||||
|
-I secrets=/etc/nixos/secrets \
|
||||||
|
-I retiolum-hosts=/etc/nixos/hosts \
|
||||||
|
-I pubkeys=/etc/nixos/pubkeys \
|
||||||
|
-I nixpkgs=/etc/nixos/nixpkgs
|
Loading…
Reference in New Issue
Block a user