o
    G%@i3                     @   sX   d dl mZ d dl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)ConfigParserc                 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 ||rNt||}t| |}||r||r(|s(|| jvr&t|r(|r@t| || |r8| j| d S | j| d S t|rPt| |||  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_default
prefer_newr   newvalueoldvaluer	   r	   r
   
_merge_opt   s$   


zSoSOptions._merge_optc                 C   s2   t |ts	t|}| jD ]
}| |||| qd S N)
isinstancedictvars	arg_namesr%   )r   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r.   vr	   r	   r
   r0   Q   s   " c                 S   s&   g | ]}t |trd | d n|qS )')r'   strr4   r	   r	   r
   r0   T   s   & )r*   stripr   )	r   quotesepprefixsuffixargsarg_fmtr+   valsr	   r/   r
   __str?   s   	

zSoSOptions.__strc                 C   s   |   S r&   _SoSOptions__strr/   r	   r	   r
   __str__X   s   zSoSOptions.__str__c                 C   s   | j dddddS )NTz, zSoSOptions())r9   r:   r;   r<   rA   r/   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   itemsappend)r   rF   kwargsr+   kwargr	   r	   r
   __init___   s   
zSoSOptions.__init__c                 C   s,   t di t|d|i}||d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
        rF   TFNr	   )r   r)   r,   )clsr=   rF   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 )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).
        )
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	   )r.   dr   r	   r
   r0      r1   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t|dS t | j| tr8t|}|du r6td| d| d|S t | j| trDt|S |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
        r2   Nz
Value of 'z' in z# must be True or False or analagous)	r'   rF   r   r   splitboolr   	Exceptionr^   )r   keyr   confr	   r	   r
   _convert_to_type   s   
zSoSOptions._convert_to_typec           	   
      s   fdd}t  }zt dd}||  W d   n1 s"w   Y  W n tyG } ztd  d|jd   W Y d}~nd}~ww |d	| ||| |d
rtdrtdr|d
D ]\}}|	dd j
vr~j|d |  qfdS d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   | | 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 'z' in section 'r6   )has_sectionr(   rI   rG   r^   popr   replacer'   r7   rF   printrg   r   )sectionconfigodictrename_optsre   r   config_filer   r	   r
   _update_from_section   s0   

z9SoSOptions.update_from_conf.<locals>._update_from_sectionzutf-8)encodingNz+WARNING: Unable to read configuration file z :    globalplugin_optionsrj   skip_plugins.r   r\   )r   open	read_fileOSErrorru   r=   rr   r   rI   rb   r   rj   rJ   )	r   r{   	componentr|   rw   fere   r   r	   rz   r
   update_from_conf   s4   	"

zSoSOptions.update_from_confTc                 C   s@   | j D ]}t||sqt||dus|s| j||d|d qdS )a  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.
            :param prefer_new: ``False`` if new default is not preferred.
        NF)r"   )r*   r   r   r%   )r   r    skip_defaultr"   r+   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.
        
add_preset
del_presetdescnoteN)r*   r   )r   preset_filterrx   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 ``sos report`` 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''0Frj   T)rF   r7   )rl   r   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.
            r   F)log_sizeplugin_timeoutcmd_timeoutr   Tr	   )rl   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.
            rh   ro   r5   rp   r2   Tr-   r~   rY   )
startswithr^   rt   r   r3   len)rl   r   r+   r   r	   r	   r
   argify/  s   
z"SoSOptions.to_args.<locals>.argifyc                 S   s   | d S )Nr   r	   )xr	   r	   r
   <lambda>C  s    z$SoSOptions.to_args.<locals>.<lambda>)re   c                    s$   g | ]\}}||r ||qS r	   r	   )r.   nr5   )r   r   r	   r
   r0   D  s   $ z&SoSOptions.to_args.<locals>.<listcomp>)sortedr(   rI   )r   	opt_itemsr	   )r   r   r   r   r
   to_args  s
   	zSoSOptions.to_argsN)Fr-   r   r   )TF)T)__name__
__module____qualname__r%   r,   rB   rC   rE   rM   classmethodrP   ra   rg   r   r   r(   r   r	   r	   r	   r
   r      s     


>
r   c                   @      e Zd ZdZdddZdS )SosListOptionz0Allow to specify comma delimited list of pluginsNc                 C   s<   t |d}t|| jr|t|| j7 }t|| j| d S )Nr2   )r   rb   r   destr   )r   parser	namespacevaluesoption_stringrI   r	   r	   r
   __call__K  s   zSosListOption.__call__r&   )r   r   r   __doc__r   r	   r	   r	   r
   r   G  s    r   c                   @   r   )ClusterOptionz6Used to store/manipulate options for cluster profiles.Nc                 C   s"   || _ || _|| _|| _|| _d S r&   )rl   r   opt_typeclusterdescription)r   rl   r   r   r   r   r	   r	   r
   rM   U  s
   
zClusterOption.__init__r&   )r   r   r   r   rM   r	   r	   r	   r
   r   R  s    r   N)	argparser   configparserr   r   r   r   r   r   r	   r	   r	   r
   <module>   s   	  ,