Files
twnhi-smartcard-agent/install-packages.py
2020-05-20 00:12:35 +08:00

145 lines
4.3 KiB
Python

# This file is part of twnhi-smartcard-agent.
#
# twnhi-smartcard-agent 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 3 of the License, or
# (at your option) any later version.
#
# twnhi-smartcard-agent 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 twnhi-smartcard-agent.
# If not, see <https://www.gnu.org/licenses/>.
import os
import sys
from hashlib import sha256
from imp import reload
from io import BytesIO
from pprint import pprint
from urllib.request import urlopen
from zipfile import ZipFile
SWIG_LOCAL_FILENAME = 'swigwin-4.0.1.zip'
SIWG_ZIP_URL = 'http://prdownloads.sourceforge.net/swig/swigwin-4.0.1.zip'
SWIG_ZIP_HASH = '8c504241ad4fb4f8ba7828deaef1ea0b4972e86eb128b46cb75efabf19ab4745'
is_windows = os.name == 'nt'
def pyexec(*args, executable=sys.executable):
return os.system('%s -m %s' % (executable, ' '.join(args)))
def which(fname):
if is_windows:
fname += '.exe'
for p in os.getenv('PATH').split(os.path.pathsep):
full = os.path.join(p, fname)
if os.path.exists(full):
return full
def check_version():
if sys.version_info.major < 3 or \
sys.version_info.minor < 6:
print('[-] Python version not match: %s' % sys.version)
exit()
def install_virtualenv():
try:
import virtualenv
major_version = int(virtualenv.__version__.split('.')[0])
if major_version >= 20:
return
else:
print('[*] Upgrade virtualenv')
except:
pass
ret = pyexec('pip', 'install', '-U', '--user', 'virtualenv')
if ret:
print('[-] Failed to execute pip')
exit(1)
def load_virtualenv():
if not os.path.exists('venv'):
print('[*] Create new virtualenv')
pyexec('virtualenv', '--copies', '--download', 'venv')
print('[*] Activate venv in current interpreter')
the_file = os.path.join('venv', 'Scripts', 'activate_this.py') \
if is_windows else \
os.path.join('venv', 'bin', 'activate_this.py')
exec(open(the_file).read(), {'__file__': the_file})
def load_swig():
if not is_windows:
return
if which('swig'):
return
if not os.path.exists(SWIG_LOCAL_FILENAME):
print('[+] Downloading file from %s' % SIWG_ZIP_URL)
response = urlopen(SIWG_ZIP_URL)
data = response.read()
with open(SWIG_LOCAL_FILENAME, 'wb') as fp:
fp.write(data)
else:
print('[+] Use %s from local' % SWIG_LOCAL_FILENAME)
with open(SWIG_LOCAL_FILENAME, 'rb') as fp:
data = fp.read()
print('[*] Check if file hash match %s' % SWIG_ZIP_HASH)
assert sha256(data).hexdigest().lower() == SWIG_ZIP_HASH
print('[*] Read zip file')
zfile = ZipFile(BytesIO(data))
pathname = zfile.infolist()[0].filename
if os.path.exists(pathname):
print('[+] Zip file already extracted')
else:
print('[+] Extracting files')
zfile.extractall('.')
path = os.getenv('PATH')
swig_path = os.path.join(os.path.abspath('.'), 'swigwin-4.0.1')
new_path = swig_path + os.path.pathsep + path
os.putenv('PATH', new_path)
print('New $PATH:')
pprint(new_path.split(os.path.pathsep))
def install_dependencies():
print('[*] Installing dependencies')
ret = pyexec('pip', 'install', '-r', 'requirements.txt', executable='python')
if ret:
print('[-] Failed to install dependencies')
exit(1)
def try_import_packages():
try:
import hexdump
import websockets
import Cryptodome
import smartcard
except ImportError as e:
print('[-] Can not import one of dependencies: %s' % e.name)
exit(1)
def finish():
print('[!] We are good to go!')
print('[*] Follow post-installation instructions to setup root certiciate and run the program')
if __name__ == '__main__':
check_version()
install_virtualenv()
load_virtualenv()
load_swig()
install_dependencies()
try_import_packages()
finish()