@@ -22,7 +22,7 @@ boot, on demand, and/or login.
22
22
##############################################################################
23
23
24
24
__author__ = 'Joseph Chilcote ([email protected] )'
25
- __version__ = '2.0.4 '
25
+ __version__ = '2.0.5 '
26
26
27
27
import argparse
28
28
import datetime
@@ -43,14 +43,20 @@ boot_every_dir = os.path.join(outset_dir, 'boot-every')
43
43
boot_once_dir = os .path .join (outset_dir , 'boot-once' )
44
44
login_every_dir = os .path .join (outset_dir , 'login-every' )
45
45
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' )
46
48
on_demand_dir = os .path .join (outset_dir , 'on-demand' )
47
49
share_dir = os .path .join (outset_dir , 'share' )
48
50
outset_preferences = os .path .join (share_dir , 'com.chilcote.outset.plist' )
49
51
on_demand_trigger = '/private/tmp/.com.github.outset.ondemand.launchd'
52
+ login_privileged_trigger = '/private/tmp/.com.github.outset.login-privileged.launchd'
50
53
cleanup_trigger = '/private/tmp/.com.github.outset.cleanup.launchd'
51
54
52
55
if os .geteuid () == 0 :
53
56
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' )
54
60
else :
55
61
if not os .path .exists (os .path .expanduser ('~/Library/Logs' )):
56
62
os .makedirs (os .path .expanduser ('~/Library/Logs' ))
@@ -195,9 +201,11 @@ def install_package(pkg):
195
201
(out , err ) = proc .communicate ()
196
202
if err :
197
203
logging .info ('Failure installing %s: %s' , pkg_to_install , err )
204
+ return False
198
205
if dmg_mount :
199
206
time .sleep (5 )
200
207
detach_dmg (dmg_mount )
208
+ return True
201
209
202
210
def install_profile (pathname ):
203
211
'''Install mobileconfig located at given pathname'''
@@ -264,14 +272,29 @@ def process_items(path, delete_items=False, once=False, override={}):
264
272
d = {}
265
273
266
274
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 )
268
286
if delete_items : cleanup (package )
269
287
270
288
for profile in profiles :
271
289
if once :
272
290
if profile not in d :
273
291
if install_profile (profile ):
274
292
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 ()
275
298
else :
276
299
task = install_profile (profile )
277
300
if delete_items : cleanup (profile )
@@ -304,6 +327,8 @@ def main():
304
327
help = 'Used by launchd for scheduled runs at boot' )
305
328
group .add_argument ('--login' , action = 'store_true' ,
306
329
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' )
307
332
group .add_argument ('--on-demand' , action = 'store_true' ,
308
333
help = 'Process scripts on demand' )
309
334
group .add_argument ('--login-every' , action = 'store_true' ,
@@ -349,6 +374,8 @@ def main():
349
374
boot_once_dir ,
350
375
login_every_dir ,
351
376
login_once_dir ,
377
+ login_privileged_every_dir ,
378
+ login_privileged_once_dir ,
352
379
on_demand_dir ,
353
380
share_dir ]
354
381
@@ -388,6 +415,20 @@ def main():
388
415
process_items (login_once_dir , once = True , override = override_login_once )
389
416
if os .listdir (login_every_dir ):
390
417
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 )
391
432
else :
392
433
logging .info ('Skipping login scripts for user %s' , console_user )
393
434
@@ -452,16 +493,16 @@ def main():
452
493
if os .getuid () != 0 :
453
494
logging .error ('Must be root to add scripts to override_login_once' )
454
495
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 ()
461
502
if 'override_login_once' in prefs .keys ():
462
- prefs ['override_login_once' ].update (override_scripts )
503
+ prefs ['override_login_once' ].update (override_items )
463
504
else :
464
- prefs ['override_login_once' ] = override_scripts
505
+ prefs ['override_login_once' ] = override_items
465
506
FoundationPlist .writePlist (prefs , outset_preferences )
466
507
467
508
if args .remove_override :
0 commit comments