重構(gòu)看的七七八八了,感覺應(yīng)該練練手,自己打包一個SecureCRT的環(huán)境類。不過暫時沒讓我想到如何將這個類放在文件中,然后每次寫腳本的時候import進來就好了,等有空再想想怎么解決。
所以現(xiàn)在還是只能復(fù)制粘貼后用。
其實再寫個設(shè)備類,然后從設(shè)備類中調(diào)用crt環(huán)境類,就可以達到設(shè)備相關(guān)的東西和環(huán)境分開的效果。以后如果沒有crt了,只要把crt環(huán)境類換掉就行了。
沒有打包log功能,這個類是我用來直接在內(nèi)存中處理回顯字符串用的,所以不需要log。
# $language = "python"
# $interface = "1.0"
class CrtEnv():
@staticmethod
def promptBox(szMessage, szTitle):
return crt.Dialog.Prompt(szMessage, szTitle, "", True)
@staticmethod
def inputBox(szMessage, szTitle):
return crt.Dialog.Prompt(szMessage, szTitle, "", False)
@staticmethod
def messageBox(szMessage, szTitle):
crt.Dialog.MessageBox(szMessage, szTitle)
def __init__(self):
self.__oTab = None
self.__szPrompt = ""
self.__szHostname = ""
def login(self, szHostname, szUsername, szPassword):
self.__szHostname = szHostname
if self.__ssh(szUsername,szPassword):
return True
if self.__telnet(szUsername,szPassword):
return True
return False
def logout(self):
self.__oTab.Session.Disconnect()
def send(self, szCMD):
self.__checkEnv()
self.__send(szCMD)
self.__oTab.Screen.WaitForString(szCMD)
return str(self.__getResult())
def changePrompt(self, szCMD):
self.__send(szCMD)
self.__oTab.Screen.WaitForString(szCMD)
self.__oTab.Screen.WaitForString("Some String will not echo.", 1)
self.__updatePrompt()
def getTabName(self):
if self.__isTabEmpty():
self.__getCurrentTab()
return str(self.__oTab.Caption)
def __ssh(self, szUsername, szPassword):
szConnectString = "/SSH2 /L "%s" /PASSWORD "%s" %s" %
(szUsername, szPassword, self.__szHostname)
if self.__connect(szConnectString) == False:
return False
self.__oTab.Screen.Synchronous = True
self.__waitDeviceTabInit()
return True
def __telnet(self, szUsername, szPassword):
szConnectString = "/Telnet %s" % (self.__szHostname)
if self.__connect(szConnectString) == False:
return False
self.__oTab.Screen.Synchronous = True
self.__oTab.Screen.WaitForString("ame")
crt.Sleep(200)
self.__send(szUsername)
self.__oTab.Screen.WaitForString("assword")
crt.Sleep(200)
self.__send(szPassword)
self.__waitDeviceTabInit()
return True
def __connect(self, szConnectString):
try:
self.__oTab = crt.Session.ConnectInTab(szConnectString)
return True
except:
return False
def __waitDeviceTabInit(self, szString = "#"):
crt.Sleep(300)
self.__oTab.Screen.WaitForString(szString)
def __send(self, szCMD):
szCMD = szCMD + 'r'
self.__oTab.Screen.Send(szCMD)
def __checkEnv(self):
if self.__isTabEmpty():
self.__getCurrentTab()
self.__oTab.Screen.Synchronous = True
if self.__isPromptEmpty():
self.__updatePrompt()
def __isPromptEmpty(self):
if self.__szPrompt == "":
return True
return False
def __isTabEmpty(self):
if self.__oTab == None:
return True
return False
def __getCurrentTab(self):
self.__oTab = crt.GetActiveTab()
def __getResult(self):
return self.__oTab.Screen.ReadString(self.__szPrompt)
def __updatePrompt(self):
crt.Sleep(300)
rowIndex = self.__oTab.Screen.CurrentRow
colIndex = self.__oTab.Screen.CurrentColumn – 1
self.__szPrompt = self.__oTab.Screen.Get(rowIndex, 0, rowIndex, colIndex)
self.__szPrompt = str(self.__szPrompt.strip())
def main():
# 測試用。獲取當(dāng)前tab標簽,并直接向設(shè)備發(fā)送命令
test1 = CrtEnv()
test1.send("terminal length 0")
CrtEnv.messageBox(test1.send("sh int status"),"run")
CrtEnv.messageBox(test1.getTabName(), "getTabName")
test1.changePrompt("conf t")
CrtEnv.messageBox(test1.send("do sh ip int br"),"run")
test1.changePrompt("end")
CrtEnv.messageBox(test1.send("sh int status"),"run")
# 新登錄一臺設(shè)備
test2 = CrtEnv()
test2.login("192.168.1.1","qw er","wqerqwer")
test1.logout()
test2.logout()
main()