PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB`  $^cc@sddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl Z ddl m Z e j reZnejeZe jdejjfdYZeejje_eejje_edve_edwe_gd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjgbD]Zeej^qCZdkZdlZdmZ dnZ!doZ"dpZ#dqZ$e%drZ&dsZ'dtZ(dduZ*dS(xiN(tUnsafeIPAddresstDNSNamecBseZdZeddZddZdZeZdZ dZ dZ e j ridZn dZdZd Zd Zd Zded Zd ZdZdZdZdZdZRS(cCs|tjj||S(N(tdnstnamet from_text(tclstlabelstorigin((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyR.scCsynt|tjr6tjjt||j}n!t|tjjrW|j}nt t |j |Wn%t k r}tj j|nXdS(N(t isinstancetsixt string_typesRRRtunicodeRtNametsuperRt__init__t UnicodeErrort exceptiont SyntaxError(tselfRRte((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyR2s! cCstS(N(tTrue(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyt__bool__@scCs t|jS(N(RR(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyt__copy__GscCsttj|j|S(N(RtcopytdeepcopyR(Rtmemo((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyt __deepcopy__JscCs |jS(N(t to_unicode(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyt__str__MscCs|jjdS(Ntascii(tto_texttdecode(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pytToASCIIRscCs |jS(N(R(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyR VscCsttt|jS(N(RR t canonicalize(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyR!YscCsttt|j|S(N(RR t concatenate(Rtother((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyR"\scCsttt|j|S(N(RR t relativize(RR((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyR$_scCsttt|j|S(N(RR t derelativize(RR((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyR%bscCs%ttt|jd|d|S(NRR$(RR tchoose_relativity(RRR$((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyR&escCs|j|jS(N(R%troot(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyt make_absoluteiscCstd|jDS(Ncss|]}|jdVqdS(sxn--N(t startswith(t.0tlabel((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pys ms(tanyR(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pytis_idnlscCs|j|jS(N(t is_subdomaint ip4_rev_zone(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pytis_ip4_reverseoscCs|j|jS(N(R.t ip6_rev_zone(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pytis_ip6_reverserscCs|jp|jS(N(R0R2(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyt is_reverseuscCst|jdkS(Ni(tlenR(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pytis_emptyxsN(t__name__t __module__tNoneRt classmethodRRRt __nonzero__RRRR tPY2R R!R"R$R%RR&R(R-R0R2R3R5(((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyR*s.                 sin-addrtarpattip6s10.IN-ADDR.ARPAs16.172.IN-ADDR.ARPAs17.172.IN-ADDR.ARPAs18.172.IN-ADDR.ARPAs19.172.IN-ADDR.ARPAs20.172.IN-ADDR.ARPAs21.172.IN-ADDR.ARPAs22.172.IN-ADDR.ARPAs23.172.IN-ADDR.ARPAs24.172.IN-ADDR.ARPAs25.172.IN-ADDR.ARPAs26.172.IN-ADDR.ARPAs27.172.IN-ADDR.ARPAs28.172.IN-ADDR.ARPAs29.172.IN-ADDR.ARPAs30.172.IN-ADDR.ARPAs31.172.IN-ADDR.ARPAs168.192.IN-ADDR.ARPAs64.100.IN-ADDR.ARPAs65.100.IN-ADDR.ARPAs66.100.IN-ADDR.ARPAs67.100.IN-ADDR.ARPAs68.100.IN-ADDR.ARPAs69.100.IN-ADDR.ARPAs70.100.IN-ADDR.ARPAs71.100.IN-ADDR.ARPAs72.100.IN-ADDR.ARPAs73.100.IN-ADDR.ARPAs74.100.IN-ADDR.ARPAs75.100.IN-ADDR.ARPAs76.100.IN-ADDR.ARPAs77.100.IN-ADDR.ARPAs78.100.IN-ADDR.ARPAs79.100.IN-ADDR.ARPAs80.100.IN-ADDR.ARPAs81.100.IN-ADDR.ARPAs82.100.IN-ADDR.ARPAs83.100.IN-ADDR.ARPAs84.100.IN-ADDR.ARPAs85.100.IN-ADDR.ARPAs86.100.IN-ADDR.ARPAs87.100.IN-ADDR.ARPAs88.100.IN-ADDR.ARPAs89.100.IN-ADDR.ARPAs90.100.IN-ADDR.ARPAs91.100.IN-ADDR.ARPAs92.100.IN-ADDR.ARPAs93.100.IN-ADDR.ARPAs94.100.IN-ADDR.ARPAs95.100.IN-ADDR.ARPAs96.100.IN-ADDR.ARPAs97.100.IN-ADDR.ARPAs98.100.IN-ADDR.ARPAs99.100.IN-ADDR.ARPAs100.100.IN-ADDR.ARPAs101.100.IN-ADDR.ARPAs102.100.IN-ADDR.ARPAs103.100.IN-ADDR.ARPAs104.100.IN-ADDR.ARPAs105.100.IN-ADDR.ARPAs106.100.IN-ADDR.ARPAs107.100.IN-ADDR.ARPAs108.100.IN-ADDR.ARPAs109.100.IN-ADDR.ARPAs110.100.IN-ADDR.ARPAs111.100.IN-ADDR.ARPAs112.100.IN-ADDR.ARPAs113.100.IN-ADDR.ARPAs114.100.IN-ADDR.ARPAs115.100.IN-ADDR.ARPAs116.100.IN-ADDR.ARPAs117.100.IN-ADDR.ARPAs118.100.IN-ADDR.ARPAs119.100.IN-ADDR.ARPAs120.100.IN-ADDR.ARPAs121.100.IN-ADDR.ARPAs122.100.IN-ADDR.ARPAs123.100.IN-ADDR.ARPAs124.100.IN-ADDR.ARPAs125.100.IN-ADDR.ARPAs126.100.IN-ADDR.ARPAs127.100.IN-ADDR.ARPAs0.IN-ADDR.ARPAs127.IN-ADDR.ARPAs254.169.IN-ADDR.ARPAs2.0.192.IN-ADDR.ARPAs100.51.198.IN-ADDR.ARPAs113.0.203.IN-ADDR.ARPAs255.255.255.255.IN-ADDR.ARPAsH0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPAsH1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPAs D.F.IP6.ARPAs8.E.F.IP6.ARPAs9.E.F.IP6.ARPAsA.E.F.IP6.ARPAsB.E.F.IP6.ARPAs8.B.D.0.1.0.0.2.IP6.ARPAsEMPTY.AS112.ARPAcCsEt|ts%tdt||jsAtd|dS(sRaise AssertionError if name is not DNSName or is not absolute. >>> assert_absolute_dnsname(DNSName('absolute.name.example.')) >>> assert_absolute_dnsname(DNSName('relative.name.example')) Traceback (most recent call last): ... AssertionError: name must be absolute, ... >>> assert_absolute_dnsname('absolute.string.example.') Traceback (most recent call last): ... AssertionError: name must be DNSName instance, ... s'name must be DNSName instance, got '%s'sname must be absolute, got '%s'N(RRtAssertionErrorttypet is_absolute(R((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pytassert_absolute_dnsnamescCst||tkS(sTrue if specified zone name exactly matches an automatic empty zone. >>> is_auto_empty_zone(DNSName('in-addr.arpa.')) False >>> is_auto_empty_zone(DNSName('10.in-addr.arpa.')) True >>> is_auto_empty_zone(DNSName('1.10.in-addr.arpa.')) False >>> is_auto_empty_zone(DNSName('10.in-addr.arpa')) Traceback (most recent call last): ... AssertionError: ... (RBt EMPTY_ZONES(tzone((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pytis_auto_empty_zones cCs2t|x!tD]}|j|rtSqWtS(s True if specified absolute name is a subdomain of an automatic empty zone. DNS domain is a subdomain of itself so this function returns True for zone apexes, too. >>> inside_auto_empty_zone(DNSName('in-addr.arpa.')) False >>> inside_auto_empty_zone(DNSName('10.in-addr.arpa.')) True >>> inside_auto_empty_zone(DNSName('1.10.in-addr.arpa.')) True >>> inside_auto_empty_zone(DNSName('1.10.in-addr.arpa')) Traceback (most recent call last): ... AssertionError: ... (RBRCR.RtFalse(Rtaez((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pytinside_auto_empty_zones   csHttjjtjjtjjhtfdtDS(sTrue if specified absolute name is a sub/superdomain of an automatic empty zone. DNS domain is a subdomain of itself so this function returns True for zone apexes, too. >>> related_to_auto_empty_zone(DNSName('.')) True >>> related_to_auto_empty_zone(DNSName('in-addr.arpa.')) True >>> related_to_auto_empty_zone(DNSName('10.in-addr.arpa.')) True >>> related_to_auto_empty_zone(DNSName('1.10.in-addr.arpa.')) True >>> related_to_auto_empty_zone(DNSName('unrelated.example.')) False >>> related_to_auto_empty_zone(DNSName('1.10.in-addr.arpa')) Traceback (most recent call last): ... AssertionError: ... c3s(|]}j|dkVqdS(iN(t fullcompare(R*RG(Rt relations(s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pys s(RBRRtNAMERELN_SUBDOMAINtNAMERELN_EQUALtNAMERELN_SUPERDOMAINR,RC(R((RRJs5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pytrelated_to_auto_empty_zones    cCs t|}td|DS(s^Detect if given host is using IP address belonging to an automatic empty zone. Information from --ip-address option used in installed is lost by the time when upgrade is run. Use IP addresses from DNS as best approximation. This is brain-dead and duplicates logic from DNS installer but I did not find other way around. css$|]}tt|jVqdS(N(RHRt reverse_dns(R*tip((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pys %s(tresolve_ip_addressesR,(thostnamet ip_addresses((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pythas_empty_zone_addressess c Cs8|stdt|ts0t|}n|j}g}x|D]}y[tjj||}tjdt |||dj d|D|j |j WqItjj k r}tjd|PqItjjk r}tjd|qItjjk r/}tjd|||qIXqIW|S(s Get Resource Record sets for given FQDN. CNAME chain is followed during resolution but CNAMEs are not returned in the resulting rrset. :returns: set of dns.rrset.RRset objects, can be empty if the FQDN does not exist or if none of rrtypes exist srdtypes must not be emptysfound %d %s records for %s: %st css|]}t|VqdS(N(tstr(R*trr((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pys Css%ssDNS query for %s %s failed: %s(R?RRR(RtresolvertquerytloggertdebugR4tjointappendtrrsettNXDOMAINtNoAnswerRt DNSExceptionterror(tfqdntrdtypestrrsetstrdtypetanswertex((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pytresolve_rrsets*s.      cCsJt|ddg}t}x%|D]}|jd|Dq%W|S(sGet IP addresses from DNS A/AAAA records for given host (using DNS). :returns: list of IP addresses as UnsafeIPAddress objects tAtAAAAcSsh|]}t|qS((R(R*RP((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pys Ys (Ritsettupdate(RcReRSR^((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyRQQs   cCsitjd|t|ts4t|j}nt|rDdSytjj|}WnRtj j k r}d||f}|rt |qtj d|dSnX||krey2gtjj |dD]}|j^q}Wn2tj j k r!}tjd||g}nXdj|}|rV|djdj|7}nt |ndS( Ns'Checking DNS domain %s, please wait ...s#DNS check for domain %s failed: %s.s%stNSs1Failed to resolve nameserver(s) for domain %s: %su"DNS zone {0} already exists in DNSu! and is handled by server(s): {0}s, (RZtinfoRRR(RERRXt zone_for_nameRRat ValueErrortwarningRYRR[tformatR\(RDtraise_on_errortcontaining_zoneRtmsgtanstns((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pytcheck_zone_overlap]s0  2   cstdkrStfdDrCtjSdg}txtdkrtjdtfdD}d}xPjD]B}||jp7}||krj ||j |qqWq^Wr|j j n|S(s?Weighted population sorting for records with same priority ic3s%|]}|jdjkVqdS(iN(tweight(R*RW(trecords(s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pys sg{Gz?ic3s|]}|jpVqdS(N(Rz(R*RW(tnoweight(s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pys sg( R4talltrandomtshuffleRltuniformtsumRRztremoveR]tpop(R{tresultturntaccRW((R|R{s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyt _mix_weights&  (  cCst|dtjd}g}t}xR|D]J}|jt|ddf}||kr1|j||j|q1q1Wg}g}xW|D]O}| s|dj |j kr|j|q|j t ||g}qW|r|j t |n|S(s.RFC 2782 sorting algorithm for SRV and URI records RFC 2782 defines a sorting algorithms for SRV records, that is also used for sorting URI records. Records are sorted by priority and than randomly shuffled according to weight. This implementation also removes duplicate entries. tkeytprioritytportiN( tsortedtoperatort attrgetterRlttargettgetattrR8R]taddRtextendR(R{t uniquerecordstseenRWRRtsameprio((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pytsort_prio_weights$       cKs@|dkrtj}n|j|dtjj|}t|S(sQuery SRV records and sort reply according to RFC 2782 :param qname: query name, _service._proto.domain. :return: list of dns.rdtypes.IN.SRV.SRV instances RfN(R8RRXRYt rdatatypetSRVR(tqnameRXtkwargsRg((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyt query_srvs  (sin-addrR<R=(R>R<R=(+RtloggingRR~tdns.nameRt dns.exceptiont dns.resolvertdns.rdataclasst dns.rdatatypeR tipapython.ipautilRtPY3RVR t getLoggerR6RZtpython_2_unicode_compatibleRR RR'temptyR/R1RGR(RCRBRERHRNRTRiRQRRyRRR8R(((s5/usr/lib/python2.7/site-packages/ipapython/dnsutil.pyts             R                    %      ' " ! (