3
Z7?              
   @   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y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jd ed ej Z dd Z!ejd Z"e Z#e#j$e"e! e j%  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 | }xt|D ]}| | }|rD||7 }d}q&|dkrVd}d}q&|r|rv|dkrld}q||7 }q|j r|j| d}d}q|dkrd}q||7 }q&|dkrd}d}q&|j s&d}||7 }q&W |dkr|j| |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   y| j dd\}}W n tk
r,   | }Y nX d }ytj||tjtj}W n  tjtjfk
rj   g }Y nX x|D ]}|\}}}}	}
ytj|||}|jd W n tjk
r   d }wrY nX y|j	|
 W n$ tjk
r   |j
  d }wrY nX P qrW |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]   s4    


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| y4|jd| jd |jdjd}tt| W nD tj	k
r } z&t| y|j
  W n   Y nX dS d }~X nX t|dkrt|d dkry|jd |j
  W n   Y nX |j| dS y|j
  W n   Y nX dS )	Ni  z%s
zUTF-8i   Fr   s   
T)r1   r&   printsendencodeZrecvdecodereprr   r$   r%   r   ordr   )r6   nameresultr)   datamsgr   r   r   probe_queue   s8    

zLpdServer.probe_queuec             C   sh   dddddg}x4t | jD ]&}|jd| d| d| d	| g qW xt d
D ]}|jd|  qNW |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)
debugprintr5   )r6   r   r   r   destroy   s    zLpdServer.destroyc             C   sj   g }x`| j  D ]T}xtj r&tj  qW | jr0P | j||}|d krFP | rX|jdrXP tjd qW |S )Nprg?)	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   rN   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 j | _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 j  tjj| }t j  || _| jj  d S )N)	r   Zthreads_enterr   r   perform_authenticationZthreads_leave!_do_perform_authentication_resultrQ   set)r6   r?   r   r   r   _do_perform_authentication   s
    z3BackgroundSmbAuthContext._do_perform_authenticationc             C   s\   | j dks(| j s(| j s(| jr4| j r4tjj| S | jj  t	j
d| j | jj  | jS )Nr   r   )ZpassesZ
has_failedZauth_calledZtried_guestr   r   rT   rQ   clearr   Ztimeout_addrW   waitrU   )r6   r   r   r   rT      s    


z/BackgroundSmbAuthContext.perform_authenticationN)r	   r
   r   __doc__r7   rW   rT   r   r   r   r   rO      s   rO   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)quit)r6   r   r   r   r7      s    zPrinterFinder.__init__c             C   s$   || _ || _t| jdd d| _d S )Nc             S   s   d S )Nr   )xyr   r   r   <lambda>   s    z$PrinterFinder.find.<locals>.<lambda>)callback)r&   callback_fnr   _do_findop)r6   r&   ra   r   r   r   find   s    zPrinterFinder.findc             C   s   | j j  d| _d S )NT)rc   cancelr\   )r6   r   r   r   re      s    
zPrinterFinder.cancelc             C   sr   t  | _xT| j| j| j| j| j| jgD ]4}| jr4d S y
|  W q& t	k
rX   t
  Y q&X q&W | jsn| jd  d S )N)dict_cached_attributes_probe_hplip_probe_jetdirect
_probe_ipp_probe_snmp
_probe_lpd
_probe_smbr\   	ExceptionnonfatalExceptionra   )r6   fnr   r   r   rb      s    
zPrinterFinder._do_findNc             C   sN   dd| d}|r||d< |j | j tj|f|}td|  | j| d S )NZnetworkz%s)zdevice-classzdevice-infozdevice-locationzDevice found: %s)updaterg   cupshelpersDevicerG   ra   )r6   uriinfolocationdevice_dictZ
new_devicer   r   r   _new_device  s    zPrinterFinder._new_devicec             C   s  y,t d tjd| jgdtjtjtjd}W n< tk
rh } z t d |jtjkrVd S  W Y d d }~X nX |j	 \}}|j
dkrt d|j
  d S | jrt d d S x|j j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rN||d< tj|	f|}t d|	  | j| |
| jd< || jd< qW t d d S )Nzsnmp: tryingz/usr/lib/cups/backend/snmpT)rR   	close_fdsstdinstdoutstderrzsnmp: no goodr   zsnmp: no good (return code %d)
         )zdevice-classzdevice-make-and-modelzdevice-infozsnmp: Device ID found:
%sz	device-idzdevice-locationzDevice found: %szdevice-make-and-model	device_idz
snmp: done)rG   
subprocessPopenr&   DEVNULLPIPEOSErrorerrnoENOENTcommunicate
returncoder\   r;   r   r   r   rr   rs   ra   rg   )r6   per{   r|   r   r   r   Zdevice_classrt   Zmake_and_modelru   r   Zdevice_locationrw   devicer   r   r   rk     sZ    




zPrinterFinder._probe_snmpc             C   s   t d t| j}x||j D ]p}| jr2t d d S |j|g }|d krPt d P |rpd| j|f }| j|| j | r|jdrP tj	d qW t d d S )Nzlpd: tryingzlpd: no goodzlpd: couldn't connectzlpd://%s/%srI   g?z	lpd: done)
rG   r2   r&   rF   r\   rB   rx   rJ   rK   rL   )r6   Zlpdr>   rM   rt   r   r   r   rl   L  s"    
zPrinterFinder._probe_lpdc             C   s8  d| j krZ| j d dkrZ| j d j jd rZ| j d j jd rZtd| j d   d S y.td tjdd| jgd	tjtjtjd
}W n4 t	k
r } z|j
t
jkrd S  W Y d d }~X nX |j \}}|jdkrtd|j  d S | jrtd d S |j j }td|  |jddkr,| j|| td d S )Nzdevice-make-and-modelZUnknownZhpZhewlettz#hplip: no good (Non-HP printer: %s)zhplip: tryingz
hp-makeuriz-cT)rR   ry   rz   r{   r|   r   zhplip: no good (return code %d)zhplip: no goodzhplip: uri is %sr   r   zhplip: done)rg   lowerrJ   rG   r   r   r&   r   r   r   r   r   r   r   r\   r;   striprd   rx   )r6   r   r   r{   r|   rt   r   r   r   rh   e  s<    

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 yhxb|j	 dkr| j
rftd d S y|j|j }W qH tk
r } z|j| W Y d d }~X qHX qHW W nf tk
r } z8|j\}}|tjtjtjgkrtdt||f  W Y d d }~X n   t  Y nX | j
r(td d S xP|D ]H}|jtjjkr.dtj| jtj|jf }d	| j }	| j||	 q.W 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_AVAILABLErO   Zget_debuggingr   ZsmbcZContextr`   r&   rG   rT   r\   ZopendirZgetdentsrn   ZfailedRuntimeErrorrR   r   r   ZEACCESZEPERMr<   ro   Z	smbc_typeZPRINTER_SHAREsmburiZurlquoter>   rx   )
r6   Z	smbc_authr   ZctxZentriesrt   r   r)   entryru   r   r   r   rm     sH    

