Sophie

Sophie

distrib > Fedora > 17 > i386 > media > updates > by-pkgid > b50d8ee6d7871fcc13c0677a9364ed59 > files > 17

bcfg2-doc-1.3.0-1.fc17.noarch.rpm



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>Bcfg2.Client.Tools &mdash; Bcfg2 1.3.0 documentation</title>
    
    <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
    <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../../../',
        VERSION:     '1.3.0',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../../../_static/jquery.js"></script>
    <script type="text/javascript" src="../../../_static/underscore.js"></script>
    <script type="text/javascript" src="../../../_static/doctools.js"></script>
    <script type="text/javascript" src="../../../_static/sidebar.js"></script>
    <link rel="shortcut icon" href="../../../_static/favicon.ico"/>
    <link rel="top" title="Bcfg2 1.3.0 documentation" href="../../../index.html" />
    <link rel="up" title="Module code" href="../../index.html" />
 
<link rel="stylesheet" href="../../../_static/bcfg2.css" type=""/>

  </head>
  <body>

<div style="text-align: left; padding: 10px 10px 15px 15px">
<a href="../../../index.html"><img src="../../../_static/bcfg2_logo.png" border="0" alt="sampledoc"/></a>
</div>

    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../../../genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="../../../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
	<li><a href="../../../index.html">home</a> |&nbsp;</li>
	<!--<li><a href="../../../search.html">search</a> |&nbsp;</li>-->
	<li><a href="../../../help/index.html">help</a> |&nbsp;</li>
	<li><a href="../../../contents.html">documentation </a> &raquo;</li>

          <li><a href="../../index.html" accesskey="U">Module code</a> &raquo;</li> 
      </ul>
    </div>
  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <h1>Source code for Bcfg2.Client.Tools</h1><div class="highlight"><pre>
<span class="sd">&quot;&quot;&quot;This contains all Bcfg2 Tool modules&quot;&quot;&quot;</span>

<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">stat</span>
<span class="kn">from</span> <span class="nn">subprocess</span> <span class="kn">import</span> <span class="n">Popen</span><span class="p">,</span> <span class="n">PIPE</span>
<span class="kn">import</span> <span class="nn">Bcfg2.Client</span>
<span class="kn">import</span> <span class="nn">Bcfg2.Client.XML</span>
<span class="kn">from</span> <span class="nn">Bcfg2.Compat</span> <span class="kn">import</span> <span class="n">walk_packages</span>  <span class="c"># pylint: disable=W0622</span>

<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="n">m</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">walk_packages</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">__path__</span><span class="p">)]</span>

<span class="c"># pylint: disable=C0103</span>
<span class="c">#: All available tools</span>
<span class="n">drivers</span> <span class="o">=</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">__all__</span> <span class="k">if</span> <span class="n">item</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s">&#39;rpmtools&#39;</span><span class="p">]]</span>

<span class="c">#: The default set of tools that will be used if &quot;drivers&quot; is not set</span>
<span class="c">#: in bcfg2.conf</span>
<span class="n">default</span> <span class="o">=</span> <span class="n">drivers</span><span class="p">[:]</span>
<span class="c"># pylint: enable=C0103</span>


<div class="viewcode-block" id="ToolInstantiationError"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.ToolInstantiationError">[docs]</a><span class="k">class</span> <span class="nc">ToolInstantiationError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; This error is raised if the toolset cannot be instantiated. &quot;&quot;&quot;</span>
    <span class="k">pass</span>

</div>
<div class="viewcode-block" id="Executor"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Executor">[docs]</a><span class="k">class</span> <span class="nc">Executor</span><span class="p">:</span>
    <span class="sd">&quot;&quot;&quot; This class runs shell commands. &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">logger</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        :param logger: The logger to use to produce debug logging</span>
<span class="sd">        :type logger: logging.Logger</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span>

<div class="viewcode-block" id="Executor.run"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Executor.run">[docs]</a>    <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">command</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Run a command inside a shell.</span>

<span class="sd">        :param command: The command to run, given as a list as to</span>
<span class="sd">                        :class:`subprocess.Popen`.  Since the command</span>
<span class="sd">                        will be run within a shell it is particularly</span>
<span class="sd">                        important to pass it as a list.</span>
<span class="sd">        :type command: list</span>
<span class="sd">        :returns: tuple of return value (integer) and output (list of</span>
<span class="sd">                  lines)</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Running: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">command</span><span class="p">)</span>
        <span class="n">proc</span> <span class="o">=</span> <span class="n">Popen</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">bufsize</span><span class="o">=</span><span class="mi">16384</span><span class="p">,</span>
                     <span class="n">stdin</span><span class="o">=</span><span class="n">PIPE</span><span class="p">,</span> <span class="n">stdout</span><span class="o">=</span><span class="n">PIPE</span><span class="p">,</span> <span class="n">close_fds</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
        <span class="n">output</span> <span class="o">=</span> <span class="n">proc</span><span class="o">.</span><span class="n">communicate</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
        <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">output</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;&lt; </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">line</span><span class="p">)</span>
        <span class="k">return</span> <span class="p">(</span><span class="n">proc</span><span class="o">.</span><span class="n">wait</span><span class="p">(),</span> <span class="n">output</span><span class="p">)</span>

</div></div>
<div class="viewcode-block" id="ClassName"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.ClassName">[docs]</a><span class="k">class</span> <span class="nc">ClassName</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; This very simple descriptor class exists only to get the name</span>
<span class="sd">    of the owner class.  This is used because, for historical reasons,</span>
<span class="sd">    we expect every tool to have a ``name`` attribute that is in</span>
<span class="sd">    almost all cases the same as the ``__class__.__name__`` attribute</span>
<span class="sd">    of the plugin object.  This makes that more dynamic so that each</span>
<span class="sd">    plugin isn&#39;t repeating its own name.&quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inst</span><span class="p">,</span> <span class="n">owner</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">owner</span><span class="o">.</span><span class="n">__name__</span>

