mirror of https://github.com/zulip/zulip.git
94 lines
2.3 KiB
Bash
Executable File
94 lines
2.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
usage() {
|
|
echo "usage: install -r RELEASE {TARBALL|DIR} [...installer opts..]" >&2
|
|
exit 1
|
|
}
|
|
|
|
args="$(getopt -o +r: --long help,release: -- "$@")"
|
|
eval "set -- $args"
|
|
while true; do
|
|
case "$1" in
|
|
--help) usage;;
|
|
-r|--release) RELEASE="$2"; shift; shift;;
|
|
--) shift; break;;
|
|
*) usage;;
|
|
esac
|
|
done
|
|
INSTALLER="$1"; shift
|
|
INSTALLER_ARGS=("$@"); set --
|
|
|
|
if [ -z "$RELEASE" ] || [ -z "$INSTALLER" ]; then
|
|
usage
|
|
fi
|
|
|
|
if [ "$EUID" -ne 0 ]; then
|
|
echo "error: this script must be run as root" >&2
|
|
exit 1
|
|
fi
|
|
|
|
set -ex
|
|
|
|
THIS_DIR="$(dirname "$(readlink -f "$0")")"
|
|
|
|
BASE_CONTAINER_NAME=zulip-install-"$RELEASE"-base
|
|
if ! lxc-info -n "$BASE_CONTAINER_NAME" >/dev/null 2>&1; then
|
|
"$THIS_DIR"/prepare-base "$RELEASE"
|
|
fi
|
|
|
|
while [ -z "$CONTAINER_NAME" ] || lxc-info -n "$CONTAINER_NAME" >/dev/null 2>&1; do
|
|
shared_dir="$(mktemp -d --tmpdir "$RELEASE"-XXXXX)"
|
|
CONTAINER_NAME=zulip-install-"$(basename "$shared_dir")"
|
|
done
|
|
|
|
message="$(cat <<EOF
|
|
|
|
Container:
|
|
sudo lxc-attach -n $CONTAINER_NAME
|
|
|
|
Unpacked tree:
|
|
sudo ls $shared_dir/mnt/zulip-server
|
|
EOF
|
|
)"
|
|
trap 'set +x; echo "$message"' EXIT
|
|
|
|
if [ -d "$INSTALLER" ]; then
|
|
installer_dir="$(readlink -f $INSTALLER)"
|
|
else
|
|
installer_dir="$(mktemp -d --tmpdir zulip-server-XXXXX)"
|
|
tar -xf "$INSTALLER" -C "$installer_dir" --transform='s,^[^/]*,zulip-server,'
|
|
fi
|
|
|
|
mkdir -p /srv/zulip/test-install/pip-cache
|
|
|
|
mkdir "$shared_dir"/upper "$shared_dir"/work "$shared_dir"/mnt
|
|
mount -t overlay overlay \
|
|
-o lowerdir="$installer_dir",upperdir="$shared_dir"/upper,workdir="$shared_dir"/work \
|
|
"$shared_dir"/mnt
|
|
|
|
lxc-copy --ephemeral --keepdata -n "$BASE_CONTAINER_NAME" -N "$CONTAINER_NAME" \
|
|
-m bind="$shared_dir"/mnt:/tmp/src/,bind=/srv/zulip/test-install/pip-cache:/root/.cache/pip
|
|
|
|
run() {
|
|
lxc-attach -n "$CONTAINER_NAME" -- "$@"
|
|
}
|
|
|
|
# Wait for the container to boot, polling.
|
|
ok=
|
|
for i in {1..60}; do
|
|
runlevel="$(run runlevel 2>/dev/null)" || { sleep 1; continue; }
|
|
if [ "$runlevel" != "${0%[0-9]}" ]; then
|
|
ok=1
|
|
break
|
|
fi
|
|
sleep 1
|
|
done
|
|
if [ -z "ok" ]; then
|
|
echo "error: timeout waiting for container to boot" >&2
|
|
exit 1
|
|
fi
|
|
|
|
run eatmydata -- /tmp/src/zulip-server/scripts/setup/install --self-signed-cert "${INSTALLER_ARGS[@]}"
|
|
|
|
# TODO settings.py, initialize-database, create realm
|