def _check(args): '''Check consistency of project.''' project = Project() project.open(args.project) logging.info('Check project %s ...', args.project) project._check(args.project) logging.info('Check project OK.')
def _build(args): '''Build project, obfuscate all scripts in the project.''' project = Project() project.open(args.project) logging.info('Build project %s ...', args.project) logging.info('Check project') project._check(args.project) pro_path = args.project \ if args.project == '' or os.path.exists(args.project) \ else os.path.dirname(args.project) capsule = build_path(project.capsule, pro_path) logging.info('Use capsule: %s', capsule) output = build_path(project.output, pro_path) \ if args.output is None else os.path.normpath(args.output) logging.info('Output path is: %s', output) platform = args.platform if args.platform else project.get('platform') if platform: logging.info('Taget platform is: %s', platform) check_cross_platform(platform) restrict = project.get('restrict_mode', 0 if project.get('disable_restrict_mode') else 1) if not args.only_runtime: src = project.src if os.path.abspath(output).startswith(src): excludes = ['prune %s' % os.path.abspath(output)[len(src)+1:]] else: excludes = [] files = project.get_build_files(args.force, excludes=excludes) soutput = os.path.join(output, os.path.basename(src)) \ if project.get('is_package') else output logging.info('Save obfuscated scripts to "%s"', soutput) if not os.path.exists(soutput): os.makedirs(soutput) logging.info('Read public key from capsule') prokey = get_product_key(capsule) logging.info('%s increment build', 'Disable' if args.force else 'Enable') logging.info('Search scripts from %s', src) logging.info('Obfuscate scripts with mode:') if hasattr(project, 'obf_mod'): obf_mod = project.obf_mod else: obf_mod = project.obf_module_mode == 'des' if hasattr(project, 'wrap_mode'): wrap_mode = project.wrap_mode obf_code = project.obf_code elif project.obf_code_mode == 'wrap': wrap_mode = 1 obf_code = 1 else: wrap_mode = 0 obf_code = 0 if project.obf_code_mode == 'none' else 1 adv_mode = (1 if project.advanced_mode else 0) \ if hasattr(project, 'advanced_mode') else 0 def v(t): return 'on' if t else 'off' logging.info('Obfuscating the whole module is %s', v(obf_mod)) logging.info('Obfuscating each function is %s', v(obf_code)) logging.info('Autowrap each code object mode is %s', v(wrap_mode)) logging.info('Advanced mode is %s', v(adv_mode)) logging.info('Restrict mode is %s', restrict) entries = [build_path(s.strip(), project.src) for s in project.entry.split(',')] if project.entry else [] protection = project.cross_protection \ if hasattr(project, 'cross_protection') else 1 if platform: if protection == 1: protection = platform elif not isinstance(protection, int): protection = ','.join([protection, platform]) for x in files: a, b = os.path.join(src, x), os.path.join(soutput, x) logging.info('\t%s -> %s', x, b) d = os.path.dirname(b) if not os.path.exists(d): os.makedirs(d) if entries and (os.path.abspath(a) in entries): vmode = adv_mode | 8 pcode = protection if hasattr(project, 'plugins'): plugins = project.plugins else: vmode = adv_mode pcode = 0 plugins = None encrypt_script(prokey, a, b, obf_code=obf_code, obf_mod=obf_mod, wrap_mode=wrap_mode, adv_mode=vmode, rest_mode=restrict, protection=pcode, plugins=plugins, rpath=project.runtime_path) logging.info('%d scripts has been obfuscated', len(files)) project['build_time'] = time.time() project.save(args.project) if project.entry: soutput = os.path.join(output, os.path.basename(project.src)) \ if project.get('is_package') else output package_runtime = project.get('package_runtime', 0) \ if args.package_runtime is None else args.package_runtime make_entry(project.entry, project.src, soutput, rpath=project.runtime_path, inner=(package_runtime != 2) and (not args.no_runtime)) if not args.no_runtime: routput = output if args.output is not None and args.only_runtime \ else os.path.join(output, os.path.basename(project.src)) \ if project.get('is_package') else output if not os.path.exists(routput): logging.info('Make path: %s', routput) os.mkdir(routput) package = project.get('package_runtime', 0) \ if args.package_runtime is None else args.package_runtime make_runtime(capsule, routput, platform=platform, package=package) if not restrict: licode = '*FLAGS:%c*CODE:PyArmor-Project' % chr(1) licpath = os.path.join(routput, 'pytransform') if package \ else routput licfile = os.path.join(licpath, license_filename) logging.info('Generate no restrict mode license file: %s', licfile) make_project_license(capsule, licode, licfile) logging.info('Build project OK.')