dynamicdns 0.1.0rc0__py3-none-any.whl → 0.1.0rc3__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.
- dynamicdns/__init__.py +3 -3
- dynamicdns/const.py +1 -1
- dynamicdns/providers.py +72 -11
- dynamicdns/py.typed +0 -0
- dynamicdns/updater.py +6 -5
- {dynamicdns-0.1.0rc0.dist-info → dynamicdns-0.1.0rc3.dist-info}/METADATA +1 -1
- dynamicdns-0.1.0rc3.dist-info/RECORD +9 -0
- dynamicdns-0.1.0rc0.dist-info/RECORD +0 -8
- {dynamicdns-0.1.0rc0.dist-info → dynamicdns-0.1.0rc3.dist-info}/WHEEL +0 -0
- {dynamicdns-0.1.0rc0.dist-info → dynamicdns-0.1.0rc3.dist-info}/licenses/LICENSE.txt +0 -0
dynamicdns/__init__.py
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
#
|
3
3
|
# SPDX-License-Identifier: MIT
|
4
4
|
|
5
|
-
from .providers import Provider, ProviderConf,
|
5
|
+
from .providers import Provider, ProviderConf, PROVIDERS
|
6
6
|
from .updater import Updater
|
7
7
|
|
8
|
-
__version__ = "0.1.
|
8
|
+
__version__ = "0.1.0rc3"
|
9
9
|
__all__ = [
|
10
|
-
"
|
10
|
+
"PROVIDERS",
|
11
11
|
"Provider",
|
12
12
|
"ProviderConf",
|
13
13
|
"Updater",
|
dynamicdns/const.py
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
from typing import Final
|
4
4
|
|
5
|
-
CONF_HOSTS: Final = "hosts"
|
6
5
|
CONF_HOST: Final = "host"
|
7
6
|
CONF_TOKEN: Final = "token"
|
8
7
|
CONF_USERNAME: Final = "username"
|
@@ -13,3 +12,4 @@ CONF_VERBOSE: Final = "verbose"
|
|
13
12
|
CONF_TXT: Final = "txt"
|
14
13
|
CONF_CLEAR: Final = "clear"
|
15
14
|
CONF_DOMAIN: Final = "domain"
|
15
|
+
CONF_URL: Final = "url"
|
dynamicdns/providers.py
CHANGED
@@ -16,6 +16,7 @@ from .const import (
|
|
16
16
|
CONF_IPV6_ADDRESS,
|
17
17
|
CONF_PASSWORD,
|
18
18
|
CONF_TOKEN,
|
19
|
+
CONF_URL,
|
19
20
|
CONF_USERNAME,
|
20
21
|
)
|
21
22
|
|
@@ -23,11 +24,14 @@ from .const import (
|
|
23
24
|
class Provider(StrEnum):
|
24
25
|
"""Dynamic DNS providers."""
|
25
26
|
|
26
|
-
DUCKDNS = "duckdns"
|
27
|
-
MYTHICBEASTS_IPV4 = "mythicbeasts_ipv4"
|
28
27
|
ANYDNS = "anydns"
|
28
|
+
DUCKDNS = "duckdns"
|
29
29
|
FREEDNS = "freedns"
|
30
30
|
FREEDNS_IPV6 = "freedns_ipv6"
|
31
|
+
MYTHICBEASTS = "mythicbeasts"
|
32
|
+
NAMECHEAP = "namecheap"
|
33
|
+
NO_IP = "no_ip"
|
34
|
+
CUSTOM = "custom"
|
31
35
|
|
32
36
|
|
33
37
|
@dataclass(frozen=True, kw_only=True)
|
@@ -43,13 +47,16 @@ class ProviderConf:
|
|
43
47
|
|
44
48
|
def render_url(self, data: dict[str, str]) -> URL:
|
45
49
|
"""Render the provider URL with given data and remove unused query parameters."""
|
46
|
-
|
47
|
-
url = URL(self.base_url)
|
50
|
+
url = URL(data.get(CONF_URL) or self.base_url)
|
48
51
|
url = url.with_path(url.path.format(**data))
|
52
|
+
if url.user:
|
53
|
+
url = url.with_user(url.user.format(**data))
|
54
|
+
if url.password:
|
55
|
+
url = url.with_password(url.password.format(**data))
|
49
56
|
return url % {k: data[v] for k, v in self.params.items() if v in data}
|
50
57
|
|
51
58
|
|
52
|
-
|
59
|
+
PROVIDERS: dict[Provider, ProviderConf] = {
|
53
60
|
Provider.DUCKDNS: ProviderConf(
|
54
61
|
name="Duck DNS",
|
55
62
|
base_url="https://www.duckdns.org/update?verbose=true",
|
@@ -67,8 +74,8 @@ providers: dict[Provider, ProviderConf] = {
|
|
67
74
|
),
|
68
75
|
success_fn=lambda x: x.startswith("OK"),
|
69
76
|
),
|
70
|
-
Provider.
|
71
|
-
name="Mythic Beasts
|
77
|
+
Provider.MYTHICBEASTS: ProviderConf(
|
78
|
+
name="Mythic Beasts",
|
72
79
|
base_url="https://ipv4.api.mythic-beasts.com/dns/v2/dynamic/{domain}",
|
73
80
|
method="POST",
|
74
81
|
params={"username": CONF_USERNAME, "password": CONF_PASSWORD},
|
@@ -77,31 +84,85 @@ providers: dict[Provider, ProviderConf] = {
|
|
77
84
|
vol.Required(CONF_DOMAIN): str,
|
78
85
|
vol.Required(CONF_USERNAME): str,
|
79
86
|
vol.Required(CONF_PASSWORD): str,
|
80
|
-
}
|
87
|
+
}
|
81
88
|
),
|
82
89
|
),
|
83
90
|
Provider.ANYDNS: ProviderConf(
|
84
91
|
name="AnyDNS.info",
|
85
92
|
base_url="https://anydns.info/update.php",
|
86
|
-
params={
|
93
|
+
params={
|
94
|
+
"host": CONF_DOMAIN,
|
95
|
+
"user": CONF_USERNAME,
|
96
|
+
"password": CONF_PASSWORD,
|
97
|
+
"ip": CONF_IP_ADDRESS,
|
98
|
+
"ip6": CONF_IPV6_ADDRESS,
|
99
|
+
},
|
87
100
|
schema=vol.Schema(
|
88
101
|
{
|
89
|
-
vol.Required(
|
102
|
+
vol.Required(CONF_DOMAIN): str,
|
90
103
|
vol.Required(CONF_USERNAME): str,
|
91
104
|
vol.Required(CONF_PASSWORD): str,
|
92
105
|
},
|
93
106
|
),
|
94
107
|
),
|
95
108
|
Provider.FREEDNS: ProviderConf(
|
96
|
-
name="FreeDNS
|
109
|
+
name="FreeDNS",
|
97
110
|
base_url="https://sync.afraid.org/u/{token}/",
|
111
|
+
params={"address": CONF_IP_ADDRESS},
|
98
112
|
schema=vol.Schema({vol.Required(CONF_TOKEN): str}),
|
99
113
|
success_fn=lambda x: x.startswith(("Updated", "No IP change")),
|
100
114
|
),
|
101
115
|
Provider.FREEDNS_IPV6: ProviderConf(
|
102
116
|
name="FreeDNS IPv6",
|
103
117
|
base_url="https://v6.sync.afraid.org/u/{token}",
|
118
|
+
params={"address": CONF_IPV6_ADDRESS},
|
104
119
|
schema=vol.Schema({vol.Required(CONF_TOKEN): str}),
|
105
120
|
success_fn=lambda x: x.startswith(("Updated", "No IP change")),
|
106
121
|
),
|
122
|
+
Provider.NAMECHEAP: ProviderConf(
|
123
|
+
name="Namecheap",
|
124
|
+
base_url=(
|
125
|
+
"https://dynamicdns.park-your-domain.com/update?host={host}&domain={domain}"
|
126
|
+
"&password={password}&ip={ip_address}"
|
127
|
+
),
|
128
|
+
params={
|
129
|
+
"host": CONF_HOST,
|
130
|
+
"domain": CONF_DOMAIN,
|
131
|
+
"password": CONF_PASSWORD,
|
132
|
+
"ip": CONF_IP_ADDRESS,
|
133
|
+
},
|
134
|
+
schema=vol.Schema(
|
135
|
+
{
|
136
|
+
vol.Required(CONF_HOST, default="@"): str,
|
137
|
+
vol.Required(CONF_DOMAIN): str,
|
138
|
+
vol.Required(CONF_PASSWORD): str,
|
139
|
+
}
|
140
|
+
),
|
141
|
+
success_fn=lambda x: "<ErrCount>0</ErrCount>" in x,
|
142
|
+
),
|
143
|
+
Provider.NO_IP: ProviderConf(
|
144
|
+
name="NO-IP.com",
|
145
|
+
base_url="https://{username}:{password}@dynupdate.no-ip.com/nic/update",
|
146
|
+
params={
|
147
|
+
"hostname": CONF_DOMAIN,
|
148
|
+
"myip": CONF_IP_ADDRESS,
|
149
|
+
},
|
150
|
+
schema=vol.Schema(
|
151
|
+
{
|
152
|
+
vol.Required(CONF_DOMAIN, default="all.ddnskey.com"): str,
|
153
|
+
vol.Required(CONF_USERNAME): str,
|
154
|
+
vol.Required(CONF_PASSWORD): str,
|
155
|
+
}
|
156
|
+
),
|
157
|
+
success_fn=lambda x: x.startswith(("good", "nochg")),
|
158
|
+
),
|
159
|
+
Provider.CUSTOM: ProviderConf(
|
160
|
+
name="Custom dynamic DNS provider",
|
161
|
+
base_url="{url}",
|
162
|
+
params={
|
163
|
+
"ip": CONF_IP_ADDRESS,
|
164
|
+
"ipv6": CONF_IPV6_ADDRESS,
|
165
|
+
},
|
166
|
+
schema=vol.Schema({vol.Required(CONF_URL): str}),
|
167
|
+
),
|
107
168
|
}
|
dynamicdns/py.typed
ADDED
File without changes
|
dynamicdns/updater.py
CHANGED
@@ -6,7 +6,7 @@ import logging
|
|
6
6
|
|
7
7
|
from aiohttp import ClientSession
|
8
8
|
|
9
|
-
from .providers import Provider,
|
9
|
+
from .providers import Provider, PROVIDERS
|
10
10
|
|
11
11
|
_LOGGER = logging.getLogger(__package__)
|
12
12
|
|
@@ -23,15 +23,16 @@ class Updater:
|
|
23
23
|
"""Initialize."""
|
24
24
|
|
25
25
|
self.session = session
|
26
|
-
self.
|
27
|
-
self.
|
28
|
-
self.
|
26
|
+
self.provider = provider
|
27
|
+
self.method = PROVIDERS[provider].method
|
28
|
+
self.url = PROVIDERS[provider].render_url(data)
|
29
|
+
self.success = PROVIDERS[provider].success_fn
|
29
30
|
|
30
31
|
async def update(self) -> bool:
|
31
32
|
"""Update the dynamic DNS record."""
|
32
33
|
|
33
34
|
async with self.session.request(self.method, self.url) as res:
|
34
|
-
_LOGGER.debug(await res.text())
|
35
|
+
_LOGGER.debug("[%s]: %s", self.provider.name, await res.text())
|
35
36
|
return (
|
36
37
|
self.success(await res.text()) if self.success is not None else res.ok
|
37
38
|
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: dynamicdns
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.0rc3
|
4
4
|
Summary: Collection of Dynamic DNS providers
|
5
5
|
Project-URL: Documentation, https://github.com/tr4nt0r/dynamicdns#readme
|
6
6
|
Project-URL: Issues, https://github.com/tr4nt0r/dynamicdns/issues
|
@@ -0,0 +1,9 @@
|
|
1
|
+
dynamicdns/__init__.py,sha256=0YfxkNVG9NB7gX9MHZst_fuKurJGBNt5ni-i8gHR5Pg,318
|
2
|
+
dynamicdns/const.py,sha256=gix8GQM2LUtGUY1itipOmeZARho3Maxs2yf_gpnHT8M,384
|
3
|
+
dynamicdns/providers.py,sha256=oSFDPAcCE1lx4B06qdWgz8eCdTMM4LeQ3WByH3T4qHc,5173
|
4
|
+
dynamicdns/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
5
|
+
dynamicdns/updater.py,sha256=LMzYyk2WnlLK26qnfpxMQE8YrtTeORPXtr9GrJzUJfI,994
|
6
|
+
dynamicdns-0.1.0rc3.dist-info/METADATA,sha256=RXim-rOqNMMG1c8kJD0XSppda0F9MCLFcIQNQiY1VwQ,1626
|
7
|
+
dynamicdns-0.1.0rc3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
8
|
+
dynamicdns-0.1.0rc3.dist-info/licenses/LICENSE.txt,sha256=mRjb1OkwCPh8OBwRrkNZ225tHQ_0eNkVpQjx_vyQx88,1115
|
9
|
+
dynamicdns-0.1.0rc3.dist-info/RECORD,,
|
@@ -1,8 +0,0 @@
|
|
1
|
-
dynamicdns/__init__.py,sha256=PopiNykPYAFKuHkafW_Aw8_OM7jRc8tThVWwN2HolYo,318
|
2
|
-
dynamicdns/const.py,sha256=9aOikA152muIBSyJPoYVa5d8bPwgCogfO28m7pacXXk,388
|
3
|
-
dynamicdns/providers.py,sha256=ZG9O-CAHdyEpfUj5OOyU-X6fjU22NpGQiitERgrT3u4,3193
|
4
|
-
dynamicdns/updater.py,sha256=kEHt-XUXRWYeZwQefdR2ncjD9Kdr0XQTRcjCMxR0NYc,929
|
5
|
-
dynamicdns-0.1.0rc0.dist-info/METADATA,sha256=a9KKhMCt2k79m0uEbComFL_QuquXmlhDlUmeqO3udyw,1626
|
6
|
-
dynamicdns-0.1.0rc0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
7
|
-
dynamicdns-0.1.0rc0.dist-info/licenses/LICENSE.txt,sha256=mRjb1OkwCPh8OBwRrkNZ225tHQ_0eNkVpQjx_vyQx88,1115
|
8
|
-
dynamicdns-0.1.0rc0.dist-info/RECORD,,
|
File without changes
|
File without changes
|