Python替代ez-ipupdate?

时间:2015-09-26 21:18:21

标签: python

我想从NAT后面更新我的动态dns条目,ez-ipupdate不支持。它使用本地绑定的ip而不是外部ip地址。

我的提供商easydns只在我的平台Linux上明确支持ez-ipupdate解决方案。

我没有写一个基于python的deamon来获取外部IP地址并定期将它放入ez-ipupdate配置文件,我想知道是否有办法用python脚本替换整个东西。也许这会简化事情。

(我在谷歌上找不到任何关于此的信息,所以我在这里要求并回答这个问题以帮助其他人。)

1 个答案:

答案 0 :(得分:0)

它确实会简化事情。至少对于easydns,ez-ipupdate只使用基本HTTP身份验证才真正执行简单的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