</div>
<div class="viewcode-block" id="Tool"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool">[docs]</a><span class="k">class</span> <span class="nc">Tool</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; The base tool class.  All tools subclass this.</span>

<span class="sd">    .. private-include: _entry_is_complete</span>
<span class="sd">    .. autoattribute:: Bcfg2.Client.Tools.Tool.__execs__</span>
<span class="sd">    .. autoattribute:: Bcfg2.Client.Tools.Tool.__handles__</span>
<span class="sd">    .. autoattribute:: Bcfg2.Client.Tools.Tool.__req__</span>
<span class="sd">    .. autoattribute:: Bcfg2.Client.Tools.Tool.__important__</span>
<span class="sd">    &quot;&quot;&quot;</span>

    <span class="c">#: The name of the tool.  By default this uses</span>
    <span class="c">#: :class:`Bcfg2.Client.Tools.ClassName` to ensure that it is the</span>
    <span class="c">#: same as the name of the class.</span>
    <span class="n">name</span> <span class="o">=</span> <span class="n">ClassName</span><span class="p">()</span>

    <span class="c">#: Full paths to all executables the tool uses.  When the tool is</span>
    <span class="c">#: instantiated it will check to ensure that all of these files</span>
    <span class="c">#: exist and are executable.</span>
    <span class="n">__execs__</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="c">#: A list of 2-tuples of entries handled by this tool.  Each</span>
    <span class="c">#: 2-tuple should contain ``(&lt;tag&gt;, &lt;type&gt;)``, where ``&lt;type&gt;`` is</span>
    <span class="c">#: the ``type`` attribute of the entry.  If this tool handles</span>
    <span class="c">#: entries with no ``type`` attribute, specify None.</span>
    <span class="n">__handles__</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="c">#: A dict that describes the required attributes for entries</span>
    <span class="c">#: handled by this tool.  The keys are the names of tags.  The</span>
    <span class="c">#: values may either be lists of attribute names (if the same</span>
    <span class="c">#: attributes are required by all tags of that name), or dicts</span>
    <span class="c">#: whose keys are the ``type`` attribute and whose values are</span>
    <span class="c">#: lists of attributes required by tags with that ``type``</span>
    <span class="c">#: attribute.  In that case, the ``type`` attribute will also be</span>
    <span class="c">#: required.</span>
    <span class="n">__req__</span> <span class="o">=</span> <span class="p">{}</span>

    <span class="c">#: A list of entry names that will be treated as important and</span>
    <span class="c">#: installed before other entries.</span>
    <span class="n">__important__</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="c">#: This tool is deprecated, and a warning will be produced if it</span>
    <span class="c">#: is used.</span>
    <span class="n">deprecated</span> <span class="o">=</span> <span class="bp">False</span>

    <span class="c">#: This tool is experimental, and a warning will be produced if it</span>
    <span class="c">#: is used.</span>
    <span class="n">experimental</span> <span class="o">=</span> <span class="bp">False</span>

    <span class="c">#: List of other tools (by name) that this tool conflicts with.</span>
    <span class="c">#: If any of the listed tools are loaded, they will be removed at</span>
    <span class="c">#: runtime with a warning.</span>
    <span class="n">conflicts</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">setup</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">        :param logger: Logger that will be used for logging by this tool</span>
<span class="sd">        :type logger: logging.Logger</span>
<span class="sd">        :param setup: The option set Bcfg2 was invoked with</span>
<span class="sd">        :type setup: Bcfg2.Options.OptionParser</span>
<span class="sd">        :param config: The XML configuration for this client</span>
<span class="sd">        :type config: lxml.etree._Element</span>
<span class="sd">        :raises: :exc:`Bcfg2.Client.Tools.ToolInstantiationError`</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="c">#: A :class:`Bcfg2.Options.OptionParser` object describing the</span>
        <span class="c">#: option set Bcfg2 was invoked with</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setup</span> <span class="o">=</span> <span class="n">setup</span>

        <span class="c">#: A :class:`logging.Logger` object that will be used by this</span>
        <span class="c">#: tool for logging</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span>

        <span class="c">#: The XML configuration for this client</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="n">config</span>

        <span class="c">#: An :class:`Bcfg2.Client.Tools.Executor` object for</span>
        <span class="c">#: running external commands.</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">cmd</span> <span class="o">=</span> <span class="n">Executor</span><span class="p">(</span><span class="n">logger</span><span class="p">)</span>

        <span class="c">#: A list of entries that have been modified by this tool</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">modified</span> <span class="o">=</span> <span class="p">[]</span>

        <span class="c">#: A list of extra entries that are not listed in the</span>
        <span class="c">#: configuration</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">extra</span> <span class="o">=</span> <span class="p">[]</span>

        <span class="c">#: A list of all entries handled by this tool</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">handled</span> <span class="o">=</span> <span class="p">[]</span>

        <span class="bp">self</span><span class="o">.</span><span class="n">_analyze_config</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">_check_execs</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">_analyze_config</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Analyze the config at tool initialization-time for</span>
<span class="sd">        important and handled entries &quot;&quot;&quot;</span>
        <span class="k">for</span> <span class="n">struct</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">struct</span><span class="p">:</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;Path&#39;</span> <span class="ow">and</span>
                    <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;important&#39;</span><span class="p">,</span> <span class="s">&#39;false&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s">&#39;true&#39;</span><span class="p">):</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">__important__</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">))</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">handled</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getSupportedEntries</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">_check_execs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Check all executables used by this tool to ensure that</span>
