3 V[c@sdZddlZddlZddlmZddlmZddlmZddlmZddlZddl m Z y ddl Z Wne k rddl Z YnXd Zd ZGd d d e ZGd dde ZddlmZddlmZddlmZmZmZmZddZddZddZddZddZddZ ddZ!d d!Z"Gd"d#d#Z#Gd$d%d%Z$d&d'Z%Gd(d)d)e#Z&d*d+Z'Gd,d-d-e$Z(Gd.d/d/e(Z)Gd0d1d1e)Z*Gd2d3d3e)Z+Gd4d5d5e$Z,Gd6d7d7e#Z-Gd8d9d9e$Z.Gd:d;d;e#Z/Gdd?d?e&e/e-Z1Gd@dAdAe(e0e.Z2GdBdCdCe)e0e.Z3GdDdEdEe*e0e.Z4GdFdGdGe,e0e.Z5GdHdIdIe+e0e.Z6dJdKZ7GdLdMdMZ8dNdOZ9dPdQZ:e;dRkre%dS)Su@ $Id$ This file is part of the py3dns project. Homepage: https://launchpad.net/py3dns This code is covered by the standard Python License. See LICENSE for details. Changes for Python3 port © 2011-13 Scott Kitterman Library code. Largely this is packers and unpackers for various types. N)Type)Class)Opcode)Status)DNSErrorFZidnac@s eZdZdS) UnpackErrorN)__name__ __module__ __qualname__r r /usr/lib/python3.6/Lib.pyr/src@s eZdZdS) PackErrorN)r r r r r r r r0sr)pack)unpack) inet_ntoa inet_aton inet_ntopAF_INET6cCs td|S)Nz!H) struct_pack)nr r r pack16bit8srcCs td|S)Nz!L)r)rr r r pack32bit;srcCstd|dS)Nz!Hr) struct_unpack)sr r r unpack16bit>srcCstd|dS)Nz!Lr)r)rr r r unpack32bitAsrcCstdt|dS)aDConvert a string IPv4 address into an unsigned integer. Examples:: >>> addr2bin('127.0.0.1') 2130706433 >>> addr2bin('127.0.0.1') == socket.INADDR_LOOPBACK 1 >>> addr2bin('255.255.255.254') 4294967294L >>> addr2bin('192.168.0.1') 3232235521L Unlike old DNS.addr2bin, the n, n.n, and n.n.n forms for IP addresses are handled as well:: >>> addr2bin('10.65536') 167837696 >>> 10 * (2 ** 24) + 65536 167837696 >>> addr2bin('10.93.512') 173867520 >>> 10 * (2 ** 24) + 93 * (2 ** 16) + 512 173867520 z!Lr)rr)addrr r r addr2binDsrcCsttd|S)Nz!L)rr)rr r r bin2addrcsrcCs tt|S)N)rr)rr r r bin2addr6fsr cCstd|\}}|d>|BS)Nz!QQ@)r)strhlr r r bin2long6isr%c@s`eZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ dS)PackerzE packer base class. supports basic byte/16bit/32bit/addr/string/name cCs(tjr d}ntj}td||_i|_dS)Nutf8)DNS LABEL_UTF8LABEL_ENCODINGbytesbufindex)selfencr r r __init__rs  zPacker.__init__cCs|jS)N)r-)r/r r r getbufysz Packer.getbufcCs<t|dkrtdtjr d}ntj}|jt|||_dS)Nrzone character expectedr')len TypeErrorr)r*r+r-r,)r/cr0r r r addbyte{s  zPacker.addbytecCs(tjr d}ntj}|jt|||_dS)Nr')r)r*r+r-r,)r/Zabytesr0r r r addbytesszPacker.addbytescCs|jtt||_dS)N)r-r,r)r/rr r r add16bitszPacker.add16bitcCs|jtt||_dS)N)r-r,r)r/rr r r add32bitszPacker.add32bitcCs t|}|jtt||_dS)N)rr-r,r)r/rrr r r addaddrszPacker.addaddrcCs@t|dkr tddt||jtt||j|dS)NzCan't encode string of length z %s (> 255))r3 ValueErrorr6chrr7)r/rr r r addstrings  zPacker.addstringcCsg}x"|jdD]}|sq|j|qWg}xZtt|D]>}dj||d}|j}|j|||jkr:|j|}Pq:Wt|}d}t|j}g} tj rd} ntj } t d| } xt|D]} || }y|j | }Wn<t k rtj s|jdsd|}|j | }YnXt|} | dkr.td|t| dkr\| j|| |t| fntdtd | t | g|} qW|r| t|d B} n| t d | } |j| |_x| D]\}}||j|<qWdS) N.r'r(u?zlabel too longi?zDNS.Lib.Packer.addname:zwarning: pointer too bigi)splitappendranger3joinupperr.r-r)r*r+r,encodeUnicodeEncodeError startswithrprintr)r/nameZnlistZlabelkeysikeypointeroffsetr.r0r-jrvaluer r r addnamesZ        zPacker.addnamecCst|jj}|jtddx"|D]}td||j|fq(Wtddd}xtdt|jddD]}|j||ddkr|std}qnd}td|xP|j||dD]:}d |kod knrtd |qtd t|qWtqnWtdddS) N-(z%20s %3drrz**z%4d z %cz%2d) listr.rLsortrJrDr3r-ord)r/rLrNZspacerMr5r r r dumps*     z Packer.dumpN)r r r __doc__r1r2r6r7r8r9r:r>rSr\r r r r r&ps8r&c@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS)UnpackercCs||_d|_dS)Nr)r-rP)r/r-r r r r1szUnpacker.__init__cCs4|jt|jkrtd|j|j}|jd|_|S)NzRan off end of datar)rPr3r-r)r/r5r r r getbytes   zUnpacker.getbytecCs:|j|j|j|}t||kr*td|j||_|S)Nznot enough data left)r-rPr3r)r/rrr r r getbytess   zUnpacker.getbytescCst|jdS)NrV)rr`)r/r r r get16bitszUnpacker.get16bitcCst|jdS)N)rr`)r/r r r get32bitszUnpacker.get32bitcCs$tjr d}ntj}tt|j|S)Nr')r)r*r+r,rrc)r/r0r r r getaddrszUnpacker.getaddrcCs |jdS)N)r`)r/r r r getaddr6szUnpacker.getaddr6cCs|j|jS)N)r`r_)r/r r r getstringszUnpacker.getstringc Cs|j}|rZ|d@dkrZ|j}|}|d>|Bd@}|j}z||_|j}Wd||_X|S|dkrfdStjrrd}ntj}t|j||}|j}|s|S|d|SdS) Nirr(r'r?i?)r_rPgetnamer)r*r+r"r`) r/rMdrQrOZ save_offsetZdomainr0Zremainsr r r rjs* zUnpacker.getnameN) r r r r1r_r`rarcrdrfrgrjr r r r r^sr^c Csd}tt|}ddl}|jxp|D]h}t}|jd|jd|jd|jd|jd|jd|jd |jdd |jd q&W|jt |j d t t |j |ddt |j }|j|jd|j|jd|j|jd |j|jd |j|jxZ|D]R}t |j }|j|jd|j|jd|j|jd |j|jd |jf }q(W|jt |j dt t |j |dddS)Ni rz 192.168.0.1*z f.ISI.ARPArizFoo.F.isi.arpaZarpar(zms total for packingrbzms per packingzms total for unpackingzms per unpackingz********************z********z******************)rYrDtimingstartr&r:r7rSZfinishrJZmilliroundr^r-rdr`rj)NRrprMpuresr r r testpacker$sV                rxc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!S)"RRpackercCstj|d|_dS)N)r&r1rdstart)r/r r r r1Ys zRRpacker.__init__cGsh|j||j||j||j||rJ|ddr@td|d}nd}|j|t|j|_dS)Nrz too many argsr)rSr8r9r4r3r-rz)r/rKZRRtypeklassttlrestrdlengthr r r addRRheader\s       zRRpacker.addRRheaderc Cst|j|jd|j}|t|j|jkr2dS|j|jd}|j}d}z8|jd|jd|_|jt||j||_d}Wd|s||_XdS)NrVrr)rr-rzr3r8)r/r~ZrdataZsave_bufokr r r patchrdlengthhs zRRpacker.patchrdlengthcCs|jdk r|jd|_dS)N)rzr)r/r r r endRRvs zRRpacker.endRRcCs|jdk r|jtj|S)N)rzrr&r2)r/r r r r2zs zRRpacker.getbufcCs(|j|tj|||j||jdS)N)rrZCNAMErSr)r/rKr{r|Zcnamer r r addCNAME~s zRRpacker.addCNAMEcCs2|j|tj|||j||j||jdS)N)rrZHINFOr>r)r/rKr{r|Zcpuosr r r addHINFOs  zRRpacker.addHINFOcCs2|j|tj|||j||j||jdS)N)rrZMXr8rSr)r/rKr{r|Z preferenceZexchanger r r addMXs  zRRpacker.addMXcCs(|j|tj|||j||jdS)N)rrZNSrSr)r/rKr{r|Znsdnamer r r addNSs zRRpacker.addNScCs(|j|tj|||j||jdS)N)rrZPTRrSr)r/rKr{r|Zptrdnamer r r addPTRs zRRpacker.addPTRc Csd|j|tj|||j||j||j||j||j||j| |j| |jdS)N)rrZSOArSr9r) r/rKr{r|mnameZrnameserialZrefreshretryexpireminimumr r r addSOAs       zRRpacker.addSOAcCsT|j|tj||t|tks*t|tkr0|g}x|D]}|j|q6W|jdS)N)rrTXTtyper,r"r>r)r/rKr{r|tlisttxtdatar r r addTXTs  zRRpacker.addTXTcCsT|j|tj||t|tks*t|tkr0|g}x|D]}|j|q6W|jdS)N)rrrrr,r"r>r)r/rKr{r|rrr r r addSPFs  zRRpacker.addSPFcCs(|j|tj|||j||jdS)N)rrAr:r)r/rKr{r|addressr r r addAs z RRpacker.addAcCsB|j|tjtj||j||jt||j||j dS)N) rrZWKSrINr:r6r=r7r)r/rKr|rprotocolbitmapr r r addWKSs   zRRpacker.addWKScCstdS)N)NotImplementedError)r/r r r addSRVszRRpacker.addSRVN)r r r r1rrrr2rrrrrrrrrrrr r r r ryXs   rycCsp|dkr|d|fS|dkr,|d|dfS|dkrD|d|dfS|dkr\|d|dfS|d |dfSdS) N<z %d secondsiz %d minutesiQz%d hoursi: z%d daysz%d weeksr )Zsecondsr r r prettyTimes rc@sxeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ e Z ddZddZddZdS) RRunpackercCstj||d|_dS)N)r^r1rdend)r/r-r r r r1s zRRunpacker.__init__cCsB|j}|j}|j}|j}|j}|j||_|||||fS)N)rjrarcrPr)r/rKrrtyper{r|r~r r r getRRheaders zRRunpacker.getRRheadercCs|j|jkrtddS)Nzend of RR not reached)rPrr)r/r r r rs zRRunpacker.endRRcCs|jS)N)rj)r/r r r getCNAMEdataszRRunpacker.getCNAMEdatacCs.tjr d}ntj}t|j|t|j|fS)Nr')r)r*r+r"rg)r/r0r r r getHINFOdataszRRunpacker.getHINFOdatacCs|j|jfS)N)rarj)r/r r r getMXdataszRRunpacker.getMXdatacCs|jS)N)rj)r/r r r getNSdataszRRunpacker.getNSdatacCs|jS)N)rj)r/r r r getPTRdataszRRunpacker.getPTRdatac CsT|j|jd|jfdt|jdt|jd t|jd t|jfS) Nrrefresh rrr)r)r)r)r)r)rjrcr)r/r r r getSOAdatas zRRunpacker.getSOAdatacCs,g}x"|j|jkr&|jt|jqW|S)N)rPrrCr,rg)r/rr r r getTXTdataszRRunpacker.getTXTdatacCs tjr d}ntj}|jj|S)Nr')r)r*r+rddecode)r/r0r r r getAdataszRRunpacker.getAdatacCs0|j}t|j}|j|j|j}|||fS)N)rdr[r_r`rrP)r/rrrr r r getWKSdatas zRRunpacker.getWKSdatacCs,|j}|j}|j}|j}||||fS)zP _Service._Proto.Name TTL Class SRV Priority Weight Port Target )rarj)r/ZpriorityZweightZporttargetr r r getSRVdatas zRRunpacker.getSRVdataN)r r r r1rrrrrrrrr getSPFdatarrrr r r r rsrc@s$eZdZddZddZddZdS)RRunpackerDefaultcCstj||d|_dS)N)rr1r)r/r-r r r r1 s zRRunpackerDefault.__init__cCs:tjr d}ntj}tj|jj|}tjt d|dS)Nr'z!Ir) r)r*r+socketrrdr ipaddressZ IPv4Addressr)r/r0xr r r r s zRRunpackerDefault.getAdatacCstjt|jS)N)rZ IPv6Addressr rf)r/r r r getAAAAdataszRRunpackerDefault.getAAAAdataN)r r r r1rrr r r r rsrc@s,eZdZddZddZddZddZd S) RRunpackerTextcCstj||dS)N)rr1)r/r-r r r r1szRRunpackerText.__init__cCs tjr d}ntj}|jj|S)Nr')r)r*r+rdr)r/r0r r r rszRRunpackerText.getAdatacCs t|jS)N)r rf)r/r r r r szRRunpackerText.getAAAAdatacCs@tjr d}ntj}g}x$|j|jkr:|jt|j|qW|S)Nr')r)r*r+rPrrCr"rg)r/r0rr r r r"szRRunpackerText.getTXTdataN)r r r r1rrrr r r r rsrc@s$eZdZddZddZddZdS)RRunpackerIntegercCstj||dS)N)rr1)r/r-r r r r1-szRRunpackerInteger.__init__cCs4tjr d}ntj}tj|jj|}td|dS)Nr'z!Ir)r)r*r+rrrdrr)r/r0rr r r r/s zRRunpackerInteger.getAdatacCs t|jS)N)r%rf)r/r r r r6szRRunpackerInteger.getAAAAdataN)r r r r1rrr r r r r,src@s0eZdZddZddZddZddZeZd S) RRunpackerBinarycCstj||d|_dS)N)r^r1r)r/r-r r r r1:s zRRunpackerBinary.__init__cCsH|j}|j}|j}|j}|j}||_|j||_|||||fS)N)rjrarcr~rPr)r/rKrr{r|r~r r r r=s zRRunpackerBinary.getRRheadercCs|j|jkrtddS)Nzend of RR not reached)rPrr)r/r r r rFs zRRunpackerBinary.endRRcCs,g}x"|j|jkr&|j|j|jqW|S)N)rPrrCr`r~)r/rr r r rIszRRunpackerBinary.getTXTdataN)r r r r1rrrrr r r r r9s  rc@seZdZddZdS)HpackercCs|j||j|d@d>|d@d>B|d@d>B|d@d>B|d@d>B|d@d>B|d@d>B| d@B|j| |j| |j| |j| dS) Nr rirb)r8)r/idqropcodeaatcrdrazrcodeqdcountancountnscountarcountr r r addHeaderSs ^   zHpacker.addHeaderN)r r r rr r r r rRsrc@seZdZddZdS) Hunpackerc Cs|j}|j}|d?d@|d?d@|d?d@|d?d@|d?d@|d?d@|d?d@|d ?d@f\}}}}}}} } |j} |j} |j} |j}|||||||| | | | | |f S) Nrrrrrrirrbr)ra)r/rflagsrrrrrrrrrrrrr r r getHeader_s        zHunpacker.getHeaderN)r r r rr r r r r^src@seZdZddZdS)QpackercCs"|j||j||j|dS)N)rSr8)r/qnameqtypeqclassr r r addQuestionvs  zQpacker.addQuestionN)r r r rr r r r rusrc@seZdZddZdS) QunpackercCs|j|j|jfS)N)rjra)r/r r r getQuestion|szQunpacker.getQuestionN)r r r rr r r r r{src@s eZdZdS)MpackerN)r r r r r r r rsrc@s eZdZdS) MunpackerN)r r r r r r r rsrc@s eZdZdS)MunpackerDefaultN)r r r r r r r rsrc@s eZdZdS) MunpackerTextN)r r r r r r r rsrc@s eZdZdS)MunpackerBinaryN)r r r r r r r rsrc@s eZdZdS)MunpackerIntegerN)r r r r r r r rsrc Cstd|j\ }}}}}}}}} } } } } td|td|||||||| f|r^td| rntd| td| | | | fx$t| D]}td|t|qWx$t| D]}td|t|qWx$t| D]}td |t|qWx$t| D]}td |t|qWdS) NzHEADER:zid=%d,z=qr=%d, opcode=%d, aa=%d, tc=%d, rd=%d, ra=%d, z=%d, rcode=%d,z*** response truncated! ***z *** nonzero error code! (%d) ***z0 qdcount=%d, ancount=%d, nscount=%d, arcount=%dz QUESTION %d:z ANSWER %d:zAUTHORITY RECORD %d:zADDITIONAL RECORD %d:)rJrrDdumpQdumpRR)rvrrrrrrrrrrrrrrMr r r dumpMs."         rc@s4eZdZddZddZddZddZd d Zd S) DnsResultcCs2i|_g|_g|_g|_g|_||_|j|dS)N)header questionsanswers authority additionalargsstoreM)r/rvrr r r r1szDnsResult.__init__cCsddl}td|jd|jdfd}|jdr:|d}|j}td|td td |d |d |d ftt|fddd+}tddj||d|d|d|dftdx,|jD]"}td|d|d|dfqWttdx8|jD].}td |dt |d!|d"|d#fqWttd$x8|j D].}td |dt |d!|d"|d#fqHWttd%x8|j D].}td |dt |d!|d"|d#fqWtd&|jkrtd'|jd&td(|jd)td*|j |jdS),Nrz; <<>> PDG.py 1.0 <<>> %s %srKrr(rzrecurs z ;; options: z;; got answer:z+;; ->>HEADER<<- opcode %s, status %s, id %drstatusrcSs||S)Nr )rr#r r r sz DnsResult.show..rrrrz4;; flags: %s; Ques: %d, Ans: %d, Auth: %d, Addit: %drWrrrrz ;; QUESTIONS:z!;; %s, type = %s, class = %srqtypestr qclassstrz ;; ANSWERS:z%-20s %-6s %-6s %sr|typenamedataz;; AUTHORITY RECORDS:z;; ADDITIONAL RECORDS:elapsedz;; Total query time: %d msecz;; To SERVER: %sZserverz ;; WHEN: %s)rrrrr) timerJrrrYfilterrErrreprrrZctime)r/roptr#rqar r r showsN        zDnsResult.showcCsL|j\ |jd<|jd<|jd<|jd<|jd<|jd<|jd<|jd<|jd <|jd <|jd <|jd <|jd <tj|jd|jd<tj|jd |jd<x(t|jd D]}|jj|j |qWx(t|jd D]}|j j|j |qWx*t|jd D]}|j j|j |qWx*t|jd D]}|j j|j |q,WdS)Nrrrrrrrrrrrrr opcodestrr)rrrrrZ statusstrrDrrCstoreQrstoreRRrr)r/rvrMr r r rspzDnsResult.storeMcCsFi}|j\|d<|d<|d<tj|d|d<tj|d|d<|S)Nrrrrr)rrtypestrrclassstr)r/rvrr r r rs zDnsResult.storeQcCsi}|j\|d<|d<|d<|d<|d<tj|d|d<tj|d|d<d|d}t||rvt|||d <n|j|d|d <|S) NrKrclassr|r~rrz get%sdatar)rrrrrhasattrgetattrr`)r/rvrrr r r rs&  zDnsResult.storeRRN)r r r r1rrrrr r r r rs  )rcCs4|j\}}}td||tj||tj|fdS)Nz%qname=%s, qtype=%d(%s), qclass=%d(%s))rrJrrrr)rvrrrr r r rs  rcCst|j\}}}}}tj|}td||||tj||fd|}t||r`tdt||ntd|j|dS)Nz*name=%s, type=%d(%s), class=%d(%s), ttl=%dz get%sdataz formatted rdata:z binary rdata:) rrrrJrrrrr`)rvrKrr{r|r~rrr r r rs    r__main__) sj        x<4c A  a