123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- import time
- import flask
- from flask import Flask, request
- import requests
- from PIL import ImageFile, Image
- import os
- import shutil
- import subprocess
- from zipfile import ZipFile
- ImageFile.SAFEBLOCK = 2048*2048
- app = Flask(__name__)
- app.base_project = "/apps/3ps/build_apk/QmeraLite"
- # app.base_project = "/Users/easysoft/Documents/QmeraLite"
- app.temp_folder = "/apps/3ps/build_apk/BuildApk"
- # app.temp_folder = "/Users/easysoft/BuildApk"
- app.apk_folder = "/var/www/html/qmera/dashboardv2/uploads"
- # app.apk_folder = "/Users/easysoft/"
- app.verbose = True
- app.ssl =('/etc/ssl/STAR_qmera_io/qmera_io.crt', '/etc/ssl/STAR_qmera_io/qmera.key')
- # app.ssl = None
- app.keytool = '/usr/bin/keytool'
- app.base_project_name = os.path.basename(app.base_project)
- def vprint(*data):
- if app.verbose:
- print(*data)
- def create_folder(package_id):
- path = os.path.join(app.temp_folder, package_id)
- if not os.path.exists(path):
- os.mkdir(path)
- else:
- shutil.rmtree(path)
- os.mkdir(path)
- vprint(path)
- path_dest = os.path.join(path,app.base_project_name)
- if not os.path.exists(path_dest):
- shutil.copytree(app.base_project, path_dest)
- code_path = "app/src/main/java/"
- orig_code = "com/example/qmeralitesamplecode"
- path_package_id = package_id.replace(".","/")
- c_code_path = os.path.join(path_dest, code_path, path_package_id)
- orig_code_path = os.path.join(path_dest, code_path, orig_code)
- if not os.path.exists(c_code_path):
- shutil.copytree(orig_code_path,c_code_path)
- shutil.rmtree(orig_code_path)
- return path_dest, c_code_path
- def change_acc(c_code_path, acc):
- main_activity = os.path.join(c_code_path, "MainActivity.java")
- with open(main_activity, "r") as f:
- file_source = f.read()
- replaced = file_source.replace("***REPLACE***WITH***YOUR***QMERA***ACCOUNT***",acc)
- with open(main_activity, "w") as f:
- f.write(replaced)
- def change_url(c_code_path, url):
- main_activity = os.path.join(c_code_path, "MainActivity.java")
- with open(main_activity, "r") as f:
- file_source = f.read()
- replaced = file_source.replace("https://www.google.com",url)
- with open(main_activity, "w") as f:
- f.write(replaced)
- def change_name(path_dest, name):
- manifest = os.path.join(path_dest, "app/src/main/AndroidManifest.xml")
- with open(manifest, "r") as f:
- file_source = f.read()
- replaced = file_source.replace("QmeraLite", name)
- with open(manifest, "w") as f:
- f.write(replaced)
- def change_package(path_dest, package):
- build_gradle = os.path.join(path_dest, 'app/build.gradle')
- with open(build_gradle, "r") as f:
- file_source = f.read()
- replaced = file_source.replace("com.example.qmeralitesamplecode", package)
- with open(build_gradle, "w") as f:
- f.write(replaced)
- manifest = os.path.join(path_dest, "app/src/main/AndroidManifest.xml")
- with open(manifest, "r") as f:
- file_source = f.read()
- replaced = file_source.replace("com.example.qmeralitesamplecode", package)
- with open(manifest, "w") as f:
- f.write(replaced)
- path_package_id = package.replace(".", "/")
- code_path = "app/src/main/java/"
- code_path = os.path.join(path_dest,code_path,path_package_id)
- javas = [os.path.join(dp, f) for dp, dn, filenames in os.walk(code_path) for f in filenames]
- for j in javas:
- print(j)
- with open(j, "r") as f:
- file_source = f.read()
- replaced = file_source.replace("com.example.qmeralitesamplecode", package)
- with open(j, "w") as f:
- f.write(replaced)
- def change_logo(path_dest, logo):
- img_path = "app/src/main/res/drawable/ic_launcher.png"
- img_path = os.path.join(path_dest, img_path)
- if isinstance(logo,str):
- logo = requests.get('https://qmera.io/dashboardv2/uploads/logo/{}'.format(logo))
- with open(img_path, "wb") as f:
- f.write(logo.content)
- with open(img_path, "rb") as f:
- logo = Image.open(f)
- logo = logo.resize((150, 150))
- logo.save(img_path, "PNG")
- else:
- logo = Image.open(logo)
- logo = logo.resize((150,150))
- logo.save(img_path,"PNG")
- def change_certificate(path_dest, key, keyfile, keytool):
- keyfile_name = "{}.keystore".format(key["alias"])
- keyfile_path = os.path.join(path_dest, keyfile_name)
- if keyfile:
- with open(keyfile_path, "wb") as f:
- f.write(keyfile)
- else:
- dname = "CN={}, OU={}, O={}, L={}, S={}, C={}".format(key["common_name"], key["organization_unit"], key["organization_name"], key["locality_name"], key["state_name"], key["country"])
- cmd = [keytool, "-genkey", "-v", "-keystore", keyfile_path, "-alias", key["alias"], "-keyalg", "RSA", "-keysize", "2048",
- "-validity", "10000", "-dname", dname, "-storepass", key["password"], "-keypass", key["password"]]
- subprocess.run(cmd)
- build_gradle = os.path.join(path_dest, 'app/build.gradle')
- with open(build_gradle, "r") as f:
- file_source = f.read()
- replaced = file_source.replace("allyourbase", key["password"])
- replaced = replaced.replace("key-qmeralite", key["alias"])
- with open(build_gradle, "w") as f:
- f.write(replaced)
- def run_build(path_dest):
- gradlew = os.path.join(path_dest,"gradlew")
- ret = subprocess.run([gradlew, 'assembleRelease'])
- return ret.returncode
- def deliver_apk(path_dest, package_id, key, key_exists):
- apk_dir = os.path.join(path_dest,'app/build/outputs/apk/release/app-release.apk')
- keystore_name = '{}.keystore'.format(key["alias"])
- keystore_dir = os.path.join(path_dest,keystore_name)
- apk_name = "{}{}.apk".format(package_id,time.time())
- zip_name = "{}{}.zip".format(package_id,time.time())
- new_apk_dir = os.path.join(app.apk_folder,apk_name)
- new_dir = os.path.join(app.apk_folder,zip_name)
- vprint(apk_dir)
- try:
- shutil.move(apk_dir,new_apk_dir)
- with ZipFile(new_dir, 'w') as zip_file:
- zip_file.write(new_apk_dir,os.path.basename(apk_name))
- if not key_exists:
- zip_file.write(keystore_dir,os.path.basename(keystore_dir))
- os.remove(new_apk_dir)
- return {"name": zip_name}
- except Exception as e:
- return str(e)
- @app.route('/', methods=["GET","POST"])
- def build_apk():
- vprint('==============================================================')
- if request.method == 'POST':
- logo = None
- app_name = "QmeraLite"
- package_id = "com.app.qmera"
- acc = None
- url = None
- keystore = None
- key_exists = False
- key = {"alias": "qmeralite", "password": "allyourbase", "common_name": "all", "organization_unit": "your",
- "organization_name": "base", "locality_name": "are", "state_name": "belong", "country": "to"}
- if 'logo' in request.files:
- logo = request.files['logo']
- vprint(type(logo))
- elif 'logo' in request.form:
- logo = request.form['logo']
- vprint(type(logo))
-
- if 'app_name' in request.files:
- app_name = request.files['app_name']
- vprint(app_name)
- elif 'app_name' in request.form:
- app_name = request.form['app_name']
- vprint(app_name)
-
- if 'package_id' in request.files:
- package_id = request.files['package_id']
- vprint(package_id)
- elif 'package_id' in request.form:
- package_id = request.form['package_id']
- vprint(package_id)
-
- if 'acc' in request.files:
- acc = request.files['acc']
- vprint(acc)
- elif 'acc' in request.form:
- acc = request.form['acc']
- vprint(acc)
-
- if 'url' in request.files:
- url = request.files['url']
- vprint(url)
- elif 'url' in request.form:
- url = request.form['url']
- vprint(url)
- if 'keystore' in request.files:
- keystore = request.files['keystore']
- key_exists = True
- elif 'keystore' in request.form:
- keystore = request.form['keystore']
- key_exists = True
- if 'alias' in request.form:
- key["alias"] = request.form['alias']
- if 'password' in request.form:
- if request.form['password']:
- key["password"] = request.form['password']
- if keystore:
- if 'common_name' in request.form:
- if request.form['common_name']:
- key["common_name"] = request.form['common_name']
- if 'organization_unit' in request.form:
- if request.form['organization_unit']:
- key["organization_unit"] = request.form['organization_unit']
- if 'organization_name' in request.form:
- if request.form['organization_name']:
- key["organization_name"] = request.form['organization_name']
- if 'locality_name' in request.form:
- if request.form['locality_name']:
- key["locality_name"] = request.form['locality_name']
- if 'state_name' in request.form:
- if request.form['state_name']:
- key["state_name"] = request.form['state_name']
- if 'country' in request.form:
- if request.form['country']:
- key["country"] = request.form['country']
- path_dest, c_code_path = create_folder(package_id)
- vprint("path_dest: " + path_dest)
- vprint("c_code_path: "+c_code_path)
- if acc:
- change_acc(c_code_path, acc)
- if url:
- change_url(c_code_path, url)
- change_name(path_dest, app_name)
- change_certificate(path_dest, key, keystore, app.keytool)
- change_package(path_dest,package_id)
- if logo:
- change_logo(path_dest,logo)
- os.chdir(path_dest)
- return_code = run_build(path_dest)
- if(return_code == 0):
- return deliver_apk(path_dest,package_id,key,key_exists)
- return "h"
- else:
- if 'e' in request.args:
- return request.args['e']
- return "Hello World!"
- if __name__ == '__main__':
- app.run(host='0.0.0.0', port=8090, debug=app.verbose, ssl_context=app.ssl)
|