From 1130873aa55c9b0a7e5af48edc44bd6c6fd1f888 Mon Sep 17 00:00:00 2001 From: Jonathan Bauer Date: Wed, 13 May 2020 11:04:02 +0200 Subject: restructure repo * remove packager * move everything from builder/* back to root --- packager/.gitignore | 1 - packager/blacklists/README | 15 - packager/blacklists/essential/fontcache | 3 - packager/blacklists/essential/linux-base | 81 ---- packager/blacklists/essential/linux-extended | 5 - packager/blacklists/essential/other-files | 3 - packager/blacklists/essential/policykit | 2 - packager/blacklists/essential/temp-files | 5 - packager/blacklists/essential/tm-scripts | 1 - packager/blacklists/package-managers/apt | 2 - packager/blacklists/package-managers/rpm | 5 - packager/blacklists/package-managers/yast | 5 - packager/blacklists/package-managers/yum | 1 - packager/blacklists/package-managers/zypper | 2 - packager/openslx | 43 --- packager/openslx.config | 18 - packager/openslx.functions | 543 --------------------------- 17 files changed, 735 deletions(-) delete mode 100644 packager/.gitignore delete mode 100644 packager/blacklists/README delete mode 100644 packager/blacklists/essential/fontcache delete mode 100644 packager/blacklists/essential/linux-base delete mode 100644 packager/blacklists/essential/linux-extended delete mode 100644 packager/blacklists/essential/other-files delete mode 100644 packager/blacklists/essential/policykit delete mode 100644 packager/blacklists/essential/temp-files delete mode 100644 packager/blacklists/essential/tm-scripts delete mode 100644 packager/blacklists/package-managers/apt delete mode 100644 packager/blacklists/package-managers/rpm delete mode 100644 packager/blacklists/package-managers/yast delete mode 100644 packager/blacklists/package-managers/yum delete mode 100644 packager/blacklists/package-managers/zypper delete mode 100755 packager/openslx delete mode 100644 packager/openslx.config delete mode 100644 packager/openslx.functions (limited to 'packager') diff --git a/packager/.gitignore b/packager/.gitignore deleted file mode 100644 index f4ed9bc4..00000000 --- a/packager/.gitignore +++ /dev/null @@ -1 +0,0 @@ -clones diff --git a/packager/blacklists/README b/packager/blacklists/README deleted file mode 100644 index ed3fe459..00000000 --- a/packager/blacklists/README +++ /dev/null @@ -1,15 +0,0 @@ -This directory contains blacklists of files and directories that -should be excluded when cloning stage4 of a remote system. The -blacklists are split into groups, represented by sub-directories. -They contain one or more text files representing blacklists in rsync -"--exclude-from" format. - -There is a group called "essential", containg blacklists for essential -files and dirs that you always want to exclude from being cloned. -Other directories are create for specific software packages, like -gnome, or kde. - -For inclusion of desktop environments like Gnome or KDE a substructure -(subdirectory) called desktop-sessions was introduced. The files / -directories in there should describe only includes ("+ ....") to provide -files needed for a desktop environment. diff --git a/packager/blacklists/essential/fontcache b/packager/blacklists/essential/fontcache deleted file mode 100644 index 13d60d44..00000000 --- a/packager/blacklists/essential/fontcache +++ /dev/null @@ -1,3 +0,0 @@ -+ /var/cache/fontconfig -+ /var/cache/fontconfig/* - diff --git a/packager/blacklists/essential/linux-base b/packager/blacklists/essential/linux-base deleted file mode 100644 index 2c3ec439..00000000 --- a/packager/blacklists/essential/linux-base +++ /dev/null @@ -1,81 +0,0 @@ -- /cdrom/* -- /dev/* -- /adm/* -- /afs/* -- /bfg/* -- /clustersw/* -- /cvmfs/* -- /gridsw/* -- /storage/* - -# This is where the bind-mount of mltk resides... -- /export/* -- /etc/*ppp* -- /etc/*pptp* -- /etc/dhcp* -- /etc/exports* -- /etc/fstab -#- /etc/group -- /etc/group- -- /etc/gshadow -- /etc/gshadow- -- /etc/hostname -- /etc/hosts -#- /etc/inputrc -- /etc/issue.net -# Always include ldconfig/cache of full system: -+ /etc/ld.so.** -#- /etc/localtime -#- /etc/login.defs -#- /etc/mtab -#- /etc/mtab.* -+ /etc/sysconfig/network-scripts/ifcfg-lo -- /etc/sysconfig/network-scripts/ifcfg-* -- /etc/networks -#- /etc/passwd -- /etc/passwd- -#- /etc/resolv.conf -#- /etc/resolvconf/ -#- /etc/shadow -- /etc/shadow- -#- /lib/modules/ -- /lost+found/ -- /media/* -- /mnt/* -- /opt/openslx -- /proc/* -- /run/* -#- /srv/ -- /sys/* -- /tmp/* -#- /usr/src/ -+ /var/backup/**/ -- /var/backup/** -+ /var/cache/**/ -- /var/cache/** -+ /var/crash/**/ -- /var/crash/** -+ /var/empty/**/ -- /var/empty/** -+ /var/lock/**/ -- /var/lock/** -+ /var/log/**/ -- /var/log/** -+ /var/mail/**/ -- /var/mail/** -#+ /var/spool/**/ -#- /var/spool/** -+ /var/spool/torque/* -- /var/tmp/* -+ /var/tmp/*guestfs* -- /var/lib/nova/instances/* -- /var/lib/libvirt - - - -## Interfering binaries/links -#- /sbin/shutdown -#- /sbin/reboot -#- /sbin/poweroff -#- /sbin/halt -##- /bin/sh diff --git a/packager/blacklists/essential/linux-extended b/packager/blacklists/essential/linux-extended deleted file mode 100644 index 90dcdca7..00000000 --- a/packager/blacklists/essential/linux-extended +++ /dev/null @@ -1,5 +0,0 @@ -- /home/* -- /root/* -#+ /root/.bash* -#+ /root/.ssh -- /etc/cups diff --git a/packager/blacklists/essential/other-files b/packager/blacklists/essential/other-files deleted file mode 100644 index d35a5736..00000000 --- a/packager/blacklists/essential/other-files +++ /dev/null @@ -1,3 +0,0 @@ -- .svn -- .git -- *.gvfs diff --git a/packager/blacklists/essential/policykit b/packager/blacklists/essential/policykit deleted file mode 100644 index 2f42c0e0..00000000 --- a/packager/blacklists/essential/policykit +++ /dev/null @@ -1,2 +0,0 @@ -#- /usr/share/pol*/actions/org.freedesktop.upower.* - diff --git a/packager/blacklists/essential/temp-files b/packager/blacklists/essential/temp-files deleted file mode 100644 index 50955d08..00000000 --- a/packager/blacklists/essential/temp-files +++ /dev/null @@ -1,5 +0,0 @@ -- *~ -- *.bak -- *.old -- *.pid -- *.tmp diff --git a/packager/blacklists/essential/tm-scripts b/packager/blacklists/essential/tm-scripts deleted file mode 100644 index 393effea..00000000 --- a/packager/blacklists/essential/tm-scripts +++ /dev/null @@ -1 +0,0 @@ -- **/tm-scripts diff --git a/packager/blacklists/package-managers/apt b/packager/blacklists/package-managers/apt deleted file mode 100644 index 5e019138..00000000 --- a/packager/blacklists/package-managers/apt +++ /dev/null @@ -1,2 +0,0 @@ -+ /var/cache/apt/archives/partial/** - diff --git a/packager/blacklists/package-managers/rpm b/packager/blacklists/package-managers/rpm deleted file mode 100644 index 0527ee75..00000000 --- a/packager/blacklists/package-managers/rpm +++ /dev/null @@ -1,5 +0,0 @@ -- *.rpmnew -- *.rpmsave -- /etc/*rpmnew -- /etc/*rpmorig -- /etc/*rpmsave diff --git a/packager/blacklists/package-managers/yast b/packager/blacklists/package-managers/yast deleted file mode 100644 index 9de1ec05..00000000 --- a/packager/blacklists/package-managers/yast +++ /dev/null @@ -1,5 +0,0 @@ -- /var/lib/YaST2/you/mnt/* -- /var/lib/YaST2/backup_boot_sectors -- /etc/*YaST2save -- *.YaST2save - diff --git a/packager/blacklists/package-managers/yum b/packager/blacklists/package-managers/yum deleted file mode 100644 index 8b137891..00000000 --- a/packager/blacklists/package-managers/yum +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packager/blacklists/package-managers/zypper b/packager/blacklists/package-managers/zypper deleted file mode 100644 index fbab85d7..00000000 --- a/packager/blacklists/package-managers/zypper +++ /dev/null @@ -1,2 +0,0 @@ -- /var/lib/zypp - diff --git a/packager/openslx b/packager/openslx deleted file mode 100755 index 6845f9ba..00000000 --- a/packager/openslx +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# ------------------------------------------------------------------------------ -# -# OpenSLX Toolkit Next Gen -# -# ------------------------------------------------------------------------------ -# -# The next generation toolkit to build a stateless linux system bootable -# over the network. Composed of dracut-built initramfs and a full system clone. -# -# ------------------------------------------------------------------------------ -# -# Main Code -# -# ------------------------------------------------------------------------------ - -declare -rg ARG0="$0" -declare -rg SELF="$(readlink -f "${ARG0}")" -declare -rg ROOT_DIR="$(dirname "${SELF}")" -declare -rg SELF_PID="$$" - -# let's keep it simple for now, just source our config/functions file -. "${ROOT_DIR}/${ARG0}".functions || perror "Could not source functions." -. "${ROOT_DIR}/${ARG0}".config || perror "Could not source config." - -# root check -if [ "$(id -u)" -ne 0 ]; then - banner - perror "ERROR: You need to be root to use this toolkit." -else - banner -fi - -# setup trap -trap do_cleanup SIGINT SIGTERM SIGUSR1 EXIT - -# read params -read_params $@ - -# react to given action -process_action - -exit 0 diff --git a/packager/openslx.config b/packager/openslx.config deleted file mode 100644 index 985ace1a..00000000 --- a/packager/openslx.config +++ /dev/null @@ -1,18 +0,0 @@ -# default options for rsync -DEFAULT_RSYNC_OPTS="--acls \ - --hard-links \ - --xattrs \ - --archive \ - --delete \ - --delete-excluded \ - --numeric-ids \ - --verbose" - -# default options used by rsync -DEFAULT_RSYNC_RSH="ssh -c aes256-ctr -o StrictHostKeyChecking=no" - -# default size for the qcow2-container -DEFAULT_CONTAINER_SIZE="20G" - -# default filesystem type for the qcow2-container -DEFAULT_CONTAINER_FILESYSTEM="xfs" diff --git a/packager/openslx.functions b/packager/openslx.functions deleted file mode 100644 index fb32a231..00000000 --- a/packager/openslx.functions +++ /dev/null @@ -1,543 +0,0 @@ -# ------------------------------------------------------------------------------ -# -# Functions for OpenSLX-NG -# -# ------------------------------------------------------------------------------ -# -# check if we have our environment variables to check -# if we actually got sourced by the main script -if [ -z "${SELF_PID}" -o -z "${ROOT_DIR}" ]; then - # not using perror, since we probably don't have it. - echo "Neither SELF_PID nor ROOT_DIR is set. Was this included by OpenSLX-NG?" - exit 1 -fi - -# ------------------------------------------------------------------------------ -# -# General helper functions -# -# ------------------------------------------------------------------------------ -banner () { - echo -e "\033[38;5;196m\t"' .__ ' - echo -e "\033[38;5;196m\t"' ____ ______ ____ ____ _____| | ___ ___ ' - echo -e "\033[38;5;202m\t"' / _ \\\\____ \\_/ __ \\ / \\ / ___/ | \\ \\/ / ' - echo -e "\033[38;5;208m\t"'( <_> ) |_> > ___/| | \\\\___ \\| |__> < ' - echo -e "\033[38;5;214m\t"' \\____/| __/ \\___ >___| /____ >____/__/\\_ \\ ' - echo -e "\033[38;5;220m\t"' |__| \\/ \\/ \\/ \\/ ' - echo -e "\033[38;5;220m\t" - echo -e "\033[38;5;226m\t ** OpenSLX Project // 2015 **" - echo -e "\033[38;5;232m\t http://lab.openslx.org/" - echo -e "\033[00m" -} - -pinfo() { - echo -e "\033[38;5;10m[info]\033[0m $@" -} - -pwarning() { - echo -e "\033[38;5;11m[warning]\033[0m $@" -} - -perror() { - echo -e "\033[38;5;9m[error]\033[0m $@" - kill "$SELF_PID" - exit 1 -} - -# accepts one argument to be printed as a warning before dumping the help -print_usage() { - [ -n "$1" ] && pwarning "$1" - pinfo "USAGE:" - pinfo "$ARG0 " - pinfo "\t\tActions: '--clone', '--package', '--export', 'update'" - pinfo "" - pinfo "CLONING: rsync remote host to local directory" - pinfo "$ARG0 --clone --host [--syncdir ]" - pinfo "\t\tIf not specified, --syncdir = './clones//stage4'" - pinfo "" - pinfo "PACKAGING: pack local rsync directory as qcow2-container" - pinfo "$ARG0 --package --host [--container ] [--syncdir ]" - pinfo "\t\tIf is not specified, --container = './clones//stage4.qcow2'" - pinfo "\t\tIf is not specified, --syncdir = './clones//stage4'" - pinfo "" - pinfo "EXPORTING: rsync remote host to a new qcow2-container" - pinfo "$ARG0 --export --host [--container ] [--syncdir ]" - pinfo "\t\tIf is not specified, --container = './clones//stage4.qcow2'" - pinfo "" - pinfo "UPDATING: rsync remote host to an existing qcow2-container" - pinfo "$ARG0 --update --host [--container ]" - pinfo "\t\tIf is not specified, --container = './clones//stage4.qcow2'" - kill "$SELF_PID" - exit 1 -} - -# helper to parse the command line arguments and fill the environment -# with the parameters given. Since the fallbacks for those variables -# are only dependent on the selected action, we will also post-process -# them to make sure they are set when leaving this function! -read_params() { - # initialize global variables - declare -g FORCE=0 - unset ACTION REMOTE_HOST CONTAINER_PATH RSYNC_TARGET - - # handle rest of arguments - while [ "$#" -gt "0" ]; do - local PARAM="$1" - shift - - # options to current target - if [[ "$PARAM" == --* ]]; then - case "$PARAM" in - --clone) - declare -rg ACTION="CLONE" - ;; - --package) - declare -rg ACTION="PACKAGE" - ;; - --export) - declare -rg ACTION="EXPORT" - ;; - --update) - declare -rg ACTION="UPDATE" - ;; - --host) - if [ -z "$1" ]; then - print_usage "'--host' requires a host as parameter." - else - if [[ "$1" == --* ]]; then - local _msg="A host should not start with '--'." - _msg="$_msg Parameter for '--host' missing?" - perror $_msg - fi - declare -rg REMOTE_HOST="$1" - shift - fi - continue - ;; - --container) - if [ -z "$1" ]; then - print_usage "'--container' requires a path as parameter." - else - if [[ "$1" == --* ]]; then - local _msg="A path should not start with '--'." - _msg="$_msg Parameter for '--container' missing?" - perror $_msg - fi - declare -rg CONTAINER_PATH="$1" - shift - fi - continue - ;; - --syncdir) - if [ -z "$1" ]; then - print_usage "'--syncdir' requires a path as parameter." - else - if [[ "$1" == --* ]]; then - local _msg="A path should not start with '--'." - _msg="$_msg Parameter for '--syncdir' missing?" - perror $_msg - fi - declare -rg RSYNC_TARGET="$1" - shift - fi - continue - ;; - --force) - declare -rg FORCE=1 - ;; - *) - print_usage "Unknown flag: $PARAM" - ;; - esac - continue - fi - done - # done parsing the arguments, exit if no action given - [ -z "$ACTION" ] && \ - print_usage "No action given" - - # now check for existance of variables - # and use fallbacks when possible if they were not specified - - # REMOTE_HOST valid? always needed! - [ -z "$REMOTE_HOST" ] && \ - perror "REMOTE_HOST not set. Use '--host'." - check_host "$REMOTE_HOST" || \ - perror "'$REMOTE_HOST' is neither an IP nor a known hostname." - # REMOTE_HOST valid - set build directory for the rest of the operations - declare -rg BUILD_DIR="${ROOT_DIR}/clones/${REMOTE_HOST}" - mkdir -p "${BUILD_DIR}" || perror "Could not create '${BUILD_DIR}'." - - # RSYNC_TARGET needs special care - if [ -z "$RSYNC_TARGET" ]; then - # none given - use fallbacks - if [ "x$ACTION" == "xCLONE" ]; then - # use default path when cloning, no need for CONTAINER_MNT - pwarning "RSYNC_TARGET not set, using: '${BUILD_DIR}/stage4/'." - declare -rg RSYNC_TARGET="${BUILD_DIR}/stage4" - else - # we always want CONTAINER_MNT here - declare -rg CONTAINER_MNT="$(mktemp -d)" - [ -z "${CONTAINER_MNT}" ] && \ - perror "Could not create temporary directory for mounting the container." - add_cleanup rmdir "${CONTAINER_MNT}" - # RSYNC_TARGET depends on the action at this point - if [ "x$ACTION" == "xPACKAGE" ]; then - # use default path when packaging - declare -rg RSYNC_TARGET="${BUILD_DIR}/stage4" - elif [ "x$ACTION" == "xUPDATE" -o "x$ACTION" == "xEXPORT" ]; then - # for action update/export, we want to sync to the mounted container - # so create a temporary directory for the mount point that we'll use later - declare -rg RSYNC_TARGET="${CONTAINER_MNT}" - fi - fi - fi - - # CONTAINER_PATH valid? - if [ -z "$CONTAINER_PATH" ]; then - # use default path: ${BUILD_DIR}/stage4.qcow2 - pwarning "CONTAINER_PATH not set. Using '${BUILD_DIR}/stage4.qcow2'." - declare -rg CONTAINER_PATH="${BUILD_DIR}/stage4.qcow2" - fi - # so from now on REMOTE_HOST, RSYNC_TARGET, CONTAINER_PATH are set (and read-only). -} -process_action() { - if [ "x$ACTION" == "xCLONE" ]; then - clone_host || perror "Cloning stage4 failed with: $?" - elif [ "x$ACTION" == "xPACKAGE" ]; then - pack_clone || perror "Packing as QCoW2 failed with: $?" - elif [ "x$ACTION" == "xEXPORT" ]; then - export_host || perror "Exporting failed with: $?" - elif [ "x$ACTION" == "xUPDATE" ]; then - update_container || perror "Updating failed with: $?" - else - print_usage "No action given." - fi - return 0 -} - -# wrapper to package a cloned stage4 as a qcow2 container -# - creates empty container at CONTAINER_PATH -# - mounts it to RSYNC_TARGET -# - copy RSYNC_TARGET -pack_clone() { - create_container - mount_container - copy_to_container -} -# wrapper to update an existing container -# - mounts it to RSYNC_TARGET -# - clone host there -update_container() { - mount_container - clone_host -} -# wrapper to export a host directly to a container -# - create en empty qcow2 container at CONTAINER_PATH -# - mount it to RSYNC_TARGET -# - clone host there -export_host() { - create_container - mount_container - clone_host -} -# ------------------------------------------------------------------------------ -# -# Stage4 related functions -# -# ------------------------------------------------------------------------------ -# -# Helper to generate a stage4 export for a remote machine per rsync. -# Usage: -# clone_host -# -# Note: this functions requires REMOTE_HOST and RSYNC_TARGET to be set. -clone_host() { - # check if RSYNC_TARGET is valid - if [ -d "${RSYNC_TARGET}" ]; then - # does it have the '.stage4' flag? skip this check when exporting directly - [ "x$ACTION" != "xEXPORT" ] && [ ! -e "${RSYNC_TARGET}/.stage4" ] && \ - perror "'${RSYNC_TARGET}' exists, but no '.stage4' flag found. Refusing to rsync there." - #touch $RSYNC_TARGET/.stage4 && exit 0 - else - # not a directory, create it and set the .stage4 flag - mkdir -p "${RSYNC_TARGET}" || perror "Could not create '${RSYNC_TARGET}'." - fi - - local EXCLUDE="$BUILD_DIR/exclude-stage4" - local INCLUDE="$BUILD_DIR/include-stage4" - - pinfo "Building rsync include/exclude files for building stage4...." - echo "## Exclude file for stage4 of $REMOTE_HOST" > "$EXCLUDE" - echo "## Include file for stage4 of $REMOTE_HOST" > "$INCLUDE" - for FILE in $(find "${ROOT_DIR}"/blacklists/*/ -type f); do - echo "## From $FILE" >> "$EXCLUDE" - echo "## From $FILE" >> "$INCLUDE" - grep '^-' "$FILE" >> "$EXCLUDE" - grep '^+' "$FILE" >> "$INCLUDE" - done - - # prepare rsync's general options - local RSYNC_OPTS="${DEFAULT_RSYNC_OPTS}" - [ -z "${RSYNC_OPTS}" ] && \ - RSYNC_OPTS=" - --acls \ - --hard-links \ - --xattrs \ - --archive \ - --delete \ - --delete-excluded \ - --numeric-ids - " - # prepare rsync's remote shell options - local RSYNC_RSH="$DEFAULT_RSYNC_RSH" - [ -z "${RSYNC_RSH}" ] && RSYNC_RSH="ssh -c blowfish -oStrictHostKeyChecking=no" - local RSYNC_SOURCE="root@$REMOTE_HOST:/" - - # if something goes wrong during rsync, we need to recreate the .stage4 flag - add_cleanup touch ${RSYNC_TARGET}/.stage4 - # run rsync with the exclude/include lists created earlier - cat "$INCLUDE" "$EXCLUDE" | \ - rsync ${RSYNC_OPTS} \ - --exclude-from=- \ - --rsh "${RSYNC_RSH}" \ - "${RSYNC_SOURCE}" \ - "${RSYNC_TARGET}" - - local -i rsync_ret=$? - if [ "x$rsync_ret" != "x0" ]; then - perror "rsync from '${RSYNC_SOURCE}' to '${RSYNC_TARGET}' failed." - fi - touch "${RSYNC_TARGET}/.stage4" - # make sure everything gets flushed - sync - pinfo "Cloning '${REMOTE_HOST}' to '${RSYNC_TARGET}' succeeded." -} - -# Helper to create the empty container at CONTAINER_PATH -create_container() { - # CONTAINER_PATH valid? - [ -d "${CONTAINER_PATH}" ] && perror "Path to container can not be a directory!" - if [ -f "${CONTAINER_PATH}" ]; then - if [ $FORCE -eq 0 ]; then - perror "Container file already exists. Use '--force' to overwrite it." - else - # force removal - rm -f "${CONTAINER_PATH}" || perror "Could not remove '${CONTAINER_PATH}'" - pinfo "Removed old '${CONTAINER_PATH}'." - fi - fi - - # which size for the qcow2 container? - local CONTAINER_SIZE="${DEFAULT_CONTAINER_SIZE}" - [ -z "${CONTAINER_SIZE}" ] && CONTAINER_SIZE="20G" - - # so far so good - pinfo "Creating qcow2-container '${CONTAINER_PATH}'" - qemu-img create -f qcow2 "${CONTAINER_PATH}" "${CONTAINER_SIZE}" || \ - perror "qemu-img create failed with: $?" - # now expose it as a loop device - expose_container - # filesystem for the qcow2 container? - local CONTAINER_FILESYSTEM="${DEFAULT_CONTAINER_FILESYSTEM}" - [ -z "${CONTAINER_FILESYSTEM}" ] && CONTAINER_FILESYSTEM="xfs" - # check if we have that mkfs helper - which "mkfs.${CONTAINER_FILESYSTEM}" || \ - perror "Could not find 'mkfs.${CONTAINER_FILESYSTEM}'. Install it and retry." - - pinfo "Creating '${CONTAINER_FILESYSTEM}' filesystem on '${CONTAINER_PATH}'..." - mkfs."${CONTAINER_FILESYSTEM}" "${LOOPED_NBD_DEV}" || perror "mkfs failed with: $?" - return 0 -} - -# Helper exposing the container as a loop device -expose_container() { - [ -z "${CONTAINER_PATH}" ] && \ - perror "Internal error - CONTAINER_PATH not set but should be! Check read_params()" - - # find usable nbd device - declare -rg NBD_DEV="$(find_free_nbd)" - [ -n "${NBD_DEV}" ] || perror "Could not find usable NBD device." - [ -b "${NBD_DEV}" ] || perror "'${NBD_DEV}' is not a block device!" - pinfo "Connecting '${CONTAINER_PATH}' to '${NBD_DEV}'" - - qemu-nbd -c "${NBD_DEV}" "${CONTAINER_PATH}" || \ - perror "qemu-nbd failed with: $?" - add_cleanup disconnect_nbd - # expose as a loop device - declare -rg LOOPED_NBD_DEV="$(losetup --find)" - losetup "${LOOPED_NBD_DEV}" "${NBD_DEV}" || \ - perror "Loop device setup for '${NBD_DEV}' failed with: $?" - add_cleanup disconnect_loop - return 0 -} - -# Helper to mount CONTAINER_PATH to CONTAINER_MNT through expose_container -mount_container() { - [ -z "${CONTAINER_MNT}" ] && \ - perror "Internal error - CONTAINER_MNT not set but should be! Check read_params()" - - # connect container to a loop device first, if it wasnt already done - [ -z "${LOOPED_NBD_DEV}" ] && expose_container - # lets be safe... - [ -z "${LOOPED_NBD_DEV}" ] && \ - perror "Internal error - LOOPED_NBD_DEV not set but should be! Check expose_container()" - - # now we got everything, mount it - pinfo "Mounting '${LOOPED_NBD_DEV}' to '${CONTAINER_MNT}'..." - mount "${LOOPED_NBD_DEV}" "${CONTAINER_MNT}" \ - || perror "Mount failed with: $?" - add_cleanup umount_container - return 0 -} - -# helper to copy the content of RSYNC_TARGET to CONTAINER_MNT -copy_to_container() { - [ -z "${RSYNC_TARGET}" ] && \ - perror "Internal error - RSYNC_TARGET not set but should be!" - [ -z "${CONTAINER_MNT}" ] && \ - perror "Internal error - CONTAINER_MNT not set but should be!" - # sanity checks - is_dir_empty "$RSYNC_TARGET" && \ - perror "'$RSYNC_TARGET' appears to be empty. Did you clone?" - # check for '.stage4' flag in the directory, indicating we cloned there - if [ ! -e "${RSYNC_TARGET}/.stage4" ]; then - perror "No '.stage4' flag found in '${RSYNC_TARGET}'." \ - "Was this cloned properly?" - fi - # copy files from the stage4 directory to the mounted qcow2-container - pinfo "Copying '${RSYNC_TARGET}' to '${CONTAINER_MNT}'..." - rsync -avAHX "${RSYNC_TARGET}"/ "${CONTAINER_MNT}"/ \ - || perror "Rsync failed with: $?" - #make sure everything is flushed - sync && return 0 -} - - -############################################################################### -# -# -# -############################################################################### -# helper to find an unused nbd device -# Usage: -# find_free_nbd -# Echoes the name of the free device to stdout, empty string otherwise. -find_free_nbd() { - local nbd_size=0 - for nbd_id in {0..15}; do - [ -b "/dev/nbd${nbd_id}" ] || continue - [ -r "/sys/block/nbd${nbd_id}/size" ] || continue - nbd_size=$(cat /sys/block/nbd${nbd_id}/size) - [ $nbd_size -eq 0 ] && echo "/dev/nbd${nbd_id}" && break - done - echo "" -} - -# helper to validate an ip -# Usage: -# valid_ip -# Returns 0 if valid, 1 otherwise. -valid_ip() { - local ip=$1 - local stat=1 - - if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then - OIFS=$IFS - IFS='.' - ip=($ip) - IFS=$OIFS - [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ - && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] - stat=$? - fi - return $stat -} - -# helper to check whether a given host is valid -# Usage: -# check_host -# Returns 0 if valid, 1 otherwise -check_host() { - local HOST="$1" - [ -z "$HOST" ] && return 1 - # check if its a valid IP or a valid hostname - valid_ip "$HOST" && return 0 - host -W 2 "$HOST" && return 0 - # still here? then fail - return 1 -} - -# helper to check if a dir is empty or not -# Usage: -# dir_empty -# Returns 0 if empty, 1 otherwise -is_dir_empty() { - [ $# -ne 1 ] && perror "$0 requires directory as paramter, none given." - local _dir="$1" - [ -d "$_dir" ] || return 1 - [ -n "$(ls -A $_dir)" ] && return 1 || return 0 -} - -# helper to ask user for confirmation -# Usage: -# user_confirm -# Return 0 if confirmed, 1 otherwise -user_confirm() { - [ $# -ne 1 ] && perror "$0 requires the question as first argument." - pinfo "$1 [Y/n]" - local _input - read _input - [ "x${_input}" == "x" -o "x${_input}" == "xy" ] && return 0 || return 1 -} - -############################################################################### -# -# CLEANUP FUNCTIONS -# -############################################################################### -# indexed array for cleanup commands -declare -ag cleanup_commands - -# function to add a cleanup command to be executed when the program exits -add_cleanup() { - # get current command count - local -i count="${#cleanup_commands[*]}" - cleanup_commands[$count]="$*" -} - -# function trapped to EXIT, SIGINT, SIGTERM -# do the cleanup in FILO style -do_cleanup() { - trap '' SIGINT SIGTERM EXIT # from now on, ignore INT and TERM - for i in $(seq $(( ${#cleanup_commands[*]} - 1 )) -1 0); do - eval ${cleanup_commands[$i]} - done -} - -# Helper to umount + disconnect the container from all the devices -umount_container() { - [ -z "${CONTAINER_MNT}" ] && \ - perror "CONTAINER_MNT not set - is it really mounted?" - # sync? - umount -l "${CONTAINER_MNT}" || \ - perror "Failed to umount '${CONTAINER_MNT}'." -# rmdir "${CONTAINER_MNT}" || \ -# pwarning "Could not remove '${CONTAINER_MNT}'." -} - -# Helper to disconnect from loop device -disconnect_loop() { - [ -z "${LOOPED_NBD_DEV}" ] && \ - perror "Container not connected to a loop device?" - losetup -d "${LOOPED_NBD_DEV}" ||\ - perror "Could not disconnect loop device '${LOOPED_NBD_DEV}'." -} -# Helper to disconnect from nbd device -disconnect_nbd() { - [ -z "${NBD_DEV}" ] && \ - perror "Container does not seem to be connected to a NBD device?" - qemu-nbd -d "${NBD_DEV}" || \ - perror "Could not disconnect '${CONTAINER_PATH}' from '${NBD_DEV}'." -} - -- cgit v1.2.3-55-g7522