a õ$ßi+ã@sXddlmZddlZddlZddlZddlZddlZddlZddlZGdd„de ƒZ dS)é)Ú OrderedDictNc@sleZdZdZdddddddœZd d „Zd d „Zddd„Zdd„Zdd„Z dd„Z dd„Z dd„Z dd„Z dS)ÚrndczRNDC protocol client libraryéé¡é¢é£é¤é¥)Úmd5Zsha1Zsha224Zsha256Zsha384Zsha512cCsb||_| ¡}| d¡r$|dd…}||_tt|ƒ|_t |¡|_ t   dd¡|_ d|_ | ¡dS)zþ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 encodedzhmac-éNri)ÚhostÚlowerÚ startswithÚalgoÚgetattrÚhashlibÚhlalgoÚbase64Ú b64decodeÚsecretÚrandomZrandintÚserÚnonceÚ_rndc__connect_login)Úselfr rr©rú,/usr/lib/python3.9/site-packages/isc/rndc.pyÚ__init__$s    z rndc.__init__cCst|j|ddƒS)z’Call a RNDC command, all parsing is done on the server side cmd - a complete string with a command (eg 'reload zone example.com') ©ÚtypeÚ_data)ÚdictÚ_rndc__command)rÚcmdrrrÚcall5sz rndc.callFcCstƒ}| ¡D]ô\}}|r$|dkr$q|t dt|ƒ¡| d¡7}t|ƒtkrp|t ddt|ƒ¡| d¡7}qt|ƒtkr˜|t ddt|ƒ¡|7}qt|ƒtkrÀ|t ddt|ƒ¡|7}qt|ƒt krò|  |¡}|t ddt|ƒ¡|7}qt dt|ƒƒ‚q|S)NÚ_authÚBÚasciiz>BIééz#Cannot serialize element of type %s) Ú bytearrayÚitemsÚstructÚpackÚlenÚencoderÚstrÚbytesrÚ_rndc__serialize_dictÚNotImplementedError)rÚdataÚ ignore_authÚrvÚkÚvÚsdrrrZ__serialize_dict;s$  "    ÿzrndc.__serialize_dictc Os0|jd7_tt ¡ƒ}t|i|¤Ž}tƒ}tƒ|d<tƒ|d<t|jƒ|dd<t|ƒ|dd<t|dƒ|dd<|jdur|j|dd<||d <|j|d d }t |j ||j ¡  ¡}t   |¡}|jd kræt d |¡|dd<n"tt d|j|j|¡ƒ|dd<| |¡}t dt|ƒdd¡|}|S)Nr(r%Ú_ctrlZ_serZ_timé<Z_expÚ_noncer T©r5r Z22sÚhmd5ZB88sÚhshaú>IIé)rÚintÚtimerr0rr2ÚhmacÚnewrrÚdigestrZ b64encoderr,r-r*Ú _rndc__algosr.) rÚargsÚkwargsZnowr4ÚdÚmsgÚhashÚbhashrrrZ__prep_messageOs.       ÿ zrndc.__prep_messagecCs°|jdur |dd|jkr dS|jdkr8|dd}n|dddd…}t|ƒtkrb| d ¡}|d d t|ƒd 7}t |¡}|j|d d }t   |j ||j ¡  ¡}||kS)Nr:r<Fr r%r>r?r(r'ú=rATr=)rrrr1Údecoder.rrr2rDrErrrF)rrKrMZ remote_hashZmy_msgZmy_hashrrrZ __verify_msgjs    zrndc.__verify_msgc OsÔ|j|i|¤Ž}|j |¡}|t|ƒkr0tdƒ‚|j d¡}t|ƒdkrPtdƒ‚t d|¡\}}|dkrttd|ƒ‚|d8}|j |tj ¡}t|ƒ|kr tdƒ‚t |ƒt kr´t |ƒ}|  |¡}| |¡sÐtd ƒ‚|S) NzCannot send the messageézCan't read response headerr@r(zWrong message version %drAzCan't read response datazAuthentication failure)Ú_rndc__prep_messageÚsocketÚsendr.ÚIOErrorZrecvr,Úunpackr3Z MSG_WAITALLrr0r*Ú_rndc__parse_messageÚ_rndc__verify_msg) rrHrIrKÚsentÚheaderÚlengthÚversionr4rrrZ __commandys(         zrndc.__commandcCs2t |j¡|_d|_|jdd}|dd|_dS)NZnullrr:r<)rRZcreate_connectionr rr")rrKrrrZ__connect_login–s zrndc.__connect_loginc Csêd}||}|d7}||||… d¡}||7}||}|d7}t d|||d…¡d}|d7}||||…}||7}||d…}|dkrœ|||fS|dkrÚtƒ} t|ƒdkrÐ| |¡\} } }| | | <qª|| |fStd|ƒ‚dS)Nrr(r'z>IrAr)zUnknown element type %d)rOr,rUrr.Ú_rndc__parse_elementr3) rÚinputÚposZlabellenÚlabelrZdatalenr4ÚrestrJZilabelÚvaluerrrZ__parse_elementœs*     zrndc.__parse_elementcCs4tƒ}d}t|ƒdkr0| |¡\}}}|||<q |S)Nr)rr.r\)rr]r6Zhdatar_rarrrZ__parse_message¶s   zrndc.__parse_messageN)F)Ú__name__Ú __module__Ú __qualname__Ú__doc__rGrr$r2rQrWr"rr\rVrrrrrs"û r) Ú collectionsrrCr,rrDrrrRÚobjectrrrrrÚs