#!/bin/bash set -e -x SCRIPTS_DIR=$(dirname ${0}) VERSION=${VERSION:?"VERSION not set"} while getopts "i:f:c:d:t:r:o:p:ka:" OPTION do case ${OPTION} in i) DIST="$OPTARG" ;; f) FILES="$OPTARG" ;; c) CLOUD_CONFIG="$OPTARG" ;; d) DEVICE="$OPTARG" ;; o) OEM="$OPTARG" ;; p) PARTITION="$OPTARG" ;; r) ROLLBACK_VERSION="$OPTARG" ;; k) KEXEC=y ;; a) APPEND="$OPTARG" ;; t) ENV="$OPTARG" ;; *) exit 1 ;; esac done [[ "$ARCH" == "arm" && "$ENV" != "rancher-upgrade" ]] && ENV=arm DIST=${DIST:-/dist} CLOUD_CONFIG=${CLOUD_CONFIG:-"${SCRIPTS_DIR}/conf/empty.yml"} CONSOLE=tty0 BASE_DIR="/mnt/new_img" BOOT=boot/ # TODO: Change this to a number so that users can specify. # Will need to make it so that our builds and packer APIs remain consistent. PARTITION=${PARTITION:=${DEVICE}1} KERNEL_ARGS="rancher.state.dev=LABEL=RANCHER_STATE rancher.state.wait console=${CONSOLE}" device_defined() { if [[ -z "$1" ]]; then echo "Need to Pass a device name -d ." 1>&2 exit 1 fi } format_device() { device_defined ${DEVICE} mkfs.ext4 -F -i 4096 -L RANCHER_STATE ${PARTITION} } get_dev() { if [ -z "$(which ros)" ]; then lsblk -n -o label $1 else ros dev LABEL=${1} fi } mount_device() { LABEL=RANCHER_STATE local raw="${1:-false}" mkdir -p ${BASE_DIR} if [ -n "$(get_dev RANCHER_BOOT)" ]; then LABEL=RANCHER_BOOT BOOT= fi local mount_opts="-L ${LABEL}" if [ "${raw}" == "true" ]; then device_defined ${DEVICE} mount_opts=${PARTITION} fi mount ${mount_opts} ${BASE_DIR} trap "umount ${BASE_DIR}" EXIT } create_boot_dirs() { mkdir -p ${BASE_DIR}/${BOOT}grub mkdir -p ${BASE_DIR}/${BOOT}syslinux } install_syslinux() { dd bs=440 count=1 if=/usr/lib/syslinux/mbr/mbr.bin of=${DEVICE} cp /usr/lib/syslinux/modules/bios/* ${BASE_DIR}/${BOOT}syslinux extlinux --install ${BASE_DIR}/${BOOT}syslinux } install_syslinux_raid() { dd bs=440 count=1 if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda dd bs=440 count=1 if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdb cp /usr/lib/syslinux/modules/bios/* ${BASE_DIR}/${BOOT}syslinux extlinux --install --raid ${BASE_DIR}/${BOOT}syslinux } install_grub() { grub-install --boot-directory=${BASE_DIR}/boot ${DEVICE} } grub2_config(){ local grub_cfg=${BASE_DIR}/${BOOT}grub/grub.cfg local append_line="${1}" cat >${grub_cfg} <>${grub_cfg} <${syslinux_cfg} <>${syslinux_cfg} < ${grub_file}<> ${grub_file}<&2 exit 1 ;; esac fi if [ -e ${BASE_DIR}/${BOOT}append ]; then PRESERVED_APPEND=$(cat ${BASE_DIR}/${BOOT}append) fi if [ "${APPEND}" = "" ]; then APPEND="${PRESERVED_APPEND}" fi echo "${APPEND}" > ${BASE_DIR}/${BOOT}append grub2_config "${APPEND}" syslinux_config "${APPEND}" pvgrub_config "${APPEND}" install_rancher seusers=${BASE_DIR}/etc/selinux/ros/seusers failsafe_context=${BASE_DIR}/etc/selinux/ros/contexts/failsafe_context if [ -f "${seusers}" ]; then echo "__default__:unconfined_u:s0-s0:c0.c1023" > ${seusers} fi if [ -f "${failsafe_context}" ]; then echo "unconfined_r:unconfined_t:s0" > ${failsafe_context} fi if [ "$KEXEC" = "y" ]; then kexec -l ${DIST}/vmlinuz --initrd=${DIST}/initrd --append="${KERNEL_ARGS} ${APPEND}" -f fi