<span class="sd">        they exist and are executable &quot;&quot;&quot;</span>
        <span class="k">for</span> <span class="n">filename</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__execs__</span><span class="p">:</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">mode</span> <span class="o">=</span> <span class="n">stat</span><span class="o">.</span><span class="n">S_IMODE</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">stat</span><span class="p">(</span><span class="n">filename</span><span class="p">)[</span><span class="n">stat</span><span class="o">.</span><span class="n">ST_MODE</span><span class="p">])</span>
            <span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
                <span class="k">raise</span> <span class="n">ToolInstantiationError</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()[</span><span class="mi">1</span><span class="p">])</span>
            <span class="k">except</span><span class="p">:</span>
                <span class="k">raise</span> <span class="n">ToolInstantiationError</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">: Failed to stat </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span>
                                             <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">filename</span><span class="p">))</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">mode</span> <span class="o">&amp;</span> <span class="n">stat</span><span class="o">.</span><span class="n">S_IEXEC</span><span class="p">:</span>
                <span class="k">raise</span> <span class="n">ToolInstantiationError</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s"> not executable&quot;</span> <span class="o">%</span>
                                             <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">filename</span><span class="p">))</span>


<div class="viewcode-block" id="Tool.BundleUpdated"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.BundleUpdated">[docs]</a>    <span class="k">def</span> <span class="nf">BundleUpdated</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bundle</span><span class="p">,</span> <span class="n">states</span><span class="p">):</span>  <span class="c"># pylint: disable=W0613</span>
        <span class="sd">&quot;&quot;&quot; Callback that is invoked when a bundle has been updated.</span>

<span class="sd">        :param bundle: The bundle that has been updated</span>
<span class="sd">        :type bundle: lxml.etree._Element</span>
<span class="sd">        :param states: The :attr:`Bcfg2.Client.Frame.Frame.states` dict</span>
<span class="sd">        :type states: dict</span>
<span class="sd">        :returns: None &quot;&quot;&quot;</span>
        <span class="k">return</span>
</div>
<div class="viewcode-block" id="Tool.BundleNotUpdated"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.BundleNotUpdated">[docs]</a>    <span class="k">def</span> <span class="nf">BundleNotUpdated</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bundle</span><span class="p">,</span> <span class="n">states</span><span class="p">):</span>  <span class="c"># pylint: disable=W0613</span>
        <span class="sd">&quot;&quot;&quot; Callback that is invoked when a bundle has been updated.</span>

<span class="sd">        :param bundle: The bundle that has been updated</span>
<span class="sd">        :type bundle: lxml.etree._Element</span>
<span class="sd">        :param states: The :attr:`Bcfg2.Client.Frame.Frame.states` dict</span>
<span class="sd">        :type states: dict</span>
<span class="sd">        :returns: None &quot;&quot;&quot;</span>
        <span class="k">return</span>
</div>
<div class="viewcode-block" id="Tool.Inventory"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.Inventory">[docs]</a>    <span class="k">def</span> <span class="nf">Inventory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">states</span><span class="p">,</span> <span class="n">structures</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Take an inventory of the system as it exists.  This</span>
<span class="sd">        involves two steps:</span>

<span class="sd">        * Call the appropriate entry-specific Verify method for each</span>
<span class="sd">          entry this tool verifies;</span>
<span class="sd">        * Call :func:`Bcfg2.Client.Tools.Tool.FindExtra` to populate</span>
<span class="sd">          :attr:`Bcfg2.Client.Tools.Tool.extra` with extra entries.</span>

<span class="sd">        This implementation of</span>
<span class="sd">        :func:`Bcfg2.Client.Tools.Tool.Inventory` calls a</span>
<span class="sd">        ``Verify&lt;tag&gt;`` method to verify each entry, where ``&lt;tag&gt;``</span>
<span class="sd">        is the entry tag.  E.g., a Path entry would be verified by</span>
<span class="sd">        calling :func:`VerifyPath`.</span>

<span class="sd">        :param states: The :attr:`Bcfg2.Client.Frame.Frame.states` dict</span>
<span class="sd">        :type states: dict</span>
<span class="sd">        :param structures: The list of structures (i.e., bundles) to</span>
<span class="sd">                           get entries from.  If this is not given,</span>
<span class="sd">                           all children of</span>
<span class="sd">                           :attr:`Bcfg2.Client.Tools.Tool.config` will</span>
<span class="sd">                           be used.</span>
<span class="sd">        :type structures: list of lxml.etree._Element</span>
<span class="sd">        :returns: None &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">structures</span><span class="p">:</span>
            <span class="n">structures</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">getchildren</span><span class="p">()</span>
        <span class="n">mods</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">buildModlist</span><span class="p">()</span>
        <span class="k">for</span> <span class="n">struct</span> <span class="ow">in</span> <span class="n">structures</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">struct</span><span class="o">.</span><span class="n">getchildren</span><span class="p">():</span>
                <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">canVerify</span><span class="p">(</span><span class="n">entry</span><span class="p">):</span>
                    <span class="k">try</span><span class="p">:</span>
                        <span class="n">func</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&quot;Verify</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">entry</span><span class="o">.</span><span class="n">tag</span><span class="p">)</span>
                    <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
                        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">: Cannot verify </span><span class="si">%s</span><span class="s"> entries&quot;</span> <span class="o">%</span>
                                          <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">entry</span><span class="o">.</span><span class="n">tag</span><span class="p">))</span>
                        <span class="k">continue</span>
                    <span class="k">try</span><span class="p">:</span>
                        <span class="n">states</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="n">mods</span><span class="p">)</span>
                    <span class="k">except</span><span class="p">:</span>  <span class="c"># pylint: disable=W0702</span>
                        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">: Unexpected failure verifying </span><span class="si">%s</span><span class="s">&quot;</span>
                                          <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
                                             <span class="bp">self</span><span class="o">.</span><span class="n">primarykey</span><span class="p">(</span><span class="n">entry</span><span class="p">)),</span>
                                          <span class="n">exc_info</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">extra</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">FindExtra</span><span class="p">()</span>
