Skip to content

Instantly share code, notes, and snippets.

@crazed
Created October 4, 2012 16:55
Show Gist options
  • Save crazed/3834924 to your computer and use it in GitHub Desktop.
Save crazed/3834924 to your computer and use it in GitHub Desktop.
build mcollective pkgs on OS X
#!/bin/bash
MPATH=$1
BETCDIR='/etc/mcollective'
BRUBYDIR='/Library/Ruby/Site/1.8'
BSBINDIR='/usr/sbin'
BBINDIR='/usr/bin'
BLIBEXECDIR='/usr/libexec/mcollective'
BDOCDIR='/usr/share/doc/mcollective'
BLAUNCHDIR='/Library/LaunchDaemons'
BLOGDIR='/var/log/mcollective'
PACKAGEMAKER='/Applications/PackageMaker.app/Contents/MacOS/PackageMaker'
if [ -z $MPATH ]; then
echo 'Please give the path to the MCollective source directory'
exit 1
fi
msg_stomp() {
echo "It is recommended to install stomp on this system using ruby gems"
exit 2
}
msg_xcode() {
echo 'It is required to have the latest XCode installed'
exit 3
}
# Make sure we have stomp so we can load mcollective
/usr/bin/ruby <<EOF || msg_stomp
require 'rubygems'
require 'stomp'
EOF
# Make sure we have PackageMaker installed
[ -x $PACKAGEMAKER ] || msg_xcode
# Get the MCollective version
export RUBYLIB=$RUBYLIB:$MPATH/lib
mcversion=$(/usr/bin/ruby <<EOF
require 'mcollective'
puts MCollective.version
EOF
)
# Make our tmp directory
tmpbase=`basename $0`
common_tmpdir=`mktemp -d /tmp/${tmpbase}-common_$mcversion.XXXX` || exit 1
client_tmpdir=`mktemp -d /tmp/${tmpbase}-client_$mcversion.XXXX` || exit 1
tmpdir=`mktemp -d /tmp/${tmpbase}_$mcversion.XXXX` || exit 1
# Build the common environment
mkdir -p "$common_tmpdir/$BRUBYDIR"
mkdir -p "$common_tmpdir/$BLIBEXECDIR"
mkdir -p "$common_tmpdir/$BDOCDIR"
mkdir -p "$common_tmpdir/$BLOGDIR"
cp -r $MPATH/lib/mcollective $common_tmpdir/$BRUBYDIR/
cp $MPATH/lib/mcollective.rb $common_tmpdir/$BRUBYDIR/
cp -r $MPATH/plugins/mcollective $common_tmpdir/$BLIBEXECDIR/
cp $MPATH/COPYING $common_tmpdir/$BDOCDIR/
# Build the server environment
mkdir -p "$tmpdir/$BSBINDIR"
mkdir -p "$tmpdir/$BETCDIR"
mkdir -p "$tmpdir/$BETCDIR/ssl/clients"
mkdir -p "$tmpdir/$BLAUNCHDIR"
cp $MPATH/bin/mcollectived $tmpdir/$BSBINDIR/mcollectived
cp $MPATH/etc/facts.yaml.dist $tmpdir/$BETCDIR/facts.yaml
cp $MPATH/etc/server.cfg.dist $tmpdir/$BETCDIR/server.cfg
# This is needed for macs since launcd will handle daemonizing
perl -i -pe 's/daemonize = 1/daemonize = 0/' $tmpdir/$BETCDIR/server.cfg
# Build the client environment
mkdir -p "$client_tmpdir/$BETCDIR"
mkdir -p "$client_tmpdir/$BSBINDIR"
cp $MPATH/etc/client.cfg.dist $client_tmpdir/$BETCDIR/client.cfg
cp $MPATH/etc/rpc-help.erb $client_tmpdir/$BETCDIR/
cp $MPATH/bin/mc-call-agent $client_tmpdir/$BSBINDIR/
cp $MPATH/bin/mco $client_tmpdir/$BSBINDIR/
#Build our launchd property list file
cat - > $tmpdir/$BLAUNCHDIR/org.marionette-collective.mcollective.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/sbin:/usr/sbin:/bin:/usr/bin</string>
<key>RUBYLIB</key>
<string>/Library/Ruby/Site/1.8</string>
</dict>
<key>Label</key>
<string>org.marionette-collective.mcollective</string>
<key>OnDemand</key>
<false/>
<key>KeepAlive</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/mcollectived</string>
<string>--config=/etc/mcollective/server.cfg</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceDescription</key>
<string>MCollective Server</string>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
EOF
#Make our Packages. This requires XCode be installed
$PACKAGEMAKER -r $tmpdir --version $mcversion --title "MCollective" -l / -o MCollective_$mcversion.pkg -i org.marionette-collective.mcollective
$PACKAGEMAKER -r $common_tmpdir --version $mcversion --title "MCollective Common" -l / -o MCollective-Common_$mcversion.pkg -i org.marionette-collective.mcollective-common
$PACKAGEMAKER -r $client_tmpdir --version $mcversion --title "MCollective Client" -l / -o MCollective-Client_$mcversion.pkg -i org.marionette-collective.mcollective-client
# Make sure that we install the stomp gem, this is ugly and should be part of the package
cat - > ./MCollective-Common_$mcversion.pkg/Contents/Resources/postflight <<EOF
#!/bin/bash
/usr/bin/gem install --no-ri --no-rdoc stomp
EOF
chmod +x ./MCollective-Common_$mcversion.pkg/Contents/Resources/postflight
# launchd complains if the permissions aren't right, this is a dumb hack that
# I needed since PackageMaker doesn't seem to respect permissions (originally had chmod 644 in the tmpdir)
cat - > ./MCollective_$mcversion.pkg/Contents/Resources/postflight <<EOF
#!/bin/bash
chmod 644 /Library/LaunchDaemons/org.marionette-collective.mcollective.plist
EOF
chmod +x ./MCollective_$mcversion.pkg/Contents/Resources/postflight
#Clean up
rm -rf $tmpdir
rm -rf $common_tmpdir
rm -rf $client_tmpdir
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment