The Identity, Policy and Audit system
CentOS Sources
2016-11-03 403b09ab980c02ef36095973349a13e0181c794a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
From 7563ae6257c56555e502d40bc6fc2e142f850094 Mon Sep 17 00:00:00 2001
From: Jan Cholasta <jcholast@redhat.com>
Date: Fri, 2 Sep 2016 16:42:57 +0200
Subject: [PATCH] dns: prompt for missing record parts in CLI
 
Fix the code which determines if a record part is required and thus should
be prompted not to wrongfully consider all record parts to be optional.
 
https://fedorahosted.org/freeipa/ticket/6203
 
Reviewed-By: Martin Basti <mbasti@redhat.com>
---
 API.txt                  | 29 +++++++++++++++++++++++++++++
 VERSION                  |  4 ++--
 ipaclient/plugins/dns.py | 30 ++++++++++++++++--------------
 ipaserver/plugins/dns.py | 15 +++++++++++++++
 4 files changed, 62 insertions(+), 16 deletions(-)
 
diff --git a/API.txt b/API.txt
index 5b83bfbd0b457b77e0522ab7d83abfae4df3ebe9..fb5bf83cea0633130217cf1327481c8e9b11c4fc 100644
--- a/API.txt
+++ b/API.txt
@@ -6312,9 +6312,20 @@ default: dns_is_enabled/1
 default: dns_resolve/1
 default: dns_system_records/1
 default: dns_update_system_records/1
+default: dnsa6record/1
+default: dnsaaaarecord/1
+default: dnsafsdbrecord/1
+default: dnsaplrecord/1
+default: dnsarecord/1
+default: dnscertrecord/1
+default: dnscnamerecord/1
 default: dnsconfig/1
 default: dnsconfig_mod/1
 default: dnsconfig_show/1
+default: dnsdhcidrecord/1
+default: dnsdlvrecord/1
+default: dnsdnamerecord/1
+default: dnsdsrecord/1
 default: dnsforwardzone/1
 default: dnsforwardzone_add/1
 default: dnsforwardzone_add_permission/1
@@ -6325,6 +6336,16 @@ default: dnsforwardzone_find/1
 default: dnsforwardzone_mod/1
 default: dnsforwardzone_remove_permission/1
 default: dnsforwardzone_show/1
+default: dnshiprecord/1
+default: dnsipseckeyrecord/1
+default: dnskeyrecord/1
+default: dnskxrecord/1
+default: dnslocrecord/1
+default: dnsmxrecord/1
+default: dnsnaptrrecord/1
+default: dnsnsecrecord/1
+default: dnsnsrecord/1
+default: dnsptrrecord/1
 default: dnsrecord/1
 default: dnsrecord_add/1
 default: dnsrecord_del/1
@@ -6333,12 +6354,20 @@ default: dnsrecord_find/1
 default: dnsrecord_mod/1
 default: dnsrecord_show/1
 default: dnsrecord_split_parts/1
+default: dnsrprecord/1
+default: dnsrrsigrecord/1
 default: dnsserver/1
 default: dnsserver_add/1
 default: dnsserver_del/1
 default: dnsserver_find/1
 default: dnsserver_mod/1
 default: dnsserver_show/1
+default: dnssigrecord/1
+default: dnsspfrecord/1
+default: dnssrvrecord/1
+default: dnssshfprecord/1
+default: dnstlsarecord/1
+default: dnstxtrecord/1
 default: dnszone/1
 default: dnszone_add/1
 default: dnszone_add_permission/1
diff --git a/VERSION b/VERSION
index a8b89ed305bcfdf2990a7400d005a68d734fa7e8..796e9fea36b72f3a63372c84b9bfb1538efccfb7 100644
--- a/VERSION
+++ b/VERSION
@@ -90,5 +90,5 @@ IPA_DATA_VERSION=20100614120000
 #                                                      #
 ########################################################
 IPA_API_VERSION_MAJOR=2
