
    @j(                     0   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJrJr  S SK	J
r
  S SKJr  \
" \5      R                  5       R                  r\S-  r\S-  r\R'                  SS9  S	 rS
 rS rS r " S S5      rS rS rS r\S:X  a  \" 5         gg)    N)datetime	timedelta)Path)urlopenzsupervisor_config.jsonlogsT)exist_okc                  J    [         R                  " 5       R                  S5      $ )N%Y-%m-%d %H:%M:%S)r   nowstrftime     nwals_broadcast_supervisor.pytsr      s    <<>""#677r   c                     U (       d  g[        [        R                  " 5       U -
  R                  5       5      nUS:  a  U S3$ US-  nUS:  a  U S3$ US-  nU SUS-   S3$ )Nnever<   zs agozm agozh )intr   r   total_seconds)dtsecminshrss       r   safe_age_textr      su    
x||~"113
4C
Rxe}"9Dbyu~
"*CU"TBYKu%%r   c                     S[        5        SU  3n[        [        S-  SSS9 nUR                  US-   5        S S S 5        g ! , (       d  f       g = f)N[z] zsupervisor.logautf-8encoding
)r   openLOG_DIRwrite)messagelinefs      r   log_liner(       sG    rtfBwi D	g((#	@A	t 
A	@	@s   A
Ac                      [        [        SSS9 n [        R                  " U 5      sS S S 5        $ ! , (       d  f       g = f)Nrr   r   )r"   CONFIG_PATHjsonload)r'   s    r   load_configr.   %   s'    	k3	1Qyy| 
2	1	1s   0
>c                   V    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)Service)   c                    Xl         X l        UR                  SUR                  SS5      5      U l        UR                  SU R                  R	                  5       R                  SS5      5      U l        [        UR                  SS5      5      U l        S U l	        SU l
        S	U l        S U l        S U l        S U l        S
U l        SU l        S U l        [$        R&                  " 5       U l        [*        U R                   S3-  U l        g )Nnamekeyservice _enabledTStopped   âš«r    z.log)cfgsettingsgetr3   lowerreplacer4   boolr8   processstatusstatus_iconlast_output
last_startlast_restartrestart_count
last_errorunhealthy_since	threadingLocklockr#   log_path)selfr<   r=   s      r   __init__Service.__init__*   s     GGFCGGE9$=>	775$))//"3";";C"EFCGGIt45# #NN$	TXXJd"33r   c                 z    SR                  U R                  S   /U R                  R                  S/ 5      -   5      $ )Nr6   commandargs)joinr<   r>   rO   s    r   command_displayService.command_display<   s1    xx),-VR0HHIIr   c                     [        U R                  SSSS9 nUR                  U5        S S S 5        g ! , (       d  f       g = f)Nr   r   r@   )r    errors)r"   rN   r$   )rO   r&   r'   s      r   write_service_logService.write_service_log?   s.    $--wyIQGGDM JIIs	   2
A c                 t   U R                   (       d  SU l        SU l        g U R                  R	                  SS5      nU R                  S   /U R                  R	                  S/ 5      -   nU R
                     SU l        SU l        SU l        S S S 5         [        R                  " UU[        R                  [        R                  [        R                  S	S
SSS	[        R                  S9U l        [        R                  " 5       U l        [        R                  " 5       U l        U R
                     SU l        SU l        S S S 5        [%        U R&                   SU R)                  5        SU S35        [*        R,                  " U R.                  S	S9R1                  5         g ! , (       d  f       GN= f! , (       d  f       Nz= f! [2         ai  nU R
                     SU l        SU l        [5        U5      U l        S S S 5        O! , (       d  f       O= f[%        U R&                   SU 35         S nAg S nAff = f)NDisabledu   âšªcwdr;   rS   rT   Starting   ðŸŸ¡Tr   r@      )
r_   stdoutstderrstdintextr    rZ   bufsizeuniversal_newlinescreationflagsRunning   ðŸŸ¢z: started with `z` in ``)targetdaemonzFailed to startu	   ðŸ”´z: failed to start: )r8   rC   rD   r<   r>   rM   rI   
subprocessPopenPIPESTDOUTDEVNULLCREATE_NEW_PROCESS_GROUPrB   r   r   rF   rE   r(   r3   rW   rK   Thread_pump_outputstart	Exceptionstr)rO   r_   cmdes       r   rw   Service.startC   s   ||$DK'Dhhll5"%xx	"#dhhll62&>>YY$DK)D DO 
	;%++!!(( ((  #'(AADL 'llnDO'||~D'#-   		{"243G3G3I2J&QTPUUVWXD$5$5dCIIK3 Y* 
  	;/#. "%a&  		{"5aS9::	;sV   6F!BG 0F3?A!G !
F03
G=G 
H7H2H9	H2
H	!H22H7c                 2   U R                   (       a  U R                   R                  (       d  g  U R                   R                   H.  n[        R                  " 5       U l        U R                  U5        M0     g ! [         a  nSU 3U l         S nAg S nAff = f)Nzoutput reader error: )rB   rc   r   r   rE   r[   rx   rI   )rO   r&   r{   s      r   rv   Service._pump_outputm   so    ||4<<#6#6	:++#+<<> &&t, ,  	: 5aS9DOO	:s   AA8 8
B
BBc                    U R                   nU(       a  UR                  5       b  g U R                     SU l        SU l        S S S 5        [        U R                   S35         UR                  [        R                  5        [        R                  " 5       [        U R                  R                  SS5      5      -   n[        R                  " 5       U:  aC  UR                  5       b  O1[        R                   " S5        [        R                  " 5       U:  a  MC  UR                  5       c   UR#                  5         U R                     SU l        SU l        S S S 5        g ! , (       d  f       GN$= f! [         a'     UR                  5          GN! [         a      GNf = ff = f! [         a     Nvf = f! , (       d  f       g = f)	NStoppingra   z
: stoppinggraceful_stop_seconds   g      ?r9   r:   )rB   pollrM   rC   rD   r(   r3   send_signalsignalCTRL_BREAK_EVENTrx   	terminatetimer   r=   r>   sleepkill)rO   pdeadlines      r   stopService.stopw   sT   LLAFFH(YY$DK)D  	DII;j)*	MM&112 99;T]]%6%67NPQ%R!SSiikH$vvx#JJt iikH$
 668 YY#DK'D Y5 Y  	 	   YsS   E"E0 *F$ F4
E-0
F!;F
FF!FF!$
F10F14
Gc                    U R                      SU 3U l        SU l        S S S 5        [        U R                   SU 35        U R                  5         [        R                  " [        U R                  R                  SS5      5      5        U =R                  S-  sl        [        R                  " 5       U l        S U l        U R!                  5         g ! , (       d  f       N= f)NzRestarting: ra   z: restarting because restart_cooldown_seconds   rb   )rM   rC   rD   r(   r3   r   r   r   r   r=   r>   rH   r   r   rG   rJ   rw   )rO   reasons     r   restartService.restart   s    YY(1DK)D  	DII;3F8<=		

3t}}(()CQGHIa$LLN#

 Ys   C
Cc                 d    U R                   S L =(       d    U R                   R                  5       S L$ )N)rB   r   rV   s    r   process_deadService.process_dead   s(    ||t#Ft||'8'8':$'FFr   c                    U R                   R                  S5      =(       d    SR                  5       nU(       d  g [        USS9 nSUR                  s=::  a  S:  a  O  OSS	UR                   34sS S S 5        $ S
S	UR                   34sS S S 5        $ ! , (       d  f       g = f! [
         a  nS
[        U5      4s S nA$ S nAff = f)N
health_urlr;   )Tr;   r   )timeout   i  TzHTTP F)r<   r>   stripr   rC   rx   ry   )rO   urlresponser{   s       r   health_url_okService.health_url_ok   s    xx||L)/R668	!a(H(///C/5(9!:: )( hoo%677 )((  	!#a&= 	!sG   
B& +B1	B& ;B	B& 
B#B& #B& &
C0C<CCc                    U R                   R                  S5      =(       d    SR                  5       n[        U R                   R                  S5      =(       d    S5      nU(       a  US::  a  g[	        U5      nUR                  5       (       d  SSU 34$ [        R                  " UR                  5       R                  5      n[        R                  " 5       U-
  nU[        US9:  a  SS	[        U5       34$ S
S[        U5       34$ )N
watch_filer;   restart_if_file_stale_minutesr   )Fr;   Tzwatch file missing: minuteszwatch file stale: Fzfile updated )r<   r>   r   r   r   existsr   fromtimestampstatst_mtimer   r   r   )rO   r   stale_minutespathmtimeages         r   
file_staleService.file_stale   s    hhll<06B==?
DHHLL)HINQO]a/J{{}}/
|<<<&&tyy{';';<llnu$=11-mE.B-CDDDmE&:%;<<<r   c                    U R                   (       d  g U R                  5       (       a3  U R                  R                  SS5      (       a  U R	                  S5        g [        U R                  R                  S5      =(       d    S5      nUS:  aT  U R                  (       aC  [        R                  " 5       U R                  -
  [        US9:  a  U R	                  SU S35        g U R                  5       u  p#U(       a  X0l        U R	                  U5        g U R                  R                  S	5      =(       d    S
R                  5       n[        U R                  R                  S5      =(       d    S5      nU(       a  US:  a  U R                  5       u  pgU(       a6  S U l        U R                  R!                  S5      (       a  SU l        SU l        OXpl        U R                  c  [        R                  " 5       U l        U R$                     SU 3U l        SU l        S S S 5        [        R                  " 5       U R                  -
  [        US9:  a  U R	                  SU SU 35        g U R                  R!                  S5      (       d$  U R$                     SU l        SU l        S S S 5        g g ! , (       d  f       N= f! , (       d  f       g = f)Nrestart_if_process_exitsTzprocess exitedrestart_if_silent_minutesr   r   zsilent for z minutesr   r;   restart_if_unhealthy_minutes	Unhealthyrj   rk   zUnhealthy: u   ðŸŸ zhealth check failed for z
 minutes: )r8   r   r<   r>   r   r   rE   r   r   r   r   rI   r   r   rJ   rC   
startswithrD   rM   )rO   silent_minutesstalefile_msgr   unhealthy_minutesokmsgs           r   checkService.check   s   ||xx||6==-.TXX\\*EFK!LA$"2"2||~ 0 009^3TT{>*:(CD//+&OLL"hhll<06B==?
-K L QPQR+a/((*GB'+$;;))+66"+DK'1D$"%''/+3<<>D(YY$/u"5DK'1D$  <<>D$8$889M^;__LL#;<M;NjY\X]!^_{{%%k22'#-   3 Y s   J+J<+
J9<
K
)r<   r8   r4   rI   rE   rG   rF   rM   rN   r3   rB   rH   r=   rC   rD   rJ   N)__name__
__module____qualname____firstlineno__rP   rW   r[   rw   rv   r   r   r   r   r   r   __static_attributes__r   r   r   r0   r0   )   s=    4$J(;T:!(F
G
!=,.r   r0   c                  f    [         R                  " [         R                  S:X  a  S5        g S5        g )Nntclsclear)ossystemr3   r   r   r   clear_screenr      s    IIrww$e4G4r   c                 f   [        5         [        S5        [        S5        [        S5        [        SUR                  S5       35        [        S[        U5      R	                  SS5       35        [        S5        U  GH  n[        UR
                   S	UR                   35        [        S
UR                   35        [        S[        UR                  5       35        [        S[        UR                  5       35        [        SUR                   35        UR                  R                  S5      =(       d    SR                  5       (       a'  [        SUR                  R                  S5       35        UR                  R                  S5      =(       d    SR                  5       (       a'  [        SUR                  R                  S5       35        UR                  (       a  [        SUR                   35        [        S5        GM     [        S[        5        [        S5        [        S5        g )NzH========================================================================z(              NWALS BROADCAST SUPERVISORz	Started: r
   z	Uptime : z agor;   zH------------------------------------------------------------------------r6   z   Status       : z   Last output  : z   Last restart : z   Restarts     : r   z   Health URL   : r   z   Watch file   : z   Last note    : zLogs folder:z3Press CTRL+C to stop supervisor and child services.)r   printr   r   r@   rD   r3   rC   rE   rG   rH   r<   r>   r   rI   r#   )services
started_atss      r   draw_dashboardr      s   N	(O	
45	(O	Ij))*=>?
@A	ImJ/77rBC
DE	(Oq)*"188*-."=#?"@AB"=#@"ABC"1??"345EEIIl#)r0022&quuyy'>&?@AEEIIl#)r0022&quuyy'>&?@A<<&q||n56h  
.'"	
?@	(Or   c                     [        5       n U R                  S0 5      nU R                  S/ 5       Vs/ s H  n[        X!5      PM     nn[        R                  " 5       n[        S5        U H  nUR                  5         M     Sn  U H  nUR                  5         M     [        R                  " 5       U-
  [        UR                  SS5      5      :  a   [        X45        [        R                  " 5       n[        R                  " [        UR                  SS5      5      5        M  s  snf ! [         a2    [        S	5        U H  nUR                  5         M     [        S
5         g f = f)Nr=   r   z#NWALS Broadcast Supervisor startingr   dashboard_refresh_seconds   check_every_seconds
   z9NWALS Broadcast Supervisor stopping by keyboard interruptz
Supervisor stopped.)r.   r>   r0   r   r   r(   rw   r   r   r   r   r   KeyboardInterruptr   r   )r<   r=   r   r   r   svc	last_draws          r   mainr     s    
-Cwwz2&H.1ggj".EF.E$.EHFJ23		  I'		   yy{Y&#hll;VXY.Z*[[x4 IIK	JJs8<<(=rBCD  G&  'LMCHHJ %&	's   D$B D) )9E%$E%__main__)r,   r   r   ro   sysrK   r   r   r   pathlibr   urllib.requestr   __file__resolveparentBASE_DIRr+   r#   mkdirr   r   r(   r.   r0   r   r   r   r   r   r   r   <module>r      s     	   
   (  ">!!#**11
V
 t 8
&
F. F.P52'8 zF r   