暗号化 ZIP ファイル作成とメール送信のサンプル
フィックスポイントの高橋です。
Kompira Enterprise でパスワード付きの暗号化 ZIP ファイルを作成したい、作成した ZIP ファイルを添付してメールで送信したい、といった場面があるかと思います。
現状の Kompira Enterprise では ZIP ファイルを作成する機能は持っていないため、ライブラリを作成して対応する方法についてご紹介したいと思います。
※ この記事では、KE1.6系を対象としています。
pyzipper のインストール
まず、Python で暗号化 ZIP ファイルを作成するためにパッケージの追加インストールが必要になります。ここでは pyzipper というライブラリを利用します。
https://github.com/danifus/pyzipper
Kompira サーバ上で以下のコマンドを実行して、pyzipper をインストールしてください。
$ sudo /opt/kompira/bin/pip install pyzipper
ライブラリオブジェクトの作成
次にジョブフローから利用できるように Kompira 上で pyzipper を利用したライブラリオブジェクトを作成します。任意のディレクトリに pyzipper という名前で以下のようなソースを持つライブラリオブジェクトを作成してください。
import io
import pyzipper
def create_zipfile(files, password=None):
"""
パスワード付き(AES 暗号化) ZIP ファイルデータを作成する
Parameters:
files: [{"name": ファイル名, "data": ファイルデータ}, ...]
password: パスワード
Requirements: pyzipper
$ sudo /opt/kompira/bin/pip install pyzipper
"""
zip_buffer = io.BytesIO()
compression = pyzipper.ZIP_DEFLATED
encryption = pyzipper.WZ_AES if password else None
with pyzipper.AESZipFile(zip_buffer, "a", compression=compression, encryption=encryption) as zip_file:
if password:
zip_file.setpassword(password)
for file in files:
zip_file.writestr(file['name'], file['data'])
return zip_buffer.getvalue()
このライブラリで定義した create_zipfile() という関数では、第一引数に ZIP に含める複数のファイルを辞書の配列で渡す必要があります。各要素には name と data という項目でファイル名とファイルデータを渡してください。
第二引数にはパスワードをバイナリで指定する必要があります。
各引数の具体的な渡し方については以下のサンプルジョブフローを参考にしてみてください。
サンプルジョブフローの作成
上のライブラリで create_zipfile() という関数を用意したので、これをジョブフローから利用してメールで送信するサンプルジョブフローを以下に示します。(上で作成した pyzipper ライブラリオブジェクトが同じディレクトリにある前提になっています)
|__node__ = null|
|commands = ['hostname', 'whoami', 'df -h', 'ps axuf']|
|to = ''|
|subject = '暗号化ZIPファイル送信テスト'|
|body = 'コマンドを実行して、結果を暗号化 ZIP ファイルに添付しました\n'|
|zip_filename = 'result.zip'|
|zip_password = b'pass1234'|
{ if not to | abort('宛先を指定してください') } ->
# コマンドを実行して結果をファイルリストとして配列に格納する
[files = []] ->
{ for command in commands |
[command] ->
[name = command.replace(' ', '_') + '.txt', data=$RESULT] ->
[files.add_item: {name=name, data=data}]
} ->
# ファイルリストを ZIP ファイル化する
[./pyzipper.create_zipfile: files, zip_password] ->
[zipfile = {name=zip_filename, data=$RESULT}] ->
# ZIP ファイルを添付してメールを送信する
mailto(to=to, subject=subject, body=body, attach_files=[zipfile])
このジョブフローではパラメータ __node__ で指定したノード上(省略時は kompira サーバ上)で、commands で指定したコマンドを順次実行して、その結果を暗号化 ZIP ファイルに格納して to で指定した宛先にメールで送信しています。
デフォルトでは作成する ZIP のファイル名は 'result.zip' 、暗号化パスワードは 'pass1234' としています。
create_zipfile() 関数は結果として暗号化 ZIP ファイルのデータが取得できるようになっていますので、mailto() でメールに添付するときにも name および data という要素を持つ辞書で渡しています。
※ サンプルではエラー処理などは一切行っていませんので、実際に利用される場合はご注意ください。
参考になさってみてください。
サインインしてコメントを残してください。
コメント
0件のコメント