
    \j                     N   d Z ddlZddlZddlZddlZddlZddlZddlmZ dZ	dZ
dZdZdZd	Zej                  j!                  ej                  j#                  e            Zej                  j)                  ed
      ZdddddddZdZd Zd Zd Zd Zd Zedk(  r e        yy)u-  
DZW 뷰어 서버 감시장치 (watchdog)
------------------------------------------------------------
목적: 3D 뷰어 서버(8090·8095)가 소리 없이 죽으면 CEO 브라우저가
      캐시된 옛 코드로만 돌아가는 사태가 재발한다. 60초마다 살아있는지
      확인하고, 죽어 있으면 자동으로 다시 띄운다.

- 표준 라이브러리만 사용
- 자기 자신은 lock 소켓(포트)으로 1개만 실행되도록 보장
- 재기동 시각·사유를 dzw_watchdog.log 에 한 줄씩 기록(최근 500줄 유지)
    N)datetimez@C:\Users\user\AppData\Local\Programs\Python\Python312\python.exez /DOZIKWORKS_OS_v5_locked.dc.html<      i    zdzw_watchdog.logu-   E:\도진팩토리\3D스캔및티칭시스템zdzw_server.py)cwdscriptu-   E:\도진팩토리\3D스캔티칭_20260709판)i  i  i   c                    t        j                         j                  d      }d| d|  }	 t        t        dd      5 }|j                  |dz          ddd       t        t        d	dd
      5 }|j                         }ddd       t              t        kD  r5t        t        dd      5 }|j                  |t         d        ddd       yy# 1 sw Y   }xY w# 1 sw Y   ]xY w# 1 sw Y   yxY w# t        $ r Y yw xY w)u=   로그 한 줄 기록 후 최근 LOG_MAX_LINES 줄만 유지.z%Y-%m-%d %H:%M:%S[z] azutf-8)encoding
Nrreplace)r   errorsw)r   nowstrftimeopenLOG_PATHwrite	readlineslenLOG_MAX_LINES
writelines	Exception)msgtslinefliness        =   E:/도진팩토리/3D스캔및티칭시스템/dzw_watchdog.pylogr"   2   s    		 	 !4	5Brd"SE?D(C'2aGGD4K  3 (C')DKKME Eu:%hg6!UM>?34 76 & 32 ED 76 s^   C4 CC4 /C ,C4 ,C(C4 CC4 C%!C4 (C1-C4 1C4 4	D ?D c                      t        j                   t         j                  t         j                        } 	 | j                  dt        f       | j                  d       | S # t        $ r | j                          Y yw xY w)uO   lock 소켓을 잡아 감시장치가 하나만 돌게 한다. 실패 시 None.z	127.0.0.1   N)socketAF_INETSOCK_STREAMbindSELF_LOCK_PORTlistenOSErrorclose)ss    r!   acquire_single_instance_lockr.   D   s]    fnnf&8&89A	^,-	 		s   )A A:9A:c                 6   d|  t          }	 t        j                  j                  |d      }t        j                  j	                  |t
              5 }d|j                  cxk  xr dk  nc cddd       S # 1 sw Y   yxY w# t        $ r 	 t        j                  j                  |d      }t        j                  j	                  |t
              5 }d|j                  cxk  xr dk  nc cddd       cY S # 1 sw Y   nxY wY y# t        $ r Y Y y	w xY ww xY w)
u7   해당 포트의 뷰어 페이지가 응답하면 True.zhttp://localhost:HEAD)method)timeout   r   NGETF)CHECK_URL_PATHurllibrequestRequesturlopenHTTP_TIMEOUTstatusr   )porturlreqresps       r!   is_aliver@   Q   s    dVN#3
4Cnn$$S$8^^##C#>$$++++ ?>> 	..((U(;C''\'Bddkk/C/ CBBB 		sg   AB A7-	B 7B <B  B 	DADC9-	D6D9D	>D	DDDDc                 j   t         |    }|d   }|d   }	 t        j                  t        |t	        |       g|t
        t        j                  t        j                  t        j                  d       t        d|  dt         d| d|  d| 
       y# t        $ r}t        d	|  d
|       Y d}~yd}~ww xY w)u"   죽은 서버를 다시 띄운다.r   r   T)r   creationflagsstdinstdoutstderr	close_fdsu   재기동 실행: 포트 u    (사유: 무응답) ->  z @ u   재기동 실패: 포트 u	    사유: NF)	TARGETS
subprocessPopen
PYTHON_EXEstrCREATE_NO_WINDOWDEVNULLr"   r   )r<   cfgr   r   es        r!   restart_serverrQ   b   s    
$-C
e*C]FT+*$$%%%%	
 	'v-Ej\QRSYRZZ[\`[aadehdijk 'vYqe<=s   A8B 	B2B--B2c            	         t               } | (t        dt         d       t        j                  d       t        ddj                  t        t        t                     dt         d       	 	 t        D ]=  }t        |      rt        d| d	       t        |       t        j                  d
       ? t        j                  t               `# 	 | j                          w # t        $ r Y w w xY wxY w)Nu+   감시장치 이미 실행 중(lock 포트 u!   ) — 이번 인스턴스 종료.r   u$   감시장치 시작 (대상 포트: z, u	   , 주기 zs)u   무응답 감지: 포트 u    — 재기동 시도   )r.   r"   r)   sysexitjoinmaprL   rH   CHECK_INTERVALr@   rQ   timesleepr,   r   )lockr<   s     r!   mainr\   x   s    ')D|9.9IIjkl
.tyyS'9J/K.LIVdUeeghi~3D69NOP"4(JJqM   JJ~& 	JJL 		s7   -C AC C0C! C0!	C-*C0,C--C0__main__)__doc__osrT   rY   r%   rI   urllib.requestr6   r   rK   r5   rX   r:   r)   r   pathdirnameabspath__file__BASE_DIRrV   r   rH   rM   r"   r.   r@   rQ   r\   __name__     r!   <module>ri      s   
 
 
     
 Q
377??277??84577<<"45
 @!
 @!	  $
",0 zF rh   