summaryrefslogtreecommitdiff
path: root/osx/generate.py
blob: b8a6bece59c5b34c5fcecc17f0bcc770791fdf68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/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))