
    -EjO                        S r SSKJr  SSKrSSKJrJr  SSKJr  SSKJ	r	  SSK
Jr  SSKJrJrJrJrJrJr  SS	KJr  \" S
5      rSSKrSrSrSS jrSS jrSS jrSS jrSSS jjrg)u  Full discovery: the complete read-only inventory.

Orchestrates the individual discovery modules, writes the snapshot to
/var/lib/wolfpanel/discovery/last.json, and optionally uploads it to the
Central API. Strictly read-only — no server state is changed.
    )annotationsN)datetimetimezone)Path)Any)Config)gitprojectsservicessystemsftp	databases)
get_loggerzdiscovery.full)z/etc/nginx/sites-enabledz/etc/nginx/conf.dz/etc/apache2/sites-enabled)z/etc/letsencrypt/livez/etc/ssl/certsc                   SnSnU R                  5        GH#  nSU;   a  UR                  SS5      S   nUR                  5       nU(       d  M8  U(       d=  [        R                  " SU5      nU(       a  UR                  S5      R                  5       nU(       a  M  [        R                  " SU5      nU(       d  M  UR                  S5      R                  5       nUR                  S5      (       a  UR                  S5      (       d,  UR                  S5      (       a  UR                  S5      (       a  USS	 nUnGM&     X4$ )
zOParse server_name and root from a config file using simple regex/string checks.N#   r   z^server_name\s+([^;]+);z^root\s+([^;]+);"')
splitlinessplitstriprematchgroup
startswithendswith)contentserver_name	root_pathlinemvals         8D:\Programs\laragon\www\wolf\agent\src\discovery\full.py_parse_nginx_configr%      s   KI""$$;::c1%a(Dzz|3T:Aggaj..0y,d3Aqggaj&&(NN3''CLL,=,=3>>RUCVCV[^[g[ghk[l[la)C	% %( !!    c            	     l   / n [          H  n[        U5      nUR                  5       (       d  M%  UR                  S5       H]  nUR	                  5       (       d  M  [        U5      nSnSn UR                  SSS9n[        U5      u  pVU R                  SUUUS.5        M_     M     U $ ! [         a     N,f = f)z=List vhost config file paths and parse server_name/root_path.*Nutf-8ignore)encodingerrorsvhosts)categorypathr   r    )
_VHOST_DIRSr   is_dirglobis_filestr	read_textr%   	Exceptionappend)found	directorybaseppath_strr   r    r   s           r$   _vhost_filesr=   7   s    "$E 	I;;==YYs^99;;"1vH"&K $I"#++wx+"P1DW1M. LL$, ('2%.	"  $ !& L % s   )B&&
B32B3c                 $   / n [          GH  n[        U5      nUR                  5       (       d  M&  [        UR	                  S5      5      SS [        UR	                  S5      5      -    GH  nSUR
                  ;   d  SUR
                  R                  5       ;   a  M4  [        R                  " SSS	S
S[        U5      /5      n[        R                  " SSS
SS[        U5      /5      nSn/ nU(       a  [        R                  " SU5      nU(       aN  UR                  S5      n	[        R                  " SU	5      n
U
(       a  U
R                  S5      R                  5       n[        R                  " SU5      n/ nU(       a  UR                  U5        U H  nX;  d  M
  UR                  U5        M     U(       a  SR!                  U5      OSnS[        U5      R#                  SS5      ;   a  SOSnSnUS:X  aH  [        R                  " S[        U5      R#                  SS5      5      nU(       a  UR                  S5      nU R                  S[        U5      U(       a#  UR                  5       R%                  SS5      S   OSUUUS.5        GM"     GM     U $ )u   Locate certificate files and read their details via openssl if present.

SECURITY: only certificates (public) are inspected — never private keys.
z**/*.pemN   z**/fullchain*privkeykeyopensslx509z-enddatez-nooutz-inz-textzSubject:\s*(.*?)(?:\n|$)r   z\bCN\s*=\s*([^,\/\n]+)zDNS:([a-zA-Z0-9.*-]+),z/etc/letsencrypt/\/letsencryptcustomz/etc/letsencrypt/live/([^/]+)ssl_certificates=r   )r.   r/   	not_afterdomainsprovider	cert_name)
_CERT_DIRSr   r1   listr2   namelowerr   run_readonlyr4   r   searchr   r   findallr7   joinreplacer   )certsr9   r:   certenddatecert_detailscn	dns_names	subject_msubject_linecn_mall_domainsrQ   domains_strrM   rN   r"   s                    r$   _ssl_certificatesrc   P   s.   
 #%EZ	I{{}}:./5TYY=W8XXDDII%$))//2C)C))FJ%TKG "..FHguc$iHL BIII&A<P	#,??1#5L99%>MD!ZZ]002JJ'?N	K""2&!*&&t, " 4?#((;/DK(;s4y?P?PQUWZ?[([}aiHI=(II>D	@Q@QRVX[@\] !
ILL 2IFM!6!6sA!>r!BSW* (!*	I Y	  d Lr&   c            	        [         R                  " 5       n 0 S[        R                  " 5       _S[        R                  " 5       _S[        R
                  " 5       _S[        R                  " 5       _S[        R                  " 5       _S[        R                  " 5       _S[        R                  " 5       _S[        R                  " 5       _S	[        R                  " 5       _S
[        R                  " 5       _S[        R                  " 5       _S[         R                  " 5       _SU _S[         R                  " 5       _S[         R                   " 5       _S[         R"                  " 5       _S[         R$                  " 5       _['        5       [)        5       [*        R,                  " 5       [.        R0                  " 5       [2        R4                  " 5       ["        R6                  " 5       ["        R8                  " 5       S.E$ )z$Build the full inventory dictionary.oskernel	cpu_countmemorydiskload_averageuptimeprivate_ips	public_ipnetwork_interfaces
open_portssystemd_servicesweb_serverslanguage_runtimes
containersr   	cron_jobs)r-   rI   git_repositoriesr
   
sftp_usersdatabase_schemasdatabase_users)r   rq   r   os_inforf   rg   memory_usage
disk_usagerj   uptime_secondsrl   rm   rn   ro   rp   rr   rs   r   rt   r=   rc   r	   find_repositoriesr
   find_projectsr   discover_sftp_usersdiscover_database_schemasdiscover_database_users)webs    r$   collectr      s   



 Cfnn&--/ 	V%%' 	&%%'	
 	!!# 	++- 	&'') 	v))+ 	V%%' 	f779 	f'') 	H557 	s 	X779 	h))+  	X'')!" 	X'')#$ .-/113**,..0%??A#;;=1 r&   c                   [        5       nU R                  U R                  [        R                  " [
        R                  5      R                  5       US.nU R                  R                  SSS9  U R                  S-  nUR                  [        R                  " USS9SS9  [        R                  S	U5        U(       a  S
SKJnJn   U" U USU" U5      5        U$ U$ ! [$         a!  n[        R'                  SU5         SnAU$ SnAff = f)zCollect, persist the snapshot, and optionally upload it.

Returns the snapshot dict. Upload failures are logged but never fatal.
)	server_idagent_versioncollected_at	discoveryT)parentsexist_okz	last.json   )indentr)   )r+   z discovery snapshot written to %sr   )categories_from_inventoryupload_inventoryfullz9discovery upload failed (will rely on local snapshot): %sN)r   r   r   r   nowr   utc	isoformatdiscovery_dirmkdir
write_textjsondumpsloginfodiscovery.uploadr   r   r6   warning)	config
api_clientupload	inventorysnapshotsnapshot_pathr   r   excs	            r$   runr      s    
 	I%%-- X\\2<<>	H td;((;6MTZZ;gNHH/?P	Z))4	 O8O  	ZKKSUXYYO	Zs   C 
D'DD)r   r4   returnztuple[str | None, str | None])r   zlist[dict[str, Any]])r   dict[str, Any])T)r   r   r   boolr   r   )__doc__
__future__r   r   r   r   pathlibr   typingr   r   r   r   r	   r
   r   r   r   r   loggerr   r   r   r0   rO   r%   r=   rc   r   r    r&   r$   <module>r      s\    #  '    F F !" 	 ^8
"628v> r&   