1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
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))
|