
    7j                        d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	  e	d      Z
ddZdd	Zdd
ZddZddZddZddZddZy)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                0    t        j                  |       d uS )N)shutilwhich)binarys    L/var/www/downloads.wolfpanel.net/public_html/agent/src/discovery/services.py_presentr      s    <<t++    c                    t        |       }|sy |j                         r!|j                         j                         d   S d S )Nr   )r   strip
splitlines)cmdoutputs     r   _versionr      s9    #F-3\\^6<<>$$&q)EEr   c                    t        g d      } g }| s|S | j                         D ]Z  }|j                  d      }t        |      dk\  s$|d   j	                  d      s9|j                  |d   |d   |d   |d   d	       \ |S )
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                     t        d      t        ddg      dt        d      xs t        d      t        ddg      xs t        ddg      dd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                     t        d      t        ddg      dt        d      t        ddg      dt        d      xs t        d      t        ddg      xs t        ddg      dd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                 0   dt        d      g di} | d   d   s| S t        ddg      | d   d<   t        g d      }|rY|j                         D ]F  }|j	                  d      }t        |      dk(  s#| d   d	   j                  |d
   |d   |d   d       H | S )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                 J   t        d      xs t        d      xs t        d      t        ddg      dt        d      xs t        d      t        ddg      dt        d      xs t        d      t        ddg      dt        d	      xs t        d
      t        d	dg      dd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                     g } t        ddg      }|s| S |j                         D ];  }|j                         }|s|j                  d      r(| j	                  d|d       = | S )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   sk    !#D9d+,F!!# G::<H//4KK>HEFG Kr   )r
   strreturnbool)r   z	list[str]rX   z
str | None)rX   zlist[dict[str, Any]])rX   zdict[str, Any])__doc__
__future__r   r   typingr   discovery.systemr   loggerr   logr   r   r&   r1   r8   r;   rL   rV   r0   r   r   <module>r`      sO    #   ) %&,F,
*2
r   