ó
æ\c           @   s   d  d l  m Z d  d l Td d l Z d  d l  m Z d d l m Z d d l j	 Z	 d d l
 Z
 d d l Z e j j   Z d e j f d     YZ d S(	   i   (   t   base(   t   *iĸĸĸĸN(   t
   exceptions(   t   commandst   SystemdPluginc           B   s§   e  Z d  Z d   Z d   Z d   Z e d    Z d   Z d   Z	 d   Z
 d   Z d	   Z d
   Z d   Z e d  Z d   Z e d d e d    Z RS(   sn   
	Plugin for tuning systemd options.

	These tunings are unloaded only on profile change followed by reboot.
	c         O   sW   t  j j t j  s. t j d t j   n  t t |   j	 | |   t
   |  _ d  S(   NsE   Required systemd '%s' configuration file not found, disabling plugin.(   t   ost   patht   isfilet   constst   SYSTEMD_SYSTEM_CONF_FILER   t   NotSupportedPluginExceptiont   superR   t   __init__R   t   _cmd(   t   selft   argst   kwargs(    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyR      s    c         C   s   t  | _ t | _ d  S(   N(   t   Falset   _has_dynamic_tuningt   Truet   _has_static_tuning(   R   t   instance(    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _instance_init   s    	c         C   s   d  S(   N(    (   R   R   (    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _instance_cleanup   s    c         C   s   i d  d 6S(   Nt   cpu_affinity(   t   None(   t   cls(    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _get_config_options!   s    c         C   s^   | d  k	 rZ t j d | d | d t j } | d  k	 rZ | j d k rZ | j d  Sn  d  S(   Ns   ^\s*s   \s*=\s*(.*)$t   flagsi   (   R   t   ret   searcht	   MULTILINEt	   lastindext   group(   R   t   conft   keyt   mo(    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _get_keyval'   s
    #c         C   s   t  j d | d d t |  | d t  j \ } } | d k  r y! | d d k rb | d 7} n  Wn t k
 rv n X| | d t |  d 7} | S| S(	   Ns   ^(\s*s   \s*=).*$s   \g<1>R   i   iĸĸĸĸs   
t   =(   R   t   subnt   strR   t
   IndexError(   R   R"   R#   t   valt   conf_newt   nsubs(    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _add_keyval/   s    6c         C   s$   t  j d | d d | d t  j S(   Ns   ^\s*s   \s*=.*\nt    R   (   R   t   subR   (   R   R"   R#   (    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _del_key;   s    c         C   s<   |  j  j t j d d  } | d  k r8 t j d  d  S| S(   Nt   err_rets(   error reading systemd configuration file(   R   t	   read_fileR   R	   R   t   logt   error(   R   t   systemd_system_conf(    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _read_systemd_system_conf>   s
    c         C   s   t  j t  j } |  j j | |  sL t j d  |  j j | d t t	 S|  j j
 | t  j  s t j d t  j  |  j j | d t t	 St S(   Ns(   error writing systemd configuration filet   no_errors/   error replacing systemd configuration file '%s'(   R   R	   t   TMP_FILE_SUFFIXR   t   write_to_fileR3   R4   t   unlinkR   R   t   rename(   R   R"   t   tmpfile(    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _write_systemd_system_confE   s    c         C   s   t  j j t j |  j  S(   N(   R   R   t   joinR   t   PERSISTENT_STORAGE_DIRt   name(   R   (    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _get_storage_filenameS   s    c         C   sĒ   |  j    } | d  k	 r |  j   } |  j j | d d  d t } |  j j |  | d  k rv |  j | t j	  } n |  j
 | t j	 |  } |  j |  n  d  S(   NR1   R7   (   R6   R   RA   R   R2   R   R:   R0   R   t   SYSTEMD_CPUAFFINITY_VARR-   R=   (   R   R"   t   fnamet   cpu_affinity_saved(    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _remove_systemd_tuningV   s    c         C   s8   | r4 t  j d t j  |  j   t  j d  n  d  S(   Ns6   removing '%s' systemd tuning previously added by Tuneds[   you may need to manualy run 'dracut -f' to update the systemd configuration in initrd image(   R3   t   infoR   RB   RE   t   console(   R   R   t   full_rollback(    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _instance_unapply_staticb   s    
c      
   C   sQ   | d  k r d Sd j d   |  j j t j d d t j d d |    D  S(   NR.   t    c         s   s   |  ] } t  |  Vq d  S(   N(   R(   (   t   .0t   v(    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pys	   <genexpr>l   s    s   \s+t   ,s   ,\s+(   R   R>   R   t   cpulist_unpackR   R/   (   R   t   cpulist(    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _cpulist_convert_unpacki   s    R   t
   per_devicec         C   sl  d  } d  } |  j j |  j j |  j j |    } d j d   |  j j |  D  } |  j   }	 |	 d  k	 r |  j	 |	 t
 j  } |  j |  } n  | rķ |  j d | | |  S| rh|  j   }
 |  j j |
 d d  d t } | d  k	 r&| d  k r&| | k r&|  j j |
 | d t n  t j d t
 j | t
 j f  |  j |  j |	 t
 j |   n  d  S(   NRJ   c         s   s   |  ] } t  |  Vq d  S(   N(   R(   (   RK   RL   (    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pys	   <genexpr>s   s    R   R1   R7   t   makedirs    setting '%s' to '%s' in the '%s'(   R   R   t   unescapet
   _variablest   expandt   unquoteR>   RN   R6   R%   R   RB   RP   t   _verify_valueRA   R2   R   R9   R3   RF   R	   R=   R-   (   R   t   enablingt   valuet   verifyt   ignore_missingt   conf_affinityt   conf_affinity_unpackedRL   t
   v_unpackedR"   RC   RD   (    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   _cmdlinen   s"    *%$ (   t   __name__t
   __module__t   __doc__R   R   R   t   classmethodR   R%   R-   R0   R6   R=   RA   RE   R   RI   RP   t   command_customR_   (    (    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyR      s   											(   R.   R    t
   decoratorst
   tuned.logst   tunedR   t   tuned.utils.commandsR   t   tuned.constsR   R   R   t   logst   getR3   t   PluginR   (    (    (    s@   /usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt   <module>   s   
