Explorar o código

update mab async settings

kevin hai 1 ano
pai
achega
83d9df3d6b
Modificáronse 3 ficheiros con 133 adicións e 91 borrados
  1. 84 63
      src/mainPalio-async.py
  2. 3 1
      src/project_config.py
  3. 46 27
      src/taskPalio.py

+ 84 - 63
src/mainPalio-async.py

@@ -12,6 +12,7 @@ from taskPalio import create_task
 ImageFile.SAFEBLOCK = 2048 * 2048
 
 app = Flask(__name__)
+app.base_project = project_config.base_project
 app.base_project_name = os.path.basename(project_config.base_project)
 
 
@@ -54,14 +55,12 @@ def build_apk():
         try:
             if 'logo' in request.files:
                 logo = request.files['logo'].read()
-                logo = str(base64.b64encode(logo), encoding='ascii')
                 vprint(type(logo))
             elif 'logo' in request.form:
                 logo = request.form['logo']
                 vprint(type(logo))
             if 'logofloat' in request.files:
                 logo_float = request.files['logofloat'].read()
-                logo_float = str(base64.b64encode(logo_float), encoding='ascii')
                 vprint(type(logo_float))
             elif 'logofloat' in request.form:
                 logo_float = request.form['logofloat']
@@ -69,7 +68,6 @@ def build_apk():
 
             if 'app_name' in request.files:
                 app_name = request.files['app_name'].read()
-                app_name = str(base64.b64encode(app_name), encoding='ascii')
                 vprint(app_name)
             elif 'app_name' in request.form:
                 app_name = request.form['app_name']
@@ -77,7 +75,6 @@ def build_apk():
 
             if 'package_id' in request.files:
                 package_id = request.files['package_id'].read()
-                package_id = str(base64.b64encode(package_id), encoding='ascii')
                 vprint(package_id)
             elif 'package_id' in request.form:
                 package_id = request.form['package_id']
@@ -85,7 +82,6 @@ def build_apk():
 
             if 'acc' in request.files:
                 acc = request.files['acc'].read()
-                acc = str(base64.b64encode(acc), encoding='ascii')
                 vprint(acc)
             elif 'acc' in request.form:
                 acc = request.form['acc']
@@ -93,7 +89,6 @@ def build_apk():
 
             if 'url' in request.files:
                 url = request.files['url'].read()
-                url = str(base64.b64encode(url), encoding='ascii')
                 vprint(url)
             elif 'url' in request.form:
                 url = request.form['url']
@@ -109,7 +104,6 @@ def build_apk():
 
             if 'huawei_file' in request.files:
                 huawei_file = request.files['huawei_file'].read()
-                huawei_file = str(base64.b64encode(huawei_file), encoding='ascii')
             elif 'huawei_file' in request.form:
                 huawei_file = request.form['huawei_file']
 
@@ -147,57 +141,74 @@ def build_apk():
                 if 'country' in request.form:
                     if request.form['country']:
                         key["country"] = request.form['country']
