diff options
author | Simon Spöhel <simon@spoehel.ch> | 2021-04-23 10:41:27 +0000 |
---|---|---|
committer | Sakirnth Nagarasa <sakirnth@gmail.com> | 2021-09-01 08:25:43 +0000 |
commit | 5c5515d07af491510d29b854cfd605b303443261 (patch) | |
tree | c6a3a34973ddd2891adb648ea1e8c688865faf7f | |
parent | Adding option to select config-template. (diff) | |
download | compute-tools-5c5515d07af491510d29b854cfd605b303443261.tar.xz compute-tools-5c5515d07af491510d29b854cfd605b303443261.zip |
Adding create-qemu command.
Diffstat (limited to '')
-rwxr-xr-x | libexec/container/create-qemu | 120 | ||||
-rwxr-xr-x | share/build-scripts/veos | 1020 | ||||
-rw-r--r-- | share/config/vm-veos-leaf.conf.in (renamed from share/doc/examples/arista-leaf.conf.in) | 0 |
3 files changed, 48 insertions, 1092 deletions
diff --git a/libexec/container/create-qemu b/libexec/container/create-qemu index 138fb37..b678d59 100755 --- a/libexec/container/create-qemu +++ b/libexec/container/create-qemu @@ -1,5 +1,6 @@ #!/bin/sh + # Copyright (C) 2014-2021 Daniel Baumann <daniel.baumann@open-infrastructure.net> # # SPDX-License-Identifier: GPL-3.0+ @@ -31,8 +32,8 @@ SCRIPTS="/usr/share/${SOFTWARE}/scripts" Parameters () { - GETOPT_LONGOPTIONS="name:,cnt.container-server:,cnt.overlay:,cnt.overlay-options:,bind:,bind-ro:,capability:,drop-capability:,script:,config-template:,verbose," - GETOPT_OPTIONS="n:,b:,c:,d:,s:,t:,v," + GETOPT_LONGOPTIONS="name:,cnt.container-server:,id:,script:,shortname:,config-template:,verbose," + GETOPT_OPTIONS="n:,i:,s:,c:,v," PARAMETERS="$(getopt --longoptions ${GETOPT_LONGOPTIONS} --name=${COMMAND} --options ${GETOPT_OPTIONS} --shell sh -- ${@})" @@ -52,48 +53,23 @@ Parameters () shift 2 ;; - --cnt.auto) - CNT_AUTO="${2}" - shift 2 - ;; - --cnt.container-server) CNT_CONTAINER_SERVER="${2}" shift 2 ;; - --cnt.overlay) - CNT_OVERLAY="${2}" - shift 2 - ;; - - --cnt.overlay-options) - CNT_OVERLAY_OPTIONS="${2}" - shift 2 - ;; - - -b|--bind) - BIND="${2}" - shift 2 - ;; - - --bind-ro) - BIND_RO="${2}" + -i|--id) + ID="${2}" shift 2 ;; - -c|--capability) - CAPABILITY="${2}" - shift 2 - ;; - - -d|--drop-capability) - DROP_CAPABILITY="${2}" + -s|--script) + SCRIPT="${2}" shift 2 ;; - -s|--script) - SCRIPT="${2}" + --shortname) + SHORTNAME="${2}" shift 2 ;; @@ -122,6 +98,8 @@ Parameters () Usage () { + # FIXME + echo WIP echo "Usage: ${PROGRAM} ${COMMAND} -n|--name NAME [--cnt.container-server=true|false|FQDN] [--cnt.overlay=DIRECTORY_LOWER:DIRECTORY_UPPER:DIRECTORY_WORK:DIRECTORY_MERGED] [--cnt.overlay-options=OPTION[,OPTION]] [-b|--bind DIRECTORY:DIRECTORY[:OPTIONS]] [--bind-ro DIRECTORY:DIRECTORY[:OPTIONS]] [-c|--capability CAPABILITY[,CAPABILITY]] [-d|--drop-capability DROP_CAPABILITY[,DROP_CAPABILITY]] [-s|--script SCRIPT] [-v|--verbose] [-- SCRIPT_OPTIONS]" >&2 exit 1 } @@ -133,6 +111,11 @@ then Usage fi +if [ -z "${ID}" ] +then + Usage +fi + case "${NAME}" in ALL) echo "'${NAME}': name 'ALL' is reserved to expand to all available container" >&2 @@ -191,64 +174,13 @@ Creating container: ${NAME} ################################################################################ EOF - ;; + ;; esac -CNT_CONTAINER_SERVER="${CNT_CONTAINER_SERVER:-$(hostname -f 2> /dev/null || hostname)}" - -# Pre hooks -for FILE in "${HOOKS}/pre-${COMMAND}".* "${HOOKS}/${NAME}.pre-${COMMAND}" -do - if [ -x "${FILE}" ] - then - "${FILE}" - fi -done - -# Creating rw bind mounts -if [ -n "${BIND}" ] -then - BINDS="$(echo ${BIND} | sed -e 's|;| |g')" - - for ENTRY in ${BINDS} - do - DIRECTORY="$(echo ${ENTRY} | awk -F: '{ print $1 }')" - - mkdir -p "${DIRECTORY}" - done -fi - -# Creating ro bind mounts -if [ -n "${BIND_RO}" ] -then - BINDS_RO="$(echo ${BIND_RO} | sed -e 's|;| |g')" - - for ENTRY in ${BINDS_RO} - do - DIRECTORY="$(echo ${ENTRY} | awk -F: '{ print $1 }')" - - mkdir -p "${DIRECTORY}" - done -fi +BASE_PORT="20000" -# Creating overlay mounts -if [ -n "${CNT_OVERLAY}" ] -then - CNT_OVERLAYS="$(echo ${CNT_OVERLAY} | sed -e 's|;| |g')" - - for ENTRY in ${CNT_OVERLAYS} - do - DIRECTORY_LOWER="$(echo ${ENTRY} | awk -F: '{ print $1 }')" - DIRECTORY_UPPER="$(echo ${ENTRY} | awk -F: '{ print $2 }')" - DIRECTORY_WORK="$(echo ${ENTRY} | awk -F: '{ print $3 }')" - DIRECTORY_MERGED="$(echo ${ENTRY} | awk -F: '{ print $4 }')" - - for DIRECTORY in "${DIRECTORY_LOWER}" "${DIRECTORY_UPPER}" "${DIRECTORY_WORK}" "${DIRECTORY_MERGED}" - do - mkdir -p "${DIRECTORY}" - done - done -fi +CNT_CONTAINER_SERVER="${CNT_CONTAINER_SERVER:-$(hostname -f 2> /dev/null || hostname)}" +PORT="$((${BASE_PORT}+${ID}))" # config mkdir -p "${CONFIG}" @@ -270,19 +202,13 @@ sed -e "s|@CNT_AUTO@|${CNT_AUTO}|g" \ -e "s|@NETWORK_VETH_EXTRA@|${NETWORK_VETH_EXTRA}|g" \ -e "s|@PRIVATE_USERS@|no|g" \ -e "s|@REGISTER@|yes|g" \ + -e "s|@ID@|${ID}|g" \ + -e "s|@SHORTNAME@|${SHORTNAME}|g" \ + -e "s|@PORT@|${PORT}|g" \ "${CONFIG_TEMPLATE}" > "${CONFIG}/${NAME}.conf" # Run "${SCRIPTS}/${SCRIPT}" $(echo "${@}" | sed -e 's| -- | |') -# Post hooks -for FILE in "${HOOKS}/post-${COMMAND}".* "${HOOKS}/${NAME}.post-${COMMAND}" -do - if [ -x "${FILE}" ] - then - "${FILE}" - fi -done - # done echo "'${NAME}': container created." diff --git a/share/build-scripts/veos b/share/build-scripts/veos index 4a0540d..47f18f2 100755 --- a/share/build-scripts/veos +++ b/share/build-scripts/veos @@ -33,14 +33,14 @@ export SCRIPT Parameters () { - GETOPT_LONGOPTIONS="bind:,bind-ro:,script:,name:,preseed-file:,boot-method:," - GETOPT_OPTIONS="b:,s:,n:,p:" + GETOPT_LONGOPTIONS="name:,cnt.container-server:,id:,script:,shortname:,config-template:,verbose," + GETOPT_OPTIONS="n:,i:,s:,c:,v," - PARAMETERS="$(getopt --longoptions ${GETOPT_LONGOPTIONS} --name=${SCRIPT} --options ${GETOPT_OPTIONS} --shell sh -- "${@}")" + PARAMETERS="$(getopt --longoptions ${GETOPT_LONGOPTIONS} --name=${COMMAND} --options ${GETOPT_OPTIONS} --shell sh -- ${@})" if [ "${?}" != "0" ] then - echo "'${SCRIPT}': getopt exit" >&2 + echo "'${COMMAND}': getopt exit" >&2 exit 1 fi @@ -49,44 +49,39 @@ Parameters () while true do case "${1}" in - -b|--bind) - # ignore - shift 2 - ;; - - --bind-ro) - # ignore + -n|--name) + NAME="${2}" shift 2 ;; - --cnt.auto) - # ignore + --cnt.container-server) + CNT_CONTAINER_SERVER="${2}" shift 2 ;; - --cnt.container-server) - # ignore + -i|--id) + ID="${2}" shift 2 ;; -s|--script) - # ignore + SCRIPT="${2}" shift 2 ;; - -n|--name) - NAME="${2}" + --shortname) + SHORTNAME="${2}" shift 2 ;; - --preseed-file) - PRESEED_FILE="${2}" + -t|--config-template) + CONFIG_TEMPLATE="${2}" shift 2 ;; - --boot-method) - BOOT_METHOD="${2}" - shift 2 + -v|--verbose) + VERBOSE="true" + shift 1 ;; --) @@ -95,7 +90,7 @@ Parameters () ;; *) - echo "'${SCRIPT}': getopt error" >&2 + echo "'${COMMAND}': getopt error" >&2 exit 1 ;; esac @@ -104,6 +99,8 @@ Parameters () Usage () { + # FIXME + echo WIP echo "Usage: container create -n|--name NAME -s|--script ${SCRIPT} -- [-p|--preseed-file FILE]" >&2 exit 1 } @@ -115,830 +112,18 @@ then Usage fi -if [ -e "${MACHINES}/${NAME}" ] +if [ -e "${MACHINES}/${NAME}.vmdk" ] then echo "'${NAME}': container already exists" >&2 exit 1 fi -if [ ! -x /usr/sbin/debootstrap ] -then - echo "'${NAME}': /usr/sbin/debootstrap - no such file." >&2 - exit 1 -fi - if [ "$(id -u)" -ne 0 ] then echo "'${NAME}': need root privileges" >&2 exit 1 fi -case "${BOOT_METHOD}" in - "") - BOOT_METHOD="efi" - ;; - - *) - ;; -esac - -Create_Disk () -{ - # FIXME image size as arg or preseed - IMG_SIZE=12000 - - dd if=/dev/zero of="${MACHINES}/${NAME}.img" bs=1024k count=0 seek="${IMG_SIZE}" - parted "${MACHINES}/${NAME}.img" mklabel gpt - - - case "${BOOT_METHOD}" in - bios) - # FIXME number partitions and size scrip and everything - parted -a optimal "${MACHINES}/${NAME}.img" mkpart BIOS-BOOT 1MB 2MB - parted "${MACHINES}/${NAME}.img" set 1 bios_grub on - parted -a optimal "${MACHINES}/${NAME}.img" mkpart SYSTEM 2MB 100% - SYSTEM_PARTITION="p2" - ;; - - efi) - parted -a optimal "${MACHINES}/${NAME}.img" mkpart EFI fat32 1M 1000M - parted "${MACHINES}/${NAME}.img" set 1 esp on - parted -a optimal "${MACHINES}/${NAME}.img" mkpart SYSTEM 1000MB 100% - EFI_PARTITION="p1" - SYSTEM_PARTITION="p2" - ;; - - *) - echo "Error, unrecognized BOOT_METHOD" >&2 - exit 1 - esac - - kpartx -av "${MACHINES}/${NAME}.img" - # FIXME loop number hardcoded - mkfs.ext4 "/dev/mapper/loop0${SYSTEM_PARTITION}" - - if [ ! -z "${EFI_PARTITION}" ] - then - mkfs.vfat -F 32 "/dev/mapper/loop0${EFI_PARTITION}" - fi - - # FIXME swap, more discs -} - -Mount_Disk () -{ - # FIXME probably not necessary - mkdir -p "${MACHINES}/${NAME}" - - # FIXME partition number hardcoded - mount "/dev/mapper/loop0${SYSTEM_PARTITION}" "${MACHINES}/${NAME}" -} - -Umount () -{ - # Unmounting pseudo-filesystems - umount -f "${DIRECTORY}/dev/pts" > /dev/null 2>&1 || true - umount -f "${DIRECTORY}/proc" > /dev/null 2>&1 || true - umount -f "${DIRECTORY}/sys" > /dev/null 2>&1 || true - umount -f "${DIRECTORY}/dev" > /dev/null 2>&1 || true - umount -f "${DIRECTORY}/boot/efi" > /dev/null 2>&1 || true - - # Unmounting disk images - # FIXME unmount additinal images - umount -f "${DIRECTORY}" > /dev/null 2>&1 || true - kpartx -d "${MACHINES}/${NAME}.img" -} - -Chroot () -{ - CHROOT="${1}" - shift - - chroot "${CHROOT}" /usr/bin/env -i \ - LC_ALL="C" PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games" TERM="${TERM}" \ - DEBIAN_FRONTEND="${DEBCONF_FRONTEND}" DEBIAN_PRIORITY="${DEBCONF_PRIORITY}" \ - DEBCONF_NONINTERACTIVE_SEEN="true" DEBCONF_NOWARNINGS="true" \ - ftp_proxy="${ftp_proxy}" http_proxy="${http_proxy}" \ - ${@} -} - -Upgrade_system () -{ - DIRECTORY="${1}" - - # Mount pseudo-filesystems - mount -o bind /dev/pts "${DIRECTORY}/dev/pts" - mount -o bind /proc "${DIRECTORY}/proc" - mount -o bind /sys "${DIRECTORY}/sys" - - # also mount dev - mount -o bind /dev "${DIRECTORY}/dev" - - if [ ! -z "${EFI_PARTITION}" ] - then - mkdir -p "${DIRECTORY}/boot/efi" - mount "/dev/mapper/loop0${EFI_PARTITION}" "${DIRECTORY}/boot/efi" - fi - # Disable dpkg syncing - -cat > "${DIRECTORY}/etc/dpkg/dpkg.cfg.d/${SOFTWARE}" << EOF -force-unsafe-io -EOF - - # Create policy-rc.d file - -cat > "${DIRECTORY}/usr/sbin/policy-rc.d" << EOF -#!/bin/sh -echo "All runlevel operations denied by policy" >&2 -exit 101 -EOF - - chmod 0755 "${DIRECTORY}/usr/sbin/policy-rc.d" - - # Upgrade system - Chroot "${DIRECTORY}" "apt update" - Chroot "${DIRECTORY}" "apt --yes --option Dpkg::Options::=--force-confnew upgrade" - Chroot "${DIRECTORY}" "apt --yes --option Dpkg::Options::=--force-confnew dist-upgrade" - - # Install systemd support packages - Chroot "${DIRECTORY}" "apt --yes install dbus libpam-systemd systemd-sysv" - - Chroot "${DIRECTORY}" "apt clean" -} - -Cleanup_system () -{ - DIRECTORY="${1}" - - Chroot "${DIRECTORY}" "apt --yes --purge autoremove" - Chroot "${DIRECTORY}" "apt clean" - - # Cleanup - rm -f "${DIRECTORY}/etc/dpkg/dpkg.cfg.d/${SOFTWARE}" - rm -f "${DIRECTORY}/usr/sbin/policy-rc.d" - - # Unmount pseudo-filesystems - umount -f "${DIRECTORY}/dev/pts" > /dev/null 2>&1 || true - # WARNING: dev/pts is still mounted! - umount -f "${DIRECTORY}/proc" > /dev/null 2>&1 || true - umount -f "${DIRECTORY}/sys" > /dev/null 2>&1 || true - umount -f "${DIRECTORY}/dev" > /dev/null 2>&1 || true - umount -f "${DIRECTORY}/boot/efi" > /dev/null 2>&1 || true -} - -Debconf () -{ - # Configure local debconf - mkdir -p "/tmp/${SOFTWARE}" - DEBCONF_TMPDIR="$(mktemp -d -p "/tmp/${SOFTWARE}" -t $(basename ${0}).XXXX)" - export DEBCONF_TMPDIR - - mkdir -p "${DEBCONF_TMPDIR}/debconf" - -cat > "${DEBCONF_TMPDIR}/debconf.systemrc" << EOF -Config: configdb -Templates: templatedb - -Name: config -Driver: File -Mode: 644 -Reject-Type: password -Filename: ${DEBCONF_TMPDIR}/debconf/config.dat - -Name: passwords -Driver: File -Mode: 600 -Backup: false -Required: false -Accept-Type: password -Filename: ${DEBCONF_TMPDIR}/debconf/passwords.dat - -Name: configdb -Driver: Stack -Stack: config, passwords - -Name: templatedb -Driver: File -Mode: 644 -Filename: ${DEBCONF_TMPDIR}/debconf/templates.dat -EOF - - DEBCONF_SYSTEMRC="${DEBCONF_TMPDIR}/debconf.systemrc" - export DEBCONF_SYSTEMRC -} - -Debootstrap () -{ - DIRECTORY="${1}" - - EXCLUDE="ifupdown" - INCLUDE="dbus,linux-image-amd64,grub-pc" - - # apt repositories - INCLUDE="${INCLUDE},gnupg" - - if ( echo "${MIRROR}" | grep -qs '^https' ) || \ - ( echo "${PARENT_MIRROR}" | grep -qs '^https' ) - then - INCLUDE="${INCLUDE},apt-transport-https,ca-certificates" - fi - - case "${MODE}" in - progress-linux) - INCLUDE="${INCLUDE},progress-linux,gnupg" - ;; - esac - - mkdir -p "$(dirname ${DIRECTORY})" - debootstrap --verbose --arch=${ARCHITECTURE} --components=${PARENT_ARCHIVE_AREAS} \ - --exclude=${EXCLUDE} --include=${INCLUDE} ${PARENT_DISTRIBUTION} "${DIRECTORY}" ${PARENT_MIRROR} -} - -Configure_apt () -{ - DIRECTORY="${1}" - - # Configure apt - rm -f "${DIRECTORY}/etc/apt/sources.list" - - PARENT_AREA="$(echo ${PARENT_ARCHIVE_AREAS} | sed -e 's|,| |g')" - PARENT_DIST="$(echo ${PARENT_DISTRIBUTION} | sed -e 's|-backports||')" - -cat > "${DIRECTORY}/etc/apt/sources.list.d/debian.list" << EOF -# /etc/apt/sources.list.d/debian.list - -deb ${PARENT_MIRROR} ${PARENT_DIST} ${PARENT_AREA} -EOF - - case "${MODE}" in - progress-linux) - -cat > "${DIRECTORY}/progress-linux.cfg" << EOF -progress-linux progress-linux/archives multiselect $(echo ${ARCHIVES} | sed -e 's| |, |g') -progress-linux progress-linux/archive-areas multiselect $(echo ${ARCHIVE_AREAS} | sed -e 's|,| |g') -EOF - - Chroot "${DIRECTORY}" "debconf-set-selections progress-linux.cfg" - Chroot "${DIRECTORY}" "DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=criticial dpkg-reconfigure progress-linux" - - rm -f "${DIRECTORY}/progress-linux.cfg" - - Chroot "${DIRECTORY}" "apt update" - ;; - esac -} - -Deconfigure_system () -{ - DIRECTORY="${1}" - - # Configure fstab - -cat > "${DIRECTORY}/etc/fstab" << EOF -# /etc/fstab: static file system information. -# -# Use 'blkid' to print the universally unique identifier for a -# device; this may be used with UUID= as a more robust way to name devices -# that works even if disks are added and removed. See fstab(5). -# -# <file system> <mount point> <type> <options> <dump> <pass> - -EOF - - # Fix /etc/mtab - rm -f "${DIRECTORY}/etc/mtab" - ln -s /proc/self/mounts "${DIRECTORY}/etc/mtab" - - # Removing resolv.conf - rm -f "${DIRECTORY}/etc/resolv.conf" - cp /etc/resolv.conf "${DIRECTORY}/etc" - - # Removing hosts/hostname - rm -f "${DIRECTORY}"/etc/hosts - rm -f "${DIRECTORY}"/etc/hostname - - # Removing openssh-server host keys - rm -f "${DIRECTORY}"/etc/ssh/ssh_host_*_key - rm -f "${DIRECTORY}"/etc/ssh/ssh_host_*_key.pub -} - -Configure_system () -{ - DIRECTORY="${1}" - - echo "${NAME}" > "${DIRECTORY}/etc/hostname" - - # Configure apt - rm -f "${DIRECTORY}/etc/apt/sources.list" - - PARENT_AREA="$(echo ${PARENT_ARCHIVE_AREAS} | sed -e 's|,| |g')" - PARENT_DIST="$(echo ${PARENT_DISTRIBUTION} | sed -e 's|-backports||')" - -cat > "${DIRECTORY}/etc/apt/sources.list.d/debian.list" << EOF -# /etc/apt/sources.list.d/debian.list - -deb ${PARENT_MIRROR} ${PARENT_DIST} ${PARENT_AREA} -EOF - - for PARENT_REPO in ${PARENT_ARCHIVES} - do - case "${PARENT_REPO}" in - buster-security) - echo "deb ${PARENT_MIRROR_SECURITY} ${PARENT_DIST}/updates ${PARENT_AREA}" >> "${DIRECTORY}/etc/apt/sources.list.d/debian.list" - ;; - - ${PARENT_DIST}-security) - echo "deb ${PARENT_MIRROR_SECURITY} ${PARENT_DIST}-security ${PARENT_AREA}" >> "${DIRECTORY}/etc/apt/sources.list.d/debian.list" - ;; - - ${PARENT_DIST}-updates) - echo "deb ${PARENT_MIRROR} ${PARENT_DIST}-updates ${PARENT_AREA}" >> "${DIRECTORY}/etc/apt/sources.list.d/debian.list" - ;; - - ${PARENT_DIST}-backports) - echo "deb ${PARENT_MIRROR} ${PARENT_DIST}-backports ${PARENT_AREA}" >> "${DIRECTORY}/etc/apt/sources.list.d/debian.list" - ;; - - ${PARENT_DIST}-proposed-updates) - echo "deb ${PARENT_MIRROR} ${PARENT_DIST}-proposed-updates ${PARENT_AREA}" >> "${DIRECTORY}/etc/apt/sources.list.d/debian.list" - ;; - - experimental) - echo "deb ${PARENT_MIRROR} experimental ${PARENT_AREA}" >> "${DIRECTORY}/etc/apt/sources.list.d/debian.list" - ;; - esac - done - - case "${MODE}" in - progress-linux) - -cat > "${DIRECTORY}/progress-linux.cfg" << EOF -progress-linux progress-linux/archives multiselect $(echo ${ARCHIVES} | sed -e 's| |, |g') -progress-linux progress-linux/archive-areas multiselect $(echo ${ARCHIVE_AREAS} | sed -e 's|,| |g') -EOF - - Chroot "${DIRECTORY}" "debconf-set-selections progress-linux.cfg" - Chroot "${DIRECTORY}" "DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=criticial dpkg-reconfigure progress-linux" - - rm -f "${DIRECTORY}/progress-linux.cfg" - ;; - esac - - if [ "${APT_RECOMMENDS}" = "false" ] - then - -cat > "${DIRECTORY}/etc/apt/apt.conf.d/recommends.conf" << EOF -APT::Install-Recommends "false"; -EOF - - fi - - # Add local archives configured from preseed file - if ls "${DEBCONF_TMPDIR}/apt"/*.list > /dev/null 2>&1 - then - cp "${DEBCONF_TMPDIR}/apt"/*.list "${DIRECTORY}/etc/apt/sources.list.d" - - if ls "${DEBCONF_TMPDIR}/apt"/*.key > /dev/null 2>&1 - then - for KEY in "${DEBCONF_TMPDIR}/apt"/*.key - do - cp "${KEY}" "${DIRECTORY}" - Chroot "${DIRECTORY}" "apt-key add $(basename ${KEY})" - rm -f "${DIRECTORY}/$(basename ${KEY})" - done - fi - - if ls "${DEBCONF_TMPDIR}/apt"/*.pref > /dev/null 2>&1 - then - cp "${DEBCONF_TMPDIR}/apt"/*.pref "${DIRECTORY}/etc/apt/preferences.d" - fi - fi - - Upgrade_system "${DIRECTORY}" - - # Preseed system - if [ -n "${PRESEED_FILE}" ] - then - for FILE in ${PRESEED_FILE} - do - if [ -e /usr/bin/kdig ] - then - DIG="/usr/bin/kdig" - elif [ -e /usr/bin/dig ] - then - DIG="/usr/bin/dig" - fi - - if [ -n "${DIG}" ] - then - IPV4_ADDRESS1="$(${DIG} A +short ${NAME} | tail -n1)" - IPV4_ADDRESS1_PART1="$(echo ${IPV4_ADDRESS1} | cut -d. -f1)" - IPV4_ADDRESS1_PART2="$(echo ${IPV4_ADDRESS1} | cut -d. -f2)" - IPV4_ADDRESS1_PART3="$(echo ${IPV4_ADDRESS1} | cut -d. -f3)" - IPV4_ADDRESS1_PART4="$(echo ${IPV4_ADDRESS1} | cut -d. -f4)" - - IPV6_ADDRESS1="$(${DIG} AAAA +short ${NAME} | tail -n1)" - # TODO: address parts - fi - - sed -e "s|@NAME@|${NAME}|g" \ - -e "s|@IPV4_ADDRESS1@|${IPV4_ADDRESS1}|g" \ - -e "s|@IPV4_ADDRESS1_PART1@|${IPV4_ADDRESS1_PART1}|g" \ - -e "s|@IPV4_ADDRESS1_PART2@|${IPV4_ADDRESS1_PART2}|g" \ - -e "s|@IPV4_ADDRESS1_PART3@|${IPV4_ADDRESS1_PART3}|g" \ - -e "s|@IPV4_ADDRESS1_PART4@|${IPV4_ADDRESS1_PART4}|g" \ - -e "s|@IPV6_ADDRESS1@|${IPV6_ADDRESS1}|g" \ - "${FILE}" >> "${DIRECTORY}/preseed.cfg" - done - - Chroot "${DIRECTORY}" "debconf-set-selections preseed.cfg" - - rm -f "${DIRECTORY}/preseed.cfg" - fi - - # Manual hack to workaround broken preseeding in locales package - if [ -n "${PRESEED_FILE}" ] - then - for FILE in ${PRESEED_FILE} - do - if grep -qs locales "${FILE}" - then - if Chroot "${DIRECTORY}" dpkg --get-selections | awk '{ print $1 }' | grep -qs '^locales$' - then - rm -f "${DIRECTORY}/etc/default/locale" "${DIRECTORY}/etc/locale.gen" - Chroot "${DIRECTORY}" "DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=criticial dpkg-reconfigure locales" - - break - fi - fi - done - fi - - # Manual hack to create conffiles when using locales-all instead of locales - if [ ! -e "${DIRECTORY}/etc/environment" ] - then - echo "LANG=C.UTF-8" >> "${DIRECTORY}/etc/environment" - fi - - if [ ! -e "${DIRECTORY}/etc/default/locale" ] - then - echo "LANG=C.UTF-8" >> "${DIRECTORY}/etc/default/locale" - fi - - # Manual hack to workaround broken preseeding in tzdata package - if [ -n "${PRESEED_FILE}" ] - then - for FILE in ${PRESEED_FILE} - do - if grep -qs tzdata "${FILE}" - then - rm -f "${DIRECTORY}/etc/localtime" "${DIRECTORY}/etc/timezone" - Chroot "${DIRECTORY}" "DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=criticial dpkg-reconfigure tzdata" - - break - fi - done - fi - - if [ -n "${PACKAGES}" ] - then - Chroot "${DIRECTORY}" "apt --option Dpkg::Options::=--force-confnew --yes install ${PACKAGES}" - fi - - # Manual hack to regenerate ssh keys - if Chroot "${DIRECTORY}" dpkg --get-selections | awk '{ print $1 }' | grep -qs '^openssh-server$' && \ - ! ls "${DIRECTORY}"/etc/ssh/ssh_host_*_key > /dev/null 2>&1 - then - Chroot "${DIRECTORY}" "DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=criticial dpkg-reconfigure openssh-server" - fi - - # container command - if [ -n "${CONTAINER_COMMAND}" ] - then - echo "${CONTAINER_COMMAND}" > "${DIRECTORY}/.container-command" - - chmod 0755 "${DIRECTORY}/.container-command" - Chroot "${DIRECTORY}" "sh /.container-command" - - rm -f "${DIRECTORY}/.container-command" - fi - - for NUMBER in $(seq 1 ${CONTAINER_COMMAND_NUMBER}) - do - eval COMMAND="$`echo CONTAINER_COMMAND${NUMBER}`" - - echo "${COMMAND}" > "${DIRECTORY}/.container-command" - - chmod 0755 "${DIRECTORY}/.container-command" - Chroot "${DIRECTORY}" "sh /.container-command" - - rm -f "${DIRECTORY}/.container-command" - done -} - -Configure_network () -{ - DIRECTORY="${1}" - - # Create /etc/resolv.conf - rm -f "${DIRECTORY}/etc/resolv.conf.tmp" - - if [ -n "${NAMESERVER_DOMAIN}" ] - then - echo "domain ${NAMESERVER_DOMAIN}" >> "${DIRECTORY}/etc/resolv.conf.tmp" - fi - - if [ -n "${NAMESERVER_SEARCH}" ] - then - echo "search ${NAMESERVER_SEARCH}" >> "${DIRECTORY}/etc/resolv.conf.tmp" - fi - - if [ -n "${NAMESERVER_SERVER}" ] - then - if [ -e "${DIRECTORY}/etc/resolv.conf.tmp" ] - then - echo "" >> "${DIRECTORY}/etc/resolv.conf.tmp" - fi - - for NAMESERVER in $(echo ${NAMESERVER_SERVER} | sed -e 's|,| |g') - do - echo "nameserver ${NAMESERVER}" >> "${DIRECTORY}/etc/resolv.conf.tmp" - done - fi - - if [ -n "${NAMESERVER_OPTIONS}" ] - then - if [ -e "${DIRECTORY}/etc/resolv.conf.tmp" ] - then - echo "" >> "${DIRECTORY}/etc/resolv.conf.tmp" - fi - - echo "options ${NAMESERVER_OPTIONS}" >> "${DIRECTORY}/etc/resolv.conf.tmp" - fi - - if [ -e "${DIRECTORY}/etc/resolv.conf.tmp" ] - then - mv "${DIRECTORY}/etc/resolv.conf.tmp" "${DIRECTORY}/etc/resolv.conf" - fi - - # Create /etc/hosts - rm -f "${DIRECTORY}/etc/hosts.tmp" - - if [ -n "${NETWORK1_IPV4_ADDRESS}" ] - then - -cat >> "${DIRECTORY}/etc/hosts.tmp" << EOF -${NETWORK1_IPV4_ADDRESS} ${NAME} -EOF - - fi - - if [ -n "${NETWORK1_IPV6_ADDRESS}" ] - then - -cat >> "${DIRECTORY}/etc/hosts.tmp" << EOF -${NETWORK1_IPV6_ADDRESS} ${NAME} -EOF - - fi - - if [ -n "${NETWORK1_IPV4_ADDRESS}" ] || [ -n "${NETWORK1_IPV6_ADDRESS}" ] - then - echo >> "${DIRECTORY}/etc/hosts.tmp" - fi - - if [ -z "${NETWORK1_IPV4_ADDRESS}" ] && [ -z "${NETWORK1_IPV6_ADDRESS}" ] - then - # localhost only - -cat > "${DIRECTORY}/etc/hosts.tmp" << EOF -127.0.0.1 localhost ${NAME} -::1 localhost ${NAME} -EOF - - else - -cat > "${DIRECTORY}/etc/hosts.tmp" << EOF -127.0.0.1 localhost -::1 localhost -EOF - - fi - -cat >> "${DIRECTORY}/etc/hosts.tmp" << EOF - -# The following lines are desirable for IPv6 capable hosts -::1 ip6-localhost ip6-loopback -fe00::0 ip6-localnet -ff00::0 ip6-mcastprefix -ff02::1 ip6-allnodes -ff02::2 ip6-allrouters -EOF - - mv "${DIRECTORY}/etc/hosts.tmp" "${DIRECTORY}/etc/hosts" -} - -Configure_systemd_networkd () -{ - DIRECTORY="${1}" - - # Enable systemd-networkd - chroot "${DIRECTORY}" systemctl enable systemd-networkd - - for NUMBER in $(seq 1 ${NETWORK_NUMBER}) - do - eval IPV4_COMMENT="$`echo NETWORK${NUMBER}_IPV4_COMMENT`" - eval IPV4_METHOD="$`echo NETWORK${NUMBER}_IPV4_METHOD`" - eval IPV4_ADDRESS="$`echo NETWORK${NUMBER}_IPV4_ADDRESS`" - eval IPV4_GATEWAY="$`echo NETWORK${NUMBER}_IPV4_GATEWAY`" - eval IPV4_NETMASK="$`echo NETWORK${NUMBER}_IPV4_NETMASK`" - eval IPV4_POST_UP="$`echo NETWORK${NUMBER}_IPV4_POST_UP`" - eval IPV4_POST_DOWN="$`echo NETWORK${NUMBER}_IPV4_POST_DOWN`" - - eval IPV6_COMMENT="$`echo NETWORK${NUMBER}_IPV6_COMMENT`" - eval IPV6_METHOD="$`echo NETWORK${NUMBER}_IPV6_METHOD`" - eval IPV6_ADDRESS="$`echo NETWORK${NUMBER}_IPV6_ADDRESS`" - eval IPV6_GATEWAY="$`echo NETWORK${NUMBER}_IPV6_GATEWAY`" - eval IPV6_NETMASK="$`echo NETWORK${NUMBER}_IPV6_NETMASK`" - eval IPV6_POST_UP="$`echo NETWORK${NUMBER}_IPV6_POST_UP`" - eval IPV6_POST_DOWN="$`echo NETWORK${NUMBER}_IPV6_POST_DOWN`" - - if [ "${IPV4_METHOD}" != "none" ] || [ "${IPV6_METHOD}" != "none" ] - then - -cat > "${DIRECTORY}/etc/systemd/network/eno${NUMBER}.network" << EOF -[Match] -Name=eno${NUMBER} -EOF - - fi - - if [ -n "${IPV4_METHOD}" ] && [ "${IPV4_METHOD}" != "none" ] - then - -cat >> "${DIRECTORY}/etc/systemd/network/eno${NUMBER}.network" << EOF - -[Network] -EOF - - if [ -n "${IPV4_COMMENT}" ] - then - echo "Description=${IPV4_COMMENT}" >> "${DIRECTORY}/etc/systemd/network/eno${NUMBER}.network" - fi - - case "${IPV4_METHOD}" in - dhcp) - -cat >> "${DIRECTORY}/etc/systemd/network/eno${NUMBER}.network" << EOF -DHCP=ipv4 -EOF - - ;; - - static) - -cat >> "${DIRECTORY}/etc/systemd/network/eno${NUMBER}.network" << EOF -DHCP=no -Address=${IPV4_ADDRESS}/${IPV4_NETMASK} -EOF - - if [ -n "${IPV4_GATEWAY}" ] - then - -cat >> "${DIRECTORY}/etc/systemd/network/eno${NUMBER}.network" << EOF -Gateway=${IPV4_GATEWAY} -EOF - - fi - ;; - esac - - if [ -n "${IPV4_POST_UP}" ] - then - -cat > "${DIRECTORY}/etc/systemd/system/cnt-ipv4-post-up-eno${NUMBER}.service" << EOF -[Unit] -Description=${SOFTWARE} IPV4_POST_UP -After=network-online.target -Wants=network-online.target - -[Service] -Type=oneshot -ExecStart=/bin/sh -c "${IPV4_POST_UP}" - -[Install] -WantedBy=multi-user.target -EOF - - chroot "${DIRECTORY}" systemctl enable cnt-ipv4-post-up-eno${NUMBER}.service - fi - - if [ -n "${IPV4_POST_DOWN}" ] - then - -cat > "${DIRECTORY}/etc/systemd/system/cnt-ipv4-post-down-eno${NUMBER}.service" << EOF -[Unit] -Description=${SOFTWARE} IPV4_POST_DOWN -After=network.target -Wants=network.target - -[Service] -Type=oneshot -ExecStart=/bin/sh -c "${IPV4_POST_DOWN}" - -[Install] -WantedBy=multi-user.target -EOF - - chroot "${DIRECTORY}" systemctl enable cnt-ipv4-post-down-eno${NUMBER}.service - fi - fi - - if [ -n "${IPV6_METHOD}" ] && [ "${IPV6_METHOD}" != "none" ] - then - -cat >> "${DIRECTORY}/etc/systemd/network/eno${NUMBER}.network" << EOF - -[Network] -EOF - - if [ -n "${IPV6_COMMENT}" ] - then - echo "Description=${IPV6_COMMENT}" >> "${DIRECTORY}/etc/systemd/network/eno${NUMBER}.network" - fi - - case "${IPV6_METHOD}" in - dhcp) - -cat >> "${DIRECTORY}/etc/systemd/network/eno${NUMBER}.network" << EOF -DHCP=ipv6 -EOF - - ;; - - static) - -cat >> "${DIRECTORY}/etc/systemd/network/eno${NUMBER}.network" << EOF -DHCP=no -IPv6AcceptRA=no -Address=${IPV6_ADDRESS}/${IPV6_NETMASK} -EOF - - if [ -n "${IPV6_GATEWAY}" ] - then - -cat >> "${DIRECTORY}/etc/systemd/network/eno${NUMBER}.network" << EOF -Gateway=${IPV6_GATEWAY} -EOF - - fi - ;; - esac - - if [ -n "${IPV6_POST_UP}" ] - then - -cat > "${DIRECTORY}/etc/systemd/system/cnt-ipv6-post-up-eno${NUMBER}.service" << EOF -[Unit] -Description=${SOFTWARE} IPV6_POST_UP -After=network-online.target -Wants=network-online.target - -[Service] -Type=oneshot -ExecStart=/bin/sh -c "${IPV6_POST_UP}" - -[Install] -WantedBy=multi-user.target -EOF - - chroot "${DIRECTORY}" systemctl enable cnt-ipv6-post-up-eno${NUMBER}.service - fi - - if [ -n "${IPV6_POST_DOWN}" ] - then - -cat > "${DIRECTORY}/etc/systemd/system/cnt-ipv6-post-down-eno${NUMBER}.service" << EOF -[Unit] -Description=${SOFTWARE} IPV6_POST_DOWN -After=network.target -Wants=network.target - -[Service] -Type=oneshot -ExecStart=/bin/sh -c "${IPV6_POST_DOWN}" - -[Install] -WantedBy=multi-user.target -EOF - - chroot "${DIRECTORY}" systemctl enable cnt-ipv6-post-down-eno${NUMBER}.service - fi - fi - - NUMBER="$((${NUMBER} + 1))" - done -} Commands () { @@ -981,166 +166,11 @@ Commands () sed -i -e "/^register=.*/ a cnt.network-bridge=${HOST_INTERFACE_NAME}:${BRIDGE:-bridge${NUMBER}}" "${CONFIG}/${NAME}.conf" done fi - - # Setting root password - echo root:${ROOT_PASSWORD} | chroot "${DIRECTORY}" chpasswd - - # Host command - if [ -n "${HOST_COMMAND}" ] - then - echo "${HOST_COMMAND}" > "${DIRECTORY}/.host-command" - - cd "${DIRECTORY}" - sh "${DIRECTORY}/.host-command" - cd "${OLDPWD}" - - rm -f "${DIRECTORY}/.host-command" - fi - - for NUMBER in $(seq 1 ${HOST_COMMAND_NUMBER}) - do - eval COMMAND="$`echo HOST_COMMAND${NUMBER}`" - - echo "${COMMAND}" > "${DIRECTORY}/.host-command" - - cd "${DIRECTORY}" - sh "${DIRECTORY}/.host-command" - cd "${OLDPWD}" - - rm -f "${DIRECTORY}/.host-command" - done - - # Show root password in case its automatically set - case "${ROOT_RANDOM_PASSWORD}" in - true) - echo "${NAME}: root password set to '${ROOT_PASSWORD}'." - ;; - esac } -# Trap function -trap 'Umount' EXIT HUP INT QUIT TERM - -umask 0022 - -export NAME - -Debconf - -# Pre hooks -for FILE in "${HOOKS}/pre-${SCRIPT}".* "${HOOKS}/${NAME}.pre-${SCRIPT}" -do - if [ -x "${FILE}" ] - then - "${FILE}" - fi -done - -# Run debconf parts -for DEBCONF_SCRIPT in "/usr/share/${SOFTWARE}/scripts/debconf.d"/* -do - if [ -x "${DEBCONF_SCRIPT}" ] - then - "${DEBCONF_SCRIPT}" - fi -done - -# Read-in configuration from debconf -. "${DEBCONF_TMPDIR}/debconf.default" - -CACHE="/var/cache/${PROGRAM}/${MODE}" -SYSTEM="${MACHINES}/${NAME}" - ## Generic parts -if [ ! -e "${CACHE}/${DISTRIBUTION}_${ARCHITECTURE}" ] -then - Debootstrap "${CACHE}/${DISTRIBUTION}_${ARCHITECTURE}.tmp" - Configure_apt "${CACHE}/${DISTRIBUTION}_${ARCHITECTURE}.tmp" - Deconfigure_system "${CACHE}/${DISTRIBUTION}_${ARCHITECTURE}.tmp" - - mv "${CACHE}/${DISTRIBUTION}_${ARCHITECTURE}.tmp" "${CACHE}/${DISTRIBUTION}_${ARCHITECTURE}" -fi -Upgrade_system "${CACHE}/${DISTRIBUTION}_${ARCHITECTURE}" || echo "W: If upgrading the system failed, try removing the cache for your distribution in /var/cache/${PROGRAM}" -Cleanup_system "${CACHE}/${DISTRIBUTION}_${ARCHITECTURE}" +#copy base image -# FIXME workaround: /dev/pts in CACHE is still mounted without the following line -umount -f "${DIRECTORY}/dev/pts" > /dev/null 2>&1 || true - -## Specific parts -Create_Disk -Mount_Disk - -# FIXME this is evil -cp -a "${CACHE}/${DISTRIBUTION}_${ARCHITECTURE}/"* "${MACHINES}/${NAME}/" - -Configure_system "${MACHINES}/${NAME}" -Configure_network "${MACHINES}/${NAME}" -Configure_systemd_networkd "${MACHINES}/${NAME}" - -# Configure fstab - -# FIXME DIRECTORY -cat > "${DIRECTORY}/etc/fstab" << EOF -# /etc/fstab: static file system information. -# -# Use 'blkid' to print the universally unique identifier for a -# device; this may be used with UUID= as a more robust way to name devices -# that works even if disks are added and removed. See fstab(5). -# -# <file system> <mount point> <type> <options> <dump> <pass> - -UUID=$(lsblk --fs --noheadings --output UUID /dev/mapper/loop0${SYSTEM_PARTITION}) / ext4 errors=remount-ro 0 1 -EOF - - -# configure grub -cat > "${MACHINES}/${NAME}/tmp/device.map" << EOF -(hd0) /dev/loop0 -(hd0,gpt1) /dev/mapper/loop0p1 -(hd0,gpt2) /dev/mapper/loop0p2 -EOF - -case "${BOOT_METHOD}" in - bios) - grub-install \ - --no-floppy \ - --grub-mkdevicemap="${MACHINES}/${NAME}/tmp/device.map" \ - --modules="biosdisk part_gpt ext2 configfile normal multiboot" \ - --root-directory="${MACHINES}/${NAME}" \ - /dev/loop0 - ;; - - efi) - # FIXME - chroot "${MACHINES}/${NAME}" /bin/sh -c 'DEBIAN_FRONTEND=noninteractive; apt-get install grub-efi -y' - chroot "${MACHINES}/${NAME}" grub-install --efi-directory=/boot/efi --no-bootsector --target x86_64-efi --no-nvram --no-uefi-secure-boot --force-extra-removable - - # FIXME DIRECTORY - echo "UUID=$(lsblk --fs --noheadings --output UUID /dev/mapper/loop0${EFI_PARTITION}) /boot/efi vfat umask=0077 0 0" >> "${DIRECTORY}/etc/fstab" - ;; - - *) - echo "Error, unrecognized BOOT_METHOD" >&2 - exit 1 -esac - -chroot "${MACHINES}/${NAME}" update-grub - - -Cleanup_system "${MACHINES}/${NAME}" - -Commands "${MACHINES}/${NAME}" - -# remove debconf temporary files -rm --preserve-root --one-file-system -rf "${DEBCONF_TMPDIR}" -rmdir --ignore-fail-on-non-empty "/tmp/${SOFTWARE}" 2>&1 || true - -# Post hooks -for FILE in "${HOOKS}/post-${SCRIPT}".* "${HOOKS}/${NAME}.post-${SCRIPT}" -do - if [ -x "${FILE}" ] - then - "${FILE}" - fi -done +BASE_IMAGE="/srv/qemu/vEOS-lab.vmdk" +cp "${BASE_IMAGE}" "${MACHINES}/${NAME}.vmdk" diff --git a/share/doc/examples/arista-leaf.conf.in b/share/config/vm-veos-leaf.conf.in index 8f650b8..8f650b8 100644 --- a/share/doc/examples/arista-leaf.conf.in +++ b/share/config/vm-veos-leaf.conf.in |