
    ~hVj                     x   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Zddl	Zddl
m
Z
mZ ddlmZmZ dZej                   j#                  dd      ZdZd	Z ej*                         Zd
ddZdedefdZdefdZd ZdefdZd Zd Zddede fdZ! G d de      Z"e#dk(  r edefe"      jI                          yy)u9  
Aria Health Server - minimaler JSON-Endpoint auf Port 9090.
GET /health       -> {"status": "ok", "services": {...}, ...}   (cached, fast)
GET /health/full  -> identisch, aber cache wird gebrochen        (slow)

KAR-56 (11.05.2026): Cache (30s) und ThreadingHTTPServer. Vorher curl --max-time 3
timeoutet weil collect() ca. 5s braucht (Anthropic + Telegram Network-Calls).

14.07.2026 (Dashboard-offline-Fix): Der Service laeuft als root, Aria seit der
User-Migration aber als User aria — expanduser("~") zeigte auf die falsche Welt.
Alle Pfade fest auf /home/aria.
    N)datetimetimezone)ThreadingHTTPServerBaseHTTPRequestHandleri#  ARIA_DB_PATHz/home/aria/.aria-chat.dbz/home/aria/.env   g        )tsdatanamereturnc                     	 t        j                  dd| gddd      }|j                  j                         dk(  S # t        $ r Y yw xY w)N	systemctlz	is-activeT   capture_outputtexttimeoutactiveF)
subprocessrunstdoutstrip	Exception)r   rs     #/home/aria/scripts/health-server.py
svc_activer      sN    NNKd;*.T1Fxx~~8++ s   8; 	AAc                     d } d}t         j                  j                  |      rFt        |      D ]8  }|j	                  d      s|j                  dd      d   j                         }  n | sy	 t        j                  j                  d|  d      }t        j                  j                  |d	      5 }t        j                  |j                               j                  d
d      cd d d        S # 1 sw Y   y xY w# t        $ r Y yw xY w)Nz)/home/aria/.claude/channels/telegram/.envzTELEGRAM_BOT_TOKEN==   Fzhttps://api.telegram.org/botz/getMe   r   ok)ospathexistsopen
startswithsplitr   urllibrequestRequesturlopenjsonloadsreadgetr   )tokentg_envlinereqr   s        r   telegram_pingr5   $   s    E8F	ww~~fL 	D45

3*1-335	 nn$$'CE7&%QR^^##C#3 	9q::affh'++D%8	9 	9 	9 s1   .AC; 23C/%	C; /C84C; 8C; ;	DDc                     t         j                  j                  t              sy 	 t	        j
                  t        d      } | j                  d      j                         }| j                          |r|d   S d S # t        $ r Y y w xY w)Nr   r!   zESELECT created_at FROM aria_chat_log ORDER BY created_at DESC LIMIT 1r   )
r#   r$   r%   DB_PATHsqlite3connectexecutefetchonecloser   )connrows     r   last_chat_tsr?   6   ss    77>>'"w2llS

(* 	 	

s1v&$& s   AA9 7A9 9	BBc            
         d } t         j                  j                  t              rJt	        t              D ]8  }|j                  d      s|j                  dd      d   j                         }  n | sy 	 t        j                  j                  dt        j                  dddddgd	      j                         | d
ddd      }t        j                  j                  |d      5 }|j                  dk(  cd d d        S # 1 sw Y   y xY w# t        j                   j"                  $ r}|j$                  dvcY d }~S d }~wt&        $ r Y yw xY w)NzANTHROPIC_API_KEY=r   r   z%https://api.anthropic.com/v1/messageszclaude-haiku-4-5-20251001userhi)rolecontent)model
max_tokensmessagesz
2023-06-01application/json)z	x-api-keyzanthropic-versioncontent-typePOST)r
   headersmethod   r!      )i  i  F)r#   r$   r%   ENV_FILEr&   r'   r(   r   r)   r*   r+   r-   dumpsencoder,   statuserror	HTTPErrorcoder   )keyr3   r4   r   es        r   anthropic_validrX   D   s*   
