ó
    ª-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)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                ó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°:× >Ó >Ø�O‰Oà" 1™IØ" 1™IØ$ Q™iØ! !™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ñ
ô
   	Ó*×?¬h°wÓ.?Ü ¨DÐ 1Ó2×O´hÀÈ¸Ó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ÀÈÐ@TÓ7UÑVÜ$ VÓ,¼À6È;ÐBWÓ9XÑYä 	Ó*×@¬h°xÓ.@Ü ¨KÐ 8Ó9×^¼XÀxÐQ\Ð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·   € à&´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                 ó|  • [        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.$ )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                 óî   • / 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Ü˜9 dÐ+Ó,€FÞØˆØ×!Ñ!Ö#ˆØ—:‘:“<ˆßˆ8˜H×/Ñ/°×4Ó4Ø�K‰K >¸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   