403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /lib64/python3.9/site-packages/hgext/zeroconf/__pycache__/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /lib64/python3.9/site-packages/hgext/zeroconf/__pycache__/Zeroconf.cpython-39.opt-1.pyc
a

�+�b��&@sddlmZmZdZdZdZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlmZgd�Zde�d<d	Zd
ZdZdZd
ZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+d Z,d!Z-dZ.dZ/dZ0dZ1dZ2d"Z3d#Z4d$Z5d%Z6d&Z7d'Z8d(Z9d)Z:d*Z;d+Z<d,Z=dZ>d-Z?d.Z@d ZAe'd/e(d0e)d1e*d2e+d3e,d4iZBe/d5e0d6e1d7e2d8e3d9e4d:e5d;e6d<e7d=e8d>e9d?e:d@e;dAe<dBe=dCe>dDe?dEe@dFeAd4iZCdGdH�ZDGdIdJ�dJeE�ZFGdKdL�dLeE�ZGGdMdN�dNeE�ZHGdOdP�dPeE�ZIGdQdR�dReE�ZJGdSdT�dTeE�ZKGdUdV�dVeK�ZLGdWdX�dXeM�ZNGdYdZ�dZeN�ZOGd[d\�d\eN�ZPGd]d^�d^eP�ZQGd_d`�d`eP�ZRGdadb�dbeP�ZSGdcdd�ddeP�ZTGdedf�dfeP�ZUGdgdh�dheM�ZVGdidj�djeM�ZWGdkdl�dleM�ZXGdmdn�dnejY�ZZGdodp�dpeM�Z[Gdqdr�drejY�Z\Gdsdt�dtejY�Z]Gdudv�dveM�Z^Gdwdx�dxeM�Z_e`dyk�readze�e_�Zbead{�d|d}d~d�Zce^d�d�e	�dd��d�ddec�Zeead��eb�fee�ead��ead��ead�egeb�hd�d����ead��ead��ead�egeb�hd�d����ead��ead��eb�iee�ead��eb�j�dS)��)�absolute_import�print_functionsPaul Scott-Murphys!paul at scott dash murphy dot coms0.12N)�pycompat)sZeroconfsServiceInfosServiceBrowser�_GLOBAL_DONE�}�����i�z224.0.0.251i��5ii�i#i�ii��@� �������i������	�
���
����!sinscsschshssnonesany�asnssmdsmfscnamessoasmbsmgsmrsnullswkssptrshinfosminfosmxstxtsquadassrvcCst��dS)z#Current system time in milliseconds��)�time�r%r%�=/usr/lib64/python3.9/site-packages/hgext/zeroconf/Zeroconf.py�currentTimeMillis�sr'c@seZdZdS)�NonLocalNameExceptionN��__name__�
__module__�__qualname__r%r%r%r&r(�sr(c@seZdZdS)�NonUniqueNameExceptionNr)r%r%r%r&r-�sr-c@seZdZdS)�NamePartTooLongExceptionNr)r%r%r%r&r.�sr.c@seZdZdS)�AbstractMethodExceptionNr)r%r%r%r&r/�sr/c@seZdZdS)�BadTypeInNameExceptionNr)r%r%r%r&r0�sr0c@seZdZdd�ZdS)�
BadDomainNamecCst�|d|�dS)Nsat position %s)�	Exception�__init__)�self�posr%r%r&r3�szBadDomainName.__init__N)r*r+r,r3r%r%r%r&r1�sr1c@seZdZdS)�BadDomainNameCircularNr)r%r%r%r&r6�sr6c@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)�DNSEntryzA DNS entrycCs2|��|_||_||_|t@|_|t@dk|_dS)Nr)�lower�key�name�type�_CLASS_MASK�clazz�
_CLASS_UNIQUE�unique�r4r:r;r=r%r%r&r3�s


zDNSEntry.__init__cCs2t|t�r.|j|jko,|j|jko,|j|jkSdS)z&Equality test on name, type, and classr)�
isinstancer7r:r;r=�r4�otherr%r%r&�__eq__�s

�
�zDNSEntry.__eq__cCs|�|�S�zNon-equality test�rDrBr%r%r&�__ne__szDNSEntry.__ne__cCs*z
t|WSty$d|YS0dS)zClass accessor�?(%s)N)�_CLASSES�KeyError)r4r=r%r%r&�getClazzs
zDNSEntry.getClazzcCs*z
t|WSty$d|YS0dS)�
Type accessorrHN)�_TYPESrJ)r4r;r%r%r&�getTypes
zDNSEntry.getTypecCsbd||�|j�|�|j�f}|jr.|d7}n|d7}||j7}|durV|d|7}n|d7}|S)�1String representation with additional informations%s[%s,%ss-unique,�,Ns,%s]�])rNr;rKr=r?r:)r4ZhdrrC�resultr%r%r&�toStrings

�

