ddns 4.0.2__py2.py3-none-any.whl → 4.1.0b2__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ddns
3
- Version: 4.0.2
3
+ Version: 4.1.0b2
4
4
  Summary: Dynamic DNS client for multiple providers, supporting IPv4 and IPv6.
5
5
  Author-email: NewFuture <python@newfuture.cc>
6
6
  License-Expression: MIT
@@ -36,6 +36,11 @@ License-File: LICENSE
36
36
  Provides-Extra: dev
37
37
  Requires-Dist: black; extra == "dev"
38
38
  Requires-Dist: flake8; extra == "dev"
39
+ Requires-Dist: mock; python_version < "3.3" and extra == "dev"
40
+ Provides-Extra: pytest
41
+ Requires-Dist: pytest>=6.0; extra == "pytest"
42
+ Requires-Dist: pytest-cov; extra == "pytest"
43
+ Requires-Dist: mock; python_version < "3.3" and extra == "pytest"
39
44
  Dynamic: license-file
40
45
 
41
46
  # [<img src="https://ddns.newfuture.cc/doc/img/ddns.svg" width="32px" height="32px"/>](https://ddns.newfuture.cc) [DDNS](https://github.com/NewFuture/DDNS)
@@ -62,6 +67,7 @@ Dynamic: license-file
62
67
  - [命令行参数](https://ddns.newfuture.cc/doc/cli.html)
63
68
  - [JSON 配置文件](https://ddns.newfuture.cc/doc/json.html)
64
69
  - [环境变量配置](https://ddns.newfuture.cc/doc/env.html)
70
+ - [服务商配置指南](https://ddns.newfuture.cc/doc/providers/)
65
71
 
66
72
  - 域名支持:
67
73
  - 多个域名支持
@@ -76,16 +82,25 @@ Dynamic: license-file
76
82
  - http 代理支持
77
83
  - 多代理自动切换
78
84
  - 服务商支持:
79
- - [DNSPOD](https://www.dnspod.cn/)
80
- - [阿里 DNS](http://www.alidns.com/)
81
- - [DNS.COM](https://www.dns.com/) (@loftor-git)
82
- - [DNSPOD 国际版](https://www.dnspod.com/)
83
- - [CloudFlare](https://www.cloudflare.com/) (@tongyifan)
84
- - [HE.net](https://dns.he.net/) (@NN708) (不支持自动创建记录)
85
- - [华为云](https://huaweicloud.com/) (@cybmp3)
85
+ - [DNSPOD](https://www.dnspod.cn/) ([配置指南](doc/providers/dnspod.md))
86
+ - [阿里 DNS](http://www.alidns.com/) ([配置指南](doc/providers/alidns.md)) ⚡
87
+ - [阿里云边缘安全加速(ESA)](https://esa.console.aliyun.com/) ([配置指南](doc/providers/aliesa.md)) ⚡
88
+ - [DNS.COM](https://www.dns.com/) ([配置指南](doc/providers/51dns.md)) (@loftor-git)
89
+ - [DNSPOD 国际版](https://www.dnspod.com/) ([配置指南](doc/providers/dnspod_com.md))
90
+ - [CloudFlare](https://www.cloudflare.com/) ([配置指南](doc/providers/cloudflare.md)) (@tongyifan)
91
+ - [HE.net](https://dns.he.net/) ([配置指南](doc/providers/he.md)) (@NN708) (不支持自动创建记录)
92
+ - [华为云](https://huaweicloud.com/) ([配置指南](doc/providers/huaweidns.md)) (@cybmp3) ⚡
93
+ - [NameSilo](https://www.namesilo.com/) ([配置指南](doc/providers/namesilo.md))
94
+ - [腾讯云](https://cloud.tencent.com/) ([配置指南](doc/providers/tencentcloud.md)) ⚡
95
+ - [腾讯云 EdgeOne](https://cloud.tencent.com/product/teo) ([配置指南](doc/providers/edgeone.md)) ⚡
96
+ - [No-IP](https://www.noip.com/) ([配置指南](doc/providers/noip.md))
97
+ - 自定义回调 API ([配置指南](doc/providers/callback.md))
98
+
99
+ > ⚡ 标记的服务商使用高级 HMAC-SHA256 签名认证,提供企业级安全保障
86
100
  - 其他:
87
101
  - 可设置定时任务
88
102
  - TTL 配置支持
103
+ - DNS 线路(运营商)配置支持(国内服务商)
89
104
  - 本地文件缓存(减少 API 请求)
90
105
  - 地址变更时触发自定义回调 API(与 DDNS 功能互斥)
91
106
 
@@ -97,60 +112,70 @@ Dynamic: license-file
97
112
 
98
113
  推荐 Docker 版,兼容性最佳,体积小,性能优化。
99
114
 
100
- - #### pip 安装(需要 pip 或 easy_install
115
+ - #### Docker(需要安装 Docker
101
116
 
102
- 1. 安装 ddns: `pip install ddns` 或 `easy_install ddns`
103
- 2. 运行: `ddns`
117
+ 详细说明和高级用法请查看 [Docker 使用文档](https://ddns.newfuture.cc/doc/docker.html)
104
118
 
105
- - #### 二进制版(单文件,无需 python)
119
+ <details>
120
+ <summary markdown="span">支持命令行,配置文件,和环境变量传参</summary>
106
121
 
107
- - Windows [ddns.exe](https://github.com/NewFuture/DDNS/releases/latest)
108
- - Linux(仅 Ubuntu 测试) [ddns](https://github.com/NewFuture/DDNS/releases/latest)
109
- - Mac OSX [ddns-mac](https://github.com/NewFuture/DDNS/releases/latest)
122
+ - 命令行cli
110
123
 
111
- - #### 源码运行(无任何依赖,需 python 环境)
124
+ ```sh
125
+ docker run newfuture/ddns -h
126
+ ```
112
127
 
113
- 1. clone 或者 [下载此仓库](https://github.com/NewFuture/DDNS/archive/master.zip) 并解压
114
- 2. 运行 ./run.py(windows 双击 `run.bat` 或者运行 `python run.py`)
128
+ - 使用配置文件(docker 工作目录 `/ddns/`,默认配置位置 `/ddns/config.json`):
115
129
 
116
- - #### Docker(需要安装 Docker)
130
+ ```sh
131
+ docker run -d -v /host/config/:/ddns/ --network host newfuture/ddns
132
+ ```
117
133
 
118
134
  - 使用环境变量:
119
135
 
120
- ```sh
121
- docker run -d \
122
- -e DDNS_DNS=dnspod \
123
- -e DDNS_ID=12345 \
124
- -e DDNS_TOKEN=mytokenkey \
125
- -e DDNS_IPV4=ddns.newfuture.cc \
126
- -e DDNS_IPV6=ddns.newfuture.cc \
127
- --network host \
128
- newfuture/ddns
129
- ```
136
+ ```sh
137
+ docker run -d \
138
+ -e DDNS_DNS=dnspod \
139
+ -e DDNS_ID=12345 \
140
+ -e DDNS_TOKEN=mytokenkey \
141
+ -e DDNS_IPV4=ddns.newfuture.cc \
142
+ --network host \
143
+ newfuture/ddns
144
+ ```
130
145
 
131
- - 使用配置文件(docker 工作目录 `/ddns/`,默认配置位置 `/ddns/config.json`):
146
+ </details>
147
+
148
+ - #### pip 安装(需要 pip 或 easy_install)
149
+
150
+ 1. 安装 ddns: `pip install ddns` 或 `easy_install ddns`
151
+ 2. 运行: `ddns -h` 或者 `python -m ddns`
152
+
153
+ - #### 二进制版(单文件,无需 python)
132
154
 
133
- ```sh
134
- docker run -d \
135
- -v /local/config/path/:/ddns/ \
136
- --network host \
137
- newfuture/ddns
138
- ```
155
+ 前往[release下载对应版本](https://github.com/NewFuture/DDNS/releases/latest)
139
156
 
140
- 更多详细说明和高级用法请查看 [Docker 使用文档](doc/docker.md)。
157
+ - #### 源码运行(无任何依赖,需 python 环境)
158
+
159
+ 1. clone 或者 [下载此仓库](https://github.com/NewFuture/DDNS/archive/master.zip) 并解压
160
+ 2. 运行 `python run.py` 或者 `python -m ddns`
141
161
 
142
162
  ### ② 快速配置
143
163
 
144
164
  1. 申请 api `token`,填写到对应的 `id` 和 `token` 字段:
145
165
 
146
- - [DNSPOD(国内版)创建 token](https://support.dnspod.cn/Kb/showarticle/tsid/227/)
147
- - [阿里云 accesskey](https://help.aliyun.com/document_detail/87745.htm)
148
- - [DNS.COM API Key/Secret](https://www.dns.com/member/apiSet)
149
- - [DNSPOD(国际版)](https://www.dnspod.com/docs/info.html#get-the-user-token)
150
- - [CloudFlare API Key](https://support.cloudflare.com/hc/en-us/articles/200167836-Where-do-I-find-my-Cloudflare-API-key-)(除了 `email + API KEY`,也可使用 `Token`,需要列出 Zone 权限)
151
- - [HE.net DDNS 文档](https://dns.he.net/docs.html)(仅需将设置的密码填入 `token` 字段,`id` 字段可留空)
152
- - [华为 APIKEY 申请](https://console.huaweicloud.com/iam/)(点左边访问密钥,然后点新增访问密钥)
153
- - 自定义回调的参数填写方式请查看下方的自定义回调配置说明
166
+ - **DNSPOD(中国版)**: [创建 token](https://support.dnspod.cn/Kb/showarticle/tsid/227/) | [详细配置文档](doc/providers/dnspod.md)
167
+ - **阿里云 DNS**: [申请 accesskey](https://help.aliyun.com/document_detail/87745.htm) | [详细配置文档](doc/providers/alidns.md)
168
+ - **阿里云边缘安全加速(ESA)**: [申请 accesskey](https://help.aliyun.com/document_detail/87745.htm) | [详细配置文档](doc/providers/aliesa.md)
169
+ - **51DNS(dns.com)**: [API Key/Secret](https://www.dns.com/member/apiSet) | [详细配置文档](doc/providers/51dns.md)
170
+ - **DNSPOD(国际版)**: [获取 token](https://www.dnspod.com/docs/info.html#get-the-user-token) | [详细配置文档](doc/providers/dnspod_com.md)
171
+ - **CloudFlare**: [API Key](https://support.cloudflare.com/hc/en-us/articles/200167836-Where-do-I-find-my-Cloudflare-API-key-)(除了 `email + API KEY`,也可使用 `Token`,**需要list Zone 权限**) | [详细配置文档](doc/providers/cloudflare.md)
172
+ - **HE.net**: [DDNS 文档](https://dns.he.net/docs.html)(仅需将设置的密码填入 `token` 字段,`id` 字段可留空) | [详细配置文档](doc/providers/he.md)
173
+ - **华为云 DNS**: [APIKEY 申请](https://console.huaweicloud.com/iam/)(点左边访问密钥,然后点新增访问密钥) | [详细配置文档](doc/providers/huaweidns.md)
174
+ - **NameSilo**: [API Key](https://www.namesilo.com/account/api-manager)(API Manager 中获取 API Key) | [详细配置文档](doc/providers/namesilo.md)
175
+ - **腾讯云 DNS**: [详细配置文档](doc/providers/tencentcloud.md)
176
+ - **腾讯云 EdgeOne**: [详细配置文档](doc/providers/edgeone.md)
177
+ - **No-IP**: [用户名和密码](https://www.noip.com/)(使用 No-IP 账户的用户名和密码) | [详细配置文档](doc/providers/noip.md)
178
+ - **自定义回调**: 参数填写方式请查看下方的自定义回调配置说明
154
179
 
155
180
  2. 修改配置文件,`ipv4` 和 `ipv6` 字段,为待更新的域名,详细参照配置说明
156
181
 
@@ -170,12 +195,13 @@ Dynamic: license-file
170
195
  - **JSON配置文件**:介于命令行和环境变量之间,会覆盖环境变量中的设置
171
196
  - **环境变量**:优先级最低,当其他方式未设置时使用
172
197
 
173
- **特殊情况**:
198
+ **高级用法**:
199
+
174
200
  - JSON配置中明确设为`null`的值会覆盖环境变量设置
175
201
  - `debug`参数只在命令行中有效,JSON配置文件中的同名设置无效
176
202
  - 多值参数(如`ipv4`、`ipv6`等)在命令行中使用方式为重复使用参数,如`--ipv4 domain1 --ipv4 domain2`
177
203
 
178
- 各配置方式的详细说明请查看对应文档:[命令行](doc/cli.md)、[JSON配置](doc/json.md)、[环境变量](doc/env.md)
204
+ 各配置方式的详细说明请查看对应文档:[命令行](doc/cli.md)、[JSON配置](doc/json.md)、[环境变量](doc/env.md)、[服务商配置](doc/providers/)
179
205
 
180
206
  > 📖 **环境变量详细配置**: 查看 [环境变量配置文档](doc/env.md) 了解所有环境变量的详细用法和示例
181
207
 
@@ -189,26 +215,27 @@ Dynamic: license-file
189
215
 
190
216
  ```bash
191
217
  ddns -c path/to/config.json
192
- # 或者源码运行
193
- python run.py -c /path/to/config.json
218
+ # 或者python运行
219
+ python -m ddns -c /path/to/config.json
194
220
  ```
195
221
 
196
222
  #### 配置参数表
197
223
 
198
- | key | type | required | default | description | tips |
199
- | :------: | :----------------: | :------: | :---------: | :---------------: | ----------------------------------------------------------------------------------------------------------- |
200
- | id | string | √ | 无 | api 访问 ID | Cloudflare 为邮箱(使用 Token 时留空)<br>HE.net 可留空<br>华为云为 Access Key ID (AK) |
201
- | token | string | √ | 无 | api 授权 token | 部分平台叫 secret key,**反馈粘贴时删除** |
202
- | dns | string | No | `"dnspod"` | dns 服务商 | 阿里 DNS 为 `alidns`,Cloudflare 为 `cloudflare`,dns.com 为 `dnscom`,DNSPOD 国内为 `dnspod`,DNSPOD 国际为 `dnspod_com`,HE.net 为 `he`,华为云为 `huaweidns`,自定义回调为 `callback` |
203
- | ipv4 | array | No | `[]` | ipv4 域名列表 | 为 `[]` 时,不会获取和更新 IPv4 地址 |
204
- | ipv6 | array | No | `[]` | ipv6 域名列表 | 为 `[]` 时,不会获取和更新 IPv6 地址 |
205
- | index4 | string\|int\|array | No | `"default"` | ipv4 获取方式 | 可设置 `网卡`、`内网`、`公网`、`正则` 等方式 |
206
- | index6 | string\|int\|array | No | `"default"` | ipv6 获取方式 | 可设置 `网卡`、`内网`、`公网`、`正则` 等方式 |
207
- | ttl | number | No | `null` | DNS 解析 TTL 时间 | 不设置采用 DNS 默认策略 |
208
- | proxy | string\|array | No | 无 | http 代理 `;` 分割 | 多代理逐个尝试直到成功,`DIRECT` 为直连 |
209
- | debug | bool | No | `false` | 是否开启调试 | 等同于设置 log.level=DEBUG,仅命令行参数`--debug`有效 |
210
- | cache | string\|bool | No | `true` | 是否缓存记录 | 正常情况打开避免频繁更新,默认位置为临时目录下 `ddns.cache`,也可以指定一个具体路径 |
211
- | log | object | No | `null` | 日志配置(可选) | 日志配置对象,支持`level`、`file`、`format`、`datefmt`参数 |
224
+ | key | type | required | default | description | tips |
225
+ | :----: | :----------------: | :------: | :---------: | :----------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
226
+ | id | string | √ | 无 | api 访问 ID | Cloudflare 为邮箱(使用 Token 时留空)<br>HE.net 可留空<br>华为云为 Access Key ID (AK) |
227
+ | token | string | √ | 无 | api 授权 token | 部分平台叫 secret key,**反馈粘贴时删除** |
228
+ | dns | string | No | `"dnspod"` | dns 服务商 | 阿里 DNS 为 `alidns`,阿里ESA为 `aliesa`,Cloudflare 为 `cloudflare`,dns.com 为 `dnscom`,DNSPOD 国内为 `dnspod`,DNSPOD 国际为 `dnspod_com`,HE.net 为 `he`,华为云为 `huaweidns`,NameSilo 为 `namesilo`,腾讯云为 `tencentcloud`,腾讯云EdgeOne为 `edgeone`,No-IP 为 `noip`,自定义回调为 `callback`。部分服务商有[详细配置文档](doc/providers/) |
229
+ | ipv4 | array | No | `[]` | ipv4 域名列表 | 为 `[]` 时,不会获取和更新 IPv4 地址 |
230
+ | ipv6 | array | No | `[]` | ipv6 域名列表 | 为 `[]` 时,不会获取和更新 IPv6 地址 |
231
+ | index4 | string\|int\|array | No | `"default"` | ipv4 获取方式 | 可设置 `网卡`、`内网`、`公网`、`正则` 等方式 |
232
+ | index6 | string\|int\|array | No | `"default"` | ipv6 获取方式 | 可设置 `网卡`、`内网`、`公网`、`正则` 等方式 |
233
+ | ttl | number | No | `null` | DNS 解析 TTL 时间 | 不设置采用 DNS 默认策略 |
234
+ | proxy | string\|array | No | 无 | http 代理 `;` 分割 | 多代理逐个尝试直到成功,`DIRECT` 为直连 |
235
+ | ssl | string\|boolean | No | `"auto"` | SSL证书验证方式 | `true`(强制验证)、`false`(禁用验证)、`"auto"`(自动降级)或自定义CA证书文件路径 |
236
+ | debug | bool | No | `false` | 是否开启调试 | 调试模式,仅命令行参数`--debug`有效 |
237
+ | cache | string\|bool | No | `true` | 是否缓存记录 | 正常情况打开避免频繁更新,默认位置为临时目录下 `ddns.cache`,也可以指定一个具体路径 |
238
+ | log | object | No | `null` | 日志配置(可选) | 日志配置对象,支持`level`、`file`、`format`、`datefmt`参数 |
212
239
 
213
240
  #### index4 和 index6 参数说明
214
241
 
@@ -227,16 +254,18 @@ python run.py -c /path/to/config.json
227
254
 
228
255
  #### 自定义回调配置说明
229
256
 
230
- - `id` 字段填写回调地址,以 HTTP 或 HTTPS 开头,推荐采用 HTTPS 方式的回调 API ,当 `token` 字段非空且 URL 参数包含下表所示的常量字符串时,会自动替换为实际内容。
231
- - `token` 字段为 POST 参数,本字段为空或不存在则使用 GET 方式发起回调,回调参数采用 JSON 格式编码,当 JSON 的首层参数值包含下表所示的常量字符串时,会自动替换为实际内容。
257
+ - `id` 字段填写回调地址,以 HTTP 或 HTTPS 开头,推荐采用 HTTPS 方式的回调 API,支持变量替换功能。
258
+ - `token` 字段为 POST 请求参数(JSON对象或JSON字符串),本字段为空或不存在则使用 GET 方式发起回调。当 JSON 的参数值包含下表所示的常量字符串时,会自动替换为实际内容。
232
259
 
233
- | 常量名称 | 常量内容 | 说明 |
234
- | ---------------- | ---------------------- | -------- |
235
- | `__DOMAIN__` | DDNS 域名 | |
236
- | `__RECORDTYPE__` | DDNS 记录类型 | |
237
- | `__TTL__` | DDNS TTL | |
238
- | `__TIMESTAMP__` | 请求发起时间戳 | 包含小数 |
260
+ 详细配置指南请查看:[Callback Provider 配置文档](doc/providers/callback.md)
261
+
262
+ | 常量名称 | 常量内容 | 说明 |
263
+ | ---------------- | ------------------------ | -------- |
264
+ | `__DOMAIN__` | DDNS 域名 | |
239
265
  | `__IP__` | 获取的对应类型的 IP 地址 | |
266
+ | `__RECORDTYPE__` | DDNS 记录类型 | |
267
+ | `__TTL__` | DDNS TTL | |
268
+ | `__TIMESTAMP__` | 请求发起时间戳 | 包含小数 |
240
269
 
241
270
  #### 配置示例
242
271
 
@@ -245,21 +274,21 @@ python run.py -c /path/to/config.json
245
274
  "$schema": "https://ddns.newfuture.cc/schema/v4.0.json",
246
275
  "id": "12345",
247
276
  "token": "mytokenkey",
248
- "dns": "dnspod 或 dnspod_com 或 alidns 或 dnscom 或 cloudflare 或 he 或 huaweidns 或 callback",
277
+ "dns": "dnspod 或 dnspod_com 或 alidns 或 aliesa 或 dnscom 或 cloudflare 或 he 或 huaweidns 或 namesilo 或 tencentcloud 或 noip 或 callback",
249
278
  "ipv4": ["ddns.newfuture.cc", "ipv4.ddns.newfuture.cc"],
250
279
  "ipv6": ["ddns.newfuture.cc", "ipv6.ddns.newfuture.cc"],
251
280
  "index4": 0,
252
281
  "index6": "public",
253
282
  "ttl": 600,
254
- "proxy": "127.0.0.1:1080;DIRECT",
283
+ "proxy": ["127.0.0.1:1080", "DIRECT"],
255
284
  "log": {
256
285
  "level": "DEBUG",
257
286
  "file": "dns.log",
258
- "format": "%(asctime)s %(levelname)s [%(module)s]: %(message)s",
259
287
  "datefmt": "%Y-%m-%dT%H:%M:%S"
260
288
  }
261
289
  }
262
290
  ```
291
+
263
292
  </details>
264
293
 
265
294
  ## 定时任务
@@ -275,10 +304,13 @@ python run.py -c /path/to/config.json
275
304
  #### Linux
276
305
 
277
306
  - 使用 init.d 和 crontab:
307
+
278
308
  ```bash
279
309
  sudo ./task.sh
280
310
  ```
311
+
281
312
  - 使用 systemd:
313
+
282
314
  ```bash
283
315
  安装:
284
316
  sudo ./systemd.sh install
@@ -306,11 +338,13 @@ Docker 镜像在无额外参数的情况下,已默认启用每 5 分钟执行
306
338
  使用系统自带的 IE 浏览器访问一次对应的 API 即可
307
339
 
308
340
  - alidns 打开: <https://alidns.aliyuncs.com>
341
+ - aliesa 打开: <https://esa.cn-hangzhou.aliyuncs.com>
309
342
  - cloudflare 打开: <https://api.cloudflare.com>
310
343
  - dns.com 打开: <https://www.dns.com>
311
344
  - dnspod.cn 打开: <https://dnsapi.cn>
312
345
  - dnspod 国际版: <https://api.dnspod.com>
313
346
  - 华为 DNS <https://dns.myhuaweicloud.com>
347
+
314
348
  </details>
315
349
 
316
350
  <details>
@@ -319,7 +353,7 @@ Docker 镜像在无额外参数的情况下,已默认启用每 5 分钟执行
319
353
  1. 先确认排查是否是系统/网络环境问题
320
354
  2. 在 [issues](https://github.com/NewFuture/DDNS/issues) 中搜索是否有类似问题
321
355
  3. 前两者均无法解决或者确定是 bug,[在此新建 issue](https://github.com/NewFuture/DDNS/issues/new)
322
- - [ ] 开启 debug 配置
356
+ - [ ] 开启 `--debug`
323
357
  - [ ] 附上这些内容 **运行版本和方式**、**系统环境**、**出错日志**、**去掉 id/token** 的配置文件
324
358
  - [ ] 源码运行注明使用的 python 环境
325
359
 
@@ -0,0 +1,31 @@
1
+ ddns/__builtins__.pyi,sha256=QTTtckbWAAZasu-uzeeyK4MLj9S9dxLtRlhty6U01jQ,109
2
+ ddns/__init__.py,sha256=SUqnkj9QXJFuc7vXN63wohdxYu2OupGgfTyZYYtO-uI,258
3
+ ddns/__main__.py,sha256=PrkwVahIUGvT9CNy3uXs8ZX-ox2RVx72aeWexhl6YZM,4134
4
+ ddns/cache.py,sha256=A1s3rnOJbPrGEjbGbbISrVg46lZFzZ84WPdzHaCtYBk,5971
5
+ ddns/ip.py,sha256=K4iFWwBX9kSrULVdNGX17dc_Zbqy9VpmpP2mdU_h6Cc,3947
6
+ ddns/provider/__init__.py,sha256=qAw-R-l7nUA9L96Tmr2n-T7_g8T9Mah7u615yg2zScY,2793
7
+ ddns/provider/_base.py,sha256=X73ID1iyz11zCX2nQne-8i7xW5CPGIXuWSs2zFI_Al8,20810
8
+ ddns/provider/_signature.py,sha256=fF8XxMDkXjia96d1gIVYWc72MVVe65AAnD7qr51qKXA,4140
9
+ ddns/provider/alidns.py,sha256=sBwDrtARbqgfEynPyR-dVfAVeh4K6lhO1XL9_0C1Tig,6096
10
+ ddns/provider/aliesa.py,sha256=5tGPyW22TtI7AGJKugIOipby3R68bHHEJiR_k9og1Rs,4695
11
+ ddns/provider/callback.py,sha256=WSd8QNpWUUJXQbyIatANmyigLU6VBvrLBsn7lALz8yA,2924
12
+ ddns/provider/cloudflare.py,sha256=0sVelYFU3ndjREQjtQAaT6G3jxj1Stk3hN7bT_NAUpI,4484
13
+ ddns/provider/debug.py,sha256=3TZYcXHcIzTwUEj5_rvZTT0QqS6jFwTuBS7cMujG2tM,587
14
+ ddns/provider/dnscom.py,sha256=IfdX_HaEjH12NHxdv6taRiX-zLQTo4kpBrJ1VWE9au4,3667
15
+ ddns/provider/dnspod.py,sha256=CSAIJYIjna-PphR4KE9KlMsPcgfEyRnJPCIEDqYlzNg,4445
16
+ ddns/provider/dnspod_com.py,sha256=uTFBSJIlFAijbpXYvte_pQHpGvTR4co9mEkJ0prRq7s,398
17
+ ddns/provider/edgeone.py,sha256=ck8GkkOk-Wa01QoGoPfD2pr6ok7gLuQyB7TDsSyNtHE,3897
18
+ ddns/provider/he.py,sha256=v6x_2_iJBr1RMefaBgnn3TWNk8-JxcL3llxmxr1vz1w,1820
19
+ ddns/provider/huaweidns.py,sha256=LH6EiCzGuftg3dNk7ZiPLaS6BvM0vWydrRXhtaLxj04,5590
20
+ ddns/provider/namesilo.py,sha256=jgqkQUcHVCyVjYoxazmcN9Gu_Zd-EAv3aSnNmHHJ1jk,5843
21
+ ddns/provider/noip.py,sha256=JY2939xCu0hF6wl1QPZpxz-2TgwYVY0GWMY97iRVHME,3961
22
+ ddns/provider/tencentcloud.py,sha256=SzQlTVU9W3NRq4QvK88eP4A3y6g13M0Ud-AE93qvSQ8,7153
23
+ ddns/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ ddns/util/comment.py,sha256=_B8sRpCJksNspsdld4ha03W1TAi-MyPRK7pL7ym0j9k,2199
25
+ ddns/util/http.py,sha256=xG5QyRO8r-pCnF4YBfGs_UxqUamX_f3n_wshw6FlMqM,7664
26
+ ddns-4.1.0b2.dist-info/licenses/LICENSE,sha256=MI-ECjp-Vl7WZLiSPY6r5VwrOReNiICVB1QCXiUGt_s,1111
27
+ ddns-4.1.0b2.dist-info/METADATA,sha256=bwPvJGxEL0JEahaLk3PD4gI04tZdVUpAJQQMKH0xP68,20807
28
+ ddns-4.1.0b2.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
29
+ ddns-4.1.0b2.dist-info/entry_points.txt,sha256=2-VbA-WZcjebkZrGKvUCuBBRYF4xQNMoLIoGaS234WU,44
30
+ ddns-4.1.0b2.dist-info/top_level.txt,sha256=Se0wn3T8Bc4pj55dGwVrCe8BFwmFCBwQVHF1bTyV0o0,5
31
+ ddns-4.1.0b2.dist-info/RECORD,,
ddns/util/cache.py DELETED
@@ -1,139 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """
3
- cache module
4
- 文件缓存
5
- """
6
-
7
-
8
- from os import path, stat
9
- from pickle import dump, load
10
- from time import time
11
-
12
- from logging import info, debug, warning
13
-
14
- try: # python 3
15
- from collections.abc import MutableMapping
16
- except ImportError: # python 2
17
- from collections import MutableMapping
18
-
19
-
20
- class Cache(MutableMapping):
21
- """
22
- using file to Cache data as dictionary
23
- """
24
-
25
- def __init__(self, path, sync=False):
26
- self.__data = {}
27
- self.__filename = path
28
- self.__sync = sync
29
- self.__time = time()
30
- self.__changed = False
31
- self.load()
32
-
33
- @property
34
- def time(self):
35
- """
36
- 缓存修改时间
37
- """
38
- return self.__time
39
-
40
- def load(self, file=None):
41
- """
42
- load data from path
43
- """
44
- if not file:
45
- file = self.__filename
46
-
47
- debug('load cache data from %s', file)
48
- if path.isfile(file):
49
- with open(self.__filename, 'rb') as data:
50
- try:
51
- self.__data = load(data)
52
- self.__time = stat(file).st_mtime
53
- return self
54
- except ValueError:
55
- pass
56
- except Exception as e:
57
- warning(e)
58
- else:
59
- info('cache file not exist')
60
-
61
- self.__data = {}
62
- self.__time = time()
63
- self.__changed = True
64
- return self
65
-
66
- def data(self, key=None, default=None):
67
- """
68
- 获取当前字典或者制定得键值
69
- """
70
- if self.__sync:
71
- self.load()
72
-
73
- if key is None:
74
- return self.__data
75
- else:
76
- return self.__data.get(key, default)
77
-
78
- def sync(self):
79
- """Sync the write buffer with the cache files and clear the buffer.
80
- """
81
- if self.__changed:
82
- with open(self.__filename, 'wb') as data:
83
- dump(self.__data, data)
84
- debug('save cache data to %s', self.__filename)
85
- self.__time = time()
86
- self.__changed = False
87
- return self
88
-
89
- def close(self):
90
- """Sync the write buffer, then close the cache.
91
- If a closed :class:`FileCache` object's methods are called, a
92
- :exc:`ValueError` will be raised.
93
- """
94
- self.sync()
95
- del self.__data
96
- del self.__filename
97
- del self.__time
98
- self.__sync = False
99
-
100
- def __update(self):
101
- self.__changed = True
102
- if self.__sync:
103
- self.sync()
104
- else:
105
- self.__time = time()
106
-
107
- def clear(self):
108
- if self.data() is not None:
109
- self.__data = {}
110
- self.__update()
111
-
112
- def __setitem__(self, key, value):
113
- if self.data(key) != value:
114
- self.__data[key] = value
115
- self.__update()
116
-
117
- def __delitem__(self, key):
118
- if key in self.data():
119
- del self.__data[key]
120
- self.__update()
121
-
122
- def __getitem__(self, key):
123
- return self.data(key)
124
-
125
- def __iter__(self):
126
- for key in self.data():
127
- yield key
128
-
129
- def __len__(self):
130
- return len(self.data())
131
-
132
- def __contains__(self, key):
133
- return key in self.data()
134
-
135
- def __str__(self):
136
- return self.data().__str__()
137
-
138
- def __del__(self):
139
- self.close()