Pleskのイベントの1つを介して起動されたバッチファイルを使用して、DNSゾーンの作成を自動化しようとしています。
dnscmdコマンドを使用して、バッチはゾーンが存在するかどうかを確認します。ゾーンが存在しない場合、スクリプトは仕様に従ってゾーンを追加します。それが存在し、それがセカンダリゾーンである場合、スクリプトは仕様に従ってそれを削除して再作成します。存在し、プライマリゾーンである場合、スクリプトはそれをそのままにします。その部分はすべて機能しています。
カスタム構成がいくつかあるので、ゾーンがセカンダリゾーンである場合は、ターゲットサーバーもマスターとして使用していることも確認したいと思います。別のマスターを使用している場合は、そのままにしておきます。マスターサーバーのリストを取得することはできましたが、出力に奇妙な問題があったため、テキストを一致させることができませんでした。Windowsは行末マーカーとして0x0d、0x0aを使用し、バッチ環境はこれを認識します。ただし、この特定の出力行では、行末に追加の0x0dが含まれます。EOLは0x0d、0x0d、0x0aとしてマークされます。
問題のセクションは:check3ラベルの後にあります。FOR / Fループから奇妙なフィードバックを受け取り、デバッグに役立つechoコマンドを追加しました。最終的に、dnscmdの出力を16進エディターに直接ロードして確認しました。以下のスクリプトに示されているアルゴリズムを使用すると、テスト変数%%Aと%%Bは追加の0x0dを保持するため、比較が混乱します。dnscmdからチェックした他の行では、この問題は示されていません。これは、MasterServers情報に関連する出力のみを対象としています。どうすればこれを解決できますか?
要件:バッチ機能のみ...これをVBScriptとして再コーディングし、問題を即座に解決できることはわかっていますが、それはここでの目標ではありません。このソリューションには、dnscmdからの出力を解析するための他のアプリケーションが含まれていてはなりません。
@echo off
rem 1.2.3.4 = target server holding Plesk domains
rem 5.6.7.8 = our public nameservers
rem *** USER CONFIGURED VARIABLES
set dnsupdlog=test.log
set dnsupdip=1.2.3.4
rem *** other script variables (DO NOT MODIFY)
rem the next line is "set tab=<tab>%"
set tab= %
set nozone=%1
rem *** make sure a domain was provided
if "%1"=="" set nozone=**NO ZONE PROVIDED**
for /F "delims=" %%A IN ('date /T') DO SET dnsupdtime=%%A
echo --------%dnsupdtime% begin zone %nozone% > %dnsupdlog%
if "%nozone%"=="**NO ZONE PROVIDED**" (
echo You must provide a domain name, e.g., test.bat mydomain.com >> %dnsupdlog%
goto :endit
)
rem *** does domain exist yet? if not, just add the domain
"%plesk_bin%\dnscmd.exe" 5.6.7.8 /zoneinfo %1 | find "query failed" > NUL
if ERRORLEVEL 1 (
echo Zone exists ... continue checking >> %dnsupdlog%
goto :check2
)
echo Zone does not exist ... add domains >> %dnsupdlog%
goto :add_domains
:check2
rem *** domain already exists. Is it primary? if yes, skip
for /F "tokens=1-2 skip=1 delims=%tab%: " %%A IN ('"%plesk_bin%\dnscmd.exe" 5.6.7.8 /zoneinfo %1 Type') DO (
if "%%A"=="Dword" (if "%%B"=="1" (
echo Domain is a primary zone. No work to be done. >> %dnsupdlog%
goto :endit
)
echo Not a primary zone ... continue checking >> %dnsupdlog%
goto :check3
)
)
echo ***ERROR*** Could not determine zone type!! >> %dnsupdlog%
goto :endit
:check3
rem *** secondary domain exists. Is it using this as master? if not, skip
set isfound=no
for /F "skip=1 tokens=2-3 delims=%tab%=> " %%A IN ('"%plesk_bin%\dnscmd.exe" 5.6.7.8 /zoneinfo %1 MasterServers') DO (
echo %%A
echo %%B
echo %%A,
echo %%B,
if /i "%%A"=="count" (if /i "%%B" NEQ "1" (
echo Received unexpected master server count %%B!! >> %dnsupdlog%
goto :endit
)
)
if /i "%%A"=="Addr[0]" (
if /i "%%B" NEQ "%dnsupdip%" (
echo Different master server %%B. No work to be done. >> %dnsupdlog%
goto :endit
)
set isfound=yes
)
)
if /i "%isfound%" NEQ "yes" (
echo Did not find expected IP %dnsupdip% as master server. No work to be done. >> %dnsupdlog%
goto :endit
)
:del_domains
rem *** delete domains here
echo del >> %dnsupdlog%
:add_domains
rem *** add domains here
echo add >> %dnsupdlog%
:endit
echo --------%dnsupdtime% end zone %nozone% >> %dnsupdlog%
set isfound=
set nozone=
set dnsupdtime=
set dnsupdlog=
set dnsupdip=