#!/bin/bash set -x # Downloading all in SLX_BASE_PATH to /boot Example: Ubuntu_1404_x64 # wget -N, update if the file has been changed boot_download () { echo "Downloading $SLX_BASE_PATH ................." wget -P /boot -N -r --tries=3 --timeout=5 --quiet -nH -l1 --no-parent --reject="index.html*" --reject="$SLX_BASE_PATH.*" $SLXSRV/$SLX_BASE_PATH #<---- ok =), but try with -nc too RET=$? [ $RET != 0 ] && { echo "Error - downloading 'http://$SLXSRV/$SLX_BASE_PATH/' via wget failed."; exit 1; } ||{ echo "Successfully downloaded 'http://$SLXSRV/$SLX_BASE_PATH' via wget."; return 0; } } # Getting informations from cmdline read KCL < "/proc/cmdline" for opts in ${KCL}; do case "${opts}" in slxbase=*) # BASE_PATH Example Ubuntu_1404_x64 SLX_BASE_PATH=${opts#slxbase=} ;; slxsrv=*) #SLX IP server info SLXSRV=${opts#slxsrv=} ;; BOOT_IMAGE=*) BOOT_IMAGE=${opts} ;; initrd=*) initrd=${opts} ;; esac done KCL=$(echo "$KCL" | sed "s|SLX_BASE_PATH|$SLX_BASE_PATH|g;s|$BOOT_IMAGE||g;s|$initrd||g") # Scan vm-store dir for vmware image xmls and copy if [ -d /cache/export/dnbd3 -a -d /mnt/vmstore ]; then [ ! -d /boot/vmstore ] && mkdir /boot/vmstore for FILE in $(find /cache/export/dnbd3 -iname "*.vmdk*" ! -iname "*map"); do [ -e "${FILE}.map" ] && continue image_name=$(echo $(basename "$FILE") | cut -d "." -f1) cd /mnt/vmstore for XML in $(grep -rIl --include "*.xml" "$image_name" .); do xmldir=$(dirname $XML) mkdir -p /boot/vmstore/${xmldir} cp $XML /boot/vmstore/${xmldir}/ done cd - >/dev/null done fi # Bind mount available vmstore in /boot to /mnt/vmstore if not already present if ! grep -qs '/mnt/vmstore' /proc/mounts; then [ ! -d /mnt/vmstore ] && mkdir -p /mnt/vmstore [ -d /boot/vmstore ] && mount --bind /boot/vmstore /mnt/vmstore fi # if SLX_BASE_PATH already exists, just update. Does not make the menu again. [ -d /boot/$SLX_BASE_PATH ] && { boot_download; echo "$SLX_BASE_PATH updated"; } || { boot_download; echo "New base $SLX_BASE_PATH downloaded to HDD"; } # Installing GRUB #Find disk of /boot BOOT_DISK=$(df | grep /boot | awk '{print $1}' | tr -d '[0-9]' | cut -c 6-) BOOT_PART=$(df | grep /boot | awk '{print $1}' | tr -dc '[0-9]') [ -z "$BOOT_DISK" ] && { echo "BOOT DISK could not be found, exiting."; exit 1; } #Check if disk is msdos or GPT if sgdisk /dev/$BOOT_DISK | grep -qs 'invalid GPT'; then BOOT_TYPE='msdos' else BOOT_TYPE='gpt' fi if [ ! -d /boot/grub ]; then grub-install --boot-directory=/boot /dev/$BOOT_DISK update-grub-gfxpayload RET=$? [ $RET != 0 ] && { echo "Could not install GRUB"; exit 1; } || echo "GRUB successfully installed" # First, copy grub.cfg [ -e /opt/openslx/hdd-boot/grub.cfg ] && cp -r /opt/openslx/hdd-boot/grub.cfg /boot/grub/ fi #Add new base to grub.cfg if ! grep -qs "menuentry '$SLX_BASE_PATH'" /boot/grub/grub.cfg; then #GRUB ok, so lets make the menu echo "BOOT DISK is $BOOT_DISK" #Just for test case $BOOT_DISK in sda) GRUB_DISK=hd0 ;; sdb) GRUB_DISK=hd1 ;; sdc) GRUB_DISK=hd2 ;; sdd) GRUB_DISK=hd3 ;; sde) GRUB_DISK=hd4 ;; *) echo "GRUB_DISK was not found" exit 1 ;; esac [ -e /boot/grub/grub.cfg ] || { echo "Could not find grub.cfg"; exit 1; } cat <> /boot/grub/grub.cfg ######################### menuentry '$SLX_BASE_PATH' { linux ($GRUB_DISK,${BOOT_TYPE}$BOOT_PART)/$SLX_BASE_PATH/kernel hdd_boot=${BOOT_DISK}$BOOT_PART $KCL initrd ($GRUB_DISK,${BOOT_TYPE}$BOOT_PART)/$SLX_BASE_PATH/initramfs-stage31 } ######################### EOF fi true