zDNSEntry.toStringN)
r*r+r,�__doc__r3rDrGrKrNrSr%r%r%r&r7�s
r7c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�DNSQuestionzA DNS question entrycCs@tjrt|t�r|�d�}|�d�s,t|��t�||||�dS)N�asciis.local.)	rZispy3rA�str�encode�endswithr(r7r3r@r%r%r&r3(s


zDNSQuestion.__init__cCs.|j|jko,|j|jks"|jtko,|j|jkS)z6Returns true if the question is answered by the record)r=r;�	_TYPE_ANYr:)r4�recr%r%r&�
answeredBy/s
�
�zDNSQuestion.answeredBycCst�|dd�S)�String representationsquestionN)r7rS�r4r%r%r&�__repr__7szDNSQuestion.__repr__N)r*r+r,rTr3r\r_r%r%r%r&rU%srUc@sheZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS)�	DNSRecordz.A DNS record - like a DNS entry, but has a TTLcCs"t�||||�||_t�|_dS�N)r7r3�ttlr'�created)r4r:r;r=rbr%r%r&r3?szDNSRecord.__init__cCst|t�rt�||�SdS)zTests equality as per DNSRecordr)rAr`r7rDrBr%r%r&rDDs
zDNSRecord.__eq__cCs |jD]}|�|�rdSqdS)zdReturns true if any answer in a message can suffice for the
        information held in this record.rr)�answers�suppressedByAnswer)r4�msg�recordr%r%r&�suppressedByJs

zDNSRecord.suppressedBycCs ||kr|j|jdkrdSdS)zwReturns true if another record has same name, type and class,
        and if its TTL is at least half of this record's.rrr)rbrBr%r%r&reRszDNSRecord.suppressedByAnswercCs|j||jdS)zXReturns the time at which this record will have expired
        by a certain percentage.r�rcrb)r4�percentr%r%r&�getExpirationTimeYszDNSRecord.getExpirationTimecCstd|�d�|d�S)z%Returns the remaining TTL in seconds.r�dr#)�maxrk�r4�nowr%r%r&�getRemainingTTL^szDNSRecord.getRemainingTTLcCs|�d�|kS)z(Returns true if this record has expired.rl�rkrnr%r%r&�	isExpiredbszDNSRecord.isExpiredcCs|�d�|kS)z9Returns true if this record is at least half way expired.�2rqrnr%r%r&�isStalefszDNSRecord.isStalecCs|j|_|j|_dS)zJSets this record's TTL and created time to that of
        another record.NrirBr%r%r&�resetTTLjszDNSRecord.resetTTLcCst�dS)zAbstract methodN)r/�r4�outr%r%r&�writepszDNSRecord.writecCs&d|j|�t��|f}t�|d|�S)rOs%s/%s,%ssrecord)rbrpr'r7rS)r4rC�argr%r%r&rSts
�zDNSRecord.toStringN)r*r+r,rTr3rDrhrerkrprrrtrurxrSr%r%r%r&r`<sr`c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�
DNSAddresszA DNS address recordcCst�|||||�||_dSra)r`r3�address)r4r:r;r=rbr{r%r%r&r3�szDNSAddress.__init__cCs|�|jt|j��dS�z'Used in constructing an outgoing packetN)�writeStringr{�lenrvr%r%r&rx�szDNSAddress.writecCst|t�r|j|jkSdS)zTests equality on addressr)rArzr{rBr%r%r&rD�s
zDNSAddress.__eq__cCs,zt�|j�WSty&|jYS0dS)r]N)�socket�	inet_ntoar{r2r^r%r%r&r_�szDNSAddress.__repr__N�r*r+r,rTr3rxrDr_r%r%r%r&rz~s
rzc@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�DNSHinfozA DNS host information recordcCs"t�|||||�||_||_dSra)r`r3�cpu�os)r4r:r;r=rbr�r�r%r%r&r3�szDNSHinfo.__init__cCs,|�|jt|j��|�|jt|j��dSr|)r}r�r~r�rvr%r%r&rx�szDNSHinfo.writecCs&t|t�r"|j|jko |j|jkSdS)zTests equality on cpu and osr)rAr�r�r�rBr%r%r&rD�s
zDNSHinfo.__eq__cCs|jd|jS)r]� )r�r�r^r%r%r&r_�szDNSHinfo.__repr__Nr�r%r%r%r&r��s
r�c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�
DNSPointerzA DNS pointer recordcCst�|||||�||_dSra)r`r3�alias)r4r:r;r=rbr�r%r%r&r3�szDNSPointer.__init__cCs|�|j�dSr|)�	writeNamer�rvr%r%r&rx�szDNSPointer.writecCst|t�r|j|jkSdS)zTests equality on aliasr)rAr�r�rBr%r%r&rD�s
zDNSPointer.__eq__cCs|�|j�S)r])rSr�r^r%r%r&r_�szDNSPointer.__repr__Nr�r%r%r%r&r��s
r�c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�DNSTextzA DNS text recordcCst�|||||�||_dSra)r`r3�text)r4r:r;r=rbr�r%r%r&r3�szDNSText.__init__cCs|�|jt|j��dSr|)r}r�r~rvr%r%r&rx�sz
DNSText.writecCst|t�r|j|jkSdS)zTests equality on textr)rAr�r�rBr%r%r&rD�s
zDNSText.__eq__cCs6t|j�dkr&|�|jdd�d�S|�|j�SdS)r]rNr�...)r~r�rSr^r%r%r&r_�szDNSText.__repr__Nr�r%r%r%r&r��s
r�c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�
DNSServicezA DNS service recordc		Cs.t�|||||�||_||_||_||_dSra)r`r3�priority�weight�port�server)	r4r:r;r=rbr�r�r�r�r%r%r&r3�s
zDNSService.__init__cCs4|�|j�|�|j�|�|j�|�|j�dSr|)�
writeShortr�r�r�r�r�rvr%r%r&rx�szDNSService.writecCs>t|t�r:|j|jko8|j|jko8|j|jko8|j|jkSdS)z3Tests equality on priority, weight, port and serverr)rAr�r�r�r�r�rBr%r%r&rD�s

�
�
�zDNSService.__eq__cCs|�d|j|jf�S)r]s%s:%s)rSr�r�r^r%r%r&r_�szDNSService.__repr__Nr�r%r%r%r&r��s
r�c@speZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�ZdS)�DNSIncomingz/Object representation of an incoming DNS packetcCsLd|_||_g|_g|_d|_d|_d|_d|_|��|�	�|�
�dS)z/Constructor from string holding bytes of packetrN)�offset�data�	questionsrd�numquestions�
numanswers�numauthorities�numadditionals�
readHeader�
readQuestions�
readOthers)r4r�r%r%r&r3szDNSIncoming.__init__cCszd}t�|�}t�||j|j|j|��}|j|7_|d|_|d|_|d|_|d|_|d|_	|d|_
dS)	zReads header portion of packets!HHHHHHrrrrrrN)�struct�calcsize�unpackr�r��id�flagsr�r�r�r��r4�format�length�infor%r%r&r�s
�




zDNSIncoming.readHeaderc	Cs�d}t�|�}td|j�D]p}|��}t�||j|j|j|��}|j|7_z$t||d|d�}|j	�
|�Wqty�Yq0qdS)z!Reads questions section of packets!HHrrN)r�r��ranger��readNamer�r�r�rUr��appendr()r4r�r��ir:r��questionr%r%r&r�!s
�zDNSIncoming.readQuestionscCsBd}t�|�}t�||j|j|j|��}|j|7_|dS)z Reads an integer from the packet�!Ir�r�r�r�r�r�r�r%r%r&�readInt2s
�zDNSIncoming.readIntcCs(t|j|j�}|jd7_|�|�S)z(Reads a character string from the packetr)�ordr�r��
readString)r4r�r%r%r&�readCharacterString<szDNSIncoming.readCharacterStringcCsFd|}t�|�}t�||j|j|j|��}|j|7_|dS)z0Reads a string of a given length from the packets!%dsrr�)r4r~r�r�r�r%r%r&r�Bs
�zDNSIncoming.readStringcCsBd}t�|�}t�||j|j|j|��}|j|7_|dS)z'Reads an unsigned short from the packet�!Hrr�r�r%r%r&�readUnsignedShortLs
�zDNSIncoming.readUnsignedShortcCs�d}t�|�}|j|j|j}td|�D�]�}|��}t�||j|j	|j	|��}|j	|7_	d}|dt
kr�t||d|d|d|�d��}�n,|dt
ks�|dtkr�t||d|d|d|���}n�|dtk�r
t||d|d|d|�|d��}n�|dtk�rLt||d|d|d|��|��|��|���}nz|dtk�r�t||d|d|d|��|���}nD|dtk�r�t||d|d|d|�d��}n|j	|d7_	|dur*|j�|�q*dS)	z@Reads answers, authorities and additionals section of the packets!HHiHrNrrrrr)r�r�r�r�r�r�r�r�r�r��_TYPE_Arzr��_TYPE_CNAME�	_TYPE_PTRr��	_TYPE_TXTr��	_TYPE_SRVr�r��_TYPE_HINFOr�r��
_TYPE_AAAArdr�)r4r�r��nr��domainr�r[r%r%r&r�Vsb
��� ��
��zDNSIncoming.readOtherscCs|jt@tkS)zReturns true if this is a query)r��_FLAGS_QR_MASK�_FLAGS_QR_QUERYr^r%r%r&�isQuery�szDNSIncoming.isQuerycCs|jt@tkS)z"Returns true if this is a response)r�r��_FLAGS_QR_RESPONSEr^r%r%r&�
isResponse�szDNSIncoming.isResponsecCs|j|||��d�S)z6Reads a UTF-8 string of a given length from the packet�utf-8)r��decode)r4r�r~r%r%r&�readUTF�szDNSIncoming.readUTFcCs�d}|j}d}|}t|j||d��}|d7}|dkr:q�|d@}|dkrnd�||�||�df�}||7}q|dkr�|dkr�|d}|d@d>t|j||d��B}||kr�t|��|}qt|��q|dkr�||_n||_|S)	z#Reads a domain name from the packet����rr��.�?r)r�r�r��joinr�r6r1)r4rRZoff�next�firstr~�tr%r%r&r��s0
"
zDNSIncoming.readNameN)r*r+r,rTr3r�r�r�r�r�r�r�r�r�r�r�r%r%r%r&r��s


?r�c@s�eZdZdZd$dd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#S)%�DNSOutgoingz+Object representation of an outgoing packetrcCsFd|_d|_||_||_i|_g|_d|_g|_g|_g|_	g|_
dS)Nrr)�finishedr��	multicastr��namesr��sizer�rd�authorities�additionals)r4r�r�r%r%r&r3�szDNSOutgoing.__init__cCs|j�|�dS)zAdds a questionN)r�r��r4rgr%r%r&�addQuestion�szDNSOutgoing.addQuestioncCs|�|�s|�|d�dS)zAdds an answerrN)rh�addAnswerAtTime)r4�inprgr%r%r&�	addAnswer�s
zDNSOutgoing.addAnswercCs.|dur*|dks|�|�s*|j�||f�dS)z6Adds an answer if if does not expire by a certain timeNr)rrrdr�)r4rgror%r%r&r��szDNSOutgoing.addAnswerAtTimecCs|j�|�dS)zAdds an authoritative answerN)r�r�r�r%r%r&�addAuthoritativeAnswer�sz"DNSOutgoing.addAuthoritativeAnswercCs|j�|�dS)zAdds an additional answerN)r�r�r�r%r%r&�addAdditionalAnswer�szDNSOutgoing.addAdditionalAnswercCs.d}|j�t�|t|���|jd7_dS)z"Writes a single byte to the packet�!crN)r�r�r��pack�chrr��r4�valuer�r%r%r&�	writeByte�szDNSOutgoing.writeBytecCs,d}|j�|t�||��|jd7_dS)z=Inserts an unsigned short in a certain position in the packetr�rN)r��insertr�r�r�)r4�indexr�r�r%r%r&�insertShort�szDNSOutgoing.insertShortcCs*d}|j�t�||��|jd7_dS)z&Writes an unsigned short to the packetr�rN)r�r�r�r�r�r�r%r%r&r��szDNSOutgoing.writeShortcCs.d}|j�t�|t|���|jd7_dS)z(Writes an unsigned integer to the packetr�rN)r�r�r�r��intr�r�r%r%r&�writeInt�szDNSOutgoing.writeIntcCs6dt|�d}|j�t�||��|j|7_dS)zWrites a string to the packet�!�sN)rWr�r�r�r�r�)r4r�r�r�r%r%r&r}szDNSOutgoing.writeStringcCs8|�d�}t|�}|dkrt�|�|�|�||�dS)z5Writes a UTF-8 string of a given length to the packetr�rN)rXr~r.r�r})r4r�Zutfstrr�r%r%r&�writeUTF	s

zDNSOutgoing.writeUTFcCs�z|j|}Wn`tyn|j|j|<|�d�}|ddkrJ|dd�}|D]}|�|�qN|�d�YdS0|�|d?dB�|�|�dS)z"Writes a domain name to the packet�.r��Nrrr�)r�rJr��splitr�r�)r4r:r��parts�partr%r%r&r�s

