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`  $^c@sSddlmZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlmZddlZddlZddlmZddlmZmZddlmZddlZddl m!Z!ddl m"Z"dd l#m$Z$ej%e&Z'd Z(id e j)6d e j*6Z+ej,d ddgZ-dej.fdYZ/de/fdYZ0de0fdYZ1dZ2ddZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<ej=rd Z>ne?Z>d!ej,d!d"fd#YZ@deAdBdeBeBddgeBdeBdd$ ZCd%ZDd&ZEd'ZFd(eGfd)YZHd*ejIfd+YZJd,ZKd-d.d.d.d.d/d0ZLdeAd1ZMe j)deBejNd2ZOd3ZPeGeGd4ZQeGeGd5ZReGeGd6ZSd/d7ZTd/d8ZUd9ZVd:ZWedd;ZXejYrd<ZZn e jZZZd=Z[d>Z\d?Z]d@e^fdAYZ_dS(Ci(tprint_functionN(tcontextmanager(tCalledProcessError(tresolvert reversename(t DNSException(tinput(turllib(tDNittcptudptInterfaceDetailstnametifnettUnsafeIPAddresscBs2eZdZejZdZdZdZRS(s-Any valid IP address with or without netmask.cCst|tr>|j|_tt|j|d|jdSt|tjr|d|_tt|j|d|jdSt|tj r||_tt|j|jj d|jdSd|_t |}yytj|d|j}Wnktj k ra|j d\}}}|dkr1ntj|d|j}|jdkrbqbnXWn8tk rtj |d|j|_|jj }nXtt|j|d|jdS(Ntflagst%i(t isinstanceRt_nettsupert__init__tnetaddr_ip_flagstnetaddrt IPAddresstNonet IPNetworktiptstrtAddrFormatErrort partitiontversiont ValueError(tselftaddrtsept_foo((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRQs@          cCs*i|jd6tt|jd6}|S(NRt super_state(RRRt __getstate__(R tstate((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyR%zs cCs+tt|j|d|d|_dS(NR$R(RRt __setstate__R(R R&((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyR's( t__name__t __module__t__doc__Rt INET_PTONRRR%R'(((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRIs   ) tCheckedIPAddresscBsVeZdZeeedZdZdZdZdZ dZ dZ RS(spIPv4 or IPv6 address with additional constraints. Reserved or link-local addresses are never accepted. c Csytt|j|Wn%tjjk rA}t|nXt|tra|j|_dS| r|j rtdj |n|j d krtdj |j n| r|j rtdj |n|j r|j s |tjjkr!tdj |n|jrEtdj |n| rp|jrptdj |n|j dkr|j dkrtjtjt||_ q|j dkrtjt|d |_ qn|j j|_dS( Ns.netmask and prefix length not allowed here: {}iisunsupported IP version {}s!cannot use loopback IP address {}s&cannot use IANA reserved IP address {}s#cannot use link-local IP address {}s"cannot use multicast IP address {}s/64(ii(RR,RRtcoreRRRt prefixlenRtformatRt is_loopbackt is_reservedRt IPV4_6TO4t is_link_localt is_multicastRRtcidr_abbrev_to_verboseR(R R!t parse_netmasktallow_loopbacktallow_multicastte((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRs<  "cCs*i|jd6tt|jd6}|S(NR.R$(R.RR,R%(R R&((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyR%s cCs+tt|j|d|d|_dS(NR$R.(RR,R'R.(R R&((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyR'scCs||jjkS(N(Rtnetwork(R ((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytis_network_addrscCs|jdko||jjkS(Ni(RRt broadcast(R ((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytis_broadcast_addrscCs&tjd||jdkr+tj}n3|jdkrFtj}ntdj|jxtjD]}xtj |j |gD]}|dj ddd}|d j d d }d jd|d |}tjd ||t j |}|j|krt||SqWqkWdS(sFind matching local interface for address :return: InterfaceDetails named tuple or None if no interface has this address s,Searching for an interface of IP address: %siisUnsupported address family ({})R!u%iitnetmasku/is{addr}/{netmask}s,Testing local IP address: %s (interface: %s)N(tloggertdebugRt netifacestAF_INETtAF_INET6RR/t interfacest ifaddressestgettsplitRRRR R(R tfamilyt interfacetifdatatifaddrtifmaskt ifaddrmaskR ((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytget_matching_interfaces*  "   cCs ||_dS(sSet IP Network details for this address. IPNetwork is valid only locally, so this should be set only for local IP addresses :param ifnet: netaddr.IPNetwork object with information about IP network where particula address belongs locally N(R(R R ((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt set_ip_nets( R(R)R*tTruetFalseRR%R'R;R=RNRO(((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyR,s'     )tCheckedIPAddressLoopbackcBseZdZeedZRS(sIPv4 or IPv6 address with additional constraints with possibility to use a loopback IP. Reserved or link-local addresses are never accepted. cCsWtt|j|d|d|dt|jrStdj|dtjndS(NR6R8R7s(WARNING: You are using a loopback IP: {}tfile( RRRRRPR0tprintR/tsyststderr(R R!R6R8((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRs  (R(R)R*RPRQR(((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRRscCstj|ptj|S(N(Rt valid_ipv4t valid_ipv6(R!((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytvalid_ip scCslt|}y!tjtj|d|}Wntjk rCnX|dkrT|Sd|t|fSdS(s Format network location (host:port). If the host part is a literal IPv6 address, it must be enclosed in square brackets (RFC 2732). s[%s]s%s:%sN(Rtsockett inet_ptonRCterrorR(thosttport((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt format_netlocs  cCs>|jd}tg|D]}d|jf^q}|S(s)Convert a kerberos realm to a IPA suffix.t.tdc(RGRtlower(t realm_nametstxt suffix_dn((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytrealm_to_suffix s+cCs)djg|D]}|j^q }|S(s)Convert a IPA suffix to a kerberos realm.R`(tjointvalue(RfRetrealm((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytsuffix_to_realm&s%cCs@tj|j|}tjd}|jd|}|S(Ns(eval\s*\(([^()]*)\))cSstt|jdS(Ni(Rtevaltgroup(Re((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt3s(tstringtTemplatet substitutetretcompiletsub(ttxttvarstvaltpattern((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt template_str,scCs,t|}t|j|SWdQXdS(s.Read a file and perform template substitutionsN(topenRytread(t infilenameRvtf((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt template_file7scCs8t||}t|d}|j|WdQXdS(s.Copy a file, performing template substitutionstwN(R~Rztwrite(R|t outfilenameRvRuRS((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytcopy_template_file<scCs*tjd}|j||j|S(Nsw+(ttempfiletNamedTemporaryFileRtflush(Rutfd((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytwrite_tmp_fileCs  cCs|jtj|jtjjtjj|j}tj|tj tj B}ztj|Wdtj |XdS(sSFlush and fsync file to disk :param f: a file object with fileno and name N( RtostfsynctfilenotpathtdirnametabspathR RztO_RDONLYt O_DIRECTORYtclose(R}Rtdirfd((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt flush_syncKs !cCsCt|tr'd|jdddSd|jdddSdS(Nt's'\''(RRtreplace(Ro((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt shell_quote]scCs0t|tr(|jtjddS|SdS(s8Convert string or bytes to a string suitable for loggingterrorsRN(Rtbytestdecodetlocaletgetpreferredencoding(Rd((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt_log_argest _RunResultsoutput error_output returncodecBseZdZRS(sResult of ipautil.run(R(R)R*(((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRpscsd}d}d}t|tjr3tdn|rT|sE| rTtdn| ru|sf| rutdn|r| rtdn|dkrtjtj}d|dssStarting external processsargs=%ssrunas=%s (UID %d, GID %s)ssuplementary_group=%s (GID %d)csbdk rHtjtjjjtjjjnr^tjndS(N(RRt setgroupstsetregidtpw_gidtsetreuidtpw_uidtumask((tpenttrunastsuplementary_gidsR(s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt preexec_fns   tstdintstdoutRVt close_fdstenvtcwdRsProcess interruptedsProcess execution failedNs Process finished, return code=%sRRs stdout=%ss stderr=%si(0RRtsixt string_typesRtcopytdeepcopyRtenviront subprocesstPIPERztdevnullRURRVRRtPY3Rtencodet nolog_replaceRhR?R@tpwdtgetpwnamtgrptgetgrnamtgr_gidRRtziptPopenRPt communicatetKeyboardInterrupttwaitRt returncodeRtPY2RRt raw_outputtraw_error_outputt output_logt error_log(targsRt raiseonerrtnologRtcapture_outputt skip_outputRRtsuplementary_groupst capture_errortencodingtredirect_outputRtp_intp_outtp_errt arg_stringtsgroupRmtgidRtpRRVRRtoutputt error_outputtresult((RRRRs5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytrunus?         "  %                      cCsxx|D]p}| st|tj r-qntjj|}t|}x)|||fD]}|j|d}q[WqW|S(s<Replace occurences of strings given in `nolog` with XXXXXXXXtXXXXXXXX(RRRRtparsetquoteRR(RoRRitquotedtshquotedt nolog_value((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyR=s  cCsJtjj|r)tj||dntj||tj|dS(Ns.orig(RRtisfiletrenametshutilRtremove(tfnametdest((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt install_fileJscCs-tjj|r)tj||dndS(Ns.orig(RRRR(R((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt backup_fileRstCIDictcBseZdZddZdZddZdZddZdZ e j r`dZ nddZ d Zd Zd Zd Zd ZdZdZdZddZdZdZdZdZdZdZRS(s> Case-insensitive but case-respecting dictionary. This code is derived from python-ldap's cidict.py module, written by stroeder: http://python-ldap.sourceforge.net/ This version extends 'dict' so it works properly with TurboGears. If you extend UserDict, isinstance(foo, dict) returns false. cKsLtt|ji|_|r2|j|n|rH|j|ndS(N(RRRt_keystupdate(R tdefaulttkwargs((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRbs  cCstt|j|jS(N(RRt __getitem__Rb(R tkey((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRjscCsm|j}|dk rG||kr7td|n|j|n||j|s(RRR(R ((R s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRscCstj|jS(N(RRR(R ((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRscCsdtj|DS(Ncss|]\}}|VqdS(N((RR tv((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pys s(RR(R ((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRscCs/y ||SWntk r*|||<|SXdS(N(R(R RRi((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt setdefaults    cGsNy||}||=|SWn.tk rIt|dkrC|dSnXdS(Nii(Rtlen(R RRRi((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytpops  cCs<tt|j\}}|j|}|j|=||fS(N(RRtpopitemR(R RRiR((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRs  cCs |jjtt|jS(N(RtclearRR(R ((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRs cCstddS(Ns#CIDict.viewitems is not implemented(tNotImplementedError(R ((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt viewitemsscCstddS(Ns"CIDict.viewkeys is not implemented(R(R ((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytviewkeysscCstddS(Ns%CIDict.viewvvalues is not implemented(R(R ((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt viewvvaluessN(R(R)R*RRRRRRRRRRRFRRRR RRRRR RRRRRR(((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRWs2                       tGeneralizedTimeZonecBs5eZdZddZdZdZdZRS(srThis class is a basic timezone wrapper for the offset specified in a Generalized Time. It is dst-ignorant.tZcCs tt|j||_d|_d|_|dkrOd|_d|_nt|dkrtjd|rt |dd!|_|d}nt|dkrtjd|rt |dd!|_|d}nt|dkrt n|jdkr|jd9_ndS(NiRis[-+]\d\dis\d\di( RRRR t houroffsett minoffsetR RrtmatchtintR(R t offsetstr((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRs"      $ $  cCstjd|jd|jS(Nthourstminutes(tdatetimet timedeltaRR(R tdt((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt utcoffsetscCs tjdS(Ni(RR(R ((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytdst scCs|jS(N(R (R ((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyttzname s(R(R)R*RR!R"R#(((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyRs    cCst|dkrd Sys|d }|d}t|d }t|dd!}t|dd!}d}}}} d } t|dkrwtjd|drwt|d }|d}t|dkrw|ddks|ddkrwd} |d }xDt|dkrEtjd|drE| |d7} |d }qWtt| d } t| d \}}qwnt|dkr^tjd|dr^t|d }|d}t|dkr^|ddks|ddkr^d} |d }xDt|dkrAtjd|drA| |d7} |d }qWtt| d }q^nt|dkrEtjd|drEt|d }|d}t|dkrE|ddks|ddkrEd}|d }xDt|dkr(tjd|dr(||d7}|d }qWtt|d } qEnt|dkrft|} ntj||||||| | SWnt k rd SXd S(s>Parses are Generalized Time string (as specified in X.680), returning a datetime object. Generalized Times are stored inside the krbPasswordExpiration attribute in LDAP. This method doesn't attempt to be perfect wrt timezones. If python can't be bothered to implement them, how can we...iiiiis\dt,R`iii<i@BN( R RRRrRtfloattdivmodRRR(ttimestrtdatettimetyeartmonthtdaythourtmintsectmsecttzonet hour_fractiont total_secst min_fractiont sec_fraction((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytparse_generalized_times\  ( 2 +( 2 +( 2 +& iiic CsEd}iitjd6tjttjdd6d6itjd6tjttjdd6d6itjd6tjttjdd6d6i|d6tjt|dd6d6}td|d|d|d|}id jg|j D]&\} } || dk r| d^qd6|d ?@[]^_{|}~tcharsitentropyt uppercaset lowercasetdigitstspecialttalluiiN(Rotascii_uppercasetmathtlogR tascii_lowercaseR;RRhRRtrandomt SystemRandomtchoice(t entropy_bitsR9R:R;R<tmin_lent special_charst pwd_charsetst req_classestcharclass_namet charclasstrndt todo_entropytpasswordttodo_characterstallchars((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytipa_generate_passwordPsV        +"     !cCs&|dkrvxgtrry0td|}|s:|jrD|jSWqtk rn|r_dStdqXqWnt|tjrxitryGtd||f}| r|s|r|S|jr|jSWqtk r|SXqWnt|t r|rdnd}xtrydtd||f}|j}|sM|S|j ddkrgtS|j dd krt SWqtk r|SXqWnt|t r"xrtry<td||f}|j}|s|St |}Wn"t k rqtk r|SX|SqWndS( Ns%s: R=sFailed to get user inputs %s [%s]: tyestnoitytn(RRPRtstriptEOFErrort RuntimeErrorRRRtboolRbRQRR(tpromptRt allow_emptytretRE((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pyt user_inputs`                c Cs7t}x*tj||tj|D] }|\}} } } } d} zyntj|| | } |dk rz| j|n| j| |tjkr| jd| j dnWnZtj k rt }|rdt d|dt |d| d}tj||qnXWd| dk r.| jnXq"W|S( s host: either hostname or IP address; if hostname is provided, port MUST be open on ALL resolved IPs returns True is port is open, False otherwise R=is8Failed to connect to port %(port)s %(proto)s on %(addr)sR^tprotoR!iN(RPRZt getaddrinfot AF_UNSPECRt settimeouttconnectt SOCK_DGRAMtsendtrecvR\RQRtPROTOCOL_NAMESR?RAR(R]R^t socket_typetsocket_timeoutt log_errorst log_levelt port_opentrestaftsocktypeR_t _canonnametsaRdtmsg((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pythost_port_opens0 "      cCsBtjt|}ytj|dWntk r=tSXtS(s} Checks if IP address have some reverse record somewhere. Does not care where it points. Returns True/False tPTR(Rt from_addressRRtqueryRRQRP(t ip_addresstreverse((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytreverse_record_existss  cCsvtjdtj}tj|}t}d }tjdddt }|j }t |d }x|D]} | } |j | } | r]| j dd\} } | d k r]|r| |krd| || f} | || [^\#;]+?) (\s*=\s*) (?P .+?)? (\s*((\#|;).*)?)? $)tmodeRtdeletetrtoptionRiu%s=%s iu %s=%s %s Ns%s=%s (RrRstVERBOSERtstatRRRRRQR RzRRmtfindRRRRRRtfchmodRtst_modetfchowntst_uidtst_gidR(tfilepatht replacevarst appendvarsRxt orig_statt old_valuest temp_filenamet new_configR}tlinetnew_linetmR}Ritnew_varst newvars_viewt append_viewtitem((s5/usr/lib/python2.7/site-packages/ipapython/ipautil.pytconfig_replace_variablessJ       "   % cCstjdtj}d}tj|}t}d}tjdddt ;} | j }t |d} t } t } d} xy| D]q}| d} |}|j |}|r|j dd d \}}}| r|dk r|| |||t} n|dk r5t|jt|jk} n|dk r| r|rz||krzd |||f}||| .+) \] (\s+((\#|;).*)?)? $)|(^ \s* (?P