Salesforce, Python, SQL, & other ways to put your data where you need it

Need event music? 🎸

Live and recorded jazz, pop, and meditative music for your virtual conference / Zoom wedding / yoga class / private party with quality sound and a smooth technical experience

Make a new Appworx client ZIP from the server

20 Dec 2022
💬 EN

#!/usr/bin/python

# DESCRIPTION
#     Combs through various files accessible to the Appworx server and packages them up into
#     a ZIP file ready to be sent to ITS Desktop Support
#     for campus-wide delivery to other people via the UST Software Center in Windows.
#     See https://services.stthomas.edu/TDClient/1898/ClientPortal/KB/ArticleDet?ID=147259 for instructions.
#
# AUTHOR
#    Katie Gumpertz        Created December 15, 2022

import sys
import os
import zipfile
import shutil
from datetime import datetime
import pathlib

if __name__ == "__main__":
    print('appworx_make_client_zip_from_server.py started at ' +
          datetime.now().strftime("%d/%m/%Y %H:%M:%S"))

    # make sure we get the right number of arguments: token and output file
    number_of_appworx_parameters = 2
    if (len(sys.argv) < number_of_appworx_parameters):  # CHANGE
        # First argument (sys.argv[0]) represents your first Appworx parameter and should always be the path to this ".py" file and should be set up in Appworx to be required/non-editable.
        # Second argument (sys.argv[1]) represents your second Appworx parameter and should be "a" for the first ZIP of the day you send to Desktop Services, "b" if you need to send a second, etc.
        # Third argument (sys.argv[2]) represents your third Appworx parameter and should be the Appworx folder to which you'd like to write the ZIP (e.g. "/u02/sct/dataload/appworx_client_maker")
        print('Invalid number of arguments provided.')
        print('Usage:')
        print('        python make_client_zip.py put_a_zipfile_version_suffix_to_todays_date_here')
        exit(1)

    version_suffix = sys.argv[1]

    git_scripts_folder = os.path.expandvars('$CUSTOM_HOME/ust/appworx_client')
    user_keystore_folder = '/software/appworx'
    output_folder = sys.argv[2]
    temp_build_folder = os.path.join(output_folder, 'temp_for_zipping')
    application_build_folder = os.path.join(temp_build_folder, 'application')
    jre8_build_folder = os.path.join(application_build_folder, 'jre8')
    envs_build_folder = os.path.join(temp_build_folder, 'zz-envs')
    environment_hints = {
        'AppWorx 01 - PROD': ('AWPROD', 'appworx.ampr'), 'AppWorx 02 - PONE': ('APPWPONE', 'appworxpo.ampo'), 'AppWorx 03 - TEST': ('APPWTEST', 'appworxte.amte'), 'AppWorx 04 - DEVL': ('APPWDEVL', 'appworxde.amde')
    }
    today_yyyymmdd = datetime.today().strftime('%Y%m%d')

    # Destroy temp folder from last run
    if os.path.exists(temp_build_folder):
        shutil.rmtree(temp_build_folder)

    # Rebuild folders for this run
    folders_that_might_not_exist = [
        output_folder, temp_build_folder, application_build_folder, jre8_build_folder, envs_build_folder]
    for folder_path in folders_that_might_not_exist:
        if not os.path.exists(folder_path):
            os.makedirs(folder_path)

    # TODO:  Figure out a place to have jre8 so that its contents can be copied into jre8_output_folder

    # Fetch files needed out of the Broadcom-delivered "client" ZIP file
    with zipfile.ZipFile('/u01/app/appmgr/web/Client.zip', mode='r') as baseline_software_zip:
        baseline_software_zip.extractall(path=application_build_folder)

    # Clean up unneeded or misnamed Broadcom files
    os.rename(os.path.join(application_build_folder, 'client.properties.template'),
              os.path.join(application_build_folder, 'client.properties'))
    os.remove(os.path.join(application_build_folder,
                           'connections.properties.template'))

    # Fetch files needed out of the Git repository
    for subfolder in ['shortcut_files', 'user_side_scripts']:
        for filepath in os.listdir(os.path.join(git_scripts_folder, subfolder)):
            shutil.copy(os.path.join(git_scripts_folder, subfolder,
                        filepath), os.path.join(temp_build_folder, filepath))

    # Add package version notes
    version_notes = (f'Key:ust-softwarecenter-appworx-{today_yyyymmdd}{version_suffix}' +
                     '\n' +
                     'Description:Still Appworx version 9.3.3, but configuration includes multiple UST-hosted Appworx environments and multiple separate shortcuts for them.' +
                     '\n' +
                     '(CHANGE ME WHEN RELEASING A NEW PACKAGE)')
    with open(os.path.join(temp_build_folder, 'package.txt'), 'w') as f:
        f.write(version_notes)
    with open(os.path.join(temp_build_folder, f'package{today_yyyymmdd}{version_suffix}.txt'), 'w') as f:
        f.write(version_notes)

    # Fetch files needed out of our keystore and build HTTP connection string files
    environments_we_have_icons_for = [x.replace('.ico', '') for x in os.listdir(
        os.path.join(git_scripts_folder, 'shortcut_files'))]
    for environment_long_name in environments_we_have_icons_for:
        environment_short_name = None
        environment_short_name = environment_hints[environment_long_name][0]
        environment_server_fragment = None
        environment_server_fragment = environment_hints[environment_long_name][1]
        environment_outer_folder = os.path.join(
            envs_build_folder, environment_long_name)
        environment_inner_folder = os.path.join(
            environment_outer_folder, environment_short_name)
        if not os.path.exists(environment_inner_folder):
            os.makedirs(environment_inner_folder)
        # HTTP
        with open(os.path.join(environment_outer_folder, 'connections.properties'), 'w') as f:
            f.write(
                f'{environment_short_name}=https://{environment_server_fragment}.stthomas.edu:443/{environment_short_name}')
        # Keystore
        shutil.copy(os.path.join(user_keystore_folder, 'user_keystore'),
                    os.path.join(environment_inner_folder, 'user_keystore'))
        shutil.copy(os.path.join(user_keystore_folder, 'user_keystore_config'),
                    os.path.join(environment_inner_folder, 'user_keystore_config'))

    # Zip up file
    temp_build_folder_pathlib = pathlib.Path(temp_build_folder)
    with zipfile.ZipFile(os.path.join(output_folder, f'Appworx-package{today_yyyymmdd}{version_suffix}.zip'), mode='w') as output_software_center_zip:
        for file_path in temp_build_folder_pathlib.rglob("*"):
            output_software_center_zip.write(
                file_path, arcname=file_path.relative_to(temp_build_folder_pathlib))

    # Destroy temp folder from this run
    if os.path.exists(temp_build_folder):
        shutil.rmtree(temp_build_folder)

    print('appworx_make_client_zip_from_server.py ended at ' +
          datetime.now().strftime("%d/%m/%Y %H:%M:%S"))
--- ---