Python动态更新服务器ip到dnspod

首先从dnspod获取初始的ip,然后获取服务器ip,两者比较,如果不同就更新新的服务器ip到dnspod。

源代码: https://github.com/windpenguin/DynamicDNSPod


#!/usr/bin/python
#-*- coding:utf-8 -*-
import httplib, urllib
import socket
import time
import logging
import logging.handlers
import sys
import json
import copy

#try to get initial ip on dnspod every tick until success
GET_INITIAL_IP_TICK = 30 
#check ip every tick
CHECK_IP_TICK = 30

#log file handler
#--------------------------you need to change your log file
logFile = '/Users/wind/GitRepo/DynamicDNSPod/ddp.log'
handler = logging.handlers.RotatingFileHandler(logFile, maxBytes = 1024*1024, backupCount=10)
#fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s'
fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(message)s'
formatter = logging.Formatter(fmt)
handler.setFormatter(formatter)

#log console handler
console = logging.StreamHandler()
console.setFormatter(formatter)

#register handler to logger
logger = logging.getLogger('ddp')
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
logger.addHandler(console)

#params used to query initial ip
#-----------------------you need to change your params
paramsQuery = dict(
    login_email="login_email", # replace with your email
    login_password="login_password", # replace with your password
    format="json",
    domain_id=domain_id, # replace with your domain_od, can get it by API Domain.List
    record_id=record_id, # replace with your record_id, can get it by API Record.List
)

#params used to update ip to dnspod
#-----------------------you need to change your params
params = copy.deepcopy(paramsQuery)
params.update({"sub_domain":"sub_domain", "record_line":"默认"})

#current ip in dnspod
currentIP = None

#query initial ip from dnspod
def getInitialIPFromDP():
    headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/json"}
    conn = httplib.HTTPSConnection("dnsapi.cn")
    conn.request("POST", "/Record.Info", urllib.urlencode(paramsQuery), headers)
    response = conn.getresponse()
    logger.info('response from dnspod: %s %s', response.status, response.reason)
    data = response.read()
    logger.info('data from dnspod: %s', data)
    datajson = json.loads(data)
    conn.close()
    return datajson['record']['value']


#get local server ip
def getServerIP():
    sock = socket.create_connection(('ns1.dnspod.net', 6666))
    ip = sock.recv(16)
    sock.close()
    return ip


#update ip to dnspod
def UpdateIPToDP(ip):
    params.update(dict(value=ip))
    headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/json"}
    conn = httplib.HTTPSConnection("dnsapi.cn")
    conn.request("POST", "/Record.Ddns", urllib.urlencode(params), headers)
    response = conn.getresponse()
    logger.info('response from dnspod: %s %s', response.status, response.reason)
    data = response.read()
    logger.info('data from dnspod: %s', data)
    conn.close()
    return response.status == 200


if __name__ == '__main__':
 
    logger.info('start ddp')
    logger.info('paramsQuery: %s', paramsQuery)
    logger.info('params: %s', params)

    #get initial ip from dnspod
    while True:
        try:
            logger.info('try to get initial ip from dnspod')
            currentIP = getInitialIPFromDP()
            if currentIP != None:
                logger.info('get initial ip: %s', currentIP)
                break
        except Exception, e:
            logger.exception(e)
            pass
        time.sleep(GET_INITIAL_IP_TICK)

    #update ip to dnspod if changed
    while True:
        try:
            logger.info('start check ip')
            serverIP = getServerIP()
            logger.info('get server ip: %s. old: %s', serverIP, currentIP)
            if currentIP != serverIP:
                logger.info('ip changed, try to update new ip to dnspod')
                if UpdateIPToDP(serverIP):
                    currentIP = serverIP
                    logger.info('succeed')
        except Exception, e:
            logger.exception(e)
            pass
        time.sleep(CHECK_IP_TICK)


猜你喜欢

转载自blog.csdn.net/windpenguin/article/details/54090876