Вы используете в своей работе SecureCRT? Вам много раз в день приходится заходить на различное оборудование в одном или нескольких пространствах ip адресов, отличающихся лишь одним-двумя конечными октетами и выполнять на них типовые задачи? Логин-пароль для входа на оборудование в вашей сети представлен одной-двумя комбинациями? Вы много думали над тем, как сделать так, чтобы все это делалось само, но боялись спросить? Или просто хотите вкратце узнать что в принципе можно сделать скриптом на SecureCRT? И так, SecureCRT + VBScript или «творчество в рутине». Добро пожаловать под кат.
Я являюсь джуниором в провайдинговой компании, в мои обязанности входит helpdesc второй линии и много рутинных задач вроде прокидывания Vlan от порта до порта через всю сеть, либо подачи других услуг на конечный порт абонента, настройка различных железок уровня агрегации и дистрибьюции для выставления на сеть. Но какими бы ни были рутинными задачи по организации новых каналов или настройки железок — самая неудобная и отвлекающая рутина, это контакты с хэлпдеском, которые всегда сводятся к просмотру состояния порта, присутствия на нем мака, и нужных Vlan, кол-ва ошибок и истории UP/Down из логов оборудования в редких случаях.
Чем больше времени проходило с момента моего трудоустройства, тем быстрее решались мной рутинные задачи и тем больше они мне надоедали. И в определнный момент я решил попробовать упростить себе жизнь и скинуть рутину алгоритмам. В результате, где-то за пол года неспешной работы у меня получилось несколько скриптов, которыми я и хотел бы с вами поделиться. Кроме того, я поискал по хабру и Stack Overflow и пришел к выводу что нигде подобная тема еще не поднималась. С учетом того, сколько профита ежедневно мне приносят мои наработки (экономия времени от минуты до 15-ти за заявку от хэлпдеска) это мне показалось очень странным.
В этом посте речь пойдет о самом последнем моем творении т.к. он написан максимально грамотно и с прицелом на легкое допиливание, его легко понять и изменить под свои нужды. Дело в том, что я, не являясь программистом, писал все исключительно по принципу «лишь бы работало» и только со временем по мере написания я научился (или еще только начинаю «научаться») писать программы хотя бы чуть-чуть правильно.
Этот скрипт требует ввести часть IP адреса оборудования (например в моей сети все устройства имеют адрес 10.150.XX.XXX или 172.100.100.ХХХ) и порт.
В конце он выводит сообщение со всем, что узнал.
Так как моим творением пользуются еще и коллеги, а я часто его дописываю или улучшаю, то я еще написал небольшой модуль обновления, который должен лежать в доступном сетевом расположении рядом с новой версией этого скрипта. Путь до модуля обновления прописывается в самой шапке скрипта в переменной UpdateEngine. Этот же путь является путем к новой версии.
Обновление происходит, если в поле IP адреса ввести команду Update. Если ввести Upload то произойдет отгрузка новой версии с локального компьютера на сервер.
В процессе написания я столкнулся с несколькими неочевидными трудностями, так что если у вас будут какие-либо вопросы — задавайте.
Далее собственно код обоих скриптов. Пожалуйста используйте, изменяйте под свои нужды. Возможно для кого-то мой опыт послужит начальным импульсом к автоматизации собственной рутины. Кто-то увидит примеры использования VBScript в SecureCRT, кто-то поднимет ЧСВ, заметив сырость в коде. В любом случае, я уверен, что тема будет полезна многим.
Редактирование скрипта советую производить в Notepad++ т.к. в нем использованно такое форматирование, которое позволяет Notepad++ сворачивать отдельные модули (скрывать строки) так, чтобы облегчить навигацию по коду. Не нужные на данный момент модули можно свернуть до двух строк — начало и конец.
Я не претендую на звание программиста года, так что за сырости и медвежьи ходы (неизящные решения) прошу не пинать, но буду рад подсказкам на будущее.
Код актуален для SecureCRT ver 7.0.1
Почти 300 строк первого скрипта:
И скрипт обновления
У меня есть еще один очень полезный скриптик для оборудования GPON MA5680T. Кто сталкивался, тот знает насколько сложно добавлять услуги или разбираться в текущей конфигурации оконечного терминала, т.н. «понки». Я написал скриптик который позволяет добавлять услуги, выводить список улуг или разбирать понку из конфигурации GPONa. Итоговая табличка, формируемая скриптом выглядит так
Кто я и что я делаю
Я являюсь джуниором в провайдинговой компании, в мои обязанности входит helpdesc второй линии и много рутинных задач вроде прокидывания Vlan от порта до порта через всю сеть, либо подачи других услуг на конечный порт абонента, настройка различных железок уровня агрегации и дистрибьюции для выставления на сеть. Но какими бы ни были рутинными задачи по организации новых каналов или настройки железок — самая неудобная и отвлекающая рутина, это контакты с хэлпдеском, которые всегда сводятся к просмотру состояния порта, присутствия на нем мака, и нужных Vlan, кол-ва ошибок и истории UP/Down из логов оборудования в редких случаях.
Как все начиналось
Чем больше времени проходило с момента моего трудоустройства, тем быстрее решались мной рутинные задачи и тем больше они мне надоедали. И в определнный момент я решил попробовать упростить себе жизнь и скинуть рутину алгоритмам. В результате, где-то за пол года неспешной работы у меня получилось несколько скриптов, которыми я и хотел бы с вами поделиться. Кроме того, я поискал по хабру и Stack Overflow и пришел к выводу что нигде подобная тема еще не поднималась. С учетом того, сколько профита ежедневно мне приносят мои наработки (экономия времени от минуты до 15-ти за заявку от хэлпдеска) это мне показалось очень странным.
Чем я хочу поделиться
В этом посте речь пойдет о самом последнем моем творении т.к. он написан максимально грамотно и с прицелом на легкое допиливание, его легко понять и изменить под свои нужды. Дело в том, что я, не являясь программистом, писал все исключительно по принципу «лишь бы работало» и только со временем по мере написания я научился (или еще только начинаю «научаться») писать программы хотя бы чуть-чуть правильно.
Описание работы:
Этот скрипт требует ввести часть IP адреса оборудования (например в моей сети все устройства имеют адрес 10.150.XX.XXX или 172.100.100.ХХХ) и порт.
- Открывает новую вкладку в SecureCrt или использует текущую, если перед IP адресом поставить минус "-". Если поставить "+" то нужно ввести только последний октет IP адреса, откроется новая вкладка, которая будет ожидать авторизации вручную.
- В скрипте прописаны два авторизационных сочетания Login1 Pass1 и Login2 Pass2. Используя их он авторизуется на оборудовании по принципу если не получилось первое — попробую второе.
- После авторизации он считывает имя устройства добавляет в его начало введенный пользователем IP адрес и меняет заголовок вкладки на получившийся Description.
Таким образом отпадает потребность вспоминать что находится за десятком открытых вкладок, ведь там теперь не просто IP адрес, а еще и имя устройства.
- Если пользователь ввел номер порта — далее скрипт узнает на каком устройстве он находится
- какой у него UpTime (очень мило, что у всех производителей эта команда Show | display version)
- и затем отталкиваясь от вендора применяет известные ему команды для того, чтобы показать конфигурацию искомого порта
- его состояние
- мак адреса
- в случае наличия description — меняет имя вкладки на него.
В конце он выводит сообщение со всем, что узнал.
Список и типы оборудования, с которым работает скрипт: | ZTE | HP | QTECH | H3C | Quidway-EA | Quidway-EI |
Про обновления
Так как моим творением пользуются еще и коллеги, а я часто его дописываю или улучшаю, то я еще написал небольшой модуль обновления, который должен лежать в доступном сетевом расположении рядом с новой версией этого скрипта. Путь до модуля обновления прописывается в самой шапке скрипта в переменной UpdateEngine. Этот же путь является путем к новой версии.
Обновление происходит, если в поле IP адреса ввести команду Update. Если ввести Upload то произойдет отгрузка новой версии с локального компьютера на сервер.
Почти конец
В процессе написания я столкнулся с несколькими неочевидными трудностями, так что если у вас будут какие-либо вопросы — задавайте.
Далее собственно код обоих скриптов. Пожалуйста используйте, изменяйте под свои нужды. Возможно для кого-то мой опыт послужит начальным импульсом к автоматизации собственной рутины. Кто-то увидит примеры использования VBScript в SecureCRT, кто-то поднимет ЧСВ, заметив сырость в коде. В любом случае, я уверен, что тема будет полезна многим.
Редактирование скрипта советую производить в Notepad++ т.к. в нем использованно такое форматирование, которое позволяет Notepad++ сворачивать отдельные модули (скрывать строки) так, чтобы облегчить навигацию по коду. Не нужные на данный момент модули можно свернуть до двух строк — начало и конец.
Я не претендую на звание программиста года, так что за сырости и медвежьи ходы (неизящные решения) прошу не пинать, но буду рад подсказкам на будущее.
Код актуален для SecureCRT ver 7.0.1
Почти 300 строк первого скрипта:
Script
#$language = "VBScript"
#$interface = "1.0"
crt.Screen.Synchronous = True
crt.screen.IgnoreEscape = True
scr_ver = "0,55"
Developer = False
UpdateEngine = "\\SERVER\Script\Script_Update.vbs"
' Change Log:
' v0.1 The very beggining. Here where it starts.
' v0.2 16.01.14 Исправлена авторизация Login2 на ZTE
' v0.3 16.01.14 Добавлена возможность работы без указания порта
' v0.4 20.01.14 Добавлена поддержка новой вкладки и ее Description
'---v0.5 22.01.14 Добавлена процедура обновления, часть IP в Caption вкладки.
' v0.51 24.01.14 Добавлена +IP - быстрый вход на область.
' v0.53 24.01.14 Добавлено ожидание авторизации на область.
' v0.54 24.01.14 Контрольный символ использования текущей вкладки заменен на "-"
' v0.55 24.01.14 Подправлены тайминги на авторизацию
Dim ip 'IP адрес коммутатора
'ip = "10.150.127.245" 'H3C S3100-8TP-EI пишет Description в инфо о порте когда он есть
'ip = "10.150.226.246" 'H3C S3100-26TP-EI 1/0/1
'ip = "10.150.210.26" 'Quidway S2016TP-EA
'ip = "10.150.119.69" '[Quidway S2309TP-EI] 0/0/1 ----------------------------------------------
'ip = "10.150.218.16" '[Quidway S2309TP-EI] 0/0/1
'ip = "10.150.226.33" 'ZTE ZXR10 2928E
'ip = "10.150.211.224" 'Qtech
Dim Login
Dim Passw
Dim SW_Name
Dim Port
'Port = "1"
Dim Port_State
Port_State = "UP"
Dim Port_Description
Dim Mac
Dim exit_ ' устанавливаем в "1" для завершения работы программы
Dim Equipment_ID ' Тип коммутатора | ZTE | QTECH | H3C | Quidway-EA | Quidway-EI |
Dim Uptime
Dim Oblast
Oblast = False
Dim var, var2, test
Dim objCurrentTab, Tab
Sub Update(file)
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(file, 1)
str = f.ReadAll
f.Close
ExecuteGlobal(str)
End Sub
Sub User() ' Задаем юзера - Login1 Login2
'if objCurrentTab.Dialog.MessageBox (var,"Login1", 32 Or 4 Or 0 ) = 6 then 'возвращает 6 если Login1, 7 если Login2
Login = "Login1"
Passw = "Pass1"
'else
' Login = "Login2"
' Passw = "Pass2"
'end if
End sub
Sub Connect() ' Коннектимся, решаем использовать ли текущую вкладку, открыть область или обновиться, узнаем порт
IP = crt.Dialog.Prompt("Введите IP коммутатора 10.150.", "sublime habr_script ver_" & scr_ver, "", False) ' Получаем IP коммутатора
if ip = "Update" then
call Update (UpdateEngine)
msgbox "Проверка версий и обновление завершено." , 0 , "sublime habr_script ver_" & scr_ver
exit sub
elseif ip = "Upload" then
Developer = True
call Update (UpdateEngine)
msgbox "Процедура отгрузки завершена, перезапустите скрипт", 0 , "sublime habr_script ver_" & scr_ver
exit sub
elseif ip = "" then
msgbox "IP коммутатора не введен" , 0 , "sublime habr_script ver_" & scr_ver
exit_ = 1
exit sub
end if
Port = crt.Dialog.Prompt("Введите порт абонента", "sublime habr_script ver_" & scr_ver, "", False) ' Получаем номер порта
If Left(IP, 1) = "-" and Left(IP, 1) <> "" then ' . Подключение в текущей вкладке
IP = Mid(IP, 2, Len(IP))
if crt.Session.Connected then crt.Session.Disconnect ' Если подключение установлено - отключиться
crt.session.Connect "/telnet " & chr(34) & "10.150." & ip & chr(34) & " 23" , , true ' подключаемся
Set objCurrentTab = crt.GetScriptTab
if not objCurrentTab.Session.Connected then
msgbox "Коммутатор не обнаружен"
exit_ = 1
exit sub
else
'msgbox "Коммутатор обнаружен"
end if
elseif Left(IP, 1) = "+" and Left(IP, 1) <> "" then ' + Подключение к области
Oblast = true
IP = Mid(IP, 2, Len(IP))
set Tab = crt.session.ConnectInTab ("/telnet " & chr(34) & "172.100.100." & ip & chr(34) & " 23" , , true ) ' подключаемся
tab.Screen.Synchronous = True ' О, великий!
tab.screen.IgnoreEscape = True ' О, великий!
'msgbox "before Set objCurrentTab = crt.GetTab(tab.Index)"
Set objCurrentTab = crt.GetTab(tab.Index)
if not objCurrentTab.Session.Connected then
msgbox "Коммутатор не обнаружен"
exit_ = 1
exit sub
else
'msgbox "Коммутатор обнаружен" & exit_
end if
else ' Обычное подключение в новой вкладке.
'msgbox "before set Tab = crt.session.ConnectInTab"
set Tab = crt.session.ConnectInTab ("/telnet " & chr(34) & "10.150." & ip & chr(34) & " 23" , , true ) ' подключаемся
tab.Screen.Synchronous = True ' О, великий!
tab.screen.IgnoreEscape = True ' О, великий!
'msgbox "before Set objCurrentTab = crt.GetTab(tab.Index)"
Set objCurrentTab = crt.GetTab(tab.Index)
if not objCurrentTab.Session.Connected then
msgbox "Коммутатор не обнаружен"
exit_ = 1
exit sub
else
'msgbox "Коммутатор обнаружен" & exit_
end if
end if
objCurrentTab.Screen.Synchronous = True
objCurrentTab.screen.IgnoreEscape = True
End Sub
Sub LogOn() ' Авторизуемся
objCurrentTab.Screen.WaitForStrings "Username:", "login", 10
if Oblast = False then
objCurrentTab.Screen.Send "Login1" + chr(13)
end if
objCurrentTab.Screen.WaitForString "assword:", 10
if Oblast = False then
objCurrentTab.Screen.Send "Pass1" + chr(13)
end if
var = CStr(objCurrentTab.screen.WaitForStrings(">", "#", "Username:", "login", 10))
'msgbox var
if var = 0 then
msgbox "Ошибка авторизации"
exit_ = 1
exit sub
elseif ((var = 3) or (var = 4)) and (Oblast = false) then
if objCurrentTab.Screen.WaitForString ("authentication success", 1) = false then ' проверка для zte
'msgbox "ZTE"
objCurrentTab.Screen.Send "Login2" + chr(13)
objCurrentTab.Screen.WaitForString "assword:"
objCurrentTab.Screen.Send "Pass2" + chr(13)
end if
elseif (var = 3 or var = 4) and Oblast = true then
objCurrentTab.Screen.WaitForString "assword:", 10
end if
objCurrentTab.Screen.Send chr(13)
if CStr(objCurrentTab.screen.WaitForStrings(">", "#", 2)) = 0 then
msgbox "Ошибка авторизации"
exit_ = 1
exit sub
end if
End sub
Sub Equipment() ' Знакомимся, спрашиваем как дела
objCurrentTab.Screen.Send " " & chr(13)
objCurrentTab.screen.WaitForString chr(10)
SW_Name = objCurrentTab.Screen.ReadString (">", "#", 1)
if SW_Name <> "" then ' Меняем имя вкладки на SW_Name
if left(SW_Name,1) = "<" then
SW_Name = Mid(SW_Name, 2, Len(SW_Name))
end if
objCurrentTab.Caption = IP & "_" & SW_Name
end if
if Oblast = true then ' Завершаем работу скрипта если находимся в области 172.100.100.
exit_ = 1
exit sub
end if
if port <> "" then
objCurrentTab.Screen.Send "display version" & chr(13)
' 1 2 3 4 5 6 0
var = CStr(objCurrentTab.screen.WaitForStrings("Quidway", "H3C", "HP", "QTECH", "Invalid", "ommand", 2))
if var = 0 then
msgbox "Ошибка определния типа оборудования. Выходим."
exit_ = 1
exit sub
elseif (var = 5 or var = 6) then
objCurrentTab.Screen.Send "show version" & chr(13)
' 1 2 3 4 0
var = CStr(objCurrentTab.screen.WaitForStrings("ZTE", "QTECH", "Invalid", "ommand", 1))
if (var = 0) or (var = 3) or (var = 4) then
msgbox "Ошибка определния типа оборудования. Выходим."
exit_ = 1
exit sub
elseif var = 1 then
Equipment_ID = "ZTE"
elseif var = 2 then
Equipment_ID = "QTECH"
Port = "1/" & Port
end if
elseif (var = 2) or (var = 3) then
Equipment_ID = "H3C"
Port = "1/0/" & Port
elseif var = 1 then
objCurrentTab.screen.WaitForString " "
var = CStr(objCurrentTab.screen.WaitForStrings("-EA", "-EI", 2))
if var = 0 then
msgbox "Ошибка определния типа оборудования. Выходим."
exit_ = 1
exit sub
elseif (var = 1) then
Equipment_ID = "Quidway-EA"
Port = "1/0/" & Port
elseif (var = 2) then
Equipment_ID = "Quidway-EI"
Port = "0/0/" & Port
end if
end if
objCurrentTab.screen.WaitForString "ptime"
Uptime = objCurrentTab.Screen.ReadString(chr(13) , 1)
objCurrentTab.screen.WaitForStrings ">", "#", 1
end if
End sub
Sub Port_Information() ' Информация о порте - State, Description
if Equipment_ID = "ZTE" then ' ZTE
objCurrentTab.Screen.Send chr(13)
objCurrentTab.screen.WaitForString ">"
objCurrentTab.Screen.Send "show port " & Port & " brief" & chr(13)
var = CStr(objCurrentTab.screen.WaitForStrings("up", "down", 2))
if var = 0 then
msgbox "Ошибка определния статуса порта. Выходим."
exit_ = 1
exit sub
elseif (var = 1) then
Port_State = "UP"
elseif (var = 2) then
Port_State = "DOWN"
end if
Port_Description = Trim(objCurrentTab.Screen.ReadString(chr(13) , 2))
end if '/ZTE
'--------------------------------------------------------------------
if Equipment_ID = "H3C" or Equipment_ID = "Quidway-EA" or Equipment_ID = "Quidway-EI" then ' H3C or Quidway-EA or Quidway-EI
objCurrentTab.Screen.Send chr(13)
objCurrentTab.screen.WaitForString ">"
objCurrentTab.Screen.Send "display interface Ethernet " & Port & chr(13)
var = CStr(objCurrentTab.screen.WaitForStrings("UP", "DOWN", 2))
if var = 0 then
msgbox "Ошибка определния статуса порта. Выходим."
exit_ = 1
exit sub
elseif (var = 1) then
Port_State = "UP"
elseif (var = 2) then
Port_State = "DOWN"
end if
objCurrentTab.Screen.Send " " & chr(13)
objCurrentTab.screen.WaitForString ">", 1
objCurrentTab.Screen.Send " " & chr(13)
objCurrentTab.screen.WaitForString ">", 1
objCurrentTab.Screen.Send "display current-configuration interface Ethernet " & Port & chr(13)
objCurrentTab.screen.WaitForString "description", 1
Port_Description = Trim(objCurrentTab.Screen.ReadString(chr(13) , 2))
end if '/H3C or Quidway-EA or Quidway-EI
'--------------------------------------------------------------------
if Equipment_ID = "QTECH" then ' QTECH
objCurrentTab.Screen.Send chr(13)
objCurrentTab.screen.WaitForString "#"
objCurrentTab.Screen.Send "show interface ethernet " & Port & chr(13)
var = CStr(objCurrentTab.screen.WaitForStrings("up", "down", 2))
if var = 0 then
msgbox "Ошибка определния статуса порта. Выходим."
exit_ = 1
exit sub
elseif (var = 1) then
Port_State = "UP"
elseif (var = 2) then
Port_State = "DOWN"
end if
objCurrentTab.Screen.Send " " & chr(13)
objCurrentTab.screen.WaitForString "#"
objCurrentTab.Screen.Send "show running-config interface ethernet " &Port & chr(13)
objCurrentTab.screen.WaitForString "description", 1
Port_Description = Trim(objCurrentTab.Screen.ReadString(chr(13) , 2))
end if '/QTECH
if Port_Description <> "" then ' Меняем имя вкладки на Port_Description
objCurrentTab.Caption = IP & "_" & Port_Description
end if
End sub
Sub MacInformation() ' Мак адреса
if Equipment_ID = "ZTE" then ' ZTE
objCurrentTab.Screen.Send chr(13)
objCurrentTab.screen.WaitForString ">"
objCurrentTab.Screen.Send "show mac dynamic port " & Port & chr(13)
objCurrentTab.screen.WaitForString "---" & chr(13) , 3 ' тест на выявление ошибки
While var2 <> "stop"
var = CStr(objCurrentTab.screen.WaitForStrings ("No MAC", chr(10), "Press", ">", 1))
'msgbox var
if var = 1 then
Mac = "No Mac"
elseif var = 2 then
Mac = Mac & chr(13) & objCurrentTab.Screen.ReadString(" ", 1)
Elseif var = 3 then
objCurrentTab.Screen.Send " "
for i = 1 to 98
objCurrentTab.screen.WaitForString chr(8), 1
next
Mac = Mac & chr(13) & objCurrentTab.Screen.ReadString(" ", 1)
Elseif var = 4 then
var2 = "stop"
Elseif var = 0 then
var2 = "stop"
end if
objCurrentTab.screen.WaitForStrings chr(13), " ", 1
'var2 = objCurrentTab.Screen.ReadString(".", 1)
' var = ""
' for i = 1 to len(var2)
' test = Mid(var2, i, 1)
' 'msgbox test
' var = var & "|" & Asc(test)
' next
' msgbox "_..." & var & "..._" & "i= " & i & chr(13) & var2
wend
end if '/ZTE
if Equipment_ID = "H3C" or Equipment_ID = "Quidway-EA" then ' H3C or Quidway-EA
objCurrentTab.Screen.Send chr(13)
objCurrentTab.screen.WaitForString ">"
objCurrentTab.Screen.Send "displ mac-address interface Ethernet " & port & chr(13)
objCurrentTab.screen.WaitForString "TIME(s)", 1
While var2 <> "stop"
var = CStr(objCurrentTab.screen.WaitForStrings ("No MAC", chr(10), "found", 1))
if var = 1 then
Mac = "No Mac"
elseif var = 2 then
Mac = Mac & chr(13) & objCurrentTab.Screen.ReadString(" ", 1)
elseif var = 3 then
var2 = "stop"
Elseif var = 0 then
Mac = Mac & chr(13) & "more..."
var2 = "stop"
end if
wend
end if '/H3C or Quidway-EA
if Equipment_ID = "Quidway-EI" then ' Quidway-EI
objCurrentTab.Screen.Send chr(13)
objCurrentTab.screen.WaitForString ">"
objCurrentTab.Screen.Send "display mac-address dynamic Ethernet " & port & chr(13)
objCurrentTab.screen.WaitForStrings "Lsp", "MAC-Tunnel", 5
objCurrentTab.screen.WaitForString "------------------------------------------------------" & chr(13), 3
While var2 <> "stop"
var = CStr(objCurrentTab.screen.WaitForStrings ("displayed = 0", chr(10), "Total", 1))
if var = 1 then
Mac = "No Mac"
var2 = "stop"
elseif var = 2 then
var = objCurrentTab.Screen.ReadString(" ", 1)
'msgbox "_" & var & "_"
if (var = chr(13) & chr(10) & "Total") or (var = chr(13) & chr(10) & "-------------------------------------------------------------------------------" & chr(13) & chr(10) & "Total") then
var2 = "stop"
else
Mac = Mac & var & chr(13)
end if
objCurrentTab.screen.WaitForString chr(13), 1
elseif var = 3 then
var2 = "stop"
Elseif var = 0 then
Mac = Mac & chr(13) & "more..."
var2 = "stop"
end if
wend
end if '/Quidway-EI
if Equipment_ID = "QTECH" then ' QTECH
objCurrentTab.Screen.Send chr(13)
objCurrentTab.Screen.Send "show mac-address-table interface ethernet " & port & chr(13)
objCurrentTab.screen.WaitForString "Read mac address table...."
var = CStr(objCurrentTab.screen.WaitForStrings ("No mac", "---" & chr(13), 1))
if var = 1 then
var2 = "stop"
Mac = "No Mac"
end if
While var2 <> "stop"
var = CStr(objCurrentTab.screen.WaitForStrings ( " ", SW_name, 1))
if var = 1 then
Mac = Mac & chr(13) & Trim(objCurrentTab.Screen.ReadString(" ", 1))
objCurrentTab.screen.WaitForString chr(13)
elseif var = 2 then
var2 = "stop"
Elseif var = 0 then
Mac = Mac & chr(13) & "more..."
var2 = "stop"
end if
wend
end if
End sub
if exit_ <> 1 then Call User
if exit_ <> 1 then Call Connect
if exit_ <> 1 then Call LogOn
if exit_ <> 1 then Call Equipment
if exit_ <> 1 and Port <> "" then Call Port_Information
if exit_ <> 1 and Port <> "" and Port_State = "UP" then Call MacInformation 'and Port_State = "UP"
var = "Тип коммутатора " & Equipment_ID & chr(13) & "Uptime " & Uptime & chr(13)
var = var & "Имя " & " = " & SW_Name & chr(13)
var = var & "Сосотояние порта " & Port & " = " & Port_State & chr(13)
var = var & "Имя порта " & Port & " = " & Port_Description & chr(13)
var = var & "Мак адрес: " & chr(13) & Mac & chr(13)
var = var & "Скрипт успешно завершен"
if Port <> "" then
msgbox var
end if
И скрипт обновления
UpdateEngine
'#$language = "VBScript"
'#$interface = "1.0"
crt.Screen.Synchronous = True
crt.screen.IgnoreEscape = True
scr_vers = "0,1"
' Change Log:
' v0.1 21.01.14 The very beggining. Here where it starts.
Dim cur_scr_path, cur_scr_Name, cur_scr_ver, cur_scr_file
Dim ser_scr_path, ser_scr_Name, ser_scr_ver, ser_scr_file
Sub CurrentScript() 'Путь до текущего скрипта, его имя и версия
cur_scr_path = crt.ScriptFullName
For i = 1 to 10
if InStr(cur_scr_path,"\") = 0 then
Exit for
end if
cur_scr_path = Right(cur_scr_path, Len(cur_scr_path) - InStr(cur_scr_path,"\"))
next
cur_scr_Name = cur_scr_path
'msgbox cur_scr_Name
cur_scr_path = crt.ScriptFullName
Set cur_scr_file = CreateObject("Scripting.FileSystemObject").OpenTextFile(cur_scr_path,1) ' 1 - for reading
do while not cur_scr_file.AtEndOfStream
cur_scr_ver = cur_scr_file.ReadLine
cur_scr_ver = trim(cur_scr_ver)
if left(cur_scr_ver, 10) = "scr_ver = " then
cur_scr_ver = Mid (cur_scr_ver, 12, Len(cur_scr_ver) - 12)'Mid(cur_scr_ver, 11,InStr(cur_scr_ver," "))
'msgbox cur_scr_ver = " & cur_scr_ver
Exit do
end if
loop
cur_scr_file.Close
end sub
Sub ServerScript() 'Путь до серверного скрипта, версия
ser_scr_path = "\\SERVER\Script" & "\" &cur_scr_Name
'msgbox ser_scr_path
Set ser_scr_file = CreateObject("Scripting.FileSystemObject").OpenTextFile(ser_scr_path,1) ' 1 - for reading
do while not ser_scr_file.AtEndOfStream
ser_scr_ver = ser_scr_file.ReadLine
ser_scr_ver = trim(ser_scr_ver)
'msgbox ser_scr_ver
if left(ser_scr_ver, 10) = "scr_ver = " then
ser_scr_ver = Mid (ser_scr_ver, 12, Len(ser_scr_ver) - 12)
'msgbox "ser_scr_ver = " & ser_scr_ver
Exit do
end if
loop
ser_scr_file.Close
End sub
Sub Comparisson() ' Сравниваем версии, свой статус и загружаем обновление.
Const OverwriteExisting = True
'msgbox "_" & cur_scr_ver & "_" & ser_scr_ver& "_"
'MsgBox (TypeName(cur_scr_ver)) & "_" & (TypeName(ser_scr_ver))
If Developer = true then
If CDbl(cur_scr_ver) < CDbl(ser_scr_ver) then ' Если версия на сервере новее
msgbox "Версия на сервере новее. WTF?!",0 , "God mode ON."
elseif CDbl(cur_scr_ver) = CDbl(ser_scr_ver) then ' Если версия на сервере одинакова
msgbox "Version equals, nothing to do" ,0 , "God mode ON."
elseif CDbl(cur_scr_ver) > CDbl(ser_scr_ver) then ' Если версия на сервере ниже версии на компе. Скрипт создателя
msgbox "Version difference, Uploading new version to the server. Press ok to begin" ,0 , "God mode ON."
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile cur_scr_path , ser_scr_path, OverwriteExisting
end if
elseif Developer = false then
If CDbl(cur_scr_ver) < CDbl(ser_scr_ver) then ' Если версия на сервере новее. Скрипт Юзера.
msgbox "Обнаружена новая версия. Загружаю обновление." , 0 , "UpdateEngine"
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile ser_scr_path, cur_scr_path, OverwriteExisting
elseif CDbl(cur_scr_ver) = CDbl(ser_scr_ver) then ' Если версия на сервере одинакова
msgbox "Версии равны.", 0 , "UpdateEngine"
elseif CDbl(cur_scr_ver) > CDbl(ser_scr_ver) then ' Если версия на сервере ниже версии на компе.
msgbox "Версия на сервере старее.", 0 , "UpdateEngine"
end if
end if
Developer = false
exit_ = 1
End sub
Call CurrentScript()
Call ServerScript()
Call Comparisson()
Напоследок
У меня есть еще один очень полезный скриптик для оборудования GPON MA5680T. Кто сталкивался, тот знает насколько сложно добавлять услуги или разбираться в текущей конфигурации оконечного терминала, т.н. «понки». Я написал скриптик который позволяет добавлять услуги, выводить список улуг или разбирать понку из конфигурации GPONa. Итоговая табличка, формируемая скриптом выглядит так
GPON
Объект: (6-0/1/1-2) ONT_name
Состояние: UP
Тип: 92
Cерийник: 32303131B881F241 (2011-B881F241)
__________________________
Service Port summury:
=========================================================
|S*P | |Vlan| |Gem | |U-V | |RTx | || Vlan desc
---------------------------------------------------------
|5 | | 600| |130 | |2 | |5 | || Chanel1_name
|38 | |1203| |136 | |3 | |7 | ||
|180 | |3563| |213 | |6 | |2 | || Chanel2_name
|143 | |3786| |304 | |4 | |2 | || Chanel3_name
|573 | | 598| |390 | |7 | |7 | ||
=========================================================
Порты (O = UP; X = Down):
----------------------
[O] - Port 1 : 1,[2],
[O] - Port 2 : 1,[3],
[O] - Port 3 : 1,[4],
[O] - Port 4 : 1,[6],
[X] - Port 5 : 1,[7],
----------------------
----------------------
Tcont_id 0.......1
Tcont_id 1.......12
Tcont_id 2.......5
Tcont_id 3.......57
Tcont Всего: 4
----------------------