Skip to content
This repository was archived by the owner on Feb 8, 2023. It is now read-only.

Commit a449f67

Browse files
committed
add python framework tool and update README
1 parent e390469 commit a449f67

File tree

3 files changed

+233
-1
lines changed

3 files changed

+233
-1
lines changed

README.md

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,46 @@
11
# Nudge (macadmin's Slack #nudge)
22

3+
## Embedded Python
4+
As of v2.0, Nudge now uses its own embedded python (currently v3.8). This is due to Apple's upcoming removal of Python2.
5+
6+
Gurl has been updated from the Munki 4.0 release.
7+
8+
Nibbler has been updated to support python 3.
9+
10+
### Building embedded python framework
11+
12+
To reduce the size of the git repository, you **must** create your own Python. To do this, simply run the `./build_python_framework` script within the repository.
13+
14+
This process was tested on Catalina only.
15+
16+
```
17+
./build_python_framework
18+
19+
Cloning relocatable-python tool from github...
20+
Cloning into '/tmp/relocatable-python-git'...
21+
remote: Enumerating objects: 28, done.
22+
remote: Counting objects: 100% (28/28), done.
23+
remote: Compressing objects: 100% (19/19), done.
24+
remote: Total 78 (delta 12), reused 19 (delta 9), pack-reused 50
25+
Unpacking objects: 100% (78/78), done.
26+
Downloading https://www.python.org/ftp/python/3.8.0/python-3.8.0-macosx10.9.pkg...
27+
28+
...
29+
30+
Done!
31+
Customized, relocatable framework is at /Library/nudge/Python.framework
32+
Moving Python.framework to nudge munki-pkg payload folder
33+
Taking ownership of the file to not break git
34+
```
35+
336
## Important Information
437
You most certainly want to customize the following values:
538

639
- `cut_off_date`
740
- `main_subtitle_text`
841
- `more_info_url`
42+
- `minimum_os_version`
43+
- `minimum_os_sub_build_version`
944

1045
Also, you will at the very least want to change the `company_logo.png`
1146

@@ -24,13 +59,19 @@ Because of the way git works, nudge will not contain the `Logs` folder required
2459
In order to create a properly working package, you will need to run the following command _before_ building the package:
2560
`munkipkg --sync /path/to/cloned_repo/nudge`.
2661

27-
## OS Support
62+
## OS Support v1
2863
The following operating system and versions have been tested.
2964
- 10.10.0, 10.10.5
3065
- 10.11.0, 10.11.6
3166
- 10.12.0, 10.12.6
3267
- 10.13.0 10.13.3, 10.13.6
3368
- 10.14 -> 10.14.6
69+
- 10.15 -> 10.15.1
70+
71+
## OS Support v2 (embedded python)
72+
The following operating system and versions have been tested with the embedded python.
73+
- 10.14
74+
- 10.15
3475

3576
## Configuration File
3677
Essentially every component of the UI is customizable, all through a JSON configuration file. An [example file](/example_config.json) is available within the code repository.

