a
    Wa1                     @   s   d Z dZddlZddlmZ ddlZddlmZmZmZm	Z	 ddl
Z
G dd dejZG dd	 d	ejZd
d ZG dd dejZG dd deZdd ZG dd dejZdS )z7Support for parsing Samba-related command-line options.ZrestructuredText    N)copy)CredentialsAUTO_USE_KERBEROSDONT_USE_KERBEROSMUST_USE_KERBEROSc                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )SambaOptionsz+General Samba-related command line options.c              	   C   s   ddl m} |  ddlm} tj| |d | jdddtdd	| j	d
 | jdddtdd| j
d
 | jddtdd| jd
 | jddtdd| jd
 d | _| | _d | _d S )Nr   )fault_setup)LoadParmzSamba Common Optionsz-sz--configfilecallbackZFILEzConfiguration file)actiontypemetavarhelpr
   z-dz--debuglevelZ
DEBUGLEVELdebug levelz--optionZOPTIONz%set smb.conf option from command linez--realmZREALMzset the realm name)sambar   Zsamba.paramr	   optparseOptionGroup__init__
add_optionstr_load_configfile_set_debuglevel_set_option
_set_realm_configfile_lprealm)selfparserr   r	    r   ./usr/lib/python3/dist-packages/samba/getopt.pyr   %   s0    

zSambaOptions.__init__c                 C   s   | j S )z?Return path to the smb.conf file specified on the command line.r   r   r   r   r    get_loadparm_path;   s    zSambaOptions.get_loadparm_pathc                 C   s
   || _ d S Nr!   r   optionopt_strargr   r   r   r    r   ?   s    zSambaOptions._load_configfilec                 C   s   | j d| ||j_d S )Nr   )r   setvaluesZ
debuglevelr%   r   r   r    r   B   s    zSambaOptions._set_debuglevelc                 C   s   | j d| || _d S )Nr   )r   r)   r   r%   r   r   r    r   F   s    zSambaOptions._set_realmc              
   C   sx   | ddkrtd|d}z| j|d |d  W n6 tyr } ztd||f W Y d }~n
d }~0 0 d S )N=z&--option option takes a 'a=b' argumentr      z$invalid --option option value %r: %s)findr   OptionValueErrorsplitr   r)   	Exception)r   r&   r'   r(   r   aer   r   r    r   J   s    

zSambaOptions._set_optionc                 C   sL   | j dur| j| j  n,tddur<| jtd n
| j  | jS )z?Return loadparm object with data specified on the command line.NZSMB_CONF_PATH)r   r   loadosgetenvZload_defaultr"   r   r   r    get_loadparmU   s    

zSambaOptions.get_loadparmN)__name__
__module____qualname____doc__r   r#   r   r   r   r   r7   r   r   r   r    r   "   s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )VersionOptionsz/Command line option for printing Samba version.c                 C   s*   t j| |d | jddd| jdd d S )NzVersion Optionsz-Vz	--versionr
   zDisplay version number)r   r
   r   )r   r   r   r   _display_versionr   r   r   r   r    r   b   s
    
zVersionOptions.__init__c                 C   s    dd l }t|j td d S )Nr   )r   printversionsysexit)r   r&   r'   r(   r   r   r   r   r    r=   h   s    
zVersionOptions._display_versionN)r8   r9   r:   r;   r   r=   r   r   r   r    r<   `   s   r<   c                 C   sF   |   dv rtS |   dv r tS |   dv r0tS td|| f d S )N)Zyestrue1)ZnoZfalse0)autozinvalid %s option value: %s)lowerr   r   r   r   r/   )r(   r'   r   r   r    parse_kerberos_argn   s    rH   c                   @   st   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdddZdS )CredentialsOptionsz0Command line options for specifying credentials.Nc              	   C   s,  || _ |d urd| | _nd| _d| _d | _d| _tj| || j | jddd| j	t
dd	 | jd
dddt
| jd | jddddt
d| jd | jddddt
d| jd | jdddd| jd | jddddt
d| jd | jdd d!dt
d"| jd | jd#d$dd%| jd | jd&d'dt
d(| jd t | _d S ))NzCredentials Options (%s)zCredentials OptionsTFz--simple-bind-dnZDNr
   DN to use for a simple bindr   r   r
   r   r   z
--passwordZPASSWORDPasswordr   r   r   r   r
   z-Uz
--usernameZUSERNAMEZUsernamer   r   r   r   r
   z-Wz--workgroupZ	WORKGROUPZ	Workgroupz-Nz	--no-passzDon't ask for a password)r   r   r
   z-kz
--kerberosZKERBEROSUse Kerberos z--ipaddressZ	IPADDRESSzIP address of serverz-Pz--machine-passz#Use stored machine account passwordz--krb5-ccacheZ
KRB5CCNAMEzKerberos Credentials cache)special_nameZsectionask_for_password	ipaddressmachine_passr   r   r   _add_option_set_simple_bind_dnr   _set_password_parse_username_parse_workgroup_set_no_password_set_kerberos_set_ipaddress_set_machine_pass_set_krb5_ccacher   creds)r   r   rQ   r   r   r    r   }   s^    






zCredentialsOptions.__init__c                 O   s`   | j d u r| j|i |S d}|D ](}|ds2q"||dd| j  f7 }q"| j|i | d S )Nr   z--z--%s-)rQ   r   
startswithreplace)r   Zargs1kwargsZargs2r2   r   r   r    rU      s    

