#!/bin/bash # # proof of concept script to create a bootable 'deployment' floppy # # This one can run on a centos7, to generate a boot floppy for a centos7. # Self=$(basename $0) function print_usage { echo "usage: $Self " } function print_help { cat < Script to create a bootable 'install' floppy image. The image uses ipxe to retrieve a kernel to boot, and sets URLs for the 'install' initrd and kickstart config the kernel should use. The whole thing is pretty CentOS 7 -centric at this point. Options given to this script will set values for the bootstrapping of the *install* stage only. All values may subsequently be overridden from the kickstart stage, once that is retrieved and control is handed over to it. Options: -D, --domain domain, to complete FQDN -G, --gateway Gateway of target system -H, --host hostname of the target system -I, --ip IP address of target system -K, --kserver Kickstart server -M, --netmask Netmask of target system -N, --nameserver Nameserver of target system -S, --cosmos-hash Hash used by cosmos to verify stuff -h, --help this --inst-cmdline add stuff to the install system kernel command line If --cosmos-hash is set to 'disabled', the kickstart stage should skip cosmos bootstrapping, and leave the system unmanaged. If -N, -K, -S options are not given, default values are provided. To avoid shell interpretation of whitespace in --inst-cmdline use escaped semicolon: To achieve this: console=tty1 console=ttyS0,115200n8 write this: console=tty1\;console=ttyS0,115200n8 The script needs ipxe and syslinux to run, and 'sudo' to copy things onto the floppy image EOF } function parse_commadline { while [ "$#" -gt 0 ] ; do case "$1" in -h|--help) print_help exit 0 ;; -H|--host) Host="$2" shift ;; -D|--domain) Domain="$2" shift ;; -I|--ip) IP="$2" shift ;; -M|--netmask) NM="$2" shift ;; -G|--gateway) GW="$2" shift ;; -N|--nameserver) NS="$2" shift ;; -K|--kserver) Kserver="$2" shift ;; -P|--publish-path) PublishPath="$2" shift ;; -S|--cosmos-hash) CosmosHash="$2" shift ;; -T|--tmp-dir) TmpDir="${2}" shift ;; --inst-cmdline) InstCmdLineOpt="$(echo ${2} | sed -e 's/;/ /g')" shift ;; --gen-cmd) GeneratorCommand="$(echo ${2} | sed -e 's/;:;/ /g')" shift ;; *) echo "what do you mean \"$1\"?" exit 1 ;; esac shift done } function check_options { if [ "x${Host}" = "x" ] then echo "${Self}: --host is mandatory" print_usage exit 1 fi if [ "x${Domain}" = "x" ] then echo "${Self}: --domain is mandatory" print_usage exit 1 fi if [ "x${IP}" = "x" ] then echo "${Self}: --ip is mandatory" print_usage exit 1 fi if [ "x${NM}" = "x" ] then echo "${Self}: --netmask is mandatory" print_usage exit 1 fi if [ "x${GW}" = "x" ] then echo "${Self}: --gateway is mandatory" print_usage exit 1 fi if [ "x${NS}" = "x" ] then NS="109.105.96.141" fi if [ "x${Kserver}" = "x" ] then Kserver="109.105.122.84" fi if [ "x${CosmosHash}" = "x" ] then CosmosHash="2ea14b0b958fdc70ad37e3cb9b4185b3648137b8" fi if [ "x${TmpDir}" = "x" ] then TmpDir=$(mktemp -d) else mkdir -p "${TmpDir}" fi } # Host="kas-fiona-10-02" # Domain="nordu.net" # IP="109.105.122.135" # NM="255.255.255.192" # GW="109.105.122.129" # NS="109.105.96.141" # Kserver="109.105.122.84" # CosmosHash="2f15e1edb02f14607084f167929bc145ed47954d" parse_commadline $@ check_options #### # In a bid to be clever, we're adding the 'cosmos hash' to the install # kernel cmdline. This is the one place that cannot be forged, changed, get # lost or 'go missing' from the initial invocation here, until the # anaconda/kickstart process takes over... WorkDir="${TmpDir}/${Host}.d" mkdir -p ${WorkDir}/mnt dd if=/dev/zero of=${WorkDir}/${Host}.img bs=2x80x18b count=1 mkfs.ext2 -F "${WorkDir}/${Host}.img" sudo mount -o loop ${WorkDir}/${Host}.img ${WorkDir}/mnt sudo sh -c "cat >${WorkDir}/mnt/extlinux.conf <${WorkDir}/mnt/${Host}.ipxe <