echo off
color 0a
rem #!c:\windows\cmd.exe
rem ##################################################
rem #
rem # <B-Dashトライアル>
rem #
rem # IFDecrypt.bat
rem # IFファイル展開・復号化処理
rem #----------------------------------------------------------------------------------
rem # 引数 $1 処理対象のIFファイルのchksmファイル
rem # 例: *_A1_*.chksm
rem #----------------------------------------------------------------------------------
rem # 戻り値 0 :正常
rem # 10 :異常(chksmファイルなし)
rem # 20 :異常(chksmチェック失敗orIFファイルなし)
rem # 30 :異常(暗号解除失敗)
rem # その他:異常
rem #----------------------------------------------------------------------------------
rem # 前提条件◆鍵ファイルがあること
rem # 入力IFファイル置き場 作成済みであること
rem # Workファイル置き場 作成済みであること
rem # 出力ファイル置き場 作成済みであること
rem #----------------------------------------------------------------------------------
rem # コメント記号説明
rem # ★重要コメント ループ開始終了とペア明示
rem # ■設計書Noとリンク
rem #----------------------------------------------------------------------------------
rem #
rem ##################################################
rem ###Env
SETLOCAL ENABLEDELAYEDEXPANSION
rem ループ内の変数は %変数% でなく !変数! にする
rem OpenSSL有効化/cygwin有効化
rem OpenSSLを前にしている。(cygwin内のOpenSSLを呼ばないように)
rem set PATH=%PATH%;C:\OpenSSL-Win32\bin;c:\cygwin\bin
rem 実機の環境変数にしないとだめかも
rem
set PROC=%1
set CURRENT=!time: =0!
set CRE_TIME=%date:~0,4%%date:~5,2%%date:~8,2%%CURRENT:~0,2%%CURRENT:~3,2%%CURRENT:~6,2%%CURRENT:~9,2%
rem ##バッチ日付=システムから取得 yyyymmdd
set BATCH_DATE=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
set BATCH_DATE_Y=%DATE:~0,4%
set BATCH_DATE_M=%DATE:~5,2%
set BATCH_DATE_D=%DATE:~8,2%
rem ##ログ定義
set LOG_DIR=D:\PB1PD1\var\log
rem set LOG_FILE=%LOG_DIR%\IFDecrypt_%BATCH_DATE%.log
set LOG_FILE=%LOG_DIR%\IFDecrypt_%BATCH_DATE%_%PROC:~2,2%.log
rem ##入出力ディレクトリ定義
rem set RECV_DIR=D:\PB1DEV\data\receive # 本番用。ドライブアサイン違い
set RECV_DIR=D:\PB1PD1\data\receive
set RECV_FROM_DIR=%RECV_DIR%\from
set RECV_WORK_DIR=%RECV_DIR%\work
set REL_RECV_WORK_DIR=%RECV_DIR%\work\%CRE_TIME%%PROC:~2,2%
set RECV_BKUP_DIR=%RECV_DIR%\backup
rem set RECV_OUT_DIR=%RECV_DIR%\unarc
set RECV_OUT_DIR=D:\PB1PD1\data\ifload\open\from
rem set SECURE_DIR=D:\PB1DEV\secure # 本番用。ドライブアサイン違い
set SECURE_DIR=D:\PB1PD1\secure
rem SECURE_FROM_DIR=${SECURE_DIR}/from
rem SECURE_WORK_DIR=${SECURE_DIR}/work
set PRIVATE_KEY=%SECURE_DIR%\key\private.pem
set TMP1=%REL_RECV_WORK_DIR%\TMP1.txt
set TMP2=%REL_RECV_WORK_DIR%\TMP2.txt
set TMP3=%REL_RECV_WORK_DIR%\TMP3.txt
rem set TMP4=%REL_RECV_WORK_DIR%\TMP4.txt
set TMP5=%REL_RECV_WORK_DIR%\TMP5.txt
set CHK=0
set RC=0
set RC_NOFILE=10
set RC_ERROR=100
rem バックアップファイル削除
forfiles /p %RECV_BKUP_DIR% /s /m *.* /d -1 /c "cmd /c del /f /q /a @path"
echo "1日前にバックアップファイル削除処理完了 " >> %LOG_FILE% 2>&1
rem 新規フォルダ
md %REL_RECV_WORK_DIR%
rem カレントdir=本機能のWKdir
cd %REL_RECV_WORK_DIR%
echo "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■" >> %LOG_FILE% 2>&1
echo "■ IFファイル展開・復号化処理 開始 "%DATE%" "%TIME% >> %LOG_FILE% 2>&1
echo "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■" >> %LOG_FILE% 2>&1
rem ##引数1→chksmファイル設定 引数があれば、引数ルールの chksm なければすべてのchksmにする
set CHK_FILE=%1
if "%CHK_FILE%" EQU "" (
set CHK_FILE=*.chksm
)
echo "処理対処ファイル(引数or自動判定)" %CHK_FILE% >> %LOG_FILE% 2>&1
rem ##################################################
rem # ■処理No.2.1.1
rem # チェックサムファイル存在チェック
rem # IFファイル存在チェック
rem # WKフォルダへ取り込み
rem ##################################################
rem ファイルなし時にエラー分岐 → 未実装。 exit調査中 goto ENDERROR のつもり。
rem 対象chksmファイルを %TMP1% に出力 Path無しのファイル名、拡張子あり 1行1ファイル のリストになる。
dir /b %RECV_FROM_DIR%\%CHK_FILE% > %TMP1%
if errorlevel 1 (
echo "チェックサムファイルがありません。ファイル名= [" %RECV_FROM_DIR%\%CHK_FILE% "]" >> %LOG_FILE%
set RC=%RC_NOFILE%
GOTO ENDERROR
)
if %RC%==10 GOTO :ENDERROR
rem chksmファイル対応の tar を探す
rem ## ★★ for - do () ループ処理1ここから
echo "ループ処理1開始" >> %LOG_FILE%
for /f %%a in ( %TMP1% ) do (
rem 下方にあるサブルーチンへ飛ぶ。引数つき
call :sub211_1 %%a
)
echo "ループ処理1終了" >> %LOG_FILE%
rem ## ★★ for - do () ループ処理1ここまで
if not %RC%==0 GOTO :ENDLOG
rem IFファイルセットのチェックが完了したら、WKフォルダへファイル移動
rem ## ★★ for - do () ループ処理2ここから
for /f %%a in ( %TMP1% ) do (
rem 下方にあるサブルーチンへ飛ぶ。引数つき
call :sub211_2 %%a
)
rem ## ★★ for - do () ループ処理2ここまで
if not %RC%==0 GOTO :ENDERROR
rem ##################################################
rem # ■処理No.2.1.2 IFファイル正当性チェック
rem # ■処理No.2.1.3 チェックサムファイル削除処理 →復元に支障があるのでオミット(移植元システムでオミット済みだった)
rem # ■処理No.2.1.4 IFファイルバックアップ処理
rem # ■処理No.2.1.5 IFファイル展開処理
rem # ■処理No.2.1.6 ワンタイム鍵復号化処理
rem # ■処理No.2.1.7 IFファイル復号化処理
rem # ■処理No.2.1.7.1 圧縮ファイル展開処理 →設計通りの枝番。ここだけ1層深い
rem # ■処理No.2.1.8 IFファイルを指定ディレクトリへ配置
rem ##################################################
rem ## ★★ for - do () ループ処理3ここから
for /f %%a in ( %TMP1% ) do (
call :sub212_1 %%a
)
rem ## ★★ for - do () ループ処理3ここまで
rem 残課題 たぶん多重起動で壊れるので、ロック機構が必要
GOTO ENDLOG
rem 終了処理に GOTOジャンプする。以下の:ラベル部分に入らないようにする処置
rem ##################################################
rem ループ内部処理のサブルーチンここから
rem ループ内は%変数%解釈に制限あるのでサブルーチンにする
rem ##################################################
:sub211_1
echo "サブルーチン211_1。引数= [" %1 "]" >> %LOG_FILE%
SET FILE_NAME_TMP=%1
echo 処理対象ファイル:%FILE_NAME_TMP% >> %LOG_FILE% 2>&1
rem SET FILE_NAME=%FILE_NAME_TMP:chksm=tar%
SET FILE_NAME=%FILE_NAME_TMP:tar=chksm%
echo 処理対象ファイル:%FILE_NAME% >> %LOG_FILE% 2>&1
rem リストをテキストファイル保存
rem echo %FILE_NAME% >> %TMP2%
if not exist %RECV_FROM_DIR%\%FILE_NAME% (
rem IFファイルセットなし
echo "IFファイルとチェックサムファイルのファイル数が一致しません。ファイル名= [" %RECV_FROM_DIR%\%FILE_NAME% "]" >> %LOG_FILE%
SET RC=%RC_NOFILE%
)
rem IFファイル名を設定 → 次のファイルへ
rem ## ★★ for - do () ループ処理1ここまで
exit /b
:sub211_2
echo "サブルーチン211_2。引数= [" %1 "]" >> %LOG_FILE%
rem 入力 %%a を拡張子なし ~n で取得 + 拡張子.tar ファイルの有無は「ループ処理1」でチェック済みのもの
SET FILE_NAME_TMP=%1
rem SET FILE_NAME=%FILE_NAME_TMP:chksm=tar%
SET FILE_NAME=%FILE_NAME_TMP:tar=chksm%
move %RECV_FROM_DIR%\%1 %REL_RECV_WORK_DIR% >> %LOG_FILE% 2>&1
if errorlevel 1 (
echo "ファイル移動に失敗しました。ファイル名= [" %RECV_FROM_DIR%\%1 "→" %REL_RECV_WORK_DIR% "]" >> %LOG_FILE%
set RC=%RC_ERROR%
)
move %RECV_FROM_DIR%\%FILE_NAME% %REL_RECV_WORK_DIR% >> %LOG_FILE% 2>&1
if errorlevel 1 (
echo "ファイル移動に失敗しました。ファイル名= [" %RECV_FROM_DIR%\%FILE_NAME% "→" %REL_RECV_WORK_DIR% "]" >> %LOG_FILE%
set RC=%RC_ERROR%
)
exit /b
:sub212_1
rem 2.1.2~2.1.7まで一括のサブルーチン。サブサブルーチン呼び出しあり
echo "サブルーチン212_1。引数= [" %1 "]" >> %LOG_FILE%
rem # ■処理No.2.1.2 IFファイル正当性チェック
SET FILE_NAME_TMP=%1
SET FILE_NAME=%FILE_NAME_TMP:tar=chksm%
sha1sum --check %FILE_NAME%
if errorlevel 1 (
echo "チェックサムが一致しません。ファイル名= [" %1 "]" >> %LOG_FILE%
set RC=%RC_ERROR%
GOTO ENDERROR
)
rem # ■処理No.2.1.4 IFファイルバックアップ処理
SET FILE_NAME_TMP=%1
SET FILE_NAME=%FILE_NAME_TMP:tar=chksm%
echo "IFファイルバックアップします。ファイル名= [" %REL_RECV_WORK_DIR%\%FILE_NAME_TMP% "→" %RECV_BKUP_DIR% "]" >> %LOG_FILE%
copy %REL_RECV_WORK_DIR%\%FILE_NAME_TMP% %RECV_BKUP_DIR%\ >> %LOG_FILE% 2>&1
if errorlevel 1 (
echo "IFファイルバックアップに失敗しました。ファイル名= [" %REL_RECV_WORK_DIR%\%FILE_NAME_TMP% "→" %RECV_BKUP_DIR% "]" >> %LOG_FILE%
set RC=%RC_ERROR%
GOTO ENDERROR
)
echo "IFファイルバックアップします。ファイル名= [" %REL_RECV_WORK_DIR%\%FILE_NAME% "→" %RECV_BKUP_DIR% "]" >> %LOG_FILE%
copy %REL_RECV_WORK_DIR%\%FILE_NAME% %RECV_BKUP_DIR%\ >> %LOG_FILE% 2>&1
if errorlevel 1 (
echo "IFファイルバックアップに失敗しました。ファイル名= [" %REL_RECV_WORK_DIR%\%FILE_NAME% "→" %RECV_BKUP_DIR% "]" >> %LOG_FILE%
set RC=%RC_ERROR%
GOTO ENDERROR
)
rem # ■処理No.2.1.5 IFファイル展開処理
rem カレントdirのIFファイル → カレントdirに展開
tar xvf %FILE_NAME_TMP% >> %LOG_FILE% 2>&1
if errorlevel 1 (
echo "IFファイル展開処理でエラーが発生しました。tar展開失敗しました。ファイル名= [" %REL_RECV_WORK_DIR%\%FILE_NAME_TMP% "→" %RECV_BKUP_DIR% "]" >> %LOG_FILE%
set RC=%RC_ERROR%
GOTO ENDERROR
)
rem # ■処理No.2.1.6 ワンタイム鍵復号化処理
rem key.enc 1ファイルで、該当IFアーカイブ内の全ファイルを暗号化している はず
rem 対象.key.encファイル(ワンタイム鍵)を %TMP2% に出力 Path無しのファイル名、拡張子あり 1行1ファイル のリストになる。
dir /b %REL_RECV_WORK_DIR%\*.key.enc | wc > %TMP2%
if errorlevel 1 (
echo "ワンタイム鍵復号処理でエラーが発生しました。ワンタイム鍵ファイルがありません。" >> %LOG_FILE%
set RC=%RC_ERROR%
GOTO ENDERROR
)
rem ワンタイム鍵ファイルが1個であることを確認 変数 LINE に行数を入れる
for /f %%C in ( %TMP2% ) do set LINE=%%C
echo 行数%LINE%
if not %LINE% == 1 (
echo "ワンタイム鍵復号処理でエラーが発生しました。ワンタイム鍵ファイル数が1個ではありません。" >> %LOG_FILE%
set RC=%RC_ERROR%
GOTO ENDERROR
)
rem ## ★★ for - do () ループ処理4ここから
rem 1行しかないので1ループしかしない。復号後ファイル名生成のためにループ構造は維持
dir /b %REL_RECV_WORK_DIR%\*.key.enc > %TMP3%
for /f %%b in ( %TMP3% ) do (
call :sub216_1 %%b
)
rem ## ★★ for - do () ループ処理4ここまで
if not %RC%==0 GOTO :ENDERROR
rem # ■処理No.2.1.7 IFファイル復号化処理
dir /b %REL_RECV_WORK_DIR%\*.gz.enc > %TMP5%
if errorlevel 1 (
echo "IFファイル復号処理でエラーが発生しました。復号対象ファイルがありません。" >> %LOG_FILE%
set RC=%RC_ERROR%
GOTO ENDERROR
)
for /f %%d in ( %TMP5% ) do (
call :sub217_1 %%d
if not %RC%==0 GOTO ENDERROR
rem 展開されたファイルを、出力ディレクトリに移動
echo %FILE_NAME%"IF処理完了。出力フォルダへ移動。" >> %LOG_FILE%
move %REL_RECV_WORK_DIR%\*.dat %RECV_OUT_DIR%\ >> %LOG_FILE%
if errorlevel 1 (
move %REL_RECV_WORK_DIR%\*.csv %RECV_OUT_DIR%\
if errorlevel 1 (
move %REL_RECV_WORK_DIR%\*.tsv %RECV_OUT_DIR%\
if errorlevel 1 (
echo "IFファイル復号処理でエラーが発生しました。出力フォルダへ書き出せません。ファイル名= [" %KEYFILE% "]" >> %LOG_FILE%
SET RC=%RC_ERROR%
GOTO ENDERROR
)
)
)
)
if not %RC%==0 GOTO ENDERROR
rem ワークファイルを削除
del %REL_RECV_WORK_DIR%\%FILE_NAME_TMP%
del %REL_RECV_WORK_DIR%\%FILE_NAME%
rem del %REL_RECV_WORK_DIR%\*.gz.enc
del %REL_RECV_WORK_DIR%\*.enc
del %REL_RECV_WORK_DIR%\*.key
del -f %TMP1%
del -f %TMP2%
del -f %TMP3%
del -f %TMP4%
del -f %TMP5%
exit /b %RC%
rem 212_1ここまで
:sub216_1
echo "サブルーチン216_1。引数= [" %1 "]" >> %LOG_FILE%
rem 入力 %1 を拡張子.enc → 拡張子.key ファイルを生成
SET KEYFILE=%1
SET ONETIME_KEY=%KEYFILE:enc=key%
echo ワンタイム鍵(暗号)%KEYFILE% >> %LOG_FILE%
echo ワンタイム鍵(復号)%ONETIME_KEY% >> %LOG_FILE%
openssl rsautl -decrypt -inkey %PRIVATE_KEY% -in %KEYFILE% -out %REL_RECV_WORK_DIR%\%ONETIME_KEY% >> %LOG_FILE%
if errorlevel 1 (
echo "ワンタイム鍵復号処理でエラーが発生しました。秘密鍵で展開に失敗しました。ファイル名= [" %KEYFILE% "]" >> %LOG_FILE%
SET RC=%RC_NOFILE%
GOTO ENDERROR
)
exit /b %RC%
:sub217_1
echo "サブルーチン217_1。引数= [" %1 "]" >> %LOG_FILE%
rem 入力 %%d の暗号+圧縮ファイル → 復号 %IFFILE_GZ% → 圧縮展開 %IFFILE_UN%
SET IFFILE_ENC=%1
SET IFFILE_GZ=%IFFILE_ENC:.enc=%
SET IFFILE_UN=%IFFILE_ENC%
echo IFデータファイル(暗号)%IFFILE_ENC% >> %LOG_FILE%
echo IFデータファイル(復号・圧縮)%IFFILE_GZ% >> %LOG_FILE%
openssl enc -d -aes-256-cbc -in %IFFILE_ENC% -out %REL_RECV_WORK_DIR%\%IFFILE_GZ% -kfile %REL_RECV_WORK_DIR%\%ONETIME_KEY%
if errorlevel 1 (
echo "IFファイル復号処理でエラーが発生しました。ファイル名= [" %IFFILE_ENC% "]" >> %LOG_FILE%
SET RC=%RC_ERROR%
exit /b %RC%
)
gzip -d %REL_RECV_WORK_DIR%\%IFFILE_GZ%
if errorlevel 1 (
echo "圧縮ファイル展開処理でエラーが発生しました。ファイル名= [" %IFFILE_GZ% "]" >> %LOG_FILE%
set RC=%RC_ERROR%
exit /b %RC%
)
exit /b %RC%
:sub218_1
SET IFFILE_UN=%1*
move %IFFILE_UN% %RECV_OUT_DIR%\
if errorlevel 1 (
echo "IFファイル移動でエラーが発生しました。ファイル名= [" %IFFILE_UN% "]" >> %LOG_FILE%
RC=%RC_ERROR%
GOTO ENDERROR
)
if not %RC%==0 GOTO ENDERROR
del -f %REL_RECV_WORK_DIR%\*.gz.enc
del -f %REL_RECV_WORK_DIR%\%ONETIME_KEY%
del -f %TMP1%
del -f %TMP2%
del -f %TMP3%
del -f %TMP4%
del -f %TMP5%
exit /b %RC%
rem ##################################################
rem ループ内部処理のサブルーチンここまで
rem ##################################################
rem これ以下はエラー時に ジャンプしてくる場所
:ENDERROR
rem ##################################################
rem 処理No.X リラン機能 処理未完了IFを元の場所に返す
rem ##################################################
color 0c
echo "エラーのため、IFファイルをWKからFROMへ復元します。"%DATE%" "%TIME% >> %LOG_FILE% 2>&1
move %REL_RECV_WORK_DIR%\*.chksm %RECV_FROM_DIR% >> %LOG_FILE% 2>&1
if errorlevel 1 (
echo "復元するファイルはありません。エラー後処理続行します。ファイル名= [" %REL_RECV_WORK_DIR%\*.chksm "→" %RECV_FROM_DIR% "]" >> %LOG_FILE%
)
move %REL_RECV_WORK_DIR%\*.tar %RECV_FROM_DIR% >> %LOG_FILE% 2>&1
if errorlevel 1 (
echo "復元するファイルはありません。エラー後処理続行します。ファイル名= [" %REL_RECV_WORK_DIR%\*.tar "→" %RECV_FROM_DIR% "]" >> %LOG_FILE%
)
rem 完了したIFファイルを削除・異常時はファイルは無いこともあるが無視してOK
del -f -q %REL_RECV_WORK_DIR%\*.enc
del -f -q %REL_RECV_WORK_DIR%\*.key
del -f -q %REL_RECV_WORK_DIR%\*.dat
del -f -q %REL_RECV_WORK_DIR%\*.csv
del -f -q %REL_RECV_WORK_DIR%\*.gz
GOTO ENDLOG
:ENDLOG
rem ##################################################
rem # 処理No.10 終了処理
rem ##################################################
rem フォルダとファイルを削除
cd %RECV_WORK_DIR%
rd /s /q %REL_RECV_WORK_DIR%
rem カレントディレクトリをバッチディレクトリにする(起動時のディレクトリ)
cd /d %~dp0
echo "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■" >> %LOG_FILE% 2>&1
echo "■ IFファイル展開・復号化処理 完了 "%DATE%" "%TIME% >> %LOG_FILE% 2>&1
echo "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■" >> %LOG_FILE% 2>&1
echo RC=%RC% >> %LOG_FILE% 2>&1
color 07
exit /b %RC%
浙公网安备 33010602011771号