#!/bin/bash
pushd ~/test/ine.ccie.rsv5.workbook.initial.configs > /dev/null

CONFIG_DIR=""
CONFIG_DIR_PRE=""
LIST=($(dir | egrep "^" | awk -F. '{print $1}' | sort | uniq))

GNS3HOST=127.0.0.1
BASEPORT=2100
TFTPHOST=192.168.200.200

function sendconfig () {
# enter selected config directory
pushd $CONFIG_DIR > /dev/null

# do expect scripting for R1 to R20, SW1 to SW4.
ROUTER_NUM=`expr $(ls -l R*.cfg | wc -l) + 1`
expect -c "
match_max 20
set timeout 5
log_user 0
log_file -noappend -a /tmp/sendconfig.log
set i 1
while {\$i < $ROUTER_NUM} {
    puts \"------------------------------------------------------------\"
    puts [exec \"date\"]
    send_user \"Send config to R\$i...\"
    puts \"\r\n------------------------------------------------------------\"
    set PORT [expr $BASEPORT + \$i]

    spawn telnet $GNS3HOST \$PORT
    set timeout 1
    expect \"Connection refused\" {
        send_user \"\\033\\[1;31m\"
        send_user \"R\$i connect NG!\r\n\"
        send_user \"\\033\\[0;39m\"
        incr i 1
        continue
    }
    #if {\$i==1} { exp_internal 1} else { exp_internal 0 }
    send \"\r\n\"
    expect \"R\$i\\u0007\"
    send \"\r\n\r\n\"
    expect \"\r\n\r\nR\$i#\"
    set timeout 60
    send \"config replace tftp://$TFTPHOST/$CONFIG_DIR.\$i.cfg force\r\n\"
    expect {
        \"\r\nError: \" {
            send \"config replace tftp://$TFTPHOST/default.R\$i.cfg force\r\n\"
            expect \"Rollback Done\"
            set timeout 1
            send \"\r\n\"
            expect \"R\$i#\"
            set fp [open \"R\$i.cfg\"]
            while {! [eof \$fp]} {
                gets \$fp line
                send \"\$line\r\n\"
                expect \"R\$i\(\"
            }
            close \$fp
            expect \"R\$i#\"
            set timeout 60
            send \"\copy run tftp://$TFTPHOST/$CONFIG_DIR.\$i.cfg\r\n\"
            expect \"]\"
            send \"\r\n\"
            expect \"]\"
            send \"\r\n\"
            expect \"R\$i#\"
            close
        }
        \"\r\nRollback Done\" {
            expect \"R\$i#\"
            close
        }
    }
    incr i 1
}
if {[file exists \"SW1.cfg\"]} {
    set i 1
    while {\$i < 5} {
       puts \"------------------------------------------------------------\"
       puts [exec \"date\"]
       send_user \"Send config to SW\$i...\"
       puts \"\r\n--------------------------------------------------------\"
       set PORT [expr $BASEPORT + 10 + \$i]

       spawn telnet $GNS3HOST \$PORT
       send \"\r\n\r\n\"
       expect \"SW\$i#\"
       set fp [open \"SW\$i.cfg\"]
       while {! [eof \$fp]} {
           gets \$fp line
           send \"\$line\r\n\"
           expect \"SW\$i\(\"
       }
       close \$fp
       expect \"SW\$i#\"
       incr i 1
    }
}
send_user \"send Configuration done.\r\n\"
exit
"
popd > /dev/null

}

if [ ! -z $1 ]; then
    CONFIG_DIR=$1
    echo ------------------------------------------------------------
    echo SELECTED: [ $CONFIG_DIR ]
    echo ------------------------------------------------------------
    sendconfig
    exit
fi

# create menu
PS3="complete=0 > "
while :
do
    clear
    echo ------------------------------------------------------------
    echo SELECTED: [ $CONFIG_DIR ]
    echo ------------------------------------------------------------

    if [ ${#LIST[*]} -eq 0 ]; then
        break
    fi

    select SEL in ${LIST[*]}
    do
        if [ ${REPLY} = "q" ]; then # || [ ${REPLY} = "0" ]; then
            echo "Exit Menu."
            exit 0;
        else
        case "${REPLY}" in
            # Top
            "t" )
            echo "Goto Top."
            CONFIG_DIR=""
            NUMBER_OF_FIELD=0
            break
            ;;
            # Upper
            "u" )
            # Not last 1 hop to top menu.
            if [ ${NUMBER_OF_FIELD} -gt 1 ]; then
                let NUMBER_OF_FIELD=${NUMBER_OF_FIELD}-1
                CONFIG_DIR=${CONFIG_DIR_PRE}
            else
                NUMBER_OF_FIELD=0
                CONFIG_DIR=""
                CONFIG_DIR_PRE=""
            fi
            break
            ;;
            "0" )
            # complete menu check
            if [ -d $CONFIG_DIR ]; then
                break 2
            fi
            echo "### Directory NOT Exist! ###"
            continue
            ;;
            * )
            # Check mishit-key
            if [ -z $SEL ]; then
                # complete directory
                if [ ! -z $CONFIG_DIR ] && [ -d $CONFIG_DIR ]; then
                    break 2
                fi
                echo "### Directory NOT Exist! ###"
                continue 2
            fi
            if [ -z $CONFIG_DIR ]; then
                NUMBER_OF_FIELD=1
                CONFIG_DIR=${SEL}
            else
                CONFIG_DIR_PRE=${CONFIG_DIR}
                CONFIG_DIR=${CONFIG_DIR}.${SEL}
                NUMBER_OF_FIELD=`echo "$CONFIG_DIR"  | awk -F. '{print NF}'`
            fi
        esac
        fi
        break
    done
    LIST=($(dir | egrep "^${CONFIG_DIR}" | awk -v NUMFIELD=$NUMBER_OF_FIELD -F. 'BEGIN{NUMFIELD = NUMFIELD + 1} {print $NUMFIELD}' | sort | uniq))
done

sendconfig

popd > /dev/null