+
    s6j                     N    R t ^ RIt^ RIt^ RIt^ RIt^RIHt ^t ! R R4      tR# )u  sshj.state — live ssh connection state (outgoing + incoming).

B2 step 3b: moved verbatim from sshj_cli.py (single-file era) — no
behavior change. Owns CONNS_REFRESH (only its consumer, Conns,
lives here). Uses discover.ssh_target_from_line for the ps scan.
N)ssh_target_from_linec                   `   a  ] tR t^t o RtR tR tR tR tR t	R t
R tR	 tR
 tR tRtV tR# )ConnszOutgoing ssh sessions per host (ps) + incoming sessions to this box
(ss / /proc/net/tcp, who). Rescanned in a background thread.c                ~    Wn         \        P                  ! 4       V n        / V n        . V n        R V n        RV n        R# )FN)hosts_fn	threadingLocklockoutincomingdonet)selfr   s   &&src/sshj/state.py__init__Conns.__init__   s1     NN$		    c                &    V P                  4        R # N)_scanr   s   &r   
first_passConns.first_pass   s    

r   c                    \         P                  ! R V P                  R7      V n        V P                  P	                  4        R# )T)daemontargetN)r   Thread_loopr   startr   s   &r   r   Conns.start"   s'    !!djjAr   c                    R V n         R# )TN)r   r   s   &r   stop
Conns.stop&   s	    	r   c                    V P                   '       g.   \        P                  ! \        4        V P	                  4        K?  R #   \
         d     KO  i ; ir   )r   timesleepCONNS_REFRESHr   	Exceptionr   s   &r   r   Conns._loop)   s>    )))JJ}%

   s   A AAc           
     z   / p \         P                  ! . RORR^R7      p/ pV P                  4        F  pVR,          VP                  R4      ;'       g    R3 F%  pV'       g   K  VP	                  WTR,          4       K'  	  VP                  R4      VP                  R4      rvV'       g   K{  V'       g   K  VP	                  V RV 2VR,          4       K  	  VP
                  P                  4        F  p\        V4      p	V	'       d   V	^,          R8X  d   K&  V	w  rrVP                  V4      ;'       g!    V
'       d   VP                  V
 RV 24      MR	pV'       g   Kn  VP                  V^ 4      ^,           W&   K  	  / p \         P                  ! . RORR^R7      pVP
                  P                  4       R
,           F  pVP                  4       p\        V4      ^8  d   K%  V^,          V^,          ppVP                  R^4      R,          pVR9   g   KY  VP                  R^4      ^ ,          pVP                  V^ 4      ^,           VV&   K  	  / p \         P                  ! R.RR^R7      pVP
                  P                  4        Fe  p\        P                  ! RV4      pV'       g   K$  VP                  4       '       g   K<  VP                  4       ^ ,          VVP                  ^4      &   Kg  	  V P                   ;_uu_ 4        Wn        \%        VP'                  4       4       UUu. uF  w  ppVP                  VR4      VV3NK  	  uppV n        R	R	R	4       R	#   \         d     ELi ; i  \         d    T P                  4       p EL<i ; i  \         d     Li ; iu uppi   + '       g   i     R	# ; i)psT)capture_outputtexttimeoutaliashostname user@trueN   NN:whoz\(([\d.]+|[0-9a-f:]+)\)\s*$)r*   z-eozargs=)ssz-tnstateestablished)222222)
subprocessrunr   get
setdefaultstdout
splitlinesr   r'   splitlenrsplit_scan_proc_tcpresearchgroupr	   r
   sorteditemsr   )r   r
   rmatcheshkuhnlncandr1   hostport_r.   incplocalpeerlportipusersmns   &                       r   r   Conns._scan1   s"   	5.2qJAG]]_G*aeeJ&7&=&=2>Aq**1j9 ? fquuZ'821&&!AbT{AgJ? % hh))++B/tAw&0&*#DD) E E59GKK4&$ 01t 5!$!2Q!6CJ , 	(D.2qJAhh))+B//HHJq6A:dAaDtS!,R0N*S!,Q/B!ggb!nq0CG 0 	wt$'(*Ahh))+II<bA1(*
1E!''!*% , YYYH*0*=?*=Q $iiB/Q7*=?DM Y7  		  	(%%'C	(  		? YYs   AM M &AM -M 7A>M 6M ?M !M BM0 9M0 AN .N -N #N)*!N#
	N)M-,M-0NNN N #N))N:	c                z   / pR EF  p \        V4      ;_uu_ 4       pVP                  4       P                  4       R,          pRRR4       X F  pTP	                  4       p\        T4      ^8  g   T^,          R8w  d   K3  \        T^,          P                  R^4      R,          ^4      pTR	9   g   Kf  T^,          P                  R^4      ^ ,          pRTR,          9  g   RT9   d
   T^,          pTP                  T^ 4      ^,           Y&   K  	  EK  	  V#   + '       g   i     L; i  \         d     EK4  i ; i)
/proc/net/tcpr4   N01r6   0:N   N)rc   z/proc/net/tcp6r;   )   i  )	openreadrC   OSErrorrD   rE   intrF   r@   )	r   rX   ffhlinesrS   rY   r\   r]   s	   &        r   rG   Conns._scan_proc_tcpg   s    4A!WWGGI00226E  HHJq6A:1AaDKKQ/3R8J&1S!,Q/B"R&(C2IqT!ggb!nq0CG  5  
 W s.   D*&DD*D'"D*'D**D:9D:c                    V P                   ;_uu_ 4        V P                  P                  V^ 4      uuRRR4       #   + '       g   i     R# ; i)    N)r	   r
   r@   )r   r.   s   &&r   countConns.count{   s)    YYY88<<q) YYYs	   <A	c                    V P                   ;_uu_ 4        \        V P                  4      uuRRR4       #   + '       g   i     R# ; i)u   The whole per-alias outgoing-session map in ONE locked snapshot.
render() uses it per frame (one lock instead of one per row —
render is on the hot path and must stay fast).N)r	   dictr
   r   s   &r   countsConns.counts   s$     YYY> YYY	   5A	c                    V P                   ;_uu_ 4        \        V P                  4      uuR R R 4       #   + '       g   i     R # ; ir   )r	   listr   r   s   &r   incoming_listConns.incoming_list   s#    YYY& YYYrx   )r   r   r   r	   r
   r   N)__name__
__module____qualname____firstlineno____doc__r   r   r   r!   r   r   rG   rr   rv   r{   __static_attributes____classdictcell__)__classdict__s   @r   r   r      sC     D4?l(*"' 'r   r   )	r   rH   r>   r   r$   discoverr   r&   r    r   r   <module>r      s.    
    * u' u'r   