Ë
    À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)zÒRead-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°:Õ >Ø�O‰Oà" 1™IØ" 1™IØ$ Q™iØ! !™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ñ
ô
   	Ó*Ò?¬h°wÓ.?Ü ¨DÐ 1Ó2ÒO´hÀÈ¸Ó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ÀÈÐ@TÓ7UÑVÜ$ VÓ,¼À6È;ÐBWÓ9XÑYä 	Ó*Ò@¬h°xÓ.@Ü ¨KÐ 8Ó9Ò^¼XÀxÐQ\Ð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¼   € à&´H¸XÓ4FÐVXÑ(YÐZ€FØ�(Ñ˜IÒ&ØˆÜ"*¨H°kÐ+BÓ"C€Fˆ8Ñ�YÑô ÚQó€Fñ Ø×%Ñ%Ó'ò 	ˆDØ—J‘J˜tÓ$ˆEÜ�5‹z˜Q‹Ø�xÑ  Ñ.×5Ñ5Ø" 1™X°°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 )z“Detect 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®   € ô   Ó(ÒV¬H°XÓ,>ÒVÄ(È:ÓBVÜ ¨+Ð 6Ó7ñ
ô
   	Ó*ÒB¬h°zÓ.BÜ ¨KÐ 8Ó9ñ
ô
   Ó'Ò?¬8°JÓ+?Ü ¨Ð 5Ó6ñ
ô
   Ó/ÒH´8¸KÓ3HÜ °Ð =Ó>ñ
ñð 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Ü˜9 dÐ+Ó,€FÙØˆØ×!Ñ!Ó#ò GˆØ—:‘:“<ˆÚ˜H×/Ñ/°Õ4Ø�K‰K >¸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   