summaryrefslogtreecommitdiffstats
path: root/server/modules/hdd-boot/opt/openslx/scripts/systemd-hdd_boot
blob: f3f05a6cb93d69c4198f170a6a27b198f0b74089 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/bin/bash

# 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 <<EOF >> /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