Last active
April 22, 2016 23:00
-
-
Save nmcspadden/5cb6131c0256b9cbd6c68846c4c6fcc9 to your computer and use it in GitHub Desktop.
register_tableau.pkg postinstall script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
"""Load the Tableau registration launchd.""" | |
import os | |
import time | |
import sys | |
import platform | |
import pwd | |
import subprocess | |
# You'll need to get this into your path if you don't have it | |
import FoundationPlist | |
def run_subp(command, input=None): | |
""" | |
Run a subprocess. | |
Command must be an array of strings, allows optional input. | |
Returns results in a dictionary. | |
""" | |
# Validate that command is not a string | |
if isinstance(command, basestring): | |
# Not an array! | |
raise TypeError('Command must be an array') | |
proc = subprocess.Popen(command, | |
stdout=subprocess.PIPE, | |
stderr=subprocess.STDOUT) | |
(out, err) = proc.communicate(input) | |
result_dict = { | |
"stdout": out, | |
"stderr": err, | |
"status": proc.returncode, | |
"success": True if proc.returncode == 0 else False | |
} | |
return result_dict | |
def getconsoleuser(): | |
'''Uses Apple's SystemConfiguration framework to get the current | |
console user''' | |
from SystemConfiguration import SCDynamicStoreCopyConsoleUser | |
cfuser = SCDynamicStoreCopyConsoleUser( None, None, None ) | |
return cfuser[0] | |
uid = pwd.getpwnam(getconsoleuser()).pw_uid | |
launcha = '/Library/LaunchAgents/com.facebook.CPE.tableauregister.plist' | |
cmd = [ | |
'/bin/launchctl', 'bootstrap', | |
'gui/%s' % uid, | |
launcha | |
] | |
# Bootstrap the registration launch agent | |
result = run_subp(cmd) | |
if not result['success']: | |
print >> sys.stderr, ('CPE-TableauRegister: Failed to load launch agent.') | |
sys.exit(1) | |
# Wait 15 seconds for Tableau to register | |
time.sleep(15) | |
# For simplicity, I'm making an assumption about the home directory | |
reg_path = os.path.join( | |
'/Users', getconsoleuser(), | |
'Library', 'Preferences', | |
'com.tableau.Registration.plist' | |
) | |
iterations = 0 | |
while True: | |
if iterations > 10: | |
# We waited almost a minute and it's still not registered | |
print >> sys.stderr, ('CPE-TableauRegister: Unregistered after 10 tries.') | |
sys.exit(1) | |
reg_plist = FoundationPlist.readPlist(reg_path) | |
if len(reg_plist.keys()) > 12: | |
# More than 12 keys means it's registered | |
break | |
time.sleep(5) | |
iterations += 1 | |
# Once registered, we can remove the launch agent | |
# On 10.11, we can use 'launchctl bootout' to unload the launch agent first | |
currentOS = int(platform.mac_ver()[0].split('.')[1]) | |
if currentOS >= 11: | |
unload_cmd = [ | |
'/bin/launchctl', 'bootout', | |
'gui/%s' % uid, | |
launcha | |
] | |
result = run_subp(unload_cmd) | |
if not result['success']: | |
print >> sys.stderr, ('CPE-TableauRegister: Failed to unload launch agent.') | |
os.remove(launcha) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment