ó
ë™xTc           @   sõ   d  d l  m Z d  d l Z d  d l Z d  d l m Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d	 „  ƒ  YZ	 d
 e f d „  ƒ  YZ
 d e
 f d „  ƒ  YZ d e f d „  ƒ  YZ d e
 f d „  ƒ  YZ d „  Z d e
 f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   divisionN(   t   errorst	   JobStatusc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s   
  Status class
  c         C   s/   | |  _  | |  _ | |  j  |  j g |  _ d  S(   N(   t   outfilet   errfilet   files(   t   selfR   R   t
   additional(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyt   __init__   s    		c         C   s†   d d  l  } |  j d  k	 r| x? t r\ y t |  j ƒ } Wn t k
 rW | j d ƒ q XPq W| j ƒ  j ƒ  } | j	 ƒ  n d  } | S(   Niÿÿÿÿi   (
   t   timeR   t   Nonet   Truet   opent   IOErrort   sleept   readt   stript   close(   R   R	   t   infilet   stdout(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyt
   get_stdout   s    	c         C   s€   d d  l  } |  j d  k	 rv x? t r\ y t |  j ƒ } Wn t k
 rW | j d ƒ q XPq W| j ƒ  } | j ƒ  n d  } | S(   Niÿÿÿÿi   (	   R	   R   R
   R   R   R   R   R   R   (   R   R	   R   t   stderr(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyt
   get_stderr-   s    	c         C   sL   x3 |  j  D]( } t j j | ƒ r
 t j | ƒ q
 q
 Wd  |  _ d  |  _ d  S(   N(   R   t   ost   patht   existst   removeR
   R   R   (   R   t   fname(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyt   cleanupE   s
    	(   t   __name__t
   __module__t   __doc__R   R   R   R   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR   	   s
   			t   Synchronousc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s0   
  Determines job status for synchronous jobs
  c         C   s2   t  t |  ƒ j d | d | d | ƒ | |  _ d  S(   NR   R   R   (   t   superR    R   t   process(   R   R"   R   R   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR   T   s
    c         C   s   |  j  j ƒ  d  k	 S(   N(   R"   t   pollR
   (   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyt   is_finished^   s    c         C   s   |  j  j ƒ  d  S(   N(   R"   t	   terminate(   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR%   c   s    c         C   s’   |  j  ƒ  s t ‚ y |  j ƒ  } |  j ƒ  } WnK t k
 r{ |  j j j ƒ  } |  j j j ƒ  } t	 j
 d | | f ‚ n X| | |  j j ƒ  f S(   Ns   Queue error:%s
%s(   R$   t   AssertionErrorR   R   R   R"   R   R   R   R   t   AbnormalExitErrorR#   (   R   R   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyt   resultsh   s    (   R   R   R   R   R$   R%   R(   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR    O   s
   	
		t   SlurmStreamc           B   s;   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s£   
  Specialized handler for Slurm, because file handles of the shell are redirected

  Note that this can fill the buffers, resulting in the job never completing
  c         C   s   | |  _  | |  _ d  S(   N(   R"   R   (   R   R"   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR      s    	c         C   s   |  j  j ƒ  d  k	 S(   N(   R"   R#   R
   (   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR$   …   s    c         C   s   |  j  j ƒ  d  S(   N(   R"   R%   (   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR%   Š   s    c         C   sL   |  j  ƒ  s t ‚ |  j j j ƒ  } |  j j j ƒ  } | | |  j j ƒ  f S(   N(   R$   R&   R"   R   R   R   R#   (   R   R   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR(   �   s    c         C   s:   x3 |  j  D]( } t j j | ƒ r
 t j | ƒ q
 q
 Wd  S(   N(   R   R   R   R   R   (   R   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR   ˜   s    (   R   R   R   R   R$   R%   R(   R   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR)   x   s   					t   Asynchronousc           B   s;   e  Z d  Z d „  Z d „  Z d „  Z e d d „ ƒ Z RS(   s#   
  Handler for asynchronous jobs
  c         C   sZ   t  t |  ƒ j d | d | d | ƒ | |  _ | |  _ | |  _ |  j j d |  j ƒ d  S(   NR   R   R   t   jobid(   R!   R*   R   R+   t   pollert   qdelt   new_job_submitted(   R   R+   R,   R   R   R   R-   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR   ¤   s    			c         C   s:   y |  j  j d |  j ƒ } Wn t k
 r5 t } n X| S(   NR+   (   R,   R$   R+   t
   ValueErrorR   (   R   t   result(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR$   ³   s
    
c         C   sc   y  t  j |  j |  j g ƒ } Wn2 t k
 rT } t j d |  j |  j | f ‚ n X| j ƒ  d  S(   Ns   '%s %s': %s(   t
   subprocesst   PopenR-   R+   t   OSErrorR   t   ExecutableErrort   communicate(   R   R"   t   e(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR%   ¾   s
     #t   .c         C   s   |  j  | | | | f S(   N(   t   SCRIPT(   t   clst   includet
   executablet   scriptt   cwd(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR<   É   s    (   R   R   R   R   R$   R%   t   classmethodR<   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR*   Ÿ   s   			t   StdStreamStrategyc           B   s   e  Z d  Z d Z d „  Z RS(   s*   
  Establishes exit code through stderr
  s@   cd %s
source %s
%s 2>&1 << EOF
%s
EOF

echo exit_status $? 1>&2
c         C   s‡   |  j  ƒ  } | d  k	 rK y t d | ƒ } WqQ t j k
 rG d } qQ Xn d } | d k rp d |  j ƒ  | f S|  j ƒ  d | f Sd  S(   Nt   outputi   i    t    (   R   R
   t   extract_exit_code_textR   t   ExtractionErrorR   (   R   R   t	   exit_code(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR(   ß   s    (   R   R   R   R8   R(   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR?   Ï   s   t   SlurmStdStreamStrategyc           B   s   e  Z d  Z d Z RS(   sB   
  Stdstream strategy specifically for Slurm (different script)
  sO   #!/bin/sh
cd %s
source %s
srun %s 2>&1 << EOF
%s
EOF

echo exit_status $? 1>&2
(   R   R   R   R8   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyRE   õ   s   t   AccountingStrategyc           B   s   e  Z d  Z d Z d „  Z RS(   s.   
  Establishes exit code through accounting
  s!   cd %s
source %s
%s << EOF
%s
EOF
c         C   s¹   y1 t  j d d |  j g d t  j d t  j ƒ} Wn, t k
 r_ } t j d |  j | f ‚ n X| j ƒ  \ } } | j ƒ  r‘ t j	 d | ‚ n  t
 d | ƒ } |  j ƒ  |  j ƒ  | f S(   Nt   qaccts   -jR   R   s   'qacct -j %s': %ss   SGE accounting error:
%sR@   (   R1   R2   R+   t   PIPER3   R   R4   R5   R#   R'   RB   R   R   (   R   R"   R6   t   outt   errRD   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR(     s    	(   R   R   R   R8   R(   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyRF     s   	c         C   sm   xf |  j  ƒ  D]H } | j ƒ  } t | ƒ d k r | d d k r t | d ƒ } | Sq Wt j d |  ‚ d  S(   Ni   i    t   exit_statusi   s   Unexpected output: %r(   t
   splitlinest   splitt   lent   intR   RC   (   R@   t   linet   tokensRD   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyRB   -  s    "t   LogfileStrategyc           B   s8   e  Z d  Z d Z d „  Z d „  Z d „  Z d „  Z RS(   s:   
  Establishes exit code through queuing system logfile
  s+   cd %s
#!/bin/sh
source %s
%s << EOF
%s
EOF
c         C   sH   | |  _  t t |  ƒ j d | d | d | d | d | |  j  g ƒ d  S(   NR+   R,   R   R   R   (   t   logfileR!   RR   R   (   R   R+   R,   R   R   RS   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR   I  s    	c         C   sL   |  j  d  k	 rB t j j |  j  ƒ s* t ‚ t |  j  ƒ j ƒ  } n d  } | S(   N(   RS   R
   R   R   R   R&   R   R   (   R   t   stdlog(    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyt
   get_stdlogU  s
    c         C   sÐ   |  j  ƒ  } | d  k	 r± d d  l j j } d | j ƒ  } | j | ƒ } g  | j d ƒ D]$ } | j j	 d ƒ d k rY | ^ qY } | s’ d } q· t
 | d j d ƒ j ƒ } n d } |  j ƒ  |  j ƒ  | f S(	   Niÿÿÿÿs   <events>%s</events>t   at   nt   ReturnValuei   t   ii    (   RU   R
   t   xml.etree.ElementTreet   etreet   ElementTreeR   t
   fromstringt   itert   attribt   getRO   t   findt   textR   R   (   R   RT   t   ETt   logxmlt   rootR6   t   resRD   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR(   a  s    :	c         C   s    t  t |  ƒ j ƒ  d  |  _ d  S(   N(   R!   RR   R   R
   RS   (   R   (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyR   x  s    (   R   R   R   R8   R   RU   R(   R   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyRR   :  s   
			(   t
   __future__R    R   R1   t&   libtbx.queuing_system_utils.processingR   t   objectR   R    R)   R*   R?   RE   RF   RB   RR   (    (    (    s[   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/libtbx/queuing_system_utils/processing/status.pyt   <module>   s   F)'0&&	