dockerfiles/ddns-dnspod/config.py

143 lines
4.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import getopt
import sys
import logging
# 定义配置文件目录
# linux
config_path = '/etc/dnspod/ddnsrc'
# windows
if os.name == 'nt':
config_path = 'ddnspod.cfg'
# 配置属性,及其默认参数
cfg = {}
# dnspod 登录配置
cfg["login_token"] = '' # 默认空参数,要求用户必填 格式 'token_id,token' # 登录token
# ddns 基本配置
cfg["sub_domain"] = '' # 默认空参数,要求用户必填 #格式 'www' # 子域名
cfg["domain"] = '' # 默认空参数,要求用户必填 #格式 'domain.com' # 域名
cfg["interval"] = '5' # 最小更新间隔
cfg["record_id"] = '{auto}' # 记录id程序自动生成
cfg["current_ip"] = '{auto}' # 当前ip程序自动生成
cfg["email"] = '' # 默认空参数,要求用户必填 #格式 'you@email.com'
# ip 池
cfg["ip_count"] = '1' # 此域名拥有的ip数量默认为 1 OpenWrt 玩家可能会有多个IP
cfg["ip_pool"] = '{auto}' # ip 池 ..,程序自动生成
cfg["last_update_time"] = '{auto}' # 上次更新成功时间戳,程序自动生成
def read_config():
# 后面读出的数据会覆盖前面的
read_config_from_file()
read_config_from_env()
read_config_from_argv()
def print_help():
max_key_len = max([len(key) for key in cfg.keys()])
print("ddns.py [-h|...]")
print("命令行方式调用,可用的参数如下:")
for name in cfg.keys():
print(' --%-' + str(max_key_len) + 's <value>' % name)
print("配置优先级: 命令行 > 环境变量 > 配置文件")
print("当前配置文件目录为:%s" % config_path)
def read_config_from_file():
try:
with open(config_path, 'rU') as fp:
for line in fp:
pair = [x.strip() for x in line.split('=')]
if pair[0] and pair[1]:
cfg[pair[0].lower()] = pair[1]
except:
pass
def read_config_from_env():
for key in cfg:
if os.getenv(key) is not None:
cfg[key] = os.getenv(key)
# 从命令行读取参数
def read_config_from_argv():
available_args = [x + "=" for x in cfg.keys()]
try:
opts, _ = getopt.getopt(sys.argv[1:], "h", available_args)
for opt, arg in opts:
if opt == '-h':
print_help()
sys.exit()
if opt.startswith('--'):
pair = [opt[2:], arg]
if pair[0] and pair[1]:
cfg[pair[0].lower()] = pair[1]
except getopt.GetoptError:
print_help()
sys.exit(1)
def save_config():
try:
save_config_to_env()
save_config_to_file()
except NotImplementedError as err:
logging.error("FAILED to save config:" + str(err))
# 不太清楚这个函数能干啥用 = = 写着玩。。。
def save_config_to_env():
for key in cfg:
os.environ[key] = cfg[key]
# 保存配置到文件… 这个函数现在会把配置文件里的注释也删掉……
def save_config_to_file():
max_key_len = max([len(key) for key in cfg.keys()])
try:
with open(config_path, "w+") as f:
f.writelines([
('%-'+str(max_key_len)+'s=%s\n') % (key, cfg[key])
for key in cfg.keys()
])
except IOError as err:
logging.error("FAILED to save config to file: " + str(err))
# 检查配置是否齐全
def check_config():
if not (
cfg['login_token'] and
cfg['domain'] and
cfg['sub_domain']):
logging.fatal('config error: need login info')
exit()
try:
if not(int(cfg["interval"])):
logging.fatal('interval error')
exit()
if not(int(cfg["ip_count"])):
logging.fatal('ip_count error')
exit()
except:
logging.fatal('config error')
exit()
logging.info('config checked')
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO,
format='%(levelname)-8s: %(message)s')
# 测试配置文件
logging.info("init cfg: %s" % cfg)
read_config()
logging.info("read cfg: %s" % cfg)
check_config()