flatcar-scripts/contrib/create-basic-configdrive
Peter Mrekaj fc9e5baa0d Add check for mkisofs
This check helps to avoid exit the script with the message indicating
success even though the mkisofs is missing and an image has not been created.
2015-06-29 10:49:00 -07:00

159 lines
3.7 KiB
Bash
Executable File

#!/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: <ETCD_NAME>
discovery: <ETCD_DISCOVERY>
addr: <ETCD_ADDR>
peer-addr: <ETCD_PEER_ADDR>
ssh_authorized_keys:
- <SSH_KEY>
hostname: <HOSTNAME>
"
REGEX_SSH_FILE="^ssh-(rsa|dss|ed25519) [-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
# mkisofs tool check
if ! which mkisofs &>/dev/null; then
echo "$0: mkisofs tool is required to create image." >&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>/${ETCD_NAME}}"
CLOUD_CONFIG="${CLOUD_CONFIG/<ETCD_DISCOVERY>/${ETCD_DISCOVERY}}"
CLOUD_CONFIG="${CLOUD_CONFIG/<ETCD_ADDR>/${ETCD_ADDR}}"
CLOUD_CONFIG="${CLOUD_CONFIG/<ETCD_PEER_ADDR>/${ETCD_PEER_ADDR}}"
CLOUD_CONFIG="${CLOUD_CONFIG/<SSH_KEY>/${SSH_KEY}}"
CLOUD_CONFIG="${CLOUD_CONFIG/<HOSTNAME>/${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