From ff45c8639dae54e48890ab780653d4f039b02afc Mon Sep 17 00:00:00 2001 From: Nigel Kersten Date: Fri, 1 Aug 2008 20:45:25 -0700 Subject: Feature #1487: Package creation scripts for Mac OS X --- conf/osx/PackageInfo.plist | 36 ++++++++++ conf/osx/createpackage.sh | 167 +++++++++++++++++++++++++++++++++++++++++++++ conf/osx/preflight | 11 +++ 3 files changed, 214 insertions(+) create mode 100644 conf/osx/PackageInfo.plist create mode 100755 conf/osx/createpackage.sh create mode 100755 conf/osx/preflight (limited to 'conf') diff --git a/conf/osx/PackageInfo.plist b/conf/osx/PackageInfo.plist new file mode 100644 index 0000000..84b4422 --- /dev/null +++ b/conf/osx/PackageInfo.plist @@ -0,0 +1,36 @@ + + + + + CFBundleIdentifier + com.reductivelabs.facter + CFBundleShortVersionString + {SHORTVERSION} + IFMajorVersion + {MAJORVERSION} + IFMinorVersion + {MINORVERSION} + IFPkgFlagAllowBackRev + + IFPkgFlagAuthorizationAction + RootAuthorization + IFPkgFlagDefaultLocation + / + IFPkgFlagFollowLinks + + IFPkgFlagInstallFat + + IFPkgFlagIsRequired + + IFPkgFlagOverwritePermissions + + IFPkgFlagRelocatable + + IFPkgFlagRestartAction + None + IFPkgFlagRootVolumeOnly + + IFPkgFlagUpdateInstalledLanguages + + + diff --git a/conf/osx/createpackage.sh b/conf/osx/createpackage.sh new file mode 100755 index 0000000..747dda9 --- /dev/null +++ b/conf/osx/createpackage.sh @@ -0,0 +1,167 @@ +#!/bin/bash +# +# Script to build an "old style" not flat pkg out of the facter repository. +# +# Author: Nigel Kersten (nigelk@google.com) +# +# Last Updated: 2008-07-31 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License + + +INSTALLRB="install.rb" +BINDIR="/usr/bin" +SITELIBDIR="/usr/lib/ruby/site_ruby/1.8" +PACKAGEMAKER="/Developer/usr/bin/packagemaker" +PROTO_PLIST="PackageInfo.plist" +PREFLIGHT="preflight" + + +function find_installer() { + # we walk up three directories to make this executable from the root, + # root/conf or root/conf/osx + if [ -f "./${INSTALLRB}" ]; then + installer="$(pwd)/${INSTALLRB}" + elif [ -f "../${INSTALLRB}" ]; then + installer="$(pwd)/../${INSTALLRB}" + elif [ -f "../../${INSTALLRB}" ]; then + installer="$(pwd)/../${INSTALLRB}" + else + installer="" + fi +} + +function find_facter_root() { + facter_root=$(dirname "${installer}") +} + +function install_facter() { + echo "Installing Facter to ${pkgroot}" + "${installer}" --destdir="${pkgroot}" --bindir="${BINDIR}" --sitelibdir="${SITELIBDIR}" &> /dev/null + chown -R root:admin "${pkgroot}" +} + +function get_facter_version() { + facter_version=$(RUBYLIB="${pkgroot}/${SITELIBDIR}:${RUBYLIB}" ruby -e "require 'facter'; puts Facter.version") +} + +function prepare_package() { + # As we can't specify to follow symlinks from the command line, we have + # to go through the hassle of creating an Info.plist file for packagemaker + # to look at for package creation and substitue the version strings out. + # Major/Minor versions can only be integers, so we have "0" and "245" for + # puppet version 0.24.5 + # Note too that for 10.5 compatibility this Info.plist *must* be set to + # follow symlinks. + VER1=$(echo ${facter_version} | awk -F "." '{print $1}') + VER2=$(echo ${facter_version} | awk -F "." '{print $2}') + VER3=$(echo ${facter_version} | awk -F "." '{print $3}') + major_version="${VER1}" + minor_version="${VER2}${VER3}" + cp "${facter_root}/conf/osx/${PROTO_PLIST}" "${pkgtemp}" + sed -i '' "s/{SHORTVERSION}/${facter_version}/g" "${pkgtemp}/${PROTO_PLIST}" + sed -i '' "s/{MAJORVERSION}/${major_version}/g" "${pkgtemp}/${PROTO_PLIST}" + sed -i '' "s/{MINORVERSION}/${minor_version}/g" "${pkgtemp}/${PROTO_PLIST}" + + # We need to create a preflight script to remove traces of previous + # puppet installs due to limitations in Apple's pkg format. + mkdir "${pkgtemp}/scripts" + cp "${facter_root}/conf/osx/${PREFLIGHT}" "${pkgtemp}/scripts" + + # substitute in the sitelibdir specified above on the assumption that this + # is where any previous puppet install exists that should be cleaned out. + sed -i '' "s|{SITELIBDIR}|${SITELIBDIR}|g" "${pkgtemp}/scripts/${PREFLIGHT}" + chmod 0755 "${pkgtemp}/scripts/${PREFLIGHT}" +} + +function create_package() { + rm -fr "$(pwd)/facter-${puppet_version}.pkg" + echo "Building package" + echo "Note that packagemaker is reknowned for spurious errors. Don't panic." + "${PACKAGEMAKER}" --root "${pkgroot}" \ + --info "${pkgtemp}/${PROTO_PLIST}" \ + --scripts ${pkgtemp}/scripts \ + --out "$(pwd)/facter-${facter_version}.pkg" + if [ $? -ne 0 ]; then + echo "There was a problem building the package." + cleanup_and_exit 1 + exit 1 + else + echo "The package has been built at:" + echo "$(pwd)/facter-${facter_version}.pkg" + fi +} + +function cleanup_and_exit() { + if [ -d "${pkgroot}" ]; then + rm -fr "${pkgroot}" + fi + if [ -d "${pkgtemp}" ]; then + rm -fr "${pkgtemp}" + fi + exit $1 +} + +# Program entry point +function main() { + + if [ $(whoami) != "root" ]; then + echo "This script needs to be run as root via su or sudo." + cleanup_and_exit 1 + fi + + find_installer + + if [ ! "${installer}" ]; then + echo "Unable to find ${INSTALLRB}" + cleanup_and_exit 1 + fi + + find_facter_root + + if [ ! "${facter_root}" ]; then + echo "Unable to find facter repository root." + cleanup_and_exit 1 + fi + + pkgroot=$(mktemp -d -t facterpkg) + + if [ ! "${pkgroot}" ]; then + echo "Unable to create temporary package root." + cleanup_and_exit 1 + fi + + pkgtemp=$(mktemp -d -t factertmp) + + if [ ! "${pkgtemp}" ]; then + echo "Unable to create temporary package root." + cleanup_and_exit 1 + fi + + install_facter + get_facter_version + + if [ ! "${facter_version}" ]; then + echo "Unable to retrieve facter version" + cleanup_and_exit 1 + fi + + prepare_package + create_package + + cleanup_and_exit 0 +} + +main "$@" diff --git a/conf/osx/preflight b/conf/osx/preflight new file mode 100755 index 0000000..400a261 --- /dev/null +++ b/conf/osx/preflight @@ -0,0 +1,11 @@ +#!/bin/bash +# +# Make sure that old facter cruft is removed +# This also allows us to downgrade facter as +# it's more likely that installing old versions +# over new will cause issues. +# +# ${3} is the destination volume so that this works correctly +# when being installed to volumes other than the current OS. + +rm -Rf "${3}{SITELIBDIR}/facter*" -- cgit