mainQmera2.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  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. javas = [os.path.join(dp, f) for dp, dn, filenames in os.walk(code_path) for f in filenames]
  84. for j in javas:
  85. print(j)
  86. with open(j, "r") as f:
  87. file_source = f.read()
  88. replaced = file_source.replace("com.example.qmeralitesamplecode", package)
  89. with open(j, "w") as f:
  90. f.write(replaced)
  91. def change_logo(path_dest, logo):
  92. img_path = "app/src/main/res/drawable/ic_launcher.png"
  93. img_path = os.path.join(path_dest, img_path)
  94. if isinstance(logo,str):
  95. logo = requests.get('https://qmera.io/dashboardv2/uploads/logo/{}'.format(logo))
  96. with open(img_path, "wb") as f:
  97. f.write(logo.content)
  98. with open(img_path, "rb") as f:
  99. logo = Image.open(f)
  100. logo = logo.resize((150, 150))
  101. logo.save(img_path, "PNG")
  102. else:
  103. logo = Image.open(logo)
  104. logo = logo.resize((150,150))
  105. logo.save(img_path,"PNG")
  106. def change_certificate(path_dest, key, keyfile, keytool):
  107. keyfile_name = "{}.keystore".format(key["alias"])
  108. keyfile_path = os.path.join(path_dest, keyfile_name)
  109. if keyfile:
  110. with open(keyfile_path, "wb") as f:
  111. f.write(keyfile)
  112. else:
  113. 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"])
  114. cmd = [keytool, "-genkey", "-v", "-keystore", keyfile_path, "-alias", key["alias"], "-keyalg", "RSA", "-keysize", "2048",
  115. "-validity", "10000", "-dname", dname, "-storepass", key["password"], "-keypass", key["password"]]
  116. subprocess.run(cmd)
  117. build_gradle = os.path.join(path_dest, 'app/build.gradle')
  118. with open(build_gradle, "r") as f:
  119. file_source = f.read()
  120. replaced = file_source.replace("allyourbase", key["password"])
  121. replaced = replaced.replace("key-qmeralite", key["alias"])
  122. with open(build_gradle, "w") as f:
  123. f.write(replaced)
  124. def run_build(path_dest):
  125. gradlew = os.path.join(path_dest,"gradlew")
  126. ret = subprocess.run([gradlew, 'assembleRelease'])
  127. return ret.returncode
  128. def deliver_apk(path_dest, package_id, key, key_exists):
  129. apk_dir = os.path.join(path_dest,'app/build/outputs/apk/release/app-release.apk')
  130. keystore_name = '{}.keystore'.format(key["alias"])
  131. keystore_dir = os.path.join(path_dest,keystore_name)
  132. apk_name = "{}{}.apk".format(package_id,time.time())
  133. zip_name = "{}{}.zip".format(package_id,time.time())
  134. new_apk_dir = os.path.join(app.apk_folder,apk_name)
  135. new_dir = os.path.join(app.apk_folder,zip_name)
  136. vprint(apk_dir)
  137. try:
  138. shutil.move(apk_dir,new_apk_dir)
  139. with ZipFile(new_dir, 'w') as zip_file:
  140. zip_file.write(new_apk_dir,os.path.basename(apk_name))
  141. if not key_exists:
  142. zip_file.write(keystore_dir,os.path.basename(keystore_dir))
  143. os.remove(new_apk_dir)
  144. return {"name": zip_name}
  145. except Exception as e:
  146. return str(e)
  147. @app.route('/', methods=["GET","POST"])
  148. def build_apk():
  149. vprint('==============================================================')
  150. if request.method == 'POST':
  151. logo = None
  152. app_name = "QmeraLite"
  153. package_id = "com.app.qmera"
  154. acc = None
  155. url = None
  156. keystore = None
  157. key_exists = False
  158. key = {"alias": "qmeralite", "password": "allyourbase", "common_name": "all", "organization_unit": "your",
  159. "organization_name": "base", "locality_name": "are", "state_name": "belong", "country": "to"}
  160. if 'logo' in request.files:
  161. logo = request.files['logo']
  162. vprint(type(logo))
  163. elif 'logo' in request.form:
  164. logo = request.form['logo']
  165. vprint(type(logo))
  166. if 'app_name' in request.files:
  167. app_name = request.files['app_name']
  168. vprint(app_name)
  169. elif 'app_name' in request.form:
  170. app_name = request.form['app_name']
  171. vprint(app_name)
  172. if 'package_id' in request.files:
  173. package_id = request.files['package_id']
  174. vprint(package_id)
  175. elif 'package_id' in request.form:
  176. package_id = request.form['package_id']
  177. vprint(package_id)
  178. if 'acc' in request.files:
  179. acc = request.files['acc']
  180. vprint(acc)
  181. elif 'acc' in request.form:
  182. acc = request.form['acc']
  183. vprint(acc)
  184. if 'url' in request.files:
  185. url = request.files['url']
  186. vprint(url)
  187. elif 'url' in request.form:
  188. url = request.form['url']
  189. vprint(url)
  190. if 'keystore' in request.files:
  191. keystore = request.files['keystore']
  192. key_exists = True
  193. elif 'keystore' in request.form:
  194. keystore = request.form['keystore']
  195. key_exists = True
  196. if 'alias' in request.form:
  197. key["alias"] = request.form['alias']
  198. if 'password' in request.form:
  199. if request.form['password']:
  200. key["password"] = request.form['password']
  201. if keystore:
  202. if 'common_name' in request.form:
  203. if request.form['common_name']:
  204. key["common_name"] = request.form['common_name']
  205. if 'organization_unit' in request.form:
  206. if request.form['organization_unit']:
  207. key["organization_unit"] = request.form['organization_unit']
  208. if 'organization_name' in request.form:
  209. if request.form['organization_name']:
  210. key["organization_name"] = request.form['organization_name']
  211. if 'locality_name' in request.form:
  212. if request.form['locality_name']:
  213. key["locality_name"] = request.form['locality_name']
  214. if 'state_name' in request.form:
  215. if request.form['state_name']:
  216. key["state_name"] = request.form['state_name']
  217. if 'country' in request.form:
  218. if request.form['country']:
  219. key["country"] = request.form['country']
  220. path_dest, c_code_path = create_folder(package_id)
  221. vprint("path_dest: " + path_dest)
  222. vprint("c_code_path: "+c_code_path)
  223. if acc:
  224. change_acc(c_code_path, acc)
  225. if url:
  226. change_url(c_code_path, url)
  227. change_name(path_dest, app_name)
  228. change_certificate(path_dest, key, keystore, app.keytool)
  229. change_package(path_dest,package_id)
  230. if logo:
  231. change_logo(path_dest,logo)
  232. os.chdir(path_dest)
  233. return_code = run_build(path_dest)
  234. if(return_code == 0):
  235. return deliver_apk(path_dest,package_id,key,key_exists)
  236. return "h"
  237. else:
  238. if 'e' in request.args:
  239. return request.args['e']
  240. return "Hello World!"
  241. if __name__ == '__main__':
  242. app.run(host='0.0.0.0', port=8090, debug=app.verbose, ssl_context=app.ssl)