
    `gj                    l    d Z ddlmZ ddlZddlZddlZddlZddlmZ d
dZ	ddZ
ddZ G d d	      Zy)z@Minimal, optional systemd ``sd_notify`` support for the gateway.    )annotationsN)Optionalc                8    | j                  d      rd| dd z   S | S )zDTranslate systemd's ``@abstract`` notation to Python's address form.@    N)
startswith)raws    I/root/.hermes/venv/lib/python3.12/site-packages/gateway/systemd_notify.py_notify_addressr      s"     ^^C04#ab'>9c9    c                   t         j                  j                  dd      j                         }|syt	        | t
              r| syt        t        d      sy	 | j                  d      }t        j                  t        j                  t        j                        5 }|j                  d       |j                  t        |             |j                  |       ddd       y# 1 sw Y   yxY w# t        t         t"        f$ r Y yw xY w)zSend one nonblocking sd_notify datagram when systemd configured it.

    Notification failures are deliberately non-fatal: a missing socket or an
    older platform must never prevent the gateway from starting.
    NOTIFY_SOCKET FAF_UNIXzutf-8NT)osenvirongetstrip
isinstancestrhasattrsocketencoder   
SOCK_DGRAMsetblockingconnectr   sendOSErrorUnicodeError
ValueError)messageaddresspayloadsenders       r   notifyr&      s     jjnn_b1779Ggs#769%	..)]]6>>6+<+<= 	!u%NN?734KK 		!
 	!
 \:. s1   AC, =C C,  C)%C, )C, ,DDc                 f   t         j                  j                  dd      j                         syt	        t
        d      syt         j                  j                  dd      j                         } | sy	 t        |       dz  }t        j                  |      r|dk  ry|S # t        t        f$ r Y yw xY w)z9Return systemd's configured watchdog interval in seconds.r   r   Nr   WATCHDOG_USECg    .Ar   )r   r   r   r   r   r   float	TypeErrorr!   mathisfinite)r
   intervals     r   watchdog_interval_secondsr.   *   s    ::>>/2.44669%
**.."
-
3
3
5C:+ =="h!mO	 z" s   3B B0/B0c                      e Zd ZdZddd	 	 	 	 	 ddZedd       Zedd       Zedd       Zdd	Z	dd
Z
dddZddZddZddZy)SystemdWatchdogzEFeed systemd while the asyncio event loop continues to make progress.TN)config_enabledlag_tolerance_secondsc                   t        |      | _        t               | _        || _        d | _        d| _        d| _        d| _        y )NF)	bool_config_enabledr.   interval_seconds_lag_tolerance_seconds_task
_unhealthy	_stopping_stopping_notified)selfr1   r2   s      r   __init__zSystemdWatchdog.__init__?   sA      $N3 9 ;&;#37
"'r   c                :    | j                   xr | j                  d uS N)r5   r6   r<   s    r   enabledzSystemdWatchdog.enabledM   s    ##I(=(=T(IIr   c                    | j                   S r?   )r9   r@   s    r   	unhealthyzSystemdWatchdog.unhealthyQ   s    r   c                    | j                   S r?   )r8   r@   s    r   taskzSystemdWatchdog.taskU   s    zzr   c                   | j                   xs d}| j                  }|t        d|dz        S 	 t        |      }t        j                  |      st        d|dz        S t        d|      S # t        t
        f$ r t        d|dz        cY S w xY w)N        g?g      ?)r6   r7   maxr)   r*   r!   r+   r,   )r<   r-   
configuredvalues       r   _lag_tolerancezSystemdWatchdog._lag_toleranceY   s    ((/C00
sHtO,,	-*%E }}U#sHtO,,3	 :& 	-sHtO,,	-s   A* *B
Bc                2   | j                   sy| j                  | j                  j                         sy	 t        j                          d| _        d| _        d| _        t        j                  | j                         d      | _        y# t
        $ r Y yw xY w)zAStart the loop-progress sampler when systemd watchdog is enabled.FTzhermes-systemd-watchdog)name)rA   r8   doneasyncioget_running_loopRuntimeErrorr:   r9   r;   create_task_runr@   s    r   startzSystemdWatchdog.startf   s    ||::!$**//*;	$$& "'((;TU
  		s   B
 
	BBc                v    | j                   syt        |xs d      j                  dd      }t        d|       S )z=Tell systemd that startup completed and the gateway is ready.FGateway running
 zREADY=1
STATUS=)rA   r   replacer&   )r<   statussafe_statuss      r   readyzSystemdWatchdog.readyv   s<    ||&5$56>>tSI(677r   c               J   | j                   r| j                  s| j                  ry	 t        |      t        |      z
  }t        j                  |      r|| j                         kD  rd| _        t        d       yt        d       y# t        t
        f$ r t        d      }Y cw xY w)zAFeed systemd only when the event loop woke within its lag budget.FinfTz6STATUS=watchdog unhealthy: event loop progress is latez
WATCHDOG=1)
rA   r:   r9   r)   r*   r!   r+   r,   rK   r&   )r<   scheduled_atnowlags       r   record_tickzSystemdWatchdog.record_tick}   s    ||t~~	*u\22C }}S!S4+>+>+@%@"DOKL| :& 	,C	s   B B"!B"c                  K   | j                   }|y t        d|dz        }t        j                         }|j	                         |z   }	 | j
                  s| j                  st        j                  t        d||j	                         z
               d {    |j	                         }| j                  ||      sy ||z  }||k  r||z   }| j
                  s| j                  sy y y y 7 T# t        j                  $ r Y y w xY ww)Ng{Gz?g       @rG   )r_   r`   )
r6   rH   rO   rP   timer:   r9   sleeprb   CancelledError)r<   r-   cadenceloopr_   r`   s         r   rS   zSystemdWatchdog._run   s     ((dHsN+'')yy{W,
	nnT__mmC\DIIK-G$HIIIiik''\s'K'#%#&=L nnT__n_nI %% 		sI   AD	AC+ C)'C+ <D='C+ %D)C+ +D>D DDc                l  K   d| _         | j                  }t        j                         }|/||ur+|j	                         s|j                          	 | d{    d| _        | j                  r | j                  st        d       d| _	        yyy7 8# t        j                  $ r Y Kt        $ r Y Uw xY ww)z:Stop feeding systemd and emit ``STOPPING=1`` at most once.TNz
STOPPING=1)r:   r8   rO   current_taskrN   cancelrf   	ExceptionrA   r;   r&   )r<   rE   currents      r   stopzSystemdWatchdog.stop   s     zz&&(G 399;


 
<< 7 7< &*D# !8< ))  sH   AB4B BB 4B4B B1$B4&B1.B40B11B4)r1   r4   r2   Optional[float]returnNone)rp   r4   )rp   zOptional[asyncio.Task[None]])rp   r)   )rV   )rZ   r   rp   r4   )r_   r)   r`   r)   rp   r4   )rp   rq   )__name__
__module____qualname____doc__r=   propertyrA   rC   rE   rK   rT   r\   rb   rS   rn    r   r   r0   r0   <   s    O
  $15	( (  /	(
 
( J J     8&+r   r0   )r
   r   rp   r   )r"   r   rp   r4   )rp   ro   )ru   
__future__r   rO   r+   r   r   typingr   r   r&   r.   r0   rw   r   r   <module>rz      s5    F "   	  :
2$t+ t+r   