o
    *b4                     @   s\   d dl mZ d dlmZmZmZm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)valZval_type r   -/usr/lib/python3/dist-packages/sos/options.py_is_seq   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   ZnewvalueZ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_opts/   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>D   s    z$SoSOptions.__str.<locals>.<listcomp>c                 S   s"   g | ]}t |rd |n|qS ),)r   joinr$   vr   r   r   r&   G      " c                 S   s"   g | ]}t |trd | n|qS )z'%s')r   strr)   r   r   r   r&   J   r+   )r    stripr	   )	r   quotesepprefixsuffixargsZarg_fmtr!   Zvalsr   r%   r   Z__str5   s   	

zSoSOptions.__strc                 C   s   |   S r   _SoSOptions__strr%   r   r   r   __str__N   s   zSoSOptions.__str__c                 C   s   | j dddddS )NTz, zSoSOptions())r.   r/   r0   r1   r3   r%   r   r   r   __repr__Q   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   r8   kwargsr!   r   r   r   __init__U   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
        r8   TNr   )r   r   r"   )clsr2   r8   Zoptsr   r   r   	from_argsm   s   	zSoSOptions.from_argsc                    sP   d}d} |v rd  gS  |v r fddt dt|D S d  d | gS )	zConvert 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).
        )Z
alloptionszallow-system-changeszall-logsZbatchZbuilddebugZexperimentalzlist-pluginszlist-presetszlist-profilesz	no-reportzno-env-varsquietZverify)verbose--%sc                    s   g | ]}d   qS )rC   r   )r$   dr   r   r   r&      s    z+SoSOptions._opt_to_args.<locals>.<listcomp>r   --=)rangeint)r>   r   r
   Zno_valuecountr   rE   r   _opt_to_argsz   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>| }|dv r0dS |dv r6dS td||f t | j| tr[zt|W S  t	yZ   td	||f 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   r)   r   r   r   r&          z/SoSOptions._convert_to_type.<locals>.<listcomp>r'   )trueZonZyesT)ZfalseZoffnoFz6Value of '%s' in %s must be True or False or analagousz#Value of '%s' in %s must be integer)
r   r8   r   r   splitboollower	ExceptionrI   
ValueError)r   keyr
   confZ_valr   r   r   _convert_to_type   s0   

zSoSOptions._convert_to_typec           
   
      sJ   fdd}t  }zCzt }|| W d   n1 s w   Y  W n% ty= } ztd|j|j f d}~w ttfyK   td  w W n t	t
fyl } ztd |jd f  W Y d}~nd}~ww |d| ||| |d	rtd
r|d	D ]\}}	|dd jvrj|d |	  qdS dS dS )zRead 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   | | rwt|| }d| v rt|d|d< dddd}t|D ]}d|v r6||||dd< ||v rC||||| < q%| D ]0\}}t|t	r[|d	kr[|d
d}|j
vritd|| f  qH|| }t|| qHd S d S )NrB   	verbosityZlabelplugoptsZprofiles)nameZplugin_optionZprofile-_keywordsr#   r   z#Unknown option '%s' in section '%s')has_sectionr   itemsr9   rI   popr   replacer   r,   r8   printrW   r   )sectionconfigodictZrename_optsrU   r
   config_filer   r   r   _update_from_section   s4   

z9SoSOptions.update_from_conf.<locals>._update_from_sectionNz0Duplicate option '%s' in section '%s' in file %sz%Failed to parse configuration file %sz2WARNING: Unable to read configuration file %s : %s   globalZplugin_optionsrY   .r   rG   )r   openZreadfpr   exitoptionrc   r   r   OSErrorIOErrorrb   r2   r^   r   r_   rP   Zskip_pluginsrY   r;   )
r   rg   Z	componentrh   rd   ferrerU   r
   r   rf   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   Zskip_defaultr!   r   r   r   merge   s   
	
zSoSOptions.mergec                 C   s6   i }| j D ]}t| |}|r|dv rd}|||< q|S )zReturn this ``SoSOptions`` option values as a dictionary of
            argument name to value mappings.

            :returns: a name:value dictionary of option values.
        Z
add_presetZ
del_presetZdescZnoteN)r    r   )r   Zpreset_filterre   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 )zReturn 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''0FrY   T)r8   r,   )rZ   rw   Znull_valuesr%   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.
            rv   F)Zlog_sizeZplugin_timeoutZcmd_timeoutr   Tr   )rZ   rw   )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| |f }n| }t|dkr9d	| }|S d| }|S )
zD Convert sos option notation to command line arguments.
            rX   r[   r*   r\   r'   Tz%s %sri   rF   )
startswithrI   ra   r   r(   len)rZ   rw   r!   r   r   r   r   argify1  s   
z"SoSOptions.to_args.<locals>.argifyc                 S   s   | d S )Nr   r   )xr   r   r   <lambda>E  s    z$SoSOptions.to_args.<locals>.<lambda>)rU   c                    s$   g | ]\}}||r ||qS r   r   )r$   nr*   )r   r|   r   r   r&   F  s   $ z&SoSOptions.to_args.<locals>.<listcomp>)sortedr   r_   )r   Z	opt_itemsr   )r   r|   r{   r   r   to_args  s
   	zSoSOptions.to_argsN)Fr#   r   r   )T)__name__
__module____qualname__r   r"   r4   r5   r7   r=   classmethodr?   rK   rW   rt   ru   r   r   r   r   r   r   r      s     

 
D
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   rL   r   r   )r$   r   r   r   r   r&   N  rM   z*SosListOption.__call__.<locals>.<listcomp>r'   )rP   r   destr   )r   parser	namespacevaluesoption_stringr_   r   r   r   __call__M  s   zSosListOption.__call__r   )r   r   r   __doc__r   r   r   r   r   r   I  s    r   c                   @   r   )ClusterOptionz6Used to store/manipulate options for cluster profiles.Nc                 C   s"   || _ || _|| _|| _|| _d S r   )rZ   rw   opt_typeclusterdescription)r   rZ   rw   r   r   r   r   r   r   r=   W  s
   
zClusterOption.__init__r   )r   r   r   r   r=   r   r   r   r   r   T  s    r   N)argparser   configparserr   r   r   r   r   r   r   r   r   r   r   r   <module>   s     6