C	ww~~hN 	D34jja(+113	 nn$$34&,>?  vx"%L%79 % 

 ^^##C#3 	#q88s?	# 	# 	#<<!! (vvZ'' sC   4A1D
 %C>4	D
 >DD
 D
 
E	'D:4E	:E	E	c            
          d} t         j                  j                  |       sy 	 t        j                  ddd|  d| dddgd	d	d
      }|j
                  j                         xs d S # t        $ r Y y w xY w)Nz/home/aria/braingitz-czsafe.directory=z-Clogz-1z--format=%ciTr   r   )r#   r$   isdirr   r   r   r   r   )brainr   s     r   brain_last_changer^   b   s~    E77== NNE4?5')BD%!49*.T1F xx~~'4' s   AA& &	A21A2c                  L   t               } t               }t        d      t        d      t        d      d}t        |j	                               xr | xr |du}|rdndt        j                  t        j                        j                         || |t               t               dS )	Nzaria.servicezaria-chat-logger-sqlite.servicezaria-health.service)ariazaria-chat-loggerzaria-healthFr"   degraded)rR   	timestampservicestelegram_reachableanthropic_key_valid	last_chatr^   )r5   rX   r   allvaluesr   nowr   utc	isoformatr?   r^   )tganthrc   all_oks       r   collectro   q   s    	BD>* ''HI!"78H "#@@t5/@F $j\\(,,/99; #!^.0     force_refreshc                    t        j                          }t        5  | sRt        d   rI|t        d   z
  t        k  r6t	        t        d         }t        |t        d   z
  d      |d<   |cddd       S ddd       t               }d|d<   t        5  |t        d<   |t        d<   ddd       |S # 1 sw Y   ;xY w# 1 sw Y   |S xY w)zcollect() macht 3+ Network-Calls (5-8s gesamt). Bei /health cachen wir
    das Ergebnis fuer CACHE_TTL_SEC, /health/full erzwingt Refresh.r
   r	      cache_age_sNr   )time_cache_lock_cacheCACHE_TTL_SECdictroundro   )rq   ri   r
   freshs       r   collect_cachedr|      s     ))+C	 S6$<5G=4Xv'D"'fTl(:A">D	  
 IEE-	 tv L  Ls   AB*B6*B36C c                       e Zd Zd Zd Zy)Hc                    | j                   dv rt        d      }n>| j                   dk(  rt        d      }n"| j                  d       | j                          y t	        j
                  |d      j                         }	 | j                  d	       | j                  d
d       | j                  dt        t        |                   | j                          | j                  j                  |       y # t        $ r Y y w xY w)N)z/health/F)rq   z/health/fullTi  rs   )indentrN   rI   rH   zcontent-length)r$   r|   send_responseend_headersr-   rP   rQ   send_headerstrlenwfilewriteBrokenPipeError)selfr
   bodys      r   do_GETzH.do_GET   s    99((!6DYY.(!5Ds#T%5%5%7zz$q)002	s#^-?@-s3t9~>JJT" 		s    A2C3 3	C?>C?c                      y )N )r   fmtargss      r   log_messagezH.log_message   s    rp   N)__name__
__module____qualname__r   r   r   rp   r   r~   r~      s    $rp   r~   __main__z	127.0.0.1)F)%__doc__r-   r#   r   r8   	threadingru   urllib.requestr)   urllib.errorr   r   http.serverr   r   PORTenvironr0   r7   rO   rx   Lockrv   rw   r   boolr   r5   r?   rX   r^   ro   ry   r|   r~   r   serve_foreverr   rp   r   <module>r      s    T S S S ' C
**..)C
DinnT	"S T t $ <,$ 4 " . zd+Q/==? rp   