From 5ead5e97366d4a6d1b1dae9efcbf6ed3e49bd43c Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 12 Nov 2016 02:01:13 +0100 Subject: Adding initial curl container create script. Signed-off-by: Daniel Baumann --- share/scripts/curl | 187 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100755 share/scripts/curl (limited to 'share/scripts') diff --git a/share/scripts/curl b/share/scripts/curl new file mode 100755 index 0000000..0cf38e9 --- /dev/null +++ b/share/scripts/curl @@ -0,0 +1,187 @@ +#!/bin/sh + +# container-tools - Manage systemd-nspawn containers +# Copyright (C) 2014-2016 Daniel Baumann +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set -e + +SCRIPT="${0}" + +MACHINES="/var/lib/machines" +CACHE="/var/cache/container-tools/curl" + +Parameters () +{ + LONG_OPTIONS="bind:,script:,name:,image:,server:,password:" + OPTIONS="b:,s:,n:,p:" + + PARAMETERS="$(getopt --longoptions ${LONG_OPTIONS} --name=${SCRIPT} --options ${OPTIONS} --shell sh -- ${@})" + + if [ "${?}" != "0" ] + then + echo "'${SCRIPT}': getopt exit" >&2 + exit 1 + fi + + eval set -- "${PARAMETERS}" + + while true + do + case "${1}" in + -b|--bind) + # ignore + shift 2 + ;; + + --cnt.auto) + # ignore + shift 2 + ;; + + -s|--script) + # ignore + shift 2 + ;; + + -n|--name) + NAME="${2}" + shift 2 + ;; + + --image) + IMAGE="${2}" + shift 2 + ;; + + --server) + SERVER="${2}" + shift 2 + ;; + + -p|--password) + PASSWORD="${2}" + shift 2 + ;; + + --) + shift 1 + break + ;; + + *) + echo "'${SCRIPT}': getopt error" >&2 + exit 1 + ;; + esac + done +} + +Usage () +{ + echo "Usage: container create -n|--name NAME -s|--script ${SCRIPT} -- [--image IMAGE] [--server SERVER] [-p|--password PASSWORD}" >&2 + exit 1 +} + +Parameters "${@}" + +if [ -z "${NAME}" ] +then + Usage +fi + +if [ -e "${MACHINES}/${NAME}" ] +then + echo "'${NAME}': container already exists" >&2 + exit 1 +fi + +if [ ! -x /usr/bin/curl ] +then + echo "'${NAME}': /usr/bin/curl - no such file." >&2 + exit 1 +fi + +if [ "$(id -u)" -ne 0 ] +then + echo "'${NAME}': need root privileges" >&2 + exit 1 +fi + +ARCHITECTURE="${ARCHITECTURE:-$(dpkg --print-architecture)}" +IMAGE="${IMAGE:-debian-stretch-${ARCHITECTURE}.tar.xz}" +SERVER="${SERVER:-https://files.open-infrastructure.net/images/container-tools/current}" +PASSWORD="${PASSWORD:-$(dd if=/dev/urandom bs=12 count=1 2> /dev/null | base64)}" + +VERSION="$(container version)" + +# Run + +# FIXME: Show available image directories on server +# FIXME: Fetch debconf-choices.txt to show debconf select +# FIXME: gpg verification against debian-keyring or local keyring +# FIXME: default server via configuration file + +echo "Downloading ${IMAGE}" +mkdir -p "${CACHE}" + +if [ -e "${CACHE}/${IMAGE}" ] +then + CURL_OPTIONS="--time-cond ${CACHE}/${IMAGE}" +fi + +curl --http2 --location --progress-bar --user-agent container-tools/${VERSION} ${CURL_OPTIONS} \ + "${SERVER}/${IMAGE}" -o "${CACHE}/${IMAGE}" + +echo "Unpacking ${IMAGE}" +mkdir -p "${MACHINES}/${NAME}" + +case "${IMAGE}" in + *.gz) + TAR_OPTIONS="--gzip" + ;; + + *.lz) + TAR_OPTIONS="--lzip" + ;; + + *.xz) + TAR_OPTIONS="--xz" + ;; + + *) + TAR_OPTIONS="" + ;; +esac + +if [ -e /usr/bin/pv ] +then + pv --format '%p' --width 77 "${CACHE}/${IMAGE}" | tar xf - ${TAR_OPTIONS} -C "${MACHINES}/${NAME}" --strip 1 +else + tar xf "${CACHE}/${IMAGE}" ${TAR_OPTIONS} -C "${MACHINES}/${NAME}" --strip 1 +fi + +# Creating machine-id +chroot "${MACHINES}/${NAME}" systemd-machine-id-setup > /dev/null 2>&1 + +# Setting hostname +echo "${NAME}" > "${MACHINES}/${NAME}/etc/hostname" + +# Copying resolv.conf +cp -L /etc/resolv.conf "${MACHINES}/${NAME}/etc/resolv.conf" + +# Setting root password +echo root:${PASSWORD} | chroot "${MACHINES}/${NAME}" chpasswd +echo "${NAME}: root password set to '${PASSWORD}'." -- cgit v1.2.3