o
    O6uf�  ã                   @   s^   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
 G dd„ dee	ƒZdS )é    N)Úpartial)ÚPluginÚRedHatPluginÚ	PluginOptc                   @   s^   e Zd ZdZdZdZeddedd�edd	d
d�gZdZ	dZ
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚJarsz1Collect information about available Java archivesÚjars)Újavaúappend-locationsÚ z,colon-delimited list of additional JAR paths)ÚdefaultÚval_typeÚdescúall-known-locationsFzscan all known paths)r   r   )z/usr/share/javaz/usr/lib/java)z/optz
/usr/localz/var/libc                 C   sø   dg i}g }t tjƒ}|  d¡r|t tjƒ7 }|  d¡}|r%|| d¡7 }|D ]"}t |¡D ]\}}}|D ]}	|  ||	¡}
|  	|
¡rG| 
|
¡ q5q.q'|D ]}|  |¡}|  |¡}|s\|ri|||dœ}|d  
|¡ qLtj|ddd�}| j|d	d
d� d S )Nr   r   r	   ú:)ÚpathÚsha1Úmaven_idé   )ú,ú: )ÚindentÚ
separatorsz	jars.jsonT)Úplug_dir)Úlistr   Újar_locationsÚ
get_optionÚextra_jar_locationsÚsplitÚosÚwalkÚ	path_joinÚis_jarÚappendÚget_maven_idÚ
get_jar_idÚjsonÚdumpsÚadd_string_as_file)ÚselfÚresultsÚ	jar_pathsÚ	locationsÚuser_locationsÚlocationÚdirpathÚ_Ú	filenamesÚfilenamer   Újar_pathr   Újar_idÚrecordÚresults_str© r6   ú9/usr/lib/python3/dist-packages/sos/report/plugins/jars.pyÚsetup1   s:   




€ýÿ

þ€z
Jars.setupc              
   C   s²   t j |¡rWt |¡rWz*t |¡�}d| ¡ v r"	 W d  ƒ W dS W d  ƒ W dS 1 s.w   Y  W dS  ttjfyV } z|  	d|› d|› �¡ W Y d}~dS d}~ww dS )z§Check whether given file is a JAR file.

        JARs are ZIP files which usually include a manifest
        at the canonical location 'META-INF/MANIFEST.MF'.
        zMETA-INF/MANIFEST.MFNTzCould not determine if z is a JAR: F)
r   r   ÚisfileÚzipfileÚ
is_zipfileÚZipFileÚnamelistÚIOErrorÚ
BadZipfileÚ	_log_info)r(   r   ÚfileÚerrr6   r6   r7   r!   T   s&   þÿùüÿ€üzJars.is_jarc           
         s~  i }zžt  |¡�Ž}t d¡‰ ‡ fdd„| ¡ D ƒ}t|ƒdkr)	 W d  ƒ W dS | |d ¡�L}| ¡ D ]?}| ¡ }| 	d¡stz| 
d¡\}}| d	¡ ¡ }| d	¡ ¡ }|||< W q5 tys   Y  W d  ƒ W d  ƒ W dS w q5W d  ƒ n1 sw   Y  W d  ƒ W |S W d  ƒ W |S 1 s™w   Y  W |S  ty¾ }	 z|  d
|› d|	› �¡ W Y d}	~	|S d}	~	ww )záExtract Maven coordinates from a given JAR file, if possible.

        JARs build by Maven (most popular Java build system) contain
        'pom.properties' file. We can extract Maven coordinates
         from there.
        z*META-INF/maven/[^/]+/[^/]+/pom.properties$c                    s   g | ]	}ˆ   |¡r|‘qS r6   )Úmatch)Ú.0Úx©Úrgxr6   r7   Ú
<listcomp>p   s    z%Jars.get_maven_id.<locals>.<listcomp>é   Nr   ó   #ó   =Úutf8z)Could not extract Maven coordinates from r   )r:   r<   ÚreÚcompiler=   ÚlenÚopenÚ	readlinesÚstripÚ
startswithr   ÚdecodeÚ
ValueErrorr>   r@   )
r(   r2   ÚpropsrA   ÚresultÚprops_fÚlineÚkeyÚvaluerB   r6   rF   r7   r#   e   sN   
ü
öûúþÿûñûìüÿ€üzJars.get_maven_idc              
   C   s¦   d}z2t |dd��}t ¡ }tt|jdƒdƒD ]}| |¡ qW d  ƒ n1 s)w   Y  | ¡ }W |S  tyR } z|  	d|› d|› �¡ W Y d}~|S d}~ww )	zHCompute JAR id.

        Returns sha1 hash of a given JAR file.
        r
   Úrb)Úmodei   ó    NzCould not compute JAR id for r   )
rP   Úhashlibr   Úiterr   ÚreadÚupdateÚ	hexdigestr>   r@   )r(   r2   r3   rA   ÚdigestÚbufrB   r6   r6   r7   r$   „   s   ÿþ
þ €þzJars.get_jar_idN)Ú__name__Ú
__module__Ú__qualname__Ú
short_descÚplugin_nameÚprofilesr   ÚstrÚoption_listr   r   r8   r!   r#   r$   r6   r6   r6   r7   r      s"    ÿÿý
#r   )r_   r%   r   rM   r:   Ú	functoolsr   Úsos.report.pluginsr   r   r   r   r6   r6   r6   r7   Ú<module>   s   