zDNSOutgoing.writeNamecCs(|�|j�|�|j�|�|j�dS)zWrites a question to the packetN)r�r:r�r;r=)r4r�r%r%r&�
writeQuestion,szDNSOutgoing.writeQuestioncCs�|�|j�|�|j�|jr6|jr6|�|jtB�n|�|j�|dkrX|�|j	�n|�|�
|��t|j�}|j
d7_
|�|�|j
d8_
td�|j|d���}|�||�dS)zPWrites a record (answer, authoritative answer, additional) to
        the packetrrr�N)r�r:r�r;r?r�r=r>r�rbrpr~r�r�rxr�r�)r4rgror�r�r%r%r&�writeRecord2s

zDNSOutgoing.writeRecordcCs�|js�d|_|jD]}|�|�q|jD]\}}|�||�q(|jD]}|�|d�qD|jD]}|�|d�q\|�dt|j��|�dt|j��|�dt|j��|�dt|j��|�d|j	�|j
r�|�dd�n|�d|j�d�|j
�S)z�Returns a string containing the packet's bytes

        No further parts should be added to the packet once this
        is done.rrr�)r�r�r�rdr�r�r�r�r~r�r�r�r�r�)r4r�ZanswerZtime_Z	authority�
additionalr%r%r&�packetIs&


zDNSOutgoing.packetN)r)r*r+r,rTr3r�r�r�r�r�r�r�r�r�r}r�r�r�r�r�r%r%r%r&r��s"
	r�c@sHeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dS)�DNSCachezA cache of DNS entriescCs
i|_dSra)�cacher^r%r%r&r3hszDNSCache.__init__cCsBz|j|j}Wn"ty2g}|j|j<Yn0|�|�dS)z
Adds an entryN)r�r9rJr��r4�entry�listr%r%r&�addks
zDNSCache.addcCs2z|j|j}|�|�Wnty,Yn0dS)zRemoves an entryN)r�r9�removerJr�r%r%r&r�ss
zDNSCache.removec	Cs:z|j|j}||�|�WSttfy4YdS0dS)zNGets an entry by key.  Will return None if there is no
        matching entry.N)r�r9r�rJ�
