
    -Ej                         S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	r	  \	" S5      r
SS jrSS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jrSS jrg)zRead-only detection of installed runtimes, services and databases.

Detection is by presence + version only. We never start, stop, reload or
configure anything, and never read database contents or credentials.
    )annotationsN)Any)run_readonly)
get_loggerzdiscovery.servicesc                2    [         R                  " U 5      S L$ )N)shutilwhich)binarys    <D:\Programs\laragon\www\wolf\agent\src\discovery\services.py_presentr      s    <<t++    c                    [        U 5      nU(       d  g UR                  5       (       a!  UR                  5       R                  5       S   $ S $ )Nr   )r   strip
splitlines)cmdoutputs     r   _versionr      s;    #F-3\\^^6<<>$$&q)EEr   c                    [        / SQ5      n / nU (       d  U$ U R                  5        H`  nUR                  SS9n[        U5      S:  d  M#  US   R	                  S5      (       d  M>  UR                  US   US   US   US   S	.5        Mb     U$ )
z.List loaded systemd service units (read-only).)	systemctlz
list-unitsz--type=servicez--allz--no-legendz
--no-pager   )maxsplitr   z.service         )unitloadactivesub)r   r   splitlenendswithappend)r   serviceslinefieldss       r   systemd_servicesr&      s    [F &(H!!#Q'v;!q	 2 2: > >OO"1I"1I$Qi!!9	 $ Or   c                     [        S5      [        SS/5      S.[        S5      =(       d    [        S5      [        SS/5      =(       d    [        SS/5      S.S.$ )Nnginxz-vpresentversionapache2httpd)r(   apacher   r    r   r   web_serversr1   3   s[      ($0

  	*?hw.?D 12Oh6O
	 	r   c                     [        S5      [        SS/5      S.[        S5      [        SS/5      S.[        S5      =(       d    [        S5      [        SS/5      =(       d    [        SS/5      S.S.$ )Nphp	--versionr)   nodepython3python)r3   r5   r7   r/   r0   r   r   language_runtimesr8   @   sm    #E?x@T7UV$V,6;BW9XY	*@hx.@K 89^XxQ\F]=^
 r   c                 L   S[        S5      / S.0n U S   S   (       d  U $ [        SS/5      U S   S'   [        / SQ5      nU(       a]  UR                  5        HI  nUR	                  S5      n[        U5      S:X  d  M%  U S   S	   R                  US
   US   US   S.5        MK     U $ )z@Docker presence and a read-only list of containers if available.docker)r*   
containersr*   r4   r+   )r:   psz-az--formatz!{{.Names}}	{{.Image}}	{{.Status}}	r   r;   r   r   r   )nameimagestatus)r   r   r   r   r   r    r"   )resultr   r$   partss       r   r;   r;   K   s    &HX4FVX(YZF(I&"*Hk+B"CF8Y QF %%'DJJt$E5zQx .55"1XaE!HM ( Mr   c                 |   [        S5      =(       d    [        S5      =(       d    [        S5      [        SS/5      S.[        S5      =(       d    [        S5      [        SS/5      S.[        S5      =(       d    [        S5      [        SS/5      S.[        S	5      =(       d    [        S
5      [        S	S/5      S.S.$ )zDetect database engines by client/server binary presence only.

SECURITY: we never connect to a database, run queries, or read data files.
mysqlmysqldmariadbdr4   r)   mariadbpsqlpostgreszredis-serverz	redis-cli)rD   rG   
postgresqlredisr/   r0   r   r   	databasesrL   `   s      (VHX,>V(:BV+ 67

  	*Bhz.BK 89

  '?8J+? 56

  /H8K3H =>
 r   c                     / n [        SS/5      nU(       d  U $ UR                  5        HH  nUR                  5       nU(       d  M  UR                  S5      (       a  M4  U R	                  SUS.5        MJ     U $ )zEList user crontab entries (read-only). System cron dirs left as TODO.crontabz-l#user_crontab)sourceentry)r   r   r   
startswithr"   )jobsr   r$   strippeds       r   	cron_jobsrV   y   si    !#D9d+,F!!#::<8H//44KK>HEF $ Kr   c                     [        S5      $ )z:Return True if certbot binary is installed and executable.certbot)r   r0   r   r   certbot_availablerY      s    Ir   )r
   strreturnbool)r   z	list[str]r[   z
str | None)r[   zlist[dict[str, Any]])r[   zdict[str, Any])r[   r\   )__doc__
__future__r   r   typingr   discovery.systemr   loggerr   logr   r   r&   r1   r8   r;   rL   rV   rY   r0   r   r   <module>rc      sT    #   ) %&,F,
*2
r   