#! /usr/bin/expect --
##
## $Id: jlogin.in 2162 2010-03-15 21:20:31Z heas $
##
## rancid 2.3.3
## Copyright (c) 1997-2009 by Terrapin Communications, Inc.
## All rights reserved.
##
## This code is derived from software contributed to and maintained by
## Terrapin Communications, Inc. by Henry Kilmer, John Heasley, Andrew Partan,
## Pete Whiting, Austin Schutz, and Andrew Fort.
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions
## are met:
## 1. Redistributions of source code must retain the above copyright
##    notice, this list of conditions and the following disclaimer.
## 2. Redistributions in binary form must reproduce the above copyright
##    notice, this list of conditions and the following disclaimer in the
##    documentation and/or other materials provided with the distribution.
## 3. All advertising materials mentioning features or use of this software
##    must display the following acknowledgement:
##        This product includes software developed by Terrapin Communications,
##        Inc. and its contributors for RANCID.
## 4. Neither the name of Terrapin Communications, Inc. nor the names of its
##    contributors may be used to endorse or promote products derived from
##    this software without specific prior written permission.
## 5. It is requested that non-binding fixes and modifications be contributed
##    back to Terrapin Communications, Inc.
##
## THIS SOFTWARE IS PROVIDED BY Terrapin Communications, INC. AND CONTRIBUTORS
## ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
## TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
## PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COMPANY OR CONTRIBUTORS
## BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
## CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
## SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
## INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
## CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
## ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
## POSSIBILITY OF SUCH DAMAGE.
# 
#  The expect login scripts were based on Erik Sherk's gwtn, by permission.
#
# jlogin - juniper login
#
# Most options are intuitive for logging into a Cisco router.
# The default username password is the same as the vty password.
#

# Usage line
set usage "Usage: $argv0 \[-dSV\] \[-c command\] \[-Evar=x\] \
\[-f cloginrc-file\] \[-p user-password\] \[-r passphrase\] \[-s script-file\] \
\[-u username\] \[-t timeout\] \[-x command-file\] \[-y ssh_cypher_type\] \
router \[router...\]\n"

# env(CLOGIN) may contain the following chars:
#	x == do not set xterm banner or name

# Password file
set password_file $env(HOME)/.cloginrc
# Default is to login to the router
set do_command 0
set do_script 0
# The default is to automatically enable
set avenable 1
# The default is to look in the password file to find the passwords.  This
# tracks if we receive them on the command line.
set do_passwd 1
# Save config, if prompted
set do_saveconfig 0
# Sometimes routers take awhile to answer (the default is 10 sec)
set timeoutdflt 120

# Find the user in the ENV, or use the unix userid.
if {[ info exists env(CISCO_USER) ]} {
    set default_user $env(CISCO_USER)
} elseif {[ info exists env(USER) ]} {
    set default_user $env(USER)
} elseif {[ info exists env(LOGNAME) ]} {
    set default_user $env(LOGNAME)
} else {
    # This uses "id" which I think is portable.  At least it has existed
    # (without options) on all machines/OSes I've been on recently -
    # unlike whoami or id -nu.
    if [ catch {exec id} reason ] {
	send_error "\nError: could not exec id: $reason\n"
	exit 1
    }
    regexp {\(([^)]*)} "$reason" junk default_user
}
if {[ info exists env(CLOGINRC) ]} {
    set password_file $env(CLOGINRC)
}

# Process the command line
for {set i 0} {$i < $argc} {incr i} {
    set arg [lindex $argv $i]

    switch  -glob -- $arg {
	# Command to run.
	-c* -
	-C* {
	    if {! [  regexp .\[cC\](.+) $arg ignore command]} {
		incr i
		set command [ lindex $argv $i ]
	    }
	    set do_command 1
	# Expect debug mode
	} -d* {
	    exp_internal 1
	# Environment variable to pass to -s scripts
	} -E* {
	    if {[ regexp .\[E\](.+)=(.+) $arg ignore varname varvalue]} {
		set E$varname $varvalue
	    } else {
		send_user "\nError: invalid format for -E in $arg\n"
		exit 1
	    }
	# alternate cloginrc file
	} -f* {
	    if {! [ regexp .\[fF\](.+) $arg ignore password_file]} {
		incr i
		set password_file [ lindex $argv $i ]
	    }
	# user Password
	} -p* {
	    if {! [  regexp .\[pP\](.+) $arg ignore userpasswd]} {
		incr i
		set userpasswd [ lindex $argv $i ]
	    }
	    set do_passwd 0
	# Version string
	} -V* {
	    send_user "rancid 2.3.3\n"
	    exit 0
	# passphrase
	} -r* {
	    if {! [  regexp .\[rR\](.+) $arg ignore passphrase]} {
		incr i
		set avpassphrase [ lindex $argv $i ]
	    }
	# Expect script to run.
	} -s* {
	    if {! [  regexp .\[sS\](.+) $arg ignore sfile]} {
		incr i
		set sfile [ lindex $argv $i ]
	    }
	    if { ! [ file readable $sfile ] } {
		send_user "\nError: Can't read $sfile\n"
		exit 1
	    }
	    set do_script 1
	# save config on exit
	} -S* {
	    set do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	    if {! [ regexp .\[tPset do_saveconfig 1
	# Timeout
	} -t* {
	 