add sphinx documentation
[nepi.git] / doc / sphinx / _build / html / _modules / nepi / resources / linux / application.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4
5 <html xmlns="http://www.w3.org/1999/xhtml">
6   <head>
7     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8     
9     <title>nepi.resources.linux.application &mdash; NEPI 3.0 documentation</title>
10     
11     <link rel="stylesheet" href="../../../../_static/sphinxdoc.css" type="text/css" />
12     <link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
13     
14     <script type="text/javascript">
15       var DOCUMENTATION_OPTIONS = {
16         URL_ROOT:    '../../../../',
17         VERSION:     '3.0',
18         COLLAPSE_INDEX: false,
19         FILE_SUFFIX: '.html',
20         HAS_SOURCE:  true
21       };
22     </script>
23     <script type="text/javascript" src="../../../../_static/jquery.js"></script>
24     <script type="text/javascript" src="../../../../_static/underscore.js"></script>
25     <script type="text/javascript" src="../../../../_static/doctools.js"></script>
26     <link rel="top" title="NEPI 3.0 documentation" href="../../../../index.html" />
27     <link rel="up" title="Module code" href="../../../index.html" /> 
28   </head>
29   <body>
30     <div class="related">
31       <h3>Navigation</h3>
32       <ul>
33         <li class="right" style="margin-right: 10px">
34           <a href="../../../../genindex.html" title="General Index"
35              accesskey="I">index</a></li>
36         <li class="right" >
37           <a href="../../../../py-modindex.html" title="Python Module Index"
38              >modules</a> |</li>
39         <li><a href="../../../../index.html">NEPI 3.0 documentation</a> &raquo;</li>
40           <li><a href="../../../index.html" accesskey="U">Module code</a> &raquo;</li> 
41       </ul>
42     </div>
43       <div class="sphinxsidebar">
44         <div class="sphinxsidebarwrapper">
45 <div id="searchbox" style="display: none">
46   <h3>Quick search</h3>
47     <form class="search" action="../../../../search.html" method="get">
48       <input type="text" name="q" />
49       <input type="submit" value="Go" />
50       <input type="hidden" name="check_keywords" value="yes" />
51       <input type="hidden" name="area" value="default" />
52     </form>
53     <p class="searchtip" style="font-size: 90%">
54     Enter search terms or a module, class or function name.
55     </p>
56 </div>
57 <script type="text/javascript">$('#searchbox').show(0);</script>
58         </div>
59       </div>
60
61     <div class="document">
62       <div class="documentwrapper">
63         <div class="bodywrapper">
64           <div class="body">
65             
66   <h1>Source code for nepi.resources.linux.application</h1><div class="highlight"><pre>
67 <span class="c">#</span>
68 <span class="c">#    NEPI, a framework to manage network experiments</span>
69 <span class="c">#    Copyright (C) 2013 INRIA</span>
70 <span class="c">#</span>
71 <span class="c">#    This program is free software: you can redistribute it and/or modify</span>
72 <span class="c">#    it under the terms of the GNU General Public License version 2 as</span>
73 <span class="c">#    published by the Free Software Foundation;</span>
74 <span class="c">#</span>
75 <span class="c">#    This program is distributed in the hope that it will be useful,</span>
76 <span class="c">#    but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
77 <span class="c">#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
78 <span class="c">#    GNU General Public License for more details.</span>
79 <span class="c">#</span>
80 <span class="c">#    You should have received a copy of the GNU General Public License</span>
81 <span class="c">#    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
82 <span class="c">#</span>
83 <span class="c"># Author: Alina Quereilhac &lt;alina.quereilhac@inria.fr&gt;</span>
84
85 <span class="kn">from</span> <span class="nn">nepi.execution.attribute</span> <span class="kn">import</span> <span class="n">Attribute</span><span class="p">,</span> <span class="n">Flags</span><span class="p">,</span> <span class="n">Types</span>
86 <span class="kn">from</span> <span class="nn">nepi.execution.trace</span> <span class="kn">import</span> <span class="n">Trace</span><span class="p">,</span> <span class="n">TraceAttr</span>
87 <span class="kn">from</span> <span class="nn">nepi.execution.resource</span> <span class="kn">import</span> <span class="n">ResourceManager</span><span class="p">,</span> <span class="n">clsinit_copy</span><span class="p">,</span> \
88         <span class="n">ResourceState</span>
89 <span class="kn">from</span> <span class="nn">nepi.resources.linux.node</span> <span class="kn">import</span> <span class="n">LinuxNode</span>
90 <span class="kn">from</span> <span class="nn">nepi.util.sshfuncs</span> <span class="kn">import</span> <span class="n">ProcStatus</span>
91 <span class="kn">from</span> <span class="nn">nepi.util.timefuncs</span> <span class="kn">import</span> <span class="n">tnow</span><span class="p">,</span> <span class="n">tdiffsec</span>
92
93 <span class="kn">import</span> <span class="nn">os</span>
94 <span class="kn">import</span> <span class="nn">subprocess</span>
95
96 <span class="c"># TODO: Resolve wildcards in commands!!</span>
97 <span class="c"># TODO: When a failure occurs during deployment, scp and ssh processes are left running behind!!</span>
98
99 <span class="nd">@clsinit_copy</span>
100 <div class="viewcode-block" id="LinuxApplication"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication">[docs]</a><span class="k">class</span> <span class="nc">LinuxApplication</span><span class="p">(</span><span class="n">ResourceManager</span><span class="p">):</span>
101     <span class="sd">&quot;&quot;&quot;</span>
102 <span class="sd">    .. class:: Class Args :</span>
103 <span class="sd">      </span>
104 <span class="sd">        :param ec: The Experiment controller</span>
105 <span class="sd">        :type ec: ExperimentController</span>
106 <span class="sd">        :param guid: guid of the RM</span>
107 <span class="sd">        :type guid: int</span>
108
109 <span class="sd">    .. note::</span>
110
111 <span class="sd">        A LinuxApplication RM represents a process that can be executed in</span>
112 <span class="sd">        a remote Linux host using SSH.</span>
113
114 <span class="sd">        The LinuxApplication RM takes care of uploadin sources and any files</span>
115 <span class="sd">        needed to run the experiment, to the remote host. </span>
116 <span class="sd">        It also allows to provide source compilation (build) and installation </span>
117 <span class="sd">        instructions, and takes care of automating the sources build and </span>
118 <span class="sd">        installation tasks for the user.</span>
119
120 <span class="sd">        It is important to note that files uploaded to the remote host have</span>
121 <span class="sd">        two possible scopes: single-experiment or multi-experiment.</span>
122 <span class="sd">        Single experiment files are those that will not be re-used by other </span>
123 <span class="sd">        experiments. Multi-experiment files are those that will.</span>
124 <span class="sd">        Sources and shared files are always made available to all experiments.</span>
125
126 <span class="sd">        Directory structure:</span>
127
128 <span class="sd">        The directory structure used by LinuxApplication RM at the Linux</span>
129 <span class="sd">        host is the following:</span>
130
131 <span class="sd">        ${HOME}/.nepi/nepi-usr --&gt; Base directory for multi-experiment files</span>
132 <span class="sd">                      |</span>
133 <span class="sd">        ${LIB}        |- /lib --&gt; Base directory for libraries</span>
134 <span class="sd">        ${BIN}        |- /bin --&gt; Base directory for binary files</span>
135 <span class="sd">        ${SRC}        |- /src --&gt; Base directory for sources</span>
136 <span class="sd">        ${SHARE}      |- /share --&gt; Base directory for other files</span>
137
138 <span class="sd">        ${HOME}/.nepi/nepi-exp --&gt; Base directory for single-experiment files</span>
139 <span class="sd">                      |</span>
140 <span class="sd">        ${EXP_HOME}   |- /&lt;exp-id&gt;  --&gt; Base directory for experiment exp-id</span>
141 <span class="sd">                          |</span>
142 <span class="sd">        ${APP_HOME}       |- /&lt;app-guid&gt; --&gt; Base directory for application </span>
143 <span class="sd">                               |     specific files (e.g. command.sh, input)</span>
144 <span class="sd">                               | </span>
145 <span class="sd">        ${RUN_HOME}            |- /&lt;run-id&gt; --&gt; Base directory for run specific</span>
146
147 <span class="sd">    &quot;&quot;&quot;</span>
148
149     <span class="n">_rtype</span> <span class="o">=</span> <span class="s">&quot;linux::Application&quot;</span>
150     <span class="n">_help</span> <span class="o">=</span> <span class="s">&quot;Runs an application on a Linux host with a BASH command &quot;</span>
151     <span class="n">_platform</span> <span class="o">=</span> <span class="s">&quot;linux&quot;</span>
152
153     <span class="nd">@classmethod</span>
154     <span class="k">def</span> <span class="nf">_register_attributes</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
155         <span class="n">command</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;command&quot;</span><span class="p">,</span> <span class="s">&quot;Command to execute at application start. &quot;</span>
156                 <span class="s">&quot;Note that commands will be executed in the ${RUN_HOME} directory, &quot;</span>
157                 <span class="s">&quot;make sure to take this into account when using relative paths. &quot;</span><span class="p">,</span> 
158                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
159         <span class="n">forward_x11</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;forwardX11&quot;</span><span class="p">,</span> <span class="s">&quot;Enables X11 forwarding for SSH connections&quot;</span><span class="p">,</span> 
160                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
161         <span class="n">env</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;env&quot;</span><span class="p">,</span> <span class="s">&quot;Environment variables string for command execution&quot;</span><span class="p">,</span>
162                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
163         <span class="n">sudo</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;sudo&quot;</span><span class="p">,</span> <span class="s">&quot;Run with root privileges&quot;</span><span class="p">,</span> 
164                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
165         <span class="n">depends</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;depends&quot;</span><span class="p">,</span> 
166                 <span class="s">&quot;Space-separated list of packages required to run the application&quot;</span><span class="p">,</span>
167                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
168         <span class="n">sources</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;sources&quot;</span><span class="p">,</span> 
169                 <span class="s">&quot;semi-colon separated list of regular files to be uploaded to ${SRC} &quot;</span>
170                 <span class="s">&quot;directory prior to building. Archives won&#39;t be expanded automatically. &quot;</span>
171                 <span class="s">&quot;Sources are globally available for all experiments unless &quot;</span>
172                 <span class="s">&quot;cleanHome is set to True (This will delete all sources). &quot;</span><span class="p">,</span>
173                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
174         <span class="n">files</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;files&quot;</span><span class="p">,</span> 
175                 <span class="s">&quot;semi-colon separated list of regular miscellaneous files to be uploaded &quot;</span>
176                 <span class="s">&quot;to ${SHARE} directory. &quot;</span>
177                 <span class="s">&quot;Files are globally available for all experiments unless &quot;</span>
178                 <span class="s">&quot;cleanHome is set to True (This will delete all files). &quot;</span><span class="p">,</span>
179                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
180         <span class="n">libs</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;libs&quot;</span><span class="p">,</span> 
181                 <span class="s">&quot;semi-colon separated list of libraries (e.g. .so files) to be uploaded &quot;</span>
182                 <span class="s">&quot;to ${LIB} directory. &quot;</span>
183                 <span class="s">&quot;Libraries are globally available for all experiments unless &quot;</span>
184                 <span class="s">&quot;cleanHome is set to True (This will delete all files). &quot;</span><span class="p">,</span>
185                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
186         <span class="n">bins</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;bins&quot;</span><span class="p">,</span> 
187                 <span class="s">&quot;semi-colon separated list of binary files to be uploaded &quot;</span>
188                 <span class="s">&quot;to ${BIN} directory. &quot;</span>
189                 <span class="s">&quot;Binaries are globally available for all experiments unless &quot;</span>
190                 <span class="s">&quot;cleanHome is set to True (This will delete all files). &quot;</span><span class="p">,</span>
191                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
192         <span class="n">code</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;code&quot;</span><span class="p">,</span> 
193                 <span class="s">&quot;Plain text source code to be uploaded to the ${APP_HOME} directory. &quot;</span><span class="p">,</span>
194                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
195         <span class="n">build</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;build&quot;</span><span class="p">,</span> 
196                 <span class="s">&quot;Build commands to execute after deploying the sources. &quot;</span>
197                 <span class="s">&quot;Sources are uploaded to the ${SRC} directory and code &quot;</span>
198                 <span class="s">&quot;is uploaded to the ${APP_HOME} directory. </span><span class="se">\n</span><span class="s">&quot;</span>
199                 <span class="s">&quot;Usage example: tar xzf ${SRC}/my-app.tgz &amp;&amp; cd my-app &amp;&amp; &quot;</span>
200                 <span class="s">&quot;./configure &amp;&amp; make &amp;&amp; make clean.</span><span class="se">\n</span><span class="s">&quot;</span>
201                 <span class="s">&quot;Make sure to make the build commands return with a nonzero exit &quot;</span>
202                 <span class="s">&quot;code on error.&quot;</span><span class="p">,</span>
203                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
204         <span class="n">install</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;install&quot;</span><span class="p">,</span> 
205                 <span class="s">&quot;Commands to transfer built files to their final destinations. &quot;</span>
206                 <span class="s">&quot;Install commands are executed after build commands. &quot;</span><span class="p">,</span>
207                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
208         <span class="n">stdin</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;stdin&quot;</span><span class="p">,</span> <span class="s">&quot;Standard input for the &#39;command&#39;&quot;</span><span class="p">,</span> 
209                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
210         <span class="n">tear_down</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;tearDown&quot;</span><span class="p">,</span> <span class="s">&quot;Command to be executed just before &quot;</span> 
211                 <span class="s">&quot;releasing the resource&quot;</span><span class="p">,</span> 
212                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
213
214         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
215         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">forward_x11</span><span class="p">)</span>
216         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
217         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">sudo</span><span class="p">)</span>
218         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">depends</span><span class="p">)</span>
219         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
220         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
221         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">files</span><span class="p">)</span>
222         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">bins</span><span class="p">)</span>
223         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">libs</span><span class="p">)</span>
224         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">build</span><span class="p">)</span>
225         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">install</span><span class="p">)</span>
226         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">stdin</span><span class="p">)</span>
227         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">tear_down</span><span class="p">)</span>
228
229     <span class="nd">@classmethod</span>
230     <span class="k">def</span> <span class="nf">_register_traces</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
231         <span class="n">stdout</span> <span class="o">=</span> <span class="n">Trace</span><span class="p">(</span><span class="s">&quot;stdout&quot;</span><span class="p">,</span> <span class="s">&quot;Standard output stream&quot;</span><span class="p">,</span> <span class="n">enabled</span> <span class="o">=</span> <span class="bp">True</span><span class="p">)</span>
232         <span class="n">stderr</span> <span class="o">=</span> <span class="n">Trace</span><span class="p">(</span><span class="s">&quot;stderr&quot;</span><span class="p">,</span> <span class="s">&quot;Standard error stream&quot;</span><span class="p">,</span> <span class="n">enabled</span> <span class="o">=</span> <span class="bp">True</span><span class="p">)</span>
233
234         <span class="n">cls</span><span class="o">.</span><span class="n">_register_trace</span><span class="p">(</span><span class="n">stdout</span><span class="p">)</span>
235         <span class="n">cls</span><span class="o">.</span><span class="n">_register_trace</span><span class="p">(</span><span class="n">stderr</span><span class="p">)</span>
236
237     <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">ec</span><span class="p">,</span> <span class="n">guid</span><span class="p">):</span>
238         <span class="nb">super</span><span class="p">(</span><span class="n">LinuxApplication</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">ec</span><span class="p">,</span> <span class="n">guid</span><span class="p">)</span>
239         <span class="bp">self</span><span class="o">.</span><span class="n">_pid</span> <span class="o">=</span> <span class="bp">None</span>
240         <span class="bp">self</span><span class="o">.</span><span class="n">_ppid</span> <span class="o">=</span> <span class="bp">None</span>
241         <span class="bp">self</span><span class="o">.</span><span class="n">_node</span> <span class="o">=</span> <span class="bp">None</span>
242         <span class="bp">self</span><span class="o">.</span><span class="n">_home</span> <span class="o">=</span> <span class="s">&quot;app-</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">guid</span>
243
244         <span class="c"># whether the command should run in foreground attached</span>
245         <span class="c"># to a terminal</span>
246         <span class="bp">self</span><span class="o">.</span><span class="n">_in_foreground</span> <span class="o">=</span> <span class="bp">False</span>
247
248         <span class="c"># whether to use sudo to kill the application process</span>
249         <span class="bp">self</span><span class="o">.</span><span class="n">_sudo_kill</span> <span class="o">=</span> <span class="bp">False</span>
250
251         <span class="c"># keep a reference to the running process handler when </span>
252         <span class="c"># the command is not executed as remote daemon in background</span>
253         <span class="bp">self</span><span class="o">.</span><span class="n">_proc</span> <span class="o">=</span> <span class="bp">None</span>
254
255         <span class="c"># timestamp of last state check of the application</span>
256         <span class="bp">self</span><span class="o">.</span><span class="n">_last_state_check</span> <span class="o">=</span> <span class="n">tnow</span><span class="p">()</span>
257         
258 <div class="viewcode-block" id="LinuxApplication.log_message"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.log_message">[docs]</a>    <span class="k">def</span> <span class="nf">log_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
259         <span class="k">return</span> <span class="s">&quot; guid </span><span class="si">%d</span><span class="s"> - host </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="bp">self</span><span class="o">.</span><span class="n">guid</span><span class="p">,</span> 
260                 <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;hostname&quot;</span><span class="p">),</span> <span class="n">msg</span><span class="p">)</span>
261 </div>
262     <span class="nd">@property</span>
263 <div class="viewcode-block" id="LinuxApplication.node"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.node">[docs]</a>    <span class="k">def</span> <span class="nf">node</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
264         <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_node</span><span class="p">:</span>
265             <span class="n">node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_connected</span><span class="p">(</span><span class="n">LinuxNode</span><span class="o">.</span><span class="n">get_rtype</span><span class="p">())</span>
266             <span class="k">if</span> <span class="ow">not</span> <span class="n">node</span><span class="p">:</span> 
267                 <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Application </span><span class="si">%s</span><span class="s"> guid </span><span class="si">%d</span><span class="s"> NOT connected to Node&quot;</span> <span class="o">%</span> <span class="p">(</span>
268                         <span class="bp">self</span><span class="o">.</span><span class="n">_rtype</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">guid</span><span class="p">)</span>
269                 <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
270
271             <span class="bp">self</span><span class="o">.</span><span class="n">_node</span> <span class="o">=</span> <span class="n">node</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
272
273         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_node</span>
274 </div>
275     <span class="nd">@property</span>
276 <div class="viewcode-block" id="LinuxApplication.app_home"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.app_home">[docs]</a>    <span class="k">def</span> <span class="nf">app_home</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
277         <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</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">node</span><span class="o">.</span><span class="n">exp_home</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_home</span><span class="p">)</span>
278 </div>
279     <span class="nd">@property</span>
280 <div class="viewcode-block" id="LinuxApplication.run_home"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.run_home">[docs]</a>    <span class="k">def</span> <span class="nf">run_home</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
281         <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</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">app_home</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">run_id</span><span class="p">)</span>
282 </div>
283     <span class="nd">@property</span>
284 <div class="viewcode-block" id="LinuxApplication.pid"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.pid">[docs]</a>    <span class="k">def</span> <span class="nf">pid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
285         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pid</span>
286 </div>
287     <span class="nd">@property</span>
288 <div class="viewcode-block" id="LinuxApplication.ppid"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.ppid">[docs]</a>    <span class="k">def</span> <span class="nf">ppid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
289         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ppid</span>
290 </div>
291     <span class="nd">@property</span>
292 <div class="viewcode-block" id="LinuxApplication.in_foreground"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.in_foreground">[docs]</a>    <span class="k">def</span> <span class="nf">in_foreground</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
293         <span class="sd">&quot;&quot;&quot; Returns True if the command needs to be executed in foreground.</span>
294 <span class="sd">        This means that command will be executed using &#39;execute&#39; instead of</span>
295 <span class="sd">        &#39;run&#39; (&#39;run&#39; executes a command in background and detached from the </span>
296 <span class="sd">        terminal)</span>
297 <span class="sd">        </span>
298 <span class="sd">        When using X11 forwarding option, the command can not run in background</span>
299 <span class="sd">        and detached from a terminal, since we need to keep the terminal attached </span>
300 <span class="sd">        to interact with it.</span>
301 <span class="sd">        &quot;&quot;&quot;</span>
302         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;forwardX11&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_in_foreground</span>
303 </div>
304 <div class="viewcode-block" id="LinuxApplication.trace_filepath"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.trace_filepath">[docs]</a>    <span class="k">def</span> <span class="nf">trace_filepath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
305         <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</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">run_home</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span>
306 </div>
307 <div class="viewcode-block" id="LinuxApplication.trace"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.trace">[docs]</a>    <span class="k">def</span> <span class="nf">trace</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">attr</span> <span class="o">=</span> <span class="n">TraceAttr</span><span class="o">.</span><span class="n">ALL</span><span class="p">,</span> <span class="n">block</span> <span class="o">=</span> <span class="mi">512</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
308         <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Retrieving &#39;</span><span class="si">%s</span><span class="s">&#39; trace </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">attr</span><span class="p">))</span>
309
310         <span class="n">path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">trace_filepath</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
311         
312         <span class="n">command</span> <span class="o">=</span> <span class="s">&quot;(test -f </span><span class="si">%s</span><span class="s"> &amp;&amp; echo &#39;success&#39;) || echo &#39;error&#39;&quot;</span> <span class="o">%</span> <span class="n">path</span>
313         <span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">),</span> <span class="n">proc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
314
315         <span class="k">if</span> <span class="p">(</span><span class="n">err</span> <span class="ow">and</span> <span class="n">proc</span><span class="o">.</span><span class="n">poll</span><span class="p">())</span> <span class="ow">or</span> <span class="n">out</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;error&quot;</span><span class="p">)</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
316             <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot; Couldn&#39;t find trace </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="n">name</span>
317             <span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
318             <span class="k">return</span> <span class="bp">None</span>
319     
320         <span class="k">if</span> <span class="n">attr</span> <span class="o">==</span> <span class="n">TraceAttr</span><span class="o">.</span><span class="n">PATH</span><span class="p">:</span>
321             <span class="k">return</span> <span class="n">path</span>
322
323         <span class="k">if</span> <span class="n">attr</span> <span class="o">==</span> <span class="n">TraceAttr</span><span class="o">.</span><span class="n">ALL</span><span class="p">:</span>
324             <span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">),</span> <span class="n">proc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">check_output</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">run_home</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
325             
326             <span class="k">if</span> <span class="n">proc</span><span class="o">.</span><span class="n">poll</span><span class="p">():</span>
327                 <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot; Couldn&#39;t read trace </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="n">name</span>
328                 <span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
329                 <span class="k">return</span> <span class="bp">None</span>
330
331             <span class="k">return</span> <span class="n">out</span>
332
333         <span class="k">if</span> <span class="n">attr</span> <span class="o">==</span> <span class="n">TraceAttr</span><span class="o">.</span><span class="n">STREAM</span><span class="p">:</span>
334             <span class="n">cmd</span> <span class="o">=</span> <span class="s">&quot;dd if=</span><span class="si">%s</span><span class="s"> bs=</span><span class="si">%d</span><span class="s"> count=1 skip=</span><span class="si">%d</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">block</span><span class="p">,</span> <span class="n">offset</span><span class="p">)</span>
335         <span class="k">elif</span> <span class="n">attr</span> <span class="o">==</span> <span class="n">TraceAttr</span><span class="o">.</span><span class="n">SIZE</span><span class="p">:</span>
336             <span class="n">cmd</span> <span class="o">=</span> <span class="s">&quot;stat -c</span><span class="si">%%</span><span class="s">s </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="n">path</span>
337
338         <span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">),</span> <span class="n">proc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
339
340         <span class="k">if</span> <span class="n">proc</span><span class="o">.</span><span class="n">poll</span><span class="p">():</span>
341             <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot; Couldn&#39;t find trace </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="n">name</span>
342             <span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
343             <span class="k">return</span> <span class="bp">None</span>
344         
345         <span class="k">if</span> <span class="n">attr</span> <span class="o">==</span> <span class="n">TraceAttr</span><span class="o">.</span><span class="n">SIZE</span><span class="p">:</span>
346             <span class="n">out</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">out</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
347
348         <span class="k">return</span> <span class="n">out</span>
349 </div>
350 <div class="viewcode-block" id="LinuxApplication.do_provision"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.do_provision">[docs]</a>    <span class="k">def</span> <span class="nf">do_provision</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
351         <span class="c"># take a snapshot of the system if user is root</span>
352         <span class="c"># to ensure that cleanProcess will not kill</span>
353         <span class="c"># pre-existent processes</span>
354         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;username&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="s">&#39;root&#39;</span><span class="p">:</span>
355             <span class="kn">import</span> <span class="nn">pickle</span>
356             <span class="n">procs</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
357             <span class="n">ps_aux</span> <span class="o">=</span> <span class="s">&quot;ps aux |awk &#39;{print $2,$11}&#39;&quot;</span>
358             <span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">),</span> <span class="n">proc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">ps_aux</span><span class="p">)</span>
359             <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">out</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
360                 <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">out</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">):</span>
361                     <span class="n">parts</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">)</span>
362                     <span class="n">procs</span><span class="p">[</span><span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
363                 <span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">procs</span><span class="p">,</span> <span class="nb">open</span><span class="p">(</span><span class="s">&quot;/tmp/save.proc&quot;</span><span class="p">,</span> <span class="s">&quot;wb&quot;</span><span class="p">))</span>
364             
365         <span class="c"># create run dir for application</span>
366         <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">run_home</span><span class="p">)</span>
367    
368         <span class="c"># List of all the provision methods to invoke</span>
369         <span class="n">steps</span> <span class="o">=</span> <span class="p">[</span>
370             <span class="c"># upload sources</span>
371             <span class="bp">self</span><span class="o">.</span><span class="n">upload_sources</span><span class="p">,</span>
372             <span class="c"># upload files</span>
373             <span class="bp">self</span><span class="o">.</span><span class="n">upload_files</span><span class="p">,</span>
374             <span class="c"># upload binaries</span>
375             <span class="bp">self</span><span class="o">.</span><span class="n">upload_binaries</span><span class="p">,</span>
376             <span class="c"># upload libraries</span>
377             <span class="bp">self</span><span class="o">.</span><span class="n">upload_libraries</span><span class="p">,</span>
378             <span class="c"># upload code</span>
379             <span class="bp">self</span><span class="o">.</span><span class="n">upload_code</span><span class="p">,</span>
380             <span class="c"># upload stdin</span>
381             <span class="bp">self</span><span class="o">.</span><span class="n">upload_stdin</span><span class="p">,</span>
382             <span class="c"># install dependencies</span>
383             <span class="bp">self</span><span class="o">.</span><span class="n">install_dependencies</span><span class="p">,</span>
384             <span class="c"># build</span>
385             <span class="bp">self</span><span class="o">.</span><span class="n">build</span><span class="p">,</span>
386             <span class="c"># Install</span>
387             <span class="bp">self</span><span class="o">.</span><span class="n">install</span><span class="p">]</span>
388
389         <span class="n">command</span> <span class="o">=</span> <span class="p">[]</span>
390
391         <span class="c"># Since provisioning takes a long time, before</span>
392         <span class="c"># each step we check that the EC is still </span>
393         <span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="n">steps</span><span class="p">:</span>
394             <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">abort</span><span class="p">:</span>
395                 <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Interrupting provisioning. EC says &#39;ABORT&quot;</span><span class="p">)</span>
396                 <span class="k">return</span>
397             
398             <span class="n">ret</span> <span class="o">=</span> <span class="n">step</span><span class="p">()</span>
399             <span class="k">if</span> <span class="n">ret</span><span class="p">:</span>
400                 <span class="n">command</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span>
401
402         <span class="c"># upload deploy script</span>
403         <span class="n">deploy_command</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="n">command</span><span class="p">)</span>
404         <span class="bp">self</span><span class="o">.</span><span class="n">execute_deploy_command</span><span class="p">(</span><span class="n">deploy_command</span><span class="p">)</span>
405
406         <span class="c"># upload start script</span>
407         <span class="bp">self</span><span class="o">.</span><span class="n">upload_start_command</span><span class="p">()</span>
408        
409         <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Provisioning finished&quot;</span><span class="p">)</span>
410
411         <span class="nb">super</span><span class="p">(</span><span class="n">LinuxApplication</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">do_provision</span><span class="p">()</span>
412 </div>
413 <div class="viewcode-block" id="LinuxApplication.upload_start_command"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.upload_start_command">[docs]</a>    <span class="k">def</span> <span class="nf">upload_start_command</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">overwrite</span> <span class="o">=</span> <span class="bp">False</span><span class="p">):</span>
414         <span class="c"># Upload command to remote bash script</span>
415         <span class="c"># - only if command can be executed in background and detached</span>
416         <span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;command&quot;</span><span class="p">)</span>
417
418         <span class="k">if</span> <span class="n">command</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">in_foreground</span><span class="p">:</span>
419             <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Uploading command &#39;</span><span class="si">%s</span><span class="s">&#39;&quot;</span> <span class="o">%</span> <span class="n">command</span><span class="p">)</span>
420
421             <span class="c"># replace application specific paths in the command</span>
422             <span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">replace_paths</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
423             <span class="c"># replace application specific paths in the environment</span>
424             <span class="n">env</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;env&quot;</span><span class="p">)</span>
425             <span class="n">env</span> <span class="o">=</span> <span class="n">env</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">replace_paths</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
426
427             <span class="n">shfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</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">app_home</span><span class="p">,</span> <span class="s">&quot;start.sh&quot;</span><span class="p">)</span>
428
429             <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">upload_command</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> 
430                     <span class="n">shfile</span> <span class="o">=</span> <span class="n">shfile</span><span class="p">,</span>
431                     <span class="n">env</span> <span class="o">=</span> <span class="n">env</span><span class="p">,</span>
432                     <span class="n">overwrite</span> <span class="o">=</span> <span class="n">overwrite</span><span class="p">)</span>
433 </div>
434 <div class="viewcode-block" id="LinuxApplication.execute_deploy_command"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.execute_deploy_command">[docs]</a>    <span class="k">def</span> <span class="nf">execute_deploy_command</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="n">prefix</span><span class="o">=</span><span class="s">&quot;deploy&quot;</span><span class="p">):</span>
435         <span class="k">if</span> <span class="n">command</span><span class="p">:</span>
436             <span class="c"># replace application specific paths in the command</span>
437             <span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">replace_paths</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
438             
439             <span class="c"># replace application specific paths in the environment</span>
440             <span class="n">env</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;env&quot;</span><span class="p">)</span>
441             <span class="n">env</span> <span class="o">=</span> <span class="n">env</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">replace_paths</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
442
443             <span class="c"># Upload the command to a bash script and run it</span>
444             <span class="c"># in background ( but wait until the command has</span>
445             <span class="c"># finished to continue )</span>
446             <span class="n">shfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</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">app_home</span><span class="p">,</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">.sh&quot;</span> <span class="o">%</span> <span class="n">prefix</span><span class="p">)</span>
447             <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">run_and_wait</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_home</span><span class="p">,</span>
448                     <span class="n">shfile</span> <span class="o">=</span> <span class="n">shfile</span><span class="p">,</span> 
449                     <span class="n">overwrite</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span>
450                     <span class="n">pidfile</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">_pidfile&quot;</span> <span class="o">%</span> <span class="n">prefix</span><span class="p">,</span> 
451                     <span class="n">ecodefile</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">_exitcode&quot;</span> <span class="o">%</span> <span class="n">prefix</span><span class="p">,</span> 
452                     <span class="n">stdout</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">_stdout&quot;</span> <span class="o">%</span> <span class="n">prefix</span><span class="p">,</span> 
453                     <span class="n">stderr</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">_stderr&quot;</span> <span class="o">%</span> <span class="n">prefix</span><span class="p">)</span>
454 </div>
455 <div class="viewcode-block" id="LinuxApplication.upload_sources"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.upload_sources">[docs]</a>    <span class="k">def</span> <span class="nf">upload_sources</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sources</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">src_dir</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
456         <span class="k">if</span> <span class="ow">not</span> <span class="n">sources</span><span class="p">:</span>
457             <span class="n">sources</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;sources&quot;</span><span class="p">)</span>
458    
459         <span class="n">command</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
460
461         <span class="k">if</span> <span class="ow">not</span> <span class="n">src_dir</span><span class="p">:</span>
462             <span class="n">src_dir</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">src_dir</span>
463
464         <span class="k">if</span> <span class="n">sources</span><span class="p">:</span>
465             <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Uploading sources &quot;</span><span class="p">)</span>
466
467             <span class="n">sources</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="o">.</span><span class="n">strip</span><span class="p">,</span> <span class="n">sources</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;;&quot;</span><span class="p">))</span>
468
469             <span class="c"># Separate sources that should be downloaded from </span>
470             <span class="c"># the web, from sources that should be uploaded from</span>
471             <span class="c"># the local machine</span>
472             <span class="n">command</span> <span class="o">=</span> <span class="p">[]</span>
473             <span class="k">for</span> <span class="n">source</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">sources</span><span class="p">):</span>
474                 <span class="k">if</span> <span class="n">source</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&quot;http&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">source</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&quot;https&quot;</span><span class="p">):</span>
475                     <span class="c"># remove the hhtp source from the sources list</span>
476                     <span class="n">sources</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">source</span><span class="p">)</span>
477
478                     <span class="n">command</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="s">&quot; ( &quot;</span> 
479                             <span class="c"># Check if the source already exists</span>
480                             <span class="s">&quot; ls </span><span class="si">%(src_dir)s</span><span class="s">/</span><span class="si">%(basename)s</span><span class="s"> &quot;</span>
481                             <span class="s">&quot; || ( &quot;</span>
482                             <span class="c"># If source doesn&#39;t exist, download it and check</span>
483                             <span class="c"># that it it downloaded ok</span>
484                             <span class="s">&quot;   wget -c --directory-prefix=</span><span class="si">%(src_dir)s</span><span class="s"> </span><span class="si">%(source)s</span><span class="s"> &amp;&amp; &quot;</span>
485                             <span class="s">&quot;   ls </span><span class="si">%(src_dir)s</span><span class="s">/</span><span class="si">%(basename)s</span><span class="s"> &quot;</span>
486                             <span class="s">&quot; ) ) &quot;</span> <span class="o">%</span> <span class="p">{</span>
487                                 <span class="s">&quot;basename&quot;</span><span class="p">:</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">source</span><span class="p">),</span>
488                                 <span class="s">&quot;source&quot;</span><span class="p">:</span> <span class="n">source</span><span class="p">,</span>
489                                 <span class="s">&quot;src_dir&quot;</span><span class="p">:</span> <span class="n">src_dir</span>
490                                 <span class="p">})</span>
491
492             <span class="n">command</span> <span class="o">=</span> <span class="s">&quot; &amp;&amp; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
493
494             <span class="c"># replace application specific paths in the command</span>
495             <span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">replace_paths</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
496        
497             <span class="k">if</span> <span class="n">sources</span><span class="p">:</span>
498                 <span class="n">sources</span> <span class="o">=</span> <span class="s">&#39;;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span>
499                 <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">upload</span><span class="p">(</span><span class="n">sources</span><span class="p">,</span> <span class="n">src_dir</span><span class="p">,</span> <span class="n">overwrite</span> <span class="o">=</span> <span class="bp">False</span><span class="p">)</span>
500
501         <span class="k">return</span> <span class="n">command</span>
502 </div>
503 <div class="viewcode-block" id="LinuxApplication.upload_files"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.upload_files">[docs]</a>    <span class="k">def</span> <span class="nf">upload_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">files</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
504         <span class="k">if</span> <span class="ow">not</span> <span class="n">files</span><span class="p">:</span>
505             <span class="n">files</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;files&quot;</span><span class="p">)</span>
506
507         <span class="k">if</span> <span class="n">files</span><span class="p">:</span>
508             <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Uploading files </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="n">files</span><span class="p">)</span>
509             <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">upload</span><span class="p">(</span><span class="n">files</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">share_dir</span><span class="p">,</span> <span class="n">overwrite</span> <span class="o">=</span> <span class="bp">False</span><span class="p">)</span>
510 </div>
511 <div class="viewcode-block" id="LinuxApplication.upload_libraries"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.upload_libraries">[docs]</a>    <span class="k">def</span> <span class="nf">upload_libraries</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">libs</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
512         <span class="k">if</span> <span class="ow">not</span> <span class="n">libs</span><span class="p">:</span>
513             <span class="n">libs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;libs&quot;</span><span class="p">)</span>
514
515         <span class="k">if</span> <span class="n">libs</span><span class="p">:</span>
516             <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Uploading libraries </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="n">libaries</span><span class="p">)</span>
517             <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">upload</span><span class="p">(</span><span class="n">libs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">lib_dir</span><span class="p">,</span> <span class="n">overwrite</span> <span class="o">=</span> <span class="bp">False</span><span class="p">)</span>
518 </div>
519 <div class="viewcode-block" id="LinuxApplication.upload_binaries"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.upload_binaries">[docs]</a>    <span class="k">def</span> <span class="nf">upload_binaries</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bins</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
520         <span class="k">if</span> <span class="ow">not</span> <span class="n">bins</span><span class="p">:</span>
521             <span class="n">bins</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;bins&quot;</span><span class="p">)</span>
522
523         <span class="k">if</span> <span class="n">bins</span><span class="p">:</span>
524             <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Uploading binaries </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="n">binaries</span><span class="p">)</span>
525             <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">upload</span><span class="p">(</span><span class="n">bins</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">bin_dir</span><span class="p">,</span> <span class="n">overwrite</span> <span class="o">=</span> <span class="bp">False</span><span class="p">)</span>
526 </div>
527 <div class="viewcode-block" id="LinuxApplication.upload_code"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.upload_code">[docs]</a>    <span class="k">def</span> <span class="nf">upload_code</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">code</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
528         <span class="k">if</span> <span class="ow">not</span> <span class="n">code</span><span class="p">:</span>
529             <span class="n">code</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;code&quot;</span><span class="p">)</span>
530
531         <span class="k">if</span> <span class="n">code</span><span class="p">:</span>
532             <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Uploading code&quot;</span><span class="p">)</span>
533
534             <span class="n">dst</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</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">app_home</span><span class="p">,</span> <span class="s">&quot;code&quot;</span><span class="p">)</span>
535             <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">upload</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">overwrite</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span> <span class="n">text</span> <span class="o">=</span> <span class="bp">True</span><span class="p">)</span>
536 </div>
537 <div class="viewcode-block" id="LinuxApplication.upload_stdin"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.upload_stdin">[docs]</a>    <span class="k">def</span> <span class="nf">upload_stdin</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stdin</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
538         <span class="k">if</span> <span class="ow">not</span> <span class="n">stdin</span><span class="p">:</span>
539            <span class="n">stdin</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;stdin&quot;</span><span class="p">)</span>
540
541         <span class="k">if</span> <span class="n">stdin</span><span class="p">:</span>
542             <span class="c"># create dir for sources</span>
543             <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Uploading stdin&quot;</span><span class="p">)</span>
544             
545             <span class="c"># upload stdin file to ${SHARE_DIR} directory</span>
546             <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">stdin</span><span class="p">):</span>
547                 <span class="n">basename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">stdin</span><span class="p">)</span>
548                 <span class="n">dst</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</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">node</span><span class="o">.</span><span class="n">share_dir</span><span class="p">,</span> <span class="n">basename</span><span class="p">)</span>
549             <span class="k">else</span><span class="p">:</span>
550                 <span class="n">dst</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</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">app_home</span><span class="p">,</span> <span class="s">&quot;stdin&quot;</span><span class="p">)</span>
551
552             <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">upload</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">overwrite</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span> <span class="n">text</span> <span class="o">=</span> <span class="bp">True</span><span class="p">)</span>
553
554             <span class="c"># create &quot;stdin&quot; symlink on ${APP_HOME} directory</span>
555             <span class="n">command</span> <span class="o">=</span> <span class="s">&quot;( cd </span><span class="si">%(app_home)s</span><span class="s"> ; [ ! -f stdin ] &amp;&amp;  ln -s </span><span class="si">%(stdin)s</span><span class="s"> stdin )&quot;</span> <span class="o">%</span> <span class="p">({</span>
556                 <span class="s">&quot;app_home&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">app_home</span><span class="p">,</span> 
557                 <span class="s">&quot;stdin&quot;</span><span class="p">:</span> <span class="n">dst</span> <span class="p">})</span>
558
559             <span class="k">return</span> <span class="n">command</span>
560 </div>
561 <div class="viewcode-block" id="LinuxApplication.install_dependencies"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.install_dependencies">[docs]</a>    <span class="k">def</span> <span class="nf">install_dependencies</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">depends</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
562         <span class="k">if</span> <span class="ow">not</span> <span class="n">depends</span><span class="p">:</span>
563             <span class="n">depends</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;depends&quot;</span><span class="p">)</span>
564
565         <span class="k">if</span> <span class="n">depends</span><span class="p">:</span>
566             <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Installing dependencies </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">depends</span><span class="p">)</span>
567             <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">install_packages_command</span><span class="p">(</span><span class="n">depends</span><span class="p">)</span>
568 </div>
569 <div class="viewcode-block" id="LinuxApplication.build"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.build">[docs]</a>    <span class="k">def</span> <span class="nf">build</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">build</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
570         <span class="k">if</span> <span class="ow">not</span> <span class="n">build</span><span class="p">:</span>
571             <span class="n">build</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;build&quot;</span><span class="p">)</span>
572
573         <span class="k">if</span> <span class="n">build</span><span class="p">:</span>
574             <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Building sources &quot;</span><span class="p">)</span>
575             
576             <span class="c"># replace application specific paths in the command</span>
577             <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">replace_paths</span><span class="p">(</span><span class="n">build</span><span class="p">)</span>
578 </div>
579 <div class="viewcode-block" id="LinuxApplication.install"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.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">install</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
580         <span class="k">if</span> <span class="ow">not</span> <span class="n">install</span><span class="p">:</span>
581             <span class="n">install</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;install&quot;</span><span class="p">)</span>
582
583         <span class="k">if</span> <span class="n">install</span><span class="p">:</span>
584             <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Installing sources &quot;</span><span class="p">)</span>
585
586             <span class="c"># replace application specific paths in the command</span>
587             <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">replace_paths</span><span class="p">(</span><span class="n">install</span><span class="p">)</span>
588 </div>
589 <div class="viewcode-block" id="LinuxApplication.do_deploy"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.do_deploy">[docs]</a>    <span class="k">def</span> <span class="nf">do_deploy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
590         <span class="c"># Wait until node is associated and deployed</span>
591         <span class="n">node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span>
592         <span class="k">if</span> <span class="ow">not</span> <span class="n">node</span> <span class="ow">or</span> <span class="n">node</span><span class="o">.</span><span class="n">state</span> <span class="o">&lt;</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">READY</span><span class="p">:</span>
593             <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;---- RESCHEDULING DEPLOY ---- node state </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">node</span><span class="o">.</span><span class="n">state</span><span class="p">)</span>
594             <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">schedule</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">reschedule_delay</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">deploy</span><span class="p">)</span>
595         <span class="k">else</span><span class="p">:</span>
596             <span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;command&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="s">&quot;&quot;</span>
597             <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Deploying command &#39;</span><span class="si">%s</span><span class="s">&#39; &quot;</span> <span class="o">%</span> <span class="n">command</span><span class="p">)</span>
598             <span class="bp">self</span><span class="o">.</span><span class="n">do_discover</span><span class="p">()</span>
599             <span class="bp">self</span><span class="o">.</span><span class="n">do_provision</span><span class="p">()</span>
600
601             <span class="nb">super</span><span class="p">(</span><span class="n">LinuxApplication</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">do_deploy</span><span class="p">()</span>
602    </div>
603 <div class="viewcode-block" id="LinuxApplication.do_start"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.do_start">[docs]</a>    <span class="k">def</span> <span class="nf">do_start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
604         <span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;command&quot;</span><span class="p">)</span>
605
606         <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Starting command &#39;</span><span class="si">%s</span><span class="s">&#39;&quot;</span> <span class="o">%</span> <span class="n">command</span><span class="p">)</span>
607
608         <span class="k">if</span> <span class="ow">not</span> <span class="n">command</span><span class="p">:</span>
609             <span class="c"># If no command was given (i.e. Application was used for dependency</span>
610             <span class="c"># installation), then the application is directly marked as STOPPED</span>
611             <span class="nb">super</span><span class="p">(</span><span class="n">LinuxApplication</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">set_stopped</span><span class="p">()</span>
612         <span class="k">else</span><span class="p">:</span>
613             <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">in_foreground</span><span class="p">:</span>
614                 <span class="bp">self</span><span class="o">.</span><span class="n">_run_in_foreground</span><span class="p">()</span>
615             <span class="k">else</span><span class="p">:</span>
616                 <span class="bp">self</span><span class="o">.</span><span class="n">_run_in_background</span><span class="p">()</span>
617
618             <span class="nb">super</span><span class="p">(</span><span class="n">LinuxApplication</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">do_start</span><span class="p">()</span>
619 </div>
620     <span class="k">def</span> <span class="nf">_run_in_foreground</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
621         <span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;command&quot;</span><span class="p">)</span>
622         <span class="n">sudo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;sudo&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">False</span>
623         <span class="n">x11</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;forwardX11&quot;</span><span class="p">)</span>
624         <span class="n">env</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;env&quot;</span><span class="p">)</span>
625
626         <span class="c"># Command will be launched in foreground and attached to the</span>
627         <span class="c"># terminal using the node &#39;execute&#39; in non blocking mode.</span>
628
629         <span class="c"># We save the reference to the process in self._proc </span>
630         <span class="c"># to be able to kill the process from the stop method.</span>
631         <span class="c"># We also set blocking = False, since we don&#39;t want the</span>
632         <span class="c"># thread to block until the execution finishes.</span>
633         <span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute_command</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> 
634                 <span class="n">env</span> <span class="o">=</span> <span class="n">env</span><span class="p">,</span>
635                 <span class="n">sudo</span> <span class="o">=</span> <span class="n">sudo</span><span class="p">,</span>
636                 <span class="n">forward_x11</span> <span class="o">=</span> <span class="n">x11</span><span class="p">,</span>
637                 <span class="n">blocking</span> <span class="o">=</span> <span class="bp">False</span><span class="p">)</span>
638
639         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proc</span><span class="o">.</span><span class="n">poll</span><span class="p">():</span>
640             <span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
641             <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
642
643     <span class="k">def</span> <span class="nf">_run_in_background</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
644         <span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;command&quot;</span><span class="p">)</span>
645         <span class="n">env</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;env&quot;</span><span class="p">)</span>
646         <span class="n">sudo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;sudo&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">False</span>
647
648         <span class="n">stdout</span> <span class="o">=</span> <span class="s">&quot;stdout&quot;</span>
649         <span class="n">stderr</span> <span class="o">=</span> <span class="s">&quot;stderr&quot;</span>
650         <span class="n">stdin</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</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">app_home</span><span class="p">,</span> <span class="s">&quot;stdin&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;stdin&quot;</span><span class="p">)</span> \
651                 <span class="k">else</span> <span class="bp">None</span>
652
653         <span class="c"># Command will be run as a daemon in baground and detached from any</span>
654         <span class="c"># terminal.</span>
655         <span class="c"># The command to run was previously uploaded to a bash script</span>
656         <span class="c"># during deployment, now we launch the remote script using &#39;run&#39;</span>
657         <span class="c"># method from the node.</span>
658         <span class="n">cmd</span> <span class="o">=</span> <span class="s">&quot;bash </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">os</span><span class="o">.</span><span class="n">path</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">app_home</span><span class="p">,</span> <span class="s">&quot;start.sh&quot;</span><span class="p">)</span>
659         <span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">),</span> <span class="n">proc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_home</span><span class="p">,</span> 
660             <span class="n">stdin</span> <span class="o">=</span> <span class="n">stdin</span><span class="p">,</span> 
661             <span class="n">stdout</span> <span class="o">=</span> <span class="n">stdout</span><span class="p">,</span>
662             <span class="n">stderr</span> <span class="o">=</span> <span class="n">stderr</span><span class="p">,</span>
663             <span class="n">sudo</span> <span class="o">=</span> <span class="n">sudo</span><span class="p">)</span>
664
665         <span class="c"># check if execution errors occurred</span>
666         <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot; Failed to start command &#39;</span><span class="si">%s</span><span class="s">&#39; &quot;</span> <span class="o">%</span> <span class="n">command</span>
667         
668         <span class="k">if</span> <span class="n">proc</span><span class="o">.</span><span class="n">poll</span><span class="p">():</span>
669             <span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
670             <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
671     
672         <span class="c"># Wait for pid file to be generated</span>
673         <span class="n">pid</span><span class="p">,</span> <span class="n">ppid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">wait_pid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">run_home</span><span class="p">)</span>
674         <span class="k">if</span> <span class="n">pid</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pid</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">pid</span><span class="p">)</span>
675         <span class="k">if</span> <span class="n">ppid</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ppid</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">ppid</span><span class="p">)</span>
676
677         <span class="c"># If the process is not running, check for error information</span>
678         <span class="c"># on the remote machine</span>
679         <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">pid</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">ppid</span><span class="p">:</span>
680             <span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">),</span> <span class="n">proc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">check_errors</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">run_home</span><span class="p">,</span>
681                     <span class="n">stderr</span> <span class="o">=</span> <span class="n">stderr</span><span class="p">)</span> 
682
683             <span class="c"># Out is what was written in the stderr file</span>
684             <span class="k">if</span> <span class="n">err</span><span class="p">:</span>
685                 <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot; Failed to start command &#39;</span><span class="si">%s</span><span class="s">&#39; &quot;</span> <span class="o">%</span> <span class="n">command</span>
686                 <span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
687                 <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
688     
689 <div class="viewcode-block" id="LinuxApplication.do_stop"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.do_stop">[docs]</a>    <span class="k">def</span> <span class="nf">do_stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
690         <span class="sd">&quot;&quot;&quot; Stops application execution</span>
691 <span class="sd">        &quot;&quot;&quot;</span>
692         <span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;command&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="s">&#39;&#39;</span>
693
694         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="o">==</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">STARTED</span><span class="p">:</span>
695         
696             <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Stopping command &#39;</span><span class="si">%s</span><span class="s">&#39; &quot;</span> <span class="o">%</span> <span class="n">command</span><span class="p">)</span>
697         
698             <span class="c"># If the command is running in foreground (it was launched using</span>
699             <span class="c"># the node &#39;execute&#39; method), then we use the handler to the Popen</span>
700             <span class="c"># process to kill it. Else we send a kill signal using the pid and ppid</span>
701             <span class="c"># retrieved after running the command with the node &#39;run&#39; method</span>
702             <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proc</span><span class="p">:</span>
703                 <span class="bp">self</span><span class="o">.</span><span class="n">_proc</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
704             <span class="k">else</span><span class="p">:</span>
705                 <span class="c"># Only try to kill the process if the pid and ppid</span>
706                 <span class="c"># were retrieved</span>
707                 <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">pid</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">ppid</span><span class="p">:</span>
708                     <span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">),</span> <span class="n">proc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">kill</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ppid</span><span class="p">,</span>
709                             <span class="n">sudo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sudo_kill</span><span class="p">)</span>
710
711                     <span class="sd">&quot;&quot;&quot;</span>
712 <span class="sd">                    # TODO: check if execution errors occurred</span>
713 <span class="sd">                    if (proc and proc.poll()) or err:</span>
714 <span class="sd">                        msg = &quot; Failed to STOP command &#39;%s&#39; &quot; % self.get(&quot;command&quot;)</span>
715 <span class="sd">                        self.error(msg, out, err)</span>
716 <span class="sd">                    &quot;&quot;&quot;</span>
717
718             <span class="nb">super</span><span class="p">(</span><span class="n">LinuxApplication</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">do_stop</span><span class="p">()</span>
719 </div>
720 <div class="viewcode-block" id="LinuxApplication.do_release"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.do_release">[docs]</a>    <span class="k">def</span> <span class="nf">do_release</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
721         <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Releasing resource&quot;</span><span class="p">)</span>
722
723         <span class="bp">self</span><span class="o">.</span><span class="n">do_stop</span><span class="p">()</span>
724         
725         <span class="n">tear_down</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;tearDown&quot;</span><span class="p">)</span>
726         <span class="k">if</span> <span class="n">tear_down</span><span class="p">:</span>
727             <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">tear_down</span><span class="p">)</span>
728
729         <span class="n">hard_release</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;hardRelease&quot;</span><span class="p">)</span>
730         <span class="k">if</span> <span class="n">hard_release</span><span class="p">:</span>
731             <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">rmdir</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">app_home</span><span class="p">)</span>
732
733         <span class="nb">super</span><span class="p">(</span><span class="n">LinuxApplication</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">do_release</span><span class="p">()</span>
734         </div>
735     <span class="nd">@property</span>
736 <div class="viewcode-block" id="LinuxApplication.state"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.state">[docs]</a>    <span class="k">def</span> <span class="nf">state</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
737         <span class="sd">&quot;&quot;&quot; Returns the state of the application</span>
738 <span class="sd">        &quot;&quot;&quot;</span>
739         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span> <span class="o">==</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">STARTED</span><span class="p">:</span>
740             <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">in_foreground</span><span class="p">:</span>
741                 <span class="c"># Check if the process we used to execute the command</span>
742                 <span class="c"># is still running ...</span>
743                 <span class="n">retcode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proc</span><span class="o">.</span><span class="n">poll</span><span class="p">()</span>
744
745                 <span class="c"># retcode == None -&gt; running</span>
746                 <span class="c"># retcode &gt; 0 -&gt; error</span>
747                 <span class="c"># retcode == 0 -&gt; finished</span>
748                 <span class="k">if</span> <span class="n">retcode</span><span class="p">:</span>
749                     <span class="n">out</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
750                     <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot; Failed to execute command &#39;</span><span class="si">%s</span><span class="s">&#39;&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;command&quot;</span><span class="p">)</span>
751                     <span class="n">err</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proc</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
752                     <span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
753                     <span class="bp">self</span><span class="o">.</span><span class="n">do_fail</span><span class="p">()</span>
754
755                 <span class="k">elif</span> <span class="n">retcode</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
756                     <span class="bp">self</span><span class="o">.</span><span class="n">set_stopped</span><span class="p">()</span>
757             <span class="k">else</span><span class="p">:</span>
758                 <span class="c"># We need to query the status of the command we launched in </span>
759                 <span class="c"># background. In order to avoid overwhelming the remote host and</span>
760                 <span class="c"># the local processor with too many ssh queries, the state is only</span>
761                 <span class="c"># requested every &#39;state_check_delay&#39; seconds.</span>
762                 <span class="n">state_check_delay</span> <span class="o">=</span> <span class="mf">0.5</span>
763                 <span class="k">if</span> <span class="n">tdiffsec</span><span class="p">(</span><span class="n">tnow</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_last_state_check</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">state_check_delay</span><span class="p">:</span>
764                     <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">pid</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">ppid</span><span class="p">:</span>
765                         <span class="c"># Make sure the process is still running in background</span>
766                         <span class="n">status</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">status</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ppid</span><span class="p">)</span>
767
768                         <span class="k">if</span> <span class="n">status</span> <span class="o">==</span> <span class="n">ProcStatus</span><span class="o">.</span><span class="n">FINISHED</span><span class="p">:</span>
769                             <span class="c"># If the program finished, check if execution</span>
770                             <span class="c"># errors occurred</span>
771                             <span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">),</span> <span class="n">proc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">check_errors</span><span class="p">(</span>
772                                     <span class="bp">self</span><span class="o">.</span><span class="n">run_home</span><span class="p">)</span>
773
774                             <span class="k">if</span> <span class="n">err</span><span class="p">:</span>
775                                 <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Failed to execute command &#39;</span><span class="si">%s</span><span class="s">&#39;&quot;</span> <span class="o">%</span> \
776                                         <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;command&quot;</span><span class="p">)</span>
777                                 <span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
778                                 <span class="bp">self</span><span class="o">.</span><span class="n">do_fail</span><span class="p">()</span>
779                             <span class="k">else</span><span class="p">:</span>
780                                 <span class="bp">self</span><span class="o">.</span><span class="n">set_stopped</span><span class="p">()</span>
781
782                     <span class="bp">self</span><span class="o">.</span><span class="n">_last_state_check</span> <span class="o">=</span> <span class="n">tnow</span><span class="p">()</span>
783
784         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span>
785 </div>
786 <div class="viewcode-block" id="LinuxApplication.execute_command"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.execute_command">[docs]</a>    <span class="k">def</span> <span class="nf">execute_command</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">command</span><span class="p">,</span> 
787             <span class="n">env</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
788             <span class="n">sudo</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
789             <span class="n">tty</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
790             <span class="n">forward_x11</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
791             <span class="n">blocking</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
792
793         <span class="n">environ</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
794         <span class="k">if</span> <span class="n">env</span><span class="p">:</span>
795             <span class="n">environ</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">format_environment</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">inline</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
796         <span class="n">command</span> <span class="o">=</span> <span class="n">environ</span> <span class="o">+</span> <span class="n">command</span>
797         <span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">replace_paths</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
798
799         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">node</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">command</span><span class="p">,</span>
800                 <span class="n">sudo</span><span class="o">=</span><span class="n">sudo</span><span class="p">,</span>
801                 <span class="n">tty</span><span class="o">=</span><span class="n">tty</span><span class="p">,</span>
802                 <span class="n">forward_x11</span><span class="o">=</span><span class="n">forward_x11</span><span class="p">,</span>
803                 <span class="n">blocking</span><span class="o">=</span><span class="n">blocking</span><span class="p">)</span>
804 </div>
805 <div class="viewcode-block" id="LinuxApplication.replace_paths"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.replace_paths">[docs]</a>    <span class="k">def</span> <span class="nf">replace_paths</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="n">node</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">app_home</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">run_home</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
806         <span class="sd">&quot;&quot;&quot;</span>
807 <span class="sd">        Replace all special path tags with shell-escaped actual paths.</span>
808 <span class="sd">        &quot;&quot;&quot;</span>
809         <span class="k">if</span> <span class="ow">not</span> <span class="n">node</span><span class="p">:</span>
810             <span class="n">node</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">node</span>
811
812         <span class="k">if</span> <span class="ow">not</span> <span class="n">app_home</span><span class="p">:</span>
813             <span class="n">app_home</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">app_home</span>
814
815         <span class="k">if</span> <span class="ow">not</span> <span class="n">run_home</span><span class="p">:</span>
816             <span class="n">run_home</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_home</span>
817
818         <span class="k">return</span> <span class="p">(</span> <span class="n">command</span>
819             <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;${USR}&quot;</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">usr_dir</span><span class="p">)</span>
820             <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;${LIB}&quot;</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">lib_dir</span><span class="p">)</span>
821             <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;${BIN}&quot;</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">bin_dir</span><span class="p">)</span>
822             <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;${SRC}&quot;</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">src_dir</span><span class="p">)</span>
823             <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;${SHARE}&quot;</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">share_dir</span><span class="p">)</span>
824             <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;${EXP}&quot;</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">exp_dir</span><span class="p">)</span>
825             <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;${EXP_HOME}&quot;</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">exp_home</span><span class="p">)</span>
826             <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;${APP_HOME}&quot;</span><span class="p">,</span> <span class="n">app_home</span><span class="p">)</span>
827             <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;${RUN_HOME}&quot;</span><span class="p">,</span> <span class="n">run_home</span><span class="p">)</span>
828             <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;${NODE_HOME}&quot;</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">node_home</span><span class="p">)</span>
829             <span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;${HOME}&quot;</span><span class="p">,</span> <span class="n">node</span><span class="o">.</span><span class="n">home_dir</span><span class="p">)</span>
830             <span class="p">)</span>
831 </div>
832 <div class="viewcode-block" id="LinuxApplication.valid_connection"><a class="viewcode-back" href="../../../../_layout/nepi.resources.linux.html#nepi.resources.linux.application.LinuxApplication.valid_connection">[docs]</a>    <span class="k">def</span> <span class="nf">valid_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">guid</span><span class="p">):</span>
833         <span class="c"># TODO: Validate!</span>
834         <span class="k">return</span> <span class="bp">True</span>
835 </pre></div></div></div>
836
837           </div>
838         </div>
839       </div>
840       <div class="clearer"></div>
841     </div>
842     <div class="related">
843       <h3>Navigation</h3>
844       <ul>
845         <li class="right" style="margin-right: 10px">
846           <a href="../../../../genindex.html" title="General Index"
847              >index</a></li>
848         <li class="right" >
849           <a href="../../../../py-modindex.html" title="Python Module Index"
850              >modules</a> |</li>
851         <li><a href="../../../../index.html">NEPI 3.0 documentation</a> &raquo;</li>
852           <li><a href="../../../index.html" >Module code</a> &raquo;</li> 
853       </ul>
854     </div>
855     <div class="footer">
856         &copy; Copyright 2014, Alina Quereilhac, Lucia Guevgeozian Odizzio, Julien Tribino.
857       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
858     </div>
859   </body>
860 </html>