1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- import argparse
- import os
- import tarfile
- import contextlib
- import hashlib
- import base64
- import io
- stub = """#!/usr/bin/env python
- info = {info}
- data = "{data}"
- import platform
- import os
- import sys
- import tarfile
- import contextlib
- import io
- import base64
- def current_platform():
- arch = platform.machine().upper()
- if arch == 'AMD64':
- arch = 'X86_64'
- platf = platform.system().upper()
- if platf.startswith('WIN'):
- platf = 'WIN'
- return (platf + '-' + arch).lower()
- def extract_file(fname):
- with contextlib.closing(tarfile.open(fileobj=io.BytesIO(base64.b64decode(data)))) as f:
- return f.extractfile(fname).read()
- fname = info[current_platform()]
- my_path = os.path.realpath(os.path.abspath(__file__))
- tmp_path = my_path + '.tmp'
- with open(tmp_path, 'wb') as f:
- f.write(extract_file(fname))
- os.rename(tmp_path, my_path)
- os.chmod(my_path, 0775)
- os.execv(sys.argv[0], sys.argv)
- """
- def gen_ub(output, data):
- info = {}
- binary = io.BytesIO()
- with contextlib.closing(tarfile.open(mode='w:bz2', fileobj=binary, dereference=True)) as f:
- for pl, path in data:
- fname = os.path.basename(path)
- pl = pl.split('-')
- pl = pl[1] + '-' + pl[2]
- info[pl] = fname
- f.add(path, arcname=fname)
- binary = binary.getvalue()
- info['md5'] = hashlib.md5(binary).hexdigest()
- with open(output, 'w') as f:
- f.write(stub.format(info=info, data=base64.b64encode(binary)))
- os.chmod(output, 0775)
- if __name__ == '__main__':
- parser = argparse.ArgumentParser()
- parser.add_argument('--path', action='append')
- parser.add_argument('--platform', action='append')
- parser.add_argument('--output', action='store')
- args = parser.parse_args()
- gen_ub(args.output, zip(args.platform, args.path))
|