版权 © 2011, 2012 http://netkiller.github.com
摘要
本程序用于收集,防火墙,路由器,交换机等日志
下面是我多年积累下来的经验总结,整理成文档供大家参考:
#!/bin/bash ##################################################################### # Description: Automation Deployment Script # Netkiller series utilities # Author: Neo<openunix@163.com> # Homepage: http://netkiller.sourceforge.net/ # $Id$ ##################################################################### if [ -z $DEPLOY_HOME ]; then echo 'Example: export DEPLOY_HOME=/srv/deploy' exit fi if [ -f $DEPLOY_HOME/conf/default.conf ];then . $DEPLOY_HOME/conf/default.conf fi #================================================================================ LOGFILE="deploy.$(date -d "today" +"%Y-%m-%d").log" TMPDIR=$(mktemp -d --suffix=.tmp -p /tmp deploy.XXXXXX) #SUBVERSION= SVN=/usr/bin/svn TIMEPOINT=`date '+%Y%m%d-%H%M%S'` BACKUPDIR=$TMPDIR/backup/${TIMEPOINT} RSYNC="rsync" UPLOAD_DIR=$TMPDIR REVISION='' #================================================================================ if [ ! -d ${TMPDIR} ]; then mkdir ${TMPDIR} fi if [ ! -d ${BACKUPDIR} ]; then mkdir -p $BACKUPDIR fi #pkgname=${project}-${version}-${datetime}.pkg #tar jcvf ${pkgname} /tmp/${project} --remove-files >> deploy.log ##################################################################### function usage(){ echo $"Usage: $0 [OPTION] <server-id> <directory/timepoint>" echo -ne " OPTION: deploy <domain> <host> revert <domain> <host> <revision> backup <domain> <host> <directory> list list <domain> <host> import <domain> <host> <dir> export <domain> <host> <dir> clean <domain> <host> log <project> <line> conf list conf new <project> conf remove <project> conf show <project> conf edit <project> cron show cron setup cron edit " exit } function logging(){ local logfile="$LOGDIR/$LOGFILE" local timepoint=$(date -d "today" +"%Y-%m-%d_%H:%M:%S") local status=$1 local message=$2 echo "[$timepoint] [${status}] ${message}" >> $logfile } #logging 'OK' 'This is test msg!!!' function conf(){ local cmd=$2 local prj=$3 case $cmd in list) ls $SYSCONFDIR ;; new) read -p "Project directory: " prjdir if [ -z $prjdir ]; then exit fi if [ -f $SYSCONFDIR/$prjdir.conf ]; then echo "cannot create config $prjdir.conf': File exists" exit 1 fi read -p "subversion url: $REPOSITORIES/: " svnurl if [ -z $svnurl ]; then svnurl=$REPOSITORIES fi read -p "hostname: " host if [ -z $host ]; then host="localhost" echo "default hostname 'localhost'" fi read -p "upload mode ftp/scp/sftp/rsync: " mode if [ -z $mode ]; then mode=ftp else case $mode in ftp) mode="ftpdeploy" ;; scp) mode="scpdeploy" ;; sftp) mode="sftpdeploy" ;; rsync) mode="rsync" ;; esac fi read -p "Create $prjdir config? [y/n]" -n 1 key echo if [ $key = 'y' ]; then echo -ne "REPOSITORIES=$REPOSITORIES/$svnurl COMMAND=$mode HOSTNAME=$host " >> $SYSCONFDIR/$prjdir.conf fi ;; remove) if [ -f $SYSCONFDIR/$prj ]; then rm -rf $SYSCONFDIR/$prj fi ;; show) cat $SYSCONFDIR/$prj ;; edit) vim $SYSCONFDIR/$prj ;; *) usage ;; esac } ##################################################################### function config { local cfg=$1 exclude_from=$PREFIX/exclude/${cfg}.lst include_from=$PREFIX/include/${cfg}.lst if [ -f $SYSCONFDIR/${cfg}.conf ];then . $SYSCONFDIR/${cfg}.conf else echo "Please provide the config($SYSCONFDIR/${cfg}.conf) to deploy!" exit fi if [ -z "$cfg" ]; then echo "Please provide the path for deploy!" exit fi if [ ! -f $exclude_from ]; then echo "Please provide a list of excluded in the $exclude_from." exit fi if [ ! -f $include_from ]; then echo "Please provide a list of included in the $include_from." exit fi } function deploy() { local domain=$2 local host=$3 local logfile=${LOGDIR}/${host}.${domain}.log if [ -z $domain ]; then usage fi config ${domain}/${host} project=$SRCDIR/${domain}/$host.${domain} SVN_OPTS=${REVISION} if [ -d ${project} ]; then $SVN update ${SVN_OPTS} $project >> $logfile logging 'update' ${project} else mkdir -p ${project} $SVN checkout ${REPOSITORY} ${project} >> $logfile logging 'checkout' ${project} fi # $BINDIR/$COMMAND deploy $HOSTNAME $UPLOAD_DIR/$ver/ RSYNC_OPTS=" -azvP --backup --backup-dir=${BACKUPDIR} --exclude=.svn --log-file=${logfile} --exclude-from=$exclude_from --include-from=$include_from" if [ -f ${LIBEXECDIR}/${domain}/${host}/before ];then /bin/sh ${LIBEXECDIR}/${domain}/${host}/before fi find $SRCDIR/* -type f -name "Thumbs.db" -exec rm -rf {} \; for addr in ${REMOTE} do case ${MODE} in FTP) ftpdeploy ;; SCP) scp -ar ${project}/* ${addr}:${DESTINATION} ;; SFTP) sftpdeploy ;; RSYNC) $RSYNC $RSYNC_OPTS $OPTION ${project}/* ${addr}::${DESTINATION} ;; "RSYNC+SSH") $RSYNC $RSYNC_OPTS ${project}/* ${addr}:${DESTINATION} ;; esac if [ -d ${SHAREDIR}/current/${domain}/${host}/ ]; then cp -a ${SHAREDIR}/current/${domain}/${host}/* ${project}/ fi if [ -z "${REVISION}" ]; then logging 'revert' "${project} => ${addr}:${DESTINATION}" else logging 'deploy' "${project} => ${addr}:${DESTINATION}" fi done if [ -f ${LIBEXECDIR}/${domain}/${host}/after ];then #ssh ${scp} < ${LIBEXECDIR}/${domain}/${host}/after exit fi } function revert() { local domain=$2 local host=$3 local revision=$4 if [ -z $domain ]; then usage fi if [ -z $host ]; then usage fi if [ -z $revision ]; then usage else REVISION="-r ${revision}" fi #echo $domain , $host, $dir; exit deploy $@ } function import(){ local domain=$2 local host=$3 local dir=$4 if [ -z $domain ]; then usage fi if [ -z $host ]; then usage fi if [ -z $dir ]; then usage fi config ${domain}/${host} $SVN import $dir ${REPOSITORY} >> $logfile } function export(){ local domain=$2 local host=$3 local dir=$4 if [ -z $domain ]; then usage fi if [ -z $host ]; then usage fi if [ -z $dir ]; then usage fi config ${domain}/${host} local logfile=${LOGDIR}/${host}.${domain}.log $SVN export --force ${REPOSITORY} ${dir} >> $logfile logging 'export' "${TRUNK} to ${dir}" } function timepoint { echo $TIMEPOINT >> timepoint.log } function unstable { local edition=$(basename $unstable) svn export ${unstable} ${src}/$edition for ignore in $( cat excluded.lst ); do rm -rf ${src}/$edition/$ignore done $RSYNC ${src}/$edition ${destination} ssh ${remote} < script/unstable } function clean() { local domain=$2 local host=$3 if [ -z $domain ]; then usage fi if [ -z $host ]; then usage fi local project=$SRCDIR/${domain}/$host.${domain} rm -rf ${project} } function list { local domain=$2 local host=$3 local dir=$4 if [ -z $domain ]; then ls $SRCDIR/* exit fi if [ -z $host ]; then usage fi config ${domain}/${host} svn ls ${REPOSITORIES}/$dir #| awk -F '/' '{print $1}' } function backup() { local domain=$2 local host=$3 local dir=$4 if [ -z $domain ]; then usage fi if [ -z $host ]; then usage fi local logfile=${LOGDIR}/${host}.${domain}.log config ${domain}/${host} if [ -z $dir ]; then dir=$TMPDIR fi for addr in ${REMOTE} do dir=$dir/${addr} if [ ! -d ${dir} ]; then mkdir -p $dir fi $RSYNC -auzvP $OPTION ${addr}::${DESTINATION} $dir >> ${logfile} logging 'backup' "rsync://${addr}::${DESTINATION} to ${dir}" echo 'Backup Directory:' $dir exit done } function cron(){ local fun=$2 case ${fun} in show) crontab -l ;; setup) cat $PREFIX/cron.d/crontab | crontab ;; edit) vim $PREFIX/cron.d/crontab cat $PREFIX/cron.d/crontab | crontab ;; *) usage ;; esac } function files { local project_dir=$1 local project=$2 if [ -z "$2" ]; then echo "Please provide the project name for deploy!" else config ${project} exclude_from=exclude/${project}.lst include_from=include/${project}.lst $RSYNC --exclude-from=$exclude_from --include-from=$include_from ${project_dir} ${remote} ssh ${scp} < script/${project} timepoint fi } function help { echo $"Usage: $0 {list|clean}" echo $" $0 subversion <project>" # echo $" $0 files <path> <project>" echo $" $0 revert <project> <time>" } case "$1" in deploy) deploy $@ ;; revert) revert $@ ;; import) import $@ ;; export) export $@ ;; backup) backup $@ ;; # switch) # switch $2 # ;; cron) cron $@ ;; # files) # files $2 $3 # ;; clean) clean $@ ;; list) list $@ ;; log) ls -1 $LOGDIR/* ;; conf) conf $@ ;; *) usage exit 1 esac