管理多阿里云账号实现域名或服务器到期前他钉钉提醒 到期前一个月

使用python 实现

文件名  >> get_dns_ecs_list.py

#!/usr/bin/env python
#coding=utf-8

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkdomain.request.v20180129.QueryDomainListRequest import QueryDomainListRequest    #dns
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest   #ecd
from aliyunsdkecs.request.v20140526.DescribeRegionsRequest import DescribeRegionsRequest      #locaction
from dingtalkchatbot.chatbot import DingtalkChatbot

import datetime, json, time


#跳过需要检测的域名
fs = open("./skip_doname", "r")
skip_doname = fs.read()
skip_doname = skip_doname.split('\n')
fs.close()

#dns分页大小
page_size = 1

#获取一个30天内的日期
timelist = []
for i in range(0, 90):
  timelist.append((datetime.datetime.now() + datetime.timedelta(days=i)).strftime("%Y-%m-%d"))


class get_locaction:
  def __init__(self, accessKeyId, accessSecret):
    self.client = AcsClient(accessKeyId, accessSecret, 'cn-hangzhou')
  def get_info(self):
    request = DescribeRegionsRequest()
    request.set_accept_format('json')
    response = self.client.do_action_with_exception(request)
    locaction_list = []
    for i in json.loads(str(response, encoding='utf-8'))['Regions']['Region']:
      locaction_list.append(i['RegionId'])
    return locaction_list

class get_dns:
  def __init__(self, accessKeyId, accessSecret):
    self.page_size = 50
    self.client = AcsClient(accessKeyId, accessSecret, 'cn-hangzhou')
  #获取页面中的域名 load  传入的时页面
  def get_page_reading(self,load):
    request = QueryDomainListRequest()
    request.set_accept_format('json')
    request.set_PageNum(int(load))
    request.set_PageSize(int(self.page_size))
    response = self.client.do_action_with_exception(request)
    dns_list = []
    for i in json.loads(str(response, encoding='utf-8'))['Data']['Domain']:
      dns_list.append({'doname': i['DomainName'], 'end_time': i['ExpirationDate'].split()[0]})
    return dns_list
  #获取总页数
  def Total_page_num(self):
    request = QueryDomainListRequest()
    request.set_accept_format('json')
    request.set_PageNum(1)
    request.set_PageSize(int(self.page_size))
    response = self.client.do_action_with_exception(request)
    #分页数
    return int(json.loads(str(response, encoding='utf-8'))['TotalPageNum'])
  #翻页获取信息
  def get_info(self):
    dns_list = []
    for i in range(0,self.Total_page_num()):
      i=i+1
      dns_list = dns_list + self.get_page_reading(i)
    return dns_list

class get_ecs:
  def __init__(self, accessKeyId, accessSecret):
    self.accessKeyId = accessKeyId
    self.accessSecret = accessSecret
  #获取列表
  def get_host_all(self, zone):
    self.client = AcsClient(self.accessKeyId, self.accessSecret, zone)
    request = DescribeInstancesRequest()
    request.set_accept_format('json')
    response = self.client.do_action_with_exception(request)
    ecs_list = []
    for i in json.loads(str(response, encoding='utf-8'))["Instances"]['Instance']:
      ecs_list.append({"id": i['InstanceId'],
      "name": i['InstanceName'],
      "end_time": i['ExpiredTime'].split('T')[0],
      "ipaddr": i['PublicIpAddress']['IpAddress'][0]})
    return ecs_list
  #获取所有主机
  def get_info(self):
    all_locaction = get_locaction(self.accessKeyId, self.accessSecret)
    ecs_list = []
    for i in all_locaction.get_info():
      for i in self.get_host_all(i):
        ecs_list.append(i)
    return ecs_list

class check:
  def __init__(self,security):
    self.security = security

  def __check_ecs_dns(self,security):
    info_ecs_list = []
    info_dns_list = []
    fs.close()
    #处理ecs获取即将到期列表
    x = get_ecs(security['accessKeyId'], security['accessSecret'])
    for i in x.get_info():
      if i['end_time'] in timelist:
        try:
          i.update(aliyun=security['aliyun_name'])
          info_ecs_list.append(i)
        except Exception:
          continue

    #处理dns获取即将到期列表
    x = get_dns(security['accessKeyId'], security['accessSecret'])
    for i in x.get_info():
      if i['end_time'] in timelist:
        if i['doname'] in skip_doname:
          print("skip_donamt:  " + i['doname'])
        else:
          try:
            i.update(aliyun=security['aliyun_name'])
            info_dns_list.append(i)
          except Exception:
            continue
    return info_dns_list + info_ecs_list

  def run(self):
    for i in self.security:
      for i in self.__check_ecs_dns(i):
        if len(i) == 3:
          #print("域名:" + str(i))
          android_user.send_text("在30天内到期的域名!!!!\n阿里云账号:" + i['aliyun'] + "\n到期的域名:" + i['doname'] + "\n到期时间" + i['end_time'] )
          #print("在30天内到期的域名!!!!\n阿里云账号:" + i['aliyun'] + "\n到期的域名:" + i['doname'] + "\n到期时间" + i['end_time'])
        elif len(i) == 5:
          android_user.send_text("在30天内到期的服务器!!!!\n阿里云账号:" + i['aliyun'] +" \n服务器名称:" + i['name'] + "\n服务器id:" + i['id'] + "\n到期时间:" + i['end_time'])
          #print("在30天内到期的服务器!!!!\n阿里云账号:" + i['aliyun'] + " \n服务器名称:" + i['name'] + "\n服务器id:" + i['id'] + "\n到期时间:" + i['end_time'])
          #print("服务器名称:" + str(i))


security = '使用exec函数运行keyfile中的代码,security返回阿里云授权列表何以及账号信息'
android_user = '使用exec函数运行keyfile中的代码,android_user 反回钉钉对象'
fs = open("./keyfile", "r", encoding='UTF-8')
exec(fs.read())
fs.close()

x = check(security)
x.run()

 

文件名  >> keyfile

#需要阿里云给的权限
  #管理域名服务的权限
  #只读访问云服务器服务(ECS)的权限

#根据来运提供的填写下面的内容 数组方式可以写多个阿里云账号根,以字典方式写入,一个账号数组一个单位长度
security = [{'accessKeyId': '', 'accessSecret': '', "aliyun_name":'多个数组时根据返回时会带域名'}]

#钉钉机器人地址写入send_android_url中即可实现
send_android_url = ""
android_user = DingtalkChatbot(send_android_url)

 

文件名 >> skip_doname

可以时空文件,每一行可以写入一个域名,写入该文件的域名将被跳过检测

 

 

你可能感兴趣的:(python)