mainQmera3.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. import time
  2. import flask
  3. from flask import Flask, request
  4. import requests
  5. from PIL import ImageFile, Image
  6. import os
  7. import shutil
  8. import subprocess
  9. from zipfile import ZipFile
  10. ImageFile.SAFEBLOCK = 2048*2048
  11. app = Flask(__name__)
  12. app.base_project = "/apps/3ps/build_apk/QmeraLite"
  13. # app.base_project = "/Users/easysoft/Documents/QmeraLite"
  14. app.temp_folder = "/apps/3ps/build_apk/BuildApk"
  15. # app.temp_folder = "/Users/easysoft/BuildApk"
  16. app.apk_folder = "/var/www/html/qmera/dashboardv2/uploads"
  17. # app.apk_folder = "/Users/easysoft/"
  18. app.verbose = True
  19. app.ssl =('/etc/ssl/STAR_qmera_io/qmera_io.crt', '/etc/ssl/STAR_qmera_io/qmera.key')
  20. # app.ssl = None
  21. app.keytool = '/usr/bin/keytool'
  22. app.base_project_name = os.path.basename(app.base_project)
  23. def vprint(*data):
  24. if app.verbose:
  25. print(*data)
  26. def create_folder(package_id):
  27. path = os.path.join(app.temp_folder, package_id)
  28. if not os.path.exists(path):
  29. os.mkdir(path)
  30. else:
  31. shutil.rmtree(path)
  32. os.mkdir(path)
  33. vprint(path)
  34. path_dest = os.path.join(path,app.base_project_name)
  35. if not os.path.exists(path_dest):
  36. shutil.copytree(app.base_project, path_dest)
  37. code_path = "app/src/main/java/"
  38. orig_code = "com/example/qmeralitesamplecode"
  39. path_package_id = package_id.replace(".","/")
  40. c_code_path = os.path.join(path_dest, code_path, path_package_id)
  41. orig_code_path = os.path.join(path_dest, code_path, orig_code)
  42. if not os.path.exists(c_code_path):
  43. shutil.copytree(orig_code_path,c_code_path)
  44. shutil.rmtree(orig_code_path)
  45. return path_dest, c_code_path
  46. def change_acc(c_code_path, acc):
  47. main_activity = os.path.join(c_code_path, "MainActivity.java")
  48. with open(main_activity, "r") as f:
  49. file_source = f.read()
  50. replaced = file_source.replace("***REPLACE***WITH***YOUR***QMERA***ACCOUNT***",acc)
  51. with open(main_activity, "w") as f:
  52. f.write(replaced)
  53. def change_url(c_code_path, url):
  54. main_activity = os.path.join(c_code_path, "MainActivity.java")
  55. with open(main_activity, "r") as f:
  56. file_source = f.read()
  57. replaced = file_source.replace("https://www.google.com",url)
  58. with open(main_activity, "w") as f:
  59. f.write(replaced)
  60. def change_name(path_dest, name):
  61. manifest = os.path.join(path_dest, "app/src/main/AndroidManifest.xml")
  62. with open(manifest, "r") as f:
  63. file_source = f.read()
  64. replaced = file_source.replace("QmeraLite", name)
  65. with open(manifest, "w") as f:
  66. f.write(replaced)
  67. def change_package(path_dest, package):
  68. build_gradle = os.path.join(path_dest, 'app/build.gradle')
  69. with open(build_gradle, "r") as f:
  70. file_source = f.read()
  71. replaced = file_source.replace("com.example.qmeralitesamplecode", package)
  72. with open(build_gradle, "w") as f:
  73. f.write(replaced)
  74. manifest = os.path.join(path_dest, "app/src/main/AndroidManifest.xml")
  75. with open(manifest, "r") as f:
  76. file_source = f.read()
  77. replaced = file_source.replace("com.example.qmeralitesamplecode", package)
  78. with open(manifest, "w") as f:
  79. f.write(replaced)
  80. path_package_id = package.replace(".", "/")
  81. code_path = "app/src/main/java/"
  82. code_path = os.path.join(path_dest,code_path,path_package_id)
  83. res_path = "app/src/main/res/"
  84. res_path = os.path.join(path_dest, res_path)
  85. javas = [os.path.join(dp, f) for dp, dn, filenames in os.walk(code_path) for f in filenames]
  86. res = [os.path.join(dp, f) for dp, dn, filenames in os.walk(res_path) for f in filenames if "xml" in f]
  87. for j in javas:
  88. print(j)
  89. with open(j, "r") as f:
  90. file_source = f.read()
  91. replaced = file_source.replace("com.example.qmeralitesamplecode", package)
  92. with open(j, "w") as f:
  93. f.write(replaced)
  94. for j in res:
  95. print(j)
  96. with open(j, "r") as f:
  97. file_source = f.read()
  98. replaced = file_source.replace("com.example.qmeralitesamplecode", package)
  99. with open(j, "w") as f:
  100. f.write(replaced)
  101. def change_logo(path_dest, logo):
  102. img_path = "app/src/main/res/drawable/ic_launcher.png"
  103. img_path = os.path.join(path_dest, img_path)
  104. if isinstance(logo,str):
  105. logo = requests.get('https://qmera.io/dashboardv2/uploads/logo/{}'.format(logo))
  106. with open(img_path, "wb") as f:
  107. f.write(logo.content)
  108. with open(img_path, "rb") as f:
  109. logo = Image.open(f)
  110. logo = logo.resize((150, 150))
  111. logo.save(img_path, "PNG")
  112. else:
  113. logo = Image.open(logo)
  114. logo = logo.resize((150,150))
  115. logo.save(img_path,"PNG")
  116. def change_certificate(path_dest, key, keyfile, keytool):
  117. keyfile_name = "{}.keystore".format(key["alias"])
  118. keyfile_path = os.path.join(path_dest, keyfile_name)
  119. if keyfile:
  120. keyfile.save(keyfile_path)
  121. else:
  122. vprint("keytool run")
  123. os.chdir(path_dest)
  124. vprint("current working directory: ", os.getcwd())
  125. 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"])
  126. cmd = [keytool, "-genkey", "-v", "-keystore", keyfile_path, "-alias", key["alias"], "-keyalg", "RSA", "-keysize", "2048",
  127. "-validity", "10000", "-dname", dname, "-storepass", key["password"], "-keypass", key["password"]]
  128. vprint(cmd)
  129. subprocess.run(cmd)
  130. vprint("keytool end")
  131. build_gradle = os.path.join(path_dest, 'app/build.gradle')
  132. with open(build_gradle, "r") as f:
  133. file_source = f.read()
  134. replaced = file_source.replace("allyourbase", key["password"])
  135. replaced = replaced.replace("key-qmeralite", key["alias"])
  136. with open(build_gradle, "w") as f:
  137. f.write(replaced)
  138. def run_build(path_dest):
  139. gradlew = os.path.join(path_dest,"gradlew")
  140. ret = subprocess.run([gradlew, 'assembleRelease'])
  141. if ret.returncode == 0:
  142. ret = subprocess.run([gradlew, 'bundleRelease'])
  143. return ret.returncode
  144. def deliver_apk(path_dest, package_id, key, key_exists):
  145. apk_dir = os.path.join(path_dest,'app/build/outputs/apk/release/app-release.apk')
  146. aab_dir = os.path.join(path_dest,'app/build/outputs/bundle/release/app-release.aab')
  147. keystore_name = '{}.keystore'.format(key["alias"])
  148. keystore_dir = os.path.join(path_dest,keystore_name)
  149. timenow = time.time()
  150. apk_name = "{}{}.apk".format(package_id,timenow)
  151. aab_name = "{}{}.aab".format(package_id,timenow)
  152. zip_name = "{}{}.zip".format(package_id,timenow)
  153. new_apk_dir = os.path.join(app.apk_folder,apk_name)
  154. new_aab_dir = os.path.join(app.apk_folder,aab_name)
  155. new_dir = os.path.join(app.apk_folder,zip_name)
  156. vprint(apk_dir)
  157. try:
  158. shutil.move(apk_dir, new_apk_dir)
  159. shutil.move(aab_dir, new_aab_dir)
  160. with ZipFile(new_dir, 'w') as zip_file:
  161. zip_file.write(new_apk_dir,os.path.basename(new_apk_dir))
  162. zip_file.write(new_aab_dir, os.path.basename(new_aab_dir))
  163. if not key_exists:
  164. zip_file.write(keystore_dir,os.path.basename(keystore_dir))
  165. os.remove(new_apk_dir)
  166. os.remove(new_aab_dir)
  167. project_path = os.path.join(app.temp_folder, package_id)
  168. shutil.rmtree(project_path)
  169. return {"name": zip_name}
  170. except Exception as e:
  171. return str(e)
  172. @app.route('/', methods=["GET","POST"])
  173. def build_apk():
  174. vprint('==============================================================')
  175. if request.method == 'POST':
  176. logo = None
  177. app_name = "QmeraLite"
  178. package_id = "com.app.qmera"
  179. acc = None
  180. url = None
  181. keystore = None
  182. key_exists = False
  183. key = {"alias": "qmeralite", "password": "allyourbase", "common_name": "all", "organization_unit": "your",
  184. "organization_name": "base", "locality_name": "are", "state_name": "belong", "country": "to"}
  185. if 'logo' in request.files:
  186. logo = request.files['logo']
  187. vprint(type(logo))
  188. elif 'logo' in request.form:
  189. logo = request.form['logo']
  190. vprint(type(logo))
  191. if 'app_name' in request.files:
  192. app_name = request.files['app_name']
  193. vprint(app_name)
  194. elif 'app_name' in request.form:
  195. app_name = request.form['app_name']
  196. vprint(app_name)
  197. if 'package_id' in request.files:
  198. package_id = request.files['package_id']
  199. vprint(package_id)
  200. elif 'package_id' in request.form:
  201. package_id = request.form['package_id']
  202. vprint(package_id)
  203. if 'acc' in request.files:
  204. acc = request.files['acc']
  205. vprint(acc)
  206. elif 'acc' in request.form:
  207. acc = request.form['acc']
  208. vprint(acc)
  209. if 'url' in request.files:
  210. url = request.files['url']
  211. vprint(url)
  212. elif 'url' in request.form:
  213. url = request.form['url']
  214. vprint(url)
  215. if 'keystore' in request.files:
  216. keystore = request.files['keystore']
  217. key_exists = True
  218. elif 'keystore' in request.form:
  219. keystore = request.form['keystore']
  220. key_exists = True
  221. if 'alias' in request.form:
  222. if request.form['alias']:
  223. key["alias"] = request.form['alias']
  224. if 'password' in request.form:
  225. if request.form['password']:
  226. key["password"] = request.form['password']
  227. if keystore:
  228. if 'common_name' in request.form:
  229. if request.form['common_name']:
  230. key["common_name"] = request.form['common_name']
  231. if 'organization_unit' in request.form:
  232. if request.form['organization_unit']:
  233. key["organization_unit"] = request.form['organization_unit']
  234. if 'organization_name' in request.form:
  235. if request.form['organization_name']:
  236. key["organization_name"] = request.form['organization_name']
  237. if 'locality_name' in request.form:
  238. if request.form['locality_name']:
  239. key["locality_name"] = request.form['locality_name']
  240. if 'state_name' in request.form:
  241. if request.form['state_name']:
  242. key["state_name"] = request.form['state_name']
  243. if 'country' in request.form:
  244. if request.form['country']:
  245. key["country"] = request.form['country']
  246. path_dest, c_code_path = create_folder(package_id)
  247. vprint("path_dest: " + path_dest)
  248. vprint("c_code_path: "+c_code_path)
  249. if acc:
  250. change_acc(c_code_path, acc)
  251. if url:
  252. change_url(c_code_path, url)
  253. change_name(path_dest, app_name)
  254. change_certificate(path_dest, key, keystore, app.keytool)
  255. change_package(path_dest,package_id)
  256. if logo:
  257. change_logo(path_dest,logo)
  258. os.chdir(path_dest)
  259. return_code = run_build(path_dest)
  260. if(return_code == 0):
  261. return deliver_apk(path_dest,package_id,key,key_exists)
  262. return "h"
  263. else:
  264. if 'e' in request.args:
  265. return request.args['e']
  266. return "Hello World!"
  267. if __name__ == '__main__':
  268. app.run(host='0.0.0.0', port=8090, debug=app.verbose, ssl_context=app.ssl)