#!/bin/bash
# 文件名: nginx_conf_pull_reload.sh

### 定义变量 开始 ###
REMOTE_NGX_URL="http://conf.fanghubao.com/ngx_conf_md5.txt"        # 远程 nginx 配置文件 MD5 文件地址
NGX_CONF=/opt/etc/nginx                                            # 本地 nginx 配置文件路径
RSYNC_SER="conf.fanghubao.com"                                     # rsync 服务器
RSYNC_MOD=ngx_conf                                                 # rsync 模块
RSYNC_USER=www                                                     # rsync 验证用户
RSYNC_PWD=/etc/rsyncd.auth                                         # rsync 验证用户
EMAIL='notice@wy.cn'                                               # E-mail 地址

md5deep=/usr/bin/md5deep
sort=/usr/bin/sort
yum=/usr/bin/yum
curl=/usr/bin/curl
grep=/usr/bin/grep
diff=/usr/bin/diff
echo=/usr/bin/echo
cat=/usr/bin/cat
rsync=/usr/bin/rsync
logger=/usr/bin/logger
mail=/usr/bin/mail

nginx_bin=/opt/nginx/nginx                                         # nginx 二进制文件路径
nginx_cnf=/opt/etc/nginx/nginx.conf                                # nginx 主配置文件路径
### 定义变量 结束 ###


# 检测系统是否存在 md5deep 工具
$md5deep -h >/dev/null 2>&1 || $yum -y install md5deep

# 生成Nginx配置文件[指定目录] MD5 值
cd $NGX_CONF
$md5deep -r -l ./ssl ./vhosts | $sort -k2 >/tmp/ngx_local_md5.txt

# 下载远程配置文件 MD5 值
$curl -s -I $REMOTE_NGX_URL | $grep "HTTP/1.1 200 OK" >/dev/null 2>&1
if [[ $? -eq 0 ]]
then
    $curl -B -s $REMOTE_NGX_URL >/tmp/ngx_remote_md5.txt
else
    $echo "远程 nginx md5 文件 URL 失败." | $mail -s "nginx md5 file download failed notify [${HOSTNAME}]" ${EMAIL}
    exit 1
fi

# 文件对比,一致则退出脚本,反之拉回最新文件
$diff /tmp/ngx_local_md5.txt /tmp/ngx_remote_md5.txt
if [[ $? -eq 0 ]]
then 
	$echo 'File does not change' && exit 0
elif [[ $? -eq 1  ]]
then
	$rsync -vzrtopg --progress --delete --include "ssl/" --include "vhosts/" --exclude "/*" --password-file=${RSYNC_PWD} ${RSYNC_USER}@${RSYNC_SER}::${RSYNC_MOD} ${NGX_CONF}

	if [[ $? -eq 0 ]]
	then
		# 检查 Nginx 语法，成功则 reload, 反之退出并通知
    	$nginx_bin -t -c $nginx_cnf > /dev/null 2> /tmp/ngx_syntax
    	if [[ $? -eq 0 ]]
    	then
    		# 语法通过执行 reload 并正常退出
    		$nginx_bin -s reload -c $nginx_cnf
    		$logger -t 'nginx' 'nginx Reload success'
            exit 0
    	else
    		# 语法不通过发送邮件并异常退出
    		$logger -t 'nginx' 'nginx syntax failed'
    		cat /tmp/ngx_syntax | $mail -s "nginx reload failed notify [${HOSTNAME}]" ${EMAIL}
    	    exit 1
    	fi
  	else 
	    logger -t 'rsyncd' 'File pull failed,Please check.'
	    exit 1
    fi
    

fi
