Войти

Показать полную графическую версию : [решено] Помогите наваять скрипт? Поиск строки в файле.


Страниц : [1] 2

glukin
04-03-2017, 12:37
Есть файл dns.txt вида

c1601.f1_r1_1.m IN A 10.30.4.61
c1601.f1_r1_1_s1.m IN A 10.30.4.61
c1601.kf1_r1_1_s0.m IN A 10.30.4.78
c2811.f1-r1_1.m IN A 10.30.40.1
c2811.f1-r1_1_vl2.m IN A 10.30.40.1
c2811.f1-r1_1_s0-0-0_1.m IN A 10.30.40.10
c7206.f2-r206_1_vl15.m IN A 10.30.40.101
zy782.hd_f2-r1_1_dsl.m IN A 10.30.40.102
zy791.h3_f1-r1_1.m IN A 10.30.40.105
zy791.h3_f1-r1_1_lan.m IN A 10.30.40.105

порядка 6000 строк.
Нужно в нем в цикле смотреть строку 10.30.0-255.0-255 и если ее нет, то добавлять в конец файла сформированную строку "ИмяУстройства IN A ИПАдрес", строку я знаю как формировать. Прошу помощи. И еще самый главный вопрос - когда я формирую это файл - он генерится около 12 часов (пинг по IP с таймаутом 1 сек, если есть пинг, то опрос по SNMP), так вот - не увеличит ли поиск такого каждого IP в этом файле время работы скрипта в геометрической прогрессии? Сумбурно написал...

Iska
04-03-2017, 14:43
Есть файл dns.txt вида »
Упакуйте его в архив и приложите к сообщению.

в цикле »
Это как?

смотреть строку 10.30.0-255.0-255 »
Не вижу в Вашем примере даже относительно похожей строки. Или Вы в «10.30.0-255.0-255» что-то хитро зашифровали, что б не догадались?

то добавлять в конец файла сформированную строку "ИмяУстройства IN A ИПАдрес", строку я знаю как формировать. »
То есть, реальное содержимое «ИмяУстройства IN A ИПАдрес» — лежит на Вас?

когда я формирую это файл - он генерится около 12 часов (пинг по IP с таймаутом 1 сек, если есть пинг, то опрос по SNMP), »
Вы не думали делать хотя бы пинг не последовательно?

так вот - не увеличит ли поиск такого каждого IP в этом файле время работы скрипта в геометрической прогрессии? »
Вы хотите, чтобы скрипт а) читал из файла и б) писал в файл в то время, когда Вы пишете в тот же самый файл из другого приложения? Коллизии могут быть (либо наверняка будут, зависит от того, как именно пишете).

Сумбурно написал... »
Ото ж.

megaloman
04-03-2017, 17:46
glukin, Сумбурно написал... таки да! Опрашивайте Вашу сеть, пишите результаты в новый файл, например, dns.txt.tmp, после завершения опроса запустите процесс анализа dns.txt на основе dns.txt.tmp, делая необходимые дополнения. А затем я бы еще отсортировал dns.tmp например по IP. Порядок освобождает мысль.
Или, еще лучше, прежде чем пинговать, поищите IP в dns.tmp, и, если он есть, не пингуйте - Вы уже это ранее сделали, зачем делать заново? А то , что пропингуете, запишите в dns.txt.tmp и по окончании, объедините инфу из обоих файлов.

glukin
04-03-2017, 18:51
Iska,
1. Файл вложил, пароль в личке. PS^ Вам не отправляется личка, пишет: Iska превысил(а) максимальный объем сохраненных персональных сообщений и не может получать новые сообщения, пока не удалит часть старых.
2. Напишу как умею - на С:
for(i=0;i<256;i++)
for(j=0;j<256;j++)
{Тело цикла;}
3. Строка - IP-адрес, формируемый из 10.30 + i + j.
4. Да.
5. Не последовательно - это как? Мне нужно, чтобы весь диапазон был опрошен.
6. Необязательно, можно те IP, которых нет, добавить в отдельный файл, потом этот файл соединить с исходным.

