Refactor dnsrecord processing

Current DNS record processing architecture has many flaws,
including custom execute() methods which does not take advantage
of base LDAP commands or nonstandard and confusing DNS record
option processing.

This patch refactors DNS record processing with the following
improvements:
 * Every DNS record has now own Parameter type. Each DNS record
   consists from one or more "parts" which are also Parameters.
   This architecture will enable much easier implementation of
   future per-DNS-type API.
 * Validation is now not written as a separate function for
   every parameter but is delegated to DNS record parts.
 * Normalization is also delegated to DNS record parts.
 * Since standard LDAP base commands execute method is now used,
   dnsrecord-add and dnsrecord-mod correctly supports --setattr
   and --addattr options.
 * In order to prevent confusion unsupported DNS record types
   are now hidden. They are still present in the plugin so that
   old clients receive proper validation error.

The patch also contains several fixes:
 * Fix domain-name validation and normalization- allow domain
   names that are not fully qualified. For example --cname-rec=bar
   is a valid domain-name for bind which will translate it then
   as bar.<owning-domain>. This change implies, that fully qualified
   domain names must end with '.'.
 * Do not let user accidentally remove entire zone with command
   "ipa dnsrecord-del @ --del-all".
 * Fix --ttl and --class option processing in dnsrecord-add and
   dnsrecord-mod.

All API changes are compatible with clients without this patch.

https://fedorahosted.org/freeipa/ticket/2082
This commit is contained in:
Martin Kosek
2012-01-06 15:12:41 +01:00
parent 91c10419f8
commit 52ea3a6b29
4 changed files with 986 additions and 754 deletions

328
API.txt
View File

