Skip to content

Instantly share code, notes, and snippets.

@ChinaXing
Last active December 14, 2015 12:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ChinaXing/5087854 to your computer and use it in GitHub Desktop.
Save ChinaXing/5087854 to your computer and use it in GitHub Desktop.
yum install package-lists, return the result.
#!/bin/env bash
# -----------------------------------------------------------------------------------------
# Function : install rpm package by yum tool
#
# Date : 2013-04-24
# 2013-05-07, 去掉日志输出,只输出结果,输出结果进行调整
# 2013-06-08, 添加选项化参数,增加appname 这一参数
# 2014-03-06, 如果appname目录没有则创建
# 2014-03-12, 增加t-admin-noweb-tomcat, t-admin-deploy-withnginx 分为tomcat和jboss
#
# Author : yunxing.cyx@taobao.com
#
# Input : [ -a 'APPNAME' ] -p 'pkg1' -p 'pkg2' -p 'pkg3 -b current' -p pkg4 ...
#
# the pkgs want to install as a list splitable by blank charactor.
# you can specify the branch as : 'pkg3 -b current', single quote is needed.
#
# Output : the Output will be output to STDOUT, you may need redirect it.
# [SUCCEED:num: ... ][FAILURE:num: ... ]
#
# The Execute-Result is in such format : [RESULT] [SUCCEED:succed_num][FAILURE:failure_num:failure_pkg_list]
# you can parse it and find what you want
#
# Log : Normal Level Log will be print to STDOUT, Error Level Log will be print to both STDOUT and STDERR.
# Log has prefix "[LEVEL]", such as "[INFO]", "[ERROR]".
#
# The yum command's log will print to :
# $YUM_INSTALL_LOG.${PKG_NAME} for STDOUT log and
# $YUM_INSTALL_LOG.${PKG_NAME}.err for STDERR log
# by default, YUM_INSTALL_LOG equal to "/tmp/yum_install_log"
#
# one log file per package, which easy to be found.
# -----------------------------------------------------------------------------------------
YUM_INSTALL_LOG="/tmp/yum_install_log"
# 更改/home/admin/appname 目录
function do_mv_appname
{
[ -n $APPNAME ] || return
[ $# -gt 0 ] || return
local PKG_MV_APPNAME="t-admin-deploy-noweb-tomcat7 t-admin-deploy-withnginx-tomcat7 t-admin-deploy-withnginx t-admin-deploy-withnginx-tomcat t-admin-deploy-withnginx-jboss t-admin-deploy-withapache t-admin-deploy-noweb t-admin-deploy-noweb-tomcat"
local JBOSSCTL="/home/admin/appname/bin/jbossctl"
for p in $PKG_MV_APPNAME
do
if [ $(echo "$1" | grep -E -c "^$p( |\$|-[0-9])" 2>/dev/null) -ne 0 ]
then
[ -d /home/admin/appname ] || break
# 替换 jbossctl 中的 project name 为 应用名
[ -f $JBOSSCTL ] && sed -i '/^PROJECT_NAME=/s/^.*$/PROJECT_NAME="'$APPNAME'"/' $JBOSSCTL
[ -e /home/admin/$APPNAME ] && mv /home/admin/$APPNAME{,.old}
[ -e /home/admin/$APPNAME ] || mv /home/admin/{appname,$APPNAME}
break
fi
done
}
# 更改appname 目录,修改jbossctl配置
function do_apply_appname
{
[ -n $APPNAME ] || return
local JBOSSCTL="/home/admin/$APPNAME/bin/jbossctl"
[ -e /home/admin/$APPNAME ] && mv /home/admin/$APPNAME{,.old}
[ -d /home/admin/appname ] || mkdir -p /home/admin/appname && chown admin.admin /home/admin/appname
[ -e /home/admin/$APPNAME ] || mv /home/admin/{appname,$APPNAME}
[ -f $JBOSSCTL ] && sed -i '/^PROJECT_NAME=/s/^.*$/PROJECT_NAME="'$APPNAME'"/' $JBOSSCTL
}
# 安装完一个包后要做的事情
function do_after_install
{
do_mv_appname "$@"
}
# 安装完所有包后执行
function do_after_install_all
{
do_apply_appname
}
function rebuild_rpmdb
{
# 先执行下面的命令,重建立rpm数据库,避免数据库破坏导致yum install的时候卡住
# echo "[INFO] Yum : rebuild rpm db"
rm -rf /var/lib/rpm/__db* &>/dev/null
rpm --rebuilddb &>/dev/null
}
# ---- Main ---- #
rebuild_rpmdb
#echo "[INFO] Yum : begin to install package : $@"
Failure_PKG=""
Success_PKG=""
#
Failure=0
Success=0
# all PAKCAGES
declare -a PKGS
idx=0
while getopts "a:p:" opt;do
case $opt in
a) APPNAME=$OPTARG
;;
p) PKGS[$((idx++))]=$OPTARG
;;
esac
done
#
cat <<EOF > ${YUM_INSTALL_LOG}
:ALL PACKAGES ( total $idx):
$(IFS=$'\n'; echo "${PKGS[*]}")
EOF
for i in "${PKGS[@]}"
do
echo "[INFO] Yum : Install => $i" >> ${YUM_INSTALL_LOG}
PKG_NAME=${i%% *}
yum install -y $i >${YUM_INSTALL_LOG}.$PKG_NAME 2>${YUM_INSTALL_LOG}.${PKG_NAME}.error
retval=$?
if [ $retval -ne 0 ]
then
Failure_PKG="$Failure_PKG '$i'"
((Failure++))
else
if [ "x$(rpm -q $PKG_NAME)" = "x" ]
then
Failure_PKG="$Failure_PKG '$i'"
((Failure++))
else
((Success++))
Success_PKG="$Success_PKG '$i'"
do_after_install "$PKG_NAME"
fi
fi
done >/dev/null 2>/dev/null </dev/null
# after install #
#do_after_install_all &>/dev/null
echo [SUCCEED:$Success:$Success_PKG][FAILURE:$Failure:$Failure_PKG]
exit 0
# --- END --- #
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment