ó
N_c           @   sŠ  d  d l  Z  d  d l Z d  d l Z d  d l m Z d  d l Z d  d l m Z yr d  d l Z e j ƒ  Z	 e	 j
 ƒ  d Z	 e	 j
 d ƒ d Z	 e e e e	 j
 d ƒ ƒ ƒ Z	 e	 d k  rÁ d Z n  Wn d Z d Z	 n Xe d k	 rd  d	 l m Z d
 e f d „  ƒ  YZ n d Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d S(   iÿÿÿÿN(   t   datetime(   t   _i    t   (t   .i   ic   (   t   LibLVMErrort   _ResultErrorc           B   s   e  Z d  Z RS(   s>   Exception raised for LVM calls resulting in bad return values.(   t   __name__t
   __module__t   __doc__(    (    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyR      s   c         C   s,   |  j  ƒ  } | d s d  S| d d d k S(   Ni    t   ot   O(   R	   R
   (   t   getAttrt   None(   t   lvt   snap(    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt
   _is_origin%   s    
c         C   s,   |  j  ƒ  } | d s d  S| d d d k S(   Ni    t   st   S(   R   R   (   R   R   (   R   R   (    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   _is_snap,   s    
c         C   s,   |  j  ƒ  } | d s d  S| d d d k S(   Ni    t   v(   R   R   (   R   R   (    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   _is_virt3   s    
c         C   s    y |  j  | ƒ SWn d  SXd  S(   N(   t
   lvFromNameR   (   t   vgt   lvname(    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   _vg_name2lv:   s    c          C   s  y t  j ƒ  }  Wn t k
 r) g  }  n X|  st j d d d d g d t j d t j ƒ} | j ƒ  } | r„ t t d ƒ ƒ ‚ n  | j	 ƒ  d } | j
 d	 ƒ } | s­ g  S| d j ƒ  } | d
 k rÍ g  Sg  }  x2 | d D]# } | sî Pn  |  j | j ƒ  ƒ qÞ Wn  |  S(   Ns	   /sbin/lvmt   vgss   -ot   vg_namet   stdoutt   stderrs#   Failed to obtain volume group namesi    s   
t   VGi   (   t   lvmt   listVgNamesR   t
   subprocesst   Popent   PIPEt   waitR   R   t   communicatet   splitt   stript   append(   t   namest   pt   errt   outputt   headert   name(    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   _list_vg_names@   s.    
c         C   s‹   t  |  ƒ d k r‡ t |  d d !ƒ d } | t |  d d !ƒ 7} | d 9} |  d d k rg | | 8} n  |  d d k r‡ | | 7} q‡ n  | S(   Ni   i   i   i<   i    t   +t   -(   t   lent   int(   t   zt   ctimet   off(    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   _z_off]   s    
c         C   s£   y |  j  ƒ  \ } } } t j | d | d ƒ }  t j |  ƒ }  t rŽ t j d ƒ } | | k rŽ t | ƒ } t | ƒ } |  | | 7}  qŽ n  Wn d }  n X|  S(   Nt    s   %Y-%m-%d %H:%M:%Ss   %zi    (   R%   t   timet   strptimet   mktimet   Falset   strftimeR6   (   R4   t   dt   tR3   t   cur_z(    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   _lv_ctime2utch   s    
c   
      C   sá   |  j  ƒ  } | j  ƒ  } | j ƒ  } | j d ƒ d } | j ƒ  } t | j d ƒ d ƒ } | j d ƒ d } t | ƒ } | d } i d | | f d 6| d	 6| d 6d | | f d
 6|  j ƒ  d 6| d 6| d 6| d 6}	 |	 S(   Nt   origini    t   lv_timet   snap_percenti   iè  s   %s/%st   devR4   t
   origin_devt   freet   tagst   sizet   usediè  i@B (   t   getNamet   getSizet   getPropertyt   getTagsR@   t   floatt   getFreeSize(
   R   R   t   vgnameR   RH   RA   RG   R4   RI   t   data(    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   _lv_data{   s$    

c            s   ‡  f d †  } | S(   s7   Decorator for _FSSnap methods that logs LVM tracebacks.c            sS   y ˆ  |  | | Ž SWn8 t  k
 rN } |  j d  k	 rH |  j j | ƒ n  ‚  n Xd  S(   N(   R   t   _loggerR   t	   exception(   t   selft   argst   kwargst   e(   t   func(    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   wrap–   s    (    (   RY   RZ   (    (   RY   s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   _log_traceback”   s    c         C   s@   t  |  ƒ t k r2 t |  j ƒ d k r2 |  j d St |  ƒ Sd S(   s;   Convert a LibLVMError instance to a readable error message.i   i   N(   t   typeR   R1   RV   t   str(   t   exc(    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt
   lvmerr2strŸ   s    't   _FSSnapc           B   s†   e  Z d  e d d d „ Z e d „  ƒ Z d d „ Z e d d „ ƒ Z	 e d d d i  d	 „ ƒ Z
 e d
 „  ƒ Z e g  d „ ƒ Z RS(   t   /s   !*/swaps
   !*/lv_swapc         C   s   t  s t j ƒ  r g  } n  t |  _ t t  o= t j j d ƒ ƒ |  _ d |  _	 d  |  _ | |  _ | |  _ d  |  _ | |  _ |  j s‰ d  Sd  S(   Ns	   /sbin/lvmt   _yum_(   R   t   ost   geteuidt   _vert   versiont   boolt   patht   existst	   availablet   postfix_staticR   t   _postfixt   _roott   _devst   _vgname_listRS   (   RU   t   roott   lookup_mountst   devicest   logger(    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   __init__­   s    		!							c         C   s4   |  j  d  k r- |  j r! t ƒ  n g  |  _  n  |  j  S(   N(   Ro   R   Rj   R.   (   RU   (    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   _vgnamesÀ   s    c   	      C   s  | d  k	 r+ t | ƒ s$ t | ƒ r+ t Sn  t } xÛ |  j D]Ð } d | k rS q; n  t } | d d k r‚ t } t } | d } n  | j d d ƒ \ } } d | k r¬ q; n  t j | | ƒ sÄ q; n  | d k rÕ | S| d  k rå d  S| j ƒ  } t j | | ƒ s	q; n  | SW| S(   NRa   i    t   !i   t   *(	   R   R   R   R;   Rn   t   TrueR%   t   fnmatchRJ   (	   RU   RP   R   t	   found_negRD   t   negt   vgnt   lvnR   (    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   _use_devÆ   s4    id   c   	      C   sü   t  } xï |  j D]ä } |  j | ƒ } | d k	 r> | r> q n  t j | d ƒ } | so t t d ƒ | ƒ ‚ n  | j ƒ  } d } x< | j	 ƒ  D]. } |  j | | ƒ s¬ qŽ n  | | j
 ƒ  7} qŽ W| j ƒ  | sÖ q n  t } | | d | k r t  Sq W| S(   s0    See if we have enough space to try a snapshot. t   rs(   Unknown error when opening volume group i    id   N(   R;   Ru   R~   R   R   t   vgOpenR   R   RO   t   listLVsRK   t   closeRx   (	   RU   t
   percentaget   retRP   t   useR   t   vgfsizet   lvssizeR   (    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt	   has_spaceí   s,    
t    c         C   s  | d k r1 d |  j t j ƒ  j d ƒ f } n  g  } xÑ|  j D]Æ} |  j | ƒ } | d k	 ro | ro qA n  t j | d ƒ } | s  t	 t
 d ƒ | ƒ ‚ n  xZ| j ƒ  D]L}	 |	 j ƒ  }
 |  j | |	 ƒ s× q­ n  d | |
 | f } |	 j | |	 j ƒ  | d ƒ } | s3| j ƒ  t	 t
 d ƒ | ƒ ‚ n  d | |
 f } d | | f } t ƒ  } x‡ | | d	 f D]v } xm | j | g  ƒ D]Y } d
 | k rÑ| j d
 d ƒ \ } } | | k rÁq…n  | j | ƒ n  | j | ƒ q…WqlW| j | | f ƒ q­ W| j ƒ  qA W| S(   sc    Attempt to take a snapshot, note that errors can happen after
            this function succeeds. s   %s%ss   %Y%m%d%H%M%S.%ft   ws(   Unknown error when opening volume group s   %s%s%sid   s%   Unknown error when creating snapshot s   %s/%sRw   t   =i   N(   R   Rk   R    t   nowR<   Ru   R~   R   R€   R   R   R   RJ   t   snapshotRK   R‚   t   sett   getR%   t   addt   addTagR'   (   RU   Rƒ   t   prefixt   postfixRG   R„   RP   R…   R   R   R   t   nlvnamet   nlvt   odevt   ndevt   eq_tagst   valt   tagt
   eq_tag_keyt
   eq_tag_val(    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyR     sF    % 
	c         C   s˜   g  } x‹ |  j  D]€ } t j | d ƒ } | sG t t d ƒ | ƒ ‚ n  x< | j ƒ  D]. } t | ƒ sl qT n  | j t | | ƒ ƒ qT W| j	 ƒ  q W| S(   s    List data for old snapshots. RŠ   s(   Unknown error when opening volume group (
   Ru   R   R€   R   R   R   R   R'   RR   R‚   (   RU   R„   RP   R   R   (    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   old_snapshotsF  s    c   	      C   s!  t  s
 g  Sg  } i  } xV | D]N } | j d ƒ \ } } | | k rZ t | g ƒ | | <q | | j | ƒ q Wx« | D]£ } t  j | d ƒ } | s­ t t d ƒ | ƒ ‚ n  x_ | | D]S } t | | ƒ } | sÙ q¸ n  t | ƒ së q¸ n  | j	 t
 | | ƒ ƒ | j ƒ  q¸ W| j ƒ  qv W| S(   s    Remove snapshots. Ra   RŠ   s(   Unknown error when opening volume group (   R   R%   RŽ   R   R€   R   R   R   R   R'   RR   t   removeR‚   (	   RU   Rr   R„   t   togoRD   RP   R   R   R   (    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   del_snapshots^  s0    (   s   !*/swaps
   !*/lv_swapN(   R   R   Rx   R   Rt   t   propertyRu   R~   R[   Rˆ   R   R   R    (    (    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyR`   ¨   s   '#4(   i   i   ic   (   Rc   Ry   R8   R    R    t   yumR   R   t
   getVersionRe   R%   t   tuplet   mapR2   R   R   R   R   R   R   R   R.   R6   R@   RR   R[   R_   t   objectR`   (    (    (    s3   /usr/lib/python2.7/site-packages/yum/fssnapshots.pyt   <module>   s>   
										