域名过期时间监控

域名过期时间监控

  自周日那次因阿里云域名过期事件发生之后【记周日一次故障意外: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()

 

posted @ 2021-03-09 22:59  windysai  阅读(1296)  评论(1编辑  收藏  举报