o
    O6ufÒ4  ã                   @   sd   d dl mZ d dlmZmZmZmZ dd„ Zdd„ ZG dd„ dƒZ	G d	d
„ d
eƒZ
G dd„ dƒZdS )é    )ÚAction)ÚConfigParserÚParsingErrorÚErrorÚDuplicateOptionErrorc                 C   s   t | ƒ}|tu p|tu S )z@Return true if val is an instance of a known sequence type.
    )ÚtypeÚlistÚtuple)ÚvalÚval_type© r   ú-/usr/lib/python3/dist-packages/sos/options.pyÚ_is_seq   s   r   c                 C   s$   |   ¡ }|dv r
dS |dv rdS d S )N)ÚtrueÚonÚyesT)ÚfalseÚoffÚnoF)Úlower)r
   Ú_valr   r   r   Ústr_to_bool   s   r   c                   @   sŠ   e Zd Zdd„ Zdd„ Zd dd	„Zd
d„ Zdd„ Zi fdd„Ze	i fdd„ƒZ
e	dd„ ƒZdd„ Zdd„ Zd!dd„Zd!dd„Zdd„ ZdS )"Ú
SoSOptionsc                 C   s    dd„ }t ||ƒrLt||ƒ}t| |ƒ}||ƒr||ƒr&|s&|| jvr>t|ƒs>t| ||ƒ |r6| j |¡ d S | j |¡ d S t|ƒrNt| ||| ƒ d S d S d S )Nc                 S   s   | dkp| d u S )NÚ r   )r
   r   r   r   Ú_unset"   s   z%SoSOptions._merge_opt.<locals>._unset)ÚhasattrÚgetattrÚ_nondefaultr   ÚsetattrÚdiscardÚadd)ÚselfÚoptÚsrcÚ
is_defaultr   ÚnewvalueÚoldvaluer   r   r   Ú
_merge_opt!   s    


ÿîzSoSOptions._merge_optc                 C   s0   t |tƒs	t|ƒ}| jD ]	}|  |||¡ qd S ©N)Ú
isinstanceÚdictÚvarsÚ	arg_namesr'   )r!   r#   r$   Úargr   r   r   Ú_merge_opts9   s
   

ÿzSoSOptions._merge_optsFú r   c           	         sz   |}d}ˆ j D ]
}||| | 7 }q| |¡ ‡ fdd„ˆ j D ƒ}|s+dd„ |D ƒ}ndd„ |D ƒ}|t|ƒ  |¡| S )aI  Format a SoSOptions object as a human or machine readable string.

            :param quote: quote option values
            :param sep: list separator string
            :param prefix: arbitrary prefix string
            :param suffix: arbitrary suffix string
            :param literal: print values as Python literals
        z=%sc                    s   g | ]}t ˆ |ƒ‘qS r   )r   )Ú.0r-   ©r!   r   r   Ú
<listcomp>N   ó    z$SoSOptions.__str.<locals>.<listcomp>c                 S   s"   g | ]}t |ƒrd  |¡n|‘qS )ú,)r   Újoin©r0   Úvr   r   r   r2   Q   s   " c                 S   s&   g | ]}t |tƒrd |› d �n|‘qS )ú')r)   Ústrr6   r   r   r   r2   T   s   & )r,   Ústripr	   )	r!   ÚquoteÚsepÚprefixÚsuffixÚargsÚarg_fmtr-   Úvalsr   r1   r   Ú__str?   s   	

