diff options
-rw-r--r-- | README.md | 4 | ||||
-rwxr-xr-x | mowgli.py | 29 |
2 files changed, 22 insertions, 11 deletions
@@ -18,9 +18,9 @@ To update all installed Office applications, just issue: ```sudo mowgli.py -ia``` -You can also supply an optional path to the MAU pref file: +You can also supply an optional path to the home folder: -```sudo mowgli.py -ia /Users/shared/Library/Preferences/com.microsoft.autoupdate2.plist``` +```sudo mowgli.py -ia /Users/shared``` Special thanks to [Charles](https://www.charlesproxy.com) - the excellent web debugging proxy for making the reverse-engineering possible! @@ -17,7 +17,6 @@ NAMES = { 'PPT315': 'PowerPoint', 'MSWD15': 'Word', 'MSau03': 'AutoUpdate', - 'Merp2': 'Error Reporting', 'SLVT': 'Silverlight', } @@ -35,12 +34,16 @@ def get_plist(path): return plistlib.readPlistFromString(plist) -def check(pref='~/Library/Preferences/com.microsoft.autoupdate2.plist'): +def check(home=None, pref='Library/Preferences/com.microsoft.autoupdate2.plist'): """Collect info about available updates. """ results = [] + if home is None: + home = os.getenv('HOME') + pref = os.path.join(home, pref) + try: plist = get_plist(os.path.expanduser(pref)) except Exception as e: @@ -52,6 +55,10 @@ def check(pref='~/Library/Preferences/com.microsoft.autoupdate2.plist'): path, info = a app_id = info.get('Application ID') + # Skip Microsoft Error Reporting + if app_id == 'Merp2': + continue + try: app_info = get_plist(os.path.join(path, 'Contents/Info.plist')) except Exception as e: @@ -63,13 +70,17 @@ def check(pref='~/Library/Preferences/com.microsoft.autoupdate2.plist'): # Lync (UCCP14) is special filename = '0409%s.xml' if app_id == 'UCCP14' else '0409%s-chk.xml' - conn = httplib.HTTPSConnection('officecdn.microsoft.com') - conn.request("GET", BASEURL + filename % app_id) - data = conn.getresponse().read() + try: + conn = httplib.HTTPSConnection('officecdn.microsoft.com') + conn.request("GET", BASEURL + filename % app_id) + data = conn.getresponse().read() + except Exception as e: + raise Exception('Failed to check for updates: %s' % e) try: p = plistlib.readPlistFromString(data) + if app_id == 'UCCP14': # Lync being special again p = p[0] result['location'] = p.get('Location') @@ -88,7 +99,7 @@ def check(pref='~/Library/Preferences/com.microsoft.autoupdate2.plist'): # Fetch the update details updates = plistlib.readPlistFromString(data) for i in updates: - if i.get('Baseline Version') == result['installed']: + if i.get('Baseline Version') == result['installed'] or app_id == 'MSau03': result['location'] = i.get('Location') result['size'] = i.get('FullUpdaterSize') results.append(result) @@ -124,10 +135,10 @@ def install(pkg): if __name__ == '__main__': if len(sys.argv) < 2: - print("usage: {0} [-l | -i [pref]".format(os.path.basename(sys.argv[0]))) + print("usage: {0} [-l | -i [home]".format(os.path.basename(sys.argv[0]))) sys.exit(1) - print("* Checking for updates...") + print("* Finding available software") if len(sys.argv) > 2: if not os.path.exists(sys.argv[2]): @@ -140,7 +151,7 @@ if __name__ == '__main__': if sys.argv[1] == '-l': for u in updates: - print("{id}\t{name}\t{installed}\t{available}\t{size}".format(**u)) + print(" * {id}\n {name} {installed} - {available} [{type}]".format(**u)) if sys.argv[1] == '-ia': for u in updates: |