#!/bin/sh . /etc/init.d/rc.functions check_status() { status=$? if [ $status = 0 ]; then echo "------ done ------" else echo -e "\n====== failed ======\n" if [ "$INSTALL_OUT" = "vdr" ]; then svdrpsend.sh MESG "$(tr 'the last action failed')" >/dev/null else echo "$(tr 'the last action failed')" >&3 fi fi return $status } message() { if [ "$INSTALL_OUT" = "vdr" ]; then kill $state_pid 2>/dev/null && sleep 1 svdrpsend.sh "PLUG addons MESG $1" >/dev/null if [ -n "$2" ]; then i=0 while true; do test $i -gt 0 && svdrpsend.sh "PLUG addons MESG $1$(echo ' ...' | cut -b 1-$(($i+1))) " >/dev/null i=$(($i%3+1)) sleep 1 done & state_pid=$! fi else echo $1 >&3 fi echo -e "\n==$1==" } ask() { if [ "$INSTALL_OUT" = "vdr" ]; then kill $state_pid 2>/dev/null sleep 1 svdrpsend.sh "PLUG addons ASK $1" | grep -q yes #send ask -s -t 10 "$1" #test $? -eq 2 return $? elif [ "$INSTALL_OUT" = "webserver" ]; then return 0 else echo -n "$1 [Y/n] " >&3; read yn test "$yn" = "Y" -o "$yn" = "y" -o "$yn" = "" return $? fi } unmount() { disk=$1 mount | grep /dev/$disk | cut -d " " -f 1 | while read dev; do echo -e "\n==unmount $dev==" umount $dev; done } partitionDisk() { disk=$1 file=$2 size=$(test -n "$3" && echo "${3%B}" || echo "1G") message "$(tr 'partitioning disk $disk')" 1 ( set -e test -e /etc/hotplug/block.agent && mv /etc/hotplug/block.agent /etc/hotplug/block.agent.bak dd if=/dev/zero of=/dev/$disk bs=1024 count=1024 if [ $(($(fdisk -l /dev/$disk | grep "^Disk" | head -n1 | cut -d " " -f 5)/1000000)) -lt 10000 ]; then # Festplatte ist kleiner als 10GB, nur eine Patition anlegen echo -e "n\np\n3\n\n+1K\n n\np\n1\n\n\n d\n3\n a\n1\n w" | fdisk -H 64 -S 32 /dev/$disk echo "${disk}1 ${disk}1" > $file else echo -e "n\np\n3\n\n+1K\n n\np\n1\n\n+$size\n n\np\n2\n\n\n d\n3\n a\n1\n w" | fdisk -H 64 -S 32 /dev/$disk echo "${disk}1 ${disk}2" > $file fi blockdev --rereadpt /dev/$disk mdev -s test -e /etc/hotplug/block.agent.bak && mv /etc/hotplug/block.agent.bak /etc/hotplug/block.agent fdisk -ul /dev/$disk ); check_status return $? } formatDisk() { disk=$1 typ=$2 message "$(tr 'format disk $disk')" 1 ( set -e mkfs.$typ /dev/$disk $(test "$typ" = "xfs" && echo "-f") ); check_status return $? } copySystem() { system=$1 data=${2-$1} leave_installer=$3 message "$(tr 'install system on $system')" 1 ( set -e mkdir -p /mnt/$system mount /dev/$system /mnt/$system if mount | grep /dev/$system | grep -q "ext"; then rm -rf /mnt/$system/mld-$SYSTEM_VERSION mkdir -p /mnt/$system/mld-$SYSTEM_VERSION ln -fs mld-$SYSTEM_VERSION /mnt/$system/mld cp -r /mnt/system/* /mnt/$system/mld/ cp /etc/addons/* /mnt/$system/mld/etc/addons/ if [ -e /mnt/$system/mld/boot/initrd ]; then ( cd /mnt/$system/mld/boot mv initrd *_initramfs* ln -s *_initramfs* initramfs mv kernel *_kernel* ln -s *_kernel* kernel ) fi else rm -rf /mnt/$system/mld mkdir -p /mnt/$system/mld cp -r /mnt/system/* /mnt/$system/mld/ cp /etc/addons/* /mnt/$system/mld/etc/addons/ fi if [ "$leave_installer" != "1" ]; then rm /mnt/$system/mld/etc/addons/*_install* sed "/_install/d" -i /mnt/$system/mld/etc/addons/active fi grep -B 100 -A 1 "### Local settings ###" /etc/rc.config > /mnt/$system/mld/etc/rc.config if [ "$data" != "$system" ]; then cp /etc/fstab /mnt/$system/mld/etc/ dev=`blkid | grep /dev/$data | sed 's/.*UUID="\([^"]*\).*/UUID=\1/'` test -z "$dev" && dev=/dev/$data echo "$dev /mnt/data auto defaults 0 2" >> /mnt/$system/mld/etc/fstab mkdir -p /mnt/$system/mld/mnt/data else mkdir -p /mnt/$system/mld/mnt fi cp -r /boot/isolinux/* /mnt/$system/mld/boot/isolinux/ rm -f /mnt/$system/mld/boot/isolinux/isolinux.* /mnt/$system/mld/boot/isolinux/boot.cat dev=`blkid | grep /dev/$system | sed 's/.*UUID="\([^"]*\).*/UUID=\1/'` sed -e "s|root=\S*|root=$dev|g" -i /mnt/$system/mld/boot/isolinux/extlinux.conf if mount | grep /dev/$system | grep -q "ext"; then sed -e "s|/boot/initrd|/boot/initramfs|g" -i /mnt/$system/mld/boot/isolinux/extlinux.conf else sed -e "s|/boot/initramfs|/boot/initrd|g" -i /mnt/$system/mld/boot/isolinux/extlinux.conf fi umount /mnt/$system ); check_status return $? } writeBootblock() { system=$1 dev=$2 message "$(tr 'write bootblock on $dev')" 1 ( set -e mkdir -p /mnt/$system mount /dev/$system /mnt/$system if mount | grep /dev/$system | grep -q "ext"; then extlinux --install /mnt/$system/mld/boot/isolinux else syslinux -d /mld/boot/isolinux /dev/$system fi if fdisk -l | grep /dev/$dev | grep -q "GPT"; then cat /usr/lib/syslinux/gptmbr.bin > /dev/$dev else cat /usr/lib/syslinux/mbr.bin > /dev/$dev fi umount /mnt/$system ); check_status return $? } automatic() { sed "/^INSTALL_/d" -i /etc/rc.config if [ -z "$INSTALL_HDD" ]; then exit fi INSTALL_HDD=${INSTALL_HDD%%:*} if [ "$INSTALL_OUT" = "vdr" ]; then svdrpsend.sh HITK menu >/dev/null fi ask "$(tr 'install MLD on disk $INSTALL_HDD ?')" || exit message "$(tr 'start installation')" unmount $INSTALL_HDD partitionDisk $INSTALL_HDD /tmp/partitions $INSTALL_SYSTEM_SIZE || exit 1 read system data < /tmp/partitions rm /tmp/partitions sleep 1 unmount $INSTALL_HDD formatDisk $system ext4 || exit 2 if [ "$data" != "$system" ]; then unmount $INSTALL_HDD formatDisk $data xfs || exit 3 fi copySystem $system $data $INSTALL_LEAVE_INSTALLER || exit 4 writeBootblock $system $INSTALL_HDD || exit 5 if [ "$INSTALL_OUT" = "vdr" ]; then ask "$(tr 'Installation completed. Boot installed system ?')" || exit message "$(tr 'reboot system')" sleep 3 reboot else message "$(tr 'Installation completed')" fi } manual() { sed "/^INSTALL_/d" -i /etc/rc.config INSTALL_PARTITION_HDD=${INSTALL_PARTITION_HDD%%:*} INSTALL_SYSTEM_PARTITION=${INSTALL_SYSTEM_PARTITION%%:*} INSTALL_DATA_PARTITION=${INSTALL_DATA_PARTITION%%:*} INSTALL_BOOTBLOCK_HDD=${INSTALL_BOOTBLOCK_HDD%%:*} if [ "$INSTALL_OUT" = "vdr" ]; then svdrpsend.sh HITK menu >/dev/null fi # ask "$(tr 'install MLD on selected disk ?')" || exit message "$(tr 'start installation')" if [ -n "$INSTALL_PARTITION_HDD" ]; then INSTALL_PARTITION_HDD=${INSTALL_PARTITION_HDD%%:*} ask "$(tr 'Partition disk $INSTALL_PARTITION_HDD ?')" if [ $? -eq 0 ]; then unmount $INSTALL_PARTITION_HDD partitionDisk $INSTALL_PARTITION_HDD /tmp/partitions $INSTALL_PARTITION_SYSTEM_SIZE || exit 1 read system data < /tmp/partitions INSTALL_SYSTEM_PARTITION=$system INSTALL_DATA_PARTITION=$data INSTALL_FORMAT_SYSTEM_PARTITION=1 INSTALL_FORMAT_DATA_PARTITION=1 rm /tmp/partitions fi fi if [ "$INSTALL_FORMAT_SYSTEM_PARTITION" = 1 -a -n "$INSTALL_SYSTEM_PARTITION" ]; then ask "$(tr 'Format system partition $INSTALL_SYSTEM_PARTITION ?')" if [ $? -eq 0 ]; then unmount $INSTALL_SYSTEM_PARTITION formatDisk $INSTALL_SYSTEM_PARTITION ext4 || exit 2 fi fi if [ "$INSTALL_FORMAT_DATA_PARTITION" = 1 -a -n "$INSTALL_DATA_PARTITION" -a "$INSTALL_DATA_PARTITION" != "$INSTALL_SYSTEM_PARTITION" ]; then ask "$(tr 'Format data partition $INSTALL_DATA_PARTITION ?')" if [ $? -eq 0 ]; then unmount $INSTALL_DATA_PARTITION formatDisk $INSTALL_DATA_PARTITION xfs || exit 3 fi fi if [ "$INSTALL_COPY_SYSTEM" = 1 -a -n "$INSTALL_SYSTEM_PARTITION" ]; then copySystem "$INSTALL_SYSTEM_PARTITION" "$INSTALL_DATA_PARTITION" $INSTALL_LEAVE_INSTALLER || exit 4 fi if [ "$INSTALL_BOOTBLOCK_HDD" = "auto" ]; then INSTALL_BOOTBLOCK_HDD=$INSTALL_PARTITION_HDD fi if [ -n "$INSTALL_BOOTBLOCK_HDD" -a -n "$INSTALL_SYSTEM_PARTITION" ]; then INSTALL_BOOTBLOCK_HDD=${INSTALL_BOOTBLOCK_HDD%%:*} writeBootblock $INSTALL_SYSTEM_PARTITION $INSTALL_BOOTBLOCK_HDD || exit 5 fi message "$(tr 'Installation completed')" } INSTALL_OUT=${2-sh} status=0 case $1 in automatic) if [ "$INSTALL_OUT" = "vdr" ]; then automatic 1>/var/log/install.log 2>&1 &1 automatic 1>/var/log/install.log 2>&1; status=$? exec 3>&- fi ;; manual) if [ "$INSTALL_OUT" = "vdr" ]; then manual 1>/var/log/install.log 2>&1 &1 manual 1>/var/log/install.log 2>&1; status=$? exec 3>&- fi ;; esac exit $status