zCredentialsOptions._add_optionc                 C   s   | j | d| _d S NF)r_   parse_stringrT   r%   r   r   r    rX      s    z"CredentialsOptions._parse_usernamec                 C   s   | j | d S r$   )r_   
set_domainr%   r   r   r    rY      s    z#CredentialsOptions._parse_workgroupc                 C   s   | j | d| _d| _d S rc   )r_   set_passwordrR   rT   r%   r   r   r    rW      s    z CredentialsOptions._set_passwordc                 C   s
   d| _ d S rc   )rR   r%   r   r   r    rZ      s    z#CredentialsOptions._set_no_passwordc                 C   s
   d| _ d S )NT)rT   r%   r   r   r    r]      s    z$CredentialsOptions._set_machine_passc                 C   s
   || _ d S r$   )rS   r%   r   r   r    r\      s    z!CredentialsOptions._set_ipaddressc                 C   s   | j t|| d S r$   )r_   set_kerberos_staterH   r%   r   r   r    r[      s    z CredentialsOptions._set_kerberosc                 C   s   | j | d S r$   )r_   set_bind_dnr%   r   r   r    rV      s    z&CredentialsOptions._set_simple_bind_dnc                 C   s   | j | d S r$   )r_   Zset_named_ccacher%   r   r   r    r^      s    z#CredentialsOptions._set_krb5_ccacheFc                 C   sh   | j | | jr | j | n| jr0| j   |rb| j  sbz| j | W n ty`   Y n0 | j S )zObtain the credentials set on the command-line.

        :param lp: Loadparm object to use.
        :return: Credentials object
        )r_   guessrT   Zset_machine_accountrR   set_cmdline_callbacksZauthentication_requestedr1   )r   lpZfallback_machiner   r   r    get_credentials   s    
z"CredentialsOptions.get_credentials)N)F)r8   r9   r:   r;   r   rU   rX   rY   rW   rZ   r]   r\   r[   rV   r^   rl   r   r   r   r    rI   z   s   
*rI   c                   @   sJ   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dddZ
dS )CredentialsOptionsDoublez?Command line options for specifying credentials of two servers.c                 C   s   t | | d| _| jddd| jtdd | jdddd	t| jd
 | jdddtd| jd | jdddtd| jd | jdddd | jdddtd| j	d t
 | _d S )NTz--simple-bind-dn2ZDN2r
   rJ   rK   z--password2Z	PASSWORD2rL   rM   z--username2Z	USERNAME2zUsername for second serverrN   z--workgroup2Z
WORKGROUP2zWorkgroup for second serverz
--no-pass2
store_truez.Don't ask for a password for the second server)r   r   z--kerberos2Z	KERBEROS2rO   )rI   r   no_pass2r   _set_simple_bind_dn2r   _set_password2_parse_username2_parse_workgroup2_set_kerberos2r   creds2r>   r   r   r    r      s8    

z!CredentialsOptionsDouble.__init__c                 C   s   | j | d S r$   )ru   rd   r%   r   r   r    rr     s    z)CredentialsOptionsDouble._parse_username2c                 C   s   | j | d S r$   )ru   re   r%   r   r   r    rs     s    z*CredentialsOptionsDouble._parse_workgroup2c                 C   s   | j | d| _d S rc   )ru   rf   ro   r%   r   r   r    rq     s    z'CredentialsOptionsDouble._set_password2c                 C   s   | j t|| d S r$   )ru   rg   rH   r%   r   r   r    rt     s    z'CredentialsOptionsDouble._set_kerberos2c                 C   s   | j | d S r$   )ru   rh   r%   r   r   r    rp     s    z-CredentialsOptionsDouble._set_simple_bind_dn2Tc                 C   s<   |r| j | n| j  s&| j   | jr6| j   | j S )zObtain the credentials set on the command-line.

        :param lp: Loadparm object to use.
        :param guess: Try guess Credentials from environment
        :return: Credentials object
        )ru   ri   Zget_usernameZset_anonymousro   rj   )r   rk   ri   r   r   r    get_credentials2  s    


z)CredentialsOptionsDouble.get_credentials2N)T)r8   r9   r:   r;   r   rr   rs   rq   rt   rp   rv   r   r   r   r    rm      s   rm   c           
   
   C   s   ddddd}| dd}d}|r2|dd  sB|dd d	kr\||d 7 }|dd  }qzt|}W n& ty   d
|}t|Y n0 |  dd}z|||  W S  ty }	 z"d||}t|W Y d }	~	n
d }	~	0 0 d S )Nr-   i   i   i   @)BZKBZMBZGB rP   r   .zA{0} option requires a numeric value, with an optional unit suffixIz3{0} invalid suffix '{1}', should be B, Kb, Mb or Gb)	ra   isdigitfloat
ValueErrorformatr   r/   upperKeyError)
r&   ZoptvalueZmultipliersvZdigitsmmsgsuffixkr   r   r    check_bytes&  s2    $r   c                   @   s,   e Zd Zejjd ZeejjZeed< dS )SambaOption)bytesr   N)	r8   r9   r:   r   OptionZTYPESr   ZTYPE_CHECKERr   r   r   r   r    r   I  s   r   )r;   Z__docformat__r   r   r5   Zsamba.credentialsr   r   r   r   rA   r   r   r<   rH   rI   rm   r   r   r   r   r   r   r    <module>   s   >m?#