#!/bin/bash # $Id$ # ignore environment! LC_ALL=C MLIBDIR="/usr/lib/mcore-install" # images: (get ${CDIMAGENAME}) source /mnt/cdrom/system/images.conf # includes source ${MLIBDIR}/functions/hwdetection.sh ### System/Config Version VERSION="@@VERSION@@" TITLE="mcore-install - ${VERSION}" CDPATH="/mnt/cdrom" INSTALL_ROOT="/mnt/magellan" ### linecount of system.tar.gz -1 ! CURRENTLINE=0 #TOTALLINES=11072 # -> now in images.conf # standart kernel opts KERNELOPTS="quiet" # default specialdevices SPECIALDEVICE="" # target filesystem FORMAT_FILESYSTEM="ext3" ################################################# # DIALOG BOXEN # ################################################# die() { ERROR="$1" RETVAL="$?" dialog_install_failure exit 1 } dialog_warning() { local retval dialog \ --backtitle "${TITLE}" \ --colors \ --defaultno \ --yesno "\Z1 !!! Achtung !!! \Zn\n\n\ Diese Festplatte wird unwiederruflich geloescht werden.\n\n\ Soll ich wirklich fortfahren ?" 10 70 retval=$? if [[ ${retval} -eq 1 ]] then clear echo "Der Vorgang wurde abgebrochen." exit 1 fi } dialog_setup_hdd_info() { local SHDD="$(echo $HDD | sed 's/\/dev\///')" dialog \ --colors \ --title "[ Festplatten Partitionierung ]" \ --backtitle "${TITLE}" \ --ok-label "Weiter" \ --msgbox "\nBitte legen Sie 1 Partition an.\n\n\ [ \Z3${SHDD}1\Zn ] Typ: \Z3Linux\Zn mit dem gesamten Speicher\n\ Bitte ${SHDD}1 als \Z3bootable\Zn markieren." 12 81 } dialog_setup_hdd_info_auto() { local SHDD="$(echo $HDD | sed 's/\/dev\///')" dialog \ --colors \ --title "[ Festplatten Partitionierung ]" \ --backtitle "${TITLE}" \ --ok-label "Weiter" \ --msgbox "\nAchtung!\n\ Alle Daten werden von der Disk [ \Z3${HDD}\Zn ] gelöscht!" 12 81 } dialog_setup_system_menu() { local i local retval i=$(dialog \ --backtitle "${TITLE}" \ --title "[ Festplatten Partitionierung ]" \ --cancel-label "Abbrechen" \ --ok-label "Weiter" \ --stdout \ --colors \ --menu "\nWaehlen Sie die Installations-Methode" 14 70 5 \ "1" "Automatisches Setup (Empfohlen)" \ "" "" \ "" "\Z1Experten Modi:\Zn" \ "2" "Normale IDE-Disk (Manuell)") retval=$? [[ ${retval} -eq 1 ]] && return 1 if [[ ${retval} -eq 0 ]] then case "${i}" in "1") run_install_auto ;; "2") run_install_normal ;; "") dialog_setup_system_menu;; esac fi } dialog_hardware_detection() { local i local hwtmp if [ -x $(which mktemp &> /dev/null) ] then hwtmp="$(mktemp)" else hwtmp="/tmp/hwtmp.sh" fi run_hardware_detection_disks echo "dialog \\" > ${hwtmp} echo "--backtitle \"${TITLE}\" \\" >> ${hwtmp} echo "--ok-label \"Weiter\" \\" >> ${hwtmp} echo "--stdout \\" >> ${hwtmp} echo "--colors \\" >> ${hwtmp} echo "--msgbox \"Gefundene Hardware:\n\n \\" >> ${hwtmp} echo " Festplatten:\n \\" >> ${hwtmp} if [[ ! -z ${ALL_DISKS} ]] then for i in ${ALL_DISKS} do echo " \\Z3${i}\\Zn\n \\" >> ${hwtmp} done fi if [[ ! -z ${ALL_CDROMS} ]] then echo " \n \\" >> ${hwtmp} echo " CDROM Laufwerke:\n \\" >> ${hwtmp} for i in ${ALL_CDROMS} do echo " \\Z3${i}\\Zn\n \\" >> ${hwtmp} done fi # other devices run_hardware_detection case "${SPECIALDEVICE}" in zotac) echo " \n \\Z2Zotac Device erkannt!\\Zn \\" >> ${hwtmp} ;; *) echo " \n \\ZnStandard Device erkannt!\\Zn \\" >> ${hwtmp} ;; esac echo " \" 13 70" >> ${hwtmp} chmod a+x ${hwtmp} ${hwtmp} # remove tmp file if [[ -f ${hwtmp} ]] then rm ${hwtmp} fi } dialog_setup_hdd_partitions_manuell() { local i local retval if [[ -z ${ALL_DISKS} ]] then dialog \ --backtitle "${TITLE}" \ --ok-label "Beenden" \ --msgbox "Kein geeignetes Laufwerk gefunden.\nDie Installation ist fehlgeschlagen." 6 70 exit 1 else echo "dialog \\" > /tmp/hddtmp.sh echo "--backtitle \"${TITLE}\" \\" >> /tmp/hddtmp.sh echo "--ok-label \"Weiter\" \\" >> /tmp/hddtmp.sh echo "--cancel-label \"Beenden\" \\" >> /tmp/hddtmp.sh echo "--stdout \\" >> /tmp/hddtmp.sh echo "--menu \"Installations Laufwerk auswaehlen:\" 10 70 3 \\" >> /tmp/hddtmp.sh for i in ${ALL_DISKS} do echo "\"${i}\" \"\" \\" >> /tmp/hddtmp.sh done echo -e "\n" >> /tmp/hddtmp.sh chmod a+x /tmp/hddtmp.sh HDD="$(/tmp/hddtmp.sh)" retval=$? [[ ${retval} -eq 1 ]] && return 1 if [[ ${retval} -eq 0 ]] then dialog_setup_hdd_info setup_hdd_partitions_manuell fi fi } dialog_setup_hdd_partitions_auto() { local i local retval if [[ -z ${ALL_DISKS} ]] then dialog \ --backtitle "${TITLE}" \ --ok-label "Beenden" \ --msgbox "Kein geeignetes Laufwerk gefunden.\nDie Installation ist fehlgeschlagen." 6 70 exit 1 else echo "dialog \\" > /tmp/hddtmp.sh echo "--backtitle \"${TITLE}\" \\" >> /tmp/hddtmp.sh echo "--ok-label \"Weiter\" \\" >> /tmp/hddtmp.sh echo "--cancel-label \"Beenden\" \\" >> /tmp/hddtmp.sh echo "--stdout \\" >> /tmp/hddtmp.sh echo "--menu \"Installations Laufwerk auswaehlen:\" 10 70 3 \\" >> /tmp/hddtmp.sh for i in ${ALL_DISKS} do echo "\"${i}\" \"\" \\" >> /tmp/hddtmp.sh done echo -e "\n" >> /tmp/hddtmp.sh chmod a+x /tmp/hddtmp.sh HDD="$(/tmp/hddtmp.sh)" retval=$? [[ ${retval} -eq 1 ]] && return 1 if [[ ${retval} -eq 0 ]] then dialog_setup_hdd_info_auto dialog_setup_hdd_create_partitions setup_hdd_partitions_auto fi fi } dialog_setup_hdd_create_partitions() { dialog \ --backtitle "${TITLE}" \ --infobox "Erstelle Disk Partitionen ..." 3 70 } dialog_setup_hdd_format() { dialog \ --backtitle "${TITLE}" \ --infobox "Erstelle Datei-Systeme ..." 3 70 } dialog_install_settings() { dialog \ --backtitle "${TITLE}" \ --infobox "Speichere System-Einstellungen ..." 3 70 } dialog_install_system_image() { dialog \ --backtitle "${TITLE}" \ --gauge "Kopiere System-Image ..." 6 80 } dialog_install_initrd() { dialog \ --backtitle "${TITLE}" \ --infobox "Erstelle Initrd ..." 3 70 } dialog_install_meter() { while [[ ${CURRENTLINE} != ${TOTALLINES} ]] do CURRENTLINE=$(grep -c . /tmp/install.log) PERCENT=$(( ${CURRENTLINE} * 100 / ${TOTALLINES})) echo "${PERCENT}" sleep 1 done rm -f /tmp/install.log return 0 } dialog_install_bootsector() { dialog \ --backtitle "${TITLE}" \ --infobox "Schreibe den Bootsektor ..." 3 70 } dialog_install_successful() { dialog \ --backtitle "${TITLE}" \ --colors \ --msgbox "Die Installation war \Z2erfolgreich\Zn." 5 81 } dialog_install_failure() { dialog \ --backtitle "${TITLE}" \ --colors \ --msgbox "Die Installation ist \Z1Fehlgeschlagen\Zn.\n\n\ Fehler bei ${ERROR}, RetVal: ${RETVAL} \ " 10 81 } dialog_main() { local method=0 local retval while [[ ${method} -le 2 ]] do method=$(dialog \ --backtitle "${TITLE}" \ --no-cancel \ --ok-label "Weiter" \ --stdout \ --menu "Konfiguration" 14 70 5 \ "1" "mCore installieren" \ "2" "Uebersicht gefundener Laufwerke" \ "3" "Beenden und neustarten" \ "4" "Beenden und eine Shell starten") retval=$? [[ ${retval} -eq 1 ]] && exit 1 if [[ ${retval} -eq 0 ]] then case ${method} in "1") dialog_setup_system_menu ;; "2") dialog_hardware_detection ;; "3") install_do_reboot ;; "4") clear;/bin/bash --login -i ;; esac fi done } ################################################# # Install Komandos # ################################################# run_hardware_detection() { # check for special devices/clients: # if the device is a zotac and has a removeable device as boot disk, # then add a rootdelay of 8 seconds to kernelcmd local removable=0 if [[ ! -z $(lspci -v | grep -i zotac) ]] then for i in /sys/block/[hs]d*/removable do if [[ $(< ${i}) = 1 ]] then removable=1 fi done export KERNELOPTS="${KERNELOPTS} rootdelay=8" export SPECIALDEVICE="zotac" fi } run_hardware_detection_disks() { local bootdev # all disks but exclude ramdisks export ALL_DISKS=$(get_hwinfo disk | sed '/\/dev\/ram[0-9].*/d') # remove the boot device from ALL_DISKS if it was an usbstick if [[ $(grep '[[:space:]]/mnt/cdrom[[:space:]]' /proc/mounts | cut -d' ' -f3) != iso9660 ]] then bootdev="$(grep '[[:space:]]/mnt/cdrom[[:space:]]' /proc/mounts | cut -d' ' -f1 | sed 's:[0-9]::g')" export ALL_DISKS=$(echo "${ALL_DISKS}" | grep -v "${bootdev}") fi export ALL_CDROMS="$(get_hwinfo cdrom)" } setup_hdd_partitions_auto() { ROOTHDD="${HDD}1" ## delete disk dd if=/dev/zero of="${HDD}" count=1 &> /dev/null || die ## setup one bootable partition #1. n= new disk #2. p= primary disk #3. 1= first partition #4. ''= default sector start #5. ''= defaul sector end #6. a= bootable flag #7. 1= boot flag for partition 1 #8. w= write/quit fdisk "${HDD}" &> /dev/null << EOF n p 1 a 1 w EOF } setup_hdd_partitions_manuell() { ROOTHDD="${HDD}1" cfdisk "${HDD}" || die } setup_hdd_format() { # defaults to ext3 [[ -z ${FORMAT_FILESYSTEM} ]] && FORMAT_FILESYSTEM="ext3" mkfs."${FORMAT_FILESYSTEM}" -q "${ROOTHDD}" || die } install_mount_rootfs() { mount "${ROOTHDD}" "${INSTALL_ROOT}" || die install -d ${INSTALL_ROOT}/boot || die cd ${INSTALL_ROOT} || die } install_system_image() { tar xvjpf ${CDPATH}/system/${CDIMAGENAME} -C ${INSTALL_ROOT} } install_bootsector() { local uuid local initrd local kernelversion local grubtitle local chroot local grubdisk local CONFIG # setup a proper boot device if [[ -z ${BOOTHDD} ]] then grubdisk="${ROOTHDD}" else grubdisk="${BOOTHDD}" fi # first of all, create a device.map create_device_map # get kernelnames initrd=/boot/$(readlink ${INSTALL_ROOT}/boot/initrd) kernelversion=$(readlink ${INSTALL_ROOT}/boot/vmlinuz | sed "s:kernel-::g") # for mcore only if [ -f ${INSTALL_ROOT}/etc/mcore_version ] then grubtitle="mCore-$(< ${INSTALL_ROOT}/etc/mcore_version) (${kernelversion})" else grubtitle="mCore (${kernelversion})" fi # uuid support uuid=$(get_uuid "${ROOTHDD}") CONFIG="${INSTALL_ROOT}/boot/grub/grub.conf" clearconfig addconfig 'default 0' addconfig 'timeout 3' if [[ -f ${INSTALL_ROOT}/boot/grub/splash.xpm.gz ]] then addconfig "splashimage $(convert_device ${grubdisk})/boot/grub/splash.xpm.gz" fi # using current root password addconfig "password --md5 $(cat ${INSTALL_ROOT}/etc/shadow | grep root | cut -d: -f2)" addconfig addconfig '# normal boot' addconfig "title ${grubtitle}" addconfig "root $(convert_device ${grubdisk})" addconfig "kernel /boot/kernel-${kernelversion} root=${uuid} ${KERNELOPTS}" addconfig "initrd /boot/${initrd}" [[ ! -z ${INSTALL_ROOT} ]] && chroot=chrooted # update grub ${chroot} grub --batch --no-floppy &> /dev/null << EOF root $(convert_device ${grubdisk}) setup $(convert_device ${grubdisk} | sed "s:,[0-9]::") quit EOF return 0 } create_device_map() { local chroot [[ ! -z ${INSTALL_ROOT} ]] && chroot=chrooted # create device.map ${chroot} grub --batch --no-floppy --no-config-file --device-map=/boot/grub/device.map /dev/null } convert_device() { local device="$1" local root_part= # extract device type (block) and major number for root drive local major_minor=$(ls -Ll ${device} | awk '{if ($6 < 64) printf("%c%d0", $1, $5); else printf("%c%d1", $1, $5)}') # find the matching BIOS device for bios_drive in $(grep -v '^#' ${INSTALL_ROOT}/boot/grub/device.map | awk '{print $2}') do bios_major_minor=$(ls -Ll ${bios_drive} 2>/dev/null | awk '{if ($6 < 64) printf("%c%d0", $1, $5); else printf("%c%d1", $1, $5)}') if [[ ${major_minor} = ${bios_major_minor} ]] then # we found it root_drive=$(grep ${bios_drive} ${INSTALL_ROOT}/boot/grub/device.map | awk '{print $1}') root_part=$(ls -Ll ${device} | awk '{print $6}') root_part=$(( ${root_part} % 16 - 1 )) break fi done drive=$(echo ${root_drive} | sed "s:)$:,${root_part}):") echo ${drive} } install_initrd() { local initrd local kernelversion initrd=/boot/$(readlink ${INSTALL_ROOT}/boot/initrd) kernelversion=$(readlink ${INSTALL_ROOT}/boot/vmlinuz | sed "s:kernel-::g") create_initrd --initrd "${initrd}" --kernelversion "${kernelversion}" &> /dev/null } install_system_settings() { local CONFIG local uuid # schreibe fstab uuid=$(get_uuid "${ROOTHDD}") CONFIG="${INSTALL_ROOT}/etc/fstab" clearconfig addconfig -e "UUID=${uuid}\t/\text3\tnoatime\t0 0" addconfig -e "proc\t/proc\tproc\tdefaults\t0 0" addconfig -e "shm\t/dev/shm\ttmpfs\tdefaults\t0 0" # install network config skeleton CONFIG="${INSTALL_ROOT}/etc/conf.d/net.eth0" clearconfig addconfig 'ONBOOT="yes"' addconfig 'NETWORKING="dhcp"' } install_umount_rootfs() { cd / umount ${INSTALL_ROOT} || die } install_do_reboot() { reboot } ################################################# # Install Ablauf Scripte # ################################################# addconfig() { local opts if [[ -z ${CONFIG} ]] then echo "You must define \$CONFIG varibale first!" return 1 fi if [[ ! -d $(dirname ${CONFIG}) ]] then install -d $(dirname ${CONFIG}) fi # check for opts case $1 in -n) shift; opts=" -n" ;; -e) shift; opts=" -e" ;; esac echo ${opts} "$@" >> ${CONFIG} } clearconfig() { if [[ -z ${CONFIG} ]] then echo "You must define \$CONFIG varibale first!" return 1 fi if [[ ! -d $(dirname ${CONFIG}) ]] then install -d $(dirname ${CONFIG}) fi : > ${CONFIG} } run_install_normal() { dialog_hardware_detection dialog_setup_hdd_partitions_manuell dialog_setup_hdd_format setup_hdd_format > /dev/null install_mount_rootfs (install_system_image > /tmp/install.log) 2> /tmp/install_errors.log | dialog_install_meter | dialog_install_system_image dialog_install_bootsector install_bootsector dialog_install_settings sleep 1 install_system_settings dialog_install_initrd install_initrd install_umount_rootfs dialog_install_successful } run_install_auto() { dialog_hardware_detection dialog_setup_hdd_partitions_auto dialog_setup_hdd_format setup_hdd_format > /dev/null install_mount_rootfs (install_system_image > /tmp/install.log) 2> /tmp/install_errors.log | dialog_install_meter | dialog_install_system_image dialog_install_bootsector install_bootsector dialog_install_settings sleep 1 install_system_settings dialog_install_initrd install_initrd install_umount_rootfs dialog_install_successful } dialog_main exit 0