</div>
<div class="viewcode-block" id="Tool.Install"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.Install">[docs]</a>    <span class="k">def</span> <span class="nf">Install</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entries</span><span class="p">,</span> <span class="n">states</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Install entries.  &#39;Install&#39; in this sense means either</span>
<span class="sd">        initially install, or update as necessary to match the</span>
<span class="sd">        specification.</span>

<span class="sd">        This implementation of :func:`Bcfg2.Client.Tools.Tool.Install`</span>
<span class="sd">        calls a ``Install&lt;tag&gt;`` method to install each entry, where</span>
<span class="sd">        ``&lt;tag&gt;`` is the entry tag.  E.g., a Path entry would be</span>
<span class="sd">        installed by calling :func:`InstallPath`.</span>

<span class="sd">        :param entries: The entries to install</span>
<span class="sd">        :type entries: list of lxml.etree._Element</span>
<span class="sd">        :param states: The :attr:`Bcfg2.Client.Frame.Frame.states` dict</span>
<span class="sd">        :type states: dict</span>
<span class="sd">        :returns: None &quot;&quot;&quot;</span>
        <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">entries</span><span class="p">:</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">func</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&quot;Install</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">entry</span><span class="o">.</span><span class="n">tag</span><span class="p">)</span>
            <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">: Cannot install </span><span class="si">%s</span><span class="s"> entries&quot;</span> <span class="o">%</span>
                                  <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">entry</span><span class="o">.</span><span class="n">tag</span><span class="p">))</span>
                <span class="k">continue</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">states</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
                <span class="k">if</span> <span class="n">states</span><span class="p">[</span><span class="n">entry</span><span class="p">]:</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">modified</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
            <span class="k">except</span><span class="p">:</span>  <span class="c"># pylint: disable=W0702</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">: Unexpected failure installing </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span>
                                  <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">primarykey</span><span class="p">(</span><span class="n">entry</span><span class="p">)),</span>
                                  <span class="n">exc_info</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Tool.Remove"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.Remove">[docs]</a>    <span class="k">def</span> <span class="nf">Remove</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entries</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Remove specified extra entries.</span>

<span class="sd">        :param entries: The entries to remove</span>
<span class="sd">        :type entries: list of lxml.etree._Element</span>
<span class="sd">        :returns: None &quot;&quot;&quot;</span>
        <span class="k">pass</span>
</div>
<div class="viewcode-block" id="Tool.getSupportedEntries"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.getSupportedEntries">[docs]</a>    <span class="k">def</span> <span class="nf">getSupportedEntries</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Get all entries that are handled by this tool.</span>

<span class="sd">        :returns: list of lxml.etree._Element &quot;&quot;&quot;</span>
        <span class="n">rv</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">struct</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">getchildren</span><span class="p">():</span>
            <span class="n">rv</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">entry</span> <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">struct</span><span class="o">.</span><span class="n">getchildren</span><span class="p">()</span>
                       <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">handlesEntry</span><span class="p">(</span><span class="n">entry</span><span class="p">)])</span>
        <span class="k">return</span> <span class="n">rv</span>
</div>
<div class="viewcode-block" id="Tool.handlesEntry"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.handlesEntry">[docs]</a>    <span class="k">def</span> <span class="nf">handlesEntry</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Return True if the entry is handled by this tool.</span>

<span class="sd">        :param entry: Determine if this entry is handled.</span>
<span class="sd">        :type entry: lxml.etree._Element</span>
<span class="sd">        :returns: bool</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">tag</span><span class="p">,</span> <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;type&#39;</span><span class="p">))</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__handles__</span>
</div>
<div class="viewcode-block" id="Tool.buildModlist"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.buildModlist">[docs]</a>    <span class="k">def</span> <span class="nf">buildModlist</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Build a list of all Path entries in the configuration.</span>
<span class="sd">        (This can be used to determine which paths might be modified</span>
<span class="sd">        from their original state, useful for verifying packages)</span>

<span class="sd">        :returns: list of lxml.etree._Element &quot;&quot;&quot;</span>
        <span class="n">rv</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">struct</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">getchildren</span><span class="p">():</span>
            <span class="n">rv</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">struct</span><span class="o">.</span><span class="n">getchildren</span><span class="p">()</span>
                       <span class="k">if</span> <span class="n">entry</span><span class="o">.</span><span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;Path&#39;</span><span class="p">])</span>
        <span class="k">return</span> <span class="n">rv</span>
</div>
<div class="viewcode-block" id="Tool.missing_attrs"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.missing_attrs">[docs]</a>    <span class="k">def</span> <span class="nf">missing_attrs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Return a list of attributes that were expected on an entry</span>
<span class="sd">        (from :attr:`Bcfg2.Client.Tools.Tool.__req__`), but not found.</span>

<span class="sd">        :param entry: The entry to find missing attributes on</span>
<span class="sd">        :type entry: lxml.etree._Element</span>
<span class="sd">        :returns: list of strings &quot;&quot;&quot;</span>
        <span class="n">required</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__req__</span><span class="p">[</span><span class="n">entry</span><span class="o">.</span><span class="n">tag</span><span class="p">]</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">required</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
            <span class="n">required</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;type&quot;</span><span class="p">]</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="n">required</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__req__</span><span class="p">[</span><span class="n">entry</span><span class="o">.</span><span class="n">tag</span><span class="p">][</span><span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;type&quot;</span><span class="p">)])</span>
            <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
                <span class="k">pass</span>

        <span class="k">return</span> <span class="p">[</span><span class="n">attr</span> <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">required</span>
                <span class="k">if</span> <span class="n">attr</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">entry</span><span class="o">.</span><span class="n">attrib</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">entry</span><span class="o">.</span><span class="n">attrib</span><span class="p">[</span><span class="n">attr</span><span class="p">]]</span>
