#!/bin/bash
#   /usr/local/bin/KnoppMyth-clone
#	A script to clone the system disk.
########################################################################
# Configuration:
#-----------------------------------------------------------------------
Sdev='/dev/sda'
Tdev='/dev/sdb'
CPdirs='bin boot etc home lib root sbin usr var'
MKdirs='cdrom dev initrd media mnt myth opt proc src sys tmp'
#-----------------------------------------------------------------------
FS1args='-m 5 -i 10000 -M / -L Root -j'
FS3args='-F 32'
#-----------------------------------------------------------------------
OSD='/usr/local/bin/KnoppMyth-osd'
########################################################################
# Subroutines:
#-----------------------------------------------------------------------
Abort() { # arguments are a string to be printed
    if [ -n "$OSD" -a -x "$OSD" ]; then
	$OSD "ERROR:\\n$@\\n" red 5 &
    else
	echo "ERROR: $@"
    fi
    exit 1
}
#=======================================================================
create_partitions() { # $1 is Source device, $2 is Target device
    if [ -z "$1" -o -z "$2" ]; then
	Abort "create_partitions <Source Device> <Target Device>"
    fi
    if [ ! -b "$1" -o ! -b "$2" ]; then
	Abort "create_partitions needs 2 block device names"
    fi
    $OSD "Clearing old partition table\\non $2" green 5 &
    dd if=/dev/zero of=$2 bs=1k count=16
    $OSD "creating partitions\\non $2" green 30 &
    local STRNG='\"n\\\\np\\\\n\1\\\\n\2\\\\n\3\\\\n\"'
    local SEDPT="s|^$1\([^ ]*\) *\([0-9]*\) *\([0-9]*\).*|STR\1=$STRNG|"
    local SCRIP=$(fdisk -l $1 | grep "^$1" | sed -e 's|\*||' -e "$SEDPT")
    eval $SCRIP
    local TYP3='b'
    local STR4='n\np\n3\n\n\n'
    local STR5="t\n2\n82\nt\n3\n${TYP3}"
    local STR6='\nw\nq\n'
    echo -e "$STR1$STR2$STR4$STR5$STR6" | fdisk $2 >& /tmp/fdisk.log
}
#-----------------------------------------------------------------------
make_filesystems() { # $1 is Target device
    if [ -z "$1" ]; then
	Abort "make_filesystems <Target Device>"
    fi
    if [ ! -b "$1" ]; then
	Abort "make_filesystems needs a block device name"
    fi
    $OSD "creating filesystem\\non ${1}1\\n" green 5 &
    mke2fs -q $FS1args ${1}1	### note: hard coded partition 1
    $OSD "creating swap\\non ${1}2\\n" green 5 &
    mkswap ${1}2
    $OSD "creating filesystem\\non ${1}3\\n" green 5 &
    mkdosfs $FS3args ${1}3
    $OSD "add mbr\\n" green 5 &
    lilo -A $1 1
    lilo -M $1 mbr
}
#-----------------------------------------------------------------------
copy_system() { # $1 is Target device
    if [ -z "$1" -o ! -b "$1" ]; then
	Abort "copy_system needs a block device"
    fi
    MNT=/mnt/tmp
    $OSD "mounting ${1}1\\non $MNT\\n" green 5 &
    mkdir -p $MNT
    mount ${1}1 $MNT || Abort "mount failed"
    for dir in $CPdirs ; do
	case $dir in
	    usr)
		mkdir $MNT/$dir
		for sd in $(cd /$dir ; ls) ; do
		    $OSD "copying\\n$dir/$sd\\n" green 100 &
		    cp -a /$dir/$sd $MNT/$dir
		done
		;;
	    *)
		$OSD "copying\\n$dir\\n" green 100 &
		cp -a /$dir $MNT
		;;
	esac
    done
    $OSD "making subdirectories\\n" green 5 &
    for dir in $MKdirs ; do
	mkdir -p $MNT/$dir
    done
    chmod 01777 $MNT/tmp
    $OSD "mounting media\\non $MNT\\n" green 5 &
    mount -t vfat ${1}3 $MNT/myth || Abort "mount ${1}3 failed"
    $OSD "setup media\\ndirectories\\n" green 5 &
    mkdir -p $MNT/myth/music $MNT/myth/video
    mkdir -p $MNT/media/movies/music/disks $MNT/media/movies/video/disks
    chown -R mythtv.mythtv /myth $MNT/media/movies
    $OSD "cleanup $MNT/var/log\\n" green 10 &
    find $MNT/var/log -name \*.gz -exec rm -f {} \;
    find $MNT/var/log -type f -exec sh -c "echo -n '' > {}" \;
    rm -f $MNT/var/log/mysql/*
    #
    $OSD "make $1 bootable\\n" green 5 &
    mount --bind /dev  $MNT/dev
    mount --bind /proc $MNT/proc
    lilo -r $MNT -b $1
    $OSD "unmounting\\n$1\\n" green 5 &
    sync ; sync
    umount $MNT/proc
    umount $MNT/dev
    umount $MNT/myth	|| Abort "umount $MNT/myth failed"
    umount $MNT		|| Abort "umount $MNT failed"
    $OSD "Create System Disk\\nFinished.\\n" green 5 &
}
########################################################################
# Main:
#-----------------------------------------------------------------------
{ # for the redirect below:
    create_partitions	$Sdev	$Tdev
    make_filesystems		$Tdev
    copy_system			$Tdev
} >& /tmp/clone.out
########################################################################
# End
