summaryrefslogblamecommitdiffstats
path: root/packager/openslx.functions
blob: 5fabdbe0941f1b4fc3532232988d84cf2c220bc5 (plain) (tree)
1
2
3
4
5
6
7
8
9

                                                                                
                                                   


                                                                                


                                                      
                                                            
                                                                                     






























































































































                                                                                       
# ------------------------------------------------------------------------------
#
#                          Functions for OpenSLX-NG
#
# ------------------------------------------------------------------------------
#
# check if we have our environement 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

# Helper to generate a stage4 export for a remote machine per rsync.
clone_stage4() {
	[ $# -ne 2 ] && perror "$0 <remote_ip> <stage4_sync_dir>"
	local REMOTE_HOST="$1"
	local TARGET_DIR="$2"
	local BUILD_DIR="${ROOT_DIR}/builds/$REMOTE_HOST"
	mkdir -p "$TARGET_DIR"
	mkdir -p "$BUILD_DIR"

	local EXCLUDE="$BUILD_DIR/exclude-stage4"
	local INCLUDE="$BUILD_DIR/include-stage4"

	pinfo "Building rsync exclude-file for building stage 4...."
	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
	pinfo "Done."

	# prepare rsync's options
	local RSYNC_SOURCE="root@$REMOTE_HOST:/"
	local RSYNC_OPTS="-e ssh -c arcfour -oStrictHostKeyChecking=no"

	# run rsync with the exclude/include lists created earlier
	pinfo "Cloning via rsync..."
	cat "$INCLUDE" "$EXCLUDE" | \
		rsync --verbose \
				--archive \
				--delete \
				--delete-excluded \
				--numeric-ids \
				--exclude-from=- \
				"${RSYNC_OPTS}" \
				"${RSYNC_SOURCE}" \
				"${TARGET_DIR}" \
		|| perror "rsync from '${RSYNC_SOURCE}' to '${TARGET_DIR}' failed."
	pinfo "Cloning '${REMOTE_HOST}' to '${TARGET_DIR}' succeeded."
	return 0
}
# helper to build a qcow2 container from a stage4 sync directory.
# required tools: qemu-img, qemu-nbd, nbd, mkfs.ext4
export_qcow2() {
	# enough args?
	[ $# -ne 2 ] && perror "Usage: $0 <stage4_synced_dir> <target_file>"
	# $1 valid?
	[ ! -d $1 ] && perror "First argument not a directory!"
	# $2 should not be a dir or strange things will happen...
	[ -d $2 ] && perror "Target file can not be a directory!"

	# $1 is dir, strip trailing slash if there is one
	local STAGE4_DIR="${1%/}"
	local TARGET_FILE="$2"
	if [ -e $TARGET_FILE ]; then
		pinfo "Removing old target: $TARGET_FILE"
		rm $target || perror "Could not remove '$TARGET_FILE'"
	fi

	# so far so good
	pinfo "Creating empty qcow2-container ..."
	qemu-img create -f qcow2 $TARGET_FILE 10G \
		|| perror "qemu-img create failed with: $?"
	pinfo "Done."

	# find usable nbd device
	pinfo "Looking for usable nbd device..."
	local NBD_ID="$(find_free_nbd)"
	local NBD_DEV="/dev/nbd${NBD_ID}"
	[ -b "$NBD_DEV" ] || perror "'$NBD_DEV' is not a block device!"
	pinfo "Exporting '${TARGET_FILE}' using '${NBD_DEV}'..."
	qemu-nbd -c ${NBD_DEV} ${TARGET_FILE} || perror "qemu-nbd failed with: $?"
	pinfo "Done."

	pinfo "Creating ext4 filesystem on '${TARGET_FILE}'..."
	mkfs.ext4 "${NBD_DEV}" || perror "mkfs failed with: $?"
	pinfo "Done."

	# mount NBD_DEV
	mkdir ${BUILD_DIR}/mnt
	pinfo "Mounting '${NBD_DEV}' to '${BUILD_DIR}/mnt'..."
	mount ${NBD_DEV} ${BUILD_DIR}/mnt || perror "Mount failed with: $?"
	pinfo "Done."

	# copy files from the stage4 directory to the mounted qcow2-container
	pinfo "Copying '${STAGE4_DIR}' to '${BUILD_DIR}/mnt'..."
	cp -ra "${STAGE4_DIR}"/* "${BUILD_DIR}"/mnt || perror "Copying failed with: $?"
	pinfo "Done."

	pinfo "Cleaning up..."
	umount "${BUILD_DIR}/mnt" || perror "Could not unmount '${BUILD_DIR}/mnt'."
	qemu-nbd -d /dev/nbd${nbd_id} || perror "Could not disconnect '${NBD_DEV}'."
	pinfo "Exporting '${STAGE4_DIR}' to '${TARGET_FILE}' completed."
}

# helper to find an unused nbd device
find_free_nbd() {
	local nbd_size=0
	for nbd_id in {0..15}; do
		[ -b "/dev/nbd${nbd_id}" ] || continue
		[ ! -e "/sys/block/nbd${nbd_id}/size" ] || continue
		nbd_size=$(cat /sys/block/nbd${nbd_id}/size)
		[ $nbd_size -eq 0 ] && break
	done
	return ${nbd_id}
}
# helper to validate an ip
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
}