<div dir="ltr"><div style="font-size:13px">I have an issue with config collection on  Huawei routers (AR150)</div><div style="font-size:13px"><br></div><div style="font-size:13px">It looks to me like a prompt issue but I might be wrong, </div><div style="font-size:13px"><br></div><div style="font-size:13px">The prompts look like -</div><div style="font-size:13px"><br></div><div style="font-size:13px">Unprivileged prompt </div><div style="font-size:13px"><NET1111-DSL-XXXXXX.CE3><br></div><div style="font-size:13px"><br></div><div style="font-size:13px">Privileged prompt </div><div style="font-size:13px">[NET1111-DSL-XXXXXX.CE3]<br></div><div style="font-size:13px"><br></div><div style="font-size:13px">I can see in the mailing lists that you did some work on h3clogin and h3crancid? did your version of these expect the > and ] prompts , if not , can you point me in the right direction of where in the scripts I need to modify the prompt, I believe it is the ] prompt which is causing issues.</div><div style="font-size:13px"><br></div><div style="font-size:13px">If I run the following  -</div><div style="font-size:13px"><br></div><div style="font-size:13px">/usr/local/rancid/bin/h3clogin -t 40 -c"display current-configuration" 10.1.2.3<br></div><div style="font-size:13px"><br></div><div style="font-size:13px">This is the output I get -</div><div style="font-size:13px"><br></div><div style="font-size:13px"><div>[rancid@zuffle bin]$ /usr/local/rancid/bin/h3clogin -t 40 -c"display current-configuration" 10.1.2.3</div><div>10.1.2.3</div><div>spawn telnet 10.1.2.3</div><div>Trying 10.1.2.3...</div><div>Connected to 10.1.2.3.</div><div>Escape character is '^]'.</div><div><br></div><div><br></div><div>Login authentication</div><div><br></div><div><br></div><div>Username:rancid</div><div>Password:</div><div><NET1111-DSL-XXXXXX.CE3>undo terminal monitor</div><div>Info: Current terminal monitor is off.</div><div><NET1111-DSL-XXXXXX.CE3>screen-length 0 temporary</div><div>Info: The configuration takes effect on the current user terminal interface only.</div><div><NET1111-DSL-XXXXXX.CE3>system-view</div><div>Enter system view, return user view with Ctrl+Z.</div><div>[NET1111-DSL-XXXXXX.CE3]</div><div>Error: TIMEOUT reached</div><div>can not find channel named "exp4"</div><div>    while executing</div><div>"close"</div><div>    ("foreach" body line 136)</div><div>    invoked from within</div><div>"foreach router [lrange $argv $i end] {</div><div>    set router [string tolower $router]</div><div>    send_user "$router\n"</div><div><br></div><div>    # Figure out prompt.</div><div>    # Since autoena..."</div><div>    (file "/usr/local/rancid/bin/h3clogin" line 578)</div></div><div style="font-size:13px"><br></div><div style="font-size:13px">As you can see rancid manages to login to the router , run a couple of commands then runs the system-view command to become privileged which works but then doesn't move on to run the display current-configuration, instead the process just times out. To me it looks like change of prompt is confusing the expect script?.</div><div style="font-size:13px"><br></div><div style="font-size:13px">For completeness here is the h3clogin script I am using - any help is greatly appreciated!!</div><div style="font-size:13px"><br></div><div style="font-size:13px">Thanks daze</div><div style="font-size:13px"><br></div><div style="font-size:13px"><br></div><div style="font-size:13px"><div>#! /usr/bin/expect --</div><div>## $Id: <a href="http://h3clogin.in/" target="_blank">h3clogin.in</a>,v 1.79 2004/05/27 21:57:52 heas Exp $</div><div>##</div><div>## Copyright (C) 1997-2004 by Terrapin Communications, Inc.</div><div>## All rights reserved.</div><div>##</div><div>## This software may be freely copied, modified and redistributed</div><div>## without fee for non-commerical purposes provided that this license</div><div>## remains intact and unmodified with any RANCID distribution.</div><div>##</div><div>## There is no warranty or other guarantee of fitness of this software.</div><div>## It is provided solely "as is".  The author(s) disclaim(s) all</div><div>## responsibility and liability with respect to this software's usage</div><div>## or its effect upon hardware, computer systems, other software, or</div><div>## anything else.</div><div>##</div><div>## Except where noted otherwise, rancid was written by and is maintained by</div><div>## Henry Kilmer, John Heasley, Andrew Partan, Pete Whiting, and Austin Schutz.</div><div>##</div><div>#</div><div># The login expect scripts were based on Erik Sherk's gwtn, by permission.</div><div>#</div><div># h3clogin - H3C (Huawei-3Com) login</div><div>#</div><div># Most options are intuitive for logging into a Cisco router.</div><div># The default is to enable (thus -noenable).  Some folks have</div><div># setup tacacs to have a user login at priv-lvl = 15 (enabled)</div><div># so the -autoenable flag was added for this case (don't go through</div><div># the process of enabling and the prompt will be the "#" prompt.</div><div># The default username password is the same as the vty password.</div><div>#</div><div><br></div><div># Set to 1 to enable some debugging:</div><div>exp_internal 0</div><div><br></div><div># Usage line</div><div>set usage "Usage: $argv0 \[-autoenable\] \[-noenable\] \[-c command\] \</div><div>\[-Evar=x\] \[-e enable-password\] \[-f cloginrc-file\] \[-p user-password\] \</div><div>\[-s script-file\] \[-t timeout\] \[-u username\] \</div><div>\[-v vty-password\] \[-w enable-username\] \[-x command-file\] \</div><div>\[-y ssh_cypher_type\] router \[router...\]\n"</div><div><br></div><div># env(CLOGIN) may contain:</div><div>#<span style="white-space:pre-wrap">   </span>x == do not set xterm banner or name</div><div><br></div><div># Password file</div><div>set password_file $env(HOME)/.cloginrc</div><div># Default is to login to the router</div><div>set do_command 0</div><div>set do_script 0</div><div># The default is to automatically enable</div><div>set avenable 1</div><div># The default is that you login non-enabled (tacacs can have you login already</div><div># enabled)</div><div>set avautoenable 0</div><div># The default is to look in the password file to find the passwords.  This</div><div># tracks if we receive them on the command line.</div><div>set do_passwd 1</div><div>set do_enapasswd 1</div><div># attempt at platform switching.</div><div>set platform ""</div><div><br></div><div># Find the user in the ENV, or use the unix userid.</div><div>if {[ info exists env(CISCO_USER) ] } {</div><div>    set default_user $env(CISCO_USER)</div><div>} elseif {[ info exists env(USER) ]} {</div><div>    set default_user $env(USER)</div><div>} elseif {[ info exists env(LOGNAME) ]} {</div><div>    set default_user $env(LOGNAME)</div><div>} else {</div><div>    # This uses "id" which I think is portable.  At least it has existed</div><div>    # (without options) on all machines/OSes I've been on recently -</div><div>    # unlike whoami or id -nu.</div><div>    if [ catch {exec id} reason ] {</div><div><span style="white-space:pre-wrap">  </span>send_error "\nError: could not exec id: $reason\n"</div><div><span style="white-space:pre-wrap">     </span>exit 1</div><div>    }</div><div>    regexp {\(([^)]*)} "$reason" junk default_user</div><div>}</div><div><br></div><div># Sometimes routers take awhile to answer (the default is 10 sec)</div><div>set timeout 45</div><div><br></div><div># Process the command line</div><div>for {set i 0} {$i < $argc} {incr i} {</div><div>    set arg [lindex $argv $i]</div><div><br></div><div>    switch  -glob -- $arg {</div><div><span style="white-space:pre-wrap">     </span># Username</div><div><span style="white-space:pre-wrap">       </span>-u* -</div><div><span style="white-space:pre-wrap">    </span>-U* {</div><div><span style="white-space:pre-wrap">    </span>    if {! [  regexp .\[uU\](.+) $arg ignore user]} {</div><div><span style="white-space:pre-wrap">         </span>incr i</div><div><span style="white-space:pre-wrap">           </span>set username [ lindex $argv $i ]</div><div><span style="white-space:pre-wrap"> </span>    }</div><div><span style="white-space:pre-wrap"> </span># VTY Password</div><div><span style="white-space:pre-wrap">   </span>} -p* -</div><div><span style="white-space:pre-wrap">  </span>-P* {</div><div><span style="white-space:pre-wrap">    </span>    if {! [  regexp .\[pP\](.+) $arg ignore userpasswd]} {</div><div><span style="white-space:pre-wrap">           </span>incr i</div><div><span style="white-space:pre-wrap">           </span>set userpasswd [ lindex $argv $i ]</div><div><span style="white-space:pre-wrap">       </span>    }</div><div><span style="white-space:pre-wrap"> </span>    set do_passwd 0</div><div><span style="white-space:pre-wrap">   </span># VTY Password</div><div><span style="white-space:pre-wrap">   </span>} -v* -</div><div><span style="white-space:pre-wrap">  </span>-v* {</div><div><span style="white-space:pre-wrap">    </span>    if {! [  regexp .\[vV\](.+) $arg ignore passwd]} {</div><div><span style="white-space:pre-wrap">               </span>incr i</div><div><span style="white-space:pre-wrap">           </span>set passwd [ lindex $argv $i ]</div><div><span style="white-space:pre-wrap">   </span>    }</div><div><span style="white-space:pre-wrap"> </span>    set do_passwd 0</div><div><span style="white-space:pre-wrap">   </span># Enable Username</div><div><span style="white-space:pre-wrap">        </span>} -w* -</div><div><span style="white-space:pre-wrap">  </span>-W* {</div><div><span style="white-space:pre-wrap">    </span>    if {! [  regexp .\[wW\](.+) $arg ignore enauser]} {</div><div><span style="white-space:pre-wrap">              </span>incr i</div><div><span style="white-space:pre-wrap">           </span>set enausername [ lindex $argv $i ]</div><div><span style="white-space:pre-wrap">      </span>    }</div><div><span style="white-space:pre-wrap"> </span># Environment variable to pass to -s scripts</div><div><span style="white-space:pre-wrap">     </span>} -E*</div><div><span style="white-space:pre-wrap">    </span>{</div><div><span style="white-space:pre-wrap">        </span>    if {[ regexp .\[E\](.+)=(.+) $arg ignore varname varvalue]} {</div><div><span style="white-space:pre-wrap">             </span>set E$varname $varvalue</div><div><span style="white-space:pre-wrap">  </span>    } else {</div><div><span style="white-space:pre-wrap">          </span>send_user "\nError: invalid format for -E in $arg\n"</div><div><span style="white-space:pre-wrap">           </span>exit 1</div><div><span style="white-space:pre-wrap">   </span>    }</div><div><span style="white-space:pre-wrap"> </span># Enable Password</div><div><span style="white-space:pre-wrap">        </span>} -e*</div><div><span style="white-space:pre-wrap">    </span>{</div><div><span style="white-space:pre-wrap">        </span>    if {! [  regexp .\[e\](.+) $arg ignore enapasswd]} {</div><div><span style="white-space:pre-wrap">             </span>incr i</div><div><span style="white-space:pre-wrap">           </span>set enapasswd [ lindex $argv $i ]</div><div><span style="white-space:pre-wrap">        </span>    }</div><div><span style="white-space:pre-wrap"> </span>    set do_enapasswd 0</div><div><span style="white-space:pre-wrap">        </span># Command to run.</div><div><span style="white-space:pre-wrap">        </span>} -c* -</div><div><span style="white-space:pre-wrap">  </span>-C* {</div><div><span style="white-space:pre-wrap">    </span>    if {! [  regexp .\[cC\](.+) $arg ignore command]} {</div><div><span style="white-space:pre-wrap">              </span>incr i</div><div><span style="white-space:pre-wrap">           </span>set command [ lindex $argv $i ]</div><div><span style="white-space:pre-wrap">  </span>    }</div><div><span style="white-space:pre-wrap"> </span>    set do_command 1</div><div><span style="white-space:pre-wrap">  </span># Expect script to run.</div><div><span style="white-space:pre-wrap">  </span>} -s* -</div><div><span style="white-space:pre-wrap">  </span>-S* {</div><div><span style="white-space:pre-wrap">    </span>    if {! [  regexp .\[sS\](.+) $arg ignore sfile]} {</div><div><span style="white-space:pre-wrap">                </span>incr i</div><div><span style="white-space:pre-wrap">           </span>set sfile [ lindex $argv $i ]</div><div><span style="white-space:pre-wrap">    </span>    }</div><div><span style="white-space:pre-wrap"> </span>    if { ! [ file readable $sfile ] } {</div><div><span style="white-space:pre-wrap">               </span>send_user "\nError: Can't read $sfile\n"</div><div><span style="white-space:pre-wrap">           </span>exit 1</div><div><span style="white-space:pre-wrap">   </span>    }</div><div><span style="white-space:pre-wrap"> </span>    set do_script 1</div><div><span style="white-space:pre-wrap">   </span># 'ssh -c' cypher type</div><div><span style="white-space:pre-wrap">   </span>} -y* -</div><div><span style="white-space:pre-wrap">  </span>-Y* {</div><div><span style="white-space:pre-wrap">    </span>    if {! [  regexp .\[eE\](.+) $arg ignore cypher]} {</div><div><span style="white-space:pre-wrap">               </span>incr i</div><div><span style="white-space:pre-wrap">           </span>set cypher [ lindex $argv $i ]</div><div><span style="white-space:pre-wrap">   </span>    }</div><div><span style="white-space:pre-wrap"> </span># alternate cloginrc file</div><div><span style="white-space:pre-wrap">        </span>} -f* -</div><div><span style="white-space:pre-wrap">  </span>-F* {</div><div><span style="white-space:pre-wrap">    </span>    if {! [ regexp .\[fF\](.+) $arg ignore password_file]} {</div><div><span style="white-space:pre-wrap">          </span>incr i</div><div><span style="white-space:pre-wrap">           </span>set password_file [ lindex $argv $i ]</div><div><span style="white-space:pre-wrap">    </span>    }</div><div><span style="white-space:pre-wrap"> </span># Timeout</div><div><span style="white-space:pre-wrap">        </span>} -t* -</div><div><span style="white-space:pre-wrap">  </span>-T* {</div><div><span style="white-space:pre-wrap">    </span>    if {! [ regexp .\[tT\](.+) $arg ignore timeout]} {</div><div><span style="white-space:pre-wrap">                </span>incr i</div><div><span style="white-space:pre-wrap">   </span>        set timeout [ lindex $argv $i ]</div><div><span style="white-space:pre-wrap">     </span>    }</div><div><span style="white-space:pre-wrap"> </span># Command file</div><div><span style="white-space:pre-wrap">   </span>} -x* -</div><div><span style="white-space:pre-wrap">  </span>-X {</div><div><span style="white-space:pre-wrap">     </span>    if {! [  regexp .\[xX\](.+) $arg ignore cmd_file]} {</div><div><span style="white-space:pre-wrap">             </span>incr i</div><div><span style="white-space:pre-wrap">           </span>set cmd_file [ lindex $argv $i ]</div><div><span style="white-space:pre-wrap"> </span>    }</div><div><span style="white-space:pre-wrap"> </span>    if [ catch {set cmd_fd [open $cmd_file r]} reason ] {</div><div><span style="white-space:pre-wrap">             </span>send_user "\nError: $reason\n"</div><div><span style="white-space:pre-wrap">         </span>exit 1</div><div><span style="white-space:pre-wrap">   </span>    }</div><div><span style="white-space:pre-wrap"> </span>    set cmd_text [read $cmd_fd]</div><div><span style="white-space:pre-wrap">       </span>    close $cmd_fd</div><div><span style="white-space:pre-wrap">     </span>    set command [join [split $cmd_text \n] \;]</div><div><span style="white-space:pre-wrap">        </span>    set do_command 1</div><div><span style="white-space:pre-wrap">  </span># Do we enable?</div><div><span style="white-space:pre-wrap">  </span>} -noenable {</div><div><span style="white-space:pre-wrap">    </span>    set avenable 0</div><div><span style="white-space:pre-wrap">    </span># Does tacacs automatically enable us?</div><div><span style="white-space:pre-wrap">   </span>} -autoenable {</div><div><span style="white-space:pre-wrap">  </span>    set avautoenable 1</div><div><span style="white-space:pre-wrap">        </span>    set avenable 0</div><div><span style="white-space:pre-wrap">    </span>} -* {</div><div><span style="white-space:pre-wrap">   </span>    send_user "\nError: Unknown argument! $arg\n"</div><div><span style="white-space:pre-wrap">   </span>    send_user $usage</div><div><span style="white-space:pre-wrap">  </span>    exit 1</div><div><span style="white-space:pre-wrap">    </span>} default {</div><div><span style="white-space:pre-wrap">      </span>    break</div><div><span style="white-space:pre-wrap">     </span>}</div><div>    }</div><div>}</div><div># Process routers...no routers listed is an error.</div><div>if { $i == $argc } {</div><div>    send_user "\nError: $usage"</div><div>}</div><div><br></div><div># Only be quiet if we are running a script (it can log its output</div><div># on its own)</div><div>if { $do_script } {</div><div>    log_user 0</div><div>} else {</div><div>    log_user 1</div><div>}</div><div><br></div><div>#</div><div># Done configuration/variable setting.  Now run with it...</div><div>#</div><div><br></div><div># Sets Xterm title if interactive...if its an xterm and the user cares</div><div>proc label { host } {</div><div>    global env</div><div>    # if CLOGIN has an 'x' in it, don't set the xterm name/banner</div><div>    if [info exists env(CLOGIN)] {</div><div><span style="white-space:pre-wrap">   </span>if {[string first "x" $env(CLOGIN)] != -1} { return }</div><div>    }</div><div>    # take host from ENV(TERM)</div><div>    if [info exists env(TERM)] {</div><div><span style="white-space:pre-wrap">    </span>if [regexp \^(xterm|vs) $env(TERM) ignore ] {</div><div><span style="white-space:pre-wrap">    </span>    send_user "\033]1;[lindex [split $host "."] 0]\a"</div><div><span style="white-space:pre-wrap">     </span>    send_user "\033]2;$host\a"</div><div><span style="white-space:pre-wrap">      </span>}</div><div>    }</div><div>}</div><div><br></div><div># This is a helper function to make the password file easier to</div><div># maintain.  Using this the password file has the form:</div><div># add password sl*<span style="white-space:pre-wrap">  </span>pete cow</div><div># add password at*<span style="white-space:pre-wrap">       </span>steve</div><div># add password *<span style="white-space:pre-wrap">    </span>hanky-pie</div><div>proc add {var args} { global int_$var ; lappend int_$var $args}</div><div>proc include {args} {</div><div>    global env</div><div>    regsub -all "(^{|}$)" $args {} args</div><div>    if { [ regexp "^/" $args ignore ] == 0 } {</div><div><span style="white-space:pre-wrap">    </span>set args $env(HOME)/$args</div><div>    }</div><div>    source_password_file $args</div><div>}</div><div><br></div><div>proc find {var router} {</div><div>    upvar int_$var list</div><div>    if { [info exists list] } {</div><div><span style="white-space:pre-wrap">   </span>foreach line $list {</div><div><span style="white-space:pre-wrap">     </span>    if { [string match [lindex $line 0] $router ] } {</div><div><span style="white-space:pre-wrap">         </span>return [lrange $line 1 end]</div><div><span style="white-space:pre-wrap">      </span>    }</div><div><span style="white-space:pre-wrap"> </span>}</div><div>    }</div><div>    return {}</div><div>}</div><div><br></div><div># Loads the password file.  Note that as this file is tcl, and that</div><div># it is sourced, the user better know what to put in there, as it</div><div># could install more than just password info...  I will assume however,</div><div># that a "bad guy" could just as easy put such code in the clogin</div><div># script, so I will leave .cloginrc as just an extention of that script</div><div>proc source_password_file { password_file } {</div><div>    global env</div><div>    if { ! [file exists $password_file] } {</div><div><span style="white-space:pre-wrap">  </span>send_user "\nError: password file ($password_file) does not exist\n"</div><div><span style="white-space:pre-wrap">   </span>exit 1</div><div>    }</div><div>    file stat $password_file fileinfo</div><div>    if { [expr ($fileinfo(mode) & 007)] != 0000 } {</div><div><span style="white-space:pre-wrap">       </span>send_user "\nError: $password_file must not be world readable/writable\n"</div><div><span style="white-space:pre-wrap">      </span>exit 1</div><div>    }</div><div>    if [ catch {source $password_file} reason ] {</div><div><span style="white-space:pre-wrap">   </span>send_user "\nError: $reason\n"</div><div><span style="white-space:pre-wrap"> </span>exit 1</div><div>    }</div><div>}</div><div><br></div><div># Log into the router.</div><div>proc login { router user userpswd passwd enapasswd cmethod cyphertype } {</div><div>    global spawn_id in_proc do_command do_script platform</div><div>    global prompt u_prompt p_prompt e_prompt sshcmd</div><div>    set in_proc 1</div><div>    set uprompt_seen 0</div><div><br></div><div>    # try each of the connection methods in $cmethod until one is successful</div><div>    set progs [llength $cmethod]</div><div>    foreach prog [lrange $cmethod 0 end] {</div><div><span style="white-space:pre-wrap">      </span>if [string match "telnet*" $prog] {</div><div><span style="white-space:pre-wrap">    </span>    regexp {telnet(:([^[:space:]]+))*} $prog command suffix port</div><div><span style="white-space:pre-wrap">      </span>    if {"$port" == ""} {</div><div><span style="white-space:pre-wrap">          </span>set retval [ catch {spawn telnet $router} reason ]</div><div><span style="white-space:pre-wrap">       </span>    } else {</div><div><span style="white-space:pre-wrap">          </span>set retval [ catch {spawn telnet $router $port} reason ]</div><div><span style="white-space:pre-wrap"> </span>    }</div><div><span style="white-space:pre-wrap"> </span>    if { $retval } {</div><div><span style="white-space:pre-wrap">          </span>send_user "\nError: telnet failed: $reason\n"</div><div><span style="white-space:pre-wrap">          </span>exit 1</div><div><span style="white-space:pre-wrap">   </span>    }</div><div><span style="white-space:pre-wrap"> </span>} elseif [string match "ssh*" $prog] {</div><div><span style="white-space:pre-wrap"> </span>    regexp {ssh(:([^[:space:]]+))*} $prog command suffix port</div><div><span style="white-space:pre-wrap"> </span>    if {"$port" == ""} {</div><div><span style="white-space:pre-wrap">          </span>set retval [ catch {spawn $sshcmd -c $cyphertype -x -l $user $router} reason ]</div><div><br></div><div><span style="white-space:pre-wrap">  </span>    } else {</div><div><span style="white-space:pre-wrap">          </span>set retval [ catch {spawn $sshcmd -c $cyphertype -x -l $user -p $port $router} reason ]</div><div><span style="white-space:pre-wrap">  </span>    }</div><div><span style="white-space:pre-wrap"> </span>    if { $retval } {</div><div><span style="white-space:pre-wrap">          </span>send_user "\nError: $sshcmd failed: $reason\n"</div><div><span style="white-space:pre-wrap">         </span>exit 1</div><div><span style="white-space:pre-wrap">   </span>    }</div><div><span style="white-space:pre-wrap"> </span>} elseif ![string compare $prog "rsh"] {</div><div><span style="white-space:pre-wrap">       </span>    if [ catch {spawn rsh -l $user $router} reason ] {</div><div><span style="white-space:pre-wrap">                </span>send_user "\nError: rsh failed: $reason\n"</div><div><span style="white-space:pre-wrap">             </span>exit 1</div><div><span style="white-space:pre-wrap">   </span>    }</div><div><span style="white-space:pre-wrap"> </span>} else {</div><div><span style="white-space:pre-wrap"> </span>    puts "\nError: unknown connection method: $prog"</div><div><span style="white-space:pre-wrap">        </span>    return 1</div><div><span style="white-space:pre-wrap">  </span>}</div><div><span style="white-space:pre-wrap">        </span>incr progs -1</div><div><span style="white-space:pre-wrap">    </span>sleep 0.3</div><div><br></div><div><span style="white-space:pre-wrap">       </span># This helps cleanup each expect clause.</div><div><span style="white-space:pre-wrap"> </span>expect_after {</div><div><span style="white-space:pre-wrap">   </span>    timeout {</div><div><span style="white-space:pre-wrap">         </span>send_user "\nError: TIMEOUT reached\n"</div><div><span style="white-space:pre-wrap">         </span>catch {close}; wait</div><div><span style="white-space:pre-wrap">              </span>if { $in_proc} {</div><div><span style="white-space:pre-wrap">         </span>    return 1</div><div><span style="white-space:pre-wrap">          </span>} else {</div><div><span style="white-space:pre-wrap">         </span>    continue</div><div><span style="white-space:pre-wrap">          </span>}</div><div><span style="white-space:pre-wrap">        </span>    } eof {</div><div><span style="white-space:pre-wrap">           </span>send_user "\nError: EOF received\n"</div><div><span style="white-space:pre-wrap">            </span>catch {close}; wait</div><div><span style="white-space:pre-wrap">              </span>if { $in_proc} {</div><div><span style="white-space:pre-wrap">         </span>    return 1</div><div><span style="white-space:pre-wrap">          </span>} else {</div><div><span style="white-space:pre-wrap">         </span>    continue</div><div><span style="white-space:pre-wrap">          </span>}</div><div><span style="white-space:pre-wrap">        </span>    }</div><div><span style="white-space:pre-wrap"> </span>}</div><div><br></div><div>    # Here we get a little tricky.  There are several possibilities:</div><div>    # the router can ask for a username and passwd and then</div><div>    # talk to the TACACS server to authenticate you, or if the</div><div>    # TACACS server is not working, then it will use the enable</div><div>    # passwd.  Or, the router might not have TACACS turned on,</div><div>    # then it will just send the passwd.</div><div>    # if telnet fails with connection refused, try ssh</div><div>    expect {</div><div><span style="white-space:pre-wrap"> </span>-re "(Connection refused|Secure connection \[^\n\r]+ refused)" {</div><div><span style="white-space:pre-wrap">       </span>    catch {close}; wait</div><div><span style="white-space:pre-wrap">       </span>    if !$progs {</div><div><span style="white-space:pre-wrap">              </span>send_user "\nError: Connection Refused ($prog): $router\n"</div><div><span style="white-space:pre-wrap">             </span>return 1</div><div><span style="white-space:pre-wrap"> </span>    }</div><div><span style="white-space:pre-wrap"> </span>}</div><div><span style="white-space:pre-wrap">        </span>-re "(Connection closed by|Connection to \[^\n\r]+ closed)" {</div><div><span style="white-space:pre-wrap">  </span>    catch {close}; wait</div><div><span style="white-space:pre-wrap">       </span>    if !$progs {</div><div><span style="white-space:pre-wrap">              </span>send_user "\nError: Connection closed ($prog): $router\n"</div><div><span style="white-space:pre-wrap">              </span>return 1</div><div><span style="white-space:pre-wrap"> </span>    }</div><div><span style="white-space:pre-wrap"> </span>}</div><div><span style="white-space:pre-wrap">        </span>eof { send_user "\nError: Couldn't login: $router\n"; wait; return 1 }</div><div><span style="white-space:pre-wrap">     </span>-nocase "unknown host\r" {</div><div><span style="white-space:pre-wrap">     </span>    catch {close};</div><div><span style="white-space:pre-wrap">    </span>    send_user "\nError: Unknown host $router\n"; wait; return 1</div><div><span style="white-space:pre-wrap">     </span>}</div><div><span style="white-space:pre-wrap">        </span>"Host is unreachable" {</div><div><span style="white-space:pre-wrap">        </span>    catch {close};</div><div><span style="white-space:pre-wrap">    </span>    send_user "\nError: Host Unreachable: $router\n"; wait; return 1</div><div><span style="white-space:pre-wrap">        </span>}</div><div><span style="white-space:pre-wrap">        </span>"No address associated with name" {</div><div><span style="white-space:pre-wrap">    </span>    catch {close};</div><div><span style="white-space:pre-wrap">    </span>    send_user "\nError: Unknown host $router\n"; wait; return 1</div><div><span style="white-space:pre-wrap">     </span>}</div><div><span style="white-space:pre-wrap">        </span>-re "(Host key not found |The authenticity of host .* be established).*\(yes\/no\)\?" {</div><div><span style="white-space:pre-wrap">        </span>    send "yes\r"</div><div><span style="white-space:pre-wrap">    </span>    send_user "\nHost $router added to the list of known hosts.\n"</div><div><span style="white-space:pre-wrap">  </span>    exp_continue }</div><div><span style="white-space:pre-wrap">    </span>-re "HOST IDENTIFICATION HAS CHANGED.* \(yes\/no\)\?"   {</div><div><span style="white-space:pre-wrap">     </span>    send "no\r"</div><div><span style="white-space:pre-wrap">     </span>    send_user "\nError: The host key for $router has changed.  Update the SSH known_hosts file accordingly.\n"</div><div><span style="white-space:pre-wrap">     </span>    return 1 }</div><div><span style="white-space:pre-wrap">        </span>-re "Offending key for .* \(yes\/no\)\?"   {</div><div><span style="white-space:pre-wrap">  </span>    send "no\r"</div><div><span style="white-space:pre-wrap">     </span>    send_user "\nError: host key mismatch for $router.  Update the SSH known_hosts file accordingly.\n"</div><div><span style="white-space:pre-wrap">    </span>    return 1 }</div><div><span style="white-space:pre-wrap">        </span>-re "(denied|Sorry)"<span style="white-space:pre-wrap">  </span>{</div><div><span style="white-space:pre-wrap">                                </span>  send_user "\nError: Check your passwd for $router\n"</div><div><span style="white-space:pre-wrap">                               </span>  catch {close}; wait; return 1</div><div><span style="white-space:pre-wrap">                                </span>}</div><div><span style="white-space:pre-wrap">        </span>"Login failed"<span style="white-space:pre-wrap">                </span>{</div><div><span style="white-space:pre-wrap">                                </span>  send_user "\nError: Check your passwd for $router\n"</div><div><span style="white-space:pre-wrap">                               </span>  return 1</div><div><span style="white-space:pre-wrap">                             </span>}</div><div><span style="white-space:pre-wrap">        </span>-re "% (Bad passwords|Authentication failed)"<span style="white-space:pre-wrap"> </span>{</div><div><span style="white-space:pre-wrap">                                </span>  send_user "\nError: Check your passwd for $router\n"</div><div><span style="white-space:pre-wrap">                               </span>  return 1</div><div><span style="white-space:pre-wrap">                             </span>}</div><div><span style="white-space:pre-wrap">        </span>"Press any key to continue." {</div><div><span style="white-space:pre-wrap">                         </span>  # send_user "Pressing the ANY key\n"</div><div><span style="white-space:pre-wrap">                               </span>  send "\r"</div><div><span style="white-space:pre-wrap">                          </span>  exp_continue</div><div><span style="white-space:pre-wrap">                         </span>}</div><div><span style="white-space:pre-wrap">        </span>-re "Enter Selection: " {</div><div><span style="white-space:pre-wrap">                              </span>  # Catalyst 1900s have some lame menu.  Enter</div><div><span style="white-space:pre-wrap">                                </span>  # K to reach a command-line.</div><div><span style="white-space:pre-wrap">                         </span>  send "K\r"</div><div><span style="white-space:pre-wrap">                         </span>  exp_continue;</div><div><span style="white-space:pre-wrap">                                </span>}</div><div><span style="white-space:pre-wrap">        </span>-re "@\[^\r\n]+ $p_prompt"<span style="white-space:pre-wrap">    </span>{</div><div><span style="white-space:pre-wrap">                                        </span>  # ssh pwd prompt</div><div><span style="white-space:pre-wrap">                                     </span>  sleep 1</div><div><span style="white-space:pre-wrap">                                      </span>  send "$userpswd\r"</div><div><span style="white-space:pre-wrap">                                 </span>  exp_continue</div><div><span style="white-space:pre-wrap">                                 </span>}</div><div><span style="white-space:pre-wrap">        </span>-re "$u_prompt"<span style="white-space:pre-wrap">               </span>{</div><div><span style="white-space:pre-wrap">                                </span>  send "$user\r"</div><div><span style="white-space:pre-wrap">                             </span>  set uprompt_seen 1</div><div><span style="white-space:pre-wrap">                           </span>  exp_continue</div><div><span style="white-space:pre-wrap">                         </span>}</div><div><span style="white-space:pre-wrap">        </span>-re "$p_prompt"<span style="white-space:pre-wrap">               </span>{</div><div><span style="white-space:pre-wrap">                                </span>  sleep 1</div><div><span style="white-space:pre-wrap">                              </span>  if {$uprompt_seen == 1} {</div><div><span style="white-space:pre-wrap">                                    </span>send "$userpswd\r"</div><div><span style="white-space:pre-wrap">                             </span>  } else {</div><div><span style="white-space:pre-wrap">                                     </span>send "$passwd\r"</div><div><span style="white-space:pre-wrap">                               </span>  }</div><div><span style="white-space:pre-wrap">                            </span>  exp_continue</div><div><span style="white-space:pre-wrap">                         </span>}</div><div><span style="white-space:pre-wrap">        </span>-re "$prompt"<span style="white-space:pre-wrap">         </span>{ break; }</div><div><span style="white-space:pre-wrap">       </span>"Login invalid"<span style="white-space:pre-wrap">               </span>{</div><div><span style="white-space:pre-wrap">                                </span>  send_user "\nError: Invalid login: $router\n";</div><div><span style="white-space:pre-wrap">                             </span>  catch {close}; wait; return 1</div><div><span style="white-space:pre-wrap">                                </span>}</div><div>     }</div><div>    }</div><div><br></div><div>    set in_proc 0</div><div>    return 0</div><div>}</div><div><br></div><div># Enable</div><div>proc do_enable { enauser enapasswd } {</div><div>    global prompt in_proc</div><div>    global u_prompt e_prompt</div><div>    set in_proc 1</div><div><br></div><div>    set enacmd "system-view"</div><div>    send "$enacmd\r"</div><div><br></div><div>    expect {</div><div><span style="white-space:pre-wrap">       </span>-re "$u_prompt"<span style="white-space:pre-wrap">       </span>{ send "$enauser\r"; exp_continue}</div><div><span style="white-space:pre-wrap">     </span>-re "$e_prompt"<span style="white-space:pre-wrap">       </span>{ send "$enapasswd\r"; exp_continue}</div><div>        "(enable)"      { set prompt "> (enable) " }</div><div><span style="white-space:pre-wrap">  </span>-re "(denied|Sorry|Incorrect)"<span style="white-space:pre-wrap">        </span>{</div><div><span style="white-space:pre-wrap">                        </span>  # % Access denied - from local auth and poss. others</div><div><span style="white-space:pre-wrap">                 </span>  send_user "\nError: Check your Enable passwd\n";</div><div><span style="white-space:pre-wrap">                   </span>  return 1</div><div><span style="white-space:pre-wrap">                     </span>}</div><div><span style="white-space:pre-wrap">        </span>"% Error in authentication" {</div><div><span style="white-space:pre-wrap">                  </span>  send_user "\nError: Check your Enable passwd\n"</div><div><span style="white-space:pre-wrap">                    </span>  return 1</div><div><span style="white-space:pre-wrap">                     </span>}</div><div><span style="white-space:pre-wrap">        </span>"% Bad passwords" {</div><div><span style="white-space:pre-wrap">                    </span>  send_user "\nError: Check your Enable passwd\n"</div><div><span style="white-space:pre-wrap">                    </span>  return 1</div><div><span style="white-space:pre-wrap">                     </span>}</div><div>    }</div><div>    # We set the prompt variable (above) so script files don't need</div><div>    # to know what it is.</div><div>    set in_proc 0</div><div>    return 0</div><div>}</div><div><br></div><div># Run commands given on the command line.</div><div>proc run_commands { prompt command } {</div><div>    global in_proc platform</div><div>    set in_proc 1</div><div><br></div><div>        # escape any parens in the prompt, such as "(enable)"</div><div>        regsub -all {[][)(]} $prompt {\\&} reprompt</div><div><br></div><div><span style="white-space:pre-wrap">       </span>expect {</div><div><span style="white-space:pre-wrap"> </span>    -re $reprompt<span style="white-space:pre-wrap">    </span>{}</div><div><span style="white-space:pre-wrap">       </span>    -re "\[\n\r]+"<span style="white-space:pre-wrap"> </span>{ exp_continue }</div><div><span style="white-space:pre-wrap"> </span>}</div><div><br></div><div>    # this is the only way i see to get rid of more prompts in o/p..grrrrr</div><div>    log_user 0</div><div>    # Is this a multi-command?</div><div>    if [ string match "*\;*" "$command" ] {</div><div><span style="white-space:pre-wrap">      </span>set commands [split $command \;]</div><div><span style="white-space:pre-wrap"> </span>set num_commands [llength $commands]</div><div>        # The pager can not be turned off on some 3Com/H3C, so we have to look</div><div>        # for the "More" prompt.</div><div><span style="white-space:pre-wrap">       </span>for {set i 0} {$i < $num_commands} { incr i} {</div><div><span style="white-space:pre-wrap">        </span>    send "[subst -nocommands [lindex $commands $i]]\r"</div><div><span style="white-space:pre-wrap">      </span>    expect {</div><div><span style="white-space:pre-wrap">          </span>-re "\b+"<span style="white-space:pre-wrap">                     </span>{ exp_continue }</div><div><span style="white-space:pre-wrap">         </span>-re "^\[^\n\r *]*$reprompt"<span style="white-space:pre-wrap">   </span>{ send_user -- "$expect_out(buffer)"</div><div><span style="white-space:pre-wrap">                                           </span>}</div><div><span style="white-space:pre-wrap">                </span>-re "^\[^\n\r]*$reprompt."<span style="white-space:pre-wrap">    </span>{ send_user -- "$expect_out(buffer)"</div><div><span style="white-space:pre-wrap">                                           </span>  exp_continue }</div><div><span style="white-space:pre-wrap">               </span>-re "\[\n\r]+"<span style="white-space:pre-wrap">                        </span>{ send_user -- "$expect_out(buffer)"</div><div><span style="white-space:pre-wrap">                                           </span>  exp_continue }</div><div><span style="white-space:pre-wrap">               </span>-re "^  ---- More ----.*\[^\n\r]*"<span style="white-space:pre-wrap">   </span>{</div><div><span style="white-space:pre-wrap">                                                </span>  sleep 0.1</div><div><span style="white-space:pre-wrap">                                            </span>  send " "</div><div><span style="white-space:pre-wrap">                                           </span>  exp_continue }</div><div><span style="white-space:pre-wrap">       </span>    }</div><div><br></div><div><span style="white-space:pre-wrap">        </span>}</div><div>    } else {</div><div>        # The pager can not be turned off on some 3Com/H3C, so we have to look</div><div>        # for the "More" prompt.</div><div><span style="white-space:pre-wrap">     </span>send "[subst -nocommands $command]\r"</div><div><span style="white-space:pre-wrap">  </span>expect {</div><div><span style="white-space:pre-wrap">         </span>-re "\b+"<span style="white-space:pre-wrap">                     </span>{ exp_continue }</div><div><span style="white-space:pre-wrap">         </span>-re "^\[^\n\r *]*$reprompt"<span style="white-space:pre-wrap">   </span>{ send_user -- "$expect_out(buffer)"</div><div><span style="white-space:pre-wrap">                                           </span>}</div><div><span style="white-space:pre-wrap">                </span>-re "^\[^\n\r]*$reprompt."<span style="white-space:pre-wrap">    </span>{ send_user -- "$expect_out(buffer)"</div><div><span style="white-space:pre-wrap">                                           </span>  exp_continue }</div><div><span style="white-space:pre-wrap">               </span>-re "\[\n\r]+"<span style="white-space:pre-wrap">                        </span>{ send_user -- "$expect_out(buffer)"</div><div><span style="white-space:pre-wrap">                                           </span>  exp_continue }</div><div><span style="white-space:pre-wrap">               </span>-re "^  ---- More ----.*\[^\n\r]*"<span style="white-space:pre-wrap">   </span>{</div><div><span style="white-space:pre-wrap">                                                </span>  sleep 0.1</div><div><span style="white-space:pre-wrap">                                            </span>  send " "</div><div><span style="white-space:pre-wrap">                                           </span>  exp_continue }</div><div><span style="white-space:pre-wrap">       </span>}</div><div>    }</div><div><br></div><div>    log_user 1</div><div><br></div><div>    send "quit\r"</div><div>    expect {</div><div><span style="white-space:pre-wrap">        </span>-re "^\[^\n\r *]*$reprompt"<span style="white-space:pre-wrap">           </span>{</div><div>                                                  # H3C products</div><div><span style="white-space:pre-wrap">                                                </span>  # return to non-enabled mode</div><div><span style="white-space:pre-wrap">                                         </span>  # on exit in enabled mode.</div><div><span style="white-space:pre-wrap">                                           </span>  send "quit\r"</div><div><span style="white-space:pre-wrap">                                              </span>  exp_continue;</div><div><span style="white-space:pre-wrap">                                                </span>}</div><div># TODO: we will need to do this too:</div><div>#<span style="white-space:pre-wrap">    </span>"Do you wish to save your configuration changes" {</div><div>#<span style="white-space:pre-wrap">                                            </span>  send "n\r"</div><div>#<span style="white-space:pre-wrap">                                                </span>  exp_continue</div><div>#<span style="white-space:pre-wrap">                                                </span>}</div><div><span style="white-space:pre-wrap">        </span>-re "\[\n\r]+"<span style="white-space:pre-wrap">                                </span>{ exp_continue }</div><div># hwlogin+mod:</div><div><span style="white-space:pre-wrap">    </span>-re "\[^\n\r *]Note:"<span style="white-space:pre-wrap">                 </span>{ return 0 }</div><div><span style="white-space:pre-wrap">     </span>timeout<span style="white-space:pre-wrap">                                 </span>{ return 0 }</div><div><span style="white-space:pre-wrap">     </span>eof<span style="white-space:pre-wrap">                                     </span>{ return 0 }</div><div>    }</div><div>    set in_proc 0</div><div>}</div><div><br></div><div>#</div><div># For each router... (this is main loop)</div><div>#</div><div>source_password_file $password_file</div><div>set in_proc 0</div><div>foreach router [lrange $argv $i end] {</div><div>    set router [string tolower $router]</div><div>    send_user "$router\n"</div><div><br></div><div>    # Figure out prompt.</div><div>    # Since autoenable is off by default, if we have it defined, it</div><div>    # was done on the command line. If it is not specifically set on the</div><div>    # command line, check the password file.</div><div>    if $avautoenable {</div><div><span style="white-space:pre-wrap">   </span>set autoenable 1</div><div><span style="white-space:pre-wrap"> </span>set enable 0</div><div># hwlogin:</div><div><span style="white-space:pre-wrap">    </span>#set prompt " \\]\\"</div><div><span style="white-space:pre-wrap">   </span>set prompt ">"</div><div>    } else {</div><div><span style="white-space:pre-wrap"> </span>set ae [find autoenable $router]</div><div><span style="white-space:pre-wrap"> </span>if { "$ae" == "1" } {</div><div><span style="white-space:pre-wrap">        </span>    set autoenable 1</div><div><span style="white-space:pre-wrap">  </span>    set enable 0</div><div># hwlogin:</div><div><span style="white-space:pre-wrap">     </span>    set prompt ">"</div><div><span style="white-space:pre-wrap">       </span>} else {</div><div><span style="white-space:pre-wrap"> </span>    set autoenable 0</div><div><span style="white-space:pre-wrap">  </span>    set enable $avenable</div><div><span style="white-space:pre-wrap">      </span>    set prompt ">"</div><div><span style="white-space:pre-wrap">       </span>}</div><div>    }</div><div><br></div><div>    # look for noenable option in .cloginrc</div><div># Strath: but I do not know why I made this change, and it does not appear</div><div># to be reflected in other *rancid in svn trunk.</div><div>#    if [find noenable $router] != ""</div><div>    if { [find noenable $router] == "1" } {</div><div><span style="white-space:pre-wrap">       </span>send_user "\nset enable 0.\n"</div><div><span style="white-space:pre-wrap">  </span>set enable 0</div><div>    }</div><div><br></div><div>    # Figure out passwords</div><div>    if { $do_passwd || $do_enapasswd } {</div><div>      set pswd [find password $router]</div><div>      if { [llength $pswd] == 0 } {</div><div><span style="white-space:pre-wrap">     </span>send_user "\nError: no password for $router in $password_file.\n"</div><div><span style="white-space:pre-wrap">      </span>continue</div><div>      }</div><div>      if { $enable && $do_enapasswd && $autoenable == 0 && [llength $pswd] < 2 } {</div><div><span style="white-space:pre-wrap"> </span>send_user "\nError: no enable password for $router in $password_file.\n"</div><div><span style="white-space:pre-wrap">       </span>continue</div><div>      }</div><div>      set passwd [join [lindex $pswd 0] ""]</div><div>      set enapasswd [join [lindex $pswd 1] ""]</div><div>    }</div><div><br></div><div>    # Figure out username</div><div>    if {[info exists username]} {</div><div>      # command line username</div><div>      set ruser $username</div><div>    } else {</div><div>      set ruser [join [find user $router] ""]</div><div>      if { "$ruser" == "" } { set ruser $default_user }</div><div>    }</div><div><br></div><div>    # Figure out username's password (if different from the vty password)</div><div>    if {[info exists userpasswd]} {</div><div>      # command line username</div><div>      set userpswd $userpasswd</div><div>    } else {</div><div>      set userpswd [join [find userpassword $router] ""]</div><div>      if { "$userpswd" == "" } { set userpswd $passwd }</div><div>    }</div><div><br></div><div>    # Figure out enable username</div><div>    if {[info exists enausername]} {</div><div>      # command line enausername</div><div>      set enauser $enausername</div><div>    } else {</div><div>      set enauser [join [find enauser $router] ""]</div><div>      if { "$enauser" == "" } { set enauser $ruser }</div><div>    }</div><div><br></div><div>    # Figure out prompts</div><div>    set u_prompt [find userprompt $router]</div><div>    if { "$u_prompt" == "" } {</div><div><span style="white-space:pre-wrap">       </span>set u_prompt "(Username|Login|login|user name):"</div><div>    } else {</div><div><span style="white-space:pre-wrap">  </span>set u_prompt [join [lindex $u_prompt 0] ""]</div><div>    }</div><div>    set p_prompt [find passprompt $router]</div><div>    if { "$p_prompt" == "" } {</div><div><span style="white-space:pre-wrap">        </span>set p_prompt "(\[Pp]assword|passwd):"</div><div>    } else {</div><div><span style="white-space:pre-wrap">     </span>set p_prompt [join [lindex $p_prompt 0] ""]</div><div>    }</div><div>    set e_prompt [find enableprompt $router]</div><div>    if { "$e_prompt" == "" } {</div><div><span style="white-space:pre-wrap">      </span>set e_prompt "\[Pp]assword:"</div><div>    } else {</div><div><span style="white-space:pre-wrap">      </span>set e_prompt [join [lindex $e_prompt 0] ""]</div><div>    }</div><div><br></div><div>    # Figure out cypher type</div><div>    if {[info exists cypher]} {</div><div>        # command line cypher type</div><div>        set cyphertype $cypher</div><div>    } else {</div><div>        set cyphertype [find cyphertype $router]</div><div>        if { "$cyphertype" == "" } { set cyphertype "3des" }</div><div>    }</div><div><br></div><div>    # Figure out connection method</div><div>    set cmethod [find method $router]</div><div>    if { "$cmethod" == "" } { set cmethod {{telnet} {ssh}} }</div><div><br></div><div>    # Figure out the SSH executable name</div><div>    set sshcmd [find sshcmd $router]</div><div>    if { "$sshcmd" == "" } { set sshcmd {ssh} }</div><div><br></div><div>    # Login to the router</div><div>    if {[login $router $ruser $userpswd $passwd $enapasswd $cmethod $cyphertype]} {</div><div><span style="white-space:pre-wrap">  </span>continue</div><div>    }</div><div><br></div><div># Disable log junk being sent to terminal: must be done before $enacmd is run</div><div># It would be nice for this to be setable in .cloginrc</div><div>    send "undo terminal monitor\r"</div><div>    expect -re $prompt  {}</div><div><br></div><div># Turn session paging off; this only works on models like 3Com 4800G and H3C</div><div># Other models like 3Com 5500 have a screen-length command that only works on</div><div># a vty basis</div><div>    #send "screen-length disable\r"</div><div>    send "screen-length 0 temporary\r"</div><div><br></div><div>    if { $enable } {</div><div><span style="white-space:pre-wrap">       </span>if {[do_enable $enauser $enapasswd]} {</div><div><span style="white-space:pre-wrap">   </span>    if { $do_command || $do_script } {</div><div><span style="white-space:pre-wrap">                </span>close; wait</div><div><span style="white-space:pre-wrap">              </span>continue</div><div><span style="white-space:pre-wrap"> </span>    }</div><div><span style="white-space:pre-wrap"> </span>}</div><div>    }</div><div>    # we are logged in, now figure out the full prompt</div><div>    send "\r"</div><div>    expect {</div><div><span style="white-space:pre-wrap">      </span>-re "\[\r\n]+"<span style="white-space:pre-wrap">                </span>{ exp_continue; }</div><div><span style="white-space:pre-wrap">        </span>-re "^.+$prompt"<span style="white-space:pre-wrap">      </span>{ set junk $expect_out(0,string);</div><div><span style="white-space:pre-wrap">                                </span>  regsub -all "\[\]\[]" $junk {\\&} prompt;</div><div><span style="white-space:pre-wrap">                              </span>}</div><div><span style="white-space:pre-wrap">        </span>-re "^.+> \\\(enable\\\)"<span style="white-space:pre-wrap">  </span>{</div><div><span style="white-space:pre-wrap">                                </span>  set junk $expect_out(0,string);</div><div><span style="white-space:pre-wrap">                              </span>  regsub -all "\[\]\[]" $junk {\\&} prompt;</div><div><span style="white-space:pre-wrap">                              </span>}</div><div>    }</div><div><br></div><div>    if { $do_command } {</div><div><span style="white-space:pre-wrap">        </span>if {[run_commands $prompt $command]} {</div><div><span style="white-space:pre-wrap">   </span>    continue</div><div><span style="white-space:pre-wrap">  </span>}</div><div>    } elseif { $do_script } {</div><div>#       # If the prompt is (enable), then we are on a switch and the</div><div>#       # command is "set length 0"; otherwise its "term length 0".</div><div>#       if [ regexp -- ".*> .*enable" "$prompt" ] {</div><div>#           send "set length 0\r"</div><div>#           send "set logging session disable\r"</div><div>#       } else {</div><div>#           send "term length 0\r"</div><div>#       }</div><div>        expect -re $prompt      {}</div><div><span style="white-space:pre-wrap">     </span>source $sfile</div><div><span style="white-space:pre-wrap">    </span>close</div><div>    } else {</div><div><span style="white-space:pre-wrap">       </span>label $router</div><div><span style="white-space:pre-wrap">    </span>log_user 1</div><div><span style="white-space:pre-wrap">       </span>interact</div><div>    }</div><div><br></div><div>    # End of for each router</div><div>    wait</div><div>    sleep 0.3</div><div>}</div><div>exit 0</div></div></div>