grthtrhthjhtyjytjytkergtrhtrjytjerhrfh3 «Ú²j @ã@sJddlZddlZddlZddlmZmZGdd„deƒZGdd„dƒZdS)éN)ÚPopenÚPIPEcseZdZ‡fdd„Z‡ZS)ÚTimePastcstt|ƒjd|||fƒdS)Nz'%s time for key %s (%d) is already past)ÚsuperrÚ__init__)ÚselfÚkeyÚpropÚvalue)Ú __class__©ú/usr/lib/python3.6/dnskey.pyrs zTimePast.__init__)Ú__name__Ú __module__Ú __qualname__rÚ __classcell__r r )r r rsrc@s¾eZdZdZdqZdrZdsZdtd!d"„Zd#d$„Zd%d&„Z e dud'd(„ƒZ d)d*„Z e d+d,„ƒZe d-d.„ƒZdvd/d0„Ze d1d2„ƒZe d3d4„ƒZe d5d6„ƒZe d7d8„ƒZd9d:„Zd;d<„Zd=d>„Zd?d@„ZdAdB„ZdCdD„ZejƒfdEdF„ZdGdH„ZejƒfdIdJ„ZdKdL„ZejƒfdMdN„Z dOdP„Z!ejƒfdQdR„Z"dSdT„Z#ejƒfdUdV„Z$dWdX„Z%ejƒfdYdZ„Z&d[d\„Z'ejƒfd]d^„Z(d_d`„Z)dadb„Z*dcdd„Z+dedf„Z,dgdh„Z-didj„Z.dwdkdl„Z/dxdmdn„Z0e dodp„ƒZ1d S)yÚdnskeyztAn individual DNSSEC key. Identified by path, name, algorithm, keyid. Contains a dictionary of metadata events.ÚCreatedÚPublishÚActivateÚInactiveÚDeleteÚRevokeÚ DSPublishÚ SyncPublishÚ SyncDeleteNú-Pú-Aú-Iú-Dú-Rú-Psyncú-DsyncÚRSAMD5ÚDHÚDSAÚECCÚRSASHA1ÚNSEC3DSAÚ NSEC3RSASHA1Ú RSASHA256Ú RSASHA512ÚECCGOSTÚECDSAP256SHA256ÚECDSAP384SHA384ÚED25519ÚED448cCs¦t|tƒr:t|ƒdkr:|pd|_|\}}}|j||||ƒ|pLtjj|ƒpLd|_tjj|ƒ}|j dƒ\}}}|dd…}t |ƒ}t |j dƒdƒ}|j||||ƒdS)NéÚ.ú+éréÿÿÿÿ) Ú isinstanceÚtupleÚlenÚ_dirÚ fromtupleÚosÚpathÚdirnameÚbasenameÚsplitÚint)rrZ directoryÚkeyttlÚnameÚalgÚkeyidr r r r&s    zdnskey.__init__cs¨|jdƒr|}|jdƒ}n|d}d|||f}|j|jr@tjpBd|d}|j|jr^tjp`d|d}||_||_t|ƒ|_t|ƒ|_ ||_ t |dƒ} x‚| D]z‰ˆddkr´q¢ˆj ƒ} | sÂq¢| d j ƒdkrÞd } ||_nd} |sòt| d ƒn||_t| | ƒd @d k�rd|_q¢d|_q¢W| jƒt |dƒ} tƒ|_tƒ|_tƒ|_tƒ|_tƒ|_tƒ|_tƒ|_d|_xŽ| D]†‰ˆjƒ‰ˆ �svˆddk�rœ�qv‡fdd„dDƒtˆƒg} tdd„| Dƒƒ}ˆd|…jƒ}ˆ|d…jdƒjƒ}||j|<�qvWxštjD]�}d|j|<||jk�rn|j|j|ƒ}||j|<|j |ƒ|j|<|j!|ƒ|j|<|j||j|<n(d|j|<d|j|<d|j|<d|j|<�qW| jƒdS)Nr2z K%s+%03d+%05dÚz.keyz.privateÚrrú;r4ÚinÚchÚhsr1éTFZrUz!#csg|]}ˆj|ƒ‘qSr )Úfind)Ú.0Úc)Úliner r ú lsz$dnskey.fromtuple..z:= cSsg|]}|dkr|‘qS)r4r5r )rMÚposr r r rPms)rHrIrJ)"ÚendswithÚrstripr9r;ÚsepÚkeystrrBr@rCrDÚfullnameÚopenr?ÚlowerÚttlÚcloseÚdictZmetadataÚ_changedÚ_deleteÚ_timesÚ_fmttimeÚ _timestampsÚ _originalÚ_origttlÚstripr8ÚminÚlstriprÚ_PROPSÚ parsetimeÚ formattimeÚ epochfromtime)rrBrCrDrArVrUZkey_fileZ private_fileZkfpÚtokensZseptokenZpfpZ punctuationÚfoundr r Útr )rOr r:5sv                 zdnskey.fromtuplecKsr|jddƒ}g}d}|jdk r0|dt|jƒg7}xlttjtjƒD]Z\}}| s@|j| r\q@d}||j krx|j |rxd}|r€dn|j |} ||| g7}d}q@W|�rn|d|j g||j g} |sÒt ddj| ƒƒy0t| ttd �} | jƒ\} } | �rtt| ƒƒ‚Wn8tk �r:}ztd |t|ƒfƒ‚WYdd}~XnXd|_x*tjD] }|j||j|<d|j|<�qJWdS) NÚquietFTz-LZnonez-Kz# ú )ÚstdoutÚstderrzunable to run %s: %s)ÚgetrbÚstrrYÚziprrfÚ_OPTSr\r]r_r9rUÚprintÚjoinrrÚ communicateÚ Exceptionr`ra)rZ settime_binÚkwargsrmÚcmdÚfirstr ÚoptÚdeleteZwhenZfullcmdÚprorpÚer r r Úcommit‚s<    " z dnskey.commitc KsL| jddƒ} |dd|dt|ƒg} |r0| d|g7} |r>| jdƒ|rN| d|g7} |rb| d t|ƒg7} | r‚tj| ƒ}| d tj|ƒg7} | r¢tj| ƒ}| d tj| ƒg7} | j|ƒ| sÂtd d j| ƒƒt| t t d�}|j ƒ\}}|rðt dt|ƒƒ‚y"|j ƒdj dƒ}t|||ƒ}|St k �rF}zt dt|ƒƒ‚WYdd}~XnXdS)NrmFz-qz-Kz-Lz-rz-fkz-az-bz-Pz-Az# rn)rorpzunable to generate key: rÚasciiz!unable to parse generated key: %s)rqrrÚappendrÚ timefromepochrhrurvrrrwrxÚ splitlinesÚdecode)ÚclsÚ keygen_binÚ randomdevZkeys_dirrBrCZkeysizerTrYÚpublishÚactivateryrmÚ keygen_cmdrlr~rorprUÚnewkeyrr r r Úgenerate§s:         zdnskey.generatec Ksô|jddƒ}|jƒs td|ƒ‚|dd|jd|jg}|jrL|dt|jƒg7}|r\|d|g7}|rp|d t|ƒg7}|s†td d j|ƒƒt |t t d �}|j ƒ\}} | r°td | ƒ‚y&|j ƒdj dƒ} t| |j|jƒ} | Std|ƒ‚YnXdS)NrmFz'predecessor key %s has no inactive datez-qz-Kz-Sz-Lz-rz-iz# rn)rorpzunable to generate key: rr�z'unable to generate successor for key %s)rqÚinactiverxr9rUrYrrrurvrrrwr„r…r) rr‡rˆZ prepublishryrmr‹r~rorprUrŒr r r Úgenerate_successorÓs,     zdnskey.generate_successorcCs0d}|tttjƒƒkr tj|}|r(|Sd|S)Nz%03d)Úranger8rÚ _ALGNAMES)rCrBr r r Úalgstrós z dnskey.algstrc Cs6|sdS|jƒ}y tjj|ƒStk r0dSXdS)N)Úupperrr‘ÚindexÚ ValueError)rCr r r Úalgnumús z dnskey.algnumcCs|j|p |jƒS)N)r’rC)rrCr r r Úalgnameszdnskey.algnamecCs tj|ƒS)N)ÚtimeZgmtime)Úsecsr r r rƒszdnskey.timefromepochcCs tj|dƒS)Nz %Y%m%d%H%M%S)r˜Zstrptime)Ústringr r r rg szdnskey.parsetimecCs tj|ƒS)N)ÚcalendarZtimegm)rlr r r riszdnskey.epochfromtimecCs tjd|ƒS)Nz %Y%m%d%H%M%S)r˜Zstrftime)rlr r r rhszdnskey.formattimecKsö|jddƒ}|j||krdS|j|dk rR|j||krR| rRt|||j|ƒ‚|dkr¢|j|dkrldnd|j|<d|j|<d|j|<d|j|<d|j|<dS|j|ƒ}||j|<||j|<|j |ƒ|j|<|j||j|krèdnd|j|<dS)NÚforceFT) rqr`rarr\r]r^r_rƒrh)rr r™Únowryrœrlr r r Úsetmetas$        zdnskey.setmetacCs |j|S)N)r^)rr r r r Úgettime2szdnskey.gettimecCs |j|S)N)r_)rr r r r Ú getfmttime5szdnskey.getfmttimecCs |j|S)N)r`)rr r r r Ú gettimestamp8szdnskey.gettimestampcCs |jdS)Nr)r`)rr r r Úcreated;szdnskey.createdcCs |jdS)Nr)r`)rr r r Ú syncpublish>szdnskey.syncpublishcKs|jd||f|ŽdS)Nr)rž)rr™r�ryr r r ÚsetsyncpublishAszdnskey.setsyncpublishcCs |jdS)Nr)r`)rr r r r‰Dszdnskey.publishcKs|jd||f|ŽdS)Nr)rž)rr™r�ryr r r Ú setpublishGszdnskey.setpublishcCs |jdS)Nr)r`)rr r r rŠJszdnskey.activatecKs|jd||f|ŽdS)Nr)rž)rr™r�ryr r r Ú setactivateMszdnskey.setactivatecCs |jdS)Nr)r`)rr r r ÚrevokePsz dnskey.revokecKs|jd||f|ŽdS)Nr)rž)rr™r�ryr r r Ú setrevokeSszdnskey.setrevokecCs |jdS)Nr)r`)rr r r rŽVszdnskey.inactivecKs|jd||f|ŽdS)Nr)rž)rr™r�ryr r r Ú setinactiveYszdnskey.setinactivecCs |jdS)Nr)r`)rr r r r}\sz dnskey.deletecKs|jd||f|ŽdS)Nr)rž)rr™r�ryr r r Ú setdelete_szdnskey.setdeletecCs |jdS)Nr)r`)rr r r Ú syncdeletebszdnskey.syncdeletecKs|jd||f|ŽdS)Nr)rž)rr™r�ryr r r Ú setsyncdeleteeszdnskey.setsyncdeletecCsR|dks|j|krdS|jdkr0|j|_||_n|j|krHd|_||_n||_dS)N)rYrb)rrYr r r Úsetttlhs  z dnskey.setttlcCs|jr dSdS)NÚKSKÚZSK)rT)rr r r Úkeytypetszdnskey.keytypecCsd|j|jƒ|jfS)Nz %s/%s/%05d)rBr—rD)rr r r Ú__str__wszdnskey.__str__cCs"d|j|jƒ|j|jrdndfS)Nz%s/%s/%05d (%s)r®r¯)rBr—rDrT)rr r r Ú__repr__{szdnskey.__repr__cCs|jƒp|jƒp|jƒS)N)rŠr‰r¢)rr r r Údate€sz dnskey.datecCs@|j|jkr|j|jkS|j|jkr0|j|jkS|jƒ|jƒkS)N)rBrCr³)rÚotherr r r Ú__lt__‡s     z dnskey.__lt__cCsðdd„}|s|}ttjƒƒ}|jƒ}|jƒ}|s4dS|sT||krP|dt|ƒƒdS||krh||krhdS||kr”|dt|ƒtj|jƒpˆdfƒdS||kr°|dt|ƒƒdS|jdk rì|||jkrì|d t|ƒtj|jƒpàdfƒdSdS) Nc_sdS)Nr )Úargsryr r r Únoop�sz!dnskey.check_prepub..noopFzFWARNING: Key %s is scheduled for activation but not for publication.TzËWARNING: %s is scheduled to be published and activated at the same time. This could result in a coverage gap if the zone was previously signed. Activation should be at least %s after publication.zone DNSKEY TTLz0WARNING: Key %s is active before it is publishedzÄWARNING: Key %s is activated too soon after publication; this could result in coverage gaps due to resolver caches containing old data. Activation should be at least %s after publication.)r@r˜rŠr‰ÚreprrÚdurationrY)rÚoutputr·r�Úar~r r r Ú check_prepubŽs<   zdnskey.check_prepubcCsÜdd„}|dkr|}|dkr"|j}|dkr>|dt|ƒƒd }tjƒ}|jƒ}|jƒ}|s^dS|s~||krz|dt|ƒƒdS||kr’||kr’dS||kr®|d t|ƒƒdS|||krØ|d t|ƒtj|ƒfƒdSdS) Nc_sdS)Nr )r¶ryr r r r·Àsz"dnskey.check_postpub..noopz"WARNING: Key %s using default TTL.é<éFzEWARNING: Key %s is scheduled for deletion but not for inactivation.Tz@WARNING: Key %s is scheduled for deletion before inactivation.zÍWARNING: Key %s scheduled for deletion too soon after deactivation; this may result in coverage gaps due to resolver caches containing old data. Deletion should be at least %s after inactivation.ii€Q)rYr¸r˜r}rŽrr¹)rrºZtimespanr·r�ÚdÚir r r Ú check_postpub¿s:   zdnskey.check_postpubcCsz|sdSddddddg}g}xR|D]J}||d ||d }}|d kr"|jd ||d |d krbdndfƒq"Wdj|ƒS) NÚyearr½r¾imÚmonthéÚdayÚhourÚminuteÚsecondr4rz%d %s%sÚsrEz, ii€Qé€3á)rÂrÊii€Qé�')rÃrËié€Q)rÅrÌé)rÆrÍ)rÇr½)rÈr4)r‚rv)r™ZunitsrºZunitÚvr r r r¹ìs (zdnskey.duration) rrrrrrrrr) Nrrrrr Nr!r")Nr#r$r%r&r'r(r)r*Nr+Nr,r-r.r/r0)NN)NN)N)N)NN)2rrrÚ__doc__rfrtr‘rr:r€Ú classmethodr�r�Ú staticmethodr’r–r—rƒrgrirhržrŸr r¡r¢r£r˜r¤r‰r¥rŠr¦r§r¨rŽr©r}rªr«r¬r­r°r±r²r³rµr¼rÁr¹r r r r rsb M% *        1 -r) r;r˜r›Ú subprocessrrrxrrr r r r Ú s