+
    FjY&                     X   R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t^ RI
t
^ RIt^ RIHt ]P                  P                  RR4      t]! ]P                  P                  RR4      4      t]P                  P                  R]P&                  P)                  ]R4      4      t]P&                  P)                  ]R	4      t]P&                  P)                  ]R
4      t]P&                  P)                  ]R4      t]P&                  P)                  ]R4      t]P&                  P)                  ]R4      t]P&                  P)                  ]R4      t]P&                  P)                  ]R4      t]P&                  P)                  ]RR4      t]! ]P                  P                  RR4      4      t]! ]P                  P                  RR4      4      t ]!! ]
R^ 4      t"]!! ]
R^ 4      t#]!! ]
R^ 4      t$R t%R t&R t'R t(R t)R*R lt*R t+R  t,R! t-R" t.R# t/R$ t0R% t1R& t2R' t3R( t4]5R)8X  d
   ]4! 4        R# R# )+z
TripServer Admin Supervisor
Runs outside admin_server.py and owns starting/restarting/updating it.
Install as a Windows Scheduled Task at user logon using install_tripserver_supervisor.cmd.
N)PathTRIPSERVER_BASE_DIRzC:\TripServerTRIPSERVER_ADMIN_PORT8000TRIPSERVER_ADMIN_SCRIPTzadmin_server.py
supervisorzpending_admin_server.pyzrestart_request.jsonzrestart_request.done.jsonzrestart_request.failed.jsonztripserver_supervisor.lockztripserver_supervisor.logbackupsadmin_serverTRIPSERVER_SUPERVISOR_INTERVAL3!TRIPSERVER_SUPERVISOR_START_GRACE8CREATE_NO_WINDOWDETACHED_PROCESSCREATE_NEW_PROCESS_GROUPc                  .    \         P                  ! R 4      # )z%Y-%m-%d %H:%M:%S)timestrftime     0C:\TripServer\tripserver_admin_supervisor.py.tmpnowr   &   s    ==,--r   c                      \         P                  ! \        R R7       \         P                  ! \        R R7       \         P                  ! \        R R7       R# )T)exist_okN)osmakedirsBASE_DIRSUPERVISOR_DIR
BACKUP_DIRr   r   r   ensure_dirsr   *   s,    KK4(KK.KK
T*r   c                     \        4        \        4        R V  2p \        \        RRRR7      ;_uu_ 4       pVP	                  VR,           4       RRR4       R#   + '       g   i     R# ; i  \
         d     R# i ; i)z | supervisor | autf-8replaceencodingerrors
N)r   r   openLOG_PATHwrite	Exception)msglinefs   &  r   logr/   0   sc    MeW$SE*D(C')DDGGD4K  EDDD s.   A- AA- A*	$A- *A- -A<;A<c                     \         P                  ;'       g    R p \        P                  R8X  d   \        P                  P                  V 4      p\        P                  P                  V 4      P                  4       R8X  dP   V'       dH   \        P                  P                  VR 4      p\        P                  P                  V4      '       d   V# V # )z
python.exentzpythonw.exe)
sys
executabler   namepathdirnamebasenamelowerjoinexists)exefoldercands      r   get_python_consoler>   :   s    
..
(
(LC	ww$%77C &&(M9f77<<5Dww~~d##Jr   c                   a ^ RI pVP                  4       p\        V R4      ;_uu_ 4       o\        V3R lR4       F  pVP	                  V4       K  	  RRR4       VP                  4       #   + '       g   i     TP                  4       # ; i)    Nrbc                  &   < S P                  R4      # )i   i   )read)r.   s   r   <lambda>file_sha256.<locals>.<lambda>I   s    !&&"5r   r   )hashlibsha256r(   iterupdate	hexdigest)r5   rF   hchunkr.   s   &   @r   file_sha256rM   E   sh    A	dD		Q5s;EHHUO < 
 ;;= 
	 ;;=s   )A++B
	c                 "    \         P                  P                  R \         R2V R7      ;_uu_ 4       pVP	                  ^4      pVP
                  ^8H  ;'       d    RV9   uuRRR4       #   + '       g   i     R# ; i  \         d     R# i ; i)zhttp://127.0.0.1:z
/ping.json)timeouts   okNF)urllibrequesturlopen
ADMIN_PORTrC   statusr+   )rO   rdatas   &  r   	http_pingrW   N   sv    ^^##&7
|:$NX_#``de66#;D88s?44u} a```  s.   1A? -A+ 
A? +A<	6A? <A? ?BBc                  R   \         P                   ! \         P                  \         P                  4      p V P                  R 4        V P	                  R\
        34      ^ 8H   V P                  4        #   \         d     # i ; i   T P                  4        i   \         d     i i ; i; i)      ?z	127.0.0.1)socketAF_INETSOCK_STREAM
