Initial release
This commit is contained in:
commit
df0deb63ad
1 changed files with 132 additions and 0 deletions
132
nspawner.sh
Normal file
132
nspawner.sh
Normal file
|
@ -0,0 +1,132 @@
|
|||
#!/usr/bin/bash
|
||||
|
||||
# TODO: Support other flavours.
|
||||
readonly IMAGE_URL='https://cloud.debian.org/images/cloud/sid/daily/latest/debian-sid-generic-amd64-daily.tar.xz'
|
||||
readonly IMAGE_SHA512SUMS='https://cloud.debian.org/images/cloud/sid/daily/latest/SHA512SUMS'
|
||||
|
||||
if [ -x /usr/bin/importctl ]; then
|
||||
readonly IMPORTCTL='importctl'
|
||||
readonly IMPORTCTL_IMPORT_RAW_ARGS='-m'
|
||||
else
|
||||
readonly IMPORTCTL='machinectl'
|
||||
fi
|
||||
|
||||
CONTAINER_NAME=
|
||||
NO_INTERNET=
|
||||
|
||||
log()
|
||||
{
|
||||
printf "I: ${@}\n"
|
||||
}
|
||||
|
||||
error()
|
||||
{
|
||||
printf "E: ${@}\n" > /dev/stderr
|
||||
exit 1
|
||||
}
|
||||
|
||||
import_image()
|
||||
{
|
||||
local name="${1}"
|
||||
local tmpdir=$(mktemp -d)
|
||||
local filename=$(basename "${IMAGE_URL}")
|
||||
local sha512sum_filename=$(basename "${IMAGE_SHA512SUMS}")
|
||||
|
||||
trap 'rm -f $tmpdir' RETURN EXIT SIGINT SIGTERM
|
||||
|
||||
log "Dowloading image '${IMAGE_URL}' into '${tmpdir}'"
|
||||
cd "${tmpdir}"
|
||||
wget "${IMAGE_URL}"
|
||||
tar xf "${tmpdir}/${filename}"
|
||||
|
||||
log "Verifying hash for '${filename}'"
|
||||
wget "${IMAGE_SHA512SUMS}"
|
||||
if ! sha512sum --ignore-missing -c "${sha512sum_filename}"; then
|
||||
error "Aborting; please check the hash!"
|
||||
fi
|
||||
|
||||
log "Importing image '${filename}' as '${name}'"
|
||||
$IMPORTCTL import-raw ${IMPORTCTL_IMPORT_RAW_ARGS} "${filename}" "${name}"
|
||||
}
|
||||
|
||||
setup_container()
|
||||
{
|
||||
local name="${1}"
|
||||
local etcpath='/etc/systemd/nspawn'
|
||||
|
||||
mkdir -p "${etcpath}"
|
||||
cat > "${etcpath}/${name}.nspawn" << _EOF_
|
||||
[Network]
|
||||
Private=yes
|
||||
VirtualEthernet=yes
|
||||
Zone=${name}
|
||||
_EOF_
|
||||
|
||||
if [ -z "${NO_INTERNET}" ]; then
|
||||
iptables -A FORWARD -i "vz-${name}" -o enp5s0 -j ACCEPT
|
||||
iptables-save
|
||||
log "Don't forget to enable port-forwarding on sysctl"
|
||||
fi
|
||||
}
|
||||
|
||||
create_container()
|
||||
{
|
||||
local name="${1}"
|
||||
|
||||
log "Starting container '${name}'"
|
||||
machinectl start "${name}"
|
||||
}
|
||||
|
||||
usage()
|
||||
{
|
||||
cat << EOF
|
||||
${0} -- Create a container using machinectl
|
||||
|
||||
Arguments:
|
||||
|
||||
-n|--name NAME: The container name. Mandatory.
|
||||
-x|--no-internet: Whether the container should not have access to
|
||||
the internet
|
||||
-h|--help: This help message
|
||||
EOF
|
||||
}
|
||||
|
||||
parse_args()
|
||||
{
|
||||
while [ -n "${1}" ]; do
|
||||
case "${1}" in
|
||||
"-n"|"--name")
|
||||
CONTAINER_NAME="${2}"
|
||||
shift 2
|
||||
;;
|
||||
"-x"|"--no-internet")
|
||||
NO_INTERNET=1
|
||||
shift
|
||||
;;
|
||||
"-h"|"--help")
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
sanitize_args()
|
||||
{
|
||||
if [ -z "${CONTAINER_NAME}" ]; then
|
||||
error "You must specify a container name (-n)"
|
||||
fi
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
parse_args "$@"
|
||||
sanitize_args
|
||||
import_image "${CONTAINER_NAME}"
|
||||
setup_container "${CONTAINER_NAME}"
|
||||
create_container "${CONTAINER_NAME}"
|
||||
|
||||
log "Container '${CONTAINER_NAME}' created"
|
||||
}
|
||||
|
||||
main "$@"
|
Loading…
Reference in a new issue