2015-09-26 47 views
0

我想從NAT後面更新我的動態DNS條目,這是ez-ipupdate不支持的。它使用本地綁定的IP而不是外部IP地址。ez-ipupdate的Python替代品?

我的提供者easydns只在我的平臺Linux上明確地支持ez-ipupdate解決方案。

而不是寫一個基於python的deamon來獲取外部IP地址並定期將其放入ez-ipupdate配置文件中,我想知道是否有一種方法可以用python腳本替換整個東西。也許它會簡化事情。

(我找不到這個對谷歌的任何信息,所以我問,爲了幫助這裏的回答這個問題。)

回答

0

這將簡化事情確實如此。至少對easydns來說,ez-ipupdate實際上只是用Basic HTTP Authentication執行一個簡單的GET請求。

下面的代碼是一個起點。它已經過測試,它的工作。它需要來自pypi的requestsipgetter模塊。

import time 
import ipgetter 
import requests 
import datetime 
from requests.auth import HTTPBasicAuth 

def update(user, auth_token, hostname, partner="easydns", cache_fn=None): 
    if cache_fn is None: 
     cache_fn = "/var/cache/ez-ipupdate/default-cache" 

    my_ip = ipgetter.myip() 

    with open(cache_fn) as fobj: 
     secs, ip = fobj.read().strip().split(",") 
    if ip == my_ip: 
     return "IP doesn't need updating" 

    last_update = datetime.datetime.fromtimestamp(int(secs)) 
    diff = datetime.datetime.now() - last_update 
    minutes_since_last_update = diff.total_seconds()/60.0 
    if minutes_since_last_update < 4.99: 
     return "Too short time since last update..." 

    with open(cache_fn, "wb") as fobj: 
     fobj.write("{},{}\n".format(int(time.time()), my_ip)) 

    url = (
     'https://api.cp.easydns.com/dyn/ez-ipupdate.php?action=edit' 
     '&myip={address}&partner={partner}&wildcard=OFF&hostname={host}' 
     ).format(address=my_ip, partner=partner, host=hostname) 

    r = requests.get(url, auth=HTTPBasicAuth(user, auth_token)) 
    return "{} {}".format(r.status_code, r.reason) 

現在只需定期運行一個調用更新函數的腳本,例如,使用crontab -e並添加以下行:

*/5 * * * * /path/to/script.py