settimeout
connect_exrS   closer+   )ss    r   	port_openra   W   s    fnnf&8&89ALL||[*56!;	GGI 			GGI 		sB   B  A11A?>A?B&BB&B# B&"B##B&c                  X   \         P                  R 8w  d   . #  \        P                  ! RR.RRR^R7      p \	        4       pV P
                  ;'       g    RP                  4        F  pR\         2V9  d   K  RVP                  4       9  d   K*  VP                  4       pV'       g   KD  VR,          P                  4       '       g   Kc  VP                  \        VR,          4      4       K  	  \        V4      #   \         d(   p\        R	\!        T4      ,           4       . u R
p?# R
p?ii ; i)r1   netstatz-anoTr#   capture_outputtextr&   rO    :	LISTENINGzport_pids failed: N)r   r4   
subprocessrunsetstdout
splitlinesrS   uppersplitisdigitaddintsortedr+   r/   repr)cppidsr-   partsexcs        r   	port_pidsr{   c   s    	ww$	^^Y/4XaklmuYY__"002D:,t+$**,.JJLEur**,,U2Y( 3 d|  49,-	s0   9C7 AC7 (C7 /C7 7D)D$D)$D)c                    V  F  pV\         P                  ! 4       8X  d   K   \        P                  ! R R\	        V4      R.RRR^
R7      p\        RT RVP                   RVP                  ;'       g    R	P                  4        R
VP                  ;'       g    R	P                  4        24       K  	  R#   \         d   p\        RT RT: 24        Rp?K  Rp?ii ; i)taskkillz/PIDz/FTr#   rd   ztaskkill pid=z rc=z out=rg   z err=z	 failed: N)r   getpidrk   rl   strr/   
returncodern   stripstderrr+   )rx   pidrw   rz   s   &   r   	kill_pidsr   w   s    "))+	7VSXt DUY`dmv  AC  DB-uDubiioo2=T=T=V<WW\^`^g^g^m^mkm]t]t]v\wxy   	7-uIcW566	7s$   AB64$B6B66CCCc                  p   \         P                  P                  \        4      '       g   \	        R \        ,           4       R# \        4       p ^ p\         P                  R8X  d   \        \        ,          p \        P                  ! V \        .\         P                  P                  \        4      ;'       g    \        \        P                  \        P                  \        P                  T\         P                  R8X  d   RMR\         P                  R8g  R7      p\	        RVP                   RV  R\         24       \        P                   ! \"        4       \	        R\%        4        R	\'        4        R
\)        4        24       R#   \*         d'   p\	        R\-        T4      ,           4        Rp?R# Rp?ii ; i)zadmin script missing: Fr1   T)cwdstdinrn   r   creationflags	close_fdsstart_new_sessionzstarted admin pid=z python=z script=zpost-start ping=z port_open=z pids=zstart_admin failed: N)r   r5   r:   ADMIN_SCRIPTr/   r>   r4   r   r   rk   Popenr6   r   DEVNULLr   r   sleepSTART_GRACE_SECONDSrW   ra   r{   r+   rv   )pyflagsprocrz   s       r   start_adminr      s/   77>>,''$|34		BE	ww$ #;;-99$$%%%%!ww$eD!ww$	
 	 
