#!/usr/bin/python import os import os.path import shutil import sys import stat from string import Template # Variables ---------------------------- APP_NAME = "RiseupVPN" BUNDLE_IDENTIFIER = "se.leap.riseupvpn" # Do not edit below -------------------- here = os.path.split(os.path.abspath(__file__))[0] ENTRYPOINT = 'bitmask-systray' HELPER = 'bitmask_helper' TEMPLATE_INFO = 'template-info.plist' TEMPLATE_HELPER = 'template-helper.plist' TEMPLATE_PREINSTALL = 'template-preinstall' TEMPLATE_POSTINSTALL = 'template-postinstall' VERSION = open(os.path.join(here, '..', 'version')).read().strip() APP_PATH = os.path.abspath(here + '/../dist/' + APP_NAME + ".app") STAGING = os.path.abspath(here + '/../staging/') ASSETS = os.path.abspath(here + '/../assets/') ICON = os.path.join(ASSETS, APP_NAME.lower() + '.icns') SCRIPTS = os.path.join(os.path.abspath(here), 'scripts') INFO_PLIST = APP_PATH + '/Contents/Info.plist' HELPER_PLIST = os.path.join(SCRIPTS, 'se.leap.bitmask-helper.plist') PREINSTALL = os.path.join(SCRIPTS, 'preinstall') POSTINSTALL = os.path.join(SCRIPTS, 'postinstall') os.makedirs(APP_PATH + "/Contents/MacOS", exist_ok=True) os.makedirs(APP_PATH + "/Contents/Resources", exist_ok=True) os.makedirs(APP_PATH + "/Contents/helper", exist_ok=True) vardict = { 'entrypoint': ENTRYPOINT, 'info_string': APP_NAME + " " + VERSION, 'bundle_identifier': BUNDLE_IDENTIFIER, 'bundle_name': APP_NAME, 'version': VERSION, 'app_name': APP_NAME } # utils def copy_payload(filename): destfile = APP_PATH + "/Contents/MacOS/" + filename shutil.copyfile(STAGING + '/' + filename, destfile) cmode = os.stat(destfile).st_mode os.chmod(destfile, cmode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) def generate_from_template(template, dest, vardict): print("[+] File written from template to", dest) template = Template(open(template).read()) with open(dest, 'w') as output: output.write(template.safe_substitute(vardict)) # 1. Generation of the Bundle Info.plist # -------------------------------------- generate_from_template(TEMPLATE_INFO, INFO_PLIST, vardict) # 2. Generate PkgInfo # ------------------------------------------- # XXX is this enough? f = open(APP_PATH + "/Contents/PkgInfo", "w") f.write("APPL????") f.close() # 3. Copy the binary payloads # -------------------------------------------- copy_payload(ENTRYPOINT) copy_payload(HELPER) # 4. Copy the app icon # ----------------------------------------------- shutil.copyfile(ICON, APP_PATH + '/Contents/Resources/app.icns') # 5. Generate the scripts for the installer # ----------------------------------------------- generate_from_template(TEMPLATE_HELPER, HELPER_PLIST, vardict) generate_from_template(TEMPLATE_PREINSTALL, PREINSTALL, vardict) generate_from_template(TEMPLATE_POSTINSTALL, POSTINSTALL, vardict) # 6. Generate uninstall script # ----------------------------------------------- # TODO copy the uninstaller script from bitmask-dev # TODO substitute vars # TODO this is a bit weak for now. # To begin with, this assumes everything is hardcoded into /Applications/APPNAME.app # We could consider moving the helpers into /usr/local/sbin, so that the plist files # always reference there. # We're all set here. print("[+] Output written to dist/{appname}.app".format(appname=APP_NAME))