#!/bin/sh # Copyright:: Copyright (c) 2014 eGlobalTech, Inc., all rights reserved # # Licensed under the BSD-3 license (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License in the root of the project or at # # http://egt-labs.com/mu/LICENSE.html # # 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. if [ -t 0 ]; then BOLD=`tput bold` NORM=`tput sgr0` BLACK=`tput setaf 0` RED=`tput setaf 1` GREEN=`tput setaf 2` YELLOW=`tput setaf 3` BLUE=`tput setaf 4` PINK=`tput setaf 5` CYAN=`tput setaf 6` WHITE=`tput setaf 7` fi set -e ################################################# ################## SET VARIABLES ################ ################################################# scriptpath="`dirname $0`" USER=`whoami` HOMEDIR="`eval echo ~$USER`" if [ -z $MU_INSTALLDIR ];then MU_INSTALLDIR="/opt/mu" fi bindir="$MU_INSTALLDIR/bin" MU_LIBDIR="$MU_INSTALLDIR/lib" MU_DATADIR="$MU_INSTALLDIR/var" ################################################# ################## Updated Cmds ################ ################################################# DEFAULT_BRANCH="master" usage() { echo "Updates Mu scripts in $MU_INSTALLDIR/bin. Optionally refreshes from git." echo "Usage: $0 [-b ] [-f [-c ] ] [-d] [-u] [-r]" echo " -f: Forcibly re-sync $MU_LIBDIR from Git. Saves your" echo " working changes unless -d is specified." echo " -c (requires -f): Reset to a specific commit." echo " -b : Use a branch other than $DEFAULT_BRANCH." echo " -d: Discard local changes to current branch." echo " -u: Update chef artifacts after update, regardless of cookbook changes." exit 1 } rebuild_chef_artifacts=0 run_chef_client=0 while getopts "fb:c:sdruh" opt; do case $opt in f) force_sync=1 ;; c) force_commit=$OPTARG ;; b) branch=$OPTARG ;; d) discard=1 ;; r) run_chef_client=1 ;; u) rebuild_chef_artifacts=1 ;; h) usage ;; \?) usage ;; esac done if [ "$force_commit" != "" -a "$force_sync" != "1" ];then usage fi mkdir -p $MU_DATADIR/tmp /bin/cp -a $MU_LIBDIR/cookbooks $MU_DATADIR/tmp/cookbook_changes.$$ mkdir -p $MU_DATADIR/tmp/berks_changes.$$ /bin/cp -a $MU_LIBDIR/Berksfile* $MU_DATADIR/tmp/berks_changes.$$/ /bin/rm -f $MU_DATADIR/tmp/cookbook_changes.$$/cookbooks/mu-tools/files/default/Mu_CA.pem cd $MU_LIBDIR lastbranch="`git branch | egrep '^\* ' | awk '{print $2}'`" if [ "$branch" == "" ];then branch=$lastbranch fi export MUBRANCH=$branch # Stash unchecked local changes so we can put things back how we found them if [ "$discard" != "1" ]; then stashed_changes=1 if [ "`git stash | grep '^No local changes to save'`" ];then stashed_changes=0 else echo "${GREEN}Stashing changes from working tree${NORM}" git --no-pager stash list | head -1 fi fi # Swap branches, if pertinent if [ "$branch" != "$lastbranch" ];then echo "${YELLOW}Switching from $lastbranch to $branch${NORM} in `pwd`" set +e git fetch set -e git checkout $branch else set +e git fetch set -e git checkout -f $branch fi if [ "$force_sync" == "1" ]; then echo "${RED}Forcibly resetting $repo_name to branch $branch${NORM}" if [ ! -z $force_commit ];then # We got asked to reset to a particular commit, do so echo "${RED}Using comment $force_commit${NORM}" git reset --hard $force_commit else git reset --hard fi echo "${YELLOW}Updating $repo_name branch $branch from origin${NORM}" git pull origin $branch else echo "${YELLOW}Updating $repo_name branch $branch from origin${NORM}" set +e git pull origin $branch set -e fi git config branch.${branch}.remote origin git config branch.${branch}.merge refs/heads/$branch if [ "`diff -r $MU_LIBDIR/cookbooks $MU_DATADIR/tmp/cookbook_changes.$$`" != "" ];then rebuild_chef_artifacts=1 set -- "-u" "$@" elif [ "`diff -r $MU_LIBDIR/Berksfile $MU_DATADIR/tmp/berks_changes.$$/Berksfile`" != "" ];then rebuild_chef_artifacts=1 set -- "-u" "$@" elif [ "`diff -r $MU_LIBDIR/Berksfile.lock $MU_DATADIR/tmp/berks_changes.$$/Berksfile.lock`" != "" ];then rebuild_chef_artifacts=1 set -- "-u" "$@" fi set +e /sbin/service nagios stop /sbin/service mu-momma-cat stop set -e echo "${GREEN}Cleaning gems in ${BOLD}/usr/local/ruby-current${NORM}${GREEN}${NORM}" cd $MU_LIBDIR/modules /usr/local/ruby-current/bin/bundle update /usr/local/ruby-current/bin/bundle clean --force cd chef_major="`/opt/chef/bin/chef-apply --version | awk '{print $2}' | cut -d\. -f1`" if [ "$chef_major" == "12" ];then DIST_VERSION=`rpm -qa \*-release\* | grep -Ei "redhat|^centos" | cut -d"-" -f3` # IS_AMAZON=0 if [ "$DIST_VERSION" == "" ];then # funny package name in Amazon Linux DIST_VERSION=6 # IS_AMAZON=1 elif [ "$DIST_VERSION" == "server" ];then # funny package name in RHEL6 DIST_VERSION="6" fi rpm -Uvh https://packages.chef.io/files/stable/chef/14.11.21/el/${DIST_VERSION}/chef-14.11.21-1.el${DIST_VERSION}.x86_64.rpm fi /opt/chef/bin/chef-apply $MU_LIBDIR/cookbooks/mu-master/recipes/init.rb /bin/rm -rf $MU_DATADIR/tmp/cookbook_changes.$$ /bin/rm -rf $MU_DATADIR/tmp/berks_changes.$$ /bin/rm -rf /root/.berkshelf/ if [ "$rebuild_chef_artifacts" == "1" ];then cd $MU_LIBDIR && berks install $bindir/mu-upload-chef-artifacts -p fi # Make double sure our purely-mu cookbooks are uploaded and ready for platform # repos to reference. $bindir/mu-upload-chef-artifacts -r mu # Now a regular upload for platform repos. $bindir/mu-upload-chef-artifacts for dir in $MU_LIBDIR /opt/chef/embedded /opt/opscode/embedded /usr/local/ruby-current/;do echo "${GREEN}Sanitizing permissions in ${BOLD}$dir${NORM}${GREEN}${NORM}" for tree in `ls -1 $dir/`;do find $dir/$tree -type d -exec chmod go+rx {} \; find $dir/$tree -type f -exec chmod go+r {} \; done done chmod go+rx $MU_LIBDIR/bin/* $bindir/mu-configure -n set -e if [ "$branch" != "$lastbranch" -a "$discard" != "1" ];then echo "${GREEN}You are now on ${BOLD}$branch${NORM}${GREEN} (you were on ${BOLD}$lastbranch${NORM}${GREEN})${NORM}" fi if [ "$stashed_changes" == "1" ];then if [ "$branch" != "$lastbranch" ];then echo "${GREEN}You have stashed changes from your working tree, see ${BOLD}git stash list${NORM}" else echo "${GREEN}Restoring stashed changes from your working tree${NORM}" git stash pop fi fi