(2$h|nMN

&'y{m;y{m6)+WX "T#Y./s    5A F 6CF F5F00F5c                  L   \        4       p V '       d'   \        R \        V 4      ,           4       \        V 4       \	        ^4       F,  p\        4       '       g    R# \        P                  ! R4       K.  	  \        R\        \        4       4      ,           4       \        4       '       * # )zstopping admin pids=TrY   z!port still open after stop; pids=)r{   r/   rv   r   rangera   r   r   )rx   _s     r   
stop_adminr      si    ;D"T$Z/0$2Y{{

3  +d9;.??@{?r   c                 6    \         P                  ! V R R7       R# )T)doraiseN)
py_compilecompile)r5   s   &r   compile_adminr      s    tT*r   c                     \         P                  P                  \        4      '       g   R # \        P
                  ! R4      p \         P                  P                  \        RV  R24      p\        P                  ! \        V4       V# )Nz%Y%m%d_%H%M%Sadmin_server_supervisor_backup_z.py)
r   r5   r:   r   r   r   r9   r   shutilcopy2)stamptargets     r   backup_activer      sW    77>>,''MM/*EWW\\*(Gwc&RSF
LLv&Mr   c            
         \         P                  P                  \        4      '       g   R # \	        4         \        \        RRRR7      ;_uu_ 4       p \        P                  ! V 4      pRRR4       \        R\        P                  ! XR R	7      ,           4       TP                  R
4      ;'       g    \         p \         P                  P                  T4      '       g   \#        RT,           4      h\%        T4       TP                  R4      p\'        T4      pT'       d>   TP)                  4       \+        T4      P)                  4       8w  d   \#        RT RT 24      h\-        4       p\/        4        \0        R,           p\        P2                  ! Y74       \         P4                  ! T\0        4       \        RT RT 24        \         P6                  ! T4       \9        4        \;        4       TR&   RTR&   YaR&   \        \<        RRR7      ;_uu_ 4       p \        P>                  ! YR ^R7       RRR4        \         P6                  ! \        4       R#   + '       g   i     EL; i  \         dY   p\        R\        T4      ,           4        \        P                  ! \        \        4       M  \         d     Mi ; i Rp?R# Rp?ii ; i  \         d     ELi ; i  + '       g   i     L; i  \         d     R# i ; i  \         d   p\        R\        T4      ,           4       \;        4       TR&   RTR&   \        T4      TR&    \        \        RRR7      ;_uu_ 4       p \        P>                  ! YR ^R7       RRR4       M$  + '       g   i     M; i  \         d     Mi ; i \         P4                  ! \        \        R,           4       M  \         d     Mi ; i Rp?R# Rp?ii ; i)FrU   r"   r#   r$   Nzbad request file: Tzupdate request: )ensure_asciipending_admin_pathzpending admin file missing: expected_sha256zpending sha mismatch expected=z actual=z.supervisor_newz"admin replaced from pending | sha=z
 | backup=
handled_atokresultbackupwr%   )r   indentzupdate request failed: failederrorz.failed) r   r5   r:   REQUEST_FILEr   r(   jsonloadr+   r/   rv   r   moveREQUEST_FAILED_FILEdumpsgetPENDING_ADMINRuntimeErrorr   rM   r8   r   r   r   r   r   r#   remover   r   REQUEST_DONE_FILEdump)r.   reqrz   pendingexpectedactualr   
tmp_actives           r   handle_update_requestr      s   77>>,''M	,giHHA))A,C I TZZ%@@Agg*+<<}G,ww~~g&&=GHHg77,-W%#h-*=*=*??!?zRXQYZ[[!$55
W)


:|,0
6(KL	IIg 	ELHH#S7;;qIIc5; <	IIl# Q IHH  49,-	KK&9: 		4  		 <;  		  %S	12EL HCyG	)3AAQ		#uQ? BAAA 			JJ|\I%=> 		s>  I# I)I# 9$L  C!L   K	 :L  K*L  3K. I 	I#  I# #K.K
J*)K*J85K7J88KK	KL  KL  K+	&L  .K=9L  <K==L   O,;O'N!N;NO'NNO'NN%"O'$N%%O')&OO'OO'OO''O,c                  *   \        4        \        P                  R 8w  d   R#  \        P                  P	                  \
        4      '       dR   \        P                  ! 4       \        P                  P                  \
        4      ,
          p V ^8  d   \        R4       R# \        \
        RRR7      ;_uu_ 4       pVP                  \        \        P                  ! 4       4      4       RRR4       R#   + '       g   i     R# ; i  \         d     R# i ; i)r1   Tz)another supervisor lock is fresh; exitingFr   r"   r   N)r   r   r4   r5   r:   	LOCK_FILEr   getmtimer/   r(   r*   r   r~   r+   )ager.   s     r   single_instance_okr      s    M	ww$
77>>)$$))+ 0 0 ;;CRx?@)S733qGGC		$% 4 43 s<   (D AD D 7.C/%D /D 	:D  D DDc                     \        4        \        R \        P                  ,           R,           \        ,           4       \        4       '       g   R# ^ p    \        \        RRR7      ;_uu_ 4       pVP                  \        \        P                  ! 4       4      R,           \        4       ,           4       RRR4       \        4       '       d   \        P                   ! \"        4       K  \%        4       '       d   \        P                  ! 4       p My\'        4       pT'       d   \)        4       M. pT'       d>   \        R\+        T4      ,           4       \-        T4       \        P                   ! R4       M\        R	4       \/        4         \        P                   ! \"        4       EKQ    + '       g   i     L; i  \         d     EL	i ; i  \         d&   p\        R
\+        T4      ,           4        Rp?LmRp?ii ; i)zstarting supervisor | python=z	 | admin=Nr   r"   r    z4ping failed but port open; killing stuck admin pids=      ?zadmin not listening; startingzloop error: )r   r/   r2   r3   r   r   r(   r   r*   r   r   r~   r   r+   r   r   r   CHECK_INTERVALrW   ra   r{   rv   r   r   )last_okr.   porx   rz   s        r   loopr   
  s=   M'#..8;FUVG
	,)S7;;qGGC		,s2SU:; <
 %&&

>*{{))+[&(y{bNQUVZQ[[\dOJJsO78 	

>"/ <; &  	,c*++	,sn   F5 .AF"2F5 :*G &%G %G 2AG "F2	-F5 1G 2F5 5G G GG G7G22G7__main__)r   )6__doc__r   r2   r   r   r   rZ   urllib.requestrP   urllib.errorrk   r   pathlibr   environr   r   rt   rS   r5   r9   r   r   r   r   r   r   r   r)   r   floatr   r   getattrr   r   r   r   r   r/   r>   rM   rW   ra   r{   r   r   r   r   r   r   r   r   __name__r   r   r   <module>r      s  
 
 
         ::>>/1AB 7@A
zz~~7hPa9bch5^-FGww||N,BCGGLL1LM ggll>3PQ GGLL)EF	77<<"=>WW\\(I~>
rzz~~&FLMBJJNN+NPSTU :'91= :'91= ":/I1M .+	(78
+=@$!#H zF r   