6h fSSKJr SrSrSrSSKrSSKrSSKrSSKrSSK r SSK r SSK r SSK r SSK Jr /SQrS\"5S'S rS rS rS rS rSrSrSrSrSrSrSrSrSrSrSr Sr!Sr"Sr#Sr$Sr%Sr&Sr'Sr(Sr)Sr*S r+S!r,Sr-Sr.Sr/Sr0Sr1S"r2S#r3S$r4S%r5S&r6S'r7S(r8S)r9S*r:S+r;S,rS.r?S r@\&S/\'S0\(S1\)S2\*S3\+S40rA0\.S5_\/S6_\0S7_\1S8_\2S9_\3S:_\4S;_\5S<_\6S=_\7S>_\8S?_\9S@_\:SA_\;SB_\SE_\?SF\@S40ErBSGrC"SHSI\D5rE"SJSK\D5rF"SLSM\D5rG"SNSO\D5rH"SPSQ\D5rI"SRSS\D5rJ"STSU\J5rK\RrM\R(a \RrM"SVSW5rP"SXSY\P5rQ"SZS[\P5rR"S\S]\R5rS"S^S_\R5rT"S`Sa\R5rU"SbSc\R5rV"SdSe\R5rW"SfSg5rX"ShSi5rY"SjSk5rZ"SlSm\ R5r\"SnSo5r]"SpSq\ R5r^"SrSs\ R5r_"StSu5r`"SvSw5ra\bSx:Xa\c"Sy\5 \a"5rd\c"Sz5 S{S|S}S~.re\`"SS\R"S5SSS\e5rg\c"S5 \dR\g5 \c"S5 \c"S5 \c"S\i"\dRSS555 \c"S5 \c"S5 \c"S\i"\dRSS555 \c"S5 \c"S5 \dR\g5 \c"S5 \dR5 gg)) annotationssPaul Scott-Murphys!paul at scott dash murphy dot coms0.12N)pycompat)Zeroconf ServiceInfoServiceBrowser _GLOBAL_DONE}iz 224.0.0.251i5iii #iii@ i !sinscsschshssnonesanyasnssmdsmfscnamessoasmbsmgsmrsnullswkssptrshinfosminfosmxstxtsquadassrvc2[R"5S-$)z#Current system time in milliseconds)time9/usr/lib/python3/dist-packages/hgext/zeroconf/Zeroconf.pycurrentTimeMillisr,s 99; r*c\rSrSrSrg)NonLocalNameExceptionr)N__name__ __module__ __qualname____firstlineno____static_attributes__r)r*r+r.r.r*r.c\rSrSrSrg)NonUniqueNameExceptionr)Nr0r)r*r+r8r8r6r*r8c\rSrSrSrg)NamePartTooLongExceptionr)Nr0r)r*r+r;r;r6r*r;c\rSrSrSrg)AbstractMethodExceptionr)Nr0r)r*r+r>r>r6r*r>c\rSrSrSrg)BadTypeInNameExceptionr)Nr0r)r*r+rArAr6r*rAc\rSrSrSrSrg) BadDomainNamec6[RUSU-5 g)Nsat position %s) Exception__init__)selfposs r+rHBadDomainName.__init__s4!2S!89r*r)N)r1r2r3r4rHr5r)r*r+rDrDs:r*rDc\rSrSrSrg)BadDomainNameCircularr)Nr0r)r*r+rMrMr6r*rMc<\rSrSrSrSrSrSrSrSr Sr S r g ) DNSEntryz A DNS entrycUR5UlXlX lU[-UlU[ -S:gUlg)Nr)lowerkeynametype _CLASS_MASKclazz _CLASS_UNIQUEuniquerIrUrVrXs r+rHDNSEntry.__init__s6::<  [( },2 r*c[U[5(aYURUR:H=(a9 URUR:H=(a URUR:H$g)z&Equality test on name, type, and classr) isinstancerPrUrVrXrIothers r+__eq__DNSEntry.__eq__sS eX & & UZZ'.II+.JJ%++-  r*c.URU5(+$zNon-equality testrar_s r+__ne__DNSEntry.__ne__ ;;u%%%r*c@[U$![a SU-s$f=f)zClass accessor?(%s))_CLASSESKeyError)rIrXs r+getClazzDNSEntry.getClazzs+ $E? " $e# # $  c@[U$![a SU-s$f=f) Type accessorrj)_TYPESrl)rIrVs r+getTypeDNSEntry.getTypes* #$<  #d? " #rocSUURUR5URUR54-nUR(aUS- nOUS- nX0R - nUb USU-- nU$US- nU$)1String representation with additional informations%s[%s,%ss-unique,,s,%s]])rsrVrmrXrZrU)rIhdrr`results r+toStringDNSEntry.toStrings  LL # MM$** %   ;; k !F dNF))   go %F  dNF r*)rXrTrUrVrZN) r1r2r3r4__doc__rHrarfrmrsr{r5r)r*r+rPrPs#3&$#r*rPc*\rSrSrSrSrSrSrSrg) DNSQuestioni/zA DNS question entryc[U[5(aURS5nURS5(d [ U5e[ R XX#5 g)Nasciis.local.)r^strencodeendswithr.rPrHr[s r+rHDNSQuestion.__init__2sG dC ;;w'D}}Z(('- -$d2r*cURUR:H=(aS URUR:H=(d UR[:H=(a URUR:H$)z6Returns true if the question is answered by the record)rXrV _TYPE_ANYrU)rIrecs r+ answeredByDNSQuestion.answeredBy9sQ JJ#)) # &chh&@$))y*@ & SXX% r*c0[RUSS5$)String representationsquestionN)rPr{rIs r+__repr__DNSQuestion.__repr__As  {D99r*r)N) r1r2r3r4r}rHrrr5r)r*r+rr/s3 :r*rcZ\rSrSrSrSrSrSrSrSr Sr S r S r S r S rS rSrg) DNSRecordiFz.A DNS record - like a DNS entry, but has a TTLcZ[RXX#5 X@l[5UlgN)rPrHttlr,created)rIrUrVrXrs r+rHDNSRecord.__init__Is!$d2(* r*cX[U[5(a[RX5$g)zTests equality as per DNSRecordr)r^rrPrar_s r+raDNSRecord.__eq__Ns! eY ' '??4/ /r*cZURHnURU5(dM g g)z\Returns true if any answer in a message can suffice for the information held in this record.rr)answerssuppressedByAnswer)rImsgrecords r+ suppressedByDNSRecord.suppressedByTs+kkF&&v.."r*cJX:XaURURS- :agg)zoReturns true if another record has same name, type and class, and if its TTL is at least half of this record's.rrr)rr_s r+rDNSRecord.suppressedByAnswer\s" =UYY$((Q,7r*c>URXR-S--$)zPReturns the time at which this record will have expired by a certain percentage.rrr)rIpercents r+getExpirationTimeDNSRecord.getExpirationTimecs||w1B677r*cD[SURS5U- S- 5$)z%Returns the remaining TTL in seconds.rdr')maxrrInows r+getRemainingTTLDNSRecord.getRemainingTTLhs$1t--c2S8D@AAr*c*URS5U:*$)z(Returns true if this record has expired.rrrs r+ isExpiredDNSRecord.isExpiredls%%c*c11r*c*URS5U:*$)z9Returns true if this record is at least half way expired.2rrs r+isStaleDNSRecord.isStaleps%%b)S00r*cHURUlURUlg)zBSets this record's TTL and created time to that of another record.Nrr_s r+resetTTLDNSRecord.resetTTLts}} 99r*c[e)zAbstract method)r>rIouts r+writeDNSRecord.writezs%%r*cSURUR[55U4-n[R USU5$)rvs%s/%s,%ssrecord)rrr,rPr{)rIryr`args r+r{DNSRecord.toString~sD HH  !2!4 5      y#66r*rN)r1r2r3r4r}rHrarrrrrrrrr{r5r)r*r+rrFs=8+  8 B21 &7r*rc0\rSrSrSrSrSrSrSrSr g) DNSAddressizA DNS address recordc>[RXX#U5 XPlgr)rrHaddress)rIrUrVrXrrs r+rHDNSAddress.__init__s4tC8 r*cbURUR[UR55 gz'Used in constructing an outgoing packetN) writeStringrlenrs r+rDNSAddress.writes  c$,,&78r*c`[U[5(aURUR:H$g)zTests equality on addressr)r^rrr_s r+raDNSAddress.__eq__s% eZ ( (<<5==0 0r*c|[R"UR5$![a URs$f=f)r)socket inet_ntoarrGrs r+rDNSAddress.__repr__s5 ##DLL1 1 <<  s ";;rN r1r2r3r4r}rHrrarr5r)r*r+rrs9  r*rc0\rSrSrSrSrSrSrSrSr g) DNSHinfoizA DNS host information recordcJ[RXX#U5 XPlX`lgr)rrHcpuos)rIrUrVrXrrrs r+rHDNSHinfo.__init__s4tC8r*cURUR[UR55 URUR[UR55 gr)rrrrrs r+rDNSHinfo.writes6 #dhh-0 TWW.r*c[U[5(a9URUR:H=(a URUR:H$g)zTests equality on cpu and osr)r^rrrr_s r+raDNSHinfo.__eq__s7 eX & &88uyy(@TWW-@ @r*c:URS-UR-$)r rrrs r+rDNSHinfo.__repr__sxx$((r*rNrr)r*r+rrs' /  )r*rc0\rSrSrSrSrSrSrSrSr g) DNSPointerizA DNS pointer recordc>[RXX#U5 XPlgr)rrHalias)rIrUrVrXrrs r+rHDNSPointer.__init__s4tC8 r*c:URUR5 gr) writeNamerrs r+rDNSPointer.writes djj!r*c`[U[5(aURUR:H$g)zTests equality on aliasr)r^rrr_s r+raDNSPointer.__eq__s% eZ ( (::, ,r*c:URSUR5$)rr*)r{rrs r+rDNSPointer.__repr__s}}S$**--r*)rNrr)r*r+rrs" .r*rc0\rSrSrSrSrSrSrSrSr g) DNSTextizA DNS text recordc>[RXX#U5 XPlgr)rrHtext)rIrUrVrXrrs r+rHDNSText.__init__s4tC8 r*cbURUR[UR55 gr)rrrrs r+r DNSText.writes  3tyy>2r*c`[U[5(aURUR:H$g)zTests equality on textr)r^rrr_s r+raDNSText.__eq__s% eW % %99 * *r*c[UR5S:a"URSURSSS-5$URSUR5$)rrr*Nr...)rrr{rs r+rDNSText.__repr__sG tyy>B ==diimf&<= ===dii0 0r*rNrr)r*r+rrs3 1r*rc0\rSrSrSrSrSrSrSrSr g) DNSServiceizA DNS service recordc b[RXX#U5 XPlX`lXplXlgr)rrHpriorityweightportserver) rIrUrVrXrrrrrs r+rHDNSService.__init__s(4tC8    r*cURUR5 URUR5 URUR5 UR UR 5 gr) writeShortrrrrrrs r+rDNSService.writesB t}}% t{{# tyy! dkk"r*c [U[5(ayURUR:H=(aY URUR:H=(a9 URUR:H=(a UR UR :H$g)z3Tests equality on priority, weight, port and serverr)r^rrrrrr_s r+raDNSService.__eq__sj eZ ( ( /0KK5<</0II+0KK5<</   r*cXURSSURUR4-5$)rr*s%s:%s)r{rrrs r+rDNSService.__repr__s%}}S(dkk499-E"EFFr*)rrrrNrr)r*r+rrs# Gr*rc`\rSrSrSrSrSrSrSrSr Sr S r S r S r S rS rSrSrg) DNSIncomingi z/Object representation of an incoming DNS packetcSUlXl/Ul/UlSUlSUlSUlSUlUR5 UR5 UR5 g)z/Constructor from string holding bytes of packetrN) offsetdata questionsr numquestions numanswersnumauthoritiesnumadditionals readHeader readQuestions readOthers)rIr s r+rHDNSIncoming.__init__ s[      r*cJSn[R"U5n[R"XRURURU-5nU=RU- slUSUlUSUlUSUlUSUlUSUl USUl g) zReads header portion of packets!HHHHHHrrrrrrN) structcalcsizeunpackr r idflagsrrrrrIformatlengthinfos r+rDNSIncoming.readHeaders(}} IIdkkDKK&,@A  v q'!W  Gq'"1g"1gr*cSn[R"U5n[SUR5HnUR 5n[R "XR URURU-5nU=RU- sl[XESUS5nURRU5 M g![a Mf=f)z!Reads questions section of packets!HHrrN) rrrangerreadNamerr r rrappendr.)rIrrirUr questions r+rDNSIncoming.readQuestions+s(q$++,A==?D== $++ f0DED KK6 !K &t!Wd1g>%%h/-)  s-C CCcSn[R"U5n[R"XRURURU-5nU=RU- slUS$)z Reads an integer from the packet!Irrrrr r rs r+readIntDNSIncoming.readInt<W(}} IIdkkDKK&,@A  v Awr*c[URUR5nU=RS- slURU5$)z(Reads a character string from the packetr)ordr r  readString)rIrs r+readCharacterStringDNSIncoming.readCharacterStringFs6TYYt{{+, q v&&r*cSU-n[R"U5n[R"X RURURU-5nU=RU- slUS$)z0Reads a string of a given length from the packets!%dsrr+)rIrrrr s r+r1DNSIncoming.readStringLs[3(}} IIdkkDKK&,@A  v Awr*cSn[R"U5n[R"XRURURU-5nU=RU- slUS$)z'Reads an unsigned short from the packet!Hrr+rs r+readUnsignedShortDNSIncoming.readUnsignedShortVr.r*c Sn[R"U5nURUR-UR-n[ SU5GH#nUR 5n[R"XRURURU-5nU=RU- sl SnUS[:Xa([XVSUSUSURS55nGOhUS[:Xd US[:Xa'[XVSUSUSUR 55nGO'US[ :Xa*[#XVSUSUSURUS55nOUS[$:XaT['UUSUSUSUR)5UR)5UR)5UR 55nOUS[*:Xa6[-UUSUSUSUR/5UR/55nOLUS[0:Xa'[XVSUSUSURS55nOU=RUS- sl UcGMUR2R5U5 GM& g) z@Reads answers, authorities and additionals section of the packets!HHiHrNrrrrr)rrrrrr#r$rr r _TYPE_Arr1 _TYPE_CNAME _TYPE_PTRr _TYPE_TXTr _TYPE_SRVrr8 _TYPE_HINFOrr2 _TYPE_AAAArr%)rIrrnr&domainr rs r+rDNSIncoming.readOthers`s@( OOd11 1D4G4G Gq!A]]_F== $++ f0DED KK6 !KCAw'! GT!Wd1gtq7IaK'47i+? GT!Wd1gt}}aI%GT!Wd1gttAw7OaI% GGG**,**,**,MMO aK'GGG,,.,,. aJ& GT!Wd1gtr7J tAw&  ##C(qr*c6UR[-[:H$)zReturns true if this is a query)r_FLAGS_QR_MASK_FLAGS_QR_QUERYrs r+isQueryDNSIncoming.isQuerys ^+??r*c6UR[-[:H$)z"Returns true if this is a response)rrF_FLAGS_QR_RESPONSErs r+ isResponseDNSIncoming.isResponses ^+0BBBr*cBURXU-RS5$)z6Reads a UTF-8 string of a given length from the packetutf-8)r decode)rIr rs r+readUTFDNSIncoming.readUTFs yy3,/66w??r*cSnURnSnUn[URX"S-5nUS- nUS:XaOUS-nUS:Xa)SRXR X%5S-45nX%- nORUS:XaAUS:aUS-nUS-S-[URX"S-5-nX$:a [ U5eUnO [ U5eMUS:aX0lU$X lU$) z#Reads a domain name from the packetrr.?r)r r0r joinrQrMrD)rIrzoffnextfirstrts r+r$DNSIncoming.readNameskkdiiAg./C 1HCaxd ADy&,,s*@3*F!GH d!87Dd q(C #a0H,II</44#C((#& 19K K r*) rr rrrrrrr rN)r1r2r3r4r}rHrrr,r2r1r8rrHrLrQr$r5r)r*r+r r  sE9 & "' =)~@C@r*r c|\rSrSrSrSSjrSrSrSrSr Sr S r S r S r S rS rSrSrSrSrSrSrg) DNSOutgoingiz+Object representation of an outgoing packetcSUlSUlX lXl0Ul/UlSUl/Ul/Ul/Ul /Ul g)Nrr) finishedr multicastrnamesr sizerr authorities additionals)rIrrcs r+rHDNSOutgoing.__init__sM "     r*c:URRU5 g)zAdds a questionN)rr%rIrs r+ addQuestionDNSOutgoing.addQuestions f%r*cVURU5(dURUS5 gg)zAdds an answerrN)raddAnswerAtTime)rIinprs r+ addAnswerDNSOutgoing.addAnswers(""3''   +(r*c~Ub:US:XdURU5(dURRX45 ggg)z6Adds an answer if if does not expire by a certain timeNr)rrr%)rIrrs r+rnDNSOutgoing.addAnswerAtTimes=  axv//44 ##VM2 5 r*c:URRU5 g)zAdds an authoritative answerN)rfr%rjs r+addAuthoritativeAnswer"DNSOutgoing.addAuthoritativeAnswer 'r*c:URRU5 g)zAdds an additional answerN)rgr%rjs r+addAdditionalAnswerDNSOutgoing.addAdditionalAnswerrwr*cSnURR[R"U[ U555 U=R S- slg)z"Writes a single byte to the packet!crN)r r%rpackchrrerIvaluers r+ writeByteDNSOutgoing.writeByte5 VSZ89 Q r*cSnURRU[R"X255 U=RS- slg)z=Inserts an unsigned short in a certain position in the packetr7rN)r insertrr}re)rIindexrrs r+ insertShortDNSOutgoing.insertShorts1  F :; Q r*cSnURR[R"X!55 U=RS- slg)z&Writes an unsigned short to the packetr7rN)r r%rr}rers r+rDNSOutgoing.writeShorts/ V34 Q r*cSnURR[R"U[ U555 U=R S- slg)z(Writes an unsigned integer to the packetr*rN)r r%rr}intrers r+writeIntDNSOutgoing.writeIntrr*cS[U5-S-nURR[R"X155 U=R U- slg)zWrites a string to the packet!sN)rr r%rr}re)rIrrrs r+rDNSOutgoing.writeString s>s6{"S( V34 V r*cURS5n[U5nUS:a[eURU5 UR X#5 g)z5Writes a UTF-8 string of a given length to the packetrOrN)rrr;rr)rIrutfstrrs r+writeUTFDNSOutgoing.writeUTFs@'"V B;* * v (r*cZURUnUR US- S-5 UR U5 g![af URURU'URS5nUSS:XaUSSnUHnUR U5 M UR S5 gf=f)z"Writes a domain name to the packet.rUr*NrrrV)rdrlresplitrr)rIrUrpartsparts r+rDNSOutgoing.writeNames JJt$E"  d*+ u#  $yyDJJt JJt$ERyCcr  d# NN1   s:A-B*)B*cURUR5 URUR5 URUR5 g)zWrites a question to the packetN)rrUrrVrX)rIr's r+ writeQuestionDNSOutgoing.writeQuestion6s2 x}}%  & 'r*cURUR5 URUR5 UR(a4UR (a#URUR [-5 OURUR 5 US:XaURUR5 O URURU55 [UR5nU=RS- sl URU5 U=RS-sl [SRURUS55nUR!X45 g)zHWrites a record (answer, authoritative answer, additional) to the packetrrr*N)rrUrrVrZrcrXrYrrrrr rerrYr)rIrrrrs r+ writeRecordDNSOutgoing.writeRecord<s v{{#  $ ==T^^ OOFLL=8 9 OOFLL ) !8 MM&** % MM&005 6DII Q  T Q SXXdii/01 'r*crUR(GdSUlURHnURU5 M URHup#UR X#5 M UR HnUR US5 M UR HnUR US5 M URS[UR 55 URS[UR 55 URS[UR55 URS[UR55 URSUR5 UR(aURSS5 OURSUR5 SRUR5$)zqReturns a string containing the packet's bytes No further parts should be added to the packet once this is done.rrr*)rbrrrrrfrgrrrrcrrYr )rIr'answertime_ authority additionals r+packetDNSOutgoing.packetSsJ }}}DM NN""8,+!%   /".!--   A.."..   Q//   QD$4$4 5 6   QD$4$4 5 6   QDLL 1 2   QDNN 3 4   Q +~~  A&  DGG,xx ""r*) rgrrfr rbrrrcrdrreN)r)r1r2r3r4r}rHrkrprnruryrrrrrrrrrrr5r)r*r+r`r`sU5 &, 3 ((     )4( (.#r*r`cB\rSrSrSrSrSrSrSrSr Sr S r S r g ) DNSCacheiozA cache of DNS entriesc0Ulgrcachers r+rHDNSCache.__init__rs  r*cURURnURU5 g![a /=o RUR'N8f=f)z Adds an entryN)rrTrlr%rIentrylists r+add DNSCache.addusM .::eii(D E .+- -D::eii( .s-$AAczURURnURU5 g![a gf=f)zRemoves an entryN)rrTremoverlrs r+rDNSCache.remove}s7 ::eii(D KK    s *- ::cURURnX"RU5$![[4a gf=f)zFGets an entry by key. Will return None if there is no matching entry.N)rrTrrl ValueErrorrs r+get DNSCache.getsB ::eii(D 5)* **%  s+.AAc<[XU5nURU5$)zJGets an entry by details. Will return None if there is no matching entry.)rPr)rIrUrVrXrs r+ getByDetailsDNSCache.getByDetailssU+xxr*cFURU$![a /s$f=f)z5Returns a list of entries whose key matches the name.)rrl)rIrUs r+entriesWithNameDNSCache.entriesWithNames* ::d# # I s   c[[RRURR 555$![ a /s$f=f)zReturns a list of all entries)r itertoolschain from_iterablervaluesrGrs r+entriesDNSCache.entriessB  55djj6G6G6IJK K I s?A AArN) r1r2r3r4r}rHrrrrrrr5r)r*r+rros(  r*rc<\rSrSrSrSrSrSrSrSr Sr S r g ) EngineiaGAn engine wraps read access to sockets, allowing objects that need to receive data from sockets to be called back when the sockets are ready. A reader needs a handle_read() method, which is called when the socket it is interested in is ready for reading. Writers are not implemented here, because we only send short packets. c[RRU5 Xl0UlSUl[R "5UlUR5 g)Nr) threadingThreadrHzeroconfreaderstimeout Condition conditionstartrIrs r+rHEngine.__init__sB!!$'   ",,. r*cv[5S(dUR5n[U5S:XaZURR 5 URR UR 5 URR5 ON[R"U//UR 5up#nUH!nURUR5 M# [5S(dMgg![a. [5S(d[R"5 MoMrf=f![a N]f=f)Nrr)globals getReadersrracquirewaitrreleaseselectr handle_readrG traceback print_exc)rIrsrrwrersocks r+run Engine.runs)N+"B2w!|&&(##DLL1&&( !'r2r4<  % V   r*cURR5 URU URR5 URR 5 grr)rIrs r+ delReaderEngine.delReaders>  LL    r*cURR5 URR5 URR5 gr)rrrrrs r+r Engine.notifys2     r*)rrrrN) r1r2r3r4r}rHrrrrrr5r)r*r+rrs% , ! ! !r*rc$\rSrSrSrSrSrSrg)Listeneria$A Listener is used by this module to listen on the multicast group to which DNS messages are sent, allowing the implementation to cache information as it arrives. It requires registration with an Engine object in order to have the read() method called when a socket is available for reading.cXlURRRXRR5 gr)renginerrrs r+rHListener.__init__s)  &&t]]-A-ABr*cNURRnUR[5unup4X l[U5nUR5(a}U[:Xa&URRU[[5 gU[:XaBURRXcU5 URRU[[5 ggURRU5 g![a)nUR [ R :XaSnAgeSnAff=fr)rrrecvfrom_MAX_MSG_ABSOLUTEOSErrorerrnoEBADFr r rH _MDNS_PORT handleQuery _MDNS_ADDR _DNS_PORThandleResponse)rIrr addrrers r+rListener.handle_reads}}## !%/@!A D,4 $ ;;==z! ))#z:F" ))#T: ))#z:F# MM ( ( -) ww%++%  sC11 D$;DDD$)r rN)r1r2r3r4r}rHrr5r)r*r+rrsHC.r*rc$\rSrSrSrSrSrSrg)Reaperi zJA Reaper is used by this module to remove cache entries that have expired.cn[RRU5 XlUR 5 gr)rrrHrrrs r+rHReaper.__init__s$!!$'  r*c~URRS5 [5S(ag[5nURRR 5H[nUR U5(dMURRX5 URRRU5 M] M)Ni'r) rrrr,rrr updateRecordr)rIrrs r+r Reaper.runs MM  y )y(#%C----557##C((MM..s;MM''..v68 r*)rN)r1r2r3r4r}rHrr5r)r*r+r r  s 7r*r c0\rSrSrSrSrSrSrSrSr g) ri!zUsed to browse for a service of a specific type. The listener object will have its addService() and removeService() methods called when this browser discovers changes in the services availability.cV[RRU5 XlX lX0l0Ul[5Ul[Ul /Ul SUl URRU[UR[[ 55 UR#5 g)z%Creates a browser for a specific typerN)rrrHrrVlistenerservicesr,nexttime _BROWSER_TIMEdelayrdone addListenerrr= _CLASS_INr)rIrrVrs r+rHServiceBrowser.__init__(sz!!$'    )+ "    !! +diiI>  r*c^^TR[:XaTRTR:XaTRU5nTRTR R 5nU(dURT5 OHTRTR R 5 UU4SjnTRRU5 gTRS5nUTR:aUTl gggg![aS U(dITTRTR R 5'UU4SjnTRRU5 Nf=f)zzCallback invoked by Zeroconf when new information arrives. Updates information required by browser in the Zeroconf cache.cf>TRRUTRTR5$r)r removeServicerVrxrrIs r+-ServiceBrowser.updateRecord..Fs#)D)D499fll*r*Ncf>TRRUTRTR5$r)r addServicerVrrs r+r!r"Ns#)A)A499fll*r*K) rVr=rUrrrrSrrr%rGrr)rIrrrexpired oldrecordcallbackexpiress` ` r+rServiceBrowser.updateRecord:s ;;) # tyy(@&&s+G / MM&,,*<*<*>? &&v. fll&8&8&:; HII$$X...r2G& ' '-)A # /:@DMM&,,"4"4"67 HII$$X.  /s?C7AC77AEEcFSUlURR5 g)Nr)rr notifyAllrs r+cancelServiceBrowser.cancelWs  !r*cxSn[5n[UR5S:Xa8URU:a(URR URU- 5 [ 5S(dUR(ag[5nURU::a[[5nUR[UR[[55 URR!5H,nUR#U5(aMUR%XB5 M. URR'U5 X R(-Ul[+SUR(S-5Ul[UR5S:aURR-S5nUbU"UR5 GM)Nrri Nr)r,rrrrrrrr`rGrkrrVr=rrrrrnsendrminpop)rIeventrrrs r+rServiceBrowser.run[s9E#%C499~"t}}s': ""4==3#67y(DII#%C}}#!/2 DIIy) LM"mm224F!++C00++F85 ""3' #jj 0  DJJN; 499~! a( dmm$/r*)rrrrrrrVrN) r1r2r3r4r}rHrr-rr5r)r*r+rr!s7 $(:"%r*rc\rSrSrSrSSjrSrSrSrSr S r S r S r S r S rSrSrSrSrSrSrSrSrg)rivzService informationNc URU5(d[eXlX lX0lX@lXPlX`lU(aXlOX lURU5 g)aCreate a service description. type: fully qualified service type name name: fully qualified service name address: IP address as unsigned short, network byte order port: port that the service runs on weight: weight of the service priority: priority of the service properties: dictionary of properties (or a string holding the bytes for the text field) server: fully qualified name for service host (defaults to name)N) rrArVrUrrrrr setProperties) rIrVrUrrrr propertiesrs r+rHServiceInfo.__init__ysR.}}T""( (       KK :&r*c [U[5(aXl/nSnUHjnXnUcSnO<[U[5(aUnO$[U[5(a U(aSnOSnOSnUR SR XF455 Ml UHInSR U[R"S[R"[U555U45nMK X0l gXl g)z7Sets properties and text of this info from a dictionaryr*Ntruefalse=r|) r^dictr8rrr%rYrr}rbytechrrr)rIr8rrzrTrsuffixitems r+r7ServiceInfo.setPropertiess j$ ' '(ODF!"= Fs++"Fs++!(!) F DIIsm45" E8+;+;CI+FGI"Ir*cXl0n[U5nSn/nXC:a2[X5nUS- nURXXF-5 XF- nXC:aM2UHdnUR S5nUS:XaUn Sn O$USUn XxS-Sn U S:XaSn OU S:XdU (dSn U (dMLUR U 5bM`XU 'Mf X lg![a [R"5 SUlgf=f)z+Sets properties and text given a text fieldrrr=rUNr;r<) rrr0r%findrr8rGrr) rIrrzendrstrsrreindexrTrs r+setTextServiceInfo.setTexts  #Fd)CED+T[)  D89 + R<CEGV*CqjlOE' !(*% !36::c?2"'3K!$%O #    !"DO #s%ACA CC2C&C*)C*cUR$)rq)rVrs r+rsServiceInfo.getType yyr*cURbhURRSUR-5(a;URS[UR5[UR5- S- $UR$)z Name accessorNrr)rVrUrrrs r+getNameServiceInfo.getNames_ 99 TYY%7%7tyy8H%I%I99Bs499~DII>BC Cyyr*cUR$)zAddress accessorrrs r+ getAddressServiceInfo.getAddresss ||r*cUR$)z Port accessor)rrs r+getPortServiceInfo.getPortrLr*cUR$)zPriority accessor)rrs r+ getPriorityServiceInfo.getPrioritys }}r*cUR$)zWeight accessor)rrs r+ getWeightServiceInfo.getWeight {{r*cUR$)zProperties accessor)r8rs r+ getPropertiesServiceInfo.getPropertiess r*cUR$)z Text accessorrrs r+getTextServiceInfo.getTextrLr*cUR$)zServer accessor)rrs r+ getServerServiceInfo.getServerr\r*c UGbYURU5(GdAUR[:Xa-URUR:XaUR UlggUR[ :XaURUR:XaURUlURUlURUlURUl URUUURRUR[[55 ggUR[:Xa7URUR:XaURUR 5 ggggg)z-Updates service information from a DNS recordN)rrVr;rUrrr?rrrrrrrr>rHr)rIrrrs r+rServiceInfo.updateRecord s  f&6&6s&;&;{{g%;;$++-#)>>DL. );;$))+"(--DK & DI"(--DK$*OODM%%  33 KK) , );;$))+LL-,*''< r*c [5n[nX4-nX2-nSnURU[UR[ [ 55 URbURbURGcXc::aURU5 gXS::Ga}[[5nUR[UR[[ 55 URUR R#UR[[ 5U5 UR[UR[$[ 55 URUR R#UR[$[ 5U5 URbmUR[UR[&[ 55 URUR R#UR[&[ 5U5 UR)U5 X4-nUS-nUR+[-XV5U- 5 [5nURcGMURcGMURcGMSnURU5 U$!URU5 f=f)zqReturns true if the service could be discovered on the network, and updates this object with details discovered. FrrT)r,_LISTENER_TIMErrrUrrrrrremoveListenerr`rGrkr?rnrrr>r;r0rr1) rIrrrrr[lastrzrs r+requestServiceInfo.request"s !{}/ *  k$))Y B  #t||';tyy?P;N  # #D )M;%o6COO#DIIy)D'' 33 IIy)  OO#DIIy)D'' 33 IIy)  {{.' WiH++$NN77 $ Wi  MM#&;D!AIE c$o34')O #t||';tyy?PPF  # #D )   # #D )s%AI: F7I: I: I:%I::J c`[U[5(aURUR:H$g)zTests equality of service namer)r^rrUr_s r+raServiceInfo.__eq__^s% e[ ) )::* *r*c.URU5(+$rdrer_s r+rfServiceInfo.__ne__drhr*c*SUR[R"UR55UR4-nUR cUS- nO<[ UR 5S:aXR - nOXR SSS-- nUS- nU$)rsservice[%s,%s:%s,NsNonerrx)rUrrrQrrrrs r+rServiceInfo.__repr__hs% II   T__. / II)   99  g F499~"))#))CR.611$ r*) rrUrrr8rrrVr)NNrrNN)r1r2r3r4r}rHr7rHrsrNrQrTrWrZr^rardrrlrarfrr5r)r*r+rrvsr  #'J#@##J .2:x &r*rc\rSrSrSrSSjrSrSrSrSr SS jr S r S r \ 4S jrS rSrSrSrSrSrSrSr\\4SjrSrSrg)rizzyImplementation of Zeroconf Multicast DNS Service Discovery Supports registration, unregistration, queries and browsing. NcS[5S'Uc/[R"[R"55UlOXlS[ 4Ul[R"[R[R5UlURR[R[RS5 URR[R[RS5 URR[[RS5 URR[[R S5 URR#UR 5 URR[[R$[R&"[(5[R&"S5-5 /Ul/Ul0Ul0Ul[35Ul[6R8"5Ul[=U5Ul[AU5Ul![EU5Ul#g![a GNef=f![a Nf=f) zpCreates an instance of the Zeroconf class, establishing multicast communications, listening and reaping threads.rrNr*r0.0.0.0)$rr gethostbyname gethostnameintfrgroupAF_INET SOCK_DGRAM setsockopt SOL_SOCKET SO_REUSEADDR SO_REUSEPORTrG_SOL_IPIP_MULTICAST_TTLIP_MULTICAST_LOOPbindIP_ADD_MEMBERSHIP inet_atonr listenersbrowsersr servicetypesrrrrrrrrrr reaper)rI bindaddresss r+rHZeroconf.__init__s%& .!  ,,V-?-?-ABDI#I:& mmFNNF4E4EF   KK " "6#4#4f6I6I1 M KK " "6#4#4f6I6I1 M w(?(?I w(@(@'J  KK  TZZ (    $ $   Z (6+;+;I+F F   Z ",,.Tl   Tl I      s% A2I%I' I$#I$' I43I4c8URRS5$)Ns 127.0.0.1r} startswithrs r+ isLoopbackZeroconf.isLoopbacksyy##L11r*c8URRS5$)Ns169.254.rrs r+ isLinklocalZeroconf.isLinklocalsyy##K00r*cURR5 URRUS- 5 URR5 g)zJCalling thread waits for a given number of milliseconds or until notified.r'N)rrrr)rIrs r+r Zeroconf.waits:   GdN+  r*cURR5 URR5 URR5 g)zNotifies all waiting threadsN)rr notify_allrrs r+r,Zeroconf.notifyAlls2   !!#  r*cJ[X5nURX5(aU$g)zReturns network's service information for a particular name and type, or None if no service matches by the timeout, which defaults to 3 seconds.N)rrl)rIrVrUrr s r+getServiceInfoZeroconf.getServiceInfos%4& << & &Kr*cpURU5 URR[XU55 g)zAdds a listener for a particular service type. This object will then have its updateRecord method called when information arrives for that type.N)removeServiceListenerrr%r)rIrVrs r+addServiceListenerZeroconf.addServiceListeners+ ""8, ^DABr*cpURH&nURU:XdMUR5 AM( g)zrrrr;r0_REGISTER_TIME)rIr rrrr&rs r+registerServiceZeroconf.registerServices $+/ diioo'( 99)) )   dii (A - (+,D  dii (! !e~ (.)')09<=C   499iCKQ    IIMMKKIIKK      9iiiH! ||## Will  IIcN FA  &HE!eer*c LURURR5 URURS:a"URUR==S-ss'OURUR [ 5nUnSnUS:GaX#:aURX2- 5 [ 5nM+[[[-5nUR[UR[[SUR5S5 UR[UR[ [SUR"UR$UR&UR5S5 UR[)UR[*[SUR,5S5 UR.(a;UR[1UR2[4[SUR.5S5 UR7U5 US- nU[8- nUS:aGMgg![ a GNf=f)zUnregister a service.rrrN)rrUrSrrVrlr,rr`rKrrnrr=rrr?rrrrr>rrrrr;r0_UNREGISTER_TIME)rIr rrr&rs r+unregisterServiceZeroconf.unregisterServices  diioo/0  +a/!!$)),1,%%dii0 ! !e~ (.)')09<=C   499iAtyyI1    IIMMKKIIII      9iDIIF ||## WiDLL  IIcN FA ( (HE!ee    sA#H&H H#"H#c [UR5S:Ga[5nUnSnUS:GaX:aURX!- 5 [5nM+[ [ [ -5nURR5GH$nUR[UR[[SUR5S5 UR[UR[[SUR UR"UR$UR&5S5 UR[)UR[*[SUR,5S5 UR.(dMUR[1UR&[2[SUR.5S5 GM' UR5U5 US- nU[6- nUS:aGMggg)z#Unregister all registered services.rrrN)rrr,rr`rKrrrnrrVr=rrUrr?rrrrrr>rrrr;r0r)rIrrr&rr s r+unregisterAllServicesZeroconf.unregisterAllServices@s~ t}}  !#%CHAa%>IIhn-+-C!"4y"@A MM002D''" IIy)Q   ''" II%% MM KK II KK  '' 9iDIIN|||++& $ WiDLL 33> #Q,,Oa%% "r*c [5nUnSnUS:GaURRUR5HnUR[:XdMUR U5(aM1UR UR:XdMMURRS5S:aISURURURUR4-UlURU5 g[e X#:a URX2- 5 [5nGM[[[ -5nX`lUR%['UR[[(55 UR+[-UR[[([.UR55 UR1U5 US- nU[2- nUS:aGMgg)zfChecks the network for a unique service name, modifying the ServiceInfo passed in if it is not unique.rrrs %s.[%s:%d].%sNr)r,rrrVr=rrrUrDrrrr8rr`rGrdebugrkrrrur_DNS_TTLr0 _CHECK_TIME)rIr rrr&rrs r+rZeroconf.checkServiceosa ! !e**44TYY?KK9,",,S11  1yy~~d+a/$4 II LL II II 8% ))$/00@ ~ (.)')o 9:CJ OOK 9iH I  & &499iHdiiP  IIcN FA  #H;!eer*cP[5nURRU5 UbnURR UR 5HEnUR U5(dMURU5(aM3URXU5 MG UR5 g)zAdds a listener for a given question. The listener will have its updateRecord method called when information is available to answer the question.N) r,rr%rrrUrrrr,)rIrr'rrs r+rZeroconf.addListeners ! h'  **44X]]C&&v..v7G7G7L7L))$V<D r*c|URRU5 UR5 g![a gf=f)zRemoves a listener.N)rrr,rG)rIrs r+rjZeroconf.removeListeners5  NN ! !( + NN    s +. ;;cnURHnURXU5 M UR5 g)zFUsed to notify listeners of new information that has updated a record.N)rrr,)rIrrrs r+rZeroconf.updateRecords,H  ! !$S 1' r*c[5nURHnURU5nX0RR 5;aUU(aURR U5 OMURR U5nUbURU5 UnOURRU5 URX#5 M g)zdDeal with incoming response packets. All answers are held in the cache, and listeners are notified.N) r,rrrrrrrrr)rIrrrr&rs r+rZeroconf.handleResponses !kkF&&s+G++--JJ%%f- JJNN62E(v.!& v&   c *"r*cSnU[:wa;[[[-S5nURHnUR U5 M URGHnUR [:XGa URS:XaeURR5HGnUc[[[-5nURU[S[[[U55 MI URR!5HwnURUR :XdMUc[[[-5nURU[UR [[[UR55 My GM&Uc[[[-5nUR [":XdUR [$:XaURR!5HsnUR&URR)5:XdM-URU[+UR["[[,-[UR.55 Mu URR1URR)5S5nU(dGM7UR [2:XdUR [$:XagURU[5UR[2[[,-[UR6UR8UR:UR&55 UR [<:XdUR [$:XaFURU[?UR[<[[,-[UR@55 UR [2:XaHURC[+UR&["[[,-[UR.55 GMGM Ub6URJ(a$URLUl&UROXBU5 ggg![Da [FRH"5 GMf=f)zCDeal with incoming query packets. Provides a response if possible.Nrs_services._dns-sd._udp.local.)(rr`rKrrrkrVr=rUrrrprrrrrr;rrrSrrYrrr?rrrrr>rrryrGrrrrr0)rIrrrrr'stypeservices r+rZeroconf.handleQuerys* : 09#mm// 0C0C0EtLG" }} 1X]]i5O & ( ) )M 9 ( ' 0 0 ' ' '   }} 1X]]i5O # ( ) )M 9 ( '   }} 1//& ' ' )M 9 ( ' 2_&x ?s{{VVCF IIc & +?!*''))*s!;BP#BP# EP##QQc~URRUR5SX#45 g![a gf=f)zSends an outgoing packet.rN)rsendtorrG)rIrrrs r+r0 Zeroconf.send.s7  KK  szz|Q =   s ,/ <<c[5SS:XaS[5S'UR5 URR5 UR 5 UR R [[ R[ R"[5[ R"S5-5 UR R5 gg)zVEnds the background threads, and prevent this instance from servicing further queries.rrrrzN) rr,rrrrrrIP_DROP_MEMBERSHIPrrclosers r+rZeroconf.close8s 9^ $ )()GIn % NN  KK    & & ( KK " "))  ,v/?/? /JJ  KK    *r*) rrrrrr~r}rrrrrrr)i )r1r2r3r4r}rHrrrr,rrrrrrrrrrjrrrrrr0rr5r)r*r+rrzsz 1#f21!! C)10'd/)b--^#$J +&j'X(j  r*r__main__s3Multicast DNS Service Discovery for Python, versions'1. Testing registration of a service...s0.10s test values another value)sversionr%bs_http._tcp.local.s!My Service Name._http._tcp.local.z 127.0.0.1is Registering service...s Registration done.s*2. Testing query of service information...s Getting ZOE service:sZOE._http._tcp.local.s Query done.s"3. Testing query of own service...s Getting self:s/4. Testing unregister of service information...s Unregister done.)m __future__r __author__ __email__ __version__rrrrrrr(r mercurialr__all__rrrrrirrrrr_MAX_MSG_TYPICALrrFrGrKr _FLAGS_TC _FLAGS_RD _FLAGS_RA_FLAGS_Z _FLAGS_AD _FLAGS_CDr _CLASS_CS _CLASS_CH _CLASS_HS _CLASS_NONE _CLASS_ANYrWrYr;_TYPE_NS_TYPE_MD_TYPE_MFr< _TYPE_SOA_TYPE_MB_TYPE_MG_TYPE_MR _TYPE_NULL _TYPE_WKSr=r@ _TYPE_MINFO_TYPE_MXr>rAr?rrkrrr,rGr.r8r;r>rArDrMSOL_IPr iswindows IPPROTO_IPrPrrrrrrrr r`rrrrr rrrr1printrdescrr rrrrrr)r*r+rs"0IO J;.# @4C " 0     7 .                                  u u u u    T  e  e  e      v   e  e  e  v v    e  v! "# $v v' 2 I  Y  y  i  Y :I:  M --  G66r:(:.?7?7D  2)y)0..,1i12GGBAAH_#_#D11h?!Y  ?!D$.$.N7Y  7*R%Y%%R%jAAHK K b z @+N A 45}