-            tabs.append(request.form["tab1"])
-            tabs.append(request.form["tab2"])
-            if request.form['tab3']:
-                tabs.append(request.form["tab3"])
-            if request.form['tab4']:
-                tabs.append(request.form["tab4"])
-            if 'tab1_icon' in request.files:
-                tab_icon[0] = request.files['tab1_icon'].read()
-                tab_icon[0] = str(base64.b64encode(tab_icon[0]), encoding='ascii')
-            elif 'tab1_icon' in request.form:
-                tab_icon[0] = request.form['tab1_icon']
-            if 'tab2_icon' in request.files:
-                tab_icon[1] = request.files['tab2_icon'].read()
-                tab_icon[1] = str(base64.b64encode(tab_icon[1]), encoding='ascii')
-            elif 'tab2_icon' in request.form:
-                tab_icon[1] = request.form['tab2_icon']
-            if 'tab3_icon' in request.files:
-                tab_icon[2] = request.files['tab3_icon'].read()
-                tab_icon[2] = str(base64.b64encode(tab_icon[2]), encoding='ascii')
-            elif 'tab3_icon' in request.form:
-                tab_icon[2] = request.form['tab3_icon']
-            if 'tab4_icon' in request.files:
-                tab_icon[3] = request.files['tab4_icon'].read()
-                tab_icon[3] = str(base64.b64encode(tab_icon[3]), encoding='ascii')
-            elif 'tab4_icon' in request.form:
-                tab_icon[3] = request.form['tab4_icon']
-            if 'fb1_icon' in request.files:
-                fb_icon[0] = request.files['fb1_icon'].read()
-                fb_icon[0] = str(base64.b64encode(fb_icon[0]), encoding='ascii')
-            elif 'fb1_icon' in request.form:
-                fb_icon[0] = request.form['fb1_icon']
-            if 'fb2_icon' in request.files:
-                fb_icon[1] = request.files['fb2_icon'].read()
-                fb_icon[1] = str(base64.b64encode(fb_icon[1]), encoding='ascii')
-            elif 'fb2_icon' in request.form:
-                fb_icon[1] = request.form['fb2_icon']
-            if 'fb3_icon' in request.files:
-                fb_icon[2] = request.files['fb3_icon'].read()
-                fb_icon[2] = str(base64.b64encode(fb_icon[2]), encoding='ascii')
-            elif 'fb3_icon' in request.form:
-                fb_icon[2] = request.form['fb3_icon']
-            if 'fb4_icon' in request.files:
-                fb_icon[3] = request.files['fb4_icon'].read()
-                fb_icon[3] = str(base64.b64encode(fb_icon[3]), encoding='ascii')
-            elif 'fb4_icon' in request.form:
-                fb_icon[3] = request.form['fb4_icon']
-            if 'fb5_icon' in request.files:
-                fb_icon[4] = request.files['fb5_icon'].read()
-                fb_icon[4] = str(base64.b64encode(fb_icon[4]), encoding='ascii')
-            elif 'fb5_icon' in request.form:
-                fb_icon[4] = request.form['fb5_icon']
+            # tabs.append(request.form["tab1"])
+            # tabs.append(request.form["tab2"])
+            # if request.form['tab3']:
+            #     tabs.append(request.form["tab3"])
+            # if request.form['tab4']:
+            #     tabs.append(request.form["tab4"])
+            has_tab = True
+            n = 0
+            while has_tab:
+                tab_key = f'tab{n+1}'
+                if tab_key in request.form:
+                    if request.form[tab_key]:
+                        tabs.append(request.form[tab_key])
+                        if f'{tab_key}_icon' in request.files:
+                            tab_icon[n] = request.files[f'{tab_key}_icon'].read()
+                        elif f'{tab_key}_icon' in request.form:
+                            tab_icon[n] = request.form[f'{tab_key}_icon']
+                    n = n + 1
+                else:
+                    has_tab = False
+            # if 'tab1_icon' in request.files:
+            #     tab_icon[0] = request.files['tab1_icon'].read()
+            # elif 'tab1_icon' in request.form:
+            #     tab_icon[0] = request.form['tab1_icon']
+            # if 'tab2_icon' in request.files:
+            #     tab_icon[1] = request.files['tab2_icon'].read()
+            # elif 'tab2_icon' in request.form:
+            #     tab_icon[1] = request.form['tab2_icon']
+            # if 'tab3_icon' in request.files:
+            #     tab_icon[2] = request.files['tab3_icon'].read()
+            # elif 'tab3_icon' in request.form:
+            #     tab_icon[2] = request.form['tab3_icon']
+            # if 'tab4_icon' in request.files:
+            #     tab_icon[3] = request.files['tab4_icon'].read()
+            # elif 'tab4_icon' in request.form:
+            #     tab_icon[3] = request.form['tab4_icon']
+            has_fb = True
+            n = 0
+            while has_fb:
+                fb_key = f'fb{n+1}_icon'
+                if fb_key in request.files:
+                    fb_icon[n] = request.files[fb_key].read()
+                    n = n + 1
+                elif f'fb{n+1}_icon' in request.form:
+                    fb_icon[n] = request.form[fb_key]
+                    n = n + 1
+                else:
+                    has_fb = False
+            # if 'fb1_icon' in request.files:
+            #     fb_icon[0] = request.files['fb1_icon'].read()
+            # elif 'fb1_icon' in request.form:
+            #     fb_icon[0] = request.form['fb1_icon']
+            # if 'fb2_icon' in request.files:
+            #     fb_icon[1] = request.files['fb2_icon'].read()
+            # elif 'fb2_icon' in request.form:
+            #     fb_icon[1] = request.form['fb2_icon']
+            # if 'fb3_icon' in request.files:
+            #     fb_icon[2] = request.files['fb3_icon'].read()
+            # elif 'fb3_icon' in request.form:
+            #     fb_icon[2] = request.form['fb3_icon']
+            # if 'fb4_icon' in request.files:
+            #     fb_icon[3] = request.files['fb4_icon'].read()
+            # elif 'fb4_icon' in request.form:
+            #     fb_icon[3] = request.form['fb4_icon']
+            # if 'fb5_icon' in request.files:
+            #     fb_icon[4] = request.files['fb5_icon'].read()
+            # elif 'fb5_icon' in request.form:
+            #     fb_icon[4] = request.form['fb5_icon']
             if 'fb_icon' in request.form:
                 fb_icon = request.form['fb_icon'].split(",")
             if 'fb_order' in request.form:
