1

Тема: JS: Как пинговал лет десять назад, будучи сисадмином, некоторые приёмы

Я тогда пинговал несколько хостов, чтобы отслеживать проблемы со связью. Написал скриптик:


var SleepTime=30;
var S=WScript.CreateObject("WScript.Shell"),fso=new ActiveXObject("Scripting.FileSystemObject"),Args=WScript.Arguments,Adr,IP,wmi,i,e,s,PrevS=0,msg;
if(Args.Length!=1)WScript.Quit(-1);Adr=Args.item(0);
if(fso.GetFileName(WScript.FullName).toLowerCase()=="wscript.exe")S.Run("cmd /k cscript "+WScript.ScriptName+" "+Adr,1)
else{	S=null;fso=null;wmi=GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");
	while(true){e=new Enumerator(wmi.ExecQuery("Select StatusCode,ResponseTime"+(IP?"":",ProtocolAddress")+
		" from Win32_PingStatus where Address = '"+(IP?IP:Adr)+"'"));
		for(;!e.atEnd();e.moveNext())if((s=(i=e.item()).StatusCode)==0||s!=PrevS){PrevS=s;switch(s){
			case  null:msg="для '"+Adr+"' невозможно получить ip адрес.";break;
			case     0:if(!IP)IP=i.ProtocolAddress;msg=(IP?IP:Adr)+" ="+i.ResponseTime+" мс.";break;
			case 11002:msg="Заданная сеть недоступна.";IP=0;break;
			case 11003:msg="Хост недоступен.";IP=0;break;
			case 11010:msg="Превышен интервал ожидания.";IP=0;break;
			default:IP=0;msg="Ошибка "+s;
			}WScript.echo(new Date().toLocaleTimeString()+": "+msg)
		}
		for(i=SleepTime;i;i--)with(WScript)with(StdOut){Write(s=new Date().toLocaleTimeString()+": "+i);Sleep(1000);Write("\b\b  \r")}
	}
}

Он пингует раз в 30 секунд примерно, показывает сколько секунд осталось до следующего пинга, фиксирует время, когда пинги выполнялись и результат показывает в отдельном окне. Причём, если результат не изменился, не дублирует на экране. Вот на днях немного доработал: свой роутер с ddns для подключения по OpenVPN с применением сертификата на белый динамический IP. Так вот, пингует по DNS адресу хоста первый раз. Из протокола ICMP достаёт IP и дальше пингует по нему. До первого сбоя. Потом снова пытается получить IP по DNS в рамках ICMP только. У меня роутер для безопасности и стабильности раз в сутки перезагружается. Посмотрел - всё работает как надо. Конечно, js (WSH) подзабыл порядком, но правки "по памяти" внёс, вроде, верные Сначала у себя на Дзене опубликовал.