@echo off setlocal enableextensions enabledelayedexpansion goto MAIN **************************************************************** NOTICE OF LICENSE **************************************************************** GetXreaLog.bat - a batch program for get log files of Apache from xrea.com version 1.05 (2008/03/29) : Windows標準のFTPクライアントが利用出来ない旨を明記 (コードの修正はありません) version 1.04 (2008/01/01) : 1月1日の処理に失敗していた問題をこっそり修正 version 1.03 (2007/08/08) : 一桁月の一日の処理に失敗していた問題をこっそり修正 version 1.00 (2007/03/23) Copyright (C) 2007 Society for Various Solutions and Synchronous Service ( Auxtorrajto (C) 2007 Societo por Variaj Solvoj kaj Sinkrona Servo ) http://www.ermitejo.com/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. (for Japanese users: このプログラムはフリーソフトウェアです。 あなたはこれを、フリーソフトウェア財団によって発行された GNU 一般公衆利用 許諾契約書(バージョン2か、希望によってはそれ以降のバージョンのうちどれか)の 定める条件の下で再頒布または改変することができます。 このプログラムは有用であることを願って頒布されますが、*全くの無保証* です。 商業可能性の保証や特定の目的への適合性は、言外に示されたものも含め 全く存在しません。 詳しくはGNU 一般公衆利用許諾契約書をご覧ください。 あなたはこのプログラムと共に、GNU 一般公衆利用許諾契約書の複製物を1部 受け取ったはずです。 もし受け取っていなければ、フリーソフトウェア財団まで請求してください (宛先はthe Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA)。 ) **************************************************************** ACKNOWLEDGEMENT **************************************************************** 次の方々に、心から感謝致します。 ラザロ・ルドヴィコ・ザメンホフ 先生 : 本サイトの趣旨であるエスペラントを創案したという偉大な業績に対して。 合著 さん ( http://www.abk.nu/~kattyo/ ) : PASVモードで使えるFTPコマンドラインプログラムを作成・公開いただいた ことに対して。 私に飯の種を提供する某ユーザ系システム会社 ( URI自粛 ) : 私がこのように一部偏執狂的(nulでファイルチェックしない、等)なコードを 生み出すに至った、あまたの苦い苦い経験を積ませていただいたことに対して。 rem **************************************************************** rem MAIN ROUTINE rem **************************************************************** :MAIN echo started at %date% %time%. call :CheckEnvironment || goto ABEND call :SetEnvironment "%~1" "%~2" "%~3" call :MakeDirectory || goto ABEND call :MakeFtpBatch || goto ABEND call :GetLogFiles call :RenameLogFiles endlocal goto END :END echo finished successfully at %date% %time%. exit /b 0 :ABEND echo ABNORMAL END at %date% %time%. 1>&2 exit /b 1 rem **************************************************************** rem SUBROUTINES rem **************************************************************** rem ================================================================ :CheckEnvironment rem 実行環境の確認 rem ---------------------------------------------------------------- rem ---- OSの確認 ---- rem Windows XP以上のバージョンが必要です。 rem 多分Windows Server 2003でも大丈夫なはずですが。 ver | find "XP" > nul if errorlevel 0 ( exit /b 0 ) else ( exit /b 1 ) rem ================================================================ :SetEnvironment rem ユーザ環境変数の設定等 rem ---------------------------------------------------------------- rem ---- サーバ関連(必要に応じて適宜変更してください) ---- rem "XREA.COM NEW SIGNUP"メールに記載してあります。 rem これらはバッチへの引数を採用していますが、直接書いても構いません。 rem 各サブドメインや、或いはXREAの複数アカウントについて、 rem その全てのログを取得する場合には、設定はこのままとし、 rem バッチへの引数で指定する方が(このバッチを複数用意する必要がないため) rem 妥当でしょう。 rem 1アカウントのみのログを取得する場合も、上記のように引数を指定しても rem 問題ありませんが、「バッチを手動でダブルクリックしておしまい」という rem 用途であるなら、このバッチに直接書く方がお気楽です。 rem その場合、このバッチへのショートカットファイルを作成し、 rem ショートカット先として引数を指定すれば、そのショートカットを rem ダブルクリックするという手もありますが。 rem 引数で指定する場合の例は以下の通りです。 rem GetXreaLog.bat www.ermitejo.com ermitejo xxxxxxxxx rem GetXreaLog.bat s270.xrea.com ermitejo xxxxxxxxx rem 引数で指定する場合、このバッチの実行も自動化出来ます。 rem 使用例:お使いのPCのWindowsにログオンする際に実行 rem 実行例1:Windowsローカルログオンスクリプトで実行 rem グループポリシ(gpedit.msc)を実行。 rem 左ペインの[ローカル コンピュータ ポリシー] - [ユーザーの構成] - rem [Windows の設定] - [スクリプト (ログオン /ログオフ]を選択。 rem 右ペイン[スタートアップ]をダブルクリックするなどして、 rem [スタートアップのプロパティ]ウィンドウを開く。 rem [追加]ボタンを押下し、[スクリプトの追加]ウィンドウを開く。 rem [スクリプト名]テキストボックスにこのバッチを記述。 rem 例:「d:\bin\GetXreaLog.bat」 rem [スクリプトのパラメータ]テキストボックスに、引数を記述。 rem 例:「www.ermitejo.com ermitejo xxxxx」 rem なお、「ログオフ時」「PC起動時」「PCシャットダウン時」も同様。 rem 実行例2:Windowsスタートアップで実行その1 rem 「%UserProfile%\スタート メニュー\プログラム\スタートアップ」 rem (または「%AllUserProfile%\〜」)に、このバッチへの rem ショートカットを作成し、[リンク先]テキストボックスで与える。 rem 例:「d:\bin\GetXreaLog.bat www.ermitejo.com ermitejo xxxx」 rem (〜bat以下を追記する) rem なお、上記スタートアップディレクトリは、厳密には以下のキー rem 「HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\ rem CurrentVersion\Explorer\User Shell Folders」(前者)や、 rem 「HKEY_LOCAL_MACHINE\〜」(後者)の「Common Startup」指定値。 rem 実行例3:Windowsスタートアップで実行その2 rem レジストリ(「HKLM\SOFTWARE\Microsoft\Windows\ rem CurrentVersion\Run」)で指定する方法等もあります。 rem 等。 rem なお、「ドメインログオン時」等の場合はドメイン管理者に要相談です。 rem 使用例:或る時刻で実行 rem 実行例:タスクスケジューラ(tasks) rem この設定もコマンド(schtasks)で出来ますが、一回設定したら後は rem そのままでしょうから、素直にGUIで設定した方が良いと思います。 rem 上記の組み合わせも良いかと思います。 rem なお、後述した代替クライアントでは、「ホスト定義ファイル」を用いて rem これらのオプションの指定や、その後のファイルの取得も rem (ファイルを取得するバッチを用いずとも)行えます。 rem 1. 接続先FTPサーバ(ex. "s270.xrea.com", "www.ermitejo.com", etc.) set Server=%~1 rem 2. FTPユーザ名(ex. ermitejo) set UserName=%~2 rem 3. FTPパスワード(ex. xxxxxxxxx) set Password=%~3 rem ---- ローカル関連(必要に応じて適宜変更してください) ---- rem FTPクライアントプログラムのフルパス rem set FTP=ftp rem 回線の種別によってはPASVモードを使う必要があり、Windows XP標準の rem ftp.exeは使用出来ず、代替プログラムを用いる必要があります。 rem ……と書いていましたが、Windows XP標準のftp.exeでは、 rem getしたファイルのタイムスタンプが、サーバ上のものではなく rem ローカル上のもの(つまり、getしてきたまさにその日時)になるらしく、 rem このナンチャッテバッチそのままではサポート出来ません。 rem 故に、代替FTPクライアントを使うか、或いは別の手段を試行してください。 rem ---- 2007/05/07 このチャンクを追記 rem 実際にはWindows XP標準のftp.exeでも、 rem "quote pasv"ないし"literal pasv"を投げてサーバ側にPASVを通知し、 rem クライアント側はPORTのままでいることも出来るのですが、 rem "quote port"ないし"literal port"と、その文字列に後続して rem クライアント側のIPアドレス・サーバから応答のあったワンタイムポート番号 rem を続けて入力する必要があります。これを接続前に予め記録することは rem 出来ないため、事実上使えないのと同義としています。 rem どうーしても標準のftp.exeで処理したい場合、PerlやらVBEやらで rem 標準出力を読んで、その内容を元に標準入力に突っ込むスクリプトを rem 書くという手もありますが、面倒なのでおすすめ出来ません。 rem ---- 2007/05/07 追記ここまで rem 例:合著@ABK および neko 両氏作の「ftp.exe」 rem (http://www.abk.nu/~kattyo/freesoft.htm#prog_ftp) set FTP=%ProgramFiles%\KFTPW\ftp.exe rem ログファイル保存先ローカルディレクトリ set LocalLogDir=%~dp0log rem 例:デフォルトではこのバッチと同じディレクトリの、log子ディレクトリ rem 例:任意のディレクトリ …… set LocalLogDir=d:\foobar\log rem 例:接続先FTPサーバ名を使う …… set LocalLogDir=c:\%Server% rem * OBSOLETED * rem rem 実行端末のローカルタイムゾーンと、UTC(協定世界時)との時差 rem set TimeDifference=+9 rem ---- ログファイル名関連(必要に応じて適宜変更してください) ---- rem 「<接頭辞>YYYYMMDD<接尾辞>」で、上記ローカルディレクトリに保存します。 rem ローカル保存用ファイル名の接頭辞 set LogPrefix=%Server%. rem 何も指定しないと、「YYYYMMDD<接頭辞>」になります。 rem もし複数のXREAアカウントを持っていて、かつ、どのアカウントも rem 保存ディレクトリが同じにする場合の例(<サーバ名>.YYYYMMDD<接頭辞>): rem LogPrefix=%Server%. rem 上記のバリエーション(1サーバに複数アカウント) rem LogPrefix=%Server%.%UserName%. rem ローカル保存用ファイル名の接尾辞(拡張子等を含む) set LogSuffix=.log rem ---- 以下はXREA用のデフォルト値等であり、変更の必要はありません。 ---- rem ポート番号 rem 天地がひっくり返ってもポート番号が変えられることは無いと思いますが。 set Port=21 rem ログファイル保存先サーバディレクトリ set ServerLogDir=/log rem FTP用バッチのフルパス set FtpBatch=%~dp0%Server%.ftp rem FTPクライアントプログラムのオプション(バッチ指定は必須) rem Windows XP標準のftp.exeの場合: rem set Option= s:"%FtpBatch%" rem ……ただし、上述の通りタイムスタンプ問題があるので使用不能 rem 上述の代替FTPクライアントの場合: set Option= -B"%FtpBatch%" rem このバッチプログラム名 set MyName=GetXreaLog ^(%~nx0 - %~t0^) title %MyName% rem ログファイル名の共通部の取得 rem 共通部とは、〜.log, 〜.1.log, ..., 〜.4.logの「〜」を指します。 rem 以下の命名規則を満たす文字列を得ます。 rem 独自ドメインの場合:「<(サブ)ドメイン名>」 rem ex. "www.ermitejo.com", "ermitejo.com", "foobar.ermitejo.com" rem それ以外の場合:「<ユーザ名>.<サーバ名>」 rem ex. "ermitejo.s270.xrea.com.log" if /i "%Server:~-9,9%" equ ".xrea.com" ( rem 通常ユーザ set Seed=%UserName%.%Server% ) else ( rem 独自ドメイン set Seed=%Server% ) exit /b 0 rem ================================================================ :MakeDirectory rem ローカルログ保存ディレクトリの作成 rem ---------------------------------------------------------------- rem ディレクトリ遷移はここでは(cd /dで)行わず、FTP用バッチで行います。 rem このバッチプログラム開始時のカレントディレクトリを維持するためです。 rem --- ログ保存ディレクトリの存否確認 --- rem 「\nul」テストは""で括ったディレクトリ(スペースを含むもの等) rem には使えないので、まどろっこしい処理をしています。 if exist "%LocalLogDir%" ( dir "%LocalLogDir%" | find "%LocalLogDir% のディレクトリ" > nul if /i !errorlevel! equ 0 ( rem ディレクトリは既にある exit /b 0 ) else ( rem 作りたいディレクトリ名のファイルが既にある exit /b 1 ) ) rem ---- 存在しないので作成 ---- md "%LocalLogDir%" > nul exit /b 0 rem ================================================================ :MakeFtpBatch rem FTP接続中の挙動を記したFTP用バッチの記述 rem ---------------------------------------------------------------- rem 「ホスト定義ファイル」を使うか、この処理を行うかのいずれかとなります。 rem 平文のパスワードをバッチに書くのは厳しいので、ログオン処理は書かず、 rem ログオン後の前処理・ログ取得処理・終了処理のみを書きます。 if exist "%FtpBatch%" ( dir "%FtpBatch%" | find "%FtpBatch% のディレクトリ" > nul if /i !errorlevel! equ 0 ( rem 作りたいファイル名のディレクトリが既にある exit /b 1 ) else ( rem ファイルは既にある exit /b 0 ) ) rem ---- 存在しないので作成 ---- rem echo foobar >> %FtpBatch%だと、末尾に空白が入る。 rem echo foobar>> %FtpBatch%だと、foobar2などの場合に2>>リダイレクトになる。 rem このため、括弧で括っています。 (@echo off) > "%FtpBatch%" rem Windows標準のftp.exeでは、ここにユーザ名・パスワードを書きます。 rem ただし、作者の環境ではテストが出来ないので、未検証のコードです。 rem また、どっちみち上述の通りタイムスタンプ問題があります。 rem (echo %UserName%) >> "%FtpBatch%" rem (echo %Password%) >> "%FtpBatch%" rem 必要に応じてPASVモードで行ってください。 rem FFFTP等と同様に、デフォルトでPASVモードにしています。 (echo passive on) >> "%FtpBatch%" rem 敢えてバイナリ転送のままにしていますが、 rem 必要に応じてアスキー転送モード(ascii)にしてください。 rem ローカル側ログ保存ディレクトリへの遷移 (echo lcd "%LocalLogDir%") >> "%FtpBatch%" rem サーバ側ログ保存ディレクトリへの遷移 (echo cd %ServerLogDir%) >> "%FtpBatch%" rem ログファイル直近5日分をget rem 格好悪いですが、mget(と、前提のprompt on)は敢えて行っていません。 rem サブドメインがある場合等を考慮するよりも、 rem 素直に5ファイルを指定した方が間違いがないためです。 (echo get !Seed!.log) >> "%FtpBatch%" (echo get !Seed!.1.log) >> "%FtpBatch%" (echo get !Seed!.2.log) >> "%FtpBatch%" (echo get !Seed!.3.log) >> "%FtpBatch%" (echo get !Seed!.4.log) >> "%FtpBatch%" rem 接続切断 (echo bye) >> "%FtpBatch%" exit /b 0 rem ================================================================ :GetLogFiles rem Apacheログファイル(/log/*.log)の取得 rem ---------------------------------------------------------------- rem 解析済みログファイル(/public_html/log/*.html)の取得に非ず、です。 rem ログは直近5日分(xxx.log 〜 xxx.log.4.log)のみ保存されます。 "%FTP%" %Option% ftp://%UserName%:%Password%@%Server%:%Port% exit /b 0 rem ================================================================ :RenameLogFiles rem 取得したログファイル名の変更 rem ---------------------------------------------------------------- rem 取得したログファイル名はサーバ上のファイル名のまま rem (固定のファイル名で5日分を洗い替えしている)であるため、 rem ローカルで(当然、5日分を超えて)保存するためにファイル名を変更します。 rem 細かい処理を行う必要があるため、FTPでgetする時には rem ローカル側ファイル名を指定しません。 call :%0_Rename "%LocalLogDir%\!Seed!.log" for /l %%n in ( 1, 1, 4 ) do ( call :%0_Rename "%LocalLogDir%\!Seed!.%%n.log" ) exit /b 0 rem ---------------------------------------------------------------- :RenameLogFiles_Rename rem 指定ログファイル名の変更 rem ---------------------------------------------------------------- if /i %~z1 equ 0 ( rem 空ファイル(存在しないログをFTPでgetした場合等)は削除 del /f "%~1" exit /b 0 ) rem ログファイルの更新日付の取得 for /f "tokens=1-3 delims=/: " %%a in ( "%~t1" ) do ( set YYYY=%%a set MM=%%b set DD=%%c rem set /aの計算で8進数と誤解されないように0を除いている call :ToggleLeadingZero MM call :ToggleLeadingZero DD rem ログ内容「ログ作成日の前日一日間」に即して更新日付を取得 rem 時刻のUTC→Local補正は行わない if /i !DD! equ 1 ( rem 月末月初をまたがる場合 call :Month!MM! ) else ( set /a DD=!DD! - 1 ) call :ToggleLeadingZero MM call :ToggleLeadingZero DD rem ファイル名変更(または置換) set RegularizedName=%LogPrefix%!YYYY!!MM!!DD!%LogSuffix% if exist "%LocalLogDir%\!RegularizedName!" ( del /f "%LocalLogDir%\!RegularizedName!" ) ren "%~1" "!RegularizedName!" ) exit /b 0 rem ---- 先頭に0を付けたり除いたりのトグル ---- :ToggleLeadingZero set NumberString=%~1 if "!%NumberString%:~,1!" equ "0" ( set %NumberString%=!%NumberString%:~1,1! ) else if "!%NumberString%:~1,1!" equ "" ( set %NumberString%=0!%NumberString%! ) exit /b 0 rem ---- 前月最終暦日の取得 ---- :Month1 set MM=12 set /a YYYY=!YYYY! - 1 set DD=31 exit /b 0 :Month2 :Month4 :Month6 :Month8 :Month9 :Month11 set /a MM=!MM! - 1 set DD=31 exit /b 0 :Month5 :Month7 :Month10 :Month12 set /a MM=!MM! - 1 set DD=30 exit /b 0 :Month3 set MM=2 set /a Remainder=!YYYY! %% 400 if /i !Remainder! equ 0 ( set DD=29 ) else ( set /a Remainder=!YYYY! %% 100 if /i !Remainder! equ 0 ( set DD=28 ) else ( set /a Remainder=!YYYY! %% 4 if /i !Remainder! equ 0 ( set DD=29 ) else ( set DD=28 ) ) ) exit /b 0 rem **************************************************************** rem END OF FILE rem **************************************************************** :EOF