glukin
04-03-2017, 18:55
после завершения опроса запустите процесс анализа dns.txt на основе dns.txt.tmp »

Как??
Думаю, может, сделать по-другому?
Я 1 раз сформирую эталонный файл dns.txt, затем по расписанию пинговать всю сеть на предмет появления новых устройств, формировать новый файл dns.txt.tmp и сравнивать 2 файла. Разницу в файлах дописывать в конец эталона, вот так вроде правильно написал.

"А затем я бы еще отсортировал dns.tmp например по IP."
Они и так будут по IP, dns.tmp пишется в цикле же i=0-255;j=0-255.

А можно как-либо сравнить 2 файла, чтобы выделить неприсутствующие во втором файле строки в отдельный файл (с ними потом еще работать другому скрипту) и дописать их в первый файл?

glukin
04-03-2017, 19:20
Вероятно, задача нерешаема без административных методов. Не могу сообразить, что делать, если устройство выведено из эксплуатации и не пингуется, но в эталонном dns.txt оно есть. И еще - их периодически выключают, то есть они могут быть в эксплуатации, но не пинговаться. (((

megaloman
04-03-2017, 22:34
glukin, чтобы выделить не присутствующие во втором файле строки в отдельный файл надо сформировать IP-адрес, поискать его в dns.txt, если его нет - пингуем и пишем в файл dns.txt.tmp - я эту идею уже излагал.

Если устройство выведено из эксплуатации и не пингуется, удалить его из эталонного файла можно только ручками, так как имеются другие устройства в эксплуатации, но не пингуются, так как выключены.

Можно, конечно, перепинговать все имеющиеся в dns.txt устройства, имеющиеся непингуемые записать в отдельный файл, затем опять же глазками его проанализировать.
Наверное, стоит разделить эти задачи: поиск новых и анализ непингуемых.

Вероятно, задача нерешаема без административных методов - на каждый объект должен быть паспорт, нас по требованиям безопасности заставили это сделать. Там отображаются все изменения объекта, от ввода в эксплуатацию, изменения конфигурации и софта, до его утилизации.

А сортировать данные после объединения 2 файлов всё равно придётся, так как Вы собираетесь добавлять в конец файла новые сформированные строки, которые уже выпадают из предыдущего порядка следования.

А для меня пароль недоступен? Боитесь, что контрагайку откручу? :)

glukin
05-03-2017, 10:36
1. Это сделать я могу.
2. Так я и затеял все это, чтобы не делать ручками. Устройства выключают только на ночь и на выходные, так что можно успеть, но проблема в том, что скрипт работает очень долго (порядка 15 часов), можно и не успеть. А с учетом анализа dns.txt боюсь, что время увеличится в разы.
3. Да, пожалуй.
4. Это все есть, но неудобно, слишком все распределено территориально и слишком много админов.
5. А для чего вообще его сортировать?
6. Пароль выслал.

Iska
05-03-2017, 10:57
glukin, к сожалению, цели и задачи я не смог уяснить толком. Посему, могу лишь дать наводку на улучшение той части, которую понял.

Асинхронные запросы Wbem: VBScript: асинхронная обработка множественных запросов WMI — Windows Script Host, HTA (VBScript, JScript) — Коллекция скриптов и идей — Серый форум (http://forum.script-coding.com/viewtopic.php?id=3783).
Фоновые задания PowerShell, используемый класс .Net — System.Net.NetworkInformation.Ping: Многопоточный сканер сети | PowerShell и другие скрипты (https://webcache.googleusercontent.com/search?q=cache:UqRjIIYozvUJ:https://xaegr.wordpress.com/2011/07/12/threadping/+&cd=10&hl=ru&ct=clnk) (даю ссылку на кэш Google'а, поскольку сайт Василия, видимо, того… Увы :().

Вы, поскольку знаете C/C++, кроме изложенного выше, можете и вовсе банально использовать в своём приложении несколько потоков. Кроме того, Вы можете писать не в текстовый файл, а в базу данных — Jet или SQL (если есть), в последующем работать с базой данных будет многим проще (фильтрация, запросы и т.п.), нежели с банальным текстовым файлом. В частности, задача:
А можно как-либо сравнить 2 файла, чтобы выделить неприсутствующие во втором файле строки в отдельный файл (с ними потом еще работать другому скрипту) и дописать их в первый файл? »
для двух таблиц базы данных решается одним запросом ;).

glukin
05-03-2017, 11:16
Цель - актуализировать прямую и обратную зоны DNS для DNS-сервера устройств СПД, так, чтобы там не было выведенных из эксплуатации устройств, и , наоборот, не вводить вновь введенные в эксплуатацию устройства туда руками, как это делается сейчас.

"Асинхронные запросы Wbem"
О! Вот это полезная штука, спасибо большое! Потестю на предмет скорости, если будет быстрее хотя бы раза в 2, чем сейчас - решится проблема выключенных устройств, находящихся в эксплуатации.
PowerShell не подходит, так как сервер, где будет работать скрипт - Win2003, и переехать на другой нет возможности, так как только с него разрешен SNMP на устройства СПД.

Я понимаю, что с БД будет работать быстрее, и , возможно, проще, но БД я не умею от слова "вообще".

Iska
05-03-2017, 11:40
"Асинхронные запросы Wbem"
О! Вот это полезная штука, спасибо большое! Потестю на предмет скорости, если будет быстрее хотя бы раза в 2, чем сейчас »
Будет, коллега, будет. И куда быстрее, чем в два раза ;). Посмотрите тогда ещё и само обсуждение вот в этой теме: VBScript / WMI : Асинхронный мультипинг — Windows Script Host, HTA (VBScript, JScript) — Общение — Серый форум (http://forum.script-coding.com/viewtopic.php?id=3739) (именно из неё выросла тема в Коллекции). Там есть и временные оценки, и ещё кое-что, что может быть для Вас интересным.

PowerShell не подходит, так как сервер, где будет работать скрипт - Win2003, и переехать на другой нет возможности, »
PowerShell второй версии есть и для Windows Server 2003. BITS 4.0 будет, конечно, недоступен, но остальное — вполне:
Windows Management Framework (Windows PowerShell 2.0, WinRM 2.0, and BITS 4.0) (https://support.microsoft.com/en-us/help/968929/windows-management-framework-windows-powershell-2.0,-winrm-2.0,-and-bits-4.0)
Download Update for Windows Server 2003 (KB968930) from Official Microsoft Download Center (https://www.microsoft.com/en-us/download/details.aspx?id=4045)

Я понимаю, что с БД будет работать быстрее, и , возможно, проще, но БД я не умею от слова "вообще". »
Ну, ключевые слова — ADODB, Recordset, Connection. В принципе, там нет ничего сложного.

glukin
05-03-2017, 12:26
Спасибо! Пока попробую асинхронный опрос, по результату отпишусь.

glukin
05-03-2017, 12:44
del

glukin
06-03-2017, 15:37
Iska, Все отлично! Прирост в скорости примерно в 20 раз. То, что нужно!!
Проблема обнаружилась другая - почему-то не все устройства отдают свой SNMP sysName при абсолютно одинаковых настройках, но это вопрос, наверное, не сюда.
Буду допиливать дальше...

glukin
07-03-2017, 13:02
Поясните, пожалуйста, почему не работает конструкция вида:

'=============================================================================
' Процедура асинхронной обработки экземпляра объекта (замечание: в данном конкретном случае
' будет возвращаться единственный объект, однако, в большинстве случаев запросы
' возвращают множество объектов)
Sub Sink_OnObjectReady(objWbemObject, objWbemAsyncContext)
Dim strComputer

strComputer = objWbemAsyncContext.Item("HostName")

If Not IsNull(objWbemObject.StatusCode) Then
If objWbemObject.StatusCode = 0 Then

objWmiNamedValueSet.Add "AgentAddress", strComputer
objWmiNamedValueSet.Add "AgentReadCommunityName", "poll"
'on error resume next
Set colSystem = objWmiServices.InstancesOf("SNMP_RFC1213_MIB_system", , objWmiNamedValueSet)
WSCript.Echo IsNull(objSystem)
If Not IsNull(colSystem) Then
For Each objSystem In colSystem
If (Right(objSystem.sysName,12)="123") Then
objSystem.sysName=Left(objSystem.sysName,Len(objSystem.sysName)-12) + ".m"
Else
objSystem.sysName=objSystem.sysName + ".m"
End If
NFile1.WriteLine objSystem.sysName + " IN A " + strComputer
Next
Else
objWmiNamedValueSet.Add "AgentReadCommunityName", "public"
Set colSystem = objWmiServices.InstancesOf("SNMP_RFC1213_MIB_system", , objWmiNamedValueSet)
If Not IsNull(colSystem) Then
For Each objSystem In colSystem
If (Right(objSystem.sysName,12)="123") Then
objSystem.sysName=Left(objSystem.sysName,Len(objSystem.sysName)-12) + ".m"
Else
objSystem.sysName=objSystem.sysName + ".m"
End If
NFile1.WriteLine objSystem.sysName + " IN A " + strComputer
Next
Else

NoSNMP.WriteLine strComputer

End If
End If

End If
End If
End Sub

Выдаёт ошибку null на "For Each objSystem In colSystem"

Iska
07-03-2017, 13:09
glukin, используйте тэг code (http://forum.oszone.net/misc.php?do=bbcode) для оформления кода.

почему не работает конструкция вида: … Выдаёт ошибку null на "For Each objSystem In colSystem" »
Проверяйте так:
If Not colSystem Is Nothing Then

glukin
07-03-2017, 13:37
Iska, Без изменений.
ПС: на устройствах, которые отдают SNMP sysName все работает, не работает только на тех, которые SNMP не умеют.

Iska
07-03-2017, 14:12
Тогда детализируйте (ибо гадать не интересно) — на каком из двух:
For Each objSystem In colSystem»
происходит ошибка? Приведите точное сообщение об ошибке (можно просто нажать Ctrl-C в окне сообщения.

glukin
07-03-2017, 14:20
Iska, На первом.
---------------------------
Windows Script Host
---------------------------
Script: C:\Documents and Settings\Administrator\Desktop\ping.vbs
Line: 117
Char: 5
Error: 0x80041010
Code: 80041010
Source: (null)

---------------------------
OK
---------------------------
ПС: Я понимаю, что при скане ИП-адресов какой-то из ИП выдает NULL, то есть или не умеет SNMP, или access denied, но почему этот NULL не обрабатывается If'ами?

Iska
07-03-2017, 15:07
Ну, это ведь совсем не «null». Судя по описанию, Вы пытаетесь использовать несуществующий класс в указанном пространстве Wbem.

Попробуйте сделать проверку существования класса, наподобие:
Option Explicit

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


strComputer = "."

Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

WScript.Echo ClassExists(objSWbemServicesEx, "bla-bla-bla")
WScript.Echo ClassExists(objSWbemServicesEx, "Win32_Process")
WScript.Echo ClassExists(objSWbemServicesEx, "CIM_OperatingSystem")
WScript.Echo ClassExists(objSWbemServicesEx, "SNMP_RFC1213_MIB_system")


If ClassExists(objSWbemServicesEx, "SNMP_RFC1213_MIB_system") Then
Set collSWbemObjectSet = objSWbemServicesEx.InstancesOf("SNMP_RFC1213_MIB_system")

For Each objSWbemObjectEx In collSWbemObjectSet
'…
Next
Else
' …
End If

WScript.Quit 0


Function ClassExists(objSWbemServicesEx, strClassName)
Dim objSWbemObjectEx

ClassExists = False

For Each objSWbemObjectEx In objSWbemServicesEx.SubclassesOf()
If StrComp(objSWbemObjectEx.Path_.RelPath, strClassName, vbTextCompare) = 0 Then
ClassExists = True

Exit Function
End If
Next
End Function




© OSzone.net 2001-2012