#!/bin/bash #chroot and /tmp export TERM=vt100 MVHOSTNAME=larch5 . /etc/profile TEMP_TEMPLATES=/tmp/templates disk=$2 rootfs=$3 rootsize=$4 datafs=$5 datasize=$6 swapsize=$7 mountpoint="/new_boot" run=$MV_ROOT/bin/install_functions.sh . /etc/systemconfig 2>/dev/null . $MV_ROOT/bin/networkconfig.sh CMDLINE=$(cat /proc/cmdline) BACKUPFILE="/myth/backup/mythconverg.sql.gz" #TEMPNET="Hostip"$default_interface #eval MYTHIP=\$${TEMPNET} function create_chroot_mnt_points() { echo "Creating directory for media in chroot" mkdir -p $mountpoint/media/cdrom mkdir -p $mountpoint/media/dvd mkdir -p $mountpoint/mnt } function cp_and_log () { ls $1 >/dev/null 2>&1 status=$? if [ $status = 0 ] then echo "copying $1 to $2" cp -rfp $1 $2 else echo "$1 is not present, skipping..." fi } function mdadm_find () { PREFIX=$1 if [ -e $PREFIX/etc/KnoppMyth-version ] then MDADM_CONF="/etc/mdadm/mdadm.conf" else MDADM_CONF="/etc/mdadm.conf" fi echo "Using $MDADM_CONF" } progress () { mypercent=`echo "$1" | cut -d. -f1` if [ x$mypercent = x ] then echo "" > /tmp/.install_percent else echo "${mypercent}% complete" > /tmp/.install_percent fi } function apply_new_auth () { #check if file is present if [ -f /root/myth_user_call.out ] then #read in file, running each command in chroot exec 4 /tmp/user_auth.update fi done rm -f /root/myth_user_call.out else echo "No new password changes to apply" fi } function backup_sql_check { if [ -f ${mountpoint}${BACKUPFILE} ] then echo "found ${mountpoint}${BACKUPFILE} " rc=0 else echo "did not find ${mountpoint}${BACKUPFILE} " rc=1 fi return $rc } function mdadm_assemble_all { mdadm_find /tmp mdadm --assemble --scan -c /tmp${MDADM_CONF} MDLIST=`grep ARRAY /tmp${MDADM_CONF}|tr -s [:space:]|cut -d" " -f2` for array in $MDLIST do echo "assembling array $array" mdadm --assemble -c /tmp${MDADM_CONF} $array sleep 2 fsck -p $array done } function upgrade_mount_search { MYTH_P=`cat /tmp/etc/fstab |grep -E /myth[[:space:]] | awk ' {print $1 '} ` umount $mountpoint/myth #should probably just mdadm all the time echo $MYTH_P |grep -q \/md. if [ $? = 0 ] then mdadm_assemble_all fi echo $MYTH_P |grep -q UUID if [ $? = 0 ] then MUUID=`echo $MYTH_P|cut -d= -f2|tr -d \"` echo blkid $MUUID blkid -t UUID=$MUUID if [ ! $? = 0 ] then echo "couldn't find $MUUID, starting md support" mdadm_assemble_all fi mount -U $MUUID $mountpoint/myth echo mount -U $MUUID $mountpoint/myth MYTHMOUNT=`blkid -t UUID=$MUUID|cut -d: -f1` MYTHMOUNT=`basename $MYTHMOUNT` echo "MYTHMOUNT is $MYTHMOUNT" else mount $MYTH_P $mountpoint/myth echo mount $MYTH_P $mountpoint/myth MYTHMOUNT=`basename $MYTH_P` echo "MYTHMOUNT is $MYTHMOUNT" fi sleep 2 backup_sql_check if [ $? = 1 ] then mkdir -p /new_boot/root/backup if [ ! -e /tmp/mythconverg.sql.gz ] then echo "Couldn't find ANY database to restore, upgrade will continue but a new database will be installed." else cp_and_log /tmp/mythconverg.sql.gz /new_boot/root/backup/mythconverg.sql.gz BACKUPFILE="/root/backup/mythconverg.sql.gz" echo "setting BACKUPFILE to $BACKUPFILE" fi fi return 0 } full_install () { if [ -f /tmp/.this_is_upgrade ] then rm /tmp/.this_is_upgrade fi echo "Partitioning $disk" > /tmp/.install_state progress 1 sleep 1 $run partition_it $disk $rootsize $datasize $swapsize echo "Formating $disk" > /tmp/.install_state progress 2 sleep 1 $run format_it $disk $rootfs $datafs echo "Preparing $disk" > /tmp/.install_state progress 3 sleep 1 $run mount_it $disk startsize=`statgrab -M disk.|grep $disk.write_bytes|cut -d= -f 2|tr -d " "` echo "STARTSIZE=$startsize">/tmp/.startsize.io echo "Creating $hostname" > /tmp/.install_state sleep 1 $run copy_it $disk ALL rm $mountpoint/etc/fstab $run fstab_fix_it $disk $rootfs $datafs FULL_INSTALL echo "Configuring system" > /tmp/.install_state progress 100 #progress 99 sleep 1 $run grub_it $disk #echo "Configuring system" > /tmp/.install_state #progress 100 sleep 1 cp_and_log /etc/systemconfig "$mountpoint"/etc cp_and_log /root/xorg.conf.install "$mountpoint"/etc/X11/xorg.conf.install #run save syssettings to save settings, then copy to new mountpoint $MV_ROOT/bin/restore_default_settings.sh -c save -t syssettings -h $MVHOSTNAME -d localhost SE=$TEMPLATES/settings/syssettings mkdir -p ${mountpoint}$SE #cp -rp $SE/* ${mountpoint}$SE/ cp_and_log "$SE/*" "${mountpoint}$SE/" chown root:mythtv "$mountpoint"/etc/systemconfig chown -R mythtv:mythtv ${mountpoint}$SE chmod -R 775 ${mountpoint}$SE chmod 775 "$mountpoint"/etc/systemconfig mkdir -p "$mountpoint"/var/log/mythtv chown mythtv "$mountpoint"/var/log/mythtv #copy over any updates that might have occured #cp -rp $MV_ROOT/bin/*.sh "$mountpoint"$MV_ROOT/bin/ cp_and_log "$MV_ROOT/bin/*.sh" "$mountpoint"$MV_ROOT/bin/ chmod -R 755 ${mountpoint}/root create_chroot_mnt_points cp_and_log /etc/mtab "$mountpoint"/etc/mtab # cp_and_log /etc/hostname "$mountpoint"/etc/hostname apply_new_auth if [ $SystemType = "Master_backend" -o $SystemType = "Standalone" ] then #installing DB to local machine #turn off old live database, so the chroot one can start echo "---------------------CHROOT INSTALLDB-------------------------" /etc/rc.d/mysqld stop mount --bind /dev "$mountpoint/dev" mount --bind /proc "$mountpoint/proc" mount -t sysfs none $mountpoint/sys chroot "$mountpoint" "$MV_ROOT/bin/install_db_chroot.sh" 2>&1 |tee /tmp/chrootdb.out #chroot "$mountpoint" "$MV_ROOT/bin/install_db_chroot.sh" chroot "$mountpoint" $MV_ROOT/bin/systemconfig.sh misc,hostype,network,advanced,user,this_is_install echo "stopping mysql in chroot" chroot "$mountpoint" /etc/rc.d/mysqld stop kill_dhcp_chroot sleep 2 lsof |grep new_boot umount -l "$mountpoint/dev" umount -l "$mountpoint/proc" umount -l "$mountpoint/sys" echo "---------------------END CHROOT INSTALLDB-------------------------" /etc/rc.d/mysqld start else #update remotedb with this host settings mount --bind /dev "$mountpoint/dev" mount --bind /proc "$mountpoint/proc" mount -t sysfs none $mountpoint/sys chroot "$mountpoint" DISPLAY=127.0.0.1:0 /usr/local/bin/MythVantage -t restore,default_1 chroot "$mountpoint" $MV_ROOT/bin/restore_default_settings.sh -c restore -t syssettings if [ ! $? = 0 ] then touch $mountpoint/tmp/.dbsysfailed chmod 777 $mountpoint/tmp/.dbsysfailed else #Run second time chroot "$mountpoint" $MV_ROOT/bin/systemconfig.sh misc,hostype,network,advanced,user,this_is_install chroot "$mountpoint" $MV_ROOT/bin/restore_default_settings.sh -c ACCESSCONTROL umount -l "$mountpoint/dev" umount -l "$mountpoint/proc" umount -l "$mountpoint/sys" fi fi chroot "$mountpoint" $MV_ROOT/bin/systemconfig.sh advanced,user touch $mountpoint/home/mythtv/.configure && chmod 777 $mountpoint/home/mythtv/.configure echo "Done" > /tmp/.install_state cp_and_log /tmp/mythvantage_install.log $mountpoint/var/log/ $run umount_it $disk } function createsquashlist(){ if [ -f $1 ] then rm -f $1 fi for i in bin boot etc home lib opt root sbin usr var data do echo $i >> $1 done } function upgrade () { touch /tmp/.this_is_upgrade if [ ! x$rootfs = "xDo_not_format" ] then echo "Formating $disk" > /tmp/.install_state progress 2 sleep 1 $run format_it $disk $rootfs NO fi echo "Preparing $disk" > /tmp/.install_state progress 3 sleep 1 $run mount_it $disk startsize=`statgrab -M disk.|grep $disk.write_bytes|cut -d= -f 2|tr -d " "` echo "STARTSIZE=$startsize">/tmp/.startsize.io echo "Upgrading $hostname" > /tmp/.install_state sleep 1 cp_and_log /tmp/etc /new_boot/etc.old cp_and_log /tmp/oss /new_boot/var/lib/oss.old SQUASHLIST="/tmp/.squashlist" createsquashlist $SQUASHLIST $run copy_it $disk $SQUASHLIST #copy back ssh keys # cp_and_log -rp /data/var/cache/pacman/pkg/* /new_boot/data/var/cache/pacman/pkg/ cp_and_log "/new_boot/etc.old/ssh/*.pub" /new_boot/etc/ssh/ cp_and_log "/new_boot/etc.old/ssh/*.key" /new_boot/etc/ssh/ cp_and_log "/new_boot/etc.old/ssh/*key" /new_boot/etc/ssh/ mdadm_find /tmp cp_and_log /tmp${MDADM_CONF} /new_boot/etc #cp_and_log /new_boot/etc.old/mdadm/mdadm.conf /new_boot/etc/ cp_and_log /new_boot/etc.old/asound.state /new_boot/etc/ if [ ! -f /tmp/etc/KnoppMyth-version ] then #passwd/shadow/group cp_and_log /new_boot/etc.old/passwd /new_boot/etc/ cp_and_log /new_boot/etc.old/shadow /new_boot/etc/ cp_and_log /new_boot/etc.old/group /new_boot/etc/ fi mkdir -p "$mountpoint"/var/log/mythtv chown mythtv "$mountpoint"/var/log/mythtv if [ x$rootfs = "xDo_not_format" ] then rootfs=`grep \/\ /tmp/etc/fstab |awk ' { print $3 } '` fi #this is here to copy in the systemconfig file as soon as possible. cp_and_log /etc/systemconfig "$mountpoint"/etc/systemconfig echo "Configuring system" > /tmp/.install_state progress 100 backup_sql_check if [ $? = 1 ] then upgrade_mount_search fi echo $run fstab_fix_it $disk UPGRADE $MYTHMOUNT $run fstab_fix_it $disk UPGRADE $MYTHMOUNT create_chroot_mnt_points #echo "Writing boot sector" > /tmp/.install_state #progress 99 sleep 1 $run grub_it $disk #echo "Configuring system" > /tmp/.install_state #progress 100 sleep 1 cp_and_log /etc/mtab "$mountpoint"/etc/mtab cp_and_log /etc/systemconfig "$mountpoint"/etc cp_and_log /root/xorg.conf.install "$mountpoint"/etc/X11/xorg.conf.install #make sure mythconverg.sql.gz is present #backup_sql_check #if [ $? = 1 ] #then # upgrade_mount_search #fi echo $CMDLINE | grep -q clean_upgrade status=$? if [ -f /tmp/etc/KnoppMyth-version -o $status = 0 ] then #run save syssettings to save settings, then copy to new mountpoint $MV_ROOT/bin/restore_default_settings.sh -c save -t syssettings -h $MVHOSTNAME -d localhost SE=$TEMPLATES/settings/syssettings mkdir -p ${mountpoint}$SE #cp -rfp $SE/* ${mountpoint}$SE/ cp_and_log "$SE/*" "${mountpoint}$SE/" chown root:mythtv "$mountpoint"/etc/systemconfig chown -R mythtv:mythtv ${mountpoint}$SE chmod -R 775 ${mountpoint}$SE if [ ! $status = 0 ] then touch $mountpoint/home/mythtv/.kmupgrade && chmod 777 $mountpoint/home/mythtv/.kmupgrade fi fi cp_and_log "$MV_ROOT/bin/*.sh" "$mountpoint"$MV_ROOT/bin/ chmod -R 755 ${mountpoint}/root chown root:mythtv "$mountpoint"/etc/systemconfig chmod 775 "$mountpoint"/etc/systemconfig #mount /proc and /dev mount --bind /dev "$mountpoint/dev" mount --bind /proc "$mountpoint/proc" chroot "$mountpoint" $MV_ROOT/bin/systemconfig.sh misc,hostype,network,advanced,user,this_is_install #wrap this in a network check_network, no need to update the db if the import worked. ##### do I need to start mysql? /etc/rc.d/mysqld stop if [ $SystemType = "Master_backend" -o $SystemType = "Standalone" ] then echo $CMDLINE | grep -q clean_upgrade status=$? if [ $status = 0 ] then #new db as part of clean upgrade echo "--------------------------------" echo "clean upgrade installing new database" echo "--------------------------------" chroot "$mountpoint" "$MV_ROOT/bin/install_db_chroot.sh" |tee /tmp/chrootdb.out echo "############################################" echo "End Installing new database/clean" echo "############################################" else #proceed as normal if [ -f "$mountpoint"/$BACKUPFILE ] then echo "--------------------------------" echo "Restoring database with $BACKUPFILE" echo "--------------------------------" chroot "$mountpoint" "$MV_ROOT/bin/restore_km_db_chroot.sh" "$BACKUPFILE" |tee /tmp/chrootdb_km.out echo "############################################" echo "End Restoring database" echo "############################################" else echo "--------------------------------" echo "Couldn't find backup file, installing new database" echo "--------------------------------" touch /tmp/.upgrade_db_failed chroot "$mountpoint" "$MV_ROOT/bin/install_db_chroot.sh" |tee /tmp/chrootdb.out echo "############################################" echo "End Installing new database" echo "############################################" fi fi fi if [ -f /tmp/etc/KnoppMyth-version ] then chroot "$mountpoint" $MV_ROOT/bin/restore_default_settings.sh -c restore -t hostsettings #change permissions of /myth (only needed on km->linhes) chown -R mythtv:mythtv $mountpoint/myth chown -R root:root $mountpoint/myth/backup else chroot "$mountpoint" $MV_ROOT/bin/restore_default_settings.sh -c restore -t syssettings fi # #Run second time chroot "$mountpoint" $MV_ROOT/bin/systemconfig.sh misc,hostype,network,advanced,user,this_is_install chroot "$mountpoint" $MV_ROOT/bin/systemconfig.sh advanced,this_is_install echo "stopping mysql in chroot" chroot "$mountpoint" /etc/rc.d/mysqld stop apply_new_auth kill_dhcp_chroot umount -l "$mountpoint/dev" umount -l "$mountpoint/proc" echo "Done" > /tmp/.install_state cp_and_log /tmp/mythvantage_install.log $mountpoint/var/log/ $run umount_it $disk /etc/rc.d/mysqld start } function netboot-full_install () { TEMPVAR=${CMDLINE#*nfsroot=} NFSROOT=${TEMPVAR%% *} NFSROOT=`echo $NFSROOT|cut -d: -f1` MAC=`/sbin/ifconfig eth0|grep HWaddr| cut -d: -f2-|awk '{ print $3}'|tr : -` URL="http://$NFSROOT:1337/diskless.py?HOSTNAME=$hostname&MAC=$MAC" echo "calling $URL" echo "Starting" > /tmp/.install_state curl $URL ${MV_ROOT}/bin/xconfig.sh } # function killdhcp () { # if [ -f /etc/dhcpc/dhcpcd-eth0.pid ] # then # pid=`cat /etc/dhcpc/dhcpcd-eth0.pid` # kill -9 $pid # rm -f /etc/dhcpc/dhcpcd-eth0.pid # rm -f /var/run/dhcpcd* # fi # if [ -f /var/run/dhcpcd-eth0.pid ] # then # pid=`cat /var/run/dhcpcd-eth0.pid` # kill -9 $pid # rm -f /var/run/dhcpcd-eth0.pid* # fi # ip address flush dev eth0 # } function SANE_SYSETTINGS () { sed -e '/HOSTrootfstype/d' \ -e '/HOSTrootfstype/d' \ -e '/HOSTdatafstype/d' \ -e '/HOSTOSsize/d' \ -e '/HostUseALLdata/d' \ -e '/HOSTDATAsize/d' \ -e '/HOSTuprootfstype/d' \ -e '/HostUseSWAP/d' \ -e '/HOSTSWAPsize/d ' /tmp/templates/settings/syssettings/settings.txt > /tmp/settings.new mv /tmp/settings.new /tmp/templates/settings/syssettings/settings.txt } case $1 in full_install_it ) full_install ;; NETBOOT) echo "-----------------------------------------------------------------------3-----" netboot-full_install ;; find_update) #TRY TO mount first partition of drive #copy /etc/systemconfig to live, import settings into db #umount drive echo $CMDLINE | grep -q clean_upgrade if [ $? = 1 ] then $run mount_it $disk [ -e "/new_boot/root/backup/mythconverg.sql.gz" ] && cp /new_boot/root/backup/mythconverg.sql.gz /tmp if [ -f /new_boot/etc/systemconfig ] then ###########ADD templates mkdir -p $TEMP_TEMPLATES cp_and_log /new_boot/$TEMPLATES $TEMP_TEMPLATES SANE_SYSETTINGS cp_and_log $TEMP_TEMPLATES/settings $TEMPLATES/ cp_and_log /new_boot/etc/systemconfig /etc/systemconfig cp_and_log /new_boot/etc /tmp/etc cp_and_log /new_boot/var/lib/oss /tmp/oss [ -e /tmp/etc/mdadm.conf ] && cp_and_log /tmp/etc/mdadm.conf /etc/ $MV_ROOT/bin/restore_default_settings.sh -c restore -t syssettings -h $MVHOSTNAME -d 127.0.0.1 else cp_and_log /new_boot/etc /tmp/etc [ -e /tmp/etc/mdadm.conf ] && cp_and_log /tmp/etc/mdadm.conf /etc/ #now we search for the timezone and try to update TZREGION=`cat /tmp/etc/timezone | cut -d"/" -f1` TZSUB=`cat /tmp/etc/timezone | cut -d"/" -f2 -` if [ $TZREGION = $TZSUB ] then $run update_db_it HostTimeZoneRegion "$TZREGION" else $run update_db_it HostTimeZoneRegion "$TZREGION" $run update_db_it HostTimeZoneRegion_$TZREGION "$TZSUB" fi fi backup_sql_check echo $? upgrade_mount_search echo $? $run umount_it $disk fi ;; upgrade_it) upgrade ;; disk_model_it) model="unknown" size="xxx" case $2 in h* ) model=`cat /proc/ide/$2/model` ;; s*) model=`sginfo /dev/$2|grep Product|awk ' { print $2 } '` ;; esac size=`parted /dev/$2 print |grep Disk|awk ' { print $3 } ' ` echo ""$model" $size " >/tmp/model ;; network_check_it) #Should never return from check_network case $2 in setup_network) vnc_check install_network_setup ;; check_self) myipdefault=`ifconfig | grep -C1 $default_interface| grep -v $default_interface | cut -d: -f2 | awk '{ print $1}'` echo "network check myself" ifconfig ping -c 1 $myipdefault if [ ! $? = 0 ] then exit 3 #can't ping yourself fi ;; check_gw) #check gateway echo "network check gateway" /sbin/route -n mygwdefault=`/sbin/route -n |grep $default_interface|grep UG|awk '{ print $2}'` echo "Default gateway seems to be $mygwdefault" if [ ! x$mygwdefault = x ] then sleep 2 ping -c 5 $mygwdefault if [ ! $? = 0 ] then exit 4 fi fi ;; check_ns) #check nameserver echo " network check nameserver" mydns=`cat /etc/resolv.conf|grep nameserver|head -1|awk '{ print $2}'` ping -c 1 $mydns if [ ! $? = 0 ] then exit 5 fi ;; check_names) echo "network check resolve names" host google.com if [ ! $? = 0 ] then exit 6 fi ;; host_names) #if host is found, then check to see if it's online #if hoip matchs my ip assume it's ok echo "network check my hostname $hostname" hout=`host $hostname|head -n1` status=$? hoip=`echo $hout|awk '{print $4}'` if [ $hoip = found: ] then status=1 fi unkownhost=`host unkown.linhes.org |head -n1 ` unkownhostip=`echo $unkownhost |awk '{print $4}'` #found host, now grab the ip if [ $status = 0 ] then hoip=`echo $hout|awk '{print $4}'` /sbin/ifconfig -a |grep -q $hoip if [ $? = 0 ] then echo "DNS ip matches on of my ips $hoip" status=0 else if [ $unkownhostip = $hoip ] then echo "Bad DNS returning false hits" echo "Assuming hostname is OK" echo "DNS unknown: $unkownhostip" echo " HOSTDNS: $hoip " /sbin/ifconfig -a |grep "inet addr" else echo "IP in DNS but doesn't match mine, hostname is not safe to use" echo "DNS:$hoip" echo "HOST: " /sbin/ifconfig -a |grep "inet addr" status=7 fi fi else echo "Couldn't find hostname in DNS, must be safe to use" status=0 fi exit $status ;; esac exit 0 ;; * ) if [ -f /tmp/.install_state ] then state=`cat /tmp/.install_state` else state=" " fi if [ x"${state}" = "xConfiguring system" ] then progress "" else if [ -f /tmp/.startsize.io ] then . /tmp/.startsize.io #finding the drive ddrive=`df | grep $mountpoint | head -n1 | awk -F/ ' { print $3 } ' | cut -d" " -f 1|cut -b1,2,3 ` used=`statgrab -M disk.|grep ${ddrive}.write_bytes|cut -d= -f 2|tr -d " "` used=`echo $used-$STARTSIZE|bc` #echo $used fi if [ ! x$used = x ] then . /root/.install_size #somehow find if it's an install or update if [ -f /tmp/.this_is_upgrade ] then total=$UPGRADESIZE else total=$TOTALSIZE fi percent=`echo "scale=2 ; ($used/$total) * 100 " |bc ` cond2=$(echo "$percent > 98" |bc ) if [ $cond2 -eq 1 ] then percent=98 fi cond3=$(echo "$percent < 3" |bc ) if [ $cond3 -eq 0 ] then progress $percent fi fi fi ;; esac