ó é×fc@s~ddlmZddlZddlZddlZddlZddlZddlZddlZde fd„ƒYZ dS(iÿÿÿÿ(t OrderedDictNtrndccBs’eZdZidd6dd6dd6dd6d d 6d d 6Zd „Zd„Zed„Zd„Zd„Z d„Z d„Z d„Z d„Z RS(sRNDC protocol client libraryitmd5i¡tsha1i¢tsha224i£tsha256i¤tsha384i¥tsha512cCsŠ||_|jƒ}|jdƒr1|d}n||_tt|ƒ|_tj|ƒ|_ t j ddƒ|_ d|_|jƒdS(sþCreates a persistent connection to RNDC and logs in host - (ip, port) tuple algo - HMAC algorithm: one of md5, sha1, sha224, sha256, sha384, sha512 (with optional prefix 'hmac-') secret - HMAC secret, base64 encodedshmac-iiiiNi(thosttlowert startswithtalgotgetattrthashlibthlalgotbase64t b64decodetsecrettrandomtrandinttsertNonetnoncet_rndc__connect_login(tselfRR R((s,/usr/lib/python2.7/site-packages/isc/rndc.pyt__init__$s     cCst|jd|ƒdƒS(s’Call a RNDC command, all parsing is done on the server side cmd - a complete string with a command (eg 'reload zone example.com') ttypet_data(tdictt_rndc__command(Rtcmd((s,/usr/lib/python2.7/site-packages/isc/rndc.pytcall5scCsytƒ}xi|jƒD][\}}|r:|dkr:qn|tjdt|ƒƒ|jdƒ7}t|ƒtkr¤|tjddt|ƒƒ|jdƒ7}qt|ƒtkrÜ|tjddt|ƒƒ|7}qt|ƒtkr|tjddt|ƒƒ|7}qt|ƒt kr[|j |ƒ}|tjddt|ƒƒ|7}qt dt|ƒƒ‚qW|S(Nt_authtBtasciis>BIiis#Cannot serialize element of type %s( t bytearraytitemststructtpacktlentencodeRtstrtbytesRt_rndc__serialize_dicttNotImplementedError(Rtdatat ignore_authtrvtktvtsd((s,/usr/lib/python2.7/site-packages/isc/rndc.pyt__serialize_dict;s" )/&&&c Os—|jd7_ttjƒƒ}t||Ž}tƒ}tƒ|dIIi(RtintttimeRR)RRR+tTruethmactnewRRtdigestRt b64encodeR R%R&R#t _rndc__algosR'( RtargstkwargstnowR-tdtmsgthashtbhash((s,/usr/lib/python2.7/site-packages/isc/rndc.pyt__prep_messageOs,    ! !#cCsë|jdk r*|dd|jkr*tS|jdkrJ|dd}n|ddd}t|ƒtkr€|jdƒ}n|d d t|ƒd 7}tj |ƒ}|j |d t ƒ}t j |j||jƒjƒ}||kS( NR4R8RR R:R<iR"t=iR.(RRtFalseR RR*tdecodeR'RRR+R?R@RARRRB(RRIRKt remote_hashtmy_msgtmy_hash((s,/usr/lib/python2.7/site-packages/isc/rndc.pyt __verify_msgjs&!c OsD|j||Ž}|jj|ƒ}|t|ƒkrEtdƒ‚n|jjdƒ}t|ƒdkrxtdƒ‚ntjd|ƒ\}}|dkr¯td|ƒ‚n|d8}|jj|tj ƒ}t|ƒ|kròtdƒ‚nt |ƒt krt |ƒ}n|j |ƒ}|j|ƒs@td ƒ‚n|S( NsCannot send the messageisCan't read response headers>IIisWrong message version %disCan't read response datasAuthentication failure(t_rndc__prep_messagetsockettsendR'tIOErrortrecvR%tunpackR,t MSG_WAITALLRR)R#t_rndc__parse_messaget_rndc__verify_msg( RRERFRItsenttheadertlengthtversionR-((s,/usr/lib/python2.7/site-packages/isc/rndc.pyt __commandys(  cCsEtj|jƒ|_d|_|jddƒ}|dd|_dS(NRtnullR4R8(RUtcreate_connectionRRRR(RRI((s,/usr/lib/python2.7/site-packages/isc/rndc.pyt__connect_login–s c Cs,d}||}|d7}||||!jdƒ}||7}||}|d7}tjd|||d!ƒd}|d7}||||!}||7}||}|dkr»|||fS|dkrtƒ} x8t|ƒdkr |j|ƒ\} } }| | | IiisUnknown element type %d(ROR%RYRR't_rndc__parse_elementR,( RtinputtpostlabellentlabelRtdatalenR-trestRHtilabeltvalue((s,/usr/lib/python2.7/site-packages/isc/rndc.pyt__parse_elementœs*     !        cCsNtƒ}d}x8t|ƒdkrI|j|ƒ\}}}|||R%R R@RRRUtobjectR(((s,/usr/lib/python2.7/site-packages/isc/rndc.pyts