python3 监控域名证书到期时间,并实现叮叮的及时报警

# _*_coding=utf-8 _*_
# @author 云深沾衣
# @date 2021/11/5 16:33

import re
import subprocess
from datetime import datetime
import requests


class DomainCheck:
    def __init__(self, domain_file='domain_file.txt', log_file='log.txt'):
        self.domain_file = domain_file
        self.log_file = log_file

    check_days = 5
    dingding_token = 'your_dingding_token'
    dingding_url = 'https://oapi.dingtalk.com/robot/send?access_token='

    def check_domain_ssl_status(self):
        with open(self.domain_file) as f:
            self.write_log_to_file('<------  ' + str(datetime.now()) + '    ------>' + '\n')
            for line in f:
                line = line.replace('\n', '').replace('\r', '').strip()
                if not line.startswith("#") and len(line) > 0:
                    expire_date = self.get_cert_expire_date(line)
                    content = line + ' :    ' + str(expire_date) + '\n'
                    self.write_log_to_file(content)
                    if expire_date <= self.check_days:
                        self.send_to_dingding(content)

    def send_to_dingding(self, content):
        content_data = {
            "msgtype": "text",
            "text": {
                "content": content
            }
        }
        requests.post(self.dingding_url + self.dingding_token, json=content_data)

    def write_log_to_file(self, content):
        with open(self.log_file, mode='a') as f:
            f.write(content)

    @staticmethod
    def parse_time(date_str):
        return datetime.strptime(date_str, "%b %d %H:%M:%S %Y GMT")

    @staticmethod
    def get_re_match_result(pattern, string):
        match = re.search(pattern, string)
        return match.group(1)

    def get_cert_info(self, domain):
        """获取证书信息"""
        cmd = f"curl -Ivs https://{domain} --connect-timeout 10"  # 这儿的 curl 应该使用最新版
        exitcode, output = subprocess.getstatusoutput(cmd)
        try:
            expire_date = self.get_re_match_result('expire date: (.*)', output)
        except:
            content = domain + ": This domain check failed , please check reason"
            self.send_to_dingding(content)
            expire_date = "Aug  7 00:28:51 2020 GMT"
        expire_date = self.parse_time(expire_date)
        return expire_date

    def get_cert_expire_date(self, domain):
        """获取证书剩余时间"""
        expire_date = self.get_cert_info(domain)
        # 剩余天数
        return (expire_date - datetime.now()).days


domain_check = DomainCheck('/opt/sh/text.txt', '/opt/sh/log.txt')
domain_check.check_domain_ssl_status()

RabbitMQ镜像集群部署

以下为准备的服务器信息

服务器ip 服务器名称
192.168.19.10 mq01
192.168.19.11 mq02

在两台服务器分别安装 RabbitMQ 参考 rabbitmq安装与使用


在两台服务器里面的 ‘/etc/hosts’ 里面绑定以下内容

192.168.19.10 mq01
192.168.19.11 mq02

修改 “/var/lib/rabbitmq/.erlang.cookie” 里面的内容,保证 里面的内容一致,并且权限为 400


在第二台服务器里面运行以下命令,将第二台服务器加入到集群中

service rabbitmq-server restart
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@mq01
rabbitmqctl start_app

使用以下命令给 test 创建一个镜像集群

rabbitmqctl add_vhost test
rabbitmqctl set_policy -p test ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

节点的移除使用以下命令:

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

参考链接: https://www.jianshu.com/p/a031c7d53333

使用git方式更新还原代码脚本

  • 因为工作需要,需要使用shell通过git来更新还原代码
#/bin/bash
CURRENTTIME=`date +%Y%m%d%H%M`
ADMINDIR=/data/develop/hicoopay/admin/
ADMINBACKUPDIR=/root/backup/admin/

ADSDIR=/data/develop/hicoopay/ads/
ADSBACKUPDIR=/root/backup/ads/

update_admin(){
    [ ! -d ${ADMINBACKUPDIR} ] && mkdir -p ${ADMINBACKUPDIR}
    rsync -avz  --exclude=runtime/logs ${ADMINDIR}  ${ADMINBACKUPDIR}${CURRENTTIME}
    cd ${ADMINDIR}
    git checkout . && git pull
}

update_ads(){
    [ ! -d ${ADSBACKUPDIR} ] && mkdir -p ${ADSBACKUPDIR}
    rsync -avz  --exclude=storage/logs ${ADSDIR}  ${ADSBACKUPDIR}${CURRENTTIME}
    cd ${ADSDIR}
    git checkout . && git pull
}

rollback_admin(){
    echo -e "\033[33m 选择你需要还原的日期  :  \033[0m"
    select var in `ls ${ADMINBACKUPDIR}`
    do
        rsync -avz  --delete --exclude=runtime/logs ${ADMINBACKUPDIR}${var}/ ${ADMINDIR} 
        exit
    done
}

rollback_ads(){
    echo -e "\033[33m 选择你需要还原的日期  :  \033[0m"
    select var in `ls ${ADSBACKUPDIR}`
    do
        rsync -avz  --delete --exclude=storage/logs ${ADSBACKUPDIR}${var}/ ${ADSDIR} 
        exit
    done
}

admin(){
    echo -e "\033[32m 选择你是要更新还是回滚  :  \033[0m"
    select i in "update" "rollback" "Exit"
    do 
        case $i in
        "update")
            update_admin
            exit
            ;;
        "rollback")
            rollback_admin
            exit
            ;;
        "Exit")
            exit
            ;;
        *)
            echo "Please choose 1 || 2 || 3"
            ;;
        esac
    done 
}

ads(){
    echo -e "\033[32m 选择你是要更新还是回滚  :  \033[0m"
    select i in "update" "rollback" "Exit"
    do 
        case $i in
        "update")
            update_ads
            exit
            ;;
        "rollback")
            rollback_ads
            exit
            ;;
        "Exit")
            exit
            ;;
        *)
            echo "Please choose 1 || 2 || 3"
            ;;
        esac
    done 
}

echo -e "\033[32m 选择你需要操作的项目  :  \033[0m"
select var in "admin" "ads" "Exit"
do
    case $var in
        "admin")
            admin
            exit
            ;;
        "ads")
            ads
            exit
            ;;
        "Exit")
            exit
            ;;
        *)
            echo "Please chose 1 || 2 || 3 "
            ;;
    esac
done