@@ -212,7 +223,6 @@ def build_apk():
                 font = int(request.form['font'])
             if 'background' in request.files:
                 background = request.files['background'].read()
-                background = str(base64.b64encode(background), encoding='ascii')
             elif 'background' in request.form:
                 background = request.form['background']
             if 'version_code' in request.form:
@@ -273,17 +283,28 @@ def build_apk():
 def get_task(task_id):
     task_result = AsyncResult(task_id)
     if task_result.state == 'SUCCESS':
-        if task_result.result is None:
+        res = task_result.result
+        task_result.revoke(terminate=True)
+        if res is None:
             return {"status": "2", "message": "Process failure"}, 200
-        elif task_result.result['status'] == '0':
-            return task_result.result, 200
+        elif res['status'] == '0':
+            return res, 200
         else:
-            return task_result.result, 200
+            return res, 200
     elif task_result.state == 'FAILURE':
+        task_result.revoke(terminate=True)
         return {"status": "2", "message": "Process failure"}, 200
     else:
         return {"status": "5", "message": f"Process is in {task_result.state} state."}, 200
 
+@app.route('/revoke/<task_id>', methods=['GET'])
+def revoke_task(task_id):
+    task_result = AsyncResult(task_id)
+    if task_result.state != 'SUCCESS' and task_result.state != 'FAILURE':
+        task_result.revoke(terminate=True)
+        return {"status": "2", "message": "Process terminated"}, 200
+    else:
+        return get_task(task_id)
 
 if __name__ == '__main__':
     app.run(host='0.0.0.0', port=8053, debug=project_config.verbose, ssl_context=project_config.ssl)

+ 3 - 1
src/project_config.py

@@ -7,4 +7,6 @@ ssl = ('/usr/src/app/ssl/STAR_newuniverse_io.crt', '/usr/src/app/ssl/STAR_newuni
 # ssl = None
 keytool = '/usr/bin/keytool'
 verbose = True
-base_project_name = os.path.basename(base_project)
+base_project_name = os.path.basename(base_project)
+is_local = True
+remote_url = "https://digixplatform.com/dashboardv2/uploads"

+ 46 - 27
src/taskPalio.py

@@ -1,3 +1,5 @@
+import random
+import string
 from io import BytesIO
 import os
 import shutil
@@ -5,6 +7,8 @@ import subprocess
 import time
 from zipfile import ZipFile
 import base64
+from urllib.parse import urljoin
+
 
 import requests
 from werkzeug.datastructures import FileStorage
@@ -20,10 +24,12 @@ def vprint(*data):
 
 
 celery = Celery(__name__)
-celery.conf.broker_url = os.environ.get("CELERY_BROKER_URL", "redis://localhost:6379")
-celery.conf.result_backend = os.environ.get("CELERY_RESULT_BACKEND", "redis://localhost:6379")
+celery.conf.broker_url = os.environ.get("CELERY_BROKER_URL", "redis://127.0.0.1:6379")
+celery.conf.result_backend = os.environ.get("CELERY_RESULT_BACKEND", "redis://127.0.0.1:6379")
 celery.conf.task_track_started = True
 celery.conf.task_time_limit = 1200
+celery.conf.worker_prefetch_multiplier = 1
+celery.conf.task_default_rate_limit = "10/m"
 # celery.conf.task_serializer = 'pickle'
 # celery.conf.result_serializer = 'pickle'
 
@@ -36,9 +42,11 @@ def create_folder(package_id):
         shutil.rmtree(path)
         os.mkdir(path)
     vprint(path)
-    path_dest = os.path.join(path, project_config.base_project_name)
+    base_project = project_config.base_project
+    base_project_name = os.path.basename(base_project)
+    path_dest = os.path.join(path, base_project_name)
     if not os.path.exists(path_dest):
-        shutil.copytree(project_config.base_project, path_dest)
+        shutil.copytree(base_project, path_dest)
     code_path = "app/src/main/java/"
     orig_code = "com/example/qmeralitesamplecode"
     path_package_id = package_id.replace(".", "/")
@@ -365,17 +373,25 @@ def change_logo(path_dest, logo, logo_float=None):
     img_path_float = "app/src/main/res/drawable/pb_button.png"
     img_path_float = os.path.join(path_dest, img_path_float)
     if isinstance(logo, str):
-        logo = requests.get('https://digixplatform.com/dashboardv2/uploads/logo/{}'.format(logo), verify=False)
-        with open(img_path, "wb") as f:
-            f.write(logo.content)
+        if project_config.is_local:
+            src_path = os.path.join(project_config.apk_folder, "logo", logo)
+            shutil.copy(src_path, img_path)
+        else:
+            logo = requests.get(urljoin(project_config.remote_url, "logo/{}".format(logo)), verify=False)
+            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((512, 512))
         if logo_float:
-            logo_float = requests.get('https://digixplatform.com/dashboardv2/uploads/logofloat/{}'.format(logo_float),
+            if project_config.is_local:
+                src_path_float = os.path.join(project_config.apk_folder, "logofloat", logo_float)
+                shutil.copy(src_path_float, img_path_float)
+            else:
+                logo_float = requests.get(urljoin(project_config.remote_url, "logofloat/{}".format(logo_float)),
                                       verify=False)
-            with open(img_path_float, "wb") as f:
-                f.write(logo_float.content)
+                with open(img_path_float, "wb") as f:
+                    f.write(logo_float.content)
             with open(img_path_float, "rb") as f:
                 logo_float = Image.open(f)
                 logo_float = logo_float.resize((150, 150))
@@ -399,10 +415,13 @@ def change_tab(path_dest, tabs, tab_icon, package, tab3_mode, tab_amount):
         img_path = "app/src/main/res/drawable"
         img_path = os.path.join(path_dest, img_path, icon)
         if isinstance(tab_icon[i], str):
-            logo = requests.get('https://digixplatform.com/dashboardv2/uploads/tab_icon/{}'.format(tab_icon[i]),
-                                verify=False)
-            with open(img_path, "wb") as f:
-                f.write(logo.content)
+            if project_config.is_local:
+                src_path = os.path.join(project_config.apk_folder, "tab_icon", tab_icon[i])
+                shutil.copy(src_path, img_path)
+            else:
+                logo = requests.get(urljoin(project_config.remote_url, "tab_icon/{}".format(tab_icon[i])), verify=False)
+                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))
@@ -445,10 +464,13 @@ def change_fb(path_dest, fb_order, package, fb_icon):
         if i - 1 in range(-len(default_fb_icon), len(default_fb_icon)):
             img_path = os.path.join(path_dest, img_path, default_fb_icon[i - 1])
             if isinstance(fb_icon[x], str):
-                logo = requests.get('https://digixplatform.com/dashboardv2/uploads/fb_icon/{}'.format(fb_icon[x]),
-                                    verify=False)
-                with open(img_path, "wb") as f:
-                    f.write(logo.content)
+                if project_config.is_local:
+                    src_path = os.path.join(project_config.apk_folder, "fb_icon", fb_icon[x])
+                    shutil.copy(src_path, img_path)
+                else:
+                    logo = requests.get(urljoin(project_config.remote_url, "fb_icon/{}".format(fb_icon[x])), verify=False)
+                    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))
@@ -539,11 +561,7 @@ def change_huawei_file(path_dest, huawei_file, package_id):
     huaweifile_name = "agconnect-services.json"
     huaweifile_path = os.path.join(path_dest, "app/{}".format(huaweifile_name))
     if huawei_file:
-        if isinstance(huawei_file, FileStorage):
-            huawei_file.save(huaweifile_path)
-        else:
-            with open(huaweifile_path, 'wb') as f:
-                f.write(base64.b64decode(bytes(huawei_file, 'ascii')))
+        huawei_file.save(huaweifile_path)
         path_package_id = package_id.replace(".", "/")
         code_path = "app/src/main/java/"
         main_code_path = os.path.join(path_dest, code_path, path_package_id, "MAB.java")
@@ -614,6 +632,7 @@ def change_adblock_file(path_dest, package, use_adblock):
 
 def run_build(path_dest):
     gradlew = os.path.join(path_dest, "gradlew")
+    os.chmod(gradlew, 0o774)
     error = ""
     ret = subprocess.run([gradlew, 'clean', 'assembleRelease'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     if ret.returncode == 0:
@@ -632,10 +651,10 @@ def deliver_apk(path_dest, package_id, key, key_exists):
     aab_dir = os.path.join(path_dest, 'app/build/outputs/bundle/release/app-release.aab')
     keystore_name = '{}.keystore'.format(key["alias"])
     keystore_dir = os.path.join(path_dest, keystore_name)
-    timenow = time.time()
-    apk_name = "{}{}.apk".format(package_id, timenow)
-    aab_name = "{}{}.aab".format(package_id, timenow)
-    zip_name = "{}{}.zip".format(package_id, timenow)
+    rand_name = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(32))
+    apk_name = f"{package_id}.apk"
+    aab_name = f"{package_id}.aab"
+    zip_name = f"{rand_name}.zip"
     new_apk_dir = os.path.join(project_config.apk_folder, apk_name)
     new_aab_dir = os.path.join(project_config.apk_folder, aab_name)
     new_dir = os.path.join(project_config.apk_folder, zip_name)