</div>
<div class="viewcode-block" id="Tool.canVerify"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.canVerify">[docs]</a>    <span class="k">def</span> <span class="nf">canVerify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Test if entry can be verified by calling</span>
<span class="sd">        :func:`Bcfg2.Client.Tools.Tool._entry_is_complete`.</span>

<span class="sd">        :param entry: The entry to evaluate</span>
<span class="sd">        :type entry: lxml.etree._Element</span>
<span class="sd">        :returns: bool - True if the entry can be verified, False</span>
<span class="sd">                  otherwise.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entry_is_complete</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;verify&quot;</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Tool.FindExtra"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.FindExtra">[docs]</a>    <span class="k">def</span> <span class="nf">FindExtra</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Return a list of extra entries, i.e., entries that exist</span>
<span class="sd">        on the client but are not in the configuration.</span>

<span class="sd">        :returns: list of lxml.etree._Element &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="p">[]</span>
</div>
<div class="viewcode-block" id="Tool.primarykey"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.primarykey">[docs]</a>    <span class="k">def</span> <span class="nf">primarykey</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Return a string that describes the entry uniquely amongst</span>
<span class="sd">        all entries in the configuration.</span>

<span class="sd">        :param entry: The entry to describe</span>
<span class="sd">        :type entry: lxml.etree._Element</span>
<span class="sd">        :returns: string &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">:</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">tag</span><span class="p">,</span> <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;name&quot;</span><span class="p">))</span>
</div>
<div class="viewcode-block" id="Tool.canInstall"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool.canInstall">[docs]</a>    <span class="k">def</span> <span class="nf">canInstall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Test if entry can be installed by calling</span>
<span class="sd">        :func:`Bcfg2.Client.Tools.Tool._entry_is_complete`.</span>

<span class="sd">        :param entry: The entry to evaluate</span>
<span class="sd">        :type entry: lxml.etree._Element</span>
<span class="sd">        :returns: bool - True if the entry can be installed, False</span>
<span class="sd">                  otherwise.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entry_is_complete</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">&quot;install&quot;</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="Tool._entry_is_complete"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.Tool._entry_is_complete">[docs]</a>    <span class="k">def</span> <span class="nf">_entry_is_complete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Test if the entry is complete.  This involves three</span>
<span class="sd">        things:</span>

<span class="sd">        * The entry is handled by this tool (as reported by</span>
<span class="sd">          :func:`Bcfg2.Client.Tools.Tool.handlesEntry`;</span>
<span class="sd">        * The entry does not report a bind failure;</span>
<span class="sd">        * The entry is not missing any attributes (as reported by</span>
<span class="sd">          :func:`Bcfg2.Client.Tools.Tool.missing_attrs`).</span>

<span class="sd">        :param entry: The entry to evaluate</span>
<span class="sd">        :type entry: lxml.etree._Element</span>
<span class="sd">        :param action: The action being performed on the entry (e.g.,</span>
<span class="sd">                      &quot;install&quot;, &quot;verify&quot;).  This is used to produce</span>
<span class="sd">                      error messages; if not provided, generic error</span>
<span class="sd">                      messages will be used.</span>
<span class="sd">        :type action: string</span>
<span class="sd">        :returns: bool - True if the entry can be verified, False</span>
<span class="sd">                  otherwise.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">handlesEntry</span><span class="p">(</span><span class="n">entry</span><span class="p">):</span>
            <span class="k">return</span> <span class="bp">False</span>

        <span class="k">if</span> <span class="s">&#39;failure&#39;</span> <span class="ow">in</span> <span class="n">entry</span><span class="o">.</span><span class="n">attrib</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">action</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s"> reports bind failure&quot;</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%%</span><span class="s">s: Cannot </span><span class="si">%s</span><span class="s"> entry </span><span class="si">%%</span><span class="s">s with bind failure&quot;</span> <span class="o">%</span> <span class="n">action</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">primarykey</span><span class="p">(</span><span class="n">entry</span><span class="p">)))</span>
            <span class="k">return</span> <span class="bp">False</span>

        <span class="n">missing</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">missing_attrs</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">missing</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">action</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">desc</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> is&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">primarykey</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">desc</span> <span class="o">=</span> <span class="s">&quot;Cannot </span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s"> due to&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">primarykey</span><span class="p">(</span><span class="n">entry</span><span class="p">))</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s"> missing required attribute(s): </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span>
                              <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">desc</span><span class="p">,</span> <span class="s">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">missing</span><span class="p">)))</span>
            <span class="k">return</span> <span class="bp">False</span>
        <span class="k">return</span> <span class="bp">True</span>

