ftp ダウンロードを python でおこない、重要情報は外部ファイルにして難読化します。
なぜここまで ftp にこだわるのかというと、ダウンロードスピードが約 4 倍速いからです。
例えば、全体で 50 MB の dicom ファイルがあるとして、回線速度が 12 MB/sec 程度とすると scp ではダウンロードに 4 – 5 秒かかります。
ところが ftp でダウンロードすると 1 秒程度で済みます。この差はとても大きいと思います。
イントラネットですし、やはり ftp の方がいいと思います。
dcm.py
from flask import Flask, render_template, redirect
import pymysql
import startWeasis
import conf
app = Flask(__name__)
@app.route('/')
def dirlist():
db = pymysql.connect(
host='192.168.0.99',
user=conf.muser,
password=conf.mpass,
db='pydcmdb',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor,
)
cur = db.cursor()
sql = "SELECT * FROM taginfo;";
cur.execute(sql)
mbrs = cur.fetchall()
cur.close()
db.close()
return render_template('select.html', title='flask test', mbrs=mbrs)
@app.route('/detail/<int:studyID>')
def detail(studyID):
return redirect('/'), startWeasis.weasis(studyID)
if __name__ == "__main__":
app.run(debug=True)
startWeasis.py
import os
import shutil
import pymysql
from ftplib import FTP
import conf
def weasis(studyID):
targetDir = 'pDICOM/' + getPath( studyID )
shutil.rmtree('/home/user/flask/dcmtemp')
os.mkdir('/home/user/flask/dcmtemp')
dwn(targetDir)
os.system('javaws /var/www/html/weasis/weasisStart.jnlp')
def getPath( studyID ):
conn = pymysql.connect( host='192.168.0.99',
db='pydcmdb',
user=conf.muser,
password=conf.mpass,
cursorclass=pymysql.cursors.DictCursor)
try:
with conn.cursor() as cursor:
cursor.execute( "SELECT path FROM taginfo WHERE studyID = %s", (studyID), )
res = cursor.fetchone()
return res['path']
finally:
conn.close()
def dwn(dir):
ftp = FTP(
"192.168.0.11",
conf.fuser,
passwd=conf.fpass
)
ftp.cwd(dir)
files = ftp.nlst('.')
for file in files:
with open('/home/user/flask/dcmtemp/' + file, 'wb') as f:
ftp.retrbinary('RETR %s' % file, f.write)
ftp.quit()
if __name__ == '__main__':
weasis()
pyarmour による難読化
conf.py は以下のように平文になっていますが、これを難読化します。
conf.py
muser = "heno"
mpass = "moheno"
fuser = "username"
fpass = "password"
pyarmour のインストール。
pip install pyarmor
conf.py を難読化します。
pyarmor obfuscate conf.py
pytransform というディレクトリが作成されて、conf.py が以下のように難読化されます。
from pytransform import pyarmor_runtime
pyarmor_runtime()
__pyarmor__(__name__, __file__, b'\x50\x59\x41\x52\x4d\x4f\x52\x00\x00\x03\x08\x00\x55\.........
これを解読するのはかなり困難なようです。