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