<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7653.38">
<TITLE>AW: [rancid] fortinet problem</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>I think this prompt was for fortios version &lt; 2<BR>
most devices are probably running on ver 3 know<BR>
and this is covered by Diegos patch<BR>
<BR>
will the patch be added to the main code?<BR>
BR<BR>
<BR>
<BR>
<BR>
-----Ursprüngliche Nachricht-----<BR>
Von: john heasley [<A HREF="mailto:heas@shrubbery.net">mailto:heas@shrubbery.net</A>]<BR>
Gesendet: Sa 02.10.2010 16:38<BR>
An: Fürtbauer Wolfgang<BR>
Cc: john heasley; rancid-discuss@shrubbery.net; diego.ercolani@ssis.sm<BR>
Betreff: Re: [rancid] fortinet problem<BR>
<BR>
Sat, Oct 02, 2010 at 08:39:40AM +0200, F?rtbauer Wolfgang:<BR>
&gt; Dear John,<BR>
&gt;<BR>
&gt; I finally found the patch:<BR>
&gt; <A HREF="http://www.shrubbery.net/pipermail/rancid-discuss/2009-June/004005.html">http://www.shrubbery.net/pipermail/rancid-discuss/2009-June/004005.html</A><BR>
&gt; and applied it (manually) against my rancid-2.3.4.<BR>
&gt; It's working! Thanks a lot Diego!<BR>
&gt;<BR>
&gt; Probalby this patch could be added to the main code?!<BR>
&gt;<BR>
&gt; to answer your question John: the prompt ends with a '#' for readonly-users<BR>
&gt; and a '$' for read-write users<BR>
<BR>
Thanks.&nbsp; When did this change from '-&gt;'?&nbsp; is there a need to support the<BR>
old prompt?<BR>
<BR>
&gt; BR<BR>
&gt; Wolfgang<BR>
&gt;<BR>
&gt;<BR>
&gt;<BR>
&gt; Wolfgang F?rtbauer<BR>
&gt; Leitung IT<BR>
&gt;<BR>
&gt; ASAMER Holding AG<BR>
&gt; Unterthalham Strasse 2<BR>
&gt; 4694 Ohlsdorf<BR>
&gt; AUSTRIA<BR>
&gt; tel +43 50 799 - 2500<BR>
&gt; fax +43 7612 799 - 9526<BR>
&gt; mobile&nbsp; +43 664 8332326<BR>
&gt; w.fuertbauer@asamer.at<BR>
&gt; www.asamer.at<BR>
&gt;<BR>
&gt;<BR>
&gt; This message is confidential. It may not be disclosed to, or used by, anyone other than the addressee. If you receive this<BR>
&gt; message by mistake, please advise the sender.<BR>
&gt;<BR>
&gt;<BR>
&gt;<BR>
&gt; -----Urspr?ngliche Nachricht-----<BR>
&gt; Von: john heasley [<A HREF="mailto:heas@shrubbery.net">mailto:heas@shrubbery.net</A>]<BR>
&gt; Gesendet: Fr 01.10.2010 17:56<BR>
&gt; An: F?rtbauer Wolfgang<BR>
&gt; Cc: john heasley; rancid-discuss@shrubbery.net<BR>
&gt; Betreff: Re: [rancid] fortinet problem<BR>
&gt;&nbsp;<BR>
&gt; Fri, Oct 01, 2010 at 09:34:15AM +0200, F?rtbauer Wolfgang:<BR>
&gt; &gt; Dear John,<BR>
&gt; &gt;<BR>
&gt; &gt; Output of nlogin is:<BR>
&gt; &gt;<BR>
&gt; &gt; rancid@aohmonitoring01:~&gt; nlogin &lt;fortinet&gt;<BR>
&gt; &gt; &lt;fortinet&gt;<BR>
&gt; &gt; spawn ssh -c 3des -x -l monitoring &lt;fortinet&gt;<BR>
&gt; &gt; monitoring@&lt;fortinet&gt;'s password:<BR>
&gt; &gt; FGT50A3906508751 #<BR>
&gt; &gt; FGT50A3906508751 # Timeout<BR>
&gt;<BR>
&gt; wie geht es.&nbsp; nlogin looks for the prompt to end with &quot;-&gt; &quot;; why is it &quot;#&quot;<BR>
&gt; here?&nbsp; ISTR someone saying that the format had changed and trying to<BR>
&gt; understand when and under what circumstances, but not being able to verify.<BR>
&gt;<BR>
<BR>
<BR>
<BR>
Content-Description: rancid-2.3.4_fortigate_2x-3x.patch<BR>
&gt; --- rancid-2.3.4/bin/Makefile.in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2010-10-02 08:31:22.000000000 +0200<BR>
&gt; +++ rancid-patch/bin/Makefile.in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2010-10-02 08:29:48.000000000 +0200<BR>
&gt; @@ -54,7 +54,7 @@<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $(srcdir)/hlogin.in $(srcdir)/hrancid.in $(srcdir)/htlogin.in \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $(srcdir)/htrancid.in $(srcdir)/jerancid.in \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $(srcdir)/jlogin.in $(srcdir)/jrancid.in $(srcdir)/mrancid.in \<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; $(srcdir)/mrvlogin.in $(srcdir)/mrvrancid.in \<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; $(srcdir)/mrvlogin.in $(srcdir)/mrvrancid.in $(srcdir)/fnlogin.in \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $(srcdir)/nlogin.in $(srcdir)/nrancid.in $(srcdir)/nslogin.in \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $(srcdir)/nsrancid.in $(srcdir)/nxrancid.in $(srcdir)/par.in \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $(srcdir)/prancid.in $(srcdir)/rancid-fe.in \<BR>
&gt; @@ -75,7 +75,7 @@<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; arancid arrancid avologin avorancid blogin brancid cat5rancid \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; clogin rancid cssrancid elogin erancid f5rancid f10rancid \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; flogin francid fnrancid hlogin hrancid htlogin htrancid jlogin \<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; jrancid jerancid mrancid mrvlogin mrvrancid nlogin nrancid \<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; jrancid jerancid mrancid mrvlogin mrvrancid fnlogin nlogin nrancid \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; nslogin nsrancid nxrancid prancid rivlogin rivrancid rrancid \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; srancid tlogin tntlogin tntrancid trancid xrancid xrrancid \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; zrancid<BR>
&gt; @@ -247,7 +247,7 @@<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; blogin brancid cat5rancid clogin control_rancid cssrancid \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; elogin erancid f5rancid f10rancid flogin fnrancid francid \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; hlogin hrancid htlogin htrancid jerancid jlogin jrancid \<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; mrancid mrvlogin mrvrancid nlogin nrancid nslogin nsrancid \<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; mrancid mrvlogin mrvrancid fnlogin nlogin nrancid nslogin nsrancid \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; nxrancid par prancid rancid-fe rancid rivlogin rivrancid \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; rrancid srancid tlogin tntlogin tntrancid trancid xrancid \<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; xrrancid zrancid lg.cgi lgform.cgi rancid-cvs rancid-run<BR>
&gt; @@ -383,6 +383,8 @@<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cd $(top_builddir) &amp;&amp; $(SHELL) ./config.status $(subdir)/$@<BR>
&gt;&nbsp; mrvrancid: $(top_builddir)/config.status $(srcdir)/mrvrancid.in<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cd $(top_builddir) &amp;&amp; $(SHELL) ./config.status $(subdir)/$@<BR>
&gt; +fnlogin: $(top_builddir)/config.status $(srcdir)/fnlogin.in<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; cd $(top_builddir) &amp;&amp; $(SHELL) ./config.status $(subdir)/$@<BR>
&gt;&nbsp; nlogin: $(top_builddir)/config.status $(srcdir)/nlogin.in<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cd $(top_builddir) &amp;&amp; $(SHELL) ./config.status $(subdir)/$@<BR>
&gt;&nbsp; nrancid: $(top_builddir)/config.status $(srcdir)/nrancid.in<BR>
&gt; --- rancid-2.3.4/bin/fnlogin.in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1970-01-01 01:00:00.000000000 +0100<BR>
&gt; +++ rancid-patch/bin/fnlogin.in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2010-10-02 08:29:48.000000000 +0200<BR>
&gt; @@ -0,0 +1,591 @@<BR>
&gt; +#! @EXPECT_PATH@ --<BR>
&gt; +##<BR>
&gt; +## $Id: fnlogin.in,v 1.51 2009/04/16 21:22:58 heas Exp $<BR>
&gt; +## patched to accomplish fortinet from nlogin<BR>
&gt; +## by: Daniel G. Epstein &lt;dan at rootlike.com&gt;<BR>
&gt; +## adapted by: Diego Ercolani &lt;diego.ercolani at ssis.sm&gt;<BR>
&gt; +##<BR>
&gt; +## @PACKAGE@ @VERSION@<BR>
&gt; +## Copyright (c) 1997-2009 by Terrapin Communications, Inc.<BR>
&gt; +## All rights reserved.<BR>
&gt; +##<BR>
&gt; +## This code is derived from software contributed to and maintained by<BR>
&gt; +## Terrapin Communications, Inc. by Henry Kilmer, John Heasley, Andrew Partan,<BR>
&gt; +## Pete Whiting, Austin Schutz, and Andrew Fort.<BR>
&gt; +##<BR>
&gt; +## Redistribution and use in source and binary forms, with or without<BR>
&gt; +## modification, are permitted provided that the following conditions<BR>
&gt; +## are met:<BR>
&gt; +## 1. Redistributions of source code must retain the above copyright<BR>
&gt; +##&nbsp;&nbsp;&nbsp; notice, this list of conditions and the following disclaimer.<BR>
&gt; +## 2. Redistributions in binary form must reproduce the above copyright<BR>
&gt; +##&nbsp;&nbsp;&nbsp; notice, this list of conditions and the following disclaimer in the<BR>
&gt; +##&nbsp;&nbsp;&nbsp; documentation and/or other materials provided with the distribution.<BR>
&gt; +## 3. All advertising materials mentioning features or use of this software<BR>
&gt; +##&nbsp;&nbsp;&nbsp; must display the following acknowledgement:<BR>
&gt; +##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This product includes software developed by Terrapin Communications,<BR>
&gt; +##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Inc. and its contributors for RANCID.<BR>
&gt; +## 4. Neither the name of Terrapin Communications, Inc. nor the names of its<BR>
&gt; +##&nbsp;&nbsp;&nbsp; contributors may be used to endorse or promote products derived from<BR>
&gt; +##&nbsp;&nbsp;&nbsp; this software without specific prior written permission.<BR>
&gt; +## 5. It is requested that non-binding fixes and modifications be contributed<BR>
&gt; +##&nbsp;&nbsp;&nbsp; back to Terrapin Communications, Inc.<BR>
&gt; +##<BR>
&gt; +## THIS SOFTWARE IS PROVIDED BY Terrapin Communications, INC. AND CONTRIBUTORS<BR>
&gt; +## ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED<BR>
&gt; +## TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR<BR>
&gt; +## PURPOSE ARE DISCLAIMED.&nbsp; IN NO EVENT SHALL THE COMPANY OR CONTRIBUTORS<BR>
&gt; +## BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR<BR>
&gt; +## CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF<BR>
&gt; +## SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS<BR>
&gt; +## INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN<BR>
&gt; +## CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)<BR>
&gt; +## ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE<BR>
&gt; +## POSSIBILITY OF SUCH DAMAGE.<BR>
&gt; +#<BR>
&gt; +#&nbsp; The expect login scripts were based on Erik Sherk's gwtn, by permission.<BR>
&gt; +#<BR>
&gt; +# Netscreen hacks implemented by Stephen Gill &lt;gillsr@yahoo.com&gt;.<BR>
&gt; +# Fortinet hacks by Daniel G. Epstein &lt;dan at rootlike.com&gt;<BR>
&gt; +#<BR>
&gt; +# fnlogin - fortinet login<BR>
&gt; +#<BR>
&gt; +# Most options are intuitive for logging into a netscreen firewall.<BR>
&gt; +#<BR>
&gt; +# Misc notes<BR>
&gt; +#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; netscreen does not have the concept of &quot;enable&quot;, once logged in, a<BR>
&gt; +#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; users permissions can not change.<BR>
&gt; +<BR>
&gt; +# Usage line<BR>
&gt; +set usage &quot;Usage: $argv0 \[-dSV\] \[-c command\] \[-Evar=x\] \<BR>
&gt; +\[-f cloginrc-file\] \[-p user-password\] \<BR>
&gt; +\[-s script-file\] \[-t timeout\] \[-u username\] \<BR>
&gt; +\[-v vty-password\] \[-x command-file\] \<BR>
&gt; +\[-y ssh_cypher_type\] router \[router...\]\n&quot;<BR>
&gt; +<BR>
&gt; +# env(CLOGIN) may contain:<BR>
&gt; +#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x == do not set xterm banner or name<BR>
&gt; +<BR>
&gt; +# Password file<BR>
&gt; +set password_file $env(HOME)/.cloginrc<BR>
&gt; +# Default is to login to the firewall<BR>
&gt; +set do_command 0<BR>
&gt; +set do_script 0<BR>
&gt; +# The default is to look in the password file to find the passwords.&nbsp; This<BR>
&gt; +# tracks if we receive them on the command line.<BR>
&gt; +set do_passwd 1<BR>
&gt; +set do_enapasswd 1<BR>
&gt; +# Save config, if prompted<BR>
&gt; +set do_saveconfig 0<BR>
&gt; +<BR>
&gt; +# Find the user in the ENV, or use the unix userid.<BR>
&gt; +if {[ info exists env(CISCO_USER) ]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp; set default_user $env(CISCO_USER)<BR>
&gt; +} elseif {[ info exists env(USER) ]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp; set default_user $env(USER)<BR>
&gt; +} elseif {[ info exists env(LOGNAME) ]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp; set default_user $env(LOGNAME)<BR>
&gt; +} else {<BR>
&gt; +&nbsp;&nbsp;&nbsp; # This uses &quot;id&quot; which I think is portable.&nbsp; At least it has existed<BR>
&gt; +&nbsp;&nbsp;&nbsp; # (without options) on all machines/OSes I've been on recently -<BR>
&gt; +&nbsp;&nbsp;&nbsp; # unlike whoami or id -nu.<BR>
&gt; +&nbsp;&nbsp;&nbsp; if [ catch {exec id} reason ] {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_error &quot;\nError: could not exec id: $reason\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit 1<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; regexp {\(([^)]*)} &quot;$reason&quot; junk default_user<BR>
&gt; +}<BR>
&gt; +if {[ info exists env(CLOGINRC) ]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp; set password_file $env(CLOGINRC)<BR>
&gt; +}<BR>
&gt; +<BR>
&gt; +# Sometimes firewall take awhile to answer (the default is 10 sec)<BR>
&gt; +set timeout 45<BR>
&gt; +<BR>
&gt; +# Process the command line<BR>
&gt; +for {set i 0} {$i &lt; $argc} {incr i} {<BR>
&gt; +&nbsp;&nbsp;&nbsp; set arg [lindex $argv $i]<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; switch&nbsp; -glob -- $arg {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Expect debug mode<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -d* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exp_internal 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Username<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -u* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {! [&nbsp; regexp .\[uU\](.+) $arg ignore user]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr i<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set username [ lindex $argv $i ]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # VTY Password<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -p* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {! [&nbsp; regexp .\[pP\](.+) $arg ignore userpasswd]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr i<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set userpasswd [ lindex $argv $i ]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set do_passwd 0<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Environment variable to pass to -s scripts<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -E* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {[ regexp .\[E\](.+)=(.+) $arg ignore varname varvalue]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set E$varname $varvalue<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: invalid format for -E in $arg\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Command to run.<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -c* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {! [&nbsp; regexp .\[cC\](.+) $arg ignore command]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr i<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set command [ lindex $argv $i ]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set do_command 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Expect script to run.<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -s* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {! [&nbsp; regexp .\[sS\](.+) $arg ignore sfile]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr i<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set sfile [ lindex $argv $i ]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if { ! [ file readable $sfile ] } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: Can't read $sfile\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set do_script 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # save config on exit<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -S* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set do_saveconfig 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # cypher type<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -y* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {! [&nbsp; regexp .\[eE\](.+) $arg ignore cypher]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr i<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set cypher [ lindex $argv $i ]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # alternate cloginrc file<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -f* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {! [ regexp .\[fF\](.+) $arg ignore password_file]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr i<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set password_file [ lindex $argv $i ]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -t* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr i<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set timeout [ lindex $argv $i ]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -x* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {! [&nbsp; regexp .\[xX\](.+) $arg ignore cmd_file]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr i<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set cmd_file [ lindex $argv $i ]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if [ catch {set cmd_fd [open $cmd_file r]} reason ] {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: $reason\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set cmd_text [read $cmd_fd]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close $cmd_fd<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set command [join [split $cmd_text \n] \;]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set do_command 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Version string<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -V* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;@PACKAGE@ @VERSION@\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit 0<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Does tacacs automatically enable us?<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -autoenable {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # ignore autoenable<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } -* {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: Unknown argument! $arg\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user $usage<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } default {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +}<BR>
&gt; +# Process firewalls...no firewalls listed is an error.<BR>
&gt; +if { $i == $argc } {<BR>
&gt; +&nbsp;&nbsp;&nbsp; send_user &quot;\nError: $usage&quot;<BR>
&gt; +}<BR>
&gt; +<BR>
&gt; +# Only be quiet if we are running a script (it can log its output<BR>
&gt; +# on its own)<BR>
&gt; +if { $do_script } {<BR>
&gt; +&nbsp;&nbsp;&nbsp; log_user 0<BR>
&gt; +} else {<BR>
&gt; +&nbsp;&nbsp;&nbsp; log_user 1<BR>
&gt; +}<BR>
&gt; +<BR>
&gt; +#<BR>
&gt; +# Done configuration/variable setting.&nbsp; Now run with it...<BR>
&gt; +#<BR>
&gt; +<BR>
&gt; +# Sets Xterm title if interactive...if its an xterm and the user cares<BR>
&gt; +proc label { host } {<BR>
&gt; +&nbsp;&nbsp;&nbsp; global env<BR>
&gt; +&nbsp;&nbsp;&nbsp; # if CLOGIN has an 'x' in it, don't set the xterm name/banner<BR>
&gt; +&nbsp;&nbsp;&nbsp; if [info exists env(CLOGIN)] {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {[string first &quot;x&quot; $env(CLOGIN)] != -1} { return }<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; # take host from ENV(TERM)<BR>
&gt; +&nbsp;&nbsp;&nbsp; if [info exists env(TERM)] {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if [regexp \^(xterm|vs) $env(TERM) ignore ] {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\033]1;[lindex [split $host &quot;.&quot;] 0]\a&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\033]2;$host\a&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +}<BR>
&gt; +<BR>
&gt; +# This is a helper function to make the password file easier to<BR>
&gt; +# maintain.&nbsp; Using this the password file has the form:<BR>
&gt; +# add password sl*&nbsp;&nbsp;&nbsp;&nbsp; pete cow<BR>
&gt; +# add password at*&nbsp;&nbsp;&nbsp;&nbsp; steve<BR>
&gt; +# add password *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hanky-pie<BR>
&gt; +proc add {var args} { global int_$var ; lappend int_$var $args}<BR>
&gt; +proc include {args} {<BR>
&gt; +&nbsp;&nbsp;&nbsp; global env<BR>
&gt; +&nbsp;&nbsp;&nbsp; regsub -all &quot;(^{|}$)&quot; $args {} args<BR>
&gt; +&nbsp;&nbsp;&nbsp; if { [ regexp &quot;^/&quot; $args ignore ] == 0 } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set args $env(HOME)/$args<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; source_password_file $args<BR>
&gt; +}<BR>
&gt; +<BR>
&gt; +proc find {var router} {<BR>
&gt; +&nbsp;&nbsp;&nbsp; upvar int_$var list<BR>
&gt; +&nbsp;&nbsp;&nbsp; if { [info exists list] } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach line $list {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if { [string match [lindex $line 0] $router ] } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return [lrange $line 1 end]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; return {}<BR>
&gt; +}<BR>
&gt; +<BR>
&gt; +# Loads the password file.&nbsp; Note that as this file is tcl, and that<BR>
&gt; +# it is sourced, the user better know what to put in there, as it<BR>
&gt; +# could install more than just password info...&nbsp; I will assume however,<BR>
&gt; +# that a &quot;bad guy&quot; could just as easy put such code in the clogin<BR>
&gt; +# script, so I will leave .cloginrc as just an extention of that script<BR>
&gt; +proc source_password_file { password_file } {<BR>
&gt; +&nbsp;&nbsp;&nbsp; global env<BR>
&gt; +&nbsp;&nbsp;&nbsp; if { ! [file exists $password_file] } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: password file ($password_file) does not exist\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit 1<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; file stat $password_file fileinfo<BR>
&gt; +&nbsp;&nbsp;&nbsp; if { [expr ($fileinfo(mode) &amp; 007)] != 0000 } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: $password_file must not be world readable/writable\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit 1<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; if [ catch {source $password_file} reason ] {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: $reason\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit 1<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +}<BR>
&gt; +<BR>
&gt; +# Log into the firewall.<BR>
&gt; +# returns: 0 on success, 1 on failure<BR>
&gt; +proc login { router user userpswd passwd enapasswd prompt cmethod cyphertype } {<BR>
&gt; +&nbsp;&nbsp;&nbsp; global spawn_id in_proc do_command do_script sshcmd<BR>
&gt; +&nbsp;&nbsp;&nbsp; set in_proc 1<BR>
&gt; +&nbsp;&nbsp;&nbsp; set uprompt_seen 0<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # Telnet to the firewall &amp; try to login.<BR>
&gt; +&nbsp;&nbsp;&nbsp; set progs [llength $cmethod]<BR>
&gt; +&nbsp;&nbsp;&nbsp; foreach prog [lrange $cmethod 0 end] {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr progs -1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if [string match &quot;telnet*&quot; $prog] {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; regexp {telnet(:([^[:space:]]+))*} $prog command suffix port<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {&quot;$port&quot; == &quot;&quot;} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set retval [ catch {spawn telnet $router} reason ]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set retval [ catch {spawn telnet $router $port} reason ]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if { $retval } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: telnet failed: $reason\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } elseif [string match &quot;ssh*&quot; $prog] {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; regexp {ssh(:([^[:space:]]+))*} $prog methcmd suffix port<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {&quot;$port&quot; == &quot;&quot;} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set cmd [join [lindex $sshcmd 0] &quot; &quot;]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set retval [ catch {eval spawn [split &quot;$cmd -c $cyphertype -x -l $user $router&quot; { }]} reason ]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set cmd [join [lindex $sshcmd 0] &quot; &quot;]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set retval [ catch {eval spawn [split &quot;$cmd -c $cyphertype -x -l $user -p $port $router&quot; { }]} reason ]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if { $retval } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: $sshcmd failed: $reason\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } elseif ![string compare $prog &quot;rsh&quot;] {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_error &quot;\nError: unsupported method: rsh\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if { $progs == 0 } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: unknown connection method: $prog\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; sleep 0.3<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # This helps cleanup each expect clause.<BR>
&gt; +&nbsp;&nbsp;&nbsp; expect_after {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeout {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: TIMEOUT reached\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch {close}; catch {wait};<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if { $in_proc} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } eof {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: EOF received\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch {close}; catch {wait};<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if { $in_proc} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # Here we get a little tricky.&nbsp; There are several possibilities:<BR>
&gt; +&nbsp;&nbsp;&nbsp; # the firewall can ask for a username and passwd and then<BR>
&gt; +&nbsp;&nbsp;&nbsp; # talk to the TACACS server to authenticate you, or if the<BR>
&gt; +&nbsp;&nbsp;&nbsp; # TACACS server is not working, then it will use the enable<BR>
&gt; +&nbsp;&nbsp;&nbsp; # passwd.&nbsp; Or, the firewall might not have TACACS turned on,<BR>
&gt; +&nbsp;&nbsp;&nbsp; # then it will just send the passwd.<BR>
&gt; +&nbsp;&nbsp;&nbsp; # if telnet fails with connection refused, try ssh<BR>
&gt; +&nbsp;&nbsp;&nbsp; expect {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;(Connection refused|Secure connection \[^\n\r]+ refused)&quot; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch {close}; catch {wait};<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if !$progs {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: Connection Refused ($prog): $router\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;(Connection closed by|Connection to \[^\n\r]+ closed)&quot; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch {close}; catch {wait};<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if !$progs {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: Connection closed ($prog): $router\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eof { send_user &quot;\nError: Couldn't login: $router\n&quot;; wait; return 1 }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -nocase &quot;unknown host\r&quot; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: Unknown host $router\n&quot;;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch {close}; catch {wait};<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Host is unreachable&quot; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: Host Unreachable: $router\n&quot;;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch {close}; catch {wait};<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;No address associated with name&quot; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: Unknown host $router\n&quot;;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch {close}; catch {wait};<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;(Host key not found |The authenticity of host .* be established).*\(yes\/no\)\?&quot; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send &quot;yes\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nHost $router added to the list of known hosts.\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exp_continue }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;HOST IDENTIFICATION HAS CHANGED.* \(yes\/no\)\?&quot; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send &quot;no\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: The host key for $router has changed.&nbsp; Update the SSH known_hosts file accordingly.\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch {close}; catch {wait};<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;Offending key for .* \(yes\/no\)\?&quot; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send &quot;no\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: host key mismatch for $router.&nbsp; Update the SSH known_hosts file accordingly.\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch {close}; catch {wait};<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;(denied|Sorry)&quot;&nbsp;&nbsp;&nbsp; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: Check your passwd for $router\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch {close}; catch {wait}; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Login failed&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: Check your passwd for $router\n&quot;;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch {close}; catch {wait}; return 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;(login:)&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep 1;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send -- &quot;$user\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set uprompt_seen 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exp_continue<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;@\[^\r\n]+\[Pp]assword:&quot;&nbsp;&nbsp; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # ssh pwd prompt<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send -- &quot;$userpswd\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exp_continue<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;\[Pp]assword:&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep 1;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {$uprompt_seen == 1} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send -- &quot;$userpswd\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send -- &quot;$passwd\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exp_continue<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- &quot;$prompt&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { break; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; set in_proc 0<BR>
&gt; +&nbsp;&nbsp;&nbsp; return 0<BR>
&gt; +}<BR>
&gt; +<BR>
&gt; +# Run commands given on the command line.<BR>
&gt; +proc run_commands { prompt command } {<BR>
&gt; +&nbsp;&nbsp;&nbsp; global in_proc<BR>
&gt; +&nbsp;&nbsp;&nbsp; set in_proc 1<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # Disable output paging.<BR>
&gt; +&nbsp;&nbsp;&nbsp; send -- &quot;config system console\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp; expect -re $prompt; send -- &quot;set output standard\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp; expect -re $prompt; send -- &quot;end\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp; expect -re $prompt;<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; set commands [split $command \;]<BR>
&gt; +&nbsp;&nbsp;&nbsp; set num_commands [llength $commands]<BR>
&gt; +&nbsp;&nbsp;&nbsp; for {set i 0} {$i &lt; $num_commands} { incr i} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send -- &quot;[subst [lindex $commands $i]]\r&quot;<BR>
&gt; +#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;**************** [subst [lindex $commands $i]] ************\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expect {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;$prompt&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { send &quot;\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep 0.5<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -gl &quot;--More--&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { send &quot; &quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exp_continue<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;\[\n\r]+&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { exp_continue }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;<BR>
&gt; +#&nbsp;&nbsp;&nbsp; send_user &quot;******* fuori da ciclo for *******\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; expect {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;$prompt$&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send &quot;exit\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep 0.5<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exp_continue<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;\[\n\r]+&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { exp_continue }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -gl &quot;Configuration modified, save?&quot;&nbsp;&nbsp; {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send &quot;n\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exp_continue<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { catch {close}; catch {wait};<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eof&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { return 0 }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; set in_proc 0<BR>
&gt; +}<BR>
&gt; +<BR>
&gt; +#<BR>
&gt; +# For each firewall... (this is main loop)<BR>
&gt; +#<BR>
&gt; +source_password_file $password_file<BR>
&gt; +set in_proc 0<BR>
&gt; +set exitval 0<BR>
&gt; +foreach router [lrange $argv $i end] {<BR>
&gt; +&nbsp;&nbsp;&nbsp; set router [string tolower $router]<BR>
&gt; +&nbsp;&nbsp;&nbsp; send_user &quot;$router\n&quot;<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # FortiOS 2.x prompts can end in either '#' or '$'<BR>
&gt; +&nbsp;&nbsp;&nbsp; set prompt &quot;\[#\\$] &quot;<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # Figure out passwords<BR>
&gt; +&nbsp;&nbsp; if { $do_passwd || $do_enapasswd } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set pswd [find password $router]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if { [llength $pswd] == 0 } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_user &quot;\nError: no password for $router in $password_file.\n&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; set passwd [join [lindex $pswd 0] &quot;&quot;]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; set enapasswd [join [lindex $pswd 1]&nbsp; &quot;&quot;]<BR>
&gt; +&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set passwd $userpasswd<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set enapasswd $enapasswd<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # Figure out username<BR>
&gt; +&nbsp;&nbsp;&nbsp; if {[info exists username]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # command line username<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set ruser $username<BR>
&gt; +&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set ruser [join [find user $router] &quot;&quot;]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if { &quot;$ruser&quot; == &quot;&quot; } { set ruser $default_user }<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # Figure out username's password (if different from the vty password)<BR>
&gt; +&nbsp;&nbsp;&nbsp; if {[info exists userpasswd]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # command line username<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set userpswd $userpasswd<BR>
&gt; +&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set userpswd [join [find userpassword $router] &quot;&quot;]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if { &quot;$userpswd&quot; == &quot;&quot; } { set userpswd $passwd }<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # Figure out cypher type<BR>
&gt; +&nbsp;&nbsp;&nbsp; if {[info exists cypher]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # command line cypher type<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set cyphertype $cypher<BR>
&gt; +&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set cyphertype [find cyphertype $router]<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if { &quot;$cyphertype&quot; == &quot;&quot; } { set cyphertype &quot;3des&quot; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # Figure out connection method<BR>
&gt; +&nbsp;&nbsp;&nbsp; set cmethod [find method $router]<BR>
&gt; +&nbsp;&nbsp;&nbsp; if { &quot;$cmethod&quot; == &quot;&quot; } { set cmethod {{telnet} {ssh}} }<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # Figure out the SSH executable name<BR>
&gt; +&nbsp;&nbsp;&nbsp; set sshcmd [find sshcmd $router]<BR>
&gt; +&nbsp;&nbsp;&nbsp; if { &quot;$sshcmd&quot; == &quot;&quot; } { set sshcmd {ssh} }<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # Login to the router<BR>
&gt; +&nbsp;&nbsp;&nbsp; if {[login $router $ruser $userpswd $passwd $enapasswd $prompt $cmethod $cyphertype]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr exitval<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # we are logged in, now figure out the full prompt based on what the device sends us.<BR>
&gt; +&nbsp;&nbsp;&nbsp; send &quot;\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp; expect {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;\[\r\n]+&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { exp_continue; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -re &quot;^(.+$prompt)&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { set junk $expect_out(0,string); }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {[$junk = &quot;(^\\$ $)&quot;]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set prompt $junk;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {[$junk = &quot;(^# $)&quot;]} { set prompt $junk ; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; if { $do_command } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if {[run_commands $prompt $command]} {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incr exitval<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; } elseif { $do_script } {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Disable output paging.<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send &quot;config system console\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send &quot;set output standard\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send &quot;end\r&quot;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expect -re $prompt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {}<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; source $sfile<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch {close};<BR>
&gt; +&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label $router<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log_user 1<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; interact<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +<BR>
&gt; +&nbsp;&nbsp;&nbsp; # End of for each firewall<BR>
&gt; +&nbsp;&nbsp;&nbsp; catch {wait};<BR>
&gt; +&nbsp;&nbsp;&nbsp; sleep 0.3<BR>
&gt; +}<BR>
&gt; +exit $exitval<BR>
&gt; +<BR>
&gt; --- rancid-2.3.4/bin/fnrancid.in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2010-10-02 08:31:34.000000000 +0200<BR>
&gt; +++ rancid-patch/bin/fnrancid.in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2010-10-02 08:29:48.000000000 +0200<BR>
&gt; @@ -48,6 +48,7 @@<BR>
&gt;&nbsp; # usage: rancid [-dV] [-l] [-f filename | hostname]<BR>
&gt;&nbsp; #<BR>
&gt;&nbsp; use Getopt::Std;<BR>
&gt; +use Data::Dumper;<BR>
&gt;&nbsp; getopts('dflV');<BR>
&gt;&nbsp; if ($opt_V) {<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;@PACKAGE@ @VERSION@\n&quot;;<BR>
&gt; @@ -59,10 +60,11 @@<BR>
&gt;&nbsp; $file = $opt_f;<BR>
&gt;&nbsp; $host = $ARGV[0];<BR>
&gt;&nbsp; $found_end = 0;<BR>
&gt; -$timeo = 90; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # nlogin timeout in seconds<BR>
&gt; +$timeo = 90; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # fnlogin timeout in seconds<BR>
&gt;&nbsp;<BR>
&gt;&nbsp; my(@commandtable, %commands, @commands);# command lists<BR>
&gt;&nbsp; my($aclsort) = (&quot;ipsort&quot;);&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # ACL sorting mode<BR>
&gt; +$aclsort = &quot;&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # disable sort<BR>
&gt;&nbsp; my($filter_commstr); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # SNMP community string filtering<BR>
&gt;&nbsp; my($filter_pwds);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # password filtering mode<BR>
&gt;&nbsp;<BR>
&gt; @@ -174,10 +176,35 @@<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; tr/\015//d;<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; next if /^\s*$/;<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; last if (/$prompt/);<BR>
&gt; -<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; next if (/^System Time:/);<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; next if (/^FortiClient application signature package:/);<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; ProcessHistory(&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;$_&quot;);<BR>
&gt; +&nbsp;&nbsp;&nbsp; if(/^\s*(System time:) (.*)/) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessHistory(&quot;System time&quot;,&quot;&quot;,&quot;&quot;,&quot;$1 ****removed****&quot;);<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print STDERR &quot;!$1 ****removed****\n&quot;;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; if(/^\s*(Virus-DB:) (.*)/) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessHistory(&quot;$1&quot;,&quot;&quot;,&quot;&quot;,&quot;$1 ****removed****\n&quot;);<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print STDERR &quot;!$1 ****removed****\n&quot;;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; if(/^\s*(Extended DB:) (.*)/) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessHistory(&quot;$1&quot;,&quot;&quot;,&quot;&quot;,&quot;$1 ****removed****\n&quot;);<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print STDERR &quot;!$1 ****removed****\n&quot;;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; if(/^\s*(IPS-DB:) (.*)/) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessHistory(&quot;$1&quot;,&quot;&quot;,&quot;&quot;,&quot;$1 ****removed****\n&quot;);<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print STDERR &quot;!$1 ****removed****\n&quot;;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; if(/^get system status/) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # sometimes compare on the console so filter out<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next;<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp; # - Comment system info in file with '!'.<BR>
&gt; +&nbsp;&nbsp; ProcessHistory(&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;!$_&quot;);<BR>
&gt; +<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessHistory(&quot;SYSTEM&quot;,&quot;&quot;,&quot;&quot;,&quot;\n&quot;);<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return(0);<BR>
&gt; @@ -197,11 +224,22 @@<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (&lt;INPUT&gt;) {<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; tr/\015//d;<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; next if /^\s*$/;<BR>
&gt; +&nbsp;&nbsp;&nbsp; next if(/^\s*!System time:/); # System time is fortigate extraction time so remove it<BR>
&gt; +&nbsp;&nbsp;&nbsp; # remove occurrances of conf_file_ver<BR>
&gt; +&nbsp;&nbsp;&nbsp; if ( /^\s*(#conf_file_ver=)([0-9]+)(.*)/i &amp;&amp; $filter_pwds &gt;0 ) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print STDERR &quot;removed serial number --&gt;!$1$2$3\n&quot;;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessHistory(&quot;conf_file_ver&quot;,&quot;&quot;,&quot;&quot;,&quot;!$1**removed**$3\n&quot;);<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next;<BR>
&gt; +&nbsp;&nbsp;&nbsp; }<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; last if (/$prompt/);<BR>
&gt;&nbsp;<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; next if (/^conf_file_ver=/);<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; if (/(^set.*)('Enc .*')(.*)/) {<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ProcessHistory(&quot;ENC&quot;,&quot;&quot;,&quot;&quot;,&quot;!$1 'Enc **encoding removed**' $3\n&quot;);<BR>
&gt; +&nbsp;&nbsp;&nbsp; # Remove all the variability from the configuration versions<BR>
&gt; +&nbsp;&nbsp;&nbsp; # if filter_pwds is enabled, filter out also variabilities between configurations<BR>
&gt; +&nbsp;&nbsp;&nbsp; # password encription is different between extraction so filtering out encoding<BR>
&gt; +&nbsp;&nbsp;&nbsp; if ( /^\s*(set [^\s]*)\s(Enc\s[^\s]+)(.*)/i &amp;&amp; $filter_pwds &gt;0 ) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp; print STDERR &quot;removed password--&gt;!$1 ENC **encoding removed** $3\n&quot;;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessHistory(&quot;ENC&quot;,&quot;&quot;,&quot;&quot;,&quot;!$1 ENC **encoding removed**' $3\n&quot;);<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; next;<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ProcessHistory(&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;$_&quot;);<BR>
&gt; @@ -216,7 +254,7 @@<BR>
&gt;&nbsp; # Main<BR>
&gt;&nbsp; @commandtable = (<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {'get system status'&nbsp;&nbsp;&nbsp; =&gt; 'GetSystem'},<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; {'get conf'&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; 'GetConf'}<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; {'show full-configuration'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; 'GetConf'}<BR>
&gt;&nbsp; );<BR>
&gt;&nbsp; # Use an array to preserve the order of the commands and a hash for mapping<BR>
&gt;&nbsp; # commands to the subroutine and track commands that have been completed.<BR>
&gt; @@ -245,13 +283,13 @@<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print STDOUT &quot;opening file $host\n&quot; if ($log);<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open(INPUT,&quot;&lt;$host&quot;) || die &quot;open failed for $host: $!\n&quot;;<BR>
&gt;&nbsp; } else {<BR>
&gt; -&nbsp;&nbsp;&nbsp; print STDERR &quot;executing nlogin -t $timeo -c\&quot;$cisco_cmds\&quot; $host\n&quot; if ($debug);<BR>
&gt; -&nbsp;&nbsp;&nbsp; print STDOUT &quot;executing nlogin -t $timeo -c\&quot;$cisco_cmds\&quot; $host\n&quot; if ($log);<BR>
&gt; +&nbsp;&nbsp;&nbsp; print STDERR &quot;executing fnlogin -t $timeo -c\&quot;$cisco_cmds\&quot; $host\n&quot; if ($debug);<BR>
&gt; +&nbsp;&nbsp;&nbsp; print STDOUT &quot;executing fnlogin -t $timeo -c\&quot;$cisco_cmds\&quot; $host\n&quot; if ($log);<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (defined($ENV{NOPIPE})) {<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; system &quot;nlogin -t $timeo -c \&quot;$cisco_cmds\&quot; $host &lt;/dev/null &gt; $host.raw 2&gt;&amp;1&quot; || die &quot;nlogin failed for $host: $!\n&quot;;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; system &quot;fnlogin -t $timeo -c \&quot;$cisco_cmds\&quot; $host &lt;/dev/null &gt; $host.raw 2&gt;&amp;1&quot; || die &quot;nlogin failed for $host: $!\n&quot;;<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; open(INPUT, &quot;&lt; $host.raw&quot;) || die &quot;nlogin failed for $host: $!\n&quot;;<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; open(INPUT,&quot;nlogin -t $timeo -c \&quot;$cisco_cmds\&quot; $host &lt;/dev/null |&quot;) || die &quot;nlogin failed for $host: $!\n&quot;;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; open(INPUT,&quot;fnlogin -t $timeo -c \&quot;$cisco_cmds\&quot; $host &lt;/dev/null |&quot;) || die &quot;nlogin failed for $host: $!\n&quot;;<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt;&nbsp; }<BR>
&gt;&nbsp;<BR>
&gt; @@ -279,14 +317,34 @@<BR>
&gt;&nbsp; TOP: while(&lt;INPUT&gt;) {<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tr/\015//d;<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (/^Error:/) {<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; print STDOUT (&quot;$host nlogin error: $_&quot;);<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; print STDERR (&quot;$host nlogin error: $_&quot;) if ($debug);<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; print STDOUT (&quot;$host fnlogin error: $_&quot;);<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp; print STDERR (&quot;$host fnlogin error: $_&quot;) if ($debug);<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; last;<BR>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; -&nbsp;&nbsp;&nbsp; while (/&gt;\s*($cmds_regexp)\s*$/) {<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; $cmd = $1;<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; if (!defined($prompt)) { $prompt = &quot; &gt;\s*&quot;; }<BR>
&gt; -&nbsp;&nbsp;&nbsp;&nbsp; print STDERR (&quot;HIT COMMAND:$_&quot;) if ($debug);<BR>
&gt; +&nbsp;&nbsp;&nbsp; while (/^.+(#|\$)\s*($cmds_regexp)\s*$/) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $cmd = $2;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # - FortiGate prompts end with either '#' or '$'. Further, they may<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # be prepended with a '~' if the hostname is too long. Therefore,<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # we need to figure out what our prompt really is.<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!defined($prompt)) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( $_ =~ m/^.+\~\$/ ) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $prompt = '\~\$ .*' ;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( $_ =~ m/^.+\$/ ) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $prompt = ' \$ .*' ;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( $_ =~ m/^.+\~#/ ) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $prompt = '\~# .*' ;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( $_ =~ m/^.+#/ ) {<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $prompt = ' # .*' ;<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print STDERR (&quot;HIT COMMAND:$_&quot;) if ($debug);<BR>
&gt; +<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if (!defined($commands{$cmd})) {<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; print STDERR &quot;$host: found unexpected command - \&quot;$cmd\&quot;\n&quot;;<BR>
&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; last TOP;<BR>
&gt; --- rancid-2.3.4/configure&nbsp;&nbsp;&nbsp; 2010-10-02 08:31:58.000000000 +0200<BR>
&gt; +++ rancid-patch/configure&nbsp;&nbsp;&nbsp; 2010-10-02 08:29:49.000000000 +0200<BR>
&gt; @@ -6042,7 +6042,7 @@<BR>
&gt;&nbsp;<BR>
&gt;&nbsp; ac_config_files=&quot;$ac_config_files bin/flogin bin/francid&quot;<BR>
&gt;&nbsp;<BR>
&gt; -ac_config_files=&quot;$ac_config_files bin/fnrancid&quot;<BR>
&gt; +ac_config_files=&quot;$ac_config_files bin/fnlogin bin/fnrancid&quot;<BR>
&gt;&nbsp;<BR>
&gt;&nbsp; ac_config_files=&quot;$ac_config_files bin/hlogin bin/hrancid&quot;<BR>
&gt;&nbsp;<BR>
<BR>
<BR>
</FONT>
</P>

<BR><BR>
<FONT FACE="Arial" SIZE="2">Wolfgang</FONT>&nbsp;<FONT FACE="Arial" SIZE="2">Fürtbauer</FONT><BR>
<FONT FACE="Arial"  SIZE="2">Leitung IT</FONT>
<BR><BR>
<IMG SRC="cid:107c-0b8b29b1@3e2f210d.01cb6253">
<BR>
<FONT FACE="Arial" SIZE="2">ASAMER Holding AG<BR>
Unterthalham Strasse 2<BR>
4694&nbsp;Ohlsdorf<BR>
AUSTRIA<BR>
<FONT FACE="Arial" SIZE="2" COLOR="#808080"><STRONG>tel&nbsp;</STRONG></FONT> +43 50 799 - 2500<BR>
<FONT FACE="Arial" SIZE="2" COLOR="#808080"><STRONG>fax  </STRONG></FONT> +43 7612 799 - 9526<BR>
<FONT FACE="Arial" SIZE="2" COLOR="#808080"><STRONG>mobile  </STRONG></FONT> +43 664 8332326<BR></FONT>
<FONT FACE="Arial" SIZE="2" COLOR="#808080"><STRONG>email </STRONG></FONT> <a href="mailto:w.fuertbauer@asamer.at"><FONT FACE="Arial" SIZE="2">w.fuertbauer@asamer.at</FONT></a><BR>
 <a href="http://www.asamer.at"><FONT FACE="Arial" SIZE="2" COLOR="#808080"><STRONG>www.asamer.at</STRONG></FONT></a><BR>
<BR>
<BR>
<P ALIGN="justify"><FONT FACE="Arial" COLOR="#808080" SIZE="1">This message is confidential. It may not be disclosed to, or used by, anyone other than the addressee. If you receive this
message by mistake, please advise the sender.</FONT></P></FONT>
<BR>
</BODY>
</HTML>