From 8f3fc749c2f56f297353d94b3656c50abd2528d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabr=C3=ADcio=20Godoy?= Date: Sat, 3 May 2014 18:02:54 -0300 Subject: [PATCH 1/2] VirtualBox script changed to convert image untouched With config drive there is no need to crack image to insert SSH keys. Then VirtualBox script was changed to just download CoreOS image and convert it to VDI format. --- contrib/create-coreos-vdi | 67 ++++++++++----------------------------- 1 file changed, 16 insertions(+), 51 deletions(-) diff --git a/contrib/create-coreos-vdi b/contrib/create-coreos-vdi index 010c42a1f8..fa58568556 100755 --- a/contrib/create-coreos-vdi +++ b/contrib/create-coreos-vdi @@ -1,15 +1,11 @@ #!/bin/bash VERSION_ID=alpha -SSH_KEYS="" -CORE_UID=500 -CORE_GID=500 -USAGE="Usage: $0 [-V version] [-d /target/path] [-a authorized_keys] +USAGE="Usage: $0 [-V version] [-d /target/path] Options: -d DEST Create CoreOS VDI image to the given path. -V VERSION Version to install (e.g. alpha) [default: ${VERSION_ID}] - -a FILE SSH public keys for login access. [~/.ssh/id_{dsa,rsa}.pub] -h This help This tool creates a CoreOS VDI image to be used with VirtualBox. @@ -99,15 +95,14 @@ do case $OPTION in V) VERSION_ID="$OPTARG" ;; d) DEST="$OPTARG" ;; - a) SSH_KEYS="$OPTARG" ;; h) echo "$USAGE"; exit;; *) exit 1;; esac done -# root user required -if [ $(id -u) -ne 0 ]; then - echo "$0: You must be root to run this script." >&2 +# root user forbidden +if [ $(id -u) -eq 0 ]; then + echo "$0: This script should not be run as root." >&2 exit 1 fi @@ -118,19 +113,10 @@ if [ $? -ne 0 ]; then exit 1 fi -# Verify provided keys file -if [[ -n "${SSH_KEYS}" ]]; then - if [[ ! -f "${SSH_KEYS}" ]]; then - echo "$0: SSH keys file not found: ${SSH_KEYS}." >&2 - exit 1 - fi -else - # SSH keys file was not provided, setting to default - SSH_KEYS=~/.ssh/id_*.pub +if [ -z "${DEST}" ]; then + DEST=$PWD fi - - if [[ ! -d "${DEST}" ]]; then echo "$0: Target path (${DEST}) do not exists." >&2 exit 1 @@ -141,7 +127,6 @@ mkdir "$WORKDIR" trap "rm -rf '${WORKDIR}'" EXIT RAW_IMAGE_NAME="coreos_production_image.bin" -VDI_IMAGE_NAME="coreos_production_${VERSION_ID}.vdi" IMAGE_NAME="${RAW_IMAGE_NAME}.bz2" DIGESTS_NAME="${IMAGE_NAME}.DIGESTS.asc" @@ -149,7 +134,6 @@ BASE_URL="http://storage.core-os.net/coreos/amd64-usr/${VERSION_ID}" IMAGE_URL="${BASE_URL}/${IMAGE_NAME}" DIGESTS_URL="${BASE_URL}/${DIGESTS_NAME}" DOWN_IMAGE="${WORKDIR}/${RAW_IMAGE_NAME}" -VDI_IMAGE="${DEST}/${VDI_IMAGE_NAME}" if ! wget --spider --quiet "${IMAGE_URL}"; then echo "$0: Image URL unavailable: $IMAGE_URL" >&2 @@ -161,6 +145,14 @@ if ! wget --spider --quiet "${DIGESTS_URL}"; then exit 1 fi +# Gets CoreOS verion from version.txt file +VERSION_NAME="version.txt" +VERSION_URL="${BASE_URL}/${VERSION_NAME}" +wget --no-verbose -O "${WORKDIR}/${VERSION_NAME}" "${VERSION_URL}" +. "${WORKDIR}/${VERSION_NAME}" +VDI_IMAGE_NAME="coreos_production_${COREOS_BUILD}.${COREOS_BRANCH}.${COREOS_PATCH}.vdi" +VDI_IMAGE="${DEST}/${VDI_IMAGE_NAME}" + # Setup GnuPG for verifying the image signature export GNUPGHOME="${WORKDIR}/gnupg" mkdir "${GNUPGHOME}" @@ -188,35 +180,6 @@ done echo "Writing ${IMAGE_NAME} to ${DOWN_IMAGE}..." bzcat -v --stdout "${WORKDIR}/${IMAGE_NAME}" >"${DOWN_IMAGE}" -# The ROOT partition should be #9 but make no assumptions here! -# Also don't mount by label directly in case other devices conflict. -PART_OFFSET=$(parted ${DOWN_IMAGE} unit b print | grep "ROOT" | awk '{print $2}') -PART_OFFSET=${PART_OFFSET//B/} -if [[ -z "${PART_OFFSET}" ]]; then - echo "Unable to find new ROOT partition on ${DOWN_IMAGE}" >&2 - exit 1 -fi - -MOUNT_DEST="${WORKDIR}/rootfs" -CORE_SSH_DIR="${MOUNT_DEST}/home/core/.ssh" -AUTHORIZED_KEYS="${CORE_SSH_DIR}/authorized_keys" - -echo "Adding SSH key to authorized keys file..." -mkdir -p "${MOUNT_DEST}" -mount -t btrfs -o loop,offset=${PART_OFFSET},subvol=root "${DOWN_IMAGE}" "${MOUNT_DEST}" -trap "umount '${MOUNT_DEST}' && rm -rf '${WORKDIR}'" EXIT - -if [ ! -d "${CORE_SSH_DIR}" ]; then - mkdir -p ${CORE_SSH_DIR} - chmod 0600 ${CORE_SSH_DIR} -fi - -cat ${SSH_KEYS} > ${AUTHORIZED_KEYS} -chmod 0600 ${AUTHORIZED_KEYS} -chown -R $CORE_UID:$CORE_GID "${CORE_SSH_DIR}" - -umount "${MOUNT_DEST}" - echo "Converting ${RAW_IMAGE_NAME} to VirtualBox format..." VBoxManage convertdd ${DOWN_IMAGE} ${VDI_IMAGE} --format VDI @@ -224,3 +187,5 @@ rm -rf "${WORKDIR}" trap - EXIT echo "Success! CoreOS ${VERSION_ID} VDI image was created on ${VDI_IMAGE_NAME}" + +# vim: ts=4 et From 63d519b9920b8b83eaec3062f3e41e4b6630c6c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabr=C3=ADcio=20Godoy?= Date: Sun, 4 May 2014 01:12:43 -0300 Subject: [PATCH 2/2] Script to create basic config-drive New script that creates a basic config-drive, ideal to testing purpose. --- contrib/create-basic-configdrive | 152 +++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100755 contrib/create-basic-configdrive diff --git a/contrib/create-basic-configdrive b/contrib/create-basic-configdrive new file mode 100755 index 0000000000..14271a0858 --- /dev/null +++ b/contrib/create-basic-configdrive @@ -0,0 +1,152 @@ +#!/bin/bash + +DEFAULT_ETCD_DISCOVERY="https//discovery.etcd.io/TOKEN" +DEFAULT_ETCD_ADDR="\$public_ipv4:4001" +DEFAULT_ETCD_PEER_ADDR="\$private_ipv4:7001" + +USAGE="Usage: $0 -H HOSTNAME -S SSH_FILE [-p /target/path] [-d|-e|-i|-n|-t|-h] +Options: + -d URL Full URL path to discovery endpoint. + -e IP:PORT Address for client communication. + -H HOSTNAME Machine hostname. + -i IP:PORT Address for server communication. + -n NAME etcd node name. + -p DEST Create config-drive ISO image to the given path. + -S FILE SSH keys file. + -t TOKEN Token ID from https://discovery.etcd.io. + -h This help + +This tool creates a basic config-drive ISO image. +" + +CLOUD_CONFIG="#cloud-config + +coreos: + etcd: + name: + discovery: + addr: + peer-addr: +ssh_authorized_keys: + - +hostname: +" +REGEX_SSH_FILE="^ssh-(rsa|dss) [-A-Za-z0-9+\/]+[=]{0,2} .+" + +while getopts "d:e:H:i:n:p:S:t:h" OPTION +do + case $OPTION in + d) ETCD_DISCOVERY="$OPTARG" ;; + e) ETCD_ADDR="$OPTARG" ;; + H) HNAME="$OPTARG" ;; + i) ETCD_PEER_ADDR="$OPTARG" ;; + n) ETCD_NAME="$OPTARG" ;; + p) DEST="$OPTARG" ;; + S) SSH_FILE="$OPTARG" ;; + t) TOKEN="$OPTARG" ;; + h) echo "$USAGE"; exit;; + *) exit 1;; + esac +done + +# root user forbidden +if [ $(id -u) -eq 0 ]; then + echo "$0: This script should not be run as root." >&2 + exit 1 +fi + +if [ -z "$HNAME" ]; then + echo "$0: The hostname parameter '-H' is required." >&2 + exit 1 +fi + +if [ -z "$SSH_FILE" ]; then + echo "$0: The SSH filename parameter '-S' is required." >&2 + exit 1 +fi + +if [[ ! -r "$SSH_FILE" ]]; then + echo "$0: The SSH file (${SSH_FILE}) was not found." >&2 + exit 1 +fi + +if [ $(cat "$SSH_FILE" | wc -l) -eq 0 ]; then + echo "$0: The SSH file (${SSH_FILE}) is empty." >&2 + exit 1 +fi + +if [ $(grep -v -E "$REGEX_SSH_FILE" "$SSH_FILE" | wc -l) -gt 0 ]; then + echo "$0: The SSH file (${SSH_FILE}) content is invalid." >&2 + exit 1 +fi + +if [ -z "$DEST" ]; then + DEST=$PWD +fi + +if [[ ! -d "$DEST" ]]; then + echo "$0: Target path (${DEST}) do not exists." >&2 + exit 1 +fi + +if [ ! -z "$ETCD_DISCOVERY" ] && [ ! -z "$TOKEN" ]; then + echo "$0: You cannot specify both discovery token and discovery URL." >&2 + exit 1 +fi + +if [ ! -z "$TOKEN" ]; then + ETCD_DISCOVERY="${DEFAULT_ETCD_DISCOVERY//TOKEN/$TOKEN}" +fi + +if [ -z "$ETCD_DISCOVERY" ]; then + ETCD_DISCOVERY=$DEFAULT_ETCD_DISCOVERY +fi + +if [ -z "$ETCD_NAME" ]; then + ETCD_NAME=$HNAME +fi + +if [ -z "$ETCD_ADDR" ]; then + ETCD_ADDR=$DEFAULT_ETCD_ADDR +fi + +if [ -z "$ETCD_PEER_ADDR" ]; then + ETCD_PEER_ADDR=$DEFAULT_ETCD_PEER_ADDR +fi + + +WORKDIR="${DEST}/tmp.${RANDOM}" +mkdir "$WORKDIR" +trap "rm -rf '${WORKDIR}'" EXIT + +CONFIG_DIR="${WORKDIR}/openstack/latest" +CONFIG_FILE="${CONFIG_DIR}/user_data" +CONFIGDRIVE_FILE="${DEST}/${HNAME}.iso" + +mkdir -p "$CONFIG_DIR" + +while read l; do + if [ -z "$SSH_KEY" ]; then + SSH_KEY="$l" + else + SSH_KEY="$SSH_KEY + - $l" + fi +done < "$SSH_FILE" + +CLOUD_CONFIG="${CLOUD_CONFIG//${ETCD_NAME}}" +CLOUD_CONFIG="${CLOUD_CONFIG//${ETCD_DISCOVERY}}" +CLOUD_CONFIG="${CLOUD_CONFIG//${ETCD_ADDR}}" +CLOUD_CONFIG="${CLOUD_CONFIG//${ETCD_PEER_ADDR}}" +CLOUD_CONFIG="${CLOUD_CONFIG//${SSH_KEY}}" +CLOUD_CONFIG="${CLOUD_CONFIG//${HNAME}}" + +echo "$CLOUD_CONFIG" > "$CONFIG_FILE" + +mkisofs -R -V config-2 -o $CONFIGDRIVE_FILE $WORKDIR + +echo +echo +echo "Success! The config-drive image was created on ${CONFIGDRIVE_FILE}" + +# vim: ts=4 et