build_python_framework

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#!/bin/zsh
2+
#
3+
# Build script for Python 3 framework for Nudge
4+
# Taken from https://github.com/munki/munki/blob/Munki3dev/code/tools/build_python_framework.sh
5+
6+
# IMPORTANT
7+
# Run this with your current directory being the path where this script is located
8+
9+
TOOLSDIR=$(dirname $0)
10+
REQUIREMENTS="${TOOLSDIR}/py3_requirements.txt"
11+
PYTHON_VERSION=3.8.0
12+
PYTHONTOOLDIR="/tmp/relocatable-python-git"
13+
CONSOLEUSER=$(/usr/bin/stat -f "%Su" /dev/console)
14+
FRAMEWORKDIR="/Library/nudge"
15+
16+
# Sanity checks.
17+
GIT=$(which git)
18+
WHICH_GIT_RESULT="$?"
19+
if [ "${WHICH_GIT_RESULT}" != "0" ]; then
20+
echo "Could not find git in command path. Maybe it's not installed?" 1>&2
21+
echo "You can get a Git package here:" 1>&2
22+
echo " https://git-scm.com/download/mac"
23+
exit 1
24+
fi
25+
if [ ! -f "${REQUIREMENTS}" ]; then
26+
echo "Missing requirements file at ${REQUIREMENTS}." 1>&2
27+
exit 1
28+
fi
29+
30+
# Create CPE framework path if not present
31+
if [ ! -d "${FRAMEWORKDIR}" ]; then
32+
/usr/bin/sudo /bin/mkdir -p "${FRAMEWORKDIR}"
33+
fi
34+
35+
# remove existing library Python.framework if present
36+
if [ -d "${FRAMEWORKDIR}/Python.framework" ]; then
37+
/usr/bin/sudo /bin/rm -rf "${FRAMEWORKDIR}/Python.framework"
38+
fi
39+
40+
# clone our relocatable-python tool
41+
if [ -d "${PYTHONTOOLDIR}" ]; then
42+
/usr/bin/sudo /bin/rm -rf "${PYTHONTOOLDIR}"
43+
fi
44+
echo "Cloning relocatable-python tool from github..."
45+
git clone https://github.com/gregneagle/relocatable-python.git "${PYTHONTOOLDIR}"
46+
CLONE_RESULT="$?"
47+
if [ "${CLONE_RESULT}" != "0" ]; then
48+
echo "Error cloning relocatable-python tool repo: ${CLONE_RESULT}" 1>&2
49+
exit 1
50+
fi
51+
52+
# remove existing munki-pkg Python.framework if present
53+
if [ -d "$TOOLSDIR/payload/${FRAMEWORKDIR}/Python.framework" ]; then
54+
/bin/rm -rf "$TOOLSDIR/payload/${FRAMEWORKDIR}/Python.framework"
55+
fi
56+
57+
# build the framework
58+
/usr/bin/sudo "${PYTHONTOOLDIR}/make_relocatable_python_framework.py" \
59+
--python-version "${PYTHON_VERSION}" \
60+
--pip-requirements "${REQUIREMENTS}" \
61+
--destination "${FRAMEWORKDIR}"
62+
63+
# move the framework
64+
echo "Moving Python.framework to nudge munki-pkg payload folder"
65+
/usr/bin/sudo /bin/mv "${FRAMEWORKDIR}/Python.framework" "$TOOLSDIR/payload/${FRAMEWORKDIR}"
66+
67+
# take ownership of the payload folder
68+
echo "Taking ownership of the file to not break git"
69+
/usr/bin/sudo /usr/sbin/chown -R ${CONSOLEUSER}:wheel "$TOOLSDIR/payload/${FRAMEWORKDIR}/Python.framework"

