# -*- coding: UTF-8 -*-
"""
"""
import logging
import traceback
import time
import paramiko
#############################
SUT_IPADDR ='129.24.33.30'
SUT_USERNAME = 'admin'
SUT_PWD = 'Admin@storage'
SSH_LOG_PATH = 'ommssh.log'
##################
class Ommssh:
__prv_ipaddr = '127.0.0.1'
__prv_port = 22
__prv_username = 'admin'
__prv_pwd = 'Admin@storage'
__prv_rbuffernum = 1024*1024
__prv_timeout = 300
__prv_cmdtimeout = 600
__prv_clichannel = ''
__prv_diagnosechannel = ''
__prv_linuxoschannel = ''
__prv_ttywide = 80
__prv_ttyhight =100
__prv_logpath = 'ommssh.log'
def __init__(self,ipaddr=SUT_IPADDR,username=SUT_USERNAME,
pwd=SUT_PWD,logpath=SSH_LOG_PATH):
"""
ssh鍙傛暟鍒濆鍖?
ipaddr:鐧婚檰瀵硅薄鐨勫湴鍧€
username锛氱敤鎴峰悕
pwd:瀵嗙爜
logpath锛氭棩蹇楄矾寰?
"""
if (''!=ipaddr):
self.__prv_ipaddr = ipaddr
if (''!=username):
self.__prv_username = username
if (''!=pwd):
self.__prv_pwd = pwd
if (''!=logpath):
self.__prv_logpath = logpath
paramiko.util.log_to_file(self.__prv_logpath)
def __chksendstats(self,chan):
"""
鍙戦€佺姸鎬佹鏌?
"""
sendcount=0
while ((False == chan.send_ready())and(sendcount <= self.__prv_timeout)):
time.sleep(1)
sendcount = sendcount + 1
if (self.__prv_timeout == sendcount):
return False
else:
return True
def __chkrecvstats(self,chan):
"""
閫氶亾鎺ユ敹鐘舵€佹娴?
"""
recvcount=0
while ((False ==chan.recv_ready())and(recvcount <= self.__prv_timeout)):
time.sleep(1)
recvcount = recvcount + 1
if (self.__prv_timeout == recvcount):
return False
else:
return True
def opencli(self):
"""
浠li妯″紡鐧婚檰XVE鐨勬帶鍒跺櫒
骞惰缃€氶亾鐨勮秴鏃舵椂闂?
"""
try:
s = paramiko.Transport((self.__prv_ipaddr, self.__prv_port))
s.connect(username=self.__prv_username, password=self.__prv_pwd)
chan = s.open_session()
chan.get_pty(height=self.__prv_ttyhight)
chan.invoke_shell()
chan.setblocking(0)
except Exception,e:
print e
logging.error("Catch an exception:\n%s", traceback.format_exc())
if (True == self.__chksendstats(chan)):
chan.sendall('change cli timeout=100000\r')
else:
return (-1,'')
if (True == self.__chkrecvstats(chan)):
str = chan.recv(self.__prv_rbuffernum)
print str
else:
return (-1,'')
if ( -1 == str.find("Command executed successfully.\r\nadmin:/>")):
return (-1,'')
else:
self.__prv_clichannel =chan
return (0,chan)
def openlinuxcli(self):
"""
浠li鐨勬柟寮忕櫥闄嗙劧鍚庡垏鎹㈠埌OS妯″紡
"""
try:
s = paramiko.Transport((self.__prv_ipaddr, self.__prv_port))
s.connect(username=self.__prv_username, password=self.__prv_pwd)
chan = s.open_session()
chan.get_pty(height=self.__prv_ttyhight)
chan.invoke_shell()
chan.setblocking(0)
except Exception,e:
print e
logging.error("Catch an exception:\n%s", traceback.format_exc())
if (True == self.__chksendstats(chan)):
chan.sendall('change cli timeout=100000\r')
else:
return (-1,'')
if (True == self.__chkrecvstats(chan)):
str = chan.recv(self.__prv_rbuffernum)
print str
else:
return (-1,'')
if ( -1 == str.find("Command executed successfully.\r\nadmin:/>")):
return (-1,'')
else:
chan.sendall('exit\r')
if (True == self.__chkrecvstats(chan)):
str = chan.recv(self.__prv_rbuffernum)
print str
else:
return (-1,'')
if ( -1 == str.find("Are you sure to exit?(y/n):")):
return (-1,'')
else:
chan.sendall('y\r')
if (True == self.__chkrecvstats(chan)):
str = chan.recv(self.__prv_rbuffernum)
print str
else:
return (-1,'')
if ( -1 == str.find("Storage:~ #")):
return (-1,'')
else:
self.__prv_linuxoschannel =chan
return (0,chan)
def opendiagnose(self):
"""
鍏堢櫥闄嗗埌cli妯″紡鐒跺悗鍒囨崲鍒皁s妯″紡鏈€鍚庡垏鎹㈠埌diagnose妯″紡
"""
try:
s = paramiko.Transport((self.__prv_ipaddr, self.__prv_port))
s.connect(username=self.__prv_username, password=self.__prv_pwd)
chan = s.open_session()
chan.get_pty(height=self.__prv_ttyhight)
chan.invoke_shell()
chan.setblocking(0)
except Exception,e:
print e
logging.error("Catch an exception:\n%s", traceback.format_exc())
if (True == self.__chksendstats(chan)):
chan.sendall('change cli timeout=100000\r')
else:
return (-1,'')
if (True == self.__chkrecvstats(chan)):
str = chan.recv(self.__prv_rbuffernum)
print str
else:
return (-1,'')
if ( -1 == str.find("Command executed successfully.\r\nadmin:/>")):
return (-1,'')
else:
chan.sendall('exit\r')
if (True == self.__chkrecvstats(chan)):
str = chan.recv(self.__prv_rbuffernum)
print str
else:
return (-1,'')
if ( -1 == str.find("Are you sure to exit?(y/n):")):
return (-1,'')
else:
chan.sendall('y\r')
if (True == self.__chkrecvstats(chan)):
str = chan.recv(self.__prv_rbuffernum)
print str
else:
return (-1,'')
if ( -1 == str.find("Storage:~ #")):
return (-1,'')
else:
chan.sendall('diagnose\r')
if (True == self.__chkrecvstats(chan)):
str = chan.recv(self.__prv_rbuffernum)
print str
else:
return (-1,'')
if ( -1 == str.find("admin:/diagnose>")):
return (-1,'')
else:
self.__prv_diagnosechannel = chan
return (0,chan)
def ssh_cli_docmd(self,cmd=''):
"""
鎵цcli鎴栬€卻hell鍛戒护锛岃繑鍥炴姤鏂囦互瀛楃涓茶繑鍥烇紝璋冪敤鑰呰嚜宸辫В鏋?
"""
if ((''==cmd)or ('' == self.__prv_clichannel) ):
return (0,'')
elif(True == self.__chksendstats(self.__prv_clichannel)):
self.__prv_clichannel.sendall(cmd+'\r\n')
else:
return (-1,'')
if (True == self.__chkrecvstats(self.__prv_clichannel)):
str = self.__prv_clichannel.recv(self.__prv_rbuffernum)
print str
strlst= str.splitlines()
del strlst[:2]
return (0,strlst)
else:
return (-1,'')
def ssh_linux_docmd(self,cmd=''):
if ((''==cmd)or ('' == self.__prv_linuxoschannel) ):
return (0,'')
elif(True == self.__chksendstats(self.__prv_linuxoschannel)):
self.__prv_linuxoschannel.sendall(cmd+'\r\n')
else:
return (-1,'')
if (True == self.__chkrecvstats(self.__prv_linuxoschannel)):
str = self.__prv_linuxoschannel.recv(self.__prv_rbuffernum)
print str
strlst= str.splitlines()
del strlst[:2]
return (0,strlst)
else:
return (-1,'')
def ssh_diagnose_docmd(self,cmd=''):
if ((''==cmd)or ('' == self.__prv_diagnosechannel) ):
return (0,'')
elif(True == self.__chksendstats(self.__prv_diagnosechannel)):
self.__prv_diagnosechannel.sendall(cmd+'\r')
else:
return (-1,'')
if (True == self.__chkrecvstats(self.__prv_diagnosechannel)):
str = self.__prv_diagnosechannel.recv(self.__prv_rbuffernum)
# print str
strlst= str.splitlines()
del strlst[:1]
return (0,strlst)
else:
return (-1,'')
def shutdown_cli_channel(self):
if(''!= self.__prv_clichannel):
self.__prv_clichannel.sendall('exit\r')
if (True == self.__chkrecvstats(self.__prv_clichannel)):
str = self.__prv_clichannel.recv(self.__prv_rbuffernum)
print str
else:
return -1
if ( -1 == str.find("Are you sure to exit?(y/n):")):
return -1
else:
self.__prv_clichannel.sendall('y\r')
if (True == self.__chkrecvstats(self.__prv_clichannel)):
str = self.__prv_clichannel.recv(self.__prv_rbuffernum)
print str
else:
return -1
if ( -1 == str.find("Storage:~ #")):
return -1
else:
self.__prv_clichannel.sendall('exit\r\n')
self.__prv_clichannel.shutdown(2)
self.__prv_clichannel.close()
self.__prv_clichannel =''
def shutdown_linux_channel(self):
if (''!=self.__prv_linuxoschannel):
self.__prv_linuxoschannel.sendall('exit\r\n')
self.__prv_linuxoschannel.shutdown(2)
self.__prv_linuxoschannel.close()
self.__prv_linuxoschannel =''
def shutdown_disgnose_channel(self):
if (''!=self.__prv_diagnosechannel):
self.__prv_diagnosechannel.sendall('exit\r')
if (True == self.__chkrecvstats(self.__prv_diagnosechannel)):
str = self.__prv_diagnosechannel.recv(self.__prv_rbuffernum)
print str
else:
return -1
if ( -1 == str.find("Storage:~ #")):
return -1
else:
self.__prv_diagnosechannel.sendall('exit\r\n')
self.__prv_diagnosechannel.shutdown(2)
self.__prv_diagnosechannel.close()
self.__prv_diagnosechannel =''
def form_cli_to_linux(self):
if(''!=self.__prv_clichannel):
self.__prv_clichannel.sendall('exit\r')
if (True == self.__chkrecvstats(self.__prv_clichannel)):
str = self.__prv_clichannel.recv(self.__prv_rbuffernum)
print str
else:
return -1
if ( -1 == str.find("Are you sure to exit?(y/n):")):
return -1
else:
self.__prv_clichannel.sendall('y\r')
if (True == self.__chkrecvstats(self.__prv_clichannel)):
str = self.__prv_clichannel.recv(self.__prv_rbuffernum)
print str
else:
return -1
if ( -1 == str.find("Storage:~ #")):
return -1
else:
self.__prv_linuxoschannel = self.__prv_clichannel
self.__prv_clichannel =''
return (0,self.__prv_linuxoschannel)
def form_linux_to_diagnose(self):
if('' != self.__prv_linuxoschannel):
self.__prv_linuxoschannel.sendall('diagnose\r')
if (True == self.__chkrecvstats(self.__prv_linuxoschannel)):
str = self.__prv_linuxoschannel.recv(self.__prv_rbuffernum)
print str
else:
return (-1,'')
if ( -1 == str.find("admin:/diagnose>")):
return (-1,'')
else:
self.__prv_diagnosechannel = self.__prv_linuxoschannel
self.__prv_linuxoschannel =''
return (0,self.__prv_diagnosechannel)
def form_diagnose_to_linux(self):
if (''!=self.__prv_diagnosechannel):
self.__prv_diagnosechannel.sendall('exit\r')
if (True == self.__chkrecvstats(self.__prv_diagnosechannel)):
str = self.__prv_diagnosechannel.recv(self.__prv_rbuffernum)
print str
else:
return -1
if ( -1 == str.find("Storage:~ #")):
return -1
else:
self.__prv_linuxoschannel = self.__prv_diagnosechannel
self.__prv_diagnosechannel = ''
return (0,self.__prv_linuxoschannel)
def form_linux_to_cli(self):
if (''!= self.__prv_linuxoschannel):
self.__prv_linuxoschannel.sendall('/ISM/cli/start.sh\r')
if (True == self.__chkrecvstats(self.__prv_linuxoschannel)):
str = self.__prv_linuxoschannel.recv(self.__prv_rbuffernum)
print str
else:
return -1
if ( -1 == str.find("admin:/>")):
return -1
else:
self.__prv_clichannel = self.__prv_linuxoschannel
self.__prv_linuxoschannel = ''
return (0,self.__prv_clichannel)
def check_channel_status(self,chan):
if (''!= chan):
chan.sendall('\r\n')
if (True == self.__chkrecvstats(chan)):
str = self.__prv_linuxoschannel.recv(self.__prv_rbuffernum)
print str
else:
return -1
if(-1!=str.find("admin:/>")):
return (0,'cli')
elif(-1!=str.find("Storage:~ #")):
return (0,'os')
elif(-1!=str.find("admin:/diagnose>")):
return (0,'diagnose')
else:
return -1
def __del__( self ):
if(''!=self.__prv_clichannel):
self.shutdown_cli_channel()
elif(''!=self.__prv_linuxoschannel):
self.shutdown_disgnose_channel()
elif(''!=self.__prv_diagnosechannel):
self.shutdown_disgnose_channel()
##########################
"""
鍏ㄥ眬鍙橀噺
"""
OMMTSTSSH = Ommssh()
##########################
if __name__ == "__main__":
print OMMTSTSSH.openlinuxcli()
OMMTSTSSH.form_linux_to_cli()
#OMMTSTSSH.form_cli_to_linux()
#OMMTSTSSH.form_linux_to_diagnose()
#result, ssstr =OMMTSTSSH.ssh_diagnose_docmd('help')
#result, ssstr =OMMTSTSSH.ssh_linux_docmd('ll')
result, ssstr =OMMTSTSSH.ssh_cli_docmd('show lun')
print ssstr
for i in ssstr:
m=i.find("LUN_12G_67")
print m
#for i in ssstr:
#if (0 != i.find('admin')):
#print "------------" +i
#OMMTSTSSH.shutdown_disgnose_channel()