ValueErrorr�r%r%r&�get{s
zDNSCache.getcCst|||�}|�|�S)zRGets an entry by details.  Will return None if there is
        no matching entry.)r7r�)r4r:r;r=r�r%r%r&�getByDetails�szDNSCache.getByDetailscCs(z|j|WSty"gYS0dS)z5Returns a list of entries whose key matches the name.N)r�rJ)r4r:r%r%r&�entriesWithName�szDNSCache.entriesWithNamecCs4zttj�|j����WSty.gYS0dS)zReturns a list of all entriesN)r��	itertools�chain�
from_iterabler��valuesr2r^r%r%r&�entries�szDNSCache.entriesN)r*r+r,rTr3r�r�r�r�r�rr%r%r%r&r�es	r�c@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)�EngineacAn 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.
    cCs4tj�|�||_i|_d|_t��|_|��dS)Nr)	�	threading�Threadr3�zeroconf�readers�timeout�	Condition�	condition�start�r4rr%r%r&r3�s
zEngine.__init__c	Cs�t�ds�|��}t|�dkrB|j��|j�|j�|j��qz^t�|gg|j�\}}}|D]<}z|j	|�
�Wq`ty�t�ds�t�
�Yq`0q`Wqty�Yq0qdS)Nrr)�globals�
getReadersr~r	�acquire�waitr�release�selectr�handle_readr2�	traceback�	print_exc)r4ZrsZrr�wrZer�sockr%r%r&�run�s 


z
Engine.runcCs"|j��|j��}|j��|Sra)r	rr�keysr�r4rRr%r%r&r
�s


zEngine.getReaderscCs,|j��||j|<|j��|j��dSra�r	rr�notifyr)r4�readerrr%r%r&�	addReader�s


zEngine.addReadercCs*|j��|j|=|j��|j��dSrar)r4rr%r%r&�	delReader�s

zEngine.delReadercCs"|j��|j��|j��dSra)r	rrrr^r%r%r&r�s

z
Engine.notifyN)
r*r+r,rTr3rr
rrrr%r%r%r&r�src@s eZdZdZdd�Zdd�ZdS)�Listenera4A 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.cCs||_|jj�||jj�dSra)r�enginerrrr%r%r&r3�szListener.__init__c
Cs�|jj}z|�t�\}\}}WnBtjy`}z(|jtjkrJWYd}~dS�WYd}~n
d}~00||_t|�}|�	�r�|t
kr�|j�|tt
�q�|t
kr�|j�|||�|j�|tt
�n|j�|�dSra)rrZrecvfrom�_MAX_MSG_ABSOLUTE�error�errno�EBADFr�r�r��
_MDNS_PORT�handleQuery�
_MDNS_ADDR�	_DNS_PORT�handleResponse)r4rr��addrr��erfr%r%r&r�s zListener.handle_readN)r*r+r,rTr3rr%r%r%r&r�src@s eZdZdZdd�Zdd�ZdS)�ReaperzNA Reaper is used by this module to remove cache entries that
    have expired.cCstj�|�||_|��dSra)rrr3rr
rr%r%r&r3szReaper.__init__cCs^|j�d�t�drdSt�}|jj��D]*}|�|�r,|j�||�|jj�|�q,qdS)Ni'r)	rrrr'r�rrr�updateRecordr�)r4rorgr%r%r&rs

z
Reaper.runN)r*r+r,rTr3rr%r%r%r&r,sr,c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�ServiceBrowserz�Used 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.cCsbtj�|�||_||_||_i|_t�|_t	|_
g|_d|_|j�
|t|jtt��|��dS)z%Creates a browser for a specific typerN)rrr3rr;�listener�servicesr'�nexttime�
_BROWSER_TIME�delayr��done�addListenerrUr��	_CLASS_INr
)r4rr;r/r%r%r&r3s�zServiceBrowser.__init__cs��jtkrΈj�jkrΈ�|�}zR�j�j��}|sB|���n.�j�j��=��fdd�}�j�	|�WdSWn@t
y�|s���j�j��<��fdd�}�j�	|�Yn0��d�}|�jkr�|�_dS)z�Callback invoked by Zeroconf when new information arrives.

        Updates information required by browser in the Zeroconf cache.cs�j�|�j�j�Sra)r/Z
removeServicer;r���x�rgr4r%r&�<lambda><s
�z-ServiceBrowser.updateRecord.<locals>.<lambda>Ncs�j�|�j�j�Sra)r/Z
addServicer;r�r7r9r%r&r:Ds
��K)
r;r�r:rrr0r�r8rur�r�r2rkr1)r4rrorg�expiredZ	oldrecord�callbackZexpiresr%r9r&r-0s$



zServiceBrowser.updateRecordcCsd|_|j��dS)Nr)r4r�	notifyAllr^r%r%r&�cancelMszServiceBrowser.cancelcCs�d}t�}t|j�dkr4|j|kr4|j�|j|�t�dsD|jrHdSt�}|j|kr�tt	�}|�
t|jt
t��|j��D]}|�|�s~|�||�q~|j�|�||j|_td|jd�|_t|j�dkr�|j�d�}|dur||j�qdS)Nrri Nr)r'r~r�r1rrrr4r�r�r�rUr;r�r6r0rrrr��sendr3�min�pop)r4Zeventrorwrgr%r%r&rQs(

zServiceBrowser.runN)r*r+r,rTr3r-r?rr%r%r%r&r.s
r.c@s�eZdZdZd&dd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�ZdS)'�ServiceInfozService informationNrc		CsR|�|�st�||_||_||_||_||_||_|r>||_n||_|�	|�dS)a�Create 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)
rYr0r;r:r{r�r�r�r��
setProperties)	r4r;r:r{r�r�r��
propertiesr�r%r%r&r3os
zServiceInfo.__init__cCs�t|t�r�||_g}d}|D]\}||}|dur6d}n.t|t�rF|}nt|t�r`|rZd}qdd}nd}|�d�||f��q|D]&}d�|t�dt	�
t|���|f�}q~||_n||_dS)z7Sets properties and text of this info from a dictionaryr�N�true�false�=r�)
rA�dictrErWr�r�r�r�r�rZbytechrr~r�)r4rEr�rRr9r��suffix�itemr%r%r&rD�s2


��zServiceInfo.setPropertiescCs||_z�i}t|�}d}g}||krXt||�}|d7}|�||||��||7}q|D]t}|�d�}|dkr||}	d}
n:|d|�}	||dd�}
|
dkr�d}
n|
dks�|
s�d}
|	r\|�|	�dur\|
||	<q\||_Wn ty�t�	�d|_Yn0dS)z+Sets properties and text given a text fieldrrrHr�NrFrG)
r�r~r�r��findr�rEr2rr)r4r�rR�endr�Zstrsr�r�Zeindexr9r�r%r%r&�setText�s8



zServiceInfo.setTextcCs|jS)rL)r;r^r%r%r&rN�szServiceInfo.getTypecCsD|jdur>|j�d|j�r>|jdt|j�t|j�d�S|jS)z
Name accessorNr�r)r;r:rYr~r^r%r%r&�getName�s"zServiceInfo.getNamecCs|jS)zAddress accessor)r{r^r%r%r&�
getAddress�szServiceInfo.getAddresscCs|jS)z
Port accessor)r�r^r%r%r&�getPort�szServiceInfo.getPortcCs|jS)zPriority accessor)r�r^r%r%r&�getPriority�szServiceInfo.getPrioritycCs|jS)zWeight accessor)r�r^r%r%r&�	getWeight�szServiceInfo.getWeightcCs|jS)zProperties accessor)rEr^r%r%r&�
getProperties�szServiceInfo.getPropertiescCs|jS)z
Text accessor)r�r^r%r%r&�getText�szServiceInfo.getTextcCs|jS)zServer accessor)r�r^r%r%r&�	getServer�szServiceInfo.getServerc	Cs�|dur�|�|�s�|jtkr2|j|jkr�|j|_nv|jtkr�|j|jkr�|j|_|j|_|j|_|j	|_	|�
|||j�|jtt
��n"|jtkr�|j|jkr�|�|j�dS)z-Updates service information from a DNS recordN)rrr;r�r:r�r{r�r�r�r�r-r�r�r6r�rNr�)r4rrorgr%r%r&r-�s(


��
zServiceInfo.updateRecordc		Cslt�}t}||}||}�z>|�|t|jtt��|jdusT|jdusT|j	du�rJ||krlW|�
|�dS||k�r.tt�}|�
t|jtt��|�|j�|jtt�|�|�
t|jtt��|�|j�|jtt�|�|jdu�r|�
t|jtt��|�|j�|jtt�|�|�|�||}|d}|�t||�|�t�}q4d}W|�
|�n|�
|�0|S)z�Returns true if the service could be discovered on the
        network, and updates this object with details discovered.
        Nrrr)r'�_LISTENER_TIMEr5rUr:rZr6r�r{r��removeListenerr�r�r�r�r�r�r�r�r�r@rrA)	r4rrror3r�ZlastrwrRr%r%r&�requestsp����'
�
���������
zServiceInfo.requestcCst|t�r|j|jkSdS)zTests equality of service namer)rArCr:rBr%r%r&rDSs
zServiceInfo.__eq__cCs|�|�SrErFrBr%r%r&rGYszServiceInfo.__ne__cCsld|jt�|���|jf}|jdur0|d7}n0t|j�dkrJ||j7}n||jdd�d7}|d7}|S)r]sservice[%s,%s:%s,NsNone��r�rQ)r:rr�rPr�r�r~rr%r%r&r_]s�

zServiceInfo.__repr__)NNrrNN)r*r+r,rTr3rDrNrNrOrPrQrRrSrTrUrVr-rYrDrGr_r%r%r%r&rCls0�
% %;rCc@s�eZdZdZd*dd�Zdd�Zdd�Zd	d
�Zdd�Zd+dd�Z	dd�Z
dd�Zefdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zeefd&d'�Zd(d)�ZdS),�Zeroconfz�Implementation of Zeroconf Multicast DNS Service Discovery

    Supports registration, unregistration, queries and browsing.
    NcCsDdt�d<|dur$t�t���|_n||_dtf|_t�tjtj�|_z,|j�	tj
tjd�|j�	tj
tjd�Wnt
y�Yn0|j�	tjtjd�|j�	tjtjd�z|j�|j�Wnt
y�Yn0|j�	tjtjt�t�t�d��g|_g|_i|_i|_t�|_t��|_t|�|_t |�|_!t"|�|_#dS)	zxCreates an instance of the Zeroconf class, establishing
        multicast communications, listening and reaping threads.rrNr�r����0.0.0.0)$rrZ
gethostbynameZgethostname�intfr%�groupZAF_INETZ
SOCK_DGRAM�
setsockoptZ
SOL_SOCKETZSO_REUSEADDRZSO_REUSEPORTr2�SOL_IPZIP_MULTICAST_TTLZIP_MULTICAST_LOOPZbindZIP_ADD_MEMBERSHIP�	inet_atonr'�	listeners�browsersr0�servicetypesr�r�rrr	rr rr/r,Zreaper)r4Zbindaddressr%r%r&r3us>


�


zZeroconf.__init__cCs|j�d�S)N�	127.0.0.1�r`�
startswithr^r%r%r&�
isLoopback�szZeroconf.isLoopbackcCs|j�d�S)Ns169.254.rir^r%r%r&�isLinklocal�szZeroconf.isLinklocalcCs(|j��|j�|d�|j��dS)zRCalling thread waits for a given number of milliseconds or
        until notified.r#N)r	rrr)r4rr%r%r&r�s
z
Zeroconf.waitcCs"|j��|j��|j��dS)zNotifies all waiting threadsN)r	rr>rr^r%r%r&r>�s

zZeroconf.notifyAll�cCst||�}|�||�r|SdS)z�Returns 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)rCrY)r4r;r:rr�r%r%r&�getServiceInfo�s
zZeroconf.getServiceInfocCs"|�|�|j�t|||��dS)z�Adds a listener for a particular service type.  This object
        will then have its updateRecord method called when information
        arrives for that type.N)�removeServiceListenerrfr�r.)r4r;r/r%r%r&�addServiceListener�s
zZeroconf.addServiceListenercCs$|jD]}|j|kr|��~qdS)z<Removes a listener from the set that is currently listening.N)rfr/r?)r4r/Zbrowserr%r%r&ro�s

zZeroconf.removeServiceListenercCs.|�|�||j|j��<|j|jvr<|j|jd7<nd|j|j<t�}|}d}|dk�r*||kr~|�||�t�}qVtt	t
B�}|�t|jt
t||j�d�|�t|jtt||j|j|j|j�d�|�t|jtt||j�d�|j�r|�t|jtt||j�d�|�|�|d7}|t7}qVdS)aRegisters service information to the network with a default TTL
        of 60 seconds.  Zeroconf will then respond to requests for
        information for that service.  The name of the service may be
        changed if needed to make it unique on the network.rrrN)�checkServicer0r:r8r;rgr'rr�r��	_FLAGS_AAr�r�r�r6r�r�r�r�r�r�r�r�r�r{rzr�r@�_REGISTER_TIME)r4r�rbror1r�rwr%r%r&�registerService�sV

��
�
���
zZeroconf.registerServicecCs<zB|j|j��=|j|jdkr6|j|jd8<n
|j|j=WntyTYn0t�}|}d}|dk�r8||kr�|�||�t�}qdtt	t
B�}|�t|jt
td|j�d�|�t|jttd|j|j|j|j�d�|�t|jttd|j�d�|j�r|�t|jttd|j�d�|�|�|d7}|t7}qddS)zUnregister a service.rrrN)r0r:r8rgr;rJr'rr�r�rrr�r�r�r6r�r�r�r�r�r�r�r�r{rzr�r�r@�_UNREGISTER_TIME)r4r�ror1r�rwr%r%r&�unregisterServicesZ
��
�
���
zZeroconf.unregisterServicecCst|j�dkr�t�}|}d}|dkr�||krB|�||�t�}qtttB�}|j��D]�}|�t	|j
ttd|j
�d�|�t|j
ttd|j|j|j|j�d�|�t|j
ttd|j�d�|jrX|�t|jttd|j�d�qX|�|�|d7}|t7}qdS)z#Unregister all registered services.rrrN)r~r0r'rr�r�rrrr�r�r;r�r6r:r�r�r�r�r�r�r�r�r�r{rzr�r@ru)r4ror1r�rwr�r%r%r&�unregisterAllServices5sX���
�
���
zZeroconf.unregisterAllServicescCst�}|}d}|dk�r|j�|j�D]b}|jtkr&|�|�s&|j|jkr&|j�d�dkr�d|j|j	|j
|jf|_|�|�dSt�q&||kr�|�
||�t�}qtttB�}||_|�t|jtt��|�t|jttt|j��|�|�|d7}|t7}qdS)znChecks the network for a unique service name, modifying the
        ServiceInfo passed in if it is not unique.rrr�s
%s.[%s:%d].%sNr)r'r�r�r;r�rrr�r:rLr{r�rqr-rr�r�rr�debugr�rUr6r�r��_DNS_TTLr@�_CHECK_TIME)r4r�ror1r�rgrwr%r%r&rqdsD
��
��
�
zZeroconf.checkServicecCs\t�}|j�|�|durP|j�|j�D]&}|�|�r(|�|�s(|�|||�q(|�	�dS)z�Adds a listener for a given question.  The listener will have
        its updateRecord method called when information is available to
        answer the question.N)
r'rer�r�r�r:r\rrr-r>)r4r/r�rorgr%r%r&r5�szZeroconf.addListenercCs0z|j�|�|��Wnty*Yn0dS)zRemoves a listener.N)rer�r>r2)r4r/r%r%r&rX�s
zZeroconf.removeListenercCs&|jD]}|�|||�q|��dS)zNUsed to notify listeners of new information that has updated
        a record.N)rer-r>)r4ror[r/r%r%r&r-�s
zZeroconf.updateRecordcCs|t�}|jD]j}|�|�}||j��vr^|r:|j�|�qj|j�|�}|durj|�|�|}n|j�|�|�	||�qdS)zlDeal with incoming response packets.  All answers
        are held in the cache, and listeners are notified.N)
r'rdrrr�rr�r�rur�r-)r4rfrorgr<r�r%r%r&r)�s


zZeroconf.handleResponsec
Cs`d}|tkr0tttBd�}|jD]}|�|�q |jD�]�}|jtkr�|jdkr�|j	�
�D]0}|durrtttB�}|�|tdtt
t|��qZ|j��D]@}|j|jkr�|dur�tttB�}|�|t|jtt
t|j��q�q6�z8|dur�tttB�}|jtk�s
|jtk�rN|j��D]8}|j|j��k�r|�|t|jtt
tBt|j���q|j�|j��d�}|�slWq6|jtk�s�|jtk�r�|�|t|jtt
tBt|j|j|j|j��|jtk�s�|jtk�r�|�|t|jtt
tBt|j ��|jtk�r|�!t|jtt
tBt|j��Wq6t"�y0t#�$�Yq60q6|du�r\|j%�r\|j&|_&|�'|||�dS)zKDeal with incoming query packets.  Provides a response if
        possible.Nrs_services._dns-sd._udp.local.)(r%r�r�rrr�r�r;r�r:rgrr�r�r6ryr0rr�rZr�r8rzr>r{r�r�r�r�r�r�r�r�r�r�r2rrrdr�r@)r4rfr*r�rwr��stypeZservicer%r%r&r&�s�


��
������
��
��	zZeroconf.handleQuerycCs4z|j�|��d||f�Wnty.Yn0dS)zSends an outgoing packet.rN)rZsendtor�r2)r4rwr*r�r%r%r&r@#sz
Zeroconf.sendcCsdt�ddkr`dt�d<|��|j��|��|j�tjtjt�	t
�t�	d��|j��dS)z^Ends the background threads, and prevent this instance from
        servicing further queries.rrrr_N)rr>r rrwrrbrcZIP_DROP_MEMBERSHIPrdr'�closer^r%r%r&r|-s

�zZeroconf.close)N)rm)r*r+r,rTr3rkrlrr>rnrproryrtrvrwrqr5rXr-r)r&r'r%r@r|r%r%r%r&r\os(
3
	21/%l
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.rhi�s   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.)kZ
__future__rr�
__author__Z	__email__�__version__r#r�rrr�rr$rZ	mercurialr�__all__rrurzrsrWr2r'r%r(ryZ_MAX_MSG_TYPICALr!r�r�r�rrZ	_FLAGS_TCZ	_FLAGS_RDZ	_FLAGS_RAZ_FLAGS_ZZ	_FLAGS_ADZ	_FLAGS_CDr6Z	_CLASS_CSZ	_CLASS_CHZ	_CLASS_HSZ_CLASS_NONEZ
_CLASS_ANYr<r>r�Z_TYPE_NSZ_TYPE_MDZ_TYPE_MFr�Z	_TYPE_SOAZ_TYPE_MBZ_TYPE_MGZ_TYPE_MRZ
_TYPE_NULLZ	_TYPE_WKSr�r�Z_TYPE_MINFOZ_TYPE_MXr�r�r�rZrIrMr'r2r(r-r.r/r0r1r6�objectr7rUr`rzr�r�r�r�r�r�r�rrrr,r.rCr\r*�print�rZdescrdr�rtrWrnrvr|r%r%r%r&�<module>s<N
�
�9B!E#4B'UT

�	
����


Youez - 2016 - github.com/yon3zu
LinuXploit