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

Commit 902c148

Browse files
committed
Squashed commit of the following:
commit 54a09a6 Author: Joseph Chilcote <[email protected]> Date: Sun Feb 5 15:01:50 2017 -0800 typo fix commit b2c6a58 Author: Joseph Chilcote <[email protected]> Date: Sun Feb 5 14:49:14 2017 -0800 Updated readme and custom pkg examples. Fixes #45 commit 77f4cd0 Author: Joseph Chilcote <[email protected]> Date: Sat Feb 4 16:54:29 2017 -0800 updated to be able to process overrides for pkgs and profiles for privileged login runs commit d7ab9c9 Author: Joseph Chilcote <[email protected]> Date: Sun Jan 29 14:37:38 2017 -0800 adding support for running login items as root. Useful when an admin wants privileged items to be processed at login instead of boot. Example: installing a pkg that requires the user to be logged in.
1 parent 4bb1e56 commit 902c148

File tree

9 files changed

+94
-16
lines changed

9 files changed

+94
-16
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
PKGTITLE="outset"
2-
PKGVERSION="2.0.4"
2+
PKGVERSION="2.0.5"
33
PKGID=com.github.outset
44
PROJECT="outset"
55

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Usage
1212
-----
1313

1414
usage: outset [-h]
15-
(--boot | --login | --on-demand | --login-every | --login-once | --cleanup | --version | --add-ignored-user username | --remove-ignored-user username | --add-override scripts | --remove-override scripts)
15+
(--boot | --login | --login-privileged | --on-demand | --login-every | --login-once | --cleanup | --version | --add-ignored-user username | --remove-ignored-user username | --add-override scripts | --remove-override scripts)
1616

1717
This script automatically processes packages, profiles, and/or scripts at
1818
boot, on demand, and/or login.
@@ -21,6 +21,7 @@ Usage
2121
-h, --help show this help message and exit
2222
--boot Used by launchd for scheduled runs at boot
2323
--login Used by launchd for scheduled runs at login
24+
--login-privileged Used by launchd for scheduled privileged runs at login
2425
--on-demand Process scripts on demand
2526
--login-every Manually process scripts in login-every
2627
--login-once Manually process scripts in login-once
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/python
22

33
# Replace this script with your scripts and/or profiles
4-
# which you want to run at every login.
4+
# which you want to run at every login, in the user context.
55

6-
print 'These scripts will run at every login.'
6+
print 'These scripts will run at every login, in the user context.'
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/python
22

33
# Replace this script with your scripts and/or profiles
4-
# which you want to run at login, only once.
4+
# which you want to run at login, in the user context, only once.
55

6-
print 'These scripts will run at login, once.'
6+
print 'These scripts will run at login, in the user context, once.'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/usr/bin/python
2+
3+
# Replace this script with your packages, scripts, and/or profiles
4+
# which you want to run at every login, in the root context.
5+
6+
print 'These scripts will run at every login, in the root context.'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/usr/bin/python
2+
3+
# Replace this script with your packages, scripts, and/or profiles
4+
# which you want to run at login, in the root context, only once.
5+
6+
print 'These scripts will run at login, in the root context, once.'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>Label</key>
6+
<string>com.github.outset.login-privileged</string>
7+
<key>ProgramArguments</key>
8+
<array>
9+
<string>/usr/local/outset/outset</string>
10+
<string>--login-privileged</string>
11+
</array>
12+
<key>KeepAlive</key>
13+
<dict>
14+
<key>PathState</key>
15+
<dict>
16+
<key>/private/tmp/.com.github.outset.login-privileged.launchd</key>
17+
<true/>
18+
</dict>
19+
</dict>
20+
<key>OnDemand</key>
21+
<true/>
22+
</dict>
23+
</plist>

pkgroot/usr/local/outset/outset

+51-10
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ boot, on demand, and/or login.
2222
##############################################################################
2323

2424
__author__ = 'Joseph Chilcote ([email protected])'
25-
__version__ = '2.0.4'
25+
__version__ = '2.0.5'
2626

2727
import argparse
2828
import datetime
@@ -43,14 +43,20 @@ boot_every_dir = os.path.join(outset_dir, 'boot-every')
4343
boot_once_dir = os.path.join(outset_dir, 'boot-once')
4444
login_every_dir = os.path.join(outset_dir, 'login-every')
4545
login_once_dir = os.path.join(outset_dir, 'login-once')
46+
login_privileged_every_dir = os.path.join(outset_dir, 'login-privileged-every')
47+
login_privileged_once_dir = os.path.join(outset_dir, 'login-privileged-once')
4648
on_demand_dir = os.path.join(outset_dir, 'on-demand')
4749
share_dir = os.path.join(outset_dir, 'share')
4850
outset_preferences = os.path.join(share_dir, 'com.chilcote.outset.plist')
4951
on_demand_trigger = '/private/tmp/.com.github.outset.ondemand.launchd'
52+
login_privileged_trigger = '/private/tmp/.com.github.outset.login-privileged.launchd'
5053
cleanup_trigger = '/private/tmp/.com.github.outset.cleanup.launchd'
5154

5255
if os.geteuid() == 0:
5356
log_file = '/var/log/outset.log'
57+
console_uid = SCDynamicStoreCopyConsoleUser(None, None, None)[1]
58+
run_once_plist = os.path.join('/usr/local/outset/share',
59+
'com.github.outset.once.' + str(console_uid) + '.plist')
5460
else:
5561
if not os.path.exists(os.path.expanduser('~/Library/Logs')):
5662
os.makedirs(os.path.expanduser('~/Library/Logs'))
@@ -195,9 +201,11 @@ def install_package(pkg):
195201
(out, err) = proc.communicate()
196202
if err:
197203
logging.info('Failure installing %s: %s', pkg_to_install, err)
204+
return False
198205
if dmg_mount:
199206
time.sleep(5)
200207
detach_dmg(dmg_mount)
208+
return True
201209

202210
def install_profile(pathname):
203211
'''Install mobileconfig located at given pathname'''
@@ -264,14 +272,29 @@ def process_items(path, delete_items=False, once=False, override={}):
264272
d = {}
265273

266274
for package in packages:
267-
install_package(package)
275+
if once:
276+
if package not in d:
277+
if install_package(package):
278+
d[package] = datetime.datetime.now()
279+
else:
280+
if package in override:
281+
if override[package] > d[package]:
282+
if install_package(package):
283+
d[package] = datetime.datetime.now()
284+
else:
285+
task = install_package(package)
268286
if delete_items: cleanup(package)
269287

270288
for profile in profiles:
271289
if once:
272290
if profile not in d:
273291
if install_profile(profile):
274292
d[profile] = datetime.datetime.now()
293+
else:
294+
if profile in override:
295+
if override[profile] > d[profile]:
296+
if install_profile(profile):
297+
d[profile] = datetime.datetime.now()
275298
else:
276299
task = install_profile(profile)
277300
if delete_items: cleanup(profile)
@@ -304,6 +327,8 @@ def main():
304327
help='Used by launchd for scheduled runs at boot')
305328
group.add_argument('--login', action='store_true',
306329
help='Used by launchd for scheduled runs at login')
330+
group.add_argument('--login-privileged', action='store_true',
331+
help='Used by launchd for scheduled privileged runs at login')
307332
group.add_argument('--on-demand', action='store_true',
308333
help='Process scripts on demand')
309334
group.add_argument('--login-every', action='store_true',
@@ -349,6 +374,8 @@ def main():
349374
boot_once_dir,
350375
login_every_dir,
351376
login_once_dir,
377+
login_privileged_every_dir,
378+
login_privileged_once_dir,
352379
on_demand_dir,
353380
share_dir]
354381

@@ -388,6 +415,20 @@ def main():
388415
process_items(login_once_dir, once=True, override=override_login_once)
389416
if os.listdir(login_every_dir):
390417
process_items(login_every_dir)
418+
if os.listdir(login_privileged_once_dir) or os.listdir(login_privileged_every_dir):
419+
open(login_privileged_trigger, 'a').close()
420+
else:
421+
logging.info('Skipping login scripts for user %s', console_user)
422+
423+
if args.login_privileged:
424+
if os.path.exists(login_privileged_trigger):
425+
cleanup(login_privileged_trigger)
426+
427+
if console_user not in ignored_users:
428+
if os.listdir(login_privileged_once_dir):
429+
process_items(login_privileged_once_dir, once=True, override=override_login_once)
430+
if os.listdir(login_privileged_every_dir):
431+
process_items(login_privileged_every_dir)
391432
else:
392433
logging.info('Skipping login scripts for user %s', console_user)
393434

@@ -452,16 +493,16 @@ def main():
452493
if os.getuid() != 0:
453494
logging.error('Must be root to add scripts to override_login_once')
454495
exit(1)
455-
scripts_to_add = [i for i in args.add_override if i != '']
456-
if scripts_to_add:
457-
override_scripts = {}
458-
for script in scripts_to_add:
459-
script = os.path.join(login_once_dir, script)
460-
override_scripts[script] = datetime.datetime.now()
496+
overrides_to_add = [i for i in args.add_override if i != '']
497+
if overrides_to_add:
498+
override_items = {}
499+
for override in overrides_to_add:
500+
override = os.path.join(login_once_dir, override)
501+
override_items[override] = datetime.datetime.now()
461502
if 'override_login_once' in prefs.keys():
462-
prefs['override_login_once'].update(override_scripts)
503+
prefs['override_login_once'].update(override_items)
463504
else:
464-
prefs['override_login_once'] = override_scripts
505+
prefs['override_login_once'] = override_items
465506
FoundationPlist.writePlist(prefs, outset_preferences)
466507

467508
if args.remove_override:

scripts/postinstall

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
/bin/launchctl load /Library/LaunchDaemons/com.github.outset.boot.plist
77
/bin/launchctl load /Library/LaunchDaemons/com.github.outset.cleanup.plist
8+
/bin/launchctl load /Library/LaunchDaemons/com.github.outset.login-privileged.plist
89

910
user=$(/usr/bin/stat -f '%u' /dev/console)
1011
[[ -z "$user" ]] && exit 0

0 commit comments

Comments
 (0)