zSoSOptions.__strc                 C   s   |   ¡ S r(   ©Ú_SoSOptions__strr1   r   r   r   Ú__str__X   s   zSoSOptions.__str__c                 C   s   | j ddddd�S )NTz, zSoSOptions(ú))r;   r<   r=   r>   rC   r1   r   r   r   Ú__repr__[   s   
ÿzSoSOptions.__repr__c                 K   sh   || _ t| ¡ ƒ| _tƒ | _| j D ]}t| || j | ƒ q| ¡ D ]}| j |¡ t| ||| ƒ q!dS )aô  Initialise a new ``SoSOptions`` object from keyword arguments.

            Initialises the new object with values taken from keyword
            arguments matching the names of ``SoSOptions`` attributes.

            A ``ValueError`` is raised is any of the supplied keyword
            arguments does not correspond to a known ``SoSOptions`
            attribute name.

            :param *kwargs: a list of ``SoSOptions`` keyword args.
            :returns: the new ``SoSOptions`` object.
        N)Úarg_defaultsr   Úkeysr,   Úsetr   r   Úappend)r!   rH   Úkwargsr-   r   r   r   Ú__init___   s   
þzSoSOptions.__init__c                 C   s*   t di t|ƒ¤d|i¤Ž}| |d¡ |S )a  Initialise a new SoSOptions object from a ``Namespace``
            obtained by parsing command line arguments.

            :param args: parsed command line arguments
            :returns: an initialised SoSOptions object
            :returntype: SoSOptions
        rH   TNr   )r   r+   r.   )Úclsr?   rH   Úoptsr   r   r   Ú	from_argsw   s   	zSoSOptions.from_argsc                    sR   d}d}ˆ |v rdˆ › �gS ˆ |v r ‡ fdd„t dt|ƒƒD ƒS dˆ › d|› �gS )zçConvert a named option and optional value to command line
            argument notation, correctly handling options that take
            no value or that have special representations (e.g. verify
            and verbose).
        )Ú
alloptionszallow-system-changeszall-logsÚbatchÚbuildÚdebugÚexperimentalzlist-pluginszlist-presetszlist-profilesz	no-reportzno-env-varsÚquietÚverify)Úverboseú--c                    s   g | ]}d ˆ › �‘qS )rY   r   )r0   Úd©r"   r   r   r2   ”   r3   z+SoSOptions._opt_to_args.<locals>.<listcomp>r   ú=)ÚrangeÚint)rN   r"   r
   Úno_valueÚcountr   r[   r   Ú_opt_to_args„   s   zSoSOptions._opt_to_argsc              	   C   sº   t | j| t|ƒƒr|S t | j| tƒrdd„ | d¡D ƒS t | j| tƒr;t|ƒ}|du r9td|› d|› d�ƒ‚|S t | j| tƒr[zt|ƒW S  t	yZ   td|› d|› d�ƒ‚w |S )	a¦  Ensure that the value read from a config file is the proper type
        for consumption by the component, as defined by arg_defaults.

        Params:
            :param key:         The key in arg_defaults we need to match the
                                type of
            :param val:         The value to be converted to a particular type
            :param conf:        File values are being loaded from
        c                 S   ó   g | ]}|‘qS r   r   r6   r   r   r   r2   ¤   ó    z/SoSOptions._convert_to_type.<locals>.<listcomp>r4   Nz
Value of 'z' in z# must be True or False or analagousz must be integer)
r)   rH   r   r   ÚsplitÚboolr   Ú	Exceptionr^   Ú
ValueError)r!   Úkeyr
   Úconfr   r   r   Ú_convert_to_type—   s$   
ÿ
ÿzSoSOptions._convert_to_typec           
   
      sZ  ‡ ‡fdd„}t ƒ }zIztˆ ƒ�}| |ˆ ¡ W d  ƒ n1 s!w   Y  W n* tyB } ztd|j› d|j› dˆ › �ƒ‚d}~w ttfyQ   tdˆ › �ƒ‚w W n! t	t
fyt } ztdˆ › d	|jd
 › �ƒ W Y d}~nd}~ww |d|ƒ |||ƒ | d¡r§tˆdƒr©| d¡D ]\}}	| d¡d ˆjvr¦ˆj |d |	 ¡ qŽdS dS dS )zúRead the provided config_file and update options from that.

        Positional arguments:

            :param config_file:             Filepath to the config file
            :param component:               Which component (section) to load
        c                    sü   |  | ¡rzt| | ¡ƒ}d| ¡ v rt| d¡ƒ|d< ddddœ}t|ƒD ]}d|v r6| |¡|| dd¡< ||v rC| |¡||| < q%| ¡ D ]3\}}t|t	ƒr[|d	kr[| d
d¡}|ˆj
vrltd|› d| › d�ƒ qHˆ ||ˆ ¡}tˆ||ƒ qHd S d S )NrX   Ú	verbosityÚlabelÚplugoptsÚprofiles)ÚnameÚplugin_optionÚprofileú-Ú_Úkeywordsr/   r   zUnknown option 'ú' in section 'r8   )Úhas_sectionr*   ÚitemsrI   r^   Úpopr   Úreplacer)   r9   rH   Úprintrj   r   )ÚsectionÚconfigÚodictÚrename_optsrh   r
   ©Úconfig_filer!   r   r   Ú_update_from_section½   s0   
ý€
áz9SoSOptions.update_from_conf.<locals>._update_from_sectionNzDuplicate option 'ru   z
' in file z#Failed to parse configuration file z+WARNING: Unable to read configuration file z : é   ÚglobalÚplugin_optionsrm   Ú.r   r\   )r   ÚopenÚ	read_filer   ÚexitÚoptionr{   r   r   ÚOSErrorÚIOErrorrz   r?   rv   r   rw   rd   Úskip_pluginsrm   rK   )
r!   r€   Ú	componentr�   r|   ÚfÚerrÚerh   r
   r   r   r   Úupdate_from_conf´   sH   	"
ÿ€ÿÿ€ÿ€ÿÿ€ÿ

€üzSoSOptions.update_from_confTc                 C   s<   | j D ]}t||ƒsqt||ƒdus|s|  ||d¡ qdS )aN  Merge another set of ``SoSOptions`` into this object.

            Merge two ``SoSOptions`` objects by setting unset or default
            values to their value in the ``src`` object.

            :param src: the ``SoSOptions`` object to copy from
            :param is_default: ``True`` if new default values are to be set.
        NF)r,   r   r   r'   )r!   r#   Úskip_defaultr-   r   r   r   Úmerge÷   s   
	
€üzSoSOptions.mergec                 C   s6   i }| j D ]}t| |ƒ}|r|dv rd}|||< q|S )z²Return this ``SoSOptions`` option values as a dictionary of
            argument name to value mappings.

            :returns: a name:value dictionary of option values.
        ©Ú
add_presetÚ
del_presetÚdescÚnoteN)r,   r   )r!   Úpreset_filterr}   r-   Úvaluer   r   r   r*     s   


zSoSOptions.dictc                    sL   ‡fdd„‰‡fdd„‰dd„ ‰ t ˆ ¡  ¡ dd„ d	�}‡ ‡fd
d„|D ƒS )zðReturn command arguments for this object.

            Return a list of the non-default options of this ``SoSOptions``
            object in ``sosreport`` command line argument notation:

                ``["--all-logs", "-vvv"]``

        c                    sL   d}|r||v r
dS | dkr|rdS | ˆ j v r$t|ƒtˆ j |  ƒkr$dS dS )z. Test for non-null option values.
            )ÚFalseÚNonez[]z""z''Ú0Frm   T)rH   r9   )ro   rš   Únull_valuesr1   r   r   Ú	has_value  s   
z%SoSOptions.to_args.<locals>.has_valuec                    s*   | dv rdS | dv r|dkrdS ˆ | |ƒS )z8 Filter out preset and null-valued options.
            r”   F)Úlog_sizeÚplugin_timeoutÚcmd_timeoutr   Tr   )ro   rš   )rŸ   r   r   Ú
filter_opt,  s   
z&SoSOptions.to_args.<locals>.filter_optc                 S   s€   |   d¡rdt|ƒd  }|S |  dd¡} t|ƒrd |¡n|}|dur,| › d|› �}n| }t|ƒdkr:d	| }|S d| }|S )
zD Convert sos option notation to command line arguments.
            rk   rr   r7   rs   r4   Tr/   r‚   rY   )Ú
startswithr^   ry   r   r5   Úlen)ro   rš   r-   r"   r   r   r   Úargify7  s   
ÿz"SoSOptions.to_args.<locals>.argifyc                 S   s   | d S )Nr   r   )Úxr   r   r   Ú<lambda>K  s    z$SoSOptions.to_args.<locals>.<lambda>)rh   c                    s$   g | ]\}}ˆ||ƒrˆ ||ƒ‘qS r   r   )r0   Únr7   )r¦   r£   r   r   r2   L  s   $ z&SoSOptions.to_args.<locals>.<listcomp>)Úsortedr*   rw   )r!   Ú	opt_itemsr   )r¦   r£   rŸ   r!   r   Úto_args  s
   	zSoSOptions.to_argsN)Fr/   r   r   )T)Ú__name__Ú
__module__Ú__qualname__r'   r.   rD   rE   rG   rM   ÚclassmethodrP   ra   rj   r‘   r“   r*   r¬   r   r   r   r   r      s     


C
r   c                   @   ó   e Zd ZdZddd„ZdS )ÚSosListOptionz0Allow to specify comma delimited list of pluginsNc                 C   sB   dd„ |  d¡D ƒ}t|| jƒr|t|| jƒ7 }t|| j|ƒ d S )Nc                 S   rb   r   r   )r0   r"   r   r   r   r2   T  rc   z*SosListOption.__call__.<locals>.<listcomp>r4   )rd   r   Údestr   )r!   ÚparserÚ	namespaceÚvaluesÚoption_stringrw   r   r   r   Ú__call__S  s   zSosListOption.__call__r(   )r­   r®   r¯   Ú__doc__r¸   r   r   r   r   r²   O  s    r²   c                   @   r±   )ÚClusterOptionz6Used to store/manipulate options for cluster profiles.Nc                 C   s"   || _ || _|| _|| _|| _d S r(   )ro   rš   Úopt_typeÚclusterÚdescription)r!   ro   rš   r»   r¼   r½   r   r   r   rM   ]  s
   
zClusterOption.__init__r(   )r­   r®   r¯   r¹   rM   r   r   r   r   rº   Z  s    rº   N)Úargparser   Úconfigparserr   r   r   r   r   r   r   r²   rº   r   r   r   r   Ú<module>   s   
  2