U
    9_F?                     @   sf  d dl Z d dlT d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
Z
d dlZd dlZd dlmZ d dlmZ d dlZzd dlZdZW n   d	ZG d
d dZY nX dd Zdd ZG dd dZG dd dejZG dd dZedkrbd dlZeejdk r&ed ed ed e Z dd Z!ejd Z"e Z#e#$e"e! e %  dS )    N)*)Gdk)Gtk)TimedOperation)GObject)GLibTFc                   @   s   e Zd ZG dd dZdS )pysmbc                   @   s   e Zd ZdS )zpysmb.AuthContextN)__name__
__module____qualname__ r   r   1/usr/share/system-config-printer/probe_printer.pyAuthContext)   s   r   N)r	   r
   r   r   r   r   r   r   r   (   s   r   c           	      C   s   g }d}d}d}d}t | }t|D ]}| | }|rB||7 }d}q$|dkrTd}d}q$|r|rt|dkrjd}q||7 }q| r|| d}d}q|dkrd}q||7 }q$|dkrd}d}q$| s$d}||7 }q$|dkr|| |S )NF \T")lenrangeisspaceappend)	linewordsZescapedZquotedZin_wordZwordniZchr   r   r   wordsep,   sJ    




r   c              	   C   s   z|  dd\}}W n tk
r,   | }Y nX d }zt||tjtj}W n  tjtjfk
rj   g }Y nX |D ]}|\}}}}	}
zt|||}|d W n tjk
r   d }Y qpY nX z|	|
 W n& tjk
r   |
  d }Y qpY nX  qqp|S )N:   g      ?)split
ValueErrorsocketgetaddrinfo	AF_UNSPECSOCK_STREAMgaierrorerrorZ
settimeoutZconnectclose)hostnameporthostsairesafsocktypeproto	canonnamesar   r   r   open_socket]   s6    



r1   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )	LpdServerc                 C   s   || _ d| _d| _d S )N   F)r&   max_lpt_comstop)selfr&   r   r   r   __init__|   s    zLpdServer.__init__c              
   C   s
  t | jd}|sd S t| z4|d| d |dd}tt| W nL tj	k
r } z,t| z|
  W n   Y nX W Y dS d }~X Y nX t|dkrt|d dkrz|d |
  W n   Y nX || dS z|
  W n   Y nX dS )	Ni  z%s
zUTF-8i   Fr   s   
T)r1   r&   
debugprintsendencodeZrecvdecodereprr   r$   r%   r   ordr   )r6   nameresultr)   datamsgr   r   r   probe_queue   s8    

