Reply
Highlighted

netmri_easy not running inside of python if statement

notanexpert
Techie
Posts: 4
351     0

Hello,

While I know support for python in netmri is limited at best, I'm curious to see if anyone else has run into this.

 

I'm running a script that goes through a list of software images on a cisco device and deletes every image except the one that's currently running. 

Here's the relevant code:

 

removed = 0
for line in Image_Files:
     result = re.search('(?<=00:00 )(.*?)(?=$)',line)
     if result:
            if result.group(0) != Running_Code:
                 removed = removed + 1
                 easy.send_command("delete /force flash:" + result.group(0))

 

If I change "easy.send_command" to "print" it prints the commands I need to run. When "easy.send_command" is entered, the script will run every line except actually sending the command to the device. 

 

At this point in the script I've already run several commands with the same syntax, so I know that send_command is working, just not sure why it's not working here.

Is there something I'm missing?

Re: netmri_easy not running inside of python if statement

Expert
Posts: 179
352     0
If I'd had to guess it is the '/' that is messing it up.  Try:
 
easy.send_command("delete \/force flash:" + result.group(0))
 
or
 
easy.send_command("delete \\/force flash:" + result.group(0))
 
 
-Lon.

Re: netmri_easy not running inside of python if statement

Expert
Posts: 179
352     0

My other thought is that are you importing NetMRIEasy and creating the NetMRI context?  Since you didn't post all of your code, I assumed that you were doing this in the code previous to what you had shown.  Before you call NetMRIEasy, you will need to do the following:

 

from netmri_easy import NetMRIEasy

# This values will be provided by NetMRI before execution
defaults = {
   "api_url": api_url,
   "http_username": http_username,
   "http_password": http_password,
   "job_id": job_id,
   "device_id": device_id,
   "batch_id": batch_id
}

# Create NetMRI context manager. It will close session after execution
with NetMRIEasy(**defaults) as easy:

        # put rest of code here that calls NetMRIEasy
        # .
        # .
        # .

Re: netmri_easy not running inside of python if statement

[ Edited ]
notanexpert
Techie
Posts: 4
352     0

Hello LThompson,

Thanks for replying.


In regards to your first reply, I've tried it with and without the slash, and it didn't seem to make a difference. also I'm not really sure that would have done it, since with the print() command instead, it prints the proper lines every time.

 

In regards to the second one, by this point in the script I've already sent several commands (show ver, dir, etc.) so I know that netmri_easy is working, but I don't know why it won't work in that loop.

 

Also, I tried the last line without the tabs, like this:


print(Running_Code)
     removed = 0
     for line in Image_Files:
          result = re.search('(?<=00:00 )(.*?)(?=$)',line)
          if result:
               if result.group(0) != Running_Code:
               removed = removed + 1
easy.send_command("delete /force flash:" + result.group(0))

 

and it complains that it doesn't know what result.group is, so I know it will run without the tabs.

Perhaps it's something with the interpreter?

Re: netmri_easy not running inside of python if statement

Expert
Posts: 179
352     0

Could you please post the entire script?  It would be good to see how you are arriving that the list of Image_Files.  Indentation is important in Python, be sure that you are not mixing space indents and tabs.  Add a print(line) to see what you are processing.

 

print(Running_Code)
     removed = 0
     for line in Image_Files:
          print(line)
          result = re.search('(?<=00:00 )(.*?)(?=$)',line)
          if result:
               if result.group(0) != Running_Code:
                   removed = removed + 1
                   easy.send_command("delete /force flash:" + result.group(0))

Re: netmri_easy not running inside of python if statement

notanexpert
Techie
Posts: 4
352     0

Sure.

 

###########################################################################
## Export of Script: Python netmri_easy test
## Script-Level: 1
## Script-Category: netmti_easy.py tests
## Script-Language: python
###########################################################################


