Xc@sdZddkZddkZddkZddkZddkZddkZddkZddkl Z ddk l Z ddk l Z ddklZddklZddklZdd klZlZd Zd Zd Zd ZdZdZdZdZdZdZ e!e!dZ"e!e!dZ#dZ$e%e!e!dZ&dZ'dZ(dZ)dZ*de+fdYZ,ei-dei.Z/hdJd"6dMd#6dPd$6dSd&6dVd'6dYd)6d\d*6d_d+6dad,6dcd-6ded.6dfd/6dgd06dhd16d!d26d!d36d!d46d5d66d5d76d5d86d5d96Z0d:Z1did>Z2djd@Z3hdAdB6dCdD6Z4dEZ5dFZ6dGZ7dS(ks Various utility functions. iN(tNoneType(tWeakKeyDictionary(terrors(t_(t SSHPublicKey(t dnsclient(tDNtRDNc Cst|ttfo&g}|D]}|t|q!~St|totd|iDSt|tttt t t fo|St|t o|i dSt|titfo t |Stt|ddpdSt|iS(Ncss+x$|]\}}|t|fVqWdS(N(tjson_serialize(t.0tktv((s//usr/lib/python2.6/site-packages/ipalib/util.pys -s sutf-8t__json__t(t isinstancetlistttupleRtdictt iteritemstbooltfloattinttlongtunicodeRtstrtdecodetdecimaltDecimalRtcallabletgetattrtNoneR (tobjt_[1]to((s//usr/lib/python2.6/site-packages/ipalib/util.pyR)s&" cCsvy/ddk}t|iiiiSWn@tj otdn#|ij ot i nXdS(Nispython-krbV is not available.( tkrbVRtdefault_contexttdefault_ccachet principaltnamet ImportErrort RuntimeErrort Krb5ErrorRt CCacheError(R"((s//usr/lib/python2.6/site-packages/ipalib/util.pytget_current_principal9s #ccstii||jotii|pdStii|odSd}xtti|D]}|i|pqentii||}tii|ptii | oqen|t | }|djoqen||fVqeWdS(s< Iterate through module names found in ``src_dir``. Ns.pyt__init__( tostpathtabspathtisdirtislinktsortedtlistdirtendswithtjointisfiletlen(tsrc_dirtsuffixR&tpyfiletmodule((s//usr/lib/python2.6/site-packages/ipalib/util.pytfind_modules_in_dirFs ,' cCs|idp|d7}nti|titi}t|djo!|id|tin|idt||fdS(s1 See if the hostname has a DNS A record. t.is&IPA: DNS A record lookup failed for %ssIPA: found %d records for %sN( R4RtquerytDNS_C_INtDNS_T_AR7tdebugRtDNSNotARecordError(tlogtfqdntrs((s//usr/lib/python2.6/site-packages/ipalib/util.pytvalidate_host_dns[s cCst}|id}t|djo8t|di|ds cssx|]}d|VqWdS(s'%s'N((R Rw((s//usr/lib/python2.6/site-packages/ipalib/util.pys s s\only letters, numbers, %(chars)s are allowed. DNS label may not start or end with %(chars2)stcharstchars2( RROtcompilet IGNORECASEt ValueErrorRR7RPR5( t dns_labeltallow_underscoret allow_slasht base_charst extra_charst middle_charst label_regextregexRxRy((s//usr/lib/python2.6/site-packages/ipalib/util.pytvalidate_dns_labels(  csJ|ido|d }n|id}tfd|dS(NR=icst|S((R(tlabel(R~R(s//usr/lib/python2.6/site-packages/ipalib/util.pyts(R4RJtmap(t domain_nameR~R((R~Rs//usr/lib/python2.6/site-packages/ipalib/util.pytvalidate_domain_namescstidtitd}d}d}d}t|djottdn|ido|d }n|iddjo|i d\}}}n|iddjottd n~|i d }|djoId }|i d|d }|djo|| }||d}qUn|i d\}}}|pttd nt ||pttd nt fd|i|Dpt|ndS(s See RFC 1033, 1035 s ^[a-z0-9]([a-z0-9-_]?[a-z0-9])*$smail account may only include letters, numbers, -, _ and a dot. There may not be consecutive -, _ and . characters. Its parts may not start or end with - or _R=is$cannot be longer that 255 charactersiRGistoo many '@' characterss\.ismissing address domainsmissing mail accountc3s"x|]}i|VqWdS(N(RP(R tpart(tregex_local_part(s//usr/lib/python2.6/site-packages/ipalib/util.pys s N(RORzR{RRR7R|R4tcountRktrfindtfindRtallRJ(Rmtlocal_part_errmsgtlocal_part_sept local_partRHtdott last_fake_septsep((Rs//usr/lib/python2.6/site-packages/ipalib/util.pytvalidate_zonemgrs<       cCst|djottdn|ido|d }nd|jottdnd|jo1|ottdnt|||nt|||dS( su See RFC 952, 1123 :param hostname Checked value :param check_fqdn Check if hostname is fully qualified is$cannot be longer that 255 charactersR=is..s0hostname contains empty label (consecutive dots)snot fully qualifiedN(R7R|RR4RR(thostnamet check_fqdnR~R((s//usr/lib/python2.6/site-packages/ipalib/util.pytvalidate_hostnames  cCst|iS(N(Rtopenssh(tvalue((s//usr/lib/python2.6/site-packages/ipalib/util.pytnormalize_sshpubkey-scCs1yt|Wntj o}tdSXdS(Nsinvalid SSH public key(RR|R(tugettextRtUnicodeDecodeError((s//usr/lib/python2.6/site-packages/ipalib/util.pytvalidate_sshpubkey0scCsKyt|}Wntj o}tdSX|io tdSdS(Nsinvalid SSH public keysoptions are not allowed(RR|Rt has_options(RRtpubkeyR((s//usr/lib/python2.6/site-packages/ipalib/util.pytvalidate_sshpubkey_no_options6s   c Cs;d|jo|d}n)|i|dg}|did}|pdSg}g}x|D]}yt|}Wntj o }qbnX|i} |i} | od| | f} nd| |if} |i|i|i| qbWd|jo|pd|ds (RqtanytREVERSE_DNS_ZONESRRRQ(R((Rs//usr/lib/python2.6/site-packages/ipalib/util.pytzone_is_reverses cCspti|}|iid}|idjo|d}n|idjo|d}ntdi|S(NR=iiii(tnetaddrt IPAddresst reverse_dnsRJtversionRqR5(t ip_addresstiptitems((s//usr/lib/python2.6/site-packages/ipalib/util.pytget_reverse_zone_defaultscCs3yt|}Wntj o}t|SXdS(N(Rt ExceptionRR(RRtrdnRi((s//usr/lib/python2.6/site-packages/ipalib/util.pytvalidate_rdn_param"s  i8"i i3i8"i i3i8"i i3iii'iii'ii`'i: ii`'i: ii`'i: iiQiiQiiQiii(RRR(R(8RR-timpttimeRURORRttypesRtweakrefRtipalibRt ipalib.textRt ipapython.sshRt ipapythonRt ipapython.dnRRRR+R<RFRNRTR[RjRoRqRQRRRRRRRRRRtobjectRRzR{RRRRRRRRR(((s//usr/lib/python2.6/site-packages/ipalib/util.pyts                 *   #  G