
    Hf6x                         d dl Z d dlZd dlZd dl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
mZ  G d d      Zd Zd	 Z G d
 d      Z G d de      Zd Zd Zd Zd Zd Zd Zd Zedk(  r e        yy)    N   )_debugprint)config)reducec                       e Zd ZddgZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd ZddZddZd Zd Zd Zd Zd ZddZddZddZd Zy)Printeroptionslocalc                     || _         || _        g | _        t        |      dkD  }d}|r# | j                  di | | j
                  rd}nd}|r| j                          d| _        y)z
        @param name: printer name
        @type name: string
        @param connection: CUPS connection
        @type connection: CUPS.Connection object
        @param kw: printer attributes
        @type kw: dict indexed by string
        r   TFN )name
connectionclass_memberslenupdateis_classgetAttributes_ppd)selfr   r   kwhave_kwfetch_attrss         9/usr/lib/python3/dist-packages/cupshelpers/cupshelpers.py__init__zPrinter.__init__   sg     	$r(Q,DKK2}}"#!	    c                 \    | j                    t        j                  | j                          y y N)r   osunlinkr   s    r   __del__zPrinter.__del__9   s!    99 IIdii  !r   c                      d| j                   z  S )Nz<cupshelpers.Printer "%s">)r   r    s    r   __repr__zPrinter.__repr__=   s    -		99r   c                    d }d}t        |      }t        j                  D ]f  }|j                  |      s |||d        }|| j                  v r/|dk(  rd}t        | |t        | j                  t        t        |      z               h y )Nc                 "    | j                         S r   )lower)strs    r   _ascii_lowerz+Printer._expand_flags.<locals>._ascii_lowerB   s    99;r   CUPS_PRINTER_classr   )	r   cups__dict__
startswith_flags_blacklistsetattrbooltypegetattr)r   r(   prefixprefix_lengthr   	attr_names         r   _expand_flagszPrinter._expand_flags@   s    	  !F MM 	?Dv& mn!56  5 55x'ZiTYYt)<<=?	?r   c                 @   |j                  dd      | _        | j                  t        j                  k7  | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  d	d      | _	        |j                  d
d      | _
        |j                  dd      | _        t        | j                        t        k7  r| j                  g| _        | j                          | j                  | j                   | _        | `|j                  dg       | _        t        | j                        t        k7  r| j                  g| _        | j                  j!                          || _        y)z
        Update object from printer attributes.

        @param kw: printer attributes
        @type kw: dict indexed by string
        zprinter-stater   z
device-uri zprinter-infozprinter-is-sharedNzprinter-locationzprinter-make-and-modelzprinter-typezprinter-uri-supportedzmember-names)getstater+   IPP_PRINTER_STOPPEDenabled
device_uriinfo	is_sharedlocationmake_and_modelr1   uri_supportedlistr6   
not_sharedr   sortother_attributes)r   r   s     r   r   zPrinter.updateS   sN    VVOQ/
zzT%=%==&&r2FF>2.	 3T:126 ff%=rBFF>1-	VV$;R@##$,"&"4"4!5D>>!!%0DNOVVNB7##$,"&"4"4!5D" "r   c                    | j                   j                  | j                        }i | _        i | _        dddgfdg dfd| _        |j                         D ]  \  }}|j                  d      r|dt        d        }|dv r+|j                  |d	z   d      xs  | j
                  j                  |d      xs d
}t        |t              rt        d |      }|| j                  |<   |d	z   |v s||d	z      }||f| j
                  |<   |j                  d	      r|dk7  s|dk7  s|dk7  s|j                  d      r|| j                  |<    |j                  dd      \  | _        | _        |j                  ddg      | _        |j                  dd      | _        |j                  ddg      | _        |j                  dd
      xs d| _        |j                  ddg      | _        d| _        g | _        d|v r|d   | _        d| _        nd|v r
|d   | _        dj/                  | j,                        | _         | j2                  di | y)z
        Fetch further attributes for the printer.

        Normally only a small set of attributes is fetched.  This
        method is for fetching more.
        FalseTruenone)rJ   singlezsingle-thickdoublezdouble-thick)	landscapezpage-borderz-defaultN)z
job-sheetsprinter-error-policyprinter-op-policyznotify-eventszdocument-formatznotify-lease-durationz
-supportedr8   c                     | dz   |z   S )N,r   )xys     r   <lambda>z'Printer.getAttributes.<locals>.<lambda>   s    3q r   zjob-sheets-defaultrN   rO   zrequesting-user-name-)rJ   rJ   zjob-sheets-supportedzprinter-error-policy-supporteddefaultzprinter-op-policy-supportedTzrequesting-user-name-allowedFzrequesting-user-name-deniedz, r   )r   getPrinterAttributesr   
attributesrF   possible_attributesitemsendswithr   r9   
isinstancerC   r   r-   job_sheet_startjob_sheet_endjob_sheets_supportederror_policyerror_policy_supported	op_policyop_policy_supporteddefault_allowexcept_usersjoinexcept_users_stringr   )r   attrskeyvaluer   	supporteds         r   r   zPrinter.getAttributeso   sv    44TYY? ""VW$56# &? @$   ++- 	3JC||J',S_,- 5 5
 !IId\&94@  4488tD  ud+"$8%@E(-%$- %d<&7 8I6;Y5GD,,T2llL1--//,,nn&=>-2%%c*=	3@ 4999 "2440d0$)II.Dvh$O!!II&<fE&+ii,vh'8##6;Hy#(99)I;$8  ")U2 %&D ED!&D*e3 %&C DD#'99T->->#? ur   c                     | j                   d   j                  d      sy| j                   d   dd }|j                  d      d   }|j                  d      d   }|dk(  rd}|S )	zc
        Find out which server defines this printer.

        @returns: server URI or None
        r   zipp://N   /:zlocalhost.localdomain	localhost)rB   r-   split)r   uris     r   	getServerzPrinter.getServer   sn     !!!$//9  #AB'iinQiinQ))C
r   c                    d}| j                   J	 | j                  j                  | j                        | _         t	        j
                  | j                         }|+| j                   t	        j
                  | j                         }|S # t        j                  $ r0}|j                  \  }}|t        j                  k(  rd}n Y d}~md}~ww xY w)z
        Obtain the printer's PPD.

        @returns: cups.PPD object, or False for raw queues
        @raise cups.IPPError: IPP error
        NF)	r   r   getPPDr   r+   PPDIPPErrorargsIPP_NOT_FOUND)r   resultemargsems        r   rt   zPrinter.getPPD   s     99 OO22499=	499- >dii3XXtyy)F == A***"F s   A	B C&CCc                     t        |t              rCt        j                  t        j                        }|dk7  rt        |      j                  |d      }| j                  j                  | j                  ||       y)z
        Set a printer's option.

        @param name: option name
        @type name: string
        @param value: option value
        @type value: option-specific
        .N)
r[   floatlocalenl_langinfo	RADIXCHARr'   replacer   addPrinterOptionDefaultr   )r   r   ri   	radixchars       r   	setOptionzPrinter.setOption   s\     ue$**F,<,<=ICU++Y<//		4Gr   c                 P    | j                   j                  | j                  |       y)zh
        Unset a printer's option.

        @param name: option name
        @type name: string
        N)r   deletePrinterOptionDefaultr   )r   r   s     r   unsetOptionzPrinter.unsetOption   s     	22499dCr   Nc                     |r&| j                   j                  | j                         y|r(| j                   j                  | j                  |       y| j                   j                  | j                         y)z
        Set the printer's enabled state.

        @param on: whether it will be enabled
        @type on: bool
        @param reason: reason for this state
        @type reason: string
        reasonN)r   enablePrinterr   disablePrinterr   onr   s      r   
setEnabledzPrinter.setEnabled   sQ     OO))$))4..tyy.H..tyy9r   c                     |r&| j                   j                  | j                         y|r(| j                   j                  | j                  |       y| j                   j                  | j                         y)z
        Set the printer's accepting state.

        @param on: whether it will be accepting
        @type on: bool
        @param reason: reason for this state
        @type reason: string
        r   N)r   
acceptJobsr   
rejectJobsr   s      r   setAcceptingzPrinter.setAccepting  sQ     OO&&tyy1**499V*D**4995r   c                 P    | j                   j                  | j                  |       y)zy
        Set the printer's shared state.

        @param on: whether it will be accepting
        @type on: bool
        N)r   setPrinterSharedr   )r   r   s     r   	setSharedzPrinter.setShared  s     	((B7r   c                 P    | j                   j                  | j                  |       y)zs
        Set the printer's error policy.

        @param policy: error policy
        @type policy: string
        N)r   setPrinterErrorPolicyr   r   policys     r   setErrorPolicyzPrinter.setErrorPolicy  s     	--dii@r   c                 P    | j                   j                  | j                  |       y)z{
        Set the printer's operation policy.

        @param policy: operation policy
        @type policy: string
        N)r   setPrinterOpPolicyr   r   s     r   setOperationPolicyzPrinter.setOperationPolicy'  s     	**499f=r   c                 R    | j                   j                  | j                  ||       y)z
        Set the printer's job sheets.

        @param start: start sheet
        @type start: string
        @param end: end sheet
        @type end: string
        N)r   setPrinterJobSheetsr   )r   startends      r   setJobSheetszPrinter.setJobSheets0  s     	++DIIucBr   c                    t        |t              rw|j                         }|D cg c]  }|j                  d       }}g }|D ]  }|j                  |        |D cg c]  }|j	                          }}|D cg c]  }|s|	 }}|r'| j
                  j                  | j                  |       y| j
                  j                  | j                  |       yc c}w c c}w c c}w )z
        Set access control list.

        @param allow: whether to allow by default, otherwise deny
        @type allow: bool
        @param except_users: exception list
        @type except_users: string list
        rQ   N)	r[   r'   rp   extendstripr   setPrinterUsersDeniedr   setPrinterUsersAllowed)r   allowrd   usersu_fs         r   	setAccesszPrinter.setAccess;  s     lC( &&(E+01aQWWS\1E1L '##A&'/;<!AGGI<L<)5<2B<L<OO11$))\JOO22499lK 2 =<s   CC:C"C"c                    g }	 	 g d}| j                   j                  |      }|j                         D ]g  \  }}	 |d   }||j                  d      dz   d }|| j                  k7  r3|rd|v s:|d   dk(  sC|j                  |       |Wt        |      |k(  sf |S  |S # t        $ r | j                   j                         }Y w xY w# t        j                  $ r |cY S w xY w#  Y xY w)	z
        Find out whether jobs are queued for this printer.

        @param only_tests: whether to restrict search to test pages
        @type only_tests: bool
        @returns: list of job IDs
        )job-idjob-printer-urijob-name)requested_attributesr   rm   r   Nr   z	Test Page)
r   getJobs	TypeErrorr+   rv   rY   rindexr   appendr   )	r   
only_testslimitretrjobsidrg   rq   s	            r   
jobsQueuedzPrinter.jobsQueuedR  s    	2=..Q.G  	IB-.#**c*Q./0 diiu$z"k1

B$ce);
!	  
-  2..12 }} 	J	s4    B! C%!#CC
 CC
 
C"!C"%C)c                 "   g }	 	 g d}| j                   j                  d|      }|j                         D ]  \  }}	 |d   }||j                  d      dz   d }|| j                  k7  r3|j                  d	t        j                        t        j                  k  re|j                  |       |yt        |      |k(  s |S  |S # t        $ r | j                   j                  d      }Y w xY w# t        j                  $ r |cY S w xY w#  Y xY w)
zo
        Find out whether there are preserved jobs for this printer.

        @return: list of job IDs
        )r   r   	job-state	completed)
which_jobsr   )r   r   rm   r   Nr   )r   r   r   r+   rv   rY   r   r   r9   IPP_JOB_PENDINGIPP_JOB_COMPLETEDr   r   )r   r   r   r   r   r   rg   rq   s           r   jobsPreservedzPrinter.jobsPreservedw  s/    		H>..;EF / H  	IB-.#**c*Q./0 dii		;//1373I3IJJJO S#Y%%7
	 
+  H..;.GH }} 	J	s4   !C D
%C,)C/ +C,,C/ /DD
Dc                 (    | j                  d|      S )zl
        Find out whether test jobs are queued for this printer.

        @returns: list of job IDs
        T)r   r   )r   )r   r   s     r   testsQueuedzPrinter.testsQueued  s     4u==r   c           	         | j                   j                  | j                         t        j                         5 }	 d}| j                   j                  ||j                                |j                  d       |j                         D cg c]  }|j                  d       }}d}d}|D ]I  }|j                  d      s|j!                  d      d	   }	|	| j                  k7  rd
|dd z   ||<   d}|d	z  }K |r|j                  d       |j#                  |D cg c]  }|j%                  d       c}       |j'                          |j)                          |j                  d       	 | j                   j+                  ||j                                |cddd       S # t        j                  $ rW}|j                  \  }|t        j                  t        j                  fv rY d}~ddd       yt        j                  |      d}~ww xY wc c}w c c}w # t        j                  $ r Y ddd       yw xY w# 1 sw Y   yxY w)z9
        Set this printer as the system default.
        z/admin/conf/lpoptions)fdNFr   zUTF-8zDefault  r   zDest    T)r   
setDefaultr   tempfileTemporaryFilegetFilefilenor+   	HTTPErrorrw   HTTP_NOT_FOUNDHTTP_AUTHORIZATION_CANCELEDseek	readlinesdecoder-   rp   
writelinesencodetruncateflushputFile)
r   fresourcer{   slinelineschangedir   s
             r   setAsDefaultzPrinter.setAsDefault  s    	""499- ##& $	!)2''QXX['A FFAJ78{{~Gtdkk'*GEGGA ??J/::s+A.Dtyy(#*T!"X#5a"&FA 
HG 4HI



!OO++X!((++F I$	 $	 >> )vv,,d.N.NOO $	 $	 nna(() H I ~~ ! E$	 $	B!C$	 $	s}   H9-F!)#H9H$H9AH9H
28H9++HH9!H40H$H91HHH9H6+H95H66H99Ir   )FN)__name__
__module____qualname__r.   r   r!   r#   r6   r   r   rr   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s    !7+4!:?&#8BH0H D:"6"8A>	CL.#J!F>,r   r   c                     | j                         }| j                         }|j                         D ]@  \  }}t        || fi |}|||<   ||v s||   |_        |j                  j                          B |S )z
    Obtain a list of printers.

    @param connection: CUPS connection
    @type connection: CUPS.Connection object
    @returns: L{Printer} list
    )getPrinters
getClassesrY   r   r   rE   )r   printersclassesr   printers        r   r   r     s     %%'H##%G!) )g$
6g6 7?$+DMG!!!&&() Or   c                    i }| j                  d      }|D ]M  }|j                  d      dk(  r|j                  dd      \  }}|j                         ||j                         <   O d|v r|j                  d|d          d|v r|j                  d|d          d	|v r|j                  d
|d	          dD ]  }|j                  |d        |d
   dk(  rg |d
<   |S |d
   j                  d      |d
<   |S )z
    Parse an IEEE 1284 Device ID, so that it may be indexed by field name.

    @param id: IEEE 1284 Device ID, without the two leading length bytes
    @type id: string
    @returns: dict indexed by field name
    ;rn   r   MANUFACTURERMFGMODELMDLzCOMMAND SETCMD)	r   r   r   CLSDESSNSPJr8   rQ   )rp   findr   
setdefault)r   id_dictpiecespiecer   ri   s         r   parseDeviceIDr    s    GXXc]F /::c?b kk#a(e!&

	/
  5'."9:'5''"235'-"89H %4$%u~ N !--c2Nr   c                   "    e Zd ZdZd Zd Zd Zy)Devicez.
    This class represents a CUPS device.
    c                    || _         |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  d      }|d   | _        t        |      d	k(  | _
        t        | j
                        | _        |j                  d
      }|dk7  r3| j                  j                  dd      s||dz   d | j                  d<   yyy)z~
        @param uri: device URI
        @type uri: string
        @param kw: device attributes
        @type kw: dict
        zdevice-classr8   zdevice-infozdevice-make-and-modelz	device-idzdevice-locationrn   r   r   zserial=r   r      N)rq   r9   device_classr>   rA   r   r@   rp   r1   r   r   r  r   r   )r   rq   r   
uri_piecesr   s        r   r   zDevice.__init__  s     FF>26FF="-	 ff%<bA&&b)0"5YYs^
]	J* %dgg.HHY74<<++T"5!$QUVDLL 67r   c                      d| j                   z  S )Nz<cupshelpers.Device "%s">)rq   r    s    r   r#   zDevice.__repr__  s    ,txx77r   c                    |y| j                   |j                   k7  r|j                   ryy| j                  }|dk(  rb| j                  j                  d      dk7  rd}nA| j                  j                  d      dk7  rd}n | j                  j                  d	      dk7  rd
}|dk(  r.| j                  j	                         j                  d      dk7  rd}|j                  }|dk(  rb|j                  j                  d      dk7  rd}nA|j                  j                  d      dk7  rd}n |j                  j                  d	      dk7  rd
}|dk(  r.|j                  j	                         j                  d      dk7  rd}| j                   s||k7  r|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|d
k(  ry|d
k(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ry|dk(  ryt        | j                        t        |j                        k  }|s| j                  |j                  k  }|S )z9
        Compare devices by order of preference.
        TFdnssdz._ippr   dnssdiz._pdl-datastreamdnssdsz	._printerdnssdlusbfaxusbfaxserialparallelhphpfaxippsippsocketlpd)r   r1   rq   r   r&   r0   r   r>   )r   otherstypeotypery   s        r   __lt__zDevice.__lt__!  s    ===ENN*~~		Gxx}}W%+ 12b8 {+r1 E>xx~~$$U+r1 

Gyy~~g&",  23r9 ,2 E>yy %%e,2 }}%5.   
"
"}}  ~~      ~~~~  dggehh/YY+Fr   N)r   r   r   __doc__r   r#   r  r   r   r   r  r    s    -48^r   r  c                       e Zd Zd Zd Zy)_GetDevicesCallc                     d|v r7|j                  d      | _        | j                  |d<    |j                  di |S d | _         |j                  di |}| j                  ||      S )Nreply_handlerr   )r9   _client_reply_handler_reply_handler
getDevices)r   r   kwdsry   s       r   callz_GetDevicesCall.call  sq    d")-?)CD&$($7$7D!(:((1D11%)"&&&/$/""J77r   c                     |j                         D ]G  \  }}t        |fi |}|||<   |j                  dk7  s'|j                  dk(  s7|j                  |_        I | j                  r| j	                  ||       y |S )Nr8   )rY   r  r>   rA   r"  )r   r   devicesrq   datadevices         r   r#  z_GetDevicesCall._reply_handler  sx      	4ICC(4(F!GCL{{b V%:%:b%@(.%		4 %%&&
G<Nr   N)r   r   r   r&  r#  r   r   r   r  r    s    8
r   r  c                 :    t               }|j                  | |      S )z
    Obtain a list of available CUPS devices.

    @param connection: CUPS connection
    @type connection: cups.Connection object
    @returns: a list of L{Device} objects
    @raise cups.IPPError: IPP Error
    )r  r&  )r   r   ops      r   r$  r$    s     
	B77J##r   c                     | j                  |       | j                  |       | j                         | j                  |       yy)a  
    Set a new printer enabled, accepting jobs, and (if necessary) the
    default printer.

    @param connection: CUPS connection
    @type connection: cups.Connection object
    @param name: printer name
    @type name: string
    @raise cups.IPPError: IPP error
    N)r   r   
getDefaultr   )r   r   s     r   activateNewPrinterr/    sD     d#4  't$ (r   c           
         fdfd} ||       D ]  }|j                   dk(  r|j                  |j                         }|s1|j                  |j                  k(  sK|j                  }|j                  D ]T  }|d   |k(  s|j                  |j                   |       t        dt        |j                         dt        |             V  y)z
    Copy default options between PPDs.

    @param ppd1: source PPD
    @type ppd1: cups.PPD object
    @param ppd2: destination PPD
    @type ppd2: cups.PPD object
    c                 v    | j                   d d  }| j                  D ]  }|j                   |              |S r   )r	   	subgroupsr   )groupr	   ggetPPDGroupOptionss      r   r5  z*copyPPDOptions.<locals>.getPPDGroupOptions  s;    --" 	2ANN-a01	2r   c              3   R   K   | j                   D ]  } |      D ]  }|   y wr   )optionGroups)ppdr3  optionr5  s      r   iteratePPDOptionsz)copyPPDOptions.<locals>.iteratePPDOptions  s5     "" ,U3 \s   $'
PageRegionchoicezset z = N)keyword
findOptionui	defchoicechoices
markOptionr   repr)ppd1ppd2r:  r9  
new_optionri   r<  r5  s          @r   copyPPDOptionsrG    s    
 $D) 
A>>\)__V^^4
&))Z]]2$$E$,, A(#U*OOJ$6$6>$
8J8J2K26,"@ AA
Ar   c                    d}g d}|D ]
  }||k(  s	d} 	 t        d      }|D ]  }|j                  d      r|j                         j                         j                  d      rd}E|j                         j                         j                  d      rd}u|j                         dk7  s n |j	                          	 | j                  d	|       t        d
|z         y#  Y &xY w#  t        d|z         Y yxY w)z
    Set the PPD page size according to locale.

    @param ppd: PPD
    @type ppd: cups.PPD object
    @param language: language, as given by the first element of
    locale.setlocale
    @type language: string
    A4)CPOSIXenen_USen_CAfr_CALetterz/etc/papersize#a4letterr8   PageSizezset PageSize = %sz*Failed to set PageSize (%s not available?)N)openr-   r   r&   closerB  r   )r8  languagesizerS  eachr   r   s          r   setPPDPageSizerZ    s     D>F tD
"# 	Ds#zz|!!#..t4##%00:#	 	
	J
D)(4/0
JADHIs   BC" -C"  C) "C&)C;c                 f   dd}g fd}dx}}| j                  d      }|ro|j                  j                  dd      }|j                  dd      }|j                  d	d
      }|j                  dd      }|j                  d      dk7  s|j                  d      dk7  rd}|j	                  d      }|D ]  }|j                         j	                  d      }	|	D ]  }
|
j                         j	                  d      }|d   } ||      }|s	 ||       :t        j                  j                  |      dk(  s]t        |      }d}d}||k  sr||   }|j                  |      r!|t        |      d } ||      }|s ||       |dz  }||k  rB |r n |s|st        j                  d      \  }}t        j                  |       | j                  |       t        j                  |dt        j                          t        j"                  |dd      }d}|D ]  }|j                  |      s|t        |      d j                         j                  d      }	 |j	                  d      \  }}} ||t$        j&                  dz         }|rs |t$        j&                  dz   |z           S #  Y xY w) z
    Check that all relevant executables for a PPD are installed.

    @param ppd: PPD
    @type ppd: cups.PPD object
    @returns: string list, representing missing executables
    c                 t   | dk(  ry| j                  d      }|dk7  r| d | } t        |       dk(  ry| d   dk(  rCt        j                  | t        j                        rt        d| z         | S t        d	| z         y | j                  d
      dk7  ry| dv ry|j                  d      D ]  }|j                  t        j                  j                        t        j                  j                  z   | z   }t        j                  |t        j                        sot        d|z         |c S  t        | d|       y )N-builtin%r   r   truerm   z	%s: foundz%s: NOT found=)'rn   r~   [aliasbindbreakcdcontinuedeclareechoelseevalexecexitexportfiifkillletr
   popdprintfpushdpwdreadreadonlysetshiftshoptsourcetestthentrapr1   ulimitumaskunaliasunsetwaitrn   z: NOT found in )
r   r   r   accessX_OKr   rp   rstrippathsep)r   r  p	componentfiles        r   	pathcheckz%missingExecutables.<locals>.pathcheck	  s   3; IIsO78D:?7c>yy$([4/0_t3499c?b  2 2 S) 	I##RWW[[1BGGKK?$FDyy$([4/0		
 	dD9:r   c                 ^    | j                  d      }|dk7  r| d | } j                  |        y )Nr_  r   )r   r   )exer  exes_to_installs     r   add_missingz'missingExecutables.<locals>.add_missing/  s0    HHcN7bq'C$r   NFoomaticRIPCommandLinez&&
r8   z&quot;"z&lt;<z&gt;>(r   &r   |r   r   gsr   z-sIjsServer=T)textrtzutf-8)encodingz*cupsFilter:z/filter:/usr/lib64/cups/filterz/filter/)z/usr/bin:/bin)findAttrri   r   r   rp   r   r   r  basenamer   r-   r   mkstempr   writeFdlseekSEEK_SETfdopenr   cupsserverbindir)r8  r  r  r  exepathattrcmdlinepipespipecmdscmdrw   argnargisearchargtmpfdtmpfnamer   r   mimetypecostr  s                         @r   missingExecutablesr    s   "H O% C'<<12D**$$fb1//8S1//63///63/LL#"$LL#"$G s# 	D::=&&,D "yy|))3/1g#S/%
 77##W-5:DD+F+"4j>>62"%c6lm"4C&/oG#* +S 1!	 +"6 ?	B c %,,48
		8U
%BKK(IIudW5 	MD'CLM*003993?,0JJ,<)XtS $S%+%<%< @> &>? !8!8:!E!KL	M s   J,,J0c                      t        |       }g |fS )z
    Check that all relevant executables for a PPD are installed.

    @param ppd: PPD
    @type ppd: cups.PPD object
    @returns: string list pair, representing missing packages and
    missing executables
    )r  )r8  executabless     r   missingPackagesAndExecutablesr    s     %S)Kr   c                      t        j                         } t        |       j                         D ]"  }t	        |j
                  |j                         $ y r   )r+   
Connectionr$  valuesprintrq   r   )cr*  s     r   _mainr    s<    AQ-&&( +vzz6>>*+r   __main__)r+   pprintr   r   restringr   r8   r   r   	functoolsr   r   r   r  r  objectr  r$  r/  rG  rZ  r  r  r  r   r   r   r   <module>r     s   , . - -    r rh$:@ @Df .
$%$A@&JPAF
+ Z	G r   