legacy/autodmg_cache_builder/autodmg_org.py (107 lines of code) (raw):

#!/usr/bin/python # Copyright (c) Facebook, Inc. and its affiliates. """These are the org-specific AutoDMG package building tools.""" import os import sys import tempfile import shutil from autodmg_utility import build_pkg, run, populate_ds_repo, pkgbuild sys.path.append('/Library/CPE/lib/flib/modules') try: import FoundationPlist as plistlib except ImportError: print "Using plistlib" import plistlib # global DESTINATION DESTINATION = '/Library/AutoDMG' # Sample package construction list # Each dict contains the information necessary to build a package from a given # source, with receipt and file name, and potentially a target. PKG_LIST = [ # Wallpapers are present at image time { 'pkg_name': 'cpe_wallpapers', 'source': '/Users/Shared/Wallpapers', 'receipt': 'com.facebook.cpe.wallpapers', 'comment': 'Building Wallpapers package' }, # Suppress Diagnostics prompt { 'pkg_name': 'suppress_diagnostics', 'source': '/Library/AutoDMG/additions/diagnostics', 'receipt': 'com.facebook.cpe.suppress_diagnostics', 'comment': 'Building Diagnostic Suppression package', 'target': '/Library/Application Support/CrashReporter' }, ] def build_bare_dmg(source, cache, logpath, loglevel, repo_path): """Build a bare OS DMG for Donation/bare usage.""" dmg_output_path = os.path.join(cache, 'Bare.hfs.dmg') if os.path.isfile(dmg_output_path): print "Donation image already found, not building.\n" return print "Creating AutoDMG-donation.adtmpl." templatepath = os.path.join(cache, 'AutoDMG-bare.adtmpl') plist = dict() plist["ApplyUpdates"] = True plist["SourcePath"] = source plist["TemplateFormat"] = "1.0" plist["VolumeName"] = "Macintosh HD" # Complete the AutoDMG-donation.adtmpl template plistlib.writePlist(plist, templatepath) autodmg_cmd = [ '/Applications/AutoDMG.app/Contents/MacOS/AutoDMG' ] if os.getuid() == 0: # We are running as root print "Running as root." autodmg_cmd.append('--root') logfile = os.path.join(logpath, 'bare.log') # Now kick off the AutoDMG build print "Building bare image..." if os.path.isfile(dmg_output_path): os.remove(dmg_output_path) cmd = autodmg_cmd + [ '-L', loglevel, '-l', logfile, 'build', templatepath, '--download-updates', '-o', dmg_output_path] run(cmd) print "Moving bare image to DS Repo." populate_ds_repo(dmg_output_path, repo_path) # local management functions def munki_bootstrap(cache_path): """Build a Munki bootstrap package.""" pkg_output_file = os.path.join(cache_path, 'munki_bootstrap.pkg') if not os.path.isfile(pkg_output_file): print "Building Munki bootstrap package..." temp_dir = tempfile.mkdtemp(prefix='munkiboot', dir='/tmp') shared = os.path.join(temp_dir, 'Users/Shared') os.makedirs(shared) open(os.path.join( shared, '.com.googlecode.munki.checkandinstallatstartup' ), 'a').close() pkgbuild( temp_dir, 'com.facebook.cpe.munki.bootstrap', '1.0', pkg_output_file ) shutil.rmtree(temp_dir, ignore_errors=True) if os.path.isfile(pkg_output_file): return pkg_output_file # If we failed for some reason, return None return None # Package already exists return pkg_output_file def suppress_registration(cache_path): """Build a package to suppress Setup Assistant, returns path to it.""" pkg_output_file = os.path.join(cache_path, 'suppress_registration.pkg') if not os.path.isfile(pkg_output_file): print "Building registration suppression package..." temp_dir = tempfile.mkdtemp(prefix='suppressreg', dir='/tmp') receipt = os.path.join(temp_dir, 'Library/Receipts') os.makedirs(receipt) open(os.path.join(receipt, '.SetupRegComplete'), 'a').close() vardb = os.path.join(temp_dir, 'private/var/db/') os.makedirs(vardb) open(os.path.join(vardb, '.AppleSetupDone'), 'a').close() pkgbuild( temp_dir, 'com.facebook.cpe.suppress_registration', '1.0', pkg_output_file ) shutil.rmtree(temp_dir, ignore_errors=True) if os.path.isfile(pkg_output_file): return pkg_output_file # If we failed for some reason, return None return None # Package already exists return pkg_output_file def run_unique_code(args): """Run any special code or builds. Arguments from the script are passed in. Return a list of any packages you want included in the additions. """ pkg_list = [] # EXAMPLE ORGANIZATION-UNIQUE CODE: # Perhaps you want to build a bunch of extra packages to include. # You could use the PKG_LIST list above to set up your package building. # ******** # for package in PKG_LIST: # pkg_list.append( # build_pkg( # package['source'], # package['pkg_name'], # package['receipt'], # package.get('target', package['source']), # DESTINATION, # package['comment'] # ) # ) # Each package needs to be added to the pkg_list to be returned, # so it can be added to the overall additions list. # ******** # EXAMPLE CUSTOM PACKAGE FUNCTIONS # You can create your own functions for building packages, and # include those too. Append each package to pkg_list: # ******** # registration_pkg = suppress_registration(args.cache) # if registration_pkg: # pkg_list.append(registration_pkg) # munki_bootstrap_pkg = munki_bootstrap(args.cache) # if munki_bootstrap_pkg: # pkg_list.append(munki_bootstrap_pkg) # ******** # EXAMPLE BARE IMAGE: # If you want to build your own bare/thin image, using just the OS, # use the build_bare_dmg() function: # ******** # build_bare_dmg(args.source, args.cache, args.logpath, # str(args.loglevel), args.dsrepo) # ******** return pkg_list if __name__ == '__main__': run_unique_code({})