</div></div>
<div class="viewcode-block" id="PkgTool"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.PkgTool">[docs]</a><span class="k">class</span> <span class="nc">PkgTool</span><span class="p">(</span><span class="n">Tool</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; PkgTool provides a one-pass install with fallback for use with</span>
<span class="sd">    packaging systems.  PkgTool makes a number of assumptions that may</span>
<span class="sd">    need to be overridden by a subclass.  For instance, it assumes</span>
<span class="sd">    that packages are installed by a shell command; that only one</span>
<span class="sd">    version of a given package can be installed; etc.  Nonetheless, it</span>
<span class="sd">    offers a strong base for writing simple package tools. &quot;&quot;&quot;</span>

    <span class="c">#: A tuple describing the format of the command to run to install</span>
    <span class="c">#: a single package.  The first element of the tuple is a string</span>
    <span class="c">#: giving the format of the command, with a single &#39;%s&#39; for the</span>
    <span class="c">#: name of the package or packages to be installed.  The second</span>
    <span class="c">#: element is a tuple whose first element is the format of the</span>
    <span class="c">#: name of the package, and whose second element is a list whose</span>
    <span class="c">#: members are the names of attributes that will be used when</span>
    <span class="c">#: formatting the package name format string.</span>
    <span class="n">pkgtool</span> <span class="o">=</span> <span class="p">(</span><span class="s">&#39;echo </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s">&#39;name&#39;</span><span class="p">]))</span>

    <span class="c">#: The ``type`` attribute of Packages handled by this tool.</span>
    <span class="n">pkgtype</span> <span class="o">=</span> <span class="s">&#39;echo&#39;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">setup</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
        <span class="n">Tool</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">setup</span><span class="p">,</span> <span class="n">config</span><span class="p">)</span>

        <span class="c">#: A dict of installed packages; the keys should be package</span>
        <span class="c">#: names and the values should be simple strings giving the</span>
        <span class="c">#: installed version.</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">installed</span> <span class="o">=</span> <span class="p">{}</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">RefreshPackages</span><span class="p">()</span>

<div class="viewcode-block" id="PkgTool.VerifyPackage"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.PkgTool.VerifyPackage">[docs]</a>    <span class="k">def</span> <span class="nf">VerifyPackage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="n">modlist</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Verify the given Package entry.</span>

<span class="sd">        :param entry: The Package entry to verify</span>
<span class="sd">        :type entry: lxml.etree._Element</span>
<span class="sd">        :param modlist: A list of all Path entries in the</span>
<span class="sd">                        configuration, which may be considered when</span>
<span class="sd">                        verifying a package.  For instance, a package</span>
<span class="sd">                        should verify successfully if paths in</span>
<span class="sd">                        ``modlist`` have been modified outside the</span>
<span class="sd">                        package.</span>
<span class="sd">        :type modlist: list of strings</span>
<span class="sd">        :returns: bool - True if the package verifies, false otherwise.</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">raise</span> <span class="ne">NotImplementedError</span>
</div>
    <span class="k">def</span> <span class="nf">_get_package_command</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">packages</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Get the command to install the given list of packages.</span>

<span class="sd">        :param packages: The Package entries to install</span>
<span class="sd">        :type packages: list of lxml.etree._Element</span>
<span class="sd">        :returns: string - the command to run</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="n">pkgargs</span> <span class="o">=</span> <span class="s">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkgtool</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">%</span>
                           <span class="nb">tuple</span><span class="p">(</span><span class="n">pkg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
                                 <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkgtool</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span>
                           <span class="k">for</span> <span class="n">pkg</span> <span class="ow">in</span> <span class="n">packages</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkgtool</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">%</span> <span class="n">pkgargs</span>

<div class="viewcode-block" id="PkgTool.Install"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.PkgTool.Install">[docs]</a>    <span class="k">def</span> <span class="nf">Install</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">packages</span><span class="p">,</span> <span class="n">states</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Run a one-pass install where all required packages are</span>
<span class="sd">        installed with a single command, followed by single package</span>
<span class="sd">        installs in case of failure.</span>

<span class="sd">        :param entries: The entries to install</span>
<span class="sd">        :type entries: list of lxml.etree._Element</span>
<span class="sd">        :param states: The :attr:`Bcfg2.Client.Frame.Frame.states` dict</span>
<span class="sd">        :type states: dict</span>
<span class="sd">        :returns: None &quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Trying single pass package install for pkgtype </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span>
                         <span class="bp">self</span><span class="o">.</span><span class="n">pkgtype</span><span class="p">)</span>

        <span class="n">pkgcmd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_package_command</span><span class="p">(</span><span class="n">packages</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Running command: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">pkgcmd</span><span class="p">)</span>

        <span class="n">cmdrc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">pkgcmd</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
        <span class="k">if</span> <span class="n">cmdrc</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Single Pass Succeded&quot;</span><span class="p">)</span>
            <span class="c"># set all package states to true and flush workqueues</span>
            <span class="n">pkgnames</span> <span class="o">=</span> <span class="p">[</span><span class="n">pkg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">pkg</span> <span class="ow">in</span> <span class="n">packages</span><span class="p">]</span>
            <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">states</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">tag</span> <span class="o">==</span> <span class="s">&#39;Package&#39;</span>
                    <span class="ow">and</span> <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;type&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkgtype</span>
                    <span class="ow">and</span> <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">)</span> <span class="ow">in</span> <span class="n">pkgnames</span><span class="p">):</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Setting state to true for pkg </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span>
                                      <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">))</span>
                    <span class="n">states</span><span class="p">[</span><span class="n">entry</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">RefreshPackages</span><span class="p">()</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;Single Pass Failed&quot;</span><span class="p">)</span>
            <span class="c"># do single pass installs</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">RefreshPackages</span><span class="p">()</span>
            <span class="k">for</span> <span class="n">pkg</span> <span class="ow">in</span> <span class="n">packages</span><span class="p">:</span>
                <span class="c"># handle state tracking updates</span>
                <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">VerifyPackage</span><span class="p">(</span><span class="n">pkg</span><span class="p">,</span> <span class="p">[]):</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Forcing state to true for pkg </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span>
                                     <span class="p">(</span><span class="n">pkg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">)))</span>
                    <span class="n">states</span><span class="p">[</span><span class="n">pkg</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Installing pkg </span><span class="si">%s</span><span class="s"> version </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span>
                                     <span class="p">(</span><span class="n">pkg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">),</span> <span class="n">pkg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;version&#39;</span><span class="p">)))</span>
                    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_package_command</span><span class="p">([</span><span class="n">pkg</span><span class="p">]))[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
                        <span class="n">states</span><span class="p">[</span><span class="n">pkg</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
                    <span class="k">else</span><span class="p">:</span>
                        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;Failed to install package </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span>
                                          <span class="n">pkg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">))</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">RefreshPackages</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">modified</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">entry</span> <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">packages</span> <span class="k">if</span> <span class="n">states</span><span class="p">[</span><span class="n">entry</span><span class="p">])</span>
</div>
<div class="viewcode-block" id="PkgTool.RefreshPackages"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.PkgTool.RefreshPackages">[docs]</a>    <span class="k">def</span> <span class="nf">RefreshPackages</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Refresh the internal representation of the package</span>
<span class="sd">        database (:attr:`Bcfg2.Client.Tools.PkgTool.installed`).</span>

<span class="sd">        :returns: None&quot;&quot;&quot;</span>
        <span class="k">raise</span> <span class="ne">NotImplementedError</span>
</div>
<div class="viewcode-block" id="PkgTool.FindExtra"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.PkgTool.FindExtra">[docs]</a>    <span class="k">def</span> <span class="nf">FindExtra</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">packages</span> <span class="o">=</span> <span class="p">[</span><span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">getSupportedEntries</span><span class="p">()]</span>
        <span class="n">extras</span> <span class="o">=</span> <span class="p">[</span><span class="n">data</span> <span class="k">for</span> <span class="n">data</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">installed</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
                  <span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">packages</span><span class="p">]</span>
        <span class="k">return</span> <span class="p">[</span><span class="n">Bcfg2</span><span class="o">.</span><span class="n">Client</span><span class="o">.</span><span class="n">XML</span><span class="o">.</span><span class="n">Element</span><span class="p">(</span><span class="s">&#39;Package&#39;</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
                                         <span class="nb">type</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">pkgtype</span><span class="p">,</span> <span class="n">version</span><span class="o">=</span><span class="n">version</span><span class="p">)</span>
                <span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">version</span><span class="p">)</span> <span class="ow">in</span> <span class="n">extras</span><span class="p">]</span></div>
    <span class="n">FindExtra</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="n">Tool</span><span class="o">.</span><span class="n">FindExtra</span><span class="o">.</span><span class="n">__doc__</span>

</div>
<div class="viewcode-block" id="SvcTool"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.SvcTool">[docs]</a><span class="k">class</span> <span class="nc">SvcTool</span><span class="p">(</span><span class="n">Tool</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot; Base class for tools that handle Service entries &quot;&quot;&quot;</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">setup</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
        <span class="n">Tool</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">setup</span><span class="p">,</span> <span class="n">config</span><span class="p">)</span>
        <span class="c">#: List of services that have been restarted</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">restarted</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">__init__</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="n">Tool</span><span class="o">.</span><span class="n">__init__</span><span class="o">.</span><span class="n">__doc__</span>

<div class="viewcode-block" id="SvcTool.get_svc_command"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.SvcTool.get_svc_command">[docs]</a>    <span class="k">def</span> <span class="nf">get_svc_command</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Return a command that can be run to start or stop a service.</span>

<span class="sd">        :param service: The service entry to modify</span>
<span class="sd">        :type service: lxml.etree._Element</span>
<span class="sd">        :param action: The action to take (e.g., &quot;stop&quot;, &quot;start&quot;)</span>
<span class="sd">        :type action: string</span>
<span class="sd">        :returns: string - The command to run</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="s">&#39;/etc/init.d/</span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">service</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">),</span> <span class="n">action</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="SvcTool.start_service"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.SvcTool.start_service">[docs]</a>    <span class="k">def</span> <span class="nf">start_service</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Start a service.</span>

<span class="sd">        :param service: The service entry to modify</span>
<span class="sd">        :type service: lxml.etree._Element</span>
<span class="sd">        :returns: tuple - The return value from</span>
<span class="sd">                  :class:`Bcfg2.Client.Tools.Executor.run`</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Starting service </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">service</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">))</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_svc_command</span><span class="p">(</span><span class="n">service</span><span class="p">,</span> <span class="s">&#39;start&#39;</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
</div>
<div class="viewcode-block" id="SvcTool.stop_service"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.SvcTool.stop_service">[docs]</a>    <span class="k">def</span> <span class="nf">stop_service</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Stop a service.</span>

<span class="sd">        :param service: The service entry to modify</span>
<span class="sd">        :type service: lxml.etree._Element</span>
<span class="sd">        :returns: tuple - The return value from</span>
<span class="sd">                  :class:`Bcfg2.Client.Tools.Executor.run`</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Stopping service </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">service</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">))</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_svc_command</span><span class="p">(</span><span class="n">service</span><span class="p">,</span> <span class="s">&#39;stop&#39;</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
</div>
<div class="viewcode-block" id="SvcTool.restart_service"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.SvcTool.restart_service">[docs]</a>    <span class="k">def</span> <span class="nf">restart_service</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Restart a service.</span>

<span class="sd">        :param service: The service entry to modify</span>
<span class="sd">        :type service: lxml.etree._Element</span>
<span class="sd">        :returns: tuple - The return value from</span>
<span class="sd">                  :class:`Bcfg2.Client.Tools.Executor.run`</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;Restarting service </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">service</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">))</span>
        <span class="n">restart_target</span> <span class="o">=</span> <span class="n">service</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;target&#39;</span><span class="p">,</span> <span class="s">&#39;restart&#39;</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_svc_command</span><span class="p">(</span><span class="n">service</span><span class="p">,</span> <span class="n">restart_target</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
</div>
<div class="viewcode-block" id="SvcTool.check_service"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.SvcTool.check_service">[docs]</a>    <span class="k">def</span> <span class="nf">check_service</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Check the status a service.</span>

<span class="sd">        :param service: The service entry to modify</span>
<span class="sd">        :type service: lxml.etree._Element</span>
<span class="sd">        :returns: bool - True if the status command returned 0, False</span>
<span class="sd">                  otherwise</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmd</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_svc_command</span><span class="p">(</span><span class="n">service</span><span class="p">,</span> <span class="s">&#39;status&#39;</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span>
</div>
<div class="viewcode-block" id="SvcTool.Remove"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.SvcTool.Remove">[docs]</a>    <span class="k">def</span> <span class="nf">Remove</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">services</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">setup</span><span class="p">[</span><span class="s">&#39;servicemode&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;disabled&#39;</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">services</span><span class="p">:</span>
                <span class="n">entry</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s">&quot;status&quot;</span><span class="p">,</span> <span class="s">&quot;off&quot;</span><span class="p">)</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">InstallService</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span></div>
    <span class="n">Remove</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="n">Tool</span><span class="o">.</span><span class="n">Remove</span><span class="o">.</span><span class="n">__doc__</span>

<div class="viewcode-block" id="SvcTool.BundleUpdated"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.SvcTool.BundleUpdated">[docs]</a>    <span class="k">def</span> <span class="nf">BundleUpdated</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bundle</span><span class="p">,</span> <span class="n">states</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">setup</span><span class="p">[</span><span class="s">&#39;servicemode&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;disabled&#39;</span><span class="p">:</span>
            <span class="k">return</span>

        <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">bundle</span><span class="p">:</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">handlesEntry</span><span class="p">(</span><span class="n">entry</span><span class="p">):</span>
                <span class="k">continue</span>

            <span class="n">restart</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;restart&quot;</span><span class="p">,</span> <span class="s">&quot;true&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">restart</span> <span class="o">==</span> <span class="s">&quot;false&quot;</span> <span class="ow">or</span>
                <span class="p">(</span><span class="n">restart</span> <span class="o">==</span> <span class="s">&quot;interactive&quot;</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">setup</span><span class="p">[</span><span class="s">&#39;interactive&#39;</span><span class="p">])):</span>
                <span class="k">continue</span>

            <span class="n">rv</span> <span class="o">=</span> <span class="bp">None</span>
            <span class="k">if</span> <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;status&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="s">&#39;on&#39;</span><span class="p">:</span>
                <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">setup</span><span class="p">[</span><span class="s">&#39;servicemode&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;build&#39;</span><span class="p">:</span>
                    <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stop_service</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
                <span class="k">elif</span> <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">restarted</span><span class="p">:</span>
                    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">setup</span><span class="p">[</span><span class="s">&#39;interactive&#39;</span><span class="p">]:</span>
                        <span class="k">if</span> <span class="ow">not</span> <span class="n">Bcfg2</span><span class="o">.</span><span class="n">Client</span><span class="o">.</span><span class="n">prompt</span><span class="p">(</span><span class="s">&#39;Restart service </span><span class="si">%s</span><span class="s">? (y/N) &#39;</span>
                                                   <span class="o">%</span> <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">)):</span>
                            <span class="k">continue</span>
                    <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">restart_service</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
                    <span class="k">if</span> <span class="ow">not</span> <span class="n">rv</span><span class="p">:</span>
                        <span class="bp">self</span><span class="o">.</span><span class="n">restarted</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">))</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stop_service</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">rv</span><span class="p">:</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;Failed to manipulate service </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span>
                                  <span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">)))</span></div>
    <span class="n">BundleUpdated</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="n">Tool</span><span class="o">.</span><span class="n">BundleUpdated</span><span class="o">.</span><span class="n">__doc__</span>

<div class="viewcode-block" id="SvcTool.Install"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.SvcTool.Install">[docs]</a>    <span class="k">def</span> <span class="nf">Install</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entries</span><span class="p">,</span> <span class="n">states</span><span class="p">):</span>
        <span class="n">install_entries</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">entries</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;install&#39;</span><span class="p">,</span> <span class="s">&#39;true&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s">&#39;false&#39;</span><span class="p">:</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Installation is false for </span><span class="si">%s</span><span class="s">:</span><span class="si">%s</span><span class="s">, skipping&quot;</span> <span class="o">%</span>
                                 <span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">tag</span><span class="p">,</span> <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;name&#39;</span><span class="p">)))</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">install_entries</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">Tool</span><span class="o">.</span><span class="n">Install</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">install_entries</span><span class="p">,</span> <span class="n">states</span><span class="p">)</span></div>
    <span class="n">Install</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> <span class="n">Tool</span><span class="o">.</span><span class="n">Install</span><span class="o">.</span><span class="n">__doc__</span>

<div class="viewcode-block" id="SvcTool.InstallService"><a class="viewcode-back" href="../../../development/client-driver.html#Bcfg2.Client.Tools.SvcTool.InstallService">[docs]</a>    <span class="k">def</span> <span class="nf">InstallService</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot; Install a single service entry.  See</span>
<span class="sd">        :func:`Bcfg2.Client.Tools.Tool.Install`.</span>

<span class="sd">        :param entry: The Service entry to install</span>
<span class="sd">        :type entry: lxml.etree._Element</span>
<span class="sd">        :returns: bool - True if installation was successful, False</span>
<span class="sd">                  otherwise</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="k">raise</span> <span class="ne">NotImplementedError</span></div></div>
</pre></div>

          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
  <h3>Quick search</h3>
    <form class="search" action="../../../search.html" method="get">
      <input type="text" name="q" />
      <input type="submit" value="Go" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    Enter search terms or a module, class or function name.
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../../../genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="../../../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
	<li><a href="../../../index.html">home</a> |&nbsp;</li>
	<!--<li><a href="../../../search.html">search</a> |&nbsp;</li>-->
	<li><a href="../../../help/index.html">help</a> |&nbsp;</li>
	<li><a href="../../../contents.html">documentation </a> &raquo;</li>

          <li><a href="../../index.html" >Module code</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
        &copy; Copyright 2009-2013, Narayan Desai.
      Last updated on Mar 20, 2013.
      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
    </div>
  </body>
</html>