$
$

zPrinterFinder._probe_smbc             C   sr   d}| j |f}td t| j |}|s4td|  n2td|  d| }d| j  }| j|| |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&   rG   r1   rx   r%   )r6   r'   Zsock_addressr)   rt   ru   r   r   r   ri     s    

zPrinterFinder._probe_jetdirectc             C   s  t d ytj| jdtjtj}W n, tjk
rN   t d| j  t d d S X xZ|D ]R}|\}}}}}|tjkr~|d dks|tjkrV|d dkrVt d t d d S qVW yt	j
| jd	}W n$ tk
r   t d
 t d d S X y|j }	W nN t	jk
r>   t d| j  d| j }
d| j }| j|
| t d d S X x<|	j D ]0\}}|d }
|d }|d }| j|
|| qJW t 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)rG   r   r    r&   r!   r"   r#   ZAF_INETZAF_INET6cupsZ
Connectionr   ZgetPrintersZIPPErrorrx   items)r6   r*   r+   r,   r-   r.   r/   r0   cZprintersrt   ru   r>   Zqueuerv   r   r   r   rj     sJ    



zPrinterFinder._probe_ipp)N)r	   r
   r   r7   rd   re   rb   rx   rk   rl   rh   rm   ri   rj   r   r   r   r   r[      s   

<&+r[   __main__   zNeed printer addressr   c             C   s   | d krt j  d S )N)loopr\   )r   r   r   r   display  s    r   )&rr   r   r   r   rK   Zgi.repositoryr   r   Ztimedopsr   r   rP   r   r   r   r   r   r   r   r1   r2   r   rO   r[   r	   sysr   argvr8   exitZset_debuggingZMainLoopr   r   Zaddrr   rd   Zrunr   r   r   r   <module>   sJ   1N  