zLpdServer.probe_queuec                 C   s`   dddddg}t | jD ]&}|d| d| d| d	| g qt d
D ]}|d|  qH|S )NZPASSTHRUZpsZlpZPORT1r   zLPT%dzLPT%d_PASSTHRUzCOM%dzCOM%d_PASSTHRU2   zpr%d)r   r4   extendr   )r6   	candidateZnrr   r   r   get_possible_queue_names   s    
z"LpdServer.get_possible_queue_namesc                 C   s   t d d| _d S )Nz!LpdServer exiting: destroy calledT)r8   r5   r6   r   r   r   destroy   s    zLpdServer.destroyc                 C   sf   g }|   D ]T}t r"t  q| jr, qb| ||}|d krD qb|sV|drV qbtd q|S )Npr皙?)	rF   r   Zevents_pendingZmain_iterationr5   rB   
startswithtimesleep)r6   r?   r>   foundr   r   r   probe   s    
zLpdServer.probeN)r	   r
   r   r7   rB   rF   rH   rO   r   r   r   r   r2   {   s
   $r2   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	BackgroundSmbAuthContextzIAn SMB AuthContext class that is only ever run from
    a non-GUI thread.c                 O   s"   t  | _tjj| f|| d S N)	threadingZEvent
_gui_eventr   r   r7   )r6   argskwargsr   r   r   r7      s    
z!BackgroundSmbAuthContext.__init__c                 C   s0   t   tj| }t   || _| j  d S rQ   )	r   Zthreads_enterr   r   perform_authenticationZthreads_leave!_do_perform_authentication_resultrS   set)r6   r?   r   r   r   _do_perform_authentication   s
    z3BackgroundSmbAuthContext._do_perform_authenticationc                 C   sV   | j dks"| jr"| jr"| jr.| js.tj| S | j  t	
d| j | j  | jS )Nr   r   )ZpassesZ
has_failedZauth_calledZtried_guestr   r   rV   rS   clearr   Ztimeout_addrY   waitrW   rG   r   r   r   rV      s    


z/BackgroundSmbAuthContext.perform_authenticationN)r	   r
   r   __doc__r7   rY   rV   r   r   r   r   rP      s   rP   c                   @   sf   e Zd Zdd Zdd Zdd Zd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	S )PrinterFinderc                 C   s
   d| _ d S )NF)quitrG   r   r   r   r7      s    zPrinterFinder.__init__c                 C   s$   || _ || _t| jdd d| _d S )Nc                 S   s   d S rQ   r   )xyr   r   r   <lambda>       z$PrinterFinder.find.<locals>.<lambda>)callback)r&   callback_fnr   _do_findop)r6   r&   rd   r   r   r   find   s    zPrinterFinder.findc                 C   s   | j   d| _d S )NT)rf   cancelr^   rG   r   r   r   rh      s    
zPrinterFinder.cancelc              	   C   sp   t  | _| j| j| j| j| j| jfD ]6}| jr4 d S z
|  W q$ t	k
rX   t
  Y q$X q$| jsl| d  d S rQ   )dict_cached_attributes_probe_hplip_probe_jetdirect
_probe_ipp_probe_snmp
_probe_lpd
_probe_smbr^   	ExceptionnonfatalExceptionrd   )r6   fnr   r   r   re      s     
zPrinterFinder._do_findNc                 C   sN   dd| d}|r||d< | | j tj|f|}td|  | | d S )NZnetworkz%s)device-classdevice-infodevice-locationDevice found: %s)updaterj   cupshelpersDevicer8   rd   )r6   uriinfolocationdevice_dictZ
new_devicer   r   r   _new_device  s    zPrinterFinder._new_devicec              
   C   s  z,t d tjd| jgdtjtjtjd}W nB tk
rn } z$t d |jtjkr\W Y 
d S  W 5 d }~X Y nX |	 \}}|j
dkrt d|j
  d S | jrt d d S | dD ]}t|}t|}|d	kr|\}}	}
}}}n0|d
kr|\}}	}
}}n|dkr|\}}	}
}nq||
|d}|d
kr@t d|  ||d< |d	krR||d< tj|	f|}t d|	  | | |
| jd< || jd< qt d d S )Nzsnmp: tryingz/usr/lib/cups/backend/snmpTrT   Z	close_fdsstdinstdoutstderrzsnmp: no goodr   zsnmp: no good (return code %d)
         )rt   device-make-and-modelru   zsnmp: Device ID found:
%sz	device-idrv   rw   r   	device_idz
snmp: done)r8   
subprocessPopenr&   DEVNULLPIPEOSErrorerrnoENOENTcommunicate
returncoder^   r;   r   r   r   ry   rz   rd   rj   )r6   per   r   r   r   r   Zdevice_classr{   Zmake_and_modelr|   r   Zdevice_locationr~   devicer   r   r   rn     sl    


  



zPrinterFinder._probe_snmpc                 C   s   t d t| j}| D ]t}| jr2t d  d S ||g }|d krRt d  q|rrd| j|f }| || j |s|dr qt	d qt d d S )Nzlpd: tryingzlpd: no goodzlpd: couldn't connectzlpd://%s/%srI   rJ   z	lpd: done)
r8   r2   r&   rF   r^   rB   r   rK   rL   rM   )r6   Zlpdr>   rN   r{   r   r   r   ro   L  s"    
zPrinterFinder._probe_lpdc              
   C   s:  d| j krV| j d dkrV| j d  dsV| j d  dsVtd| j d   d S z.td tjdd| jgd	tjtjtjd
}W n: t	k
r } z|j
t
jkrW Y 
d S  W 5 d }~X Y nX | \}}|jdkrtd|j  d S | jrtd d S |  }td|  |ddkr.| || td d S )Nr   ZUnknownZhpZhewlettz#hplip: no good (Non-HP printer: %s)zhplip: tryingz
hp-makeuriz-cTr   r   zhplip: no good (return code %d)zhplip: no goodzhplip: uri is %sr   zhplip: done)rj   lowerrK   r8   r   r   r&   r   r   r   r   r   r   r   r^   r;   striprg   r   )r6   r   r   r   r   r{   r   r   r   rk   e  sF    



zPrinterFinder._probe_hplipc           
   
   C   s~  t sd S t }d}t rd}tjj||jd}g }d| j }td zf|	 dkr| j
rftd W d S z|| }W qF tk
r } z|| W 5 d }~X Y qFX qFW nd tk
r } z6|j\}}|tjtjtjfkrtdt||f  W 5 d }~X Y n   t  Y nX | j
r$td d S |D ]H}|jtjjkr(dt| jt|jf }d	| j }	| ||	 q(td
 d S )Nr   
   )debugZauth_fnz	smb://%s/zsmb: tryingzsmb: no goodzRuntime error: %szsmb://%s/%szSMB (%s)z	smb: done)PYSMB_AVAILABLErP   Zget_debuggingr   ZsmbcZContextrc   r&   r8   rV   r^   ZopendirZgetdentsrq   ZfailedRuntimeErrorrT   r   r   ZEACCESZEPERMr<   rr   Z	smbc_typeZPRINTER_SHAREsmburiZurlquoter>   r   )
r6   Z	smbc_authr   Zctxentriesr{   r   r)   entryr|   r   r   r   rp     sL    
"
$

zPrinterFinder._probe_smbc                 C   sr   d}| j |f}td t| j |}|s4td|  n2td|  d| }d| j  }| || |  td d S )Ni#  zjetdirect: tryingzjetdirect: %s:%d CLOSEDzjetdirect %s:%d OPENzsocket://%s:%dzJetDirect (%s)zjetdirect: done)r&   r8   r1   r   r%   )r6   r'   Zsock_addressr)   r{   r|   r   r   r   rl     s    

zPrinterFinder._probe_jetdirectc                 C   s  t d zt| jdtjtj}W n. tjk
rP   t d| j  t d Y d S X |D ]T}|\}}}}}|tjkr~|d dks|tjkrV|d dkrVt d t d  d S qVzt	j
| jd	}W n& tk
r   t d
 t d Y d S X z| }	W nP t	jk
rB   t d| j  d| j }
d| j }| |
| t d Y d S X |	 D ]0\}}|d }
|d }|d }| |
|| qLt d d S )Nzipp: tryingiw  zipp: can't resolve %szipp: no goodr   z	127.0.0.1z::1z#ipp: do not probe local cups server)r(   z$ipp: can't connect to server/printerz0%s is probably not a cups server but IPP printerzipp://%s:631/ippzIPP (%s)z	ipp: donezprinter-uri-supportedzprinter-infozprinter-location)r8   r   r    r&   r!   r"   r#   ZAF_INETZAF_INET6cupsZ
Connectionr   ZgetPrintersZIPPErrorr   items)r6   r*   r+   r,   r-   r.   r/   r0   cZprintersr{   r|   r>   Zqueuer}   r   r   r   rm     sT    


zPrinterFinder._probe_ipp)N)r	   r
   r   r7   rg   rh   re   r   rn   ro   rk   rp   rl   rm   r   r   r   r   r]      s   

<&+r]   __main__   zNeed printer addressr   c                 C   s   | d krt   d S rQ   )loopr^   )r   r   r   r   display  s    r   )&ry   r   r   r   rL   Zgi.repositoryr   r   Ztimedopsr   r   rR   r   r   r   r   r   r   r   r1   r2   r   rP   r]   r	   sysr   argvprintexitZset_debuggingZMainLoopr   r   Zaddrr   rg   runr   r   r   r   <module>   sJ   1N  


