<!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 — 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> | </li> <!--<li><a href="../../../search.html">search</a> | </li>--> <li><a href="../../../help/index.html">help</a> | </li> <li><a href="../../../contents.html">documentation </a> »</li> <li><a href="../../index.html" accesskey="U">Module code</a> »</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">"""This contains all Bcfg2 Tool modules"""</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">'rpmtools'</span><span class="p">]]</span> <span class="c">#: The default set of tools that will be used if "drivers" 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">""" This error is raised if the toolset cannot be instantiated. """</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">""" This class runs shell commands. """</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">"""</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"> """</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">""" 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"> """</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">"Running: </span><span class="si">%s</span><span class="s">"</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">'< </span><span class="si">%s</span><span class="s">'</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">""" 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't repeating its own name."""</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">""" 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"> """</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 ``(<tag>, <type>)``, where ``<type>`` 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">"""</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"> """</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">""" Analyze the config at tool initialization-time for</span> <span class="sd"> important and handled entries """</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">'Path'</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">'important'</span><span class="p">,</span> <span class="s">'false'</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">'true'</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">'name'</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">""" Check all executables used by this tool to ensure that</span> <span class="sd"> they exist and are executable """</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">"</span><span class="si">%s</span><span class="s">: Failed to stat </span><span class="si">%s</span><span class="s">"</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">&</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">"</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s"> not executable"</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">""" 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 """</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">""" 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 """</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">""" 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<tag>`` method to verify each entry, where ``<tag>``</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 """</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">"Verify</span><span class="si">%s</span><span class="s">"</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">"</span><span class="si">%s</span><span class="s">: Cannot verify </span><span class="si">%s</span><span class="s"> entries"</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">"</span><span class="si">%s</span><span class="s">: Unexpected failure verifying </span><span class="si">%s</span><span class="s">"</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">""" Install entries. 'Install' 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<tag>`` method to install each entry, where</span> <span class="sd"> ``<tag>`` 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 """</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">"Install</span><span class="si">%s</span><span class="s">"</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">"</span><span class="si">%s</span><span class="s">: Cannot install </span><span class="si">%s</span><span class="s"> entries"</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">"</span><span class="si">%s</span><span class="s">: Unexpected failure installing </span><span class="si">%s</span><span class="s">"</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">""" 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 """</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">""" Get all entries that are handled by this tool.</span> <span class="sd"> :returns: list of lxml.etree._Element """</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">""" 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"> """</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">'type'</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">""" 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 """</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">'name'</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">'Path'</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">""" 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 """</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">"type"</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">"type"</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">""" 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"> """</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">"verify"</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">""" 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 """</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">""" 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 """</span> <span class="k">return</span> <span class="s">"</span><span class="si">%s</span><span class="s">:</span><span class="si">%s</span><span class="s">"</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">"name"</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">""" 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"> """</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">"install"</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">""" 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"> "install", "verify"). 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"> """</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">'failure'</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">"</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s"> reports bind failure"</span> <span class="k">else</span><span class="p">:</span> <span class="n">msg</span> <span class="o">=</span> <span class="s">"</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"</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">"</span><span class="si">%s</span><span class="s"> is"</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">"Cannot </span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s"> due to"</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">"</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">"</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">", "</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">""" 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. """</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 '%s' 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">'echo </span><span class="si">%s</span><span class="s">'</span><span class="p">,</span> <span class="p">(</span><span class="s">'</span><span class="si">%s</span><span class="s">'</span><span class="p">,</span> <span class="p">[</span><span class="s">'name'</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">'echo'</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">""" 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"> """</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">""" 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"> """</span> <span class="n">pkgargs</span> <span class="o">=</span> <span class="s">" "</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">""" 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 """</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">"Trying single pass package install for pkgtype </span><span class="si">%s</span><span class="s">"</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">"Running command: </span><span class="si">%s</span><span class="s">"</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">"Single Pass Succeded"</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">'name'</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">'Package'</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">'type'</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">'name'</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">'Setting state to true for pkg </span><span class="si">%s</span><span class="s">'</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">'name'</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">"Single Pass Failed"</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">"Forcing state to true for pkg </span><span class="si">%s</span><span class="s">"</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">'name'</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">"Installing pkg </span><span class="si">%s</span><span class="s"> version </span><span class="si">%s</span><span class="s">"</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">'name'</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">'version'</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">"Failed to install package </span><span class="si">%s</span><span class="s">"</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">'name'</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">""" Refresh the internal representation of the package</span> <span class="sd"> database (:attr:`Bcfg2.Client.Tools.PkgTool.installed`).</span> <span class="sd"> :returns: None"""</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">'name'</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">'Package'</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">""" Base class for tools that handle Service entries """</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">""" 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., "stop", "start")</span> <span class="sd"> :type action: string</span> <span class="sd"> :returns: string - The command to run</span> <span class="sd"> """</span> <span class="k">return</span> <span class="s">'/etc/init.d/</span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">'</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">'name'</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">""" 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"> """</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">'Starting service </span><span class="si">%s</span><span class="s">'</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">'name'</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">'start'</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">""" 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"> """</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">'Stopping service </span><span class="si">%s</span><span class="s">'</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">'name'</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">'stop'</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">""" 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"> """</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">'Restarting service </span><span class="si">%s</span><span class="s">'</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">'name'</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">'target'</span><span class="p">,</span> <span class="s">'restart'</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">""" 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"> """</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">'status'</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">'servicemode'</span><span class="p">]</span> <span class="o">!=</span> <span class="s">'disabled'</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">"status"</span><span class="p">,</span> <span class="s">"off"</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">'servicemode'</span><span class="p">]</span> <span class="o">==</span> <span class="s">'disabled'</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">"restart"</span><span class="p">,</span> <span class="s">"true"</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">"false"</span> <span class="ow">or</span> <span class="p">(</span><span class="n">restart</span> <span class="o">==</span> <span class="s">"interactive"</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">'interactive'</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">'status'</span><span class="p">)</span> <span class="o">==</span> <span class="s">'on'</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">'servicemode'</span><span class="p">]</span> <span class="o">==</span> <span class="s">'build'</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">'name'</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">'interactive'</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">'Restart service </span><span class="si">%s</span><span class="s">? (y/N) '</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">'name'</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">'name'</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">"Failed to manipulate service </span><span class="si">%s</span><span class="s">"</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">'name'</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">'install'</span><span class="p">,</span> <span class="s">'true'</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">'false'</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">"Installation is false for </span><span class="si">%s</span><span class="s">:</span><span class="si">%s</span><span class="s">, skipping"</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">'name'</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">""" 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"> """</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> | </li> <!--<li><a href="../../../search.html">search</a> | </li>--> <li><a href="../../../help/index.html">help</a> | </li> <li><a href="../../../contents.html">documentation </a> »</li> <li><a href="../../index.html" >Module code</a> »</li> </ul> </div> <div class="footer"> © 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>