-IPA_API_VERSION_MINOR=212
-# Last change: ab: service: add flag to allow S4U2Self
+IPA_API_VERSION_MINOR=213
+# Last change: dns: prompt for missing record parts in CLI
diff --git a/ipaclient/plugins/dns.py b/ipaclient/plugins/dns.py
index db9c17f8b523365779e53adfb2acc43f4a23401f..5e29b8c6666f94f52add7f2e1de8679127886fc2 100644
--- a/ipaclient/plugins/dns.py
+++ b/ipaclient/plugins/dns.py
@@ -25,10 +25,10 @@ import copy
 
 from ipaclient.frontend import MethodOverride
 from ipalib import errors
-from ipalib.dns import (get_part_rrtype,
-                        get_record_rrtype,
+from ipalib.dns import (get_record_rrtype,
                         has_cli_options,
                         iterate_rrparams_by_parts,
+                        part_name_format,
                         record_name_format)
 from ipalib.parameters import Bool
 from ipalib.plugable import Registry
@@ -46,9 +46,9 @@ _rev_top_record_types = ('PTR', )
 _zone_top_record_types = ('NS', 'MX', 'LOC', )
 
 
-def __get_part_param(cmd, part, output_kw, default=None):
-    name = part.name
-    label = unicode(part.label)
+def __get_part_param(rrtype, cmd, part, output_kw, default=None):
+    name = part_name_format % (rrtype.lower(), part.name)
+    label = unicode(cmd.params[name].label)
     optional = not part.required
 
     output_kw[name] = cmd.prompt_param(part,
@@ -64,29 +64,31 @@ def prompt_parts(rrtype, cmd, mod_dnsvalue=None):
             name, mod_dnsvalue)['result']
 
     user_options = {}
-    parts = [p for p in cmd.params() if get_part_rrtype(p.name) == rrtype]
-    if not parts:
+    try:
+        rrobj = cmd.api.Object['dns{}record'.format(rrtype.lower())]
+    except KeyError:
         return user_options
 
-    for part_id, part in enumerate(parts):
+    for part_id, part in enumerate(rrobj.params()):
         if mod_parts:
             default = mod_parts[part_id]
         else:
             default = None
 
-        __get_part_param(cmd, part, user_options, default)
+        __get_part_param(rrtype, cmd, part, user_options, default)
 
     return user_options
 
 
 def prompt_missing_parts(rrtype, cmd, kw, prompt_optional=False):
     user_options = {}
-    parts = [p for p in cmd.params() if get_part_rrtype(p.name) == rrtype]
-    if not parts:
+    try:
+        rrobj = cmd.api.Object['dns{}record'.format(rrtype.lower())]
+    except KeyError:
         return user_options
 
-    for part in parts:
-        name = part.name
+    for part in rrobj.params():
+        name = part_name_format % (rrtype.lower(), part.name)
 
         if name in kw:
             continue
@@ -96,7 +98,7 @@ def prompt_missing_parts(rrtype, cmd, kw, prompt_optional=False):
             continue
 
         default = part.get_default(**kw)
-        __get_part_param(cmd, part, user_options, default)
+        __get_part_param(rrtype, cmd, part, user_options, default)
 
     return user_options
 
diff --git a/ipaserver/plugins/dns.py b/ipaserver/plugins/dns.py
index 6f1bd716d202bd85dfc46b5eb94f73e85683b917..f048351e649fe0e8e2893627946333b14c11018a 100644
--- a/ipaserver/plugins/dns.py
+++ b/ipaserver/plugins/dns.py
@@ -3471,6 +3471,21 @@ class dnsrecord(LDAPObject):
             )
 
 
+# Make DNS record types available as objects in the API.
+# This is used by the CLI to get otherwise unavailable attributes of record
+# parts.
+for param in _dns_records:
+    register()(
+        type(
+            'dns{}record'.format(param.rrtype.lower()),
+            (Object,),
+            dict(
+                takes_params=(param.parts or ()) + (param.extra or ()),
+            )
+        )
+    )
+
+
 @register()
 class dnsrecord_split_parts(Command):
     NO_CLI = True
-- 
2.7.4