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

от автора

Вы используете в своей работе SecureSRT? Вам много раз в день приходится заходить на различное оборудование в одном или нескольких пространствах ip адресов, отличающихся лишь одним-двумя конечными октетами и выполнять на них типовые задачи? Логин-пароль для входа на оборудование в вашей сети представлен одной-двумя комбинациями? Вы много думали над тем, как сделать так, чтобы все это делалось само, но боялись спросить? Или просто хотите вкратце узнать что в принципе можно сделать скриптом на SecureSRT? И так, 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 = "\\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 ----------------------  

ссылка на оригинал статьи http://habrahabr.ru/post/210822/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *