diff options
author | Jan Cholasta <jcholast@redhat.com> | 2016-08-23 12:53:39 +0200 |
---|---|---|
committer | Martin Basti <mbasti@redhat.com> | 2016-09-06 12:54:38 +0200 |
commit | 38a51fa984a6aa92f383d7f8176057de8e057d52 (patch) | |
tree | ea421f4188c0b1136b4d24224d3c40375fe5e885 /ipaclient | |
parent | dce95a14595a37ce83bcf3e28f41feab715d0c81 (diff) | |
download | freeipa-38a51fa984a6aa92f383d7f8176057de8e057d52.tar.gz freeipa-38a51fa984a6aa92f383d7f8176057de8e057d52.tar.xz freeipa-38a51fa984a6aa92f383d7f8176057de8e057d52.zip |
dns: fix crash in interactive mode against old servers
Add a client-side fallback of the dnsrecord_split_parts command for old
servers to avoid CommandError in dnsrecord_add and dnsrecord_mod CLI
interactive mode.
https://fedorahosted.org/freeipa/ticket/6203
Reviewed-By: Martin Basti <mbasti@redhat.com>
Diffstat (limited to 'ipaclient')
-rw-r--r-- | ipaclient/plugins/dns.py | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/ipaclient/plugins/dns.py b/ipaclient/plugins/dns.py index 5e29b8c66..b9ab709bf 100644 --- a/ipaclient/plugins/dns.py +++ b/ipaclient/plugins/dns.py @@ -22,6 +22,7 @@ from __future__ import print_function import six import copy +import re from ipaclient.frontend import MethodOverride from ipalib import errors @@ -30,7 +31,8 @@ from ipalib.dns import (get_record_rrtype, iterate_rrparams_by_parts, part_name_format, record_name_format) -from ipalib.parameters import Bool +from ipalib.frontend import Command +from ipalib.parameters import Bool, Str from ipalib.plugable import Registry from ipalib import _, ngettext from ipapython.dnsutil import DNSName @@ -121,6 +123,64 @@ class dnszone_mod(DNSZoneMethodOverride): pass +# Support old servers without dnsrecord_split_parts +# Do not add anything new here! +@register(no_fail=True) +class dnsrecord_split_parts(Command): + NO_CLI = True + + takes_args = ( + Str('name'), + Str('value'), + ) + + def execute(self, name, value, *args, **options): + def split_exactly(count): + values = value.split() + if len(values) != count: + return None + return tuple(values) + + result = () + + rrtype = get_record_rrtype(name) + if rrtype in ('A', 'AAAA', 'CNAME', 'DNAME', 'NS', 'PTR'): + result = split_exactly(1) + elif rrtype in ('AFSDB', 'KX', 'MX'): + result = split_exactly(2) + elif rrtype in ('CERT', 'DLV', 'DS', 'SRV', 'TLSA'): + result = split_exactly(4) + elif rrtype in ('NAPTR'): + result = split_exactly(6) + elif rrtype in ('A6', 'TXT'): + result = (value,) + elif rrtype == 'LOC': + regex = re.compile( + r'(?P<d1>\d{1,2}\s+)' + r'(?:(?P<m1>\d{1,2}\s+)' + r'(?P<s1>\d{1,2}(?:\.\d{1,3})?\s+)?)?' + r'(?P<dir1>[NS])\s+' + r'(?P<d2>\d{1,3}\s+)' + r'(?:(?P<m2>\d{1,2}\s+)' + r'(?P<s2>\d{1,2}(?:\.\d{1,3})?\s+)?)?' + r'(?P<dir2>[WE])\s+' + r'(?P<alt>-?\d{1,8}(?:\.\d{1,2})?)m?' + r'(?:\s+(?P<siz>\d{1,8}(?:\.\d{1,2})?)m?' + r'(?:\s+(?P<hp>\d{1,8}(?:\.\d{1,2})?)m?' + r'(?:\s+(?P<vp>\d{1,8}(?:\.\d{1,2})?)m?\s*)?)?)?$') + + m = regex.match(value) + if m is not None: + result = tuple( + x.strip() if x is not None else x for x in m.groups()) + elif rrtype == 'SSHFP': + values = value.split(None, 2) + if len(values) == 3: + result = tuple(values) + + return dict(result=result) + + @register(override=True, no_fail=True) class dnsrecord_add(MethodOverride): no_option_msg = 'No options to add a specific record provided.\n' \ |