Solved

Python multiple IF statements

Posted on 2016-08-21
4
82 Views
Last Modified: 2016-08-25
Hi Experts,

The script is currently only looking at the first IF statement and not corresponding IF statements when the condition does not match.

Hope someone can shed some light on the following script (Run in Securecrt) to log into the console port for a Cisco device and look for prompts and execute corresponding lines.

Thank you




# $language = "python"
# $interface = "1.0"

# Connect to an SSH server using the SSH2 protocol. Specify the
# username and password and hostname on the command line as well as
# some SSH2 protocol specific options.
# msgbox = crt.Dialog.MessageBox

def main():
# Prompt for a password instead of embedding it in a script...
#
# passwd = crt.Dialog.Prompt("Enter password for " + host, "Login", "", True)
      passwd = crt.Dialog.Prompt

# Build a command-line string to pass to the Connect method.
cmd = "/SERIAL COM6 /BAUD 9600 /NOCTS /DATA 8 /NODSR /PARITY NONE /NOXON"
crt.Session.Connect(cmd, False)
crt.Screen.Synchronous = True
# This line will need to be modified to wait for what the remote will send.
crt.Screen.Send(chr(13))

initial_1 = crt.Screen.WaitForString("outer")
initial_2 = crt.Screen.WaitForString("initial configuration dialog")
initial_3 = crt.Screen.WaitForString("con0")
initial_4 = crt.Screen.WaitForString("odified")
initial_5 = crt.Screen.WaitForString("Press RETURN to get started")


if initial_1 == True:
      crt.Screen.Send("en" + chr(13))
      crt.Screen.WaitForString("Password", 2)
      crt.Screen.Send("password" + chr(13))
      crt.Screen.WaitForString("#")
      crt.Screen.Send("erase startup-config" + chr(13))
      crt.Screen.WaitForString("Erasing")
      crt.Screen.Send(chr(13))
      crt.Screen.WaitForString("#")
      crt.Screen.Send("delete nvram:vlan.dat" + chr(13))
      crt.Screen.WaitForString("vlan.dat")
      crt.Screen.Send(chr(13))
      crt.Screen.WaitForString("confirm")
      crt.Screen.Send(chr(13))
      crt.Screen.Send(chr(13))
      crt.Screen.WaitForString("#")
      crt.Screen.Send("reload" + chr(13))
      crt.Screen.Send(chr(13))
      crt.Screen.WaitForString("System configuration has been modified", 2)
      crt.Screen.Send("no" + chr(13))
      crt.Screen.WaitForString("Proceed with reload", 2)
      crt.Screen.Send(chr(13))

if initial_2 == True:
      crt.Screen.Send("no" + chr(13))
      crt.Screen.Send(chr(13))
      crt.Screen.WaitForString("Would you like to terminate autoinstall", 3)
      crt.Screen.Send(chr(13))
      crt.Screen.Send(chr(13))

if initial_3 == True:
      crt.Screen.Send(chr(13))
      crt.Screen.WaitForString("rt1")
      crt.Screen.Send("en" + chr(13))
      crt.Screen.WaitForString("Password")
      crt.Screen.Send("password" + chr(13))
      crt.Screen.WaitForString("#")
      crt.Screen.Send("erase startup-config" + chr(13))
      crt.Screen.WaitForString("Erasing")
      crt.Screen.Send(chr(13))
      crt.Screen.WaitForString("#")
      crt.Screen.Send("delete nvram:vlan.dat" + chr(13))
      crt.Screen.WaitForString("vlan.dat")
      crt.Screen.Send(chr(13))
      crt.Screen.WaitForString("confirm")
      crt.Screen.Send(chr(13))
      crt.Screen.Send(chr(13))
      crt.Screen.WaitForString("#")
      crt.Screen.Send("reload" + chr(13))
      crt.Screen.Send(chr(13))

if initial_4 == True:
      crt.Screen.Send(chr(13))
      crt.Screen.WaitForString("confirm")
      crt.Screen.Send(chr(13))
      crt.Screen.Send(chr(13))
      
if initial_5 == True:
      crt.Screen.Send(chr(13))
      #
      crt.Screen.Send("en" + chr(13))
      #
      crt.Screen.Send("delete flash:vlan.dat" + chr(13))
      #
      crt.Screen.Send(chr(13))
      crt.Screen.Send(chr(13))
      crt.Screen.Send(chr(13))
      crt.Screen.WaitForString("#")
      #
      crt.Screen.Send("config t" + chr(13))
      crt.Screen.WaitForString("config")
      #
      crt.Screen.Send("interface Cellular0/1/0" + chr(13))
      crt.Screen.WaitForString("config")
      crt.Screen.Send("shut" + chr(13))
      crt.Screen.WaitForString("config")
      #
      crt.Screen.Send("end" + chr(13))
      crt.Screen.WaitForString("#")
0
Comment
Question by:synsynackack
  • 2
  • 2
4 Comments
 
LVL 20

Expert Comment

by:jmcg
ID: 41764780
Perhaps I'm misunderstanding your program's intent, but it looks to me like you evaluate all of the initial_n variables once at the beginning of the script and never go back. So initial_1 is True while all the others are False.

There's a language called "Expect" that started out in the TCL/TK world, but has versions for Perl and for Python (Pexpect). There quite a bit to learn, but once you've got the hang of it, it works much better for scripting interactions like this.
0
 

Author Comment

by:synsynackack
ID: 41764937
Sorry about that, please let me rephrase my question:

The script is suppose to log into the Cisco device (via console port), look for a matching IF statement and execute the corresponding code.

The script currently only attempts to match the first IF statement and ignores the rest.

How would it be possible for the script to search down the list of IF statements and execute the relevant one(IF True)?

Thank you
0
 
LVL 20

Accepted Solution

by:
jmcg earned 500 total points
ID: 41765761
What's your basis for thinking the later if statements are not reached?

Before I started using Expect, I would write these dialogs with a loop around a single send/read statement and set up a state machine loop, where the received input plus current state would determine the next state. Waiting for a particular string to show up from the partner was too fragile.
0
 

Author Comment

by:synsynackack
ID: 41766318
Hi jmcg,

Managed to work out the issue, will post the script after some further testing.

Thanks for your advice.
0

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Quality of Service (QoS) options are nearly endless when it comes to networks today. This article is merely one example of how it can be handled in a hub-n-spoke design using a 3-tier configuration.
Active Directory replication delay is the cause to many problems.  Here is a super easy script to force Active Directory replication to all sites with by using an elevated PowerShell command prompt, and a tool to verify your changes.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.
Both in life and business – not all partnerships are created equal. As the demand for cloud services increases, so do the number of self-proclaimed cloud partners. Asking the right questions up front in the partnership, will enable both parties …

776 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question