Лучше день потерять, а потом телепортироваться куда хочешь и сколько хочешь

в 8:13, , рубрики: Без рубрики

Вы используете в своей работе SecureCRT? Вам много раз в день приходится заходить на различное оборудование в одном или нескольких пространствах ip адресов, отличающихся лишь одним-двумя конечными октетами и выполнять на них типовые задачи? Логин-пароль для входа на оборудование в вашей сети представлен одной-двумя комбинациями? Вы много думали над тем, как сделать так, чтобы все это делалось само, но боялись спросить? Или просто хотите вкратце узнать что в принципе можно сделать скриптом на SecureCRT? И так, SecureCRT + VBScript или «творчество в рутине». Добро пожаловать под кат.

Кто я и что я делаю

Я являюсь джуниором в провайдинговой компании, в мои обязанности входит 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 = "\SERVERScriptScript_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 = "\SERVERScript" & "" &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
----------------------

Автор: sublime

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js