pyarmor 8.2.7__zip → 8.2.8__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyarmor-8.2.7 → pyarmor-8.2.8}/PKG-INFO +1 -1
- {pyarmor-8.2.7 → pyarmor-8.2.8}/pyarmor.egg-info/PKG-INFO +1 -1
- {pyarmor-8.2.7 → pyarmor-8.2.8}/pyarmor.egg-info/SOURCES.txt +1 -0
- pyarmor-8.2.8/pyarmor.egg-info/requires.txt +1 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/setup.py +1 -1
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/__init__.py +1 -1
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/bootstrap.py +1 -1
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/default.cfg +2 -2
- pyarmor-8.2.8/src/cli/docker.py +153 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/register.py +26 -5
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/repack.py +2 -1
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/config.py +1 -1
- pyarmor-8.2.7/pyarmor.egg-info/requires.txt +0 -1
- {pyarmor-8.2.7 → pyarmor-8.2.8}/MANIFEST.in +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/README.md +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/pyarmor.egg-info/dependency_links.txt +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/pyarmor.egg-info/entry_points.txt +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/pyarmor.egg-info/top_level.txt +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/setup.cfg +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/README.rst +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/__init__.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/benchmark.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/build_meta.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/__main__.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/config.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/context.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/generate.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/merge.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/mixer.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/plugin.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/public_capsule.zip +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/resource.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cli/shell.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/cobuilder.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/README-ZH.md +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/README.md +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/build-for-exe.bat +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/build-for-freeze.bat +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/build-with-project.bat +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/build-with-project.sh +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/cx_Freeze/hello.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/cx_Freeze/queens.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/cx_Freeze/setup.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/helloworld/foo.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/obfuscate-app.bat +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/obfuscate-app.sh +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/obfuscate-pkg.bat +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/obfuscate-pkg.sh +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pack-obfuscated-scripts.bat +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pack-obfuscated-scripts.sh +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/py2exe/hello.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/py2exe/queens.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/py2exe/setup.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Arithmetic.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Calls.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/CommandLine.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Constructs.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Dict.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Exceptions.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Imports.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Instances.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Lists.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Lookups.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/NewInstances.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Numbers.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Setup.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Strings.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/Tuples.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/With.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/clockres.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/package/__init__.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/package/submodule.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/pybench.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/pybench/systimes.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/simple/queens.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/testmod/hello.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/testmod/queens.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/testpkg/main.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/testpkg/mypkg/__init__.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/examples/testpkg/mypkg/foo.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/helper/__init__.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/helper/build_data_module.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/helper/buildext.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/helper/get_bind_key.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/helper/get_license_info.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/helper/get_platform_name.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/helper/merge.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/helper/repack.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/helper/superuntime.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/license.tri +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/packer.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/platforms/darwin/x86_64/_pytransform.dylib +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/platforms/linux/x86/_pytransform.so +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/platforms/linux/x86_64/_pytransform.so +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/platforms/windows/x86/_pytransform.dll +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/platforms/windows/x86_64/_pytransform.dll +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/plugins/README.md +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/plugins/check_ntp_time.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/polyfills/__init__.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/polyfills/argparse.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/product.key +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/project.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/protect_code.pt +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/protect_code2.pt +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/public.key +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/public_capsule.zip +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/pyarmor-webui.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/pyarmor.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/pyshield.key +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/pyshield.lic +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/pytransform.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/reform.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/register.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/sppmode.py +0 -0
- {pyarmor-8.2.7 → pyarmor-8.2.8}/src/utils.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pyarmor.cli.core~=3.2.8
|
|
@@ -35,7 +35,7 @@ def check_prebuilt_runtime_library(platnames, extra=None, rtver=''):
|
|
|
35
35
|
'install it'.format('pyarmor.cli.core'))
|
|
36
36
|
|
|
37
37
|
instcmd = [sys.executable, '-m', 'pip', 'install',
|
|
38
|
-
|
|
38
|
+
'--disable-pip-version-check']
|
|
39
39
|
|
|
40
40
|
# Before Pyarmor 8.3, prefer to "pyarmor.cli.runtime"
|
|
41
41
|
# It could be disabled by
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
import socketserver
|
|
5
|
+
import struct
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
import docker
|
|
9
|
+
|
|
10
|
+
from .context import Context
|
|
11
|
+
from .generate import Builder, Pytransform3
|
|
12
|
+
from .register import Register
|
|
13
|
+
|
|
14
|
+
PORT = 29092
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def get_docker_gateway(client):
|
|
18
|
+
filters = {
|
|
19
|
+
'driver': 'bridge',
|
|
20
|
+
'type': 'builtin'
|
|
21
|
+
}
|
|
22
|
+
networks = client.networks.list(filters=filters)
|
|
23
|
+
return networks[0].attrs['IPAM']['Config'][0]['Gateway']
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class DockerAuthHandler(socketserver.BaseRequestHandler):
|
|
27
|
+
|
|
28
|
+
WORKPATH = os.path.expanduser(os.path.join('~', '.pyarmor', 'docker'))
|
|
29
|
+
CTX = None
|
|
30
|
+
CLIENT = None
|
|
31
|
+
|
|
32
|
+
def handle(self):
|
|
33
|
+
data = self.request.recv(64)
|
|
34
|
+
logging.info('receive request from %s', self.client_address)
|
|
35
|
+
try:
|
|
36
|
+
logging.debug('data (%d): %s', len(data), data)
|
|
37
|
+
self.process(data)
|
|
38
|
+
logging.info('send auth result to %s', self.client_address)
|
|
39
|
+
except Exception as e:
|
|
40
|
+
logging.error('%s', str(e))
|
|
41
|
+
msg = 'failed to verify docker, please check host console'.encode()
|
|
42
|
+
msg += b'\00'
|
|
43
|
+
self.request.send(struct.pack('!HH', 1, len(msg)) + msg)
|
|
44
|
+
|
|
45
|
+
def copy_file_into_docker(self, containerid, filename):
|
|
46
|
+
from subprocess import check_call
|
|
47
|
+
check_call(['docker', 'cp', filename, '%s:/' % containerid])
|
|
48
|
+
|
|
49
|
+
def get_container_info(self, client, shortid):
|
|
50
|
+
try:
|
|
51
|
+
container = client.container.get(shortid)
|
|
52
|
+
return container.attrs
|
|
53
|
+
except docker.errors.NotFound:
|
|
54
|
+
pass
|
|
55
|
+
except docker.errors.APIError:
|
|
56
|
+
pass
|
|
57
|
+
|
|
58
|
+
def process(self, packet):
|
|
59
|
+
if packet[:4] == b'PADH':
|
|
60
|
+
self.request.send(self.MACHID)
|
|
61
|
+
return
|
|
62
|
+
|
|
63
|
+
container = self.get_container(self.client_address[0])
|
|
64
|
+
state = container.attrs['State']
|
|
65
|
+
if state.get('Status') == 'running' and state.get('Running'):
|
|
66
|
+
# 2023-06-15T23:51:03.287483366Z
|
|
67
|
+
# state.get('StartedAt')
|
|
68
|
+
# bridge = container.attrs['NetworkSettings']['Networks']['bridge']
|
|
69
|
+
# bridge['MacAddress']
|
|
70
|
+
# bridge['Gateway'] and bridge['IPAddress']
|
|
71
|
+
# bridge['IPv6Gateway'] and bridge['GlobalIPv6Address']
|
|
72
|
+
userdata = self.parse_packet(packet)
|
|
73
|
+
keydata = self.generate_runtime_key(userdata.decode('utf-8'))
|
|
74
|
+
self.request.send(struct.pack('!HH', 0, len(keydata)) + keydata)
|
|
75
|
+
|
|
76
|
+
def parse_packet(self, packet):
|
|
77
|
+
if len(packet) == 32 and packet[:4] == b'PADK':
|
|
78
|
+
return packet[12:]
|
|
79
|
+
raise RuntimeError('invalid auth request')
|
|
80
|
+
|
|
81
|
+
def generate_runtime_key(self, userdata):
|
|
82
|
+
ctx = self.CTX
|
|
83
|
+
ctx.cmd_options['user_data'] = userdata
|
|
84
|
+
return Builder(ctx).generate_runtime_key()
|
|
85
|
+
|
|
86
|
+
def get_container(self, ipaddr):
|
|
87
|
+
filters = {
|
|
88
|
+
'driver': 'bridge',
|
|
89
|
+
'type': 'builtin'
|
|
90
|
+
}
|
|
91
|
+
networks = self.CLIENT.networks.list(filters=filters, greedy=True)
|
|
92
|
+
containers = networks[0].attrs.get('Containers')
|
|
93
|
+
if containers:
|
|
94
|
+
marker = ipaddr + '/'
|
|
95
|
+
for dockid, netattr in containers.items():
|
|
96
|
+
if netattr.get('IPv4Address').startswith(marker):
|
|
97
|
+
return self.CLIENT.containers.get(dockid)
|
|
98
|
+
raise RuntimeError('no found countainer with IPv4 %s' % ipaddr)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def register_pyarmor(ctx, regfile):
|
|
102
|
+
reg = Register(ctx)
|
|
103
|
+
logging.info('register "%s"', regfile)
|
|
104
|
+
reg.register_regfile(regfile)
|
|
105
|
+
if reg.license_info['features'] < 15:
|
|
106
|
+
raise RuntimeError('this feature is only for group license')
|
|
107
|
+
|
|
108
|
+
machid = reg._get_machine_id()
|
|
109
|
+
logging.debug('machine id: %s', machid)
|
|
110
|
+
DockerAuthHandler.MACHID = machid
|
|
111
|
+
|
|
112
|
+
Pytransform3._update_token(ctx)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def main_entry():
|
|
116
|
+
parser = argparse.ArgumentParser()
|
|
117
|
+
parser.add_argument('-p', '--port', type=int, default=PORT)
|
|
118
|
+
parser.add_argument('-s', '--sock', default='/var/run/docker.sock',
|
|
119
|
+
help=argparse.SUPPRESS)
|
|
120
|
+
parser.add_argument('--home', help=argparse.SUPPRESS)
|
|
121
|
+
parser.add_argument('regfile', nargs=1,
|
|
122
|
+
help='group device registration file for this machine')
|
|
123
|
+
args = parser.parse_args(sys.argv[1:])
|
|
124
|
+
|
|
125
|
+
home = DockerAuthHandler.WORKPATH
|
|
126
|
+
if args.home:
|
|
127
|
+
DockerAuthHandler.WORKPATH = args.home
|
|
128
|
+
home = args.home
|
|
129
|
+
logging.info('work path: %s', home)
|
|
130
|
+
|
|
131
|
+
ctx = Context(home=os.path.expanduser(home))
|
|
132
|
+
register_pyarmor(ctx, args.regfile[0])
|
|
133
|
+
DockerAuthHandler.CTX = ctx
|
|
134
|
+
|
|
135
|
+
client = docker.from_env()
|
|
136
|
+
host, port = get_docker_gateway(client), args.port
|
|
137
|
+
DockerAuthHandler.CLIENT = client
|
|
138
|
+
|
|
139
|
+
with socketserver.TCPServer((host, port), DockerAuthHandler) as server:
|
|
140
|
+
logging.info('listen docker auth request on %s:%s', host, args.port)
|
|
141
|
+
server.serve_forever()
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def main():
|
|
145
|
+
logging.basicConfig(
|
|
146
|
+
level=logging.INFO,
|
|
147
|
+
format='%(asctime)s: %(message)s',
|
|
148
|
+
)
|
|
149
|
+
main_entry()
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
if __name__ == '__main__':
|
|
153
|
+
main()
|
|
@@ -153,11 +153,15 @@ class Register(object):
|
|
|
153
153
|
f.extract(item, path=path)
|
|
154
154
|
namelist = f.namelist()
|
|
155
155
|
if 'group.tokens' in namelist:
|
|
156
|
-
machid = self._get_machine_id()
|
|
157
|
-
name = '/'.join(['tokens', machid
|
|
156
|
+
machid = self._get_machine_id().decode('utf-8')
|
|
157
|
+
name = '/'.join(['tokens', machid])
|
|
158
158
|
if name not in namelist:
|
|
159
|
-
|
|
160
|
-
|
|
159
|
+
machid = self._get_docker_hostname()
|
|
160
|
+
hostname = '/'.join(['tokens', machid])
|
|
161
|
+
if hostname not in namelist:
|
|
162
|
+
logger.debug('no found "%s" in offline regfile', name)
|
|
163
|
+
raise CliError('this regfile is not for this device')
|
|
164
|
+
name = hostname
|
|
161
165
|
logger.debug('extracting %s', name)
|
|
162
166
|
self.ctx.save_token(f.read(name))
|
|
163
167
|
return
|
|
@@ -168,9 +172,26 @@ class Register(object):
|
|
|
168
172
|
logger.info('update license token')
|
|
169
173
|
self.update_token()
|
|
170
174
|
|
|
175
|
+
def _get_docker_hostname(self):
|
|
176
|
+
try:
|
|
177
|
+
from socket import socket, AF_INET, SOCK_STREAM
|
|
178
|
+
host = 'host.docker.internal'
|
|
179
|
+
port = 29092
|
|
180
|
+
with socket(AF_INET, SOCK_STREAM) as s:
|
|
181
|
+
s.connect((host, port))
|
|
182
|
+
s.sendall(b'PADH' + b'x' * 60)
|
|
183
|
+
flag = s.recv(1)
|
|
184
|
+
if flag in (b'a', b'b'):
|
|
185
|
+
data = s.recv(32)
|
|
186
|
+
machid = (flag + data).decode('utf-8')
|
|
187
|
+
logger.info('got docker host machine id: %s', machid)
|
|
188
|
+
return machid
|
|
189
|
+
except Exception:
|
|
190
|
+
pass
|
|
191
|
+
|
|
171
192
|
def _get_machine_id(self):
|
|
172
193
|
from .core import Pytransform3
|
|
173
|
-
return Pytransform3.get_hd_info(
|
|
194
|
+
return Pytransform3.get_hd_info(11)
|
|
174
195
|
|
|
175
196
|
def generate_group_device(self, devid):
|
|
176
197
|
path = self.ctx.group_device_file(devid)
|
|
@@ -134,7 +134,8 @@ class CArchiveWriter2(CArchiveWriter):
|
|
|
134
134
|
return
|
|
135
135
|
|
|
136
136
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
137
|
-
pathname = os.path.join(tmpdir,
|
|
137
|
+
pathname = os.path.join(tmpdir,
|
|
138
|
+
name.replace('/', '_').replace('\\', '_'))
|
|
138
139
|
with open(pathname, 'wb') as f:
|
|
139
140
|
f.write(rawdata)
|
|
140
141
|
if typecode in (PKG_ITEM_PYSOURCE, PKG_ITEM_PYMODULE,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
pyarmor.cli.core~=3.2.6
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|