Paramiko Script

Hi Geeks,

I have the following python script.

#!/usr/bin/python
#Script to pull KPI values from MMEs.


import paramiko
import sys
import os

host = sys.argv[0]

user = sys.argv[1]

password = sys.argv[2]

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('host', username='user', password='password')

stdin, stdout, stderr = ssh.exec_command(pdc_kpi.pl | grep -A 4 sgsn_g | head -5 | tail -1 | awk '{print $3}'  | sed 's/[%]//g')

a = stdout.readlines()

print a

I want to pass the argument for HOST, USERNAME, PASSWORD from the shell because I will be using this for several servers but it seems sys.argv is giving errors.

sh-3.2$ python pcn_test.py 192.168.12.66 GbeAdi gbenga123
Traceback (most recent call last):
  File "pcn_test.py", line 17, in ?
    ssh.connect(host, username='user', password='password')
  File "/usr/lib/python2.4/site-packages/paramiko/client.py", line 278, in connect
    for (family, socktype, proto, canonname, sockaddr) in socket.getaddrinfo(hostname, port, socket.AF_UNSPEC, socket.SOCK_STREAM):
socket.gaierror: (-2, 'Name or service not known')

Also GREP is complaining:

File "pcn_test.py", line 20
    stdin, stdout, stderr = ssh.exec_command(pdc_kpi.pl | grep --line-buffered -A 4 sgsn_g | head -5 | tail -1 | awk '{print $3}' | sed 's/[%]//g')
                                                                                  ^
SyntaxError: invalid syntax

Any help will be appreciated

Are you sure, just passing pdc_kpi.pl will execute the perl script

Yes...

But after a while...The code below seems to be working now:

#!/usr/bin/python
#Script to pull KPI values from MMEs.


import paramiko
import sys
import os

host = sys.argv[1]

user = sys.argv[2]

password = sys.argv[3]

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=password)

stdin, stdout, stderr = ssh.exec_command("pdc_kpi.pl | grep --line-buffered -A 4 sgsn_g | head -5 | tail -1 | awk '{print $3}' | sed 's/[%]//g'")

a = stdout.read().strip()

print a

@infinitydon,
I believe your script failed at first cause the sys.argv[0] contains the actual script name itself, python utilizes 0,1,2,3 as arguments.

jaysunn-> cat pytest.py 
import sys
import os

script = sys.argv[0]

user = sys.argv[1]

password = sys.argv[2]

print(script,user,password)
jaysunn-> python pytest.py jaysunn password
('pytest.py', 'jaysunn', 'password')

Where as 1,2,3 contains the correct information.

jaysunn-> cat pytest.py 
import sys
import os

arg1 = sys.argv[1]

user = sys.argv[2]

password = sys.argv[3]

print(arg1,user,password)
jaysunn-> python pytest.py arg1 jaysunn password
('arg1', 'jaysunn', 'password')

@Jaysun --- Spot On! You were right!

But now I have the following code:

#!/usr/bin/python
#Script to pull KPI values from MMEs.


import paramiko
import sys
import os

host = sys.argv[1]

user = sys.argv[2]

password = sys.argv[3]

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=password)

stdin, stdout, stderr = ssh.exec_command("pdc_kpi.pl | grep -A 4 sgsn_g | head -5 | tail -1 | awk '{print $3}' | | sed 's/[%]//g'")

gsm_att = stdout.read().strip()

#Test for whether KPI are within acceptable limit, also this gives Nagios the Necessary EXIT codes

if gsm_att <= "0.5":
	print "OK - GSM Attach KPI is " + str(gsm_att) + "and it is within target." % gsm_att
	sys.exit(0)
	
elif gsm_att > "0.5" and gsm_att <= "0.99":
	print "WARNING - GSM Attach KPI is " + str(gsm_att) + "and it is approaching target." % gsm_att
	sys.exit(1)
	
elif gsm_att > "1.0":
	print "CRITICAL - GSM Attach KPI is " + str(gsm_att) + " and it is degraded, kindly investigate." % gsm_att
	sys.exit(2)

else:
	print "UNKNOWN - Kindly check the settings or Node Connectivity." % gsm_att
	sys.exit(3)

ssh.close()
	

But the script is giving the following error:

Traceback (most recent call last):
File "pcn_test2.py", line 26, in ?
print "OK - GSM Attach KPI is " + str(gsm_att) + "and it is within target." % gsm_att
TypeError: not all arguments converted during string formatting

N.B -- Am writing this so that I can use it in nagios/centreon.

DISCLAIMER, I am learning PYTHON as well. Just a thought try the following for variable expansion.

Change red in all string expansions:

if gsm_att <= "0.5":
     print "OK - GSM Attach KPI is " + str(gsm_att) + "and it is within target." % gsm_att     
     sys.exit(0)

TO:

if gsm_att <= "0.5":
     print "OK - GSM Attach KPI is " + '%s' + "and it is within target." % gsm_att
     sys.exit(0)

Thanks...

This next one seems challenging

stdin, stdout, stderr = ssh.exec_command("cat /gsn/pdp/ojota/pdp_fail/web/`date | awk '{ print $2"-"$3"-"$6 }'`pdp_failure.txt | tail -1 | awk '{print $19}'")

But this gives the following error:

Traceback (most recent call last):
  File "pdp_act_web.py", line 23, in ?
    stdin, stdout, stderr = ssh.exec_command("cat /gsn/pdp/ojota/pdp_fail/web/`date | awk '{ print $2"-"$3"-"$6 }'`pdp_failure.txt | tail -1 | awk '{print $19}'")
TypeError: unsupported operand type(s) for -: 'str' and 'str'

Any idea :slight_smile:

Sounds like python is looking for an INT instead of STRING, perhaps you can convert them via the

int()

call. Just a suggestion, or vice versa and it needs an STRING try converting with the

str() 

call. Also you can use

 print() 

and

type()

to see what you are outputing.

It seems that you try to do the following..

<String> - <String>

And Python told you that it is not possible to substract a string from a string...

Thats maybe something with value $19...