
    pj                    R   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l	m
Z
mZ ddlmZ ddlmZ  ee      j#                         j$                  d   Z ee      ej*                  vr"ej*                  j-                  d ee              G d	 d
e
      ZddZedk(  r e        yy)u  
Serve the Stage A **Today Trades** shareable site (optional password).

::

    cd /Users/robzingale/trading_bot

    # 1) Refresh snapshot
    PYTHONUNBUFFERED=1 .venv/bin/python -m RenTech.monitor.build_today_trades_snapshot \
      --nav 50000 --fund-scale 1.5 \
      --held AMZN,QCOM,AXP,INTC,LRCX,AMAT,MU,AMD,GEV

    # 2) Serve (password via env or flag)
    TODAY_TRADES_PASSWORD='share-me' .venv/bin/python -m RenTech.monitor.serve_today_trades

    # → http://127.0.0.1:8765/today_trades.html

For a friend on your LAN, bind all interfaces::

    TODAY_TRADES_PASSWORD='share-me' .venv/bin/python -m RenTech.monitor.serve_today_trades \
      --host 0.0.0.0 --port 8765
    )annotationsN)partial)SimpleHTTPRequestHandlerThreadingHTTPServer)Path)urlparse   c                  @     e Zd ZU dZded<   ddZd fdZd	dZ xZS )
TodayTradesHandlerNz
str | Nonepasswordc                   | j                   sy| j                  j                  dd      }|j                  d      r|dd  | j                   k(  ry|j                  d      rL	 t	        j
                  |dd        j                  d      }|j                  d	d
      d   | j                   k(  ry	 t        | j                        j                  }|j                  d      ryy# t        $ r Y =w xY w)NTAuthorization zBearer    zBasic    zutf-8:   today_trades_snapshot.jsonF)r   headersget
startswithbase64	b64decodedecodesplit	Exceptionr   pathendswith)selfauthrawr   s       >/opt/rentech/trading_bot/RenTech/monitor/serve_today_trades.py_authorizedzTodayTradesHandler._authorized,   s    }}||4??9%$qr(dmm*C??8$&&tABx077@99S!$R(DMM9 :
 		"''==56  s    A	C 	C)(C)c                b   t        | j                        j                  }|j                  d      rq| j                         sa| j	                  d       | j                  dd       | j                  dd       | j                          | j                  j                  d       y t        | )         S )Nr   i  zWWW-AuthenticatezBearer realm="RenTech Today"zContent-Typezapplication/jsons   {"error":"unauthorized"})r   r   r   r$   send_responsesend_headerend_headerswfilewritesuperdo_GET)r    r   	__class__s     r#   r,   zTodayTradesHandler.do_GET@   s    		"''==56t?O?O?Qs#/1OP^-?@JJ89w~    c                p    t         j                  j                  | j                         d||z  d       y )Nz - 
)sysstderrr*   address_string)r    fmtargss      r#   log_messagezTodayTradesHandler.log_messageK   s&    

(;(;(=sTzJKr.   )returnboolr7   None)r4   strr7   r:   )	__name__
__module____qualname__r   __annotations__r$   r,   r6   __classcell__)r-   s   @r#   r   r   )   s    Hj(	 Lr.   r   c            	        t        j                  t        j                  d      d         } | j	                  dd       | j	                  dt
        d	       | j	                  d
t        j                  j                  dd      d       | j	                  dt        t        d       | j                         }|j                  j                         j                         }t        j                  |       t!        t"        t%        |            }t%        |j&                        j)                         xs d t"        _        t+        |j,                  t        |j.                        f|      }t"        j&                  rdnd}t1        d|        t1        d|j,                   d|j.                   d| d       |j,                  dv rt1        d       	 |j3                          y # t4        $ r t1        d       Y y w xY w)Nz

r   )descriptionz--hostz	127.0.0.1)defaultz--porti="  )typerC   z
--passwordTODAY_TRADES_PASSWORDr   z6Protect snapshot JSON (also set TODAY_TRADES_PASSWORD))rC   helpz--rootzNHTTP document root (repo root so today_trades.html + RenTech/data/... resolve))rD   rC   rF   )	directoryzpassword ONzpassword OFFzServing zOpen http://r   z/today_trades.html  ())z0.0.0.0z::z-LAN: use this machine's IP instead of 0.0.0.0z	
Stopped.)argparseArgumentParser__doc__r   add_argumentintosenvironr   r   _REPO
parse_argsroot
expanduserresolvechdirr   r   r;   r   stripr   hostportprintserve_foreverKeyboardInterrupt)apr5   rR   handlerhttpdpw_notes         r#   mainr`   O   s   		 	 W]]6-B1-E	FBOOHkO2OOH3O5OO

6;E  
 OO]	   ==?D99!))+DHHTN(CI>G"%dmm"4":":"<"DC		N ;WEE1::mG	HTF
	L1TYYK/DWIQ
OPyy%%=> ls   G G65G6__main__r9   )rK   
__future__r   rI   r   rN   r1   	functoolsr   http.serverr   r   pathlibr   urllib.parser   __file__rT   parentsrP   r;   r   insertr   r`   r<    r.   r#   <module>rk      s   . #   	 
  E  !X ((+u:SXXHHOOAs5z"#L1 #LLD zF r.   