Make a new Appworx client ZIP from the server
20 Dec 2022
#!/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"))