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 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