@@ -613,135 +613,93 @@ arg: Str('dnszoneidnsname', cli_name='dnszone', query=True, required=True)
arg: Str('idnsname', attribute=True, cli_name='name', multivalue=False, primary_key=True, required=True)
option: Int('dnsttl', attribute=True, cli_name='ttl', multivalue=False, required=False)
option: StrEnum('dnsclass', attribute=True, cli_name='class', multivalue=False, required=False, values=(u'IN', u'CS', u'CH', u'HS'))
option: ARecord('arecord', attribute=True, cli_name='a_rec', csv=True, multivalue=True, required=False)
option: AAAARecord('aaaarecord', attribute=True, cli_name='aaaa_rec', csv=True, multivalue=True, required=False)
option: A6Record('a6record', attribute=True, cli_name='a6_rec', csv=True, multivalue=True, required=False)
option: AFSDBRecord('afsdbrecord', attribute=True, cli_name='afsdb_rec', csv=True, multivalue=True, required=False)
option: APLRecord('aplrecord', attribute=True, cli_name='apl_rec', csv=True, multivalue=True, required=False)
option: CERTRecord('certrecord', attribute=True, cli_name='cert_rec', csv=True, multivalue=True, required=False)
option: CNAMERecord('cnamerecord', attribute=True, cli_name='cname_rec', csv=True, multivalue=True, required=False)
option: DHCIDRecord('dhcidrecord', attribute=True, cli_name='dhcid_rec', csv=True, multivalue=True, required=False)
option: DLVRecord('dlvrecord', attribute=True, cli_name='dlv_rec', csv=True, multivalue=True, required=False)
option: DNAMERecord('dnamerecord', attribute=True, cli_name='dname_rec', csv=True, multivalue=True, required=False)
option: DNSKEYRecord('dnskeyrecord', attribute=True, cli_name='dnskey_rec', csv=True, multivalue=True, required=False)
option: DSRecord('dsrecord', attribute=True, cli_name='ds_rec', csv=True, multivalue=True, required=False)
option: HIPRecord('hiprecord', attribute=True, cli_name='hip_rec', csv=True, multivalue=True, required=False)
option: IPSECKEYRecord('ipseckeyrecord', attribute=True, cli_name='ipseckey_rec', csv=True, multivalue=True, required=False)
option: KEYRecord('keyrecord', attribute=True, cli_name='key_rec', csv=True, multivalue=True, required=False)
option: KXRecord('kxrecord', attribute=True, cli_name='kx_rec', csv=True, multivalue=True, required=False)
option: LOCRecord('locrecord', attribute=True, cli_name='loc_rec', csv=True, multivalue=True, required=False)
option: MXRecord('mxrecord', attribute=True, cli_name='mx_rec', csv=True, multivalue=True, required=False)
option: NAPTRRecord('naptrrecord', attribute=True, cli_name='naptr_rec', csv=True, multivalue=True, required=False)
option: NSRecord('nsrecord', attribute=True, cli_name='ns_rec', csv=True, multivalue=True, required=False)
option: NSECRecord('nsecrecord', attribute=True, cli_name='nsec_rec', csv=True, multivalue=True, required=False)
option: NSEC3Record('nsec3record', attribute=True, cli_name='nsec3_rec', csv=True, multivalue=True, required=False)
option: NSEC3PARAMRecord('nsec3paramrecord', attribute=True, cli_name='nsec3param_rec', csv=True, multivalue=True, required=False)
option: PTRRecord('ptrrecord', attribute=True, cli_name='ptr_rec', csv=True, multivalue=True, required=False)
option: RRSIGRecord('rrsigrecord', attribute=True, cli_name='rrsig_rec', csv=True, multivalue=True, required=False)
option: RPRecord('rprecord', attribute=True, cli_name='rp_rec', csv=True, multivalue=True, required=False)
option: SIGRecord('sigrecord', attribute=True, cli_name='sig_rec', csv=True, multivalue=True, required=False)
option: SPFRecord('spfrecord', attribute=True, cli_name='spf_rec', csv=True, multivalue=True, required=False)
option: SRVRecord('srvrecord', attribute=True, cli_name='srv_rec', csv=True, multivalue=True, required=False)
option: SSHFPRecord('sshfprecord', attribute=True, cli_name='sshfp_rec', csv=True, multivalue=True, required=False)
option: TARecord('tarecord', attribute=True, cli_name='ta_rec', csv=True, multivalue=True, required=False)
option: TKEYRecord('tkeyrecord', attribute=True, cli_name='tkey_rec', csv=True, multivalue=True, required=False)
option: TSIGRecord('tsigrecord', attribute=True, cli_name='tsig_rec', csv=True, multivalue=True, required=False)
option: TXTRecord('txtrecord', attribute=True, cli_name='txt_rec', csv=True, multivalue=True, required=False)
option: Str('setattr*', cli_name='setattr', exclude='webui')
option: Str('addattr*', cli_name='addattr', exclude='webui')
option: Flag('force', autofill=True, default=False)
option: Flag('all', autofill=True, cli_name='all', default=False, exclude='webui')
option: Flag('raw', autofill=True, cli_name='raw', default=False, exclude='webui')
option: Str('version?', exclude='webui')
option: Str('arecord*', attribute=True, cli_name='a_rec', csv=True)
option: Str('aaaarecord*', attribute=True, cli_name='aaaa_rec', csv=True)
option: Str('a6record*', attribute=True, cli_name='a6_rec', csv=True)
option: Str('afsdbrecord*', attribute=True, cli_name='afsdb_rec', csv=True)
option: Str('aplrecord*', attribute=True, cli_name='apl_rec', csv=True)
option: Str('certrecord*', attribute=True, cli_name='cert_rec', csv=True)
option: Str('cnamerecord*', attribute=True, cli_name='cname_rec', csv=True)
option: Str('dhcidrecord*', attribute=True, cli_name='dhcid_rec', csv=True)
option: Str('dlvrecord*', attribute=True, cli_name='dlv_rec', csv=True)
option: Str('dnamerecord*', attribute=True, cli_name='dname_rec', csv=True)
option: Str('dnskeyrecord*', attribute=True, cli_name='dnskey_rec', csv=True)
option: Str('dsrecord*', attribute=True, cli_name='ds_rec', csv=True)
option: Str('hiprecord*', attribute=True, cli_name='hip_rec', csv=True)
option: Str('ipseckeyrecord*', attribute=True, cli_name='ipseckey_rec', csv=True)
option: Str('keyrecord*', attribute=True, cli_name='key_rec', csv=True)
option: Str('kxrecord*', attribute=True, cli_name='kx_rec', csv=True)
option: Str('locrecord*', attribute=True, cli_name='loc_rec', csv=True)
option: Str('mxrecord*', attribute=True, cli_name='mx_rec', csv=True)
option: Str('naptrrecord*', attribute=True, cli_name='naptr_rec', csv=True)
option: Str('nsrecord*', attribute=True, cli_name='ns_rec', csv=True)
option: Str('nsecrecord*', attribute=True, cli_name='nsec_rec', csv=True)
option: Str('nsec3record*', attribute=True, cli_name='nsec3_rec', csv=True)
option: Str('nsec3paramrecord*', attribute=True, cli_name='nsec3param_rec', csv=True)
option: Str('ptrrecord*', attribute=True, cli_name='ptr_rec', csv=True)
option: Str('rrsigrecord*', attribute=True, cli_name='rrsig_rec', csv=True)
option: Str('rprecord*', attribute=True, cli_name='rp_rec', csv=True)
option: Str('sigrecord*', attribute=True, cli_name='sig_rec', csv=True)
option: Str('spfrecord*', attribute=True, cli_name='spf_rec', csv=True)
option: Str('srvrecord*', attribute=True, cli_name='srv_rec', csv=True)
option: Str('sshfprecord*', attribute=True, cli_name='sshfp_rec', csv=True)
option: Str('tarecord*', attribute=True, cli_name='ta_rec', csv=True)
option: Str('tkeyrecord*', attribute=True, cli_name='tkey_rec', csv=True)
option: Str('tsigrecord*', attribute=True, cli_name='tsig_rec', csv=True)
option: Str('txtrecord*', attribute=True, cli_name='txt_rec', csv=True)
output: Output('summary', (<type 'unicode'>, <type 'NoneType'>), None)
output: Entry('result', <type 'dict'>, Gettext('A dictionary representing an LDAP entry', domain='ipa', localedir=None))
output: Output('value', <type 'unicode'>, None)
command: dnsrecord_add_record
args: 2,37,3
arg: Str('dnszoneidnsname', cli_name='dnszone', query=True, required=True)
arg: Str('idnsname', attribute=True, cli_name='name', multivalue=False, primary_key=True, query=True, required=True)
option: Flag('all', autofill=True, cli_name='all', default=False, exclude='webui')
option: Flag('raw', autofill=True, cli_name='raw', default=False, exclude='webui')
option: Str('version?', exclude='webui')
option: Str('arecord*', attribute=True, cli_name='a_rec', csv=True)
option: Str('aaaarecord*', attribute=True, cli_name='aaaa_rec', csv=True)
option: Str('a6record*', attribute=True, cli_name='a6_rec', csv=True)
option: Str('afsdbrecord*', attribute=True, cli_name='afsdb_rec', csv=True)
option: Str('aplrecord*', attribute=True, cli_name='apl_rec', csv=True)
option: Str('certrecord*', attribute=True, cli_name='cert_rec', csv=True)
option: Str('cnamerecord*', attribute=True, cli_name='cname_rec', csv=True)
option: Str('dhcidrecord*', attribute=True, cli_name='dhcid_rec', csv=True)
option: Str('dlvrecord*', attribute=True, cli_name='dlv_rec', csv=True)
option: Str('dnamerecord*', attribute=True, cli_name='dname_rec', csv=True)
option: Str('dnskeyrecord*', attribute=True, cli_name='dnskey_rec', csv=True)
option: Str('dsrecord*', attribute=True, cli_name='ds_rec', csv=True)
option: Str('hiprecord*', attribute=True, cli_name='hip_rec', csv=True)
option: Str('ipseckeyrecord*', attribute=True, cli_name='ipseckey_rec', csv=True)
option: Str('keyrecord*', attribute=True, cli_name='key_rec', csv=True)
option: Str('kxrecord*', attribute=True, cli_name='kx_rec', csv=True)
option: Str('locrecord*', attribute=True, cli_name='loc_rec', csv=True)
option: Str('mxrecord*', attribute=True, cli_name='mx_rec', csv=True)
option: Str('naptrrecord*', attribute=True, cli_name='naptr_rec', csv=True)
option: Str('nsrecord*', attribute=True, cli_name='ns_rec', csv=True)
option: Str('nsecrecord*', attribute=True, cli_name='nsec_rec', csv=True)
option: Str('nsec3record*', attribute=True, cli_name='nsec3_rec', csv=True)
option: Str('nsec3paramrecord*', attribute=True, cli_name='nsec3param_rec', csv=True)
option: Str('ptrrecord*', attribute=True, cli_name='ptr_rec', csv=True)
option: Str('rrsigrecord*', attribute=True, cli_name='rrsig_rec', csv=True)
option: Str('rprecord*', attribute=True, cli_name='rp_rec', csv=True)
option: Str('sigrecord*', attribute=True, cli_name='sig_rec', csv=True)
option: Str('spfrecord*', attribute=True, cli_name='spf_rec', csv=True)
option: Str('srvrecord*', attribute=True, cli_name='srv_rec', csv=True)
option: Str('sshfprecord*', attribute=True, cli_name='sshfp_rec', csv=True)
option: Str('tarecord*', attribute=True, cli_name='ta_rec', csv=True)
option: Str('tkeyrecord*', attribute=True, cli_name='tkey_rec', csv=True)
option: Str('tsigrecord*', attribute=True, cli_name='tsig_rec', csv=True)
option: Str('txtrecord*', attribute=True, cli_name='txt_rec', csv=True)
output: Output('summary', (<type 'unicode'>, <type 'NoneType'>), None)
output: Entry('result', <type 'dict'>, Gettext('A dictionary representing an LDAP entry', domain='ipa', localedir=None))
output: Output('value', <type 'unicode'>, None)
command: dnsrecord_del
args: 2,38,3
args: 2,40,3
arg: Str('dnszoneidnsname', cli_name='dnszone', query=True, required=True)
arg: Str('idnsname', attribute=True, cli_name='name', multivalue=False, primary_key=True, query=True, required=True)
option: Int('dnsttl', attribute=True, autofill=False, cli_name='ttl', multivalue=False, required=False)
option: StrEnum('dnsclass', attribute=True, autofill=False, cli_name='class', multivalue=False, required=False, values=(u'IN', u'CS', u'CH', u'HS'))
option: ARecord('arecord', attribute=True, autofill=False, cli_name='a_rec', csv=True, multivalue=True, required=False)
option: AAAARecord('aaaarecord', attribute=True, autofill=False, cli_name='aaaa_rec', csv=True, multivalue=True, required=False)
option: A6Record('a6record', attribute=True, autofill=False, cli_name='a6_rec', csv=True, multivalue=True, required=False)
option: AFSDBRecord('afsdbrecord', attribute=True, autofill=False, cli_name='afsdb_rec', csv=True, multivalue=True, required=False)
option: APLRecord('aplrecord', attribute=True, autofill=False, cli_name='apl_rec', csv=True, multivalue=True, required=False)
option: CERTRecord('certrecord', attribute=True, autofill=False, cli_name='cert_rec', csv=True, multivalue=True, required=False)
option: CNAMERecord('cnamerecord', attribute=True, autofill=False, cli_name='cname_rec', csv=True, multivalue=True, required=False)
option: DHCIDRecord('dhcidrecord', attribute=True, autofill=False, cli_name='dhcid_rec', csv=True, multivalue=True, required=False)
option: DLVRecord('dlvrecord', attribute=True, autofill=False, cli_name='dlv_rec', csv=True, multivalue=True, required=False)
option: DNAMERecord('dnamerecord', attribute=True, autofill=False, cli_name='dname_rec', csv=True, multivalue=True, required=False)
option: DNSKEYRecord('dnskeyrecord', attribute=True, autofill=False, cli_name='dnskey_rec', csv=True, multivalue=True, required=False)
option: DSRecord('dsrecord', attribute=True, autofill=False, cli_name='ds_rec', csv=True, multivalue=True, required=False)
option: HIPRecord('hiprecord', attribute=True, autofill=False, cli_name='hip_rec', csv=True, multivalue=True, required=False)
option: IPSECKEYRecord('ipseckeyrecord', attribute=True, autofill=False, cli_name='ipseckey_rec', csv=True, multivalue=True, required=False)
option: KEYRecord('keyrecord', attribute=True, autofill=False, cli_name='key_rec', csv=True, multivalue=True, required=False)
option: KXRecord('kxrecord', attribute=True, autofill=False, cli_name='kx_rec', csv=True, multivalue=True, required=False)
option: LOCRecord('locrecord', attribute=True, autofill=False, cli_name='loc_rec', csv=True, multivalue=True, required=False)
option: MXRecord('mxrecord', attribute=True, autofill=False, cli_name='mx_rec', csv=True, multivalue=True, required=False)
option: NAPTRRecord('naptrrecord', attribute=True, autofill=False, cli_name='naptr_rec', csv=True, multivalue=True, required=False)
option: NSRecord('nsrecord', attribute=True, autofill=False, cli_name='ns_rec', csv=True, multivalue=True, required=False)
option: NSECRecord('nsecrecord', attribute=True, autofill=False, cli_name='nsec_rec', csv=True, multivalue=True, required=False)
option: NSEC3Record('nsec3record', attribute=True, autofill=False, cli_name='nsec3_rec', csv=True, multivalue=True, required=False)
option: NSEC3PARAMRecord('nsec3paramrecord', attribute=True, autofill=False, cli_name='nsec3param_rec', csv=True, multivalue=True, required=False)
option: PTRRecord('ptrrecord', attribute=True, autofill=False, cli_name='ptr_rec', csv=True, multivalue=True, required=False)
option: RRSIGRecord('rrsigrecord', attribute=True, autofill=False, cli_name='rrsig_rec', csv=True, multivalue=True, required=False)
option: RPRecord('rprecord', attribute=True, autofill=False, cli_name='rp_rec', csv=True, multivalue=True, required=False)
option: SIGRecord('sigrecord', attribute=True, autofill=False, cli_name='sig_rec', csv=True, multivalue=True, required=False)
option: SPFRecord('spfrecord', attribute=True, autofill=False, cli_name='spf_rec', csv=True, multivalue=True, required=False)
option: SRVRecord('srvrecord', attribute=True, autofill=False, cli_name='srv_rec', csv=True, multivalue=True, required=False)
option: SSHFPRecord('sshfprecord', attribute=True, autofill=False, cli_name='sshfp_rec', csv=True, multivalue=True, required=False)
option: TARecord('tarecord', attribute=True, autofill=False, cli_name='ta_rec', csv=True, multivalue=True, required=False)
option: TKEYRecord('tkeyrecord', attribute=True, autofill=False, cli_name='tkey_rec', csv=True, multivalue=True, required=False)
option: TSIGRecord('tsigrecord', attribute=True, autofill=False, cli_name='tsig_rec', csv=True, multivalue=True, required=False)
option: TXTRecord('txtrecord', attribute=True, autofill=False, cli_name='txt_rec', csv=True, multivalue=True, required=False)
option: Flag('del_all', autofill=True, default=False)
option: Flag('all', autofill=True, cli_name='all', default=False, exclude='webui')
option: Flag('raw', autofill=True, cli_name='raw', default=False, exclude='webui')
option: Str('version?', exclude='webui')
option: Str('arecord*', attribute=True, cli_name='a_rec', csv=True)
option: Str('aaaarecord*', attribute=True, cli_name='aaaa_rec', csv=True)
option: Str('a6record*', attribute=True, cli_name='a6_rec', csv=True)
option: Str('afsdbrecord*', attribute=True, cli_name='afsdb_rec', csv=True)
option: Str('aplrecord*', attribute=True, cli_name='apl_rec', csv=True)
option: Str('certrecord*', attribute=True, cli_name='cert_rec', csv=True)
option: Str('cnamerecord*', attribute=True, cli_name='cname_rec', csv=True)
option: Str('dhcidrecord*', attribute=True, cli_name='dhcid_rec', csv=True)
option: Str('dlvrecord*', attribute=True, cli_name='dlv_rec', csv=True)
option: Str('dnamerecord*', attribute=True, cli_name='dname_rec', csv=True)
option: Str('dnskeyrecord*', attribute=True, cli_name='dnskey_rec', csv=True)
option: Str('dsrecord*', attribute=True, cli_name='ds_rec', csv=True)
option: Str('hiprecord*', attribute=True, cli_name='hip_rec', csv=True)
option: Str('ipseckeyrecord*', attribute=True, cli_name='ipseckey_rec', csv=True)
option: Str('keyrecord*', attribute=True, cli_name='key_rec', csv=True)
option: Str('kxrecord*', attribute=True, cli_name='kx_rec', csv=True)
option: Str('locrecord*', attribute=True, cli_name='loc_rec', csv=True)
option: Str('mxrecord*', attribute=True, cli_name='mx_rec', csv=True)
option: Str('naptrrecord*', attribute=True, cli_name='naptr_rec', csv=True)
option: Str('nsrecord*', attribute=True, cli_name='ns_rec', csv=True)
option: Str('nsecrecord*', attribute=True, cli_name='nsec_rec', csv=True)
option: Str('nsec3record*', attribute=True, cli_name='nsec3_rec', csv=True)
option: Str('nsec3paramrecord*', attribute=True, cli_name='nsec3param_rec', csv=True)
option: Str('ptrrecord*', attribute=True, cli_name='ptr_rec', csv=True)
option: Str('rrsigrecord*', attribute=True, cli_name='rrsig_rec', csv=True)
option: Str('rprecord*', attribute=True, cli_name='rp_rec', csv=True)
option: Str('sigrecord*', attribute=True, cli_name='sig_rec', csv=True)
option: Str('spfrecord*', attribute=True, cli_name='spf_rec', csv=True)
option: Str('srvrecord*', attribute=True, cli_name='srv_rec', csv=True)
option: Str('sshfprecord*', attribute=True, cli_name='sshfp_rec', csv=True)
option: Str('tarecord*', attribute=True, cli_name='ta_rec', csv=True)
option: Str('tkeyrecord*', attribute=True, cli_name='tkey_rec', csv=True)
option: Str('tsigrecord*', attribute=True, cli_name='tsig_rec', csv=True)
option: Str('txtrecord*', attribute=True, cli_name='txt_rec', csv=True)
output: Output('summary', (<type 'unicode'>, <type 'NoneType'>), None)
output: Entry('result', <type 'dict'>, Gettext('A dictionary representing an LDAP entry', domain='ipa', localedir=None))
output: Output('value', <type 'unicode'>, None)
@@ -760,91 +718,97 @@ arg: Str('criteria?', noextrawhitespace=False)
option: Str('idnsname', attribute=True, autofill=False, cli_name='name', multivalue=False, primary_key=True, query=True, required=False)
option: Int('dnsttl', attribute=True, autofill=False, cli_name='ttl', multivalue=False, query=True, required=False)
option: StrEnum('dnsclass', attribute=True, autofill=False, cli_name='class', multivalue=False, query=True, required=False, values=(u'IN', u'CS', u'CH', u'HS'))
option: ARecord('arecord', attribute=True, autofill=False, cli_name='a_rec', csv=True, multivalue=True, query=True, required=False)
option: AAAARecord('aaaarecord', attribute=True, autofill=False, cli_name='aaaa_rec', csv=True, multivalue=True, query=True, required=False)
option: A6Record('a6record', attribute=True, autofill=False, cli_name='a6_rec', csv=True, multivalue=True, query=True, required=False)
option: AFSDBRecord('afsdbrecord', attribute=True, autofill=False, cli_name='afsdb_rec', csv=True, multivalue=True, query=True, required=False)
option: APLRecord('aplrecord', attribute=True, autofill=False, cli_name='apl_rec', csv=True, multivalue=True, query=True, required=False)
option: CERTRecord('certrecord', attribute=True, autofill=False, cli_name='cert_rec', csv=True, multivalue=True, query=True, required=False)
option: CNAMERecord('cnamerecord', attribute=True, autofill=False, cli_name='cname_rec', csv=True, multivalue=True, query=True, required=False)
option: DHCIDRecord('dhcidrecord', attribute=True, autofill=False, cli_name='dhcid_rec', csv=True, multivalue=True, query=True, required=False)
option: DLVRecord('dlvrecord', attribute=True, autofill=False, cli_name='dlv_rec', csv=True, multivalue=True, query=True, required=False)
option: DNAMERecord('dnamerecord', attribute=True, autofill=False, cli_name='dname_rec', csv=True, multivalue=True, query=True, required=False)
option: DNSKEYRecord('dnskeyrecord', attribute=True, autofill=False, cli_name='dnskey_rec', csv=True, multivalue=True, query=True, required=False)
option: DSRecord('dsrecord', attribute=True, autofill=False, cli_name='ds_rec', csv=True, multivalue=True, query=True, required=False)
option: HIPRecord('hiprecord', attribute=True, autofill=False, cli_name='hip_rec', csv=True, multivalue=True, query=True, required=False)
option: IPSECKEYRecord('ipseckeyrecord', attribute=True, autofill=False, cli_name='ipseckey_rec', csv=True, multivalue=True, query=True, required=False)
option: KEYRecord('keyrecord', attribute=True, autofill=False, cli_name='key_rec', csv=True, multivalue=True, query=True, required=False)
option: KXRecord('kxrecord', attribute=True, autofill=False, cli_name='kx_rec', csv=True, multivalue=True, query=True, required=False)
option: LOCRecord('locrecord', attribute=True, autofill=False, cli_name='loc_rec', csv=True, multivalue=True, query=True, required=False)
option: MXRecord('mxrecord', attribute=True, autofill=False, cli_name='mx_rec', csv=True, multivalue=True, query=True, required=False)
option: NAPTRRecord('naptrrecord', attribute=True, autofill=False, cli_name='naptr_rec', csv=True, multivalue=True, query=True, required=False)
option: NSRecord('nsrecord', attribute=True, autofill=False, cli_name='ns_rec', csv=True, multivalue=True, query=True, required=False)
option: NSECRecord('nsecrecord', attribute=True, autofill=False, cli_name='nsec_rec', csv=True, multivalue=True, query=True, required=False)
option: NSEC3Record('nsec3record', attribute=True, autofill=False, cli_name='nsec3_rec', csv=True, multivalue=True, query=True, required=False)
option: NSEC3PARAMRecord('nsec3paramrecord', attribute=True, autofill=False, cli_name='nsec3param_rec', csv=True, multivalue=True, query=True, required=False)
option: PTRRecord('ptrrecord', attribute=True, autofill=False, cli_name='ptr_rec', csv=True, multivalue=True, query=True, required=False)
option: RRSIGRecord('rrsigrecord', attribute=True, autofill=False, cli_name='rrsig_rec', csv=True, multivalue=True, query=True, required=False)
option: RPRecord('rprecord', attribute=True, autofill=False, cli_name='rp_rec', csv=True, multivalue=True, query=True, required=False)
option: SIGRecord('sigrecord', attribute=True, autofill=False, cli_name='sig_rec', csv=True, multivalue=True, query=True, required=False)
option: SPFRecord('spfrecord', attribute=True, autofill=False, cli_name='spf_rec', csv=True, multivalue=True, query=True, required=False)
option: SRVRecord('srvrecord', attribute=True, autofill=False, cli_name='srv_rec', csv=True, multivalue=True, query=True, required=False)
option: SSHFPRecord('sshfprecord', attribute=True, autofill=False, cli_name='sshfp_rec', csv=True, multivalue=True, query=True, required=False)
option: TARecord('tarecord', attribute=True, autofill=False, cli_name='ta_rec', csv=True, multivalue=True, query=True, required=False)
option: TKEYRecord('tkeyrecord', attribute=True, autofill=False, cli_name='tkey_rec', csv=True, multivalue=True, query=True, required=False)
option: TSIGRecord('tsigrecord', attribute=True, autofill=False, cli_name='tsig_rec', csv=True, multivalue=True, query=True, required=False)
option: TXTRecord('txtrecord', attribute=True, autofill=False, cli_name='txt_rec', csv=True, multivalue=True, query=True, required=False)
option: Int('timelimit?', autofill=False, minvalue=0)
option: Int('sizelimit?', autofill=False, minvalue=0)
option: Flag('all', autofill=True, cli_name='all', default=False, exclude='webui')
option: Flag('raw', autofill=True, cli_name='raw', default=False, exclude='webui')
option: Str('version?', exclude='webui')
option: Flag('pkey_only?', autofill=True, default=False)
option: Str('arecord', attribute=True, cli_name='a_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('aaaarecord', attribute=True, cli_name='aaaa_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('a6record', attribute=True, cli_name='a6_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('afsdbrecord', attribute=True, cli_name='afsdb_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('aplrecord', attribute=True, cli_name='apl_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('certrecord', attribute=True, cli_name='cert_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('cnamerecord', attribute=True, cli_name='cname_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('dhcidrecord', attribute=True, cli_name='dhcid_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('dlvrecord', attribute=True, cli_name='dlv_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('dnamerecord', attribute=True, cli_name='dname_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('dnskeyrecord', attribute=True, cli_name='dnskey_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('dsrecord', attribute=True, cli_name='ds_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('hiprecord', attribute=True, cli_name='hip_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('ipseckeyrecord', attribute=True, cli_name='ipseckey_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('keyrecord', attribute=True, cli_name='key_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('kxrecord', attribute=True, cli_name='kx_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('locrecord', attribute=True, cli_name='loc_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('mxrecord', attribute=True, cli_name='mx_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('naptrrecord', attribute=True, cli_name='naptr_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('nsrecord', attribute=True, cli_name='ns_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('nsecrecord', attribute=True, cli_name='nsec_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('nsec3record', attribute=True, cli_name='nsec3_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('nsec3paramrecord', attribute=True, cli_name='nsec3param_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('ptrrecord', attribute=True, cli_name='ptr_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('rrsigrecord', attribute=True, cli_name='rrsig_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('rprecord', attribute=True, cli_name='rp_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('sigrecord', attribute=True, cli_name='sig_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('spfrecord', attribute=True, cli_name='spf_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('srvrecord', attribute=True, cli_name='srv_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('sshfprecord', attribute=True, cli_name='sshfp_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('tarecord', attribute=True, cli_name='ta_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('tkeyrecord', attribute=True, cli_name='tkey_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('tsigrecord', attribute=True, cli_name='tsig_rec', csv=True, multivalue=True, query=True, required=False)
option: Str('txtrecord', attribute=True, cli_name='txt_rec', csv=True, multivalue=True, query=True, required=False)
output: Output('summary', (<type 'unicode'>, <type 'NoneType'>), None)
output: ListOfEntries('result', (<type 'list'>, <type 'tuple'>), Gettext('A list of LDAP entries', domain='ipa', localedir=None))
output: Output('count', <type 'int'>, None)
output: Output('truncated', <type 'bool'>, None)
command: dnsrecord_mod
args: 2,37,3
args: 2,43,3
arg: Str('dnszoneidnsname', cli_name='dnszone', query=True, required=True)
arg: Str('idnsname', attribute=True, cli_name='name', multivalue=False, primary_key=True, query=True, required=True)
option: Int('dnsttl', attribute=True, autofill=False, cli_name='ttl', multivalue=False, required=False)
option: StrEnum('dnsclass', attribute=True, autofill=False, cli_name='class', multivalue=False, required=False, values=(u'IN', u'CS', u'CH', u'HS'))
option: ARecord('arecord', attribute=True, autofill=False, cli_name='a_rec', csv=True, multivalue=True, required=False)
option: AAAARecord('aaaarecord', attribute=True, autofill=False, cli_name='aaaa_rec', csv=True, multivalue=True, required=False)
option: A6Record('a6record', attribute=True, autofill=False, cli_name='a6_rec', csv=True, multivalue=True, required=False)
option: AFSDBRecord('afsdbrecord', attribute=True, autofill=False, cli_name='afsdb_rec', csv=True, multivalue=True, required=False)
option: APLRecord('aplrecord', attribute=True, autofill=False, cli_name='apl_rec', csv=True, multivalue=True, required=False)
option: CERTRecord('certrecord', attribute=True, autofill=False, cli_name='cert_rec', csv=True, multivalue=True, required=False)
option: CNAMERecord('cnamerecord', attribute=True, autofill=False, cli_name='cname_rec', csv=True, multivalue=True, required=False)
option: DHCIDRecord('dhcidrecord', attribute=True, autofill=False, cli_name='dhcid_rec', csv=True, multivalue=True, required=False)
option: DLVRecord('dlvrecord', attribute=True, autofill=False, cli_name='dlv_rec', csv=True, multivalue=True, required=False)
option: DNAMERecord('dnamerecord', attribute=True, autofill=False, cli_name='dname_rec', csv=True, multivalue=True, required=False)
option: DNSKEYRecord('dnskeyrecord', attribute=True, autofill=False, cli_name='dnskey_rec', csv=True, multivalue=True, required=False)
option: DSRecord('dsrecord', attribute=True, autofill=False, cli_name='ds_rec', csv=True, multivalue=True, required=False)
option: HIPRecord('hiprecord', attribute=True, autofill=False, cli_name='hip_rec', csv=True, multivalue=True, required=False)
option: IPSECKEYRecord('ipseckeyrecord', attribute=True, autofill=False, cli_name='ipseckey_rec', csv=True, multivalue=True, required=False)
option: KEYRecord('keyrecord', attribute=True, autofill=False, cli_name='key_rec', csv=True, multivalue=True, required=False)
option: KXRecord('kxrecord', attribute=True, autofill=False, cli_name='kx_rec', csv=True, multivalue=True, required=False)
option: LOCRecord('locrecord', attribute=True, autofill=False, cli_name='loc_rec', csv=True, multivalue=True, required=False)
option: MXRecord('mxrecord', attribute=True, autofill=False, cli_name='mx_rec', csv=True, multivalue=True, required=False)
option: NAPTRRecord('naptrrecord', attribute=True, autofill=False, cli_name='naptr_rec', csv=True, multivalue=True, required=False)
option: NSRecord('nsrecord', attribute=True, autofill=False, cli_name='ns_rec', csv=True, multivalue=True, required=False)
option: NSECRecord('nsecrecord', attribute=True, autofill=False, cli_name='nsec_rec', csv=True, multivalue=True, required=False)
option: NSEC3Record('nsec3record', attribute=True, autofill=False, cli_name='nsec3_rec', csv=True, multivalue=True, required=False)
option: NSEC3PARAMRecord('nsec3paramrecord', attribute=True, autofill=False, cli_name='nsec3param_rec', csv=True, multivalue=True, required=False)
option: PTRRecord('ptrrecord', attribute=True, autofill=False, cli_name='ptr_rec', csv=True, multivalue=True, required=False)
option: RRSIGRecord('rrsigrecord', attribute=True, autofill=False, cli_name='rrsig_rec', csv=True, multivalue=True, required=False)
option: RPRecord('rprecord', attribute=True, autofill=False, cli_name='rp_rec', csv=True, multivalue=True, required=False)
option: SIGRecord('sigrecord', attribute=True, autofill=False, cli_name='sig_rec', csv=True, multivalue=True, required=False)
option: SPFRecord('spfrecord', attribute=True, autofill=False, cli_name='spf_rec', csv=True, multivalue=True, required=False)
option: SRVRecord('srvrecord', attribute=True, autofill=False, cli_name='srv_rec', csv=True, multivalue=True, required=False)
option: SSHFPRecord('sshfprecord', attribute=True, autofill=False, cli_name='sshfp_rec', csv=True, multivalue=True, required=False)
option: TARecord('tarecord', attribute=True, autofill=False, cli_name='ta_rec', csv=True, multivalue=True, required=False)
option: TKEYRecord('tkeyrecord', attribute=True, autofill=False, cli_name='tkey_rec', csv=True, multivalue=True, required=False)
option: TSIGRecord('tsigrecord', attribute=True, autofill=False, cli_name='tsig_rec', csv=True, multivalue=True, required=False)
option: TXTRecord('txtrecord', attribute=True, autofill=False, cli_name='txt_rec', csv=True, multivalue=True, required=False)
option: Str('setattr*', cli_name='setattr', exclude='webui')
option: Str('addattr*', cli_name='addattr', exclude='webui')
option: Str('delattr*', cli_name='delattr', exclude='webui')
option: Flag('rights', autofill=True, default=False)
option: Flag('all', autofill=True, cli_name='all', default=False, exclude='webui')
option: Flag('raw', autofill=True, cli_name='raw', default=False, exclude='webui')
option: Str('version?', exclude='webui')
option: Str('arecord*', attribute=True, cli_name='a_rec', csv=True)
option: Str('aaaarecord*', attribute=True, cli_name='aaaa_rec', csv=True)
option: Str('a6record*', attribute=True, cli_name='a6_rec', csv=True)
option: Str('afsdbrecord*', attribute=True, cli_name='afsdb_rec', csv=True)
option: Str('aplrecord*', attribute=True, cli_name='apl_rec', csv=True)
option: Str('certrecord*', attribute=True, cli_name='cert_rec', csv=True)
option: Str('cnamerecord*', attribute=True, cli_name='cname_rec', csv=True)
option: Str('dhcidrecord*', attribute=True, cli_name='dhcid_rec', csv=True)
option: Str('dlvrecord*', attribute=True, cli_name='dlv_rec', csv=True)
option: Str('dnamerecord*', attribute=True, cli_name='dname_rec', csv=True)
option: Str('dnskeyrecord*', attribute=True, cli_name='dnskey_rec', csv=True)
option: Str('dsrecord*', attribute=True, cli_name='ds_rec', csv=True)
option: Str('hiprecord*', attribute=True, cli_name='hip_rec', csv=True)
option: Str('ipseckeyrecord*', attribute=True, cli_name='ipseckey_rec', csv=True)
option: Str('keyrecord*', attribute=True, cli_name='key_rec', csv=True)
option: Str('kxrecord*', attribute=True, cli_name='kx_rec', csv=True)
option: Str('locrecord*', attribute=True, cli_name='loc_rec', csv=True)
option: Str('mxrecord*', attribute=True, cli_name='mx_rec', csv=True)
option: Str('naptrrecord*', attribute=True, cli_name='naptr_rec', csv=True)
option: Str('nsrecord*', attribute=True, cli_name='ns_rec', csv=True)
option: Str('nsecrecord*', attribute=True, cli_name='nsec_rec', csv=True)
option: Str('nsec3record*', attribute=True, cli_name='nsec3_rec', csv=True)
option: Str('nsec3paramrecord*', attribute=True, cli_name='nsec3param_rec', csv=True)
option: Str('ptrrecord*', attribute=True, cli_name='ptr_rec', csv=True)
option: Str('rrsigrecord*', attribute=True, cli_name='rrsig_rec', csv=True)
option: Str('rprecord*', attribute=True, cli_name='rp_rec', csv=True)
option: Str('sigrecord*', attribute=True, cli_name='sig_rec', csv=True)
option: Str('spfrecord*', attribute=True, cli_name='spf_rec', csv=True)
option: Str('srvrecord*', attribute=True, cli_name='srv_rec', csv=True)
option: Str('sshfprecord*', attribute=True, cli_name='sshfp_rec', csv=True)
option: Str('tarecord*', attribute=True, cli_name='ta_rec', csv=True)
option: Str('tkeyrecord*', attribute=True, cli_name='tkey_rec', csv=True)
option: Str('tsigrecord*', attribute=True, cli_name='tsig_rec', csv=True)
option: Str('txtrecord*', attribute=True, cli_name='txt_rec', csv=True)
output: Output('summary', (<type 'unicode'>, <type 'NoneType'>), None)
output: Entry('result', <type 'dict'>, Gettext('A dictionary representing an LDAP entry', domain='ipa', localedir=None))
output: Output('value', <type 'unicode'>, None)

File diff suppressed because it is too large Load Diff

View File

@@ -257,8 +257,12 @@ def validate_zonemgr(zonemgr):
if not all(regex_domain.match(part) for part in domain.split(".")):
raise ValueError(_('domain name may only include letters, numbers, and -'))
def validate_hostname(hostname):
""" See RFC 952, 1123"""
def validate_hostname(hostname, check_fqdn=True):
""" See RFC 952, 1123
:param hostname Checked value
:param check_fqdn Check if hostname is fully qualified
"""
regex_name = re.compile(r'^[a-z0-9]([a-z0-9-]?[a-z0-9])*$', re.IGNORECASE)
if len(hostname) > 255:
@@ -267,12 +271,12 @@ def validate_hostname(hostname):
if hostname.endswith('.'):
hostname = hostname[:-1]
if '.' not in hostname:
raise ValueError(_('hostname is not fully qualified'))
if check_fqdn and '.' not in hostname:
raise ValueError(_('not fully qualified'))
if not all(regex_name.match(part) for part in hostname.split(".")):
raise ValueError(_('hostname parts may only include letters, numbers, and - ' \
'(which is not allowed as the last character)'))
raise ValueError(_('only letters, numbers, and - are allowed. ' \
'- must not be the last name character'))
class cachedproperty(object):
"""

View File

@@ -413,6 +413,13 @@ class test_dns(Declarative):
),
dict(
desc='Try to delete root zone record \'@\' in %r' % (dnszone1),
command=('dnsrecord_del', [dnszone1, u'@'], {'del_all' : True}),
expected=errors.ValidationError(name='del_all', error=''),
),
dict(
desc='Create record %r in zone %r' % (dnszone1, dnsres1),
command=('dnsrecord_add', [dnszone1, dnsres1], {'arecord': u'127.0.0.1'}),
@@ -575,13 +582,13 @@ class test_dns(Declarative):
dict(
desc='Try to add invalid LOC record to zone %r using dnsrecord_add' % (dnszone1),
command=('dnsrecord_add', [dnszone1, u'@'], {'locrecord': u"91 11 42.4 N 16 36 29.6 E 227.64m" }),
command=('dnsrecord_add', [dnszone1, u'@'], {'locrecord': u"91 11 42.4 N 16 36 29.6 E 227.64" }),
expected=errors.ValidationError(name='locrecord', error=''),
),
dict(
desc='Add LOC record to zone %r using dnsrecord_add' % (dnszone1),
command=('dnsrecord_add', [dnszone1, u'@'], {'locrecord': u"49 11 42.4 N 16 36 29.6 E 227.64m" }),
command=('dnsrecord_add', [dnszone1, u'@'], {'locrecord': u"49 11 42.4 N 16 36 29.6 E 227.64" }),
expected={
'value': u'@',
'summary': None,
@@ -591,7 +598,7 @@ class test_dns(Declarative):
'idnsname': [dnszone1],
'mxrecord': [u"0 %s" % dnszone1_mname],
'nsrecord': [dnszone1_mname],
'locrecord': [u"49 11 42.4 N 16 36 29.6 E 227.64m"],
'locrecord': [u"49 11 42.4 N 16 36 29.6 E 227.64"],
},
},
),
@@ -604,7 +611,7 @@ class test_dns(Declarative):
dict(
desc='Add CNAME record to %r using dnsrecord_add' % (dnsres1),
command=('dnsrecord_add', [dnszone1, dnsres1], {'cnamerecord': u'foo-1.example.com' }),
command=('dnsrecord_add', [dnszone1, dnsres1], {'cnamerecord': u'foo-1.example.com.' }),
expected={
'value': dnsres1,
'summary': None,
@@ -626,7 +633,7 @@ class test_dns(Declarative):
dict(
desc='Add KX record to %r using dnsrecord_add' % (dnsres1),
command=('dnsrecord_add', [dnszone1, dnsres1], {'kxrecord': u'1 foo-1.example.com' }),
command=('dnsrecord_add', [dnszone1, dnsres1], {'kxrecord': u'1 foo-1' }),
expected={
'value': dnsres1,
'summary': None,
@@ -636,7 +643,7 @@ class test_dns(Declarative):
'idnsname': [dnsres1],
'arecord': [u'10.10.0.1'],
'cnamerecord': [u'foo-1.example.com.'],
'kxrecord': [u'1 foo-1.example.com'],
'kxrecord': [u'1 foo-1'],
},
},
),