Merge branch 'testing' into unstable

This fixes DynDNS update.
This commit is contained in:
Jérôme Lebleu 2016-03-27 16:54:13 +02:00
commit d11dd38e42
4 changed files with 53 additions and 18 deletions

View file

@ -1168,7 +1168,7 @@ dyndns:
default: "dyndns.yunohost.org"
-d:
full: --domain
help: Full domain to subscribe with
help: Full domain to update
extra:
pattern: *pattern_domain
-k:

18
debian/changelog vendored
View file

@ -1,3 +1,15 @@
moulinette-yunohost (2.2.4) stable; urgency=low
[ Jérôme Lebleu ]
* [fix] Update first registered domain with DynDNS instead of current_host
* [fix] Set found private key and don't validate it in dyndns_update
* [fix] Use dyndns.yunohost.org instead of dynhost.yunohost.org
[ opi ]
* [fix] Catch ConnectionError from requests package
-- Jérôme Lebleu <jerome@yunohost.org> Sun, 27 Mar 2016 16:30:42 +0200
yunohost (2.3.11.2) testing; urgency=low
* [fix] Don't fail dnsmasq regen if IPv4/6 cannot be retrieved
@ -383,12 +395,6 @@ moulinette-yunohost (2.3.0) testing; urgency=low
-- Jérôme Lebleu <jerome.lebleu@mailoo.org> Tue, 08 Sep 2015 14:19:28 +0200
moulinette-yunohost (2.2.3-1) stable; urgency=low
* [fix] Catch ConnectionError from requests package
-- opi <opi@zeropi.net> Sun, 06 Mar 2016 21:51:06 +0100
moulinette-yunohost (2.2.3) stable; urgency=low
* [fix] Catch proper exception in backup_list (fix #65)

View file

@ -69,6 +69,8 @@
"no_ipv6_connectivity": "IPv6 connectivity is not available",
"dyndns_key_generating" : "DNS key is being generated, it may take a while...",
"dyndns_key_not_found" : "DNS key not found for the domain",
"dyndns_no_domain_registered": "No domain has been registered with DynDNS",
"dyndns_unavailable" : "Unavailable DynDNS subdomain",
"dyndns_registration_failed" : "Unable to register DynDNS domain: {error:s}",
"dyndns_registered" : "DynDNS domain successfully registered",

View file

@ -24,12 +24,12 @@
Subscribe and Update DynDNS Hosts
"""
import os
import requests
import re
import json
import glob
import base64
import errno
import requests
import subprocess
from moulinette.core import MoulinetteError
@ -62,6 +62,10 @@ class IPRouteLine(object):
for k, v in self.m.groupdict().items():
setattr(self, k, v)
re_dyndns_private_key = re.compile(
r'.*/K(?P<domain>[^\s\+]+)\.\+157.+\.private$'
)
def dyndns_subscribe(subscribe_host="dyndns.yunohost.org", domain=None, key=None):
"""
@ -120,17 +124,13 @@ def dyndns_update(dyn_host="dyndns.yunohost.org", domain=None, key=None,
Update IP on DynDNS platform
Keyword argument:
domain -- Full domain to subscribe with
domain -- Full domain to update
dyn_host -- Dynette DNS server to inform
key -- Public DNS key
ipv4 -- IP address to send
ipv6 -- IPv6 address to send
"""
if domain is None:
with open('/etc/yunohost/current_host', 'r') as f:
domain = f.readline().rstrip()
# IPv4
if ipv4 is None:
ipv4 = get_public_ip()
@ -168,6 +168,37 @@ def dyndns_update(dyn_host="dyndns.yunohost.org", domain=None, key=None,
old_ipv6 = '0000:0000:0000:0000:0000:0000:0000:0000'
if old_ip != ipv4 or old_ipv6 != ipv6:
if domain is None:
# Retrieve the first registered domain
for path in glob.iglob('/etc/yunohost/dyndns/K*.private'):
match = re_dyndns_private_key.match(path)
if not match:
continue
_domain = match.group('domain')
try:
# Check if domain is registered
if requests.get('https://{0}/test/{1}'.format(
dyn_host, _domain)).status_code == 200:
continue
except requests.ConnectionError:
raise MoulinetteError(errno.ENETUNREACH,
m18n.n('no_internet_connection'))
domain = _domain
key = path
break
if not domain:
raise MoulinetteError(errno.EINVAL,
m18n.n('dyndns_no_domain_registered'))
if key is None:
keys = glob.glob(
'/etc/yunohost/dyndns/K{0}.+*.private'.format(domain))
if len(keys) > 0:
key = keys[0]
if not key:
raise MoulinetteError(errno.EIO,
m18n.n('dyndns_key_not_found'))
host = domain.split('.')[1:]
host = '.'.join(host)
lines = [
@ -209,11 +240,7 @@ def dyndns_update(dyn_host="dyndns.yunohost.org", domain=None, key=None,
for line in lines:
zone.write(line + '\n')
if key is None:
private_key_file = glob.glob('/etc/yunohost/dyndns/*.private')[0]
else:
private_key_file = key
if os.system('/usr/bin/nsupdate -k %s /etc/yunohost/dyndns/zone' % private_key_file) == 0:
if os.system('/usr/bin/nsupdate -k %s /etc/yunohost/dyndns/zone' % key) == 0:
logger.success(m18n.n('dyndns_ip_updated'))
with open('/etc/yunohost/dyndns/old_ip', 'w') as f:
f.write(ipv4)