Skip to content

Instantly share code, notes, and snippets.

@MagerValp
Created August 7, 2012 15:25
Show Gist options
  • Save MagerValp/3286357 to your computer and use it in GitHub Desktop.
Save MagerValp/3286357 to your computer and use it in GitHub Desktop.
Create a package
#!/usr/bin/env python
import sys
import os.path
import shutil
import subprocess
import re
re_ls_acl = re.compile(r'^ *\d+: *')
def usage():
print >>sys.stderr, "Usage: copymodes srcroot dstroot"
def pathslash(path):
if not path.endswith("/"):
return path + "/"
else:
return path
def copymeta(src, dst):
# copy mode, flags, and time stamps
shutil.copystat(src, dst)
# copy uid and gid
s = os.stat(src)
try:
os.chown(dst, s.st_uid, s.st_gid)
except OSError as e:
print >>sys.stderr, "chown: %s" % e.strerror
# copy ACLs
ls = subprocess.Popen(("ls", "-led", src), stdout=subprocess.PIPE)
(out, err) = ls.communicate()
if ls.returncode != 0:
print >>sys.stderr, "ls -led: failed with returncode %d" % e.returncode
acls = [re_ls_acl.sub("", l) for l in out.splitlines(True)[1:]]
if acls:
chmod = subprocess.Popen(("chmod", "-E", dst), stdin=subprocess.PIPE)
chmod.communicate("".join(acls))
def main(argv):
if len(argv) != 3:
usage()
return 1
srcroot = pathslash(argv[1])
dstroot = pathslash(argv[2])
if not os.path.isdir(srcroot):
print >>sys.stderr, "%s: not a directory" % srcroot
return 1
if not os.path.isdir(dstroot):
print >>sys.stderr, "%s: not a directory" % dstroot
return 1
for (dirpath, dirnames, filenames) in os.walk(dstroot):
dst = pathslash(dirpath)
tail = dst[len(dstroot):]
src = srcroot + tail
if os.path.isdir(src):
print src
copymeta(src, dst)
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv))
#!/bin/bash
#
# Create a package of Login and Logout Hooks.
# Package settings.
PKGNAME="LoginHookSecureLog"
PKGROOT="loginhooksecurelog"
PKGSCRIPTS=scripts
PKGVERSION="1.0"
PKGID="se.gu.it.pkg.$PKGNAME"
PKGFILE=`date +"$PKGNAME-$PKGVERSION-%Y%m%d.pkg"`
PKGTARGET="10.5"
PKGTITLE="Filter passwords from secure.log"
PACKAGEMAKER=""
if [ -e "/Developer/usr/bin/packagemaker" ]; then
PACKAGEMAKER="/Developer/usr/bin/packagemaker"
else
while read path; do
if [ -e "$path/Contents/MacOS/PackageMaker" ]; then
PACKAGEMAKER="$path/Contents/MacOS/PackageMaker"
break
fi
done < <(mdfind "(kMDItemCFBundleIdentifier == com.apple.PackageMaker)")
fi
if [ -z "$PACKAGEMAKER" ]; then
echo "packagemaker not found"
exit 1
fi
echo "Cleaning"
echo "Authenticating with sudo"
sudo rm -rf "$PKGROOT"
sudo rm -rf "$PKGNAME"-*-*.pkg
echo "Creating package template"
mkdir -p "$PKGROOT/Library/Scripts"
cp -r DAFGU "$PKGROOT/Library/Scripts/"
# mkdir -p "$PKGROOT/Library/LaunchAgents"
# cp LaunchAgents/*.plist "$PKGROOT/Library/LaunchAgents/"
echo "Packaging $PKGTITLE as $PKGID version $PKGVERSION from $PKGROOT"
echo "Cleaning package root"
find "$PKGROOT" -name .DS_Store -print0 | xargs -0 rm -f
find "$PKGROOT" -name .svn -print0 | xargs -0 rm -rf
xattr -d -r com.macromates.caret "$PKGROOT"
xattr -d -r com.apple.FinderInfo "$PKGROOT"
echo "Changing owner"
sudo chown -hR root:admin "$PKGROOT"
echo "Fixing permissions"
sudo ./copymodes / "$PKGROOT"
echo "Creating package"
sudo "$PACKAGEMAKER" \
--root "$PKGROOT" \
--id "$PKGID" \
--title "$PKGTITLE" \
--version "$PKGVERSION" \
--target $PKGTARGET \
--no-recommend \
--no-relocate \
--out "$PKGFILE"
# --scripts "$PKGSCRIPTS"
# --info
# --resources
if [ $? -ne 0 ]; then
echo "Package creation failed"
exit 1
fi
echo "Resetting ownership"
sudo chown -hR $UID "$PKGFILE"
echo "Cleaning"
sudo rm -rf "$PKGROOT"
echo "Created $PKGFILE"
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment