Ë
    oò˜h„)  ã                   óÐ   — d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m
Z
 ddlmZmZmZmZmZmZ dgZ ej&                  dd	«        ej&                  d
d«        G d„ de«      Zy)z4
IS class is used for connection to APRS-IS network
é    Né   )Ú__version__Ústring_typeÚis_py3)Úparse)ÚGenericErrorÚConnectionDropÚConnectionErrorÚ
LoginErrorÚ
ParseErrorÚUnknownFormatÚISé   r   é	   r   c                   óf   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zdd„Z	d„ Z
d	„ Zdd
„Zd„ Zd„ Zd„ Zdd„Zy)r   zã
    The IS class is used to connect to aprs-is network and listen to the stream
    of packets. You can either run them through aprs.parse() or get them in raw
    form.

    Note: sending of packets is not supported yet

    c                 óÖ   — t        j                  t        «      | _        t        | _        | j                  ||«       | j                  ||«       d| _        d| _	        d| _
        d| _        y)z¥
        callsign        - used when login in
        passwd          - for verification, or "-1" if only listening
        Host & port     - aprs-is server
        NÚ Fó    )ÚloggingÚ	getLoggerÚ__name__Úloggerr   Ú_parseÚ
set_serverÚ	set_loginÚsockÚfilterÚ
_connectedÚbuf)ÚselfÚcallsignÚpasswdÚhostÚports        úL/root/html/w1hd9_aprs_logger/venv/lib/python3.12/site-packages/aprslib/IS.pyÚ__init__zIS.__init__4   sU   € ô ×'Ñ'¬Ó1ˆŒÜˆŒà�‰˜˜dÔ#Ø�‰�x Ô(àˆŒ	ØˆŒàˆŒØˆ�r   c                 óh   — t         r|j                  d«      }| j                  j                  |«       y )Nzutf-8)r   Úencoder   Úsendall)r    Útexts     r%   Ú_sendallzIS._sendallG   s%   € ÝØ—;‘;˜wÓ'ˆDØ�	‰	×Ñ˜$Õr   c                 ó´   — || _         | j                  j                  d| j                   «       | j                  r| j	                  d| j                   z  «       yy)zD
        Set a specified aprs-is filter for this connection
        zSetting filter to: %sz#filter %s
N)r   r   Úinfor   r+   )r    Úfilter_texts     r%   Ú
set_filterzIS.set_filterL   sF   € ð "ˆŒà�‰×ÑÐ0°$·+±+Ô>à�?Š?Ø�M‰MÐ*¨T¯[©[Ñ8Õ9ð r   c                 ó    — || _         || _        y)z+
        Set callsign and password
        N)r!   r"   )r    r!   r"   s      r%   r   zIS.set_loginW   s   € ð !ˆŒØˆ�r   c                 ó   — ||f| _         y)z4
        Set server ip/host and port to use
        N)Úserver)r    r#   r$   s      r%   r   zIS.set_server^   s   € ð ˜T�lˆ�r   c                 óú   — | j                   ry	 	 | j                  «        | j                  «        y# t        t        f$ r |s‚ Y nw xY w| j
                  j                  d|z  «       t        j                  |«       Œn)zÐ
        Initiate connection to APRS server and attempt to login

        blocking = False     - Should we block until connected and logged-in
        retry = 30           - Retry interval in seconds
        Nz"Retrying connection is %d seconds.)	r   Ú_connectÚ_send_loginr   r
   r   r-   ÚtimeÚsleep)r    ÚblockingÚretrys      r%   Úconnectz
IS.connectd   sx   € ð �?Š?ØàðØ—‘”Ø× Ñ Ô"ØøÜ¤Ð0ò ÙØñ  ðúð �K‰K×ÑÐAÀEÑIÔJÜ�J‰J�uÔð s   � 1 ±AÁAc                 ón   — d| _         d| _        | j                  �| j                  j                  «        yy)zX
        Closes the socket
        Called internally when Exceptions are raised
        Fr   N)r   r   r   Úclose©r    s    r%   r<   zIS.close{   s/   € ð  ˆŒØˆŒà�9‰9Ð Ø�I‰I�O‰OÕð !r   c                 ó¾  — t        |t        «      st        dt        |«      «      ‚| j                  st        d«      ‚|dk(  ry|j                  d«      dz   }	 | j                  j                  d«       | j                  j                  d«       | j                  |«       y# t        j                  $ r)}| j                  «        t        t        |«      «      ‚d}~ww xY w)zD
        Send a line, or multiple lines sperapted by '\r\n'
        zExpected line to be str, got %sznot connectedr   Nz
r   é   )Ú
isinstancer   Ú	TypeErrorÚtyper   r
   Úrstripr   ÚsetblockingÚ
settimeoutr+   ÚsocketÚerrorr<   Ústr)r    ÚlineÚexps      r%   r)   z
IS.sendall‡   s°   € ô ˜$¤Ô,ÜÐ=¼tÀD»zÓJÐJØ�ŠÜ! /Ó2Ð2à�2Š:Øà�{‰{˜6Ó" VÑ+ˆð	,Ø�I‰I×!Ñ! !Ô$Ø�I‰I× Ñ  Ô#Ø�M‰M˜$ÕøÜ�|‰|ò 	,Ø�J‰JŒLÜ!¤# c£(Ó+Ð+ûð	,ús   ÁAB  Â CÂ3$CÃCc                 ó˜  — | j                   st        d«      ‚d}	 	 | j                  |«      D ]I  }|d   dk7  r#|r	 ||«       Œ || j                  |«      «       Œ.| j                  j                  d|«       ŒK 	 |syŒc# t        $ r<}| j                  j                  dd|j                  |j                  «       Y d}~ŒDd}~wt        $ r<}| j                  j                  d	d|j                  |j                  «       Y d}~Œ‡d}~wt        $ rE}| j                  j                  d
|j                  j                  |j                  «       Y d}~ŒÓd}~wt        t         f$ r ‚ t"        t        f$ r) | j%                  «        |s‚ | j'                  |¬«       Y �Œ|t(        $ r Y �Œ't*        $ r Y y | j                  j                  d|«       ‚ xY w)a#  
        When a position sentence is received, it will be passed to the callback function

        blocking: if true (default), runs forever, otherwise will return after one sentence
                  You can still exit the loop, by raising StopIteration in the callback function

        immortal: When true, consumer will try to reconnect and stop propagation of Parse exceptions
                  if false (default), consumer will return

        raw: when true, raw packet is passed to callback, otherwise the result from aprs.parse()
        znot connected to a serverr   r   ú#ú
Server: %sr   z%s
    Packet: %sNr   z%s: %s)r8   zAPRS Packet: %s)r   r
   Ú_socket_readlinesr   r   Údebugr   ÚlogÚmessageÚpacketr   r   rG   Ú	__class__r   ÚKeyboardInterruptÚ
SystemExitr	   r<   r:   r   ÚStopIteration)r    Úcallbackr8   ÚimmortalÚrawrI   rJ   s          r%   ÚconsumerzIS.consumer�   s„  € ð �ŠÜ!Ð"=Ó>Ð>àˆàðØ ×2Ñ2°8Ó<ò >�DØ˜A‘w #’~ÙÙ$ T�Ná$ T§[¡[°Ó%6Õ7àŸ™×)Ñ)¨,¸Õ=ñ>ñ@ ØðG øô ò SØ—‘—‘ Ð$8¸#¿+¹+ÀsÇzÁz×RÑRûÜ ò RØ—‘—‘ Ð#7¸¿¹ÀcÇjÁj×QÑQûÜò QØ—‘×!Ñ! (¨C¯M©M×,BÑ,BÀCÇKÁK×PÑPûÜ%¤zÐ2ò ØÜ"¤OÐ4ò Ø—
‘
”áØà—L‘L¨(�LÔ3ÚÜò ÚÜ ò ÙðØ—‘×!Ñ!Ð"3°TÔ:ØúsC   œAA> Á>	G	Â2B>Â>G	Ã
2DÄG	Ä;EÅAG	ÆG	Æ!G	Æ+G	c                 óN   — t        j                  | j                  d«      | _        y)z"
        Creates a socket
        é   N)rF   Úcreate_connectionr2   r   r=   s    r%   Ú_open_socketzIS._open_socketÔ   s   € ô ×,Ñ,¨T¯[©[¸"Ó=ˆ�	r   c                 ód  — | j                   j                  d| j                  d   | j                  d   «       	 | j                  «        | j                  j                  «       \  }}| j                   j                  d||«       | j                  j                  d«       | j                  j                  d«       | j                  j                  t        j                  t        j                  d«       | j                  j                  d«      }t        r|j                  d«      }|d   dk(  r+| j                   j                  d	|j!                  «       «       nt#        d
«      ‚	 d| _        y# t"        $ r:}| j                   j%                  t'        |«      «       | j)                  «        ‚ d}~wt        j$                  t        j*                  f$ r`}| j)                  «        | j                   j%                  dt'        |«      z  «       t'        |«      dk(  rt#        d«      ‚t#        |«      ‚d}~ww xY w)z2
        Attemps connection to the server
        zAttempting connection to %s:%sr   r   zConnected to %s:%sr?   i   úlatin-1rL   z
Banner: %szinvalid banner from serverNzSocket error: %sz	timed outzno banner from serverT)r   r-   r2   r^   r   ÚgetpeernamerD   rE   Ú
setsockoptrF   Ú
SOL_SOCKETÚSO_KEEPALIVEÚrecvr   ÚdecoderO   rC   r
   rG   rH   r<   Útimeoutr   )r    ÚraddrÚrportÚbannerÚes        r%   r4   zIS._connectÚ   s¨  € ð
 	�‰×ÑÐ9¸4¿;¹;Àq¹>È4Ï;É;ÐWXÉ>ÔZð!	)Ø×ÑÔàŸ9™9×0Ñ0Ó2‰LˆE�5à�K‰K×ÑÐ1°5¸%Ô@ð �I‰I×!Ñ! !Ô$Ø�I‰I× Ñ  Ô#à�I‰I× Ñ ¤×!2Ñ!2´F×4GÑ4GÈÔKà—Y‘Y—^‘^ CÓ(ˆFÝØŸ™ yÓ1�à�a‰y˜CÒØ—‘×!Ñ! ,°·±³Õ@ä%Ð&BÓCÐCð Að" ˆ�øô ò 	Ø�K‰K×Ñœc !›fÔ%Ø�J‰JŒLØûÜ—‘œfŸn™nÐ-ò 	)Ø�J‰JŒLà�K‰K×ÑÐ0´3°q³6Ñ9Ô:Ü�1‹v˜Ò$Ü%Ð&=Ó>Ð>ä% aÓ(Ð(ûð	)ús%   ¹D)E+ Å+	H/Å45F)Æ)&H/ÇAH*È*H/c                 óL  — d}|j                  | j                  | j                  | j                  dk7  rd| j                  z   ndt        «      }| j
                  j                  d«       	 | j                  |«       | j                  j                  d«       | j                  j                  t        |«      dz   «      }t        r|j                  d«      }|j                  «       }| j
                  j                  d|«       |j!                  d	d
«      \  }}}}}|dk(  rt#        d«      ‚|| j                  k7  rt#        d|z  «      ‚|dk7  r| j                  dk7  rt#        d«      ‚| j                  dk(  r| j
                  j                  d«       y| j
                  j                  d«       y# t"        $ r:}| j
                  j%                  t'        |«      «       | j)                  «        ‚ d}~w | j)                  «        | j
                  j%                  d«       t#        d«      ‚xY w)z.
        Sends login string to server
        z'user {0} pass {1} vers aprslib {3}{2}
r   z filter zSending login informationr?   éd   r`   rM   ú é   z'Server responded with empty callsign???z	verified,ú-1zPassword is incorrectzLogin successful (receive only)zLogin successfulNzFailed to login)Úformatr!   r"   r   r   r   r-   r+   r   rE   re   Úlenr   rf   rC   rO   Úsplitr   rG   rH   r<   )r    Ú	login_strÚtestÚxr!   Ústatusrk   s          r%   r5   zIS._send_login  s¼  € ð @ˆ	Ø×$Ñ$Ø�M‰MØ�K‰KØ*.¯+©+¸Ò*;ˆZ˜$Ÿ+™+Ò%ÀÜó	ˆ	ð 	�‰×ÑÐ4Ô5ð	0Ø�M‰M˜)Ô$Ø�I‰I× Ñ  Ô#Ø—9‘9—>‘>¤# i£.°3Ñ"6Ó7ˆDÝØ—{‘{ 9Ó-�Ø—;‘;“=ˆDà�K‰K×Ñ˜l¨DÔ1à*.¯*©*°S¸!Ó*<Ñ'ˆQ��8˜V Qà˜2Š~Ü Ð!JÓKÐKØ˜4Ÿ=™=Ò(Ü  °Ñ!4Ó5Ð5Ø˜Ò$¨¯©¸Ò)<Ü Ð!8Ó9Ð9à�{‰{˜dÒ"Ø—‘× Ñ Ð!BÕCà—‘× Ñ Ð!3Õ4øäò 	Ø�K‰K×Ñœc !›fÔ%Ø�J‰JŒLØûð	0Ø�J‰JŒLØ�K‰K×ÑÐ/Ô0ÜÐ.Ó/Ð/ús   Á)D$F* ÆF* Æ*	H#Æ35G(Ç(;H#c              #   ó\  K  — 	 | j                   j                  d«       	 d}d}t        j                  | j                   gg g |rdnd«       	 | j                   j                  d«      }|s&| j                  j                  d«       t        d«      ‚	 | xj                  |z  c_
        || j                  v r7| j                  j                  |d«      \  }| _
        |–— || j                  v rŒ7ŒË# t        j                  $ r7}| j                  j                  dt        |«      z  «       t        d«      ‚d}~ww xY w# t        j                  $ r^}| j                  j                  d	t        |«      z  «       d
t        |«      v r|st        | j                  «      dk(  rY d}~yY d}~�Œd}~ww xY w­w)zH
        Generator for complete lines, received from the server
        r   z$socket error when setblocking(0): %szconnection droppedNr   s   
i   zsocket.recv(): returned emptyzsocket error on recv(): %sz Resource temporarily unavailabler   )r   rD   rF   rG   r   rH   r	   Úselectre   rr   r   rs   )r    r8   rk   Ú	short_bufÚnewlinerI   s         r%   rN   zIS._socket_readlines5  sg  è ø€ ð	7Ø�I‰I×!Ñ! !Ô$ð
 ØˆIØˆGä�M‰M˜4Ÿ9™9˜+ r¨2±x©tÀQÔGð"Ø ŸI™IŸN™N¨4Ó0�	ñ !Ø—K‘K×%Ñ%Ð&EÔFÜ(Ð)=Ó>Ð>ð !ð �HŠH˜	Ñ!�Hà˜TŸX™XÑ%Ø!%§¡§¡°¸Ó!;‘��d”hà’
ð ˜TŸX™XÒ%ð- øô	 �|‰|ò 	7Ø�K‰K×ÑÐDÄsÈ1ÃvÑMÔNÜ Ð!5Ó6Ð6ûð	7ûô" —<‘<ò "Ø—‘×!Ñ!Ð">ÄÀQÃÑ"GÔHØ5¼¸Q»Ñ?Ù#Ü˜tŸx™x›=¨AÒ-Ü!ÿùð"üsZ   ‚F,„C+ Ÿ,F,ÁAD8 ÂAF,Ã*F,Ã+D5Ã>2D0Ä0D5Ä5F,Ä8F)ÅAF$ÆF,Æ$F)Æ)F,N)rp   zrotate.aprs.neti¨'  )Fé   )TFF)F)r   Ú
__module__Ú__qualname__Ú__doc__r&   r+   r/   r   r   r:   r<   r)   rZ   r^   r4   r5   rN   © r   r%   r   r   +   sK   „ ñóò& ò
	:òò#óò.
ò,ó,5òn>ò*òX-0ô^#r   )r   rF   ry   r6   r   r   r   r   r   Úparsingr   Ú
exceptionsr   r	   r
   r   r   r   Ú__all__ÚaddLevelNameÚobjectr   r€   r   r%   ú<module>r†      sf   ðñ$ó Û Û Û ç .Ñ .Ý ÷÷ ð ˆ&€à €× Ñ �R˜Ô &Ø €× Ñ �Q˜Ô (ômˆõ mr   