faithful

Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Всем привет! Никогда не думал что придется писать батники. Чего-то было к ним неоправдано пренебрежительное отношение. Короче пришлось. :) Задача следующая: Настроить кеширующий ДНС для перенаправления запросов на соответствующие нэйм-сервера встречающихся почтовых доменов. (ДНС локальный для почтового сервера) Решение: Используя LogParser собираем из лог-файлов почтового сервера имена используемых почтовых доменов: Код: >logparser -file:query.sql -i:TEXTLINE -o:NAT -rtp:-1 | query.sql: Код: select DISTINCT postsystem USING SUBSTR(TO_LOWERCASE(Text),ADD(INDEX_OF(Text, '@'),1),SUB(SUB(INDEX_OF(Text,'>'),1),INDEX_OF(Text,'@'))) as postsystem into postsystems.log from '\MDaemon\logs\*SMTP*.log' where ((TEXT LIKE '%rcpt to:%@%') or (TEXT LIKE '%mail from:%@%')) order by postsystem Asc | после чего перебираем файл postsystems.log, определяем NS, их IP и настраиваем DNS: Код: 001 @echo off 002 setlocal ENABLEDELAYEDEXPANSION 003 set path=%path%;C:\Program Files (x86)\Support Tools 004 for /F %%d in (postsystems.log) do call :dns_create %%d 005 endlocal 006 goto :EOF 007 008 :dns_create 009 set pip= 010 set inet= 011 rem если зона с таким именем уже существует то выход 012 for /f "tokens=1" %%z in ('dnscmd . /EnumZones /Forwarder ^| findstr /r "^[^.]%1"') do goto :EOF 013 for /f "tokens=1,2 delims==" %%n in ('nslookup -type^=SOA %1') do call :separate %%n %%o 014 dnscmd . /ZoneAdd %1. /Forwarder %pip% /Slave 015 goto :EOF 016 017 rem Non-authoritative answer: 018 rem yandex.ru 019 rem primary name server = ns1.yandex.ru 020 rem responsible mail addr = sysadmin.yandex-team.ru 021 rem serial = 2008022206 022 rem refresh = 1800 (30 mins) 023 rem retry = 900 (15 mins) 024 rem expire = 2592000 (30 days) 025 rem default TTL = 900 (15 mins) 026 rem 027 rem yandex.ru nameserver = ns5.yandex.ru 028 rem yandex.ru nameserver = ns1.yandex.ru 029 rem yandex.ru nameserver = ns2.yandex.ru 030 rem yandex.ru nameserver = ns4.yandex.ru 031 rem ns1.yandex.ru internet address = 213.180.193.1 032 rem ns2.yandex.ru internet address = 213.180.199.34 033 rem ns4.yandex.ru internet address = 213.180.202.100 034 rem ns5.yandex.ru internet address = 213.180.204.1 035 :separate 036 IF "%1"=="primary" call :resolve_DNS %4 037 IF "%2"=="nameserver" call :resolve_DNS %3. 038 IF "%2"=="internet" set pip=%pip% %4 039 goto :EOF 040 041 :resolve_DNS 042 nslookup %1 >~resolve.dns 043 for /f %%e in ('find /c "Address:" ^<~resolve.dns') do set err=%%e 044 if %err% LSS 2 goto :EOF 045 for /f "tokens=2 delims= " %%i in ('find "Address:" ^<~resolve.dns') do ( 046 set inet=%%i 047 rem Дублирование исключить 048 for /f %%a in ('echo %pip% ^| find "%%i"') do ( 049 set inet= 050 ) 051 ) 052 if DEFINED pip (if DEFINED inet set pip=%pip% %inet%) ELSE (if DEFINED inet set pip=%inet%) 053 goto :EOF | Вся эта байда отработала, зоны добавила. Вопрос в другом. Возможно ли это творение облагородить? Например мне не нравится строка 043. find /c "Address:" <~resolve.dns - выдает результат на консоль, а вот как этот результат засунуть в переменную без использования цикла?! ИЛИ может есть более красивый и правильный способ обработки ошибок?! | Всего записей: 240 | Зарегистр. 09-09-2005 | Отправлено: 10:55 25-02-2008 | Исправлено: faithful, 10:56 25-02-2008 |
|