Linuxdoc Linux Questions
Click here to ask our community of linux experts!
Custom Search

B. Clone script

#!/bin/bash

set -e

export PATH=/sbin:/bin

tftp_server=10.0.0.1
nic_module=3c59x.o
major_a=(2 3 22)
family_a=(fd hda hdc)
image_a=(img0001 img0002 img0003 img0004)

operation_a=(   "Copy from network to device" \
                "Copy from device to network" \
                "Run fdisk")

mount -t proc proc /proc
insmod /lib/${nic_module}
/sbin/dhcpcd

while true; do \
        [ ! -z "${image}" ] && unset image
        echo
        echo "Clone Menu"
        echo
        echo "Operation"
        echo
        PS3="Choose operation (1-${#operation_a[*]}): "
        select operation in "${operation_a[@]}"; do \
                [ -z "${operation}" ] && continue
                echo
                echo $REPLY - $operation
                echo
                break
        done

        echo "Device Family"
        echo
        PS3="Choose device family (1-${#family_a[*]}): "
        select family in "${family_a[@]}"; do \
                [ -z "${family}" ] && continue
                echo
                echo $REPLY - $family
                echo
                break
        done

        major_i=$[REPLY-1]
        major=${major_a[$major_i]}

        echo "Minor Number"
        echo
        PS3="Choose minor number (0-255): "
        echo -n "$PS3" >&2
        read minor
        minor=$[minor%256]
        echo
        echo $minor
        echo

        if [ "${operation}" != "${operation_a[2]}" ]; then \
                echo "Image"
                echo
                PS3="Choose image (1-${#image_a[*]}): "
                select image in "${image_a[@]}"; do \
                        [ -z "${image}" ] && continue
                        echo
                        echo $REPLY - $image
                        echo
                        break
                done
                image_i=$[REPLY-1]
                image=${image_a[${image_i}]}
        fi

        echo
        echo -e "Operation:\t$operation"
        device_name=/dev/${family_a[${major_i}]}${minor}
        echo -e "Device:\t\t${device_name} ($major, $minor)"
        [ ! -z "${image}" ] && echo -e "Image:\t\t${image}"
        echo

        echo "Confirmation"
        echo
        PS3="Ok/Cancel (1-2): "
        select ok in Ok Cancel; do \
                [ -z "${ok}" ] && continue
                echo
                echo $REPLY - $ok
                echo
                break
        done
        if [ "${ok}" = "Ok" ]; then \
                if [ ! -b ${device_name} ]; then \
                        echo "Creating ${device_name}"
                        mknod ${device_name} b ${major} ${minor}
                fi
                if [ ! -z "${image}" ]; then \
                        if [ ! -p ${image} ]; then \
                                echo "Creating pipe"
                                mknod ${image} p
                        fi
                fi
                if [ "${operation}" = "${operation_a[0]}" ]; then \
                        tftp ${tftp_server} <<-EOT &
                        binary
                        get ${image}
                        EOT
                        gzip -c -d < ${image} | dd of=${device_name}
                elif [ "${operation}" = "${operation_a[1]}" ]; then \
                        tftp ${tftp_server} <<-EOT &
                        binary
                        put ${image}
                        EOT
                        dd if=${device_name} | gzip -c > ${image}
                elif [ "${operation}" = "${operation_a[2]}" ]; then \
                        fdisk ${device_name}
                fi
                echo
        fi

        echo "Continuation"
        echo
        PS3="Continue/Exit (1-2): "
        select new in Continue Exit; do \
                [ -z "${new}" ] && continue
                echo
                echo $REPLY - $new
                echo
                break
        done
        [ "${new}" = "Exit" ] && break
done
exit 0