mirror of
https://github.com/flatcar/scripts.git
synced 2025-09-27 08:31:04 +02:00
Merge pull request #239 from skarllot/master
Changes to VirtualBox convert script
This commit is contained in:
commit
8ed90ad301
152
contrib/create-basic-configdrive
Executable file
152
contrib/create-basic-configdrive
Executable file
@ -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: <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) [-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>/${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
|
@ -1,15 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
VERSION_ID=alpha
|
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:
|
Options:
|
||||||
-d DEST Create CoreOS VDI image to the given path.
|
-d DEST Create CoreOS VDI image to the given path.
|
||||||
-V VERSION Version to install (e.g. alpha) [default: ${VERSION_ID}]
|
-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
|
-h This help
|
||||||
|
|
||||||
This tool creates a CoreOS VDI image to be used with VirtualBox.
|
This tool creates a CoreOS VDI image to be used with VirtualBox.
|
||||||
@ -99,15 +95,14 @@ do
|
|||||||
case $OPTION in
|
case $OPTION in
|
||||||
V) VERSION_ID="$OPTARG" ;;
|
V) VERSION_ID="$OPTARG" ;;
|
||||||
d) DEST="$OPTARG" ;;
|
d) DEST="$OPTARG" ;;
|
||||||
a) SSH_KEYS="$OPTARG" ;;
|
|
||||||
h) echo "$USAGE"; exit;;
|
h) echo "$USAGE"; exit;;
|
||||||
*) exit 1;;
|
*) exit 1;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
# root user required
|
# root user forbidden
|
||||||
if [ $(id -u) -ne 0 ]; then
|
if [ $(id -u) -eq 0 ]; then
|
||||||
echo "$0: You must be root to run this script." >&2
|
echo "$0: This script should not be run as root." >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -118,19 +113,10 @@ if [ $? -ne 0 ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Verify provided keys file
|
if [ -z "${DEST}" ]; then
|
||||||
if [[ -n "${SSH_KEYS}" ]]; then
|
DEST=$PWD
|
||||||
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
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if [[ ! -d "${DEST}" ]]; then
|
if [[ ! -d "${DEST}" ]]; then
|
||||||
echo "$0: Target path (${DEST}) do not exists." >&2
|
echo "$0: Target path (${DEST}) do not exists." >&2
|
||||||
exit 1
|
exit 1
|
||||||
@ -141,7 +127,6 @@ mkdir "$WORKDIR"
|
|||||||
trap "rm -rf '${WORKDIR}'" EXIT
|
trap "rm -rf '${WORKDIR}'" EXIT
|
||||||
|
|
||||||
RAW_IMAGE_NAME="coreos_production_image.bin"
|
RAW_IMAGE_NAME="coreos_production_image.bin"
|
||||||
VDI_IMAGE_NAME="coreos_production_${VERSION_ID}.vdi"
|
|
||||||
IMAGE_NAME="${RAW_IMAGE_NAME}.bz2"
|
IMAGE_NAME="${RAW_IMAGE_NAME}.bz2"
|
||||||
DIGESTS_NAME="${IMAGE_NAME}.DIGESTS.asc"
|
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}"
|
IMAGE_URL="${BASE_URL}/${IMAGE_NAME}"
|
||||||
DIGESTS_URL="${BASE_URL}/${DIGESTS_NAME}"
|
DIGESTS_URL="${BASE_URL}/${DIGESTS_NAME}"
|
||||||
DOWN_IMAGE="${WORKDIR}/${RAW_IMAGE_NAME}"
|
DOWN_IMAGE="${WORKDIR}/${RAW_IMAGE_NAME}"
|
||||||
VDI_IMAGE="${DEST}/${VDI_IMAGE_NAME}"
|
|
||||||
|
|
||||||
if ! wget --spider --quiet "${IMAGE_URL}"; then
|
if ! wget --spider --quiet "${IMAGE_URL}"; then
|
||||||
echo "$0: Image URL unavailable: $IMAGE_URL" >&2
|
echo "$0: Image URL unavailable: $IMAGE_URL" >&2
|
||||||
@ -161,6 +145,14 @@ if ! wget --spider --quiet "${DIGESTS_URL}"; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
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
|
# Setup GnuPG for verifying the image signature
|
||||||
export GNUPGHOME="${WORKDIR}/gnupg"
|
export GNUPGHOME="${WORKDIR}/gnupg"
|
||||||
mkdir "${GNUPGHOME}"
|
mkdir "${GNUPGHOME}"
|
||||||
@ -188,35 +180,6 @@ done
|
|||||||
echo "Writing ${IMAGE_NAME} to ${DOWN_IMAGE}..."
|
echo "Writing ${IMAGE_NAME} to ${DOWN_IMAGE}..."
|
||||||
bzcat -v --stdout "${WORKDIR}/${IMAGE_NAME}" >"${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..."
|
echo "Converting ${RAW_IMAGE_NAME} to VirtualBox format..."
|
||||||
VBoxManage convertdd ${DOWN_IMAGE} ${VDI_IMAGE} --format VDI
|
VBoxManage convertdd ${DOWN_IMAGE} ${VDI_IMAGE} --format VDI
|
||||||
|
|
||||||
@ -224,3 +187,5 @@ rm -rf "${WORKDIR}"
|
|||||||
trap - EXIT
|
trap - EXIT
|
||||||
|
|
||||||
echo "Success! CoreOS ${VERSION_ID} VDI image was created on ${VDI_IMAGE_NAME}"
|
echo "Success! CoreOS ${VERSION_ID} VDI image was created on ${VDI_IMAGE_NAME}"
|
||||||
|
|
||||||
|
# vim: ts=4 et
|
||||||
|
Loading…
x
Reference in New Issue
Block a user