# BEGIN-SCRIPT-BLOCK
# Script-Filter:
# $vendor = "Cisco"
#Script-timeout:900
# END-SCRIPT-BLOCK


#defaults = {
# "api_url": api_url,
# "http_username": http_username,
# "http_password": http_password,
# "job_id": job_id,
# "device_id": device_id,
# "batch_id": batch_id
#}

 

#Author:Todd Vogt
#Automated Code Cleanup
#Version 4.1

import re, difflib, sys
import urllib
#from netmri_easy import NetMRIEasy

#easy = NetMRIEasy(**defaults)

 

#First, gather all the information we will need.
#-------------------------------------------------------------------------------
#Get a show version output to determine what code is currently running and where it is located

 

#ImageLoc = (easy.send_command('show version | include image'))
ImageLoc = ('System image file is "flash:c3560cx-universalk9-mz.152-6.E2.bin"')

 

#Get a list of the image files currently residing on the device
#Image_Files = ((easy.send_command("dir | include .bin")).readlines())
Image_Files = open("diri.txt", "r").readlines()

 

#-------------------------------------------------------------------------------
#Next, transform that data for our purposes.
#-------------------------------------------------------------------------------
#Find the location of the boot images
Code_Location = ((re.search('(?<=\")(.*?)(?=\Smiley Happy',(ImageLoc))).group(0))

#Find the version of the code currently running on the device
Running_Code = ((re.search('(?<=\Smiley Happy(.*?)(?=")',(ImageLoc))).group(0))

#Find how much space is left in the location above
Free_Space_Bytes = float(((re.search('(?<=\()(.*?)(?= b)',(Free_Space))).group(0)))

Image_Count = sum(1 for line in Image_Files)


#-------------------------------------------------------------------------------
#Next, find the old images (anything not currently running) and remove them
#-------------------------------------------------------------------------------
#How many old images are there?
if Image_Count == 1:
sys.exit("There's only one image! I'm not deleting anything!")

removed = 0
for line in Image_Files:
     result = re.search('(?<=00:00 )(.*?)(?=$)',line)
     if result:
          if result.group(0) != Running_Code:
               removed = removed + 1
               print("delete /force flash:" + result.group(0))

print("I deleted " + str(removed) + " old images! Enjoy the free space")

 

There's the script. You'll notice that some of the commands are commented out - that's because I have to use my laptop as a sandbox, because I can't get any good text editors on the customer's network. So instead of sending commands to the devices, I have the output from those commands in text files, which allows me to play with different outputs.

For example, here are the inputs I'm giving it:

 

Image_Files:

 

2 -rwx 21440512 Jul 01 2015 00:08:48 +00:00 c3560cx-universalk9-mz.152-4.E1.bin
5 -rwx 22802432 Aug 22 2017 17:50:25 +00:00 c3560cx-universalk9-mz.152-6.E2.bin
6 -rwx 22802432 Mar 30 2016 17:50:25 +00:00 c3560cx-universalk9-mz.151-2.E1.bin
7 -rwx 22802432 Sep 22 2018 17:50:25 +00:00 c3560cx-universalk9-mz.123-6.E2.bin

 

That's the same output that you would get from sending the command "dir | i .bin" - which is what I use when I'm actually running it.

 

Also - the handy text input box on this website won't seem to let me use tabs - so I've used spaces - please be assured that in all other cases the tabs are correct :-)

 

With this script running on my laptop, I get the following output:

 

delete /force flash:c3560cx-universalk9-mz.152-4.E1.bin
delete /force flash:c3560cx-universalk9-mz.151-2.E1.bin
delete /force flash:c3560cx-universalk9-mz.123-6.E2.bin
I deleted 3 old images! Enjoy the free space

 

When I remove the necessary comments and put it in NetMRI, it runs all the commands in the first section, but skips over the command to actually remove the files. What I'd like it to do is send the above delete commands to the device.

 

 

Showing results for 
Search instead for 
Do you mean 

Recommended for You