域名过期时间监控
域名过期时间监控
自周日那次因阿里云域名过期事件发生之后【记周日一次故障意外:https://www.cnblogs.com/windysai/p/14495901.html】,写一个能用的监控域名过期时间的脚本就迫在眉睫,今天终于完工了,已放到生产。
参考链接:https://blog.51cto.com/13576245/2427625
本来前面知识点的总结挺好的,老实说,这小伙脚本有点问题!!!贴上去的时候,难道没有测试时间戳和具体日期,命令作转化是应该相等的么?!
举个栗子,假设有一个过期时间:2023-03-06 15:08:45
计算出来的时间戳: date -d "过期时间" + %s 《=====》 date -d @计算出来的时间戳
如下:
date -d "2023-03-06 15:08:45" +%s ——》 1678086525 date -d @1678086525 ——》 Mon Mar 6 15:08:45 CST 2023
然后说下遇到的坑,首先这个监控脚本在服务器上是有的:前运维2018年写的。然后,贴上去计划任务的监控域名的脚本是错的!!!给他说这事差点搞到我背锅的时候,竟然还笑的出来,周日差点得回公司处理这破事 = = 。。。
算了,继续讲坑,扯回正题:
1、前运维那个脚本是把一堆域名写到文件上的,cat 一行行去读,因为有特殊符号,运行命令 “whois 域名” 获取信息是返回不了任何数据的!!!导致这个expiry_date为空值,所以这脚本形同虚设!我试过都写到文件上,也确实会发生这样的情况,用 cat -A 文件名显示所有特殊符号,无果
解决:暂时找不出具体原因,所以只能直接读到脚本上,不放文件读
2、whois域名的时候,针对 .cn 域名的域名信息获取,经常出现:fgets: Connection reset by peer 的报错,导致返回数据为空,最终报警失灵,返回一个特别吓人的信息:过期时间剩余0天
解决:前面加个信息获取判断,对于 .cn 域名,没有数据返回就用while 死循环,一直试,直到成功为止
3、curl 对于这种时间显示 :2023-03-06 15:08:45,发不了钉钉报警的,莫名其妙多了个 ‘ 的符号,我确定脚本没有加特殊符号!!!
解决:原因未知,只能改用python去发,读入写入报警内容的文件
最终效果图
(这个测试,针对域名在90天内过期就报警):
对域名是 .cn 和 非.cn的情况要分开进行数据处理!!!
相关脚本:
1、监控域名过期脚本:
#!/bin/bash #监控公司域名到期发送钉钉消息通知 #作者:小杨 #日期:2018/10/6 #版本:v0.2 #updated by ljy on 2021-03-08 PHONE="我手机电话号码" TOKEN="钉钉报警机器人webhook" #1、监控工具检查 which whois > /dev/null 2> /dev/null if [ $? -ne 0 ] then yum install -y whois fi which bc > /dev/null 2> /dev/null if [ $? -ne 0 ] then yum install -y bc fi
#报警内容 WarnFile=/home/xxx/scripts/domain/warnfile >$WarnFile
#全部域名过期时间信息 >/tmp/testdomain.log #2、域名过期检查
for line in 域名1 域名2 ... 具体域名n do #拿到过期的日期,假设是非.cn 域名 e_d=`whois $line |grep 'Expiry Date' |awk '{print $4}' |cut -d 'T' -f 1` # 为空 #(1)针对.cn 域名(无T,关键词:Expiration Time) if [ -z "$e_d" ]; then expiry_time=`whois $line |grep 'Expiration Time' |awk '{print $3" "$4}'` while [ -z "$expiry_time" ]; do sleep 3 expiry_time=`whois $line |grep 'Expiration Time' |awk '{print $3" "$4}'` done #(2) 针对非 .cn 域名(有T,关键字:Expiry Date) ## 如果不为空,对时分秒做转换(默认是UTC,少了8小时, 进行date -d 转换) else hms=`whois $line |grep 'Expiry Date' |awk '{print $4}' |cut -d 'T' -f 2` e_d_hms=`date -d "$hms" | awk '{print $4}'` expiry_time="$e_d $e_d_hms" fi #计算过期时间戳 e_d_s=`date -d "$expiry_time" +%s` echo "域名 $line 的过期时间戳为: ${e_d_s}" expiry_date_s=`date -d @${e_d_s}` #3、计算今天的时间戳 today_s=`date +%s`
#4、计算过期时间戳和今天时间戳的差值,得到剩余天数 expiry_date=$(($(($e_d_s-$today_s))/(60*60*24))) echo "剩余天数: $expiry_date " #curl 报警中,钉钉不认 $expiry_time : 时分秒这种日期,改用python发 expiry_day=`echo $expiry_time | awk '{print $1}'` echo "域名: ${line} 到期日期: ${expiry_time}, 剩余: $expiry_date 天 !!!!" >> /tmp/testdomain.log echo "" >> /tmp/testdomain.log # 测试时间为90天内过期就发告警 if [ $expiry_date -lt 90 ]; then DATE=`date +%F_%T` echo "${line} 域名将在 $expiry_time 到期,请及时处理!!" | mail -s "${line} 域名 $expiry_time 到期通知" 我qq邮箱@qq.com echo "域名:${line} 将在$expiry_time 到期,剩余天数: $expiry_date 天,请及时处理!!!" >> $WarnFile fi done
## python发报警内容
python /home/xxx/scripts/domain/warnsrc.py /home/xxx/scripts/domain/warnfile
2、python发报警脚本:warnsrc.py
# -*- coding: utf-8 -*- # @Time : 2020/9/18 10:26 # @Author : ljy # @File : update warnsrc.py on 2021/3/9 import time import os import urllib2 import json import pymysql import datetime import sys import requests reload(sys) sys.setdefaultencoding('utf-8') print("文件为: ") print(sys.argv[1]) size = os.path.getsize(sys.argv[1]) if size != 0: content="" with open(sys.argv[1]) as f: content += f.read() f.close() #测试 url = '机器人token' data = {"msgtype": "text", "text": {"content": content}, "at": {"atMobiles": ['我手机号码'], "isAtAll": "false"}} headers = {'Content-Type': 'application/json'} request = urllib2.Request(url=url, headers=headers, data=json.dumps(data)) re = urllib2.urlopen(request, timeout=10) re_data = re.read()