py3_requirements.txt

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
xattr==0.9.6
2+
six==1.13.0
3+
certifi==2019.9.11
4+
cffi==1.13.2
5+
chardet==3.0.4
6+
idna==2.8
7+
pycparser==2.19
8+
urllib3==1.25.7
9+
requests==2.22.0
10+
pyobjc-framework-AVFoundation==6.1
11+
pyobjc-framework-AVKit==6.1
12+
pyobjc-framework-Accounts==6.1
13+
pyobjc-framework-AdSupport==6.1
14+
pyobjc-framework-AddressBook==6.1
15+
pyobjc-framework-AppleScriptKit==6.1
16+
pyobjc-framework-AppleScriptObjC==6.1
17+
pyobjc-framework-ApplicationServices==6.1
18+
pyobjc-framework-AuthenticationServices==6.1
19+
pyobjc-framework-Automator==6.1
20+
pyobjc-framework-BusinessChat==6.1
21+
pyobjc-framework-CFNetwork==6.1
22+
pyobjc-framework-CalendarStore==6.1
23+
pyobjc-framework-CloudKit==6.1
24+
pyobjc-framework-Cocoa==6.1
25+
pyobjc-framework-Collaboration==6.1
26+
pyobjc-framework-ColorSync==6.1
27+
pyobjc-framework-Contacts==6.1
28+
pyobjc-framework-ContactsUI==6.1
29+
pyobjc-framework-CoreAudio==6.1
30+
pyobjc-framework-CoreAudioKit==6.1
31+
pyobjc-framework-CoreBluetooth==6.1
32+
pyobjc-framework-CoreData==6.1
33+
pyobjc-framework-CoreHaptics==6.1
34+
pyobjc-framework-CoreLocation==6.1
35+
pyobjc-framework-CoreML==6.1
36+
pyobjc-framework-CoreMedia==6.1
37+
pyobjc-framework-CoreMediaIO==6.1
38+
pyobjc-framework-CoreMotion==6.1
39+
pyobjc-framework-CoreServices==6.1
40+
pyobjc-framework-CoreSpotlight==6.1
41+
pyobjc-framework-CoreText==6.1
42+
pyobjc-framework-CoreWLAN==6.1
43+
pyobjc-framework-CryptoTokenKit==6.1
44+
pyobjc-framework-DVDPlayback==6.1
45+
pyobjc-framework-DeviceCheck==6.1
46+
pyobjc-framework-DictionaryServices==6.1
47+
pyobjc-framework-DiscRecording==6.1
48+
pyobjc-framework-DiscRecordingUI==6.1
49+
pyobjc-framework-DiskArbitration==6.1
50+
pyobjc-framework-EventKit==6.1
51+
pyobjc-framework-ExceptionHandling==6.1
52+
pyobjc-framework-ExecutionPolicy==6.1
53+
pyobjc-framework-ExternalAccessory==6.1
54+
pyobjc-framework-FSEvents==6.1
55+
pyobjc-framework-FileProvider==6.1
56+
pyobjc-framework-FileProviderUI==6.1
57+
pyobjc-framework-FinderSync==6.1
58+
pyobjc-framework-GameCenter==6.1
59+
pyobjc-framework-GameController==6.1
60+
pyobjc-framework-GameKit==6.1
61+
pyobjc-framework-GameplayKit==6.1
62+
pyobjc-framework-IMServicePlugIn==6.1
63+
pyobjc-framework-IOSurface==6.1
64+
pyobjc-framework-ImageCaptureCore==6.1
65+
pyobjc-framework-InputMethodKit==6.1
66+
pyobjc-framework-InstallerPlugins==6.1
67+
pyobjc-framework-InstantMessage==6.1
68+
pyobjc-framework-Intents==6.1
69+
pyobjc-framework-LatentSemanticMapping==6.1
70+
pyobjc-framework-LaunchServices==6.1
71+
pyobjc-framework-LinkPresentation==6.1
72+
pyobjc-framework-LocalAuthentication==6.1
73+
pyobjc-framework-MapKit==6.1
74+
pyobjc-framework-MediaAccessibility==6.1
75+
pyobjc-framework-MediaLibrary==6.1
76+
pyobjc-framework-MediaPlayer==6.1
77+
pyobjc-framework-MediaToolbox==6.1
78+
pyobjc-framework-MetalKit==6.1
79+
pyobjc-framework-ModelIO==6.1
80+
pyobjc-framework-MultipeerConnectivity==6.1
81+
pyobjc-framework-NaturalLanguage==6.1
82+
pyobjc-framework-NetFS==6.1
83+
pyobjc-framework-Network==6.1
84+
pyobjc-framework-NetworkExtension==6.1
85+
pyobjc-framework-NotificationCenter==6.1
86+
pyobjc-framework-OSAKit==6.1
87+
pyobjc-framework-OSLog==6.1
88+
pyobjc-framework-OpenDirectory==6.1
89+
pyobjc-framework-PencilKit==6.1
90+
pyobjc-framework-Photos==6.1
91+
pyobjc-framework-PhotosUI==6.1
92+
pyobjc-framework-PreferencePanes==6.1
93+
pyobjc-framework-PubSub==6.1
94+
pyobjc-framework-PushKit==6.1
95+
pyobjc-framework-Quartz==6.1
96+
pyobjc-framework-QuickLookThumbnailing==6.1
97+
pyobjc-framework-SafariServices==6.1
98+
pyobjc-framework-SceneKit==6.1
99+
pyobjc-framework-ScreenSaver==6.1
100+
pyobjc-framework-ScriptingBridge==6.1
101+
pyobjc-framework-SearchKit==6.1
102+
pyobjc-framework-Security==6.1
103+
pyobjc-framework-SecurityFoundation==6.1
104+
pyobjc-framework-SecurityInterface==6.1
105+
pyobjc-framework-ServiceManagement==6.1
106+
pyobjc-framework-Social==6.1
107+
pyobjc-framework-SoundAnalysis==6.1
108+
pyobjc-framework-Speech==6.1
109+
pyobjc-framework-SpriteKit==6.1
110+
pyobjc-framework-StoreKit==6.1
111+
pyobjc-framework-SyncServices==6.1
112+
pyobjc-framework-SystemConfiguration==6.1
113+
pyobjc-framework-SystemExtensions==6.1
114+
pyobjc-framework-UserNotifications==6.1
115+
pyobjc-framework-VideoSubscriberAccount==6.1
116+
pyobjc-framework-VideoToolbox==6.1
117+
pyobjc-framework-Vision==6.1
118+
pyobjc-framework-WebKit==6.1
119+
pyobjc-framework-iTunesLibrary==6.1
120+
pyobjc-framework-libdispatch==6.1
121+
pyobjc-core==6.1
122+
pyobjc==6.1

0 commit comments

Comments
 (0)