Well, I’ve been tinkering with a way to “unify” the way we deploy new OpenSUSE/SLES ISOs onto our installation server, once they are released. So here, I’ll show you the script I came up with:

  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
117
118
119
120
121
122
123
124
125
126
127
128
#!/bin/bash

TFTP_DIR=/srv/tftpboot
INSTSRC_DIR=/srv/instsrc

if [ -z $@ ] ; then
  echo "Usage: register-suse <path to iso-file> labelname"
  exit 1
fi

ISO_FILE=$1

mkdir /mnt/loop
mount -o loop $ISO_FILE /mnt/loop

# Determine ISO information
OS_LABEL="$( grep '^LABEL' /mnt/loop/content | cut -d  -f10- )"
if [ -z "$OS_LABEL" ] ; then
  OS_LABEL="$( grep '^LABEL' /mnt/loop/content | cut -d  -f2- | head -n1 )"
fi

OS_NAME="$( grep '^DISTRIBUTION' /mnt/loop/content | cut -d  -f3- | tr '[:upper:]' '[:lower:]' )"

if [ -z "$OS_NAME" ] ; then
  OS_NAME="$( grep '^PRODUCT' /mnt/loop/content | cut -d  -f2- | cut -d_ -f1-2 | tr '[:upper:]' '[:lower:]' )"
fi

case "$OS_NAME" in
  suse_sle|suse_sles) OS_NAME=sles;;
esac

OS_RELEASE="$( grep ^VERSION /mnt/loop/content | awk '{ print $2 }' | cut -d- -f1 )"

if [ "$( echo $OS_LABEL | grep -i vmware )" != "" ] ; then
  OS_RELEASE="$OS_RELEASE-vmware"
fi

OS_ARCH="$( grep ^BASEARCHS /mnt/loop/content | awk '{ print $2 }' )"

if [ -z "$OS_ARCH" ] ; then
  OS_ARCH="$( grep ^DEFAULTBASE /mnt/loop/content | awk '{ print $2 }' )"
fi

OS_SHORTLABEL="$( grep ^SHORTLABEL /mnt/loop/content | awk '{ print $2 }' | cut -d( -f1 | sed -e "s,SLES-,SLES," -e "s,-, ,g" )"

case "$OS_ARCH" in
  i*86) OS_ARCH=x86;;
  x86_64) OS_ARCH=x64;;
esac

# Create directories
mkdir -p $TFTP_DIR/boot/$OS_NAME/$OS_RELEASE/$OS_ARCH
mkdir -p $TFTP_DIR/pxelinux.cfg/$OS_NAME
mkdir -p $INSTSRC_DIR/$OS_NAME/$OS_RELEASE/$OS_ARCH

# Copy CD/DVD content
rsync -av /mnt/loop/* $INSTSRC_DIR/$OS_NAME/$OS_RELEASE/$OS_ARCH/

# Create the info file
cat > $INSTSRC_DIR/$OS_NAME/$OS_RELEASE/$OS_ARCH/info <<EOF
Language: en_US
Keytable: de-lat1-nd
Install: http://install.home.barfoo.org/{INSTSRC_DIR//srv/}/$OS_NAME/$OS_RELEASE/$OS_ARCH/
Autoyast: http://install.home.barfoo.org/autoyast/
Textmode: 1
EOF

# Copy the PXE boot file (initrd/kernel)
cp $INSTSRC_DIR/$OS_NAME/$OS_RELEASE/$OS_ARCH/boot/*/loader/initrd
  $TFTP_DIR/boot/$OS_NAME/$OS_RELEASE/$OS_ARCH/initrd

cp $INSTSRC_DIR/$OS_NAME/$OS_RELEASE/$OS_ARCH/boot/*/loader/linux
  $TFTP_DIR/boot/$OS_NAME/$OS_RELEASE/$OS_ARCH/linux

# Create the PXE boot menu
cat > $TFTP_DIR/pxelinux.cfg/$OS_NAME/$OS_NAME-$OS_RELEASE-$OS_ARCH.menu << EOF

#LABEL $OS_SHORTLABEL
#OSNAME $OS_NAME
#OSARCH $OS_ARCH

MENU TITLE Linux Installationservices
MENU BACKGROUND addons/background-suse.png

MENU COLOR screen       37;40  #80ffffff #00000000
MENU COLOR border           0  #ffffffff #ee000000 std
MENU COLOR title            0  #ffffffff #ee000000 std
MENU COLOR unsel            0  #ffffffff #ee000000 std
MENU COLOR sel              0  #ffffffff #85000000 std
MENU COLOR scrollbar    30;44  #40000000 #00000000
MENU COLOR tabmsg           0  #ee000000 #ffffffff std
MENU COLOR cmdmark          0  #ff00ff00 #00000000 std
MENU COLOR cmdline          0  #ee000000 #ffffffff std
MENU COLOR timeout_msg      0  #ee000000 #ffffffff std
MENU COLOR timeout          0  #ee000000 #ffffffff std
MENU COLOR disabled         0  #ffffffff #ee000000 std
MENU COLOR pwdheader        0  #ff000000 #99ffffff rev
MENU COLOR pwdborder        0  #ff000000 #99ffffff rev
MENU COLOR pwdentry         0  #ff000000 #99ffffff rev
MENU COLOR hotkey           0  #ff00ff00 #ee000000 std
MENU COLOR hotsel           0  #ffffffff #85000000 std

LABEL DESC
  MENU LABEL $OS_LABEL ($OS_ARCH)
  MENU DISABLE

MENU SEPARATOR

LABEL autoyast
  MENU LABEL ^Automatisierte Installation
  KERNEL boot/$OS_NAME/$OS_RELEASE/$OS_ARCH/linux
  APPEND initrd=boot/$OS_NAME/$OS_RELEASE/$OS_ARCH/initrd info=http://install.home.barfoo.org/${INSTSRC_DIR//srv/}/$OS_NAME/$OS_RELEASE/$OS_ARCH/info splash=native ramdisk_size=65535 vga=791 barrier=off

LABEL netinst
  MENU LABEL ^Netzwerkbasierte Installation
  KERNEL boot/$OS_NAME/$OS_RELEASE/$OS_ARCH/linux
  APPEND initrd=boot/$OS_NAME/$OS_RELEASE/$OS_ARCH/initrd install=http://install.home.barfoo.org/${INSTSRC_DIR//srv/}/$OS_NAME/$OS_RELEASE/$OS_ARCH/ splash=native ramdisk_size=65535 vga=791 barrier=off

MENU SEPARATOR

LABEL back
  MENU LABEL <-- ^Vorherige Ansicht
  KERNEL addons/vesamenu.c32
  APPEND pxelinux.cfg/$OS_NAME.menu
EOF

umount /mnt/loop
rmdir /mnt/loop

This also needs a second script, as this will only create a menu entry, not the menu itself. You’ll find the script in the next post!