source: epicsdf/doc/build/html/_modules/epicsdf.html @ 1046

Last change on this file since 1046 was 1046, checked in by jemian, 11 years ago

refs #12, provides the publishing tool and changed the URL to point to the new location

  • Property svn:executable set to *
  • Property svn:mime-type set to text/html
File size: 63.1 KB
Line 
1
2
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6
7<html xmlns="http://www.w3.org/1999/xhtml">
8  <head>
9    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
10   
11    <title>epicsdf &mdash; epicsdf 1.0 documentation</title>
12   
13    <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
14    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
15   
16    <script type="text/javascript">
17      var DOCUMENTATION_OPTIONS = {
18        URL_ROOT:    '../',
19        VERSION:     '1.0',
20        COLLAPSE_INDEX: false,
21        FILE_SUFFIX: '.html',
22        HAS_SOURCE:  true
23      };
24    </script>
25    <script type="text/javascript" src="../_static/jquery.js"></script>
26    <script type="text/javascript" src="../_static/underscore.js"></script>
27    <script type="text/javascript" src="../_static/doctools.js"></script>
28    <link rel="top" title="epicsdf 1.0 documentation" href="../index.html" />
29    <link rel="up" title="Module code" href="index.html" /> 
30  </head>
31  <body>
32    <div class="related">
33      <h3>Navigation</h3>
34      <ul>
35        <li class="right" style="margin-right: 10px">
36          <a href="../genindex.html" title="General Index"
37             accesskey="I">index</a></li>
38        <li class="right" >
39          <a href="../py-modindex.html" title="Python Module Index"
40             >modules</a> |</li>
41        <li><a href="../index.html">epicsdf 1.0 documentation</a> &raquo;</li>
42          <li><a href="index.html" accesskey="U">Module code</a> &raquo;</li> 
43      </ul>
44    </div>
45      <div class="sphinxsidebar">
46        <div class="sphinxsidebarwrapper">
47<div id="searchbox" style="display: none">
48  <h3>Quick search</h3>
49    <form class="search" action="../search.html" method="get">
50      <input type="text" name="q" />
51      <input type="submit" value="Go" />
52      <input type="hidden" name="check_keywords" value="yes" />
53      <input type="hidden" name="area" value="default" />
54    </form>
55    <p class="searchtip" style="font-size: 90%">
56    Enter search terms or a module, class or function name.
57    </p>
58</div>
59<script type="text/javascript">$('#searchbox').show(0);</script>
60        </div>
61      </div>
62
63    <div class="document">
64      <div class="documentwrapper">
65        <div class="bodywrapper">
66          <div class="body">
67           
68  <h1>Source code for epicsdf</h1><div class="highlight"><pre>
69<span class="c">#!/usr/bin/env python</span>
70
71<span class="c">########### SVN repository information ###################</span>
72<span class="c"># $Date: 2011-08-05 12:25:16 -0500 (Fri, 05 Aug 2011) $</span>
73<span class="c"># $Author: jemian $</span>
74<span class="c"># $Revision: 603 $</span>
75<span class="c"># $URL: https://subversion.xor.aps.anl.gov/bcdaext/epicsdf/src/epicsdf.py $</span>
76<span class="c"># $Id: epicsdf.py 603 2011-08-05 17:25:16Z jemian $</span>
77<span class="c">########### SVN repository information ###################</span>
78
79<span class="sd">&quot;&quot;&quot;</span>
80<span class="sd">EPICS client diskfree, in python</span>
81<span class="sd">&quot;&quot;&quot;</span>
82
83
84<span class="kn">import</span> <span class="nn">datetime</span>
85<span class="kn">import</span> <span class="nn">epics</span>
86<span class="kn">import</span> <span class="nn">numpy</span>
87<span class="kn">import</span> <span class="nn">os</span>
88<span class="kn">import</span> <span class="nn">socket</span>
89<span class="kn">import</span> <span class="nn">sys</span>
90<span class="kn">import</span> <span class="nn">time</span>
91
92<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">&#39;nt&#39;</span><span class="p">:</span>
93    <span class="kn">import</span> <span class="nn">win32file</span>
94<span class="k">else</span><span class="p">:</span>
95    <span class="kn">import</span> <span class="nn">statvfs</span>
96
97
98<div class="viewcode-block" id="epicsdf"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf">[docs]</a><span class="k">class</span> <span class="nc">epicsdf</span><span class="p">():</span>
99    <span class="sd">&#39;&#39;&#39;</span>
100<span class="sd">    Connect to a support database of epicsdf and</span>
101<span class="sd">    watch the indicated disk partition.  Report the values</span>
102<span class="sd">    to EPICS and watch for an alarm. Send an email when the</span>
103<span class="sd">    alarm calcout PV changes.</span>
104
105<span class="sd">    :param prefix: prefix of EPICS support database instance</span>
106<span class="sd">        (will not be changed after constructor)</span>
107<span class="sd">    :type prefix: str</span>
108
109<span class="sd">    :note: Some PV values in the support database are needed</span>
110<span class="sd">        to construct the text of the email</span>
111<span class="sd">        or the mailing list.  Since it is not allowed to call caget</span>
112<span class="sd">        during a camonitor callback, we need to monitor them and</span>
113<span class="sd">        cache the values for use in the callback.</span>
114
115<span class="sd">    Usage:</span>
116
117<span class="sd">    There are only three methods in this class that should be called</span>
118<span class="sd">    from the outside.  All others methods are used internally.</span>
119
120<span class="sd">    :meth:`run()` for routine use::</span>
121
122<span class="sd">            from epicsdf import epicsdf</span>
123<span class="sd">            df = epicsdf(&#39;prj:p300:df:&#39;)  # construct it</span>
124<span class="sd">            df.run()                      # run forever</span>
125
126<span class="sd">    :meth:`demo()` for code development::</span>
127
128<span class="sd">            from epicsdf import epicsdf</span>
129<span class="sd">            df = epicsdf(&#39;prj:p300:df:&#39;)  # construct it</span>
130<span class="sd">            df.demo()                     # display a list of partitions</span>
131
132<span class="sd">    :meth:`df2epics()` could be called for one-off use::</span>
133
134<span class="sd">            from epicsdf import epicsdf</span>
135<span class="sd">            df = epicsdf(&#39;prj:p300:df:&#39;)  # construct it</span>
136<span class="sd">            df.df2epics()                 # update once</span>
137
138<span class="sd">    &#39;&#39;&#39;</span>
139
140    <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">prefix</span><span class="p">):</span>
141        <span class="sd">&#39;&#39;&#39;constructor&#39;&#39;&#39;</span>
142        <span class="bp">self</span><span class="o">.</span><span class="n">prefix</span> <span class="o">=</span> <span class="n">prefix</span>    <span class="c"># not expected to be changed</span>
143
144        <span class="c"># these values are used throughout this support code</span>
145        <span class="bp">self</span><span class="o">.</span><span class="n">period</span> <span class="o">=</span> <span class="mf">10.0</span>
146        <span class="bp">self</span><span class="o">.</span><span class="n">setPeriod</span><span class="p">()</span>
147        <span class="bp">self</span><span class="o">.</span><span class="n">disk</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getDisk</span><span class="p">()</span>
148
149        <span class="c"># note: local cache to construct the email message</span>
150        <span class="bp">self</span><span class="o">.</span><span class="n">trigger_sendmail</span> <span class="o">=</span> <span class="bp">False</span>
151        <span class="bp">self</span><span class="o">.</span><span class="n">sender</span> <span class="o">=</span> <span class="s">&quot;jemian@anl.gov&quot;</span>
152        <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caget</span><span class="p">(</span><span class="s">&#39;message&#39;</span><span class="p">)</span>
153        <span class="bp">self</span><span class="o">.</span><span class="n">email_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caget</span><span class="p">(</span><span class="s">&#39;email_list&#39;</span><span class="p">)</span>
154        <span class="bp">self</span><span class="o">.</span><span class="n">next_update</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
155        <span class="bp">self</span><span class="o">.</span><span class="n">alarm</span> <span class="o">=</span> <span class="mi">0</span>
156        <span class="bp">self</span><span class="o">.</span><span class="n">space</span> <span class="o">=</span> <span class="p">{}</span>
157        <span class="bp">self</span><span class="o">.</span><span class="n">toMB</span> <span class="o">=</span> <span class="mf">1.0</span><span class="o">/</span><span class="mi">1024</span><span class="o">/</span><span class="mi">1024</span>
158
159<div class="viewcode-block" id="epicsdf.caget"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.caget">[docs]</a>    <span class="k">def</span> <span class="nf">caget</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
160        <span class="sd">&#39;&#39;&#39;</span>
161<span class="sd">        :param item: name of item in support database</span>
162<span class="sd">        :type item: str</span>
163<span class="sd">        :return: value of EPICS PV within our support database</span>
164<span class="sd">        &#39;&#39;&#39;</span>
165        <span class="n">r</span> <span class="o">=</span> <span class="n">epics</span><span class="o">.</span><span class="n">caget</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prefix</span> <span class="o">+</span> <span class="n">item</span><span class="p">)</span>
166        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">r</span><span class="p">)</span> <span class="o">==</span> <span class="nb">type</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">ndarray</span><span class="p">(</span><span class="mi">1</span><span class="p">)):</span>
167            <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">wf2str</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
168        <span class="k">return</span> <span class="n">r</span>
169</div>
170<div class="viewcode-block" id="epicsdf.caput"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.caput">[docs]</a>    <span class="k">def</span> <span class="nf">caput</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
171        <span class="sd">&#39;&#39;&#39;</span>
172<span class="sd">        :param item: name of item in support database</span>
173<span class="sd">        :type item: str</span>
174<span class="sd">        :param value: new value of item</span>
175<span class="sd">        &#39;&#39;&#39;</span>
176        <span class="n">epics</span><span class="o">.</span><span class="n">caput</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prefix</span> <span class="o">+</span> <span class="n">item</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
177</div>
178<div class="viewcode-block" id="epicsdf.wf2str"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.wf2str">[docs]</a>    <span class="k">def</span> <span class="nf">wf2str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arr</span><span class="p">):</span>
179        <span class="sd">&#39;&#39;&#39;</span>
180<span class="sd">       converts an array of char from an </span>
181<span class="sd">       EPICS waveform record to a python string</span>
182<span class="sd">       </span>
183<span class="sd">       :param arr: NumPy array of char from EPICS waveform record</span>
184<span class="sd">       :type arr: numpy.ndarray</span>
185<span class="sd">       :return: string as represented by arr</span>
186<span class="sd">       :rtype: str</span>
187<span class="sd">       &#39;&#39;&#39;</span>
188        <span class="n">string</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
189        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">arr</span><span class="p">:</span>
190          <span class="c"># TODO: this check must be better before code is used</span>
191          <span class="c">#if type(item) != type(0):</span>
192          <span class="c">#  raise TypeError(&quot;waveform must be of CHAR type&quot;)</span>
193          <span class="k">if</span> <span class="n">item</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">break</span>
194          <span class="n">string</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="si">%c</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">item</span>
195        <span class="k">return</span> <span class="n">string</span>
196</div>
197<div class="viewcode-block" id="epicsdf.getDisk"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.getDisk">[docs]</a>    <span class="k">def</span> <span class="nf">getDisk</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
198        <span class="sd">&#39;&#39;&#39;</span>
199<span class="sd">        :return: name of disk partition to be watched</span>
200<span class="sd">        :rtype: str</span>
201<span class="sd">        &#39;&#39;&#39;</span>
202        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
203            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">caget</span><span class="p">(</span><span class="s">&#39;disk&#39;</span><span class="p">)</span>
204</div>
205<div class="viewcode-block" id="epicsdf.setPeriod"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.setPeriod">[docs]</a>    <span class="k">def</span> <span class="nf">setPeriod</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="mf">10.0</span><span class="p">):</span>
206        <span class="sd">&#39;&#39;&#39;</span>
207<span class="sd">        define the waiting period between updates (units = seconds)</span>
208
209<span class="sd">        :param value: candidate value of period (default = 10.0),</span>
210<span class="sd">            must be 1.0 or greater AND an int or a float</span>
211<span class="sd">        :type value: int or float</span>
212<span class="sd">        &#39;&#39;&#39;</span>
213        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">isValidPeriod</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
214            <span class="k">return</span>
215        <span class="bp">self</span><span class="o">.</span><span class="n">period</span> <span class="o">=</span> <span class="n">value</span>
216</div>
217<div class="viewcode-block" id="epicsdf.df"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.df">[docs]</a>    <span class="k">def</span> <span class="nf">df</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">newdisk</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
218        <span class="sd">&#39;&#39;&#39;</span>
219<span class="sd">        Determine the available space of a (disk) partition,</span>
220<span class="sd">        Report the results in a dictionary.</span>
221
222<span class="sd">        :param newdisk: name of disk to examine (will replace self.disk if not None)</span>
223<span class="sd">        :type newdisk: str</span>
224<span class="sd">        :return: dictionary or None if partition does not exist or zero values</span>
225<span class="sd">        :rtype: dict</span>
226
227<span class="sd">        ============ =======  ===============================</span>
228<span class="sd">        index        units    description</span>
229<span class="sd">        ============ =======  ===============================</span>
230<span class="sd">        total        bytes    total space on the partition</span>
231<span class="sd">        free         bytes    free space</span>
232<span class="sd">        avail        bytes    available space</span>
233<span class="sd">        used         bytes    total - avail</span>
234<span class="sd">        %free        %        :math:`100. * free / total`</span>
235<span class="sd">        %avail       %        :math:`100. * avail / total`</span>
236<span class="sd">        %used        %        :math:`100. - {\%}avail`</span>
237<span class="sd">        ============ =======  ===============================</span>
238<span class="sd">        &#39;&#39;&#39;</span>
239        <span class="k">if</span> <span class="n">newdisk</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
240            <span class="bp">self</span><span class="o">.</span><span class="n">disk</span> <span class="o">=</span> <span class="n">newdisk</span>
241        <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">disk</span><span class="p">):</span>
242            <span class="k">return</span> <span class="bp">None</span>
243        <span class="n">d</span> <span class="o">=</span> <span class="p">{}</span>
244        <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">&#39;nt&#39;</span><span class="p">:</span> <span class="c"># TODO: perhaps should just fail the code if not UNIX</span>
245            <span class="c"># no statvfs on Windows</span>
246            <span class="c"># this code thanks to:</span>
247            <span class="c">#  http://www.daniweb.com/software-development/python/threads/242124</span>
248            <span class="n">drive</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">disk</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s">&#39;:</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s">&#39;:/&#39;</span><span class="p">)</span>
249            <span class="c"># this fails for disks such as \\morel\tmp</span>
250            <span class="n">sectPerCluster</span><span class="p">,</span> <span class="n">bytesPerSector</span><span class="p">,</span> <span class="n">freeClusters</span><span class="p">,</span> <span class="n">totalClusters</span> <span class="o">=</span> \
251                <span class="n">win32file</span><span class="o">.</span><span class="n">GetDiskFreeSpace</span><span class="p">(</span><span class="n">drive</span> <span class="o">+</span> <span class="s">&quot;:</span><span class="se">\\</span><span class="s">&quot;</span><span class="p">)</span>
252            <span class="n">d</span><span class="p">[</span><span class="s">&#39;total&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">totalClusters</span><span class="o">*</span><span class="n">sectPerCluster</span><span class="o">*</span><span class="n">bytesPerSector</span>
253            <span class="n">d</span><span class="p">[</span><span class="s">&#39;free&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">freeClusters</span><span class="o">*</span><span class="n">sectPerCluster</span><span class="o">*</span><span class="n">bytesPerSector</span>
254            <span class="n">d</span><span class="p">[</span><span class="s">&#39;avail&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;free&#39;</span><span class="p">]</span>
255        <span class="k">else</span><span class="p">:</span>
256            <span class="n">st</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">statvfs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">disk</span><span class="p">)</span>
257            <span class="n">blockSize</span> <span class="o">=</span> <span class="n">st</span><span class="p">[</span><span class="n">statvfs</span><span class="o">.</span><span class="n">F_FRSIZE</span><span class="p">]</span>
258            <span class="n">d</span><span class="p">[</span><span class="s">&#39;total&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">blockSize</span> <span class="o">*</span> <span class="n">st</span><span class="p">[</span><span class="n">statvfs</span><span class="o">.</span><span class="n">F_BLOCKS</span><span class="p">]</span>
259            <span class="n">d</span><span class="p">[</span><span class="s">&#39;free&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">blockSize</span> <span class="o">*</span> <span class="n">st</span><span class="p">[</span><span class="n">statvfs</span><span class="o">.</span><span class="n">F_BFREE</span><span class="p">]</span>
260            <span class="n">d</span><span class="p">[</span><span class="s">&#39;avail&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">blockSize</span> <span class="o">*</span> <span class="n">st</span><span class="p">[</span><span class="n">statvfs</span><span class="o">.</span><span class="n">F_BAVAIL</span><span class="p">]</span>
261        <span class="k">if</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;total&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
262            <span class="k">return</span> <span class="bp">None</span>
263        <span class="n">d</span><span class="p">[</span><span class="s">&#39;used&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;total&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;avail&#39;</span><span class="p">]</span>
264        <span class="n">d</span><span class="p">[</span><span class="s">&#39;</span><span class="si">%f</span><span class="s">ree&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mf">100.0</span> <span class="o">*</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;free&#39;</span><span class="p">]</span> <span class="o">/</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;total&#39;</span><span class="p">]</span>
265        <span class="n">d</span><span class="p">[</span><span class="s">&#39;%avail&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mf">100.0</span> <span class="o">*</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;avail&#39;</span><span class="p">]</span> <span class="o">/</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;total&#39;</span><span class="p">]</span>
266        <span class="n">d</span><span class="p">[</span><span class="s">&#39;</span><span class="si">%u</span><span class="s">sed&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mf">100.0</span> <span class="o">-</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;%avail&#39;</span><span class="p">]</span>
267        <span class="k">return</span> <span class="n">d</span>
268</div>
269<div class="viewcode-block" id="epicsdf.demo"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.demo">[docs]</a>    <span class="k">def</span> <span class="nf">demo</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
270        <span class="sd">&#39;&#39;&#39;</span>
271<span class="sd">        demonstrate one possible use of this code,</span>
272<span class="sd">        to replicate the UNIX df command::</span>
273
274<span class="sd">            [jemian@gov,402,src]$ ./epicsdf.py</span>
275<span class="sd">                   total         free    available    use%</span>
276<span class="sd">            214748364800  42878369792  42878369792   80.0% .</span>
277<span class="sd">             20803424256  10699845632   9626038272   53.7% /</span>
278<span class="sd">               103512064     68733952     63389696   38.8% /boot</span>
279<span class="sd">              1936355328   1936334848   1936334848    0.0% /dev/shm</span>
280<span class="sd">            215406047232 184723456000 173604937728   19.4% /local</span>
281<span class="sd">             20803424256  10699845632   9626038272   53.7% /tmp</span>
282
283<span class="sd">        &#39;&#39;&#39;</span>
284        <span class="n">paths</span> <span class="o">=</span> <span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">,</span> <span class="s">&#39;c:/&#39;</span><span class="p">,</span> <span class="s">&#39;/tmp&#39;</span><span class="p">,</span> <span class="s">&#39;/local&#39;</span><span class="p">,</span> <span class="s">&#39;/boot&#39;</span><span class="p">,</span> <span class="s">&#39;~&#39;</span><span class="p">,</span>
285                 <span class="s">&#39;/dev/shm&#39;</span><span class="p">,</span> <span class="s">&#39;/ramdisk&#39;</span><span class="p">,</span> <span class="s">&#39;.&#39;</span><span class="p">)</span>
286        <span class="n">fmt</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%12s</span><span class="s"> </span><span class="si">%12s</span><span class="s"> </span><span class="si">%12s</span><span class="s"> </span><span class="si">%6s%%</span><span class="s"> </span><span class="si">%s</span><span class="s">&quot;</span>
287        <span class="n">labels</span> <span class="o">=</span> <span class="p">(</span><span class="s">&#39;total&#39;</span><span class="p">,</span> <span class="s">&#39;free&#39;</span><span class="p">,</span> <span class="s">&#39;available&#39;</span><span class="p">,</span> <span class="s">&#39;use&#39;</span><span class="p">,</span> <span class="s">&#39;partition&#39;</span><span class="p">)</span>
288        <span class="k">print</span> <span class="n">fmt</span> <span class="o">%</span> <span class="n">labels</span>
289        <span class="k">for</span> <span class="n">disk</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">paths</span><span class="p">):</span>
290            <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">df</span><span class="p">(</span><span class="n">disk</span><span class="p">)</span>
291            <span class="k">if</span> <span class="n">d</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
292                <span class="k">print</span> <span class="s">&quot;</span><span class="si">%12d</span><span class="s"> </span><span class="si">%12d</span><span class="s"> </span><span class="si">%12d</span><span class="s"> </span><span class="si">%6.1f%%</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span>
293                    <span class="n">d</span><span class="p">[</span><span class="s">&#39;total&#39;</span><span class="p">],</span>
294                    <span class="n">d</span><span class="p">[</span><span class="s">&#39;free&#39;</span><span class="p">],</span>
295                    <span class="n">d</span><span class="p">[</span><span class="s">&#39;avail&#39;</span><span class="p">],</span>
296                    <span class="n">d</span><span class="p">[</span><span class="s">&#39;</span><span class="si">%u</span><span class="s">sed&#39;</span><span class="p">],</span>
297                <span class="p">),</span>
298                <span class="k">print</span> <span class="n">disk</span>
299</div>
300<div class="viewcode-block" id="epicsdf.df2epics"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.df2epics">[docs]</a>    <span class="k">def</span> <span class="nf">df2epics</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
301        <span class="sd">&#39;&#39;&#39;</span>
302<span class="sd">        Examine a disk partition and if possible, push its info to EPICS.</span>
303<span class="sd">        Get the partition name from the EPICS database.</span>
304
305<span class="sd">        :return: dictionary from :meth:`df` or None</span>
306<span class="sd">        :rtype: dict</span>
307<span class="sd">        &#39;&#39;&#39;</span>
308        <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">df</span><span class="p">()</span>
309        <span class="k">if</span> <span class="n">d</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
310            <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;total&#39;</span><span class="p">,</span> <span class="s">&#39;free&#39;</span><span class="p">,</span> <span class="s">&#39;avail&#39;</span><span class="p">,</span> <span class="s">&#39;used&#39;</span><span class="p">):</span>
311                <span class="bp">self</span><span class="o">.</span><span class="n">caput</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">d</span><span class="p">[</span><span class="n">item</span><span class="p">]</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">toMB</span><span class="p">)</span>
312                <span class="k">if</span> <span class="n">item</span> <span class="o">==</span> <span class="s">&#39;total&#39;</span><span class="p">:</span>
313                    <span class="k">continue</span>
314                <span class="bp">self</span><span class="o">.</span><span class="n">caput</span><span class="p">(</span><span class="n">item</span><span class="o">+</span><span class="s">&quot;:pct&quot;</span><span class="p">,</span> <span class="n">d</span><span class="p">[</span><span class="s">&#39;%&#39;</span><span class="o">+</span><span class="n">item</span><span class="p">])</span>
315        <span class="c">#else:</span>
316        <span class="c">#    # could set some type of red light on the disk PV</span>
317        <span class="c">#    # but no need since we don&#39;t keep this disk as the PV value</span>
318        <span class="c">#    # (code reverts to previous known good value)</span>
319        <span class="c">#    # self.caput(&#39;disk&#39;+&#39;???&#39;, could_not_do_this)</span>
320        <span class="c">#    pass</span>
321        <span class="k">return</span> <span class="n">d</span>
322</div>
323<div class="viewcode-block" id="epicsdf.logger"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.logger">[docs]</a>    <span class="k">def</span> <span class="nf">logger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
324        <span class="sd">&#39;&#39;&#39;</span>
325<span class="sd">        log a report from this class.</span>
326
327<span class="sd">        :param message: words to be logged</span>
328<span class="sd">        :type message: str</span>
329<span class="sd">        &#39;&#39;&#39;</span>
330        <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
331        <span class="n">name</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
332        <span class="n">name</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">name</span><span class="p">)</span>
333        <span class="c"># TODO: Use the Python logging facility?</span>
334        <span class="k">print</span> <span class="s">&quot;(</span><span class="si">%s</span><span class="s">,</span><span class="si">%s</span><span class="s">) </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">now</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
335</div>
336<div class="viewcode-block" id="epicsdf.run"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.run">[docs]</a>    <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
337        <span class="sd">&#39;&#39;&#39;</span>
338<span class="sd">        Run the job periodically -- forever.</span>
339<span class="sd">        &#39;&#39;&#39;</span>
340        <span class="n">epics</span><span class="o">.</span><span class="n">camonitor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prefix</span><span class="o">+</span><span class="s">&#39;period&#39;</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">onPeriodPvChange</span><span class="p">)</span>
341        <span class="n">epics</span><span class="o">.</span><span class="n">camonitor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prefix</span><span class="o">+</span><span class="s">&#39;disk&#39;</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">onDiskPvChange</span><span class="p">)</span>
342        <span class="n">epics</span><span class="o">.</span><span class="n">camonitor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prefix</span><span class="o">+</span><span class="s">&#39;message&#39;</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">onMessagePvChange</span><span class="p">)</span>
343        <span class="n">epics</span><span class="o">.</span><span class="n">camonitor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prefix</span><span class="o">+</span><span class="s">&#39;email_list&#39;</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">onEmailsPvChange</span><span class="p">)</span>
344        <span class="n">epics</span><span class="o">.</span><span class="n">camonitor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prefix</span><span class="o">+</span><span class="s">&#39;alarm&#39;</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">onAlarmPvChange</span><span class="p">)</span>
345
346        <span class="bp">self</span><span class="o">.</span><span class="n">next_update</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="c"># force an immediate update</span>
347        <span class="n">poll_time_s</span> <span class="o">=</span> <span class="mf">0.1</span>
348        <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
349            <span class="k">if</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">next_update</span><span class="p">:</span>
350                <span class="bp">self</span><span class="o">.</span><span class="n">doPeriodicUpdate</span><span class="p">()</span>
351            <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">poll_time_s</span><span class="p">)</span>
352            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">trigger_sendmail</span><span class="p">:</span>
353                <span class="k">try</span><span class="p">:</span>
354                    <span class="bp">self</span><span class="o">.</span><span class="n">sendMail</span><span class="p">()</span>
355                <span class="k">except</span><span class="p">:</span>
356                    <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span><span class="s">&#39;email problem: &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()))</span>
357</div>
358<div class="viewcode-block" id="epicsdf.doPeriodicUpdate"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.doPeriodicUpdate">[docs]</a>    <span class="k">def</span> <span class="nf">doPeriodicUpdate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
359        <span class="sd">&#39;&#39;&#39;</span>
360<span class="sd">        Do the work of the periodic update,</span>
361<span class="sd">        getting the results of :meth:`df` </span>
362<span class="sd">       (with ``self.disk`` as the argument)</span>
363<span class="sd">        and pushing the values up to the EPICS PVs.</span>
364<span class="sd">        Then, set the time of the next update.</span>
365
366<span class="sd">        :note: Several PV changes can force an update to happen.</span>
367<span class="sd">            See the on... methods (callback handlers) for details.</span>
368<span class="sd">        &#39;&#39;&#39;</span>
369        <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">df2epics</span><span class="p">()</span>
370        <span class="k">try</span><span class="p">:</span>
371           
372            <span class="k">if</span> <span class="n">d</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
373                <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span><span class="s">&quot;df(</span><span class="si">%s</span><span class="s">) failed&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">caget</span><span class="p">(</span><span class="s">&#39;disk&#39;</span><span class="p">))</span>
374            <span class="k">else</span><span class="p">:</span>
375                <span class="c">#self.logger(&quot;df: updated&quot;)</span>
376                <span class="bp">self</span><span class="o">.</span><span class="n">space</span> <span class="o">=</span> <span class="n">d</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
377        <span class="k">except</span><span class="p">:</span>
378            <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">())</span>
379        <span class="bp">self</span><span class="o">.</span><span class="n">next_update</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">period</span>
380</div>
381<div class="viewcode-block" id="epicsdf.onAlarmPvChange"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.onAlarmPvChange">[docs]</a>    <span class="k">def</span> <span class="nf">onAlarmPvChange</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pvname</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">host</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kws</span><span class="p">):</span>
382        <span class="sd">&#39;&#39;&#39;</span>
383<span class="sd">        callback handler:</span>
384<span class="sd">        Respond to camonitor on the alarm PV.</span>
385<span class="sd">        Trigger to send an email message.</span>
386
387<span class="sd">        :param pvname: monitored EPICS process variable name</span>
388<span class="sd">        :type pvname: str</span>
389<span class="sd">        :param value: value of EPICS process variable</span>
390<span class="sd">        :param host: computer host name where the IOC resides</span>
391<span class="sd">        :type host: str</span>
392<span class="sd">        :param kws: PyEPICS keyword dictionary for callback functions</span>
393<span class="sd">        :type kws: dict</span>
394<span class="sd">        &#39;&#39;&#39;</span>
395        <span class="bp">self</span><span class="o">.</span><span class="n">alarm</span> <span class="o">=</span> <span class="n">value</span>
396        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span><span class="s">&quot;onAlarmPvChange: value: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">value</span> <span class="p">)</span>
397        <span class="bp">self</span><span class="o">.</span><span class="n">trigger_sendmail</span> <span class="o">=</span> <span class="bp">True</span>
398</div>
399<div class="viewcode-block" id="epicsdf.onDiskPvChange"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.onDiskPvChange">[docs]</a>    <span class="k">def</span> <span class="nf">onDiskPvChange</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pvname</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">host</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kws</span><span class="p">):</span>
400        <span class="sd">&#39;&#39;&#39;</span>
401<span class="sd">        callback handler:</span>
402<span class="sd">        Respond to camonitor on the disk PV.</span>
403
404<span class="sd">        :param pvname: monitored EPICS process variable name</span>
405<span class="sd">        :type pvname: str</span>
406<span class="sd">        :param value: value of EPICS process variable</span>
407<span class="sd">        :param host: computer host name where the IOC resides</span>
408<span class="sd">        :type host: str</span>
409<span class="sd">        :param kws: PyEPICS keyword dictionary for callback functions</span>
410<span class="sd">        :type kws: dict</span>
411
412<span class="sd">        :note: An acceptable change of disk partition forces an update.</span>
413<span class="sd">        &#39;&#39;&#39;</span>
414        <span class="n">newdisk</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">wf2str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
415        <span class="n">fmt</span> <span class="o">=</span> <span class="s">&quot;self.onDiskPvChange: pvname: </span><span class="si">%s</span><span class="s">, value: </span><span class="si">%s</span><span class="s">, host: </span><span class="si">%s</span><span class="s">&quot;</span>
416        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span><span class="n">fmt</span> <span class="o">%</span> <span class="p">(</span><span class="n">pvname</span><span class="p">,</span> <span class="n">newdisk</span><span class="p">,</span> <span class="n">host</span><span class="p">)</span> <span class="p">)</span>
417        <span class="n">olddisk</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">disk</span>
418        <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">newdisk</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">df</span><span class="p">(</span><span class="n">newdisk</span><span class="p">)</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
419            <span class="bp">self</span><span class="o">.</span><span class="n">caput</span><span class="p">(</span><span class="s">&#39;disk&#39;</span><span class="p">,</span> <span class="n">olddisk</span><span class="p">)</span>
420            <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span> <span class="s">&quot;restored previous value: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">olddisk</span> <span class="p">)</span>
421        <span class="k">else</span><span class="p">:</span>
422            <span class="bp">self</span><span class="o">.</span><span class="n">next_update</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="c"># force an immediate update</span>
423        <span class="bp">self</span><span class="o">.</span><span class="n">disk</span> <span class="o">=</span> <span class="n">newdisk</span>
424</div>
425<div class="viewcode-block" id="epicsdf.onMessagePvChange"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.onMessagePvChange">[docs]</a>    <span class="k">def</span> <span class="nf">onMessagePvChange</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pvname</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">host</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kws</span><span class="p">):</span>
426        <span class="sd">&#39;&#39;&#39;</span>
427<span class="sd">        callback handler:</span>
428<span class="sd">        Respond to camonitor on the message PV.</span>
429
430<span class="sd">        :param pvname: monitored EPICS process variable name</span>
431<span class="sd">        :type pvname: str</span>
432<span class="sd">        :param value: value of EPICS process variable</span>
433<span class="sd">        :param host: computer host name where the IOC resides</span>
434<span class="sd">        :type host: str</span>
435<span class="sd">        :param kws: PyEPICS keyword dictionary for callback functions</span>
436<span class="sd">        :type kws: dict</span>
437<span class="sd">        &#39;&#39;&#39;</span>
438        <span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">wf2str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
439        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span> <span class="s">&quot;message changed: </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">wf2str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="p">)</span>
440</div>
441<div class="viewcode-block" id="epicsdf.onEmailsPvChange"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.onEmailsPvChange">[docs]</a>    <span class="k">def</span> <span class="nf">onEmailsPvChange</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pvname</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">host</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kws</span><span class="p">):</span>
442        <span class="sd">&#39;&#39;&#39;</span>
443<span class="sd">        callback handler:</span>
444<span class="sd">        Respond to camonitor on the email_list PV.</span>
445
446<span class="sd">        :param pvname: monitored EPICS process variable name</span>
447<span class="sd">        :type pvname: str</span>
448<span class="sd">        :param value: value of EPICS process variable</span>
449<span class="sd">        :param host: computer host name where the IOC resides</span>
450<span class="sd">        :type host: str</span>
451<span class="sd">        :param kws: PyEPICS keyword dictionary for callback functions</span>
452<span class="sd">        :type kws: dict</span>
453<span class="sd">        &#39;&#39;&#39;</span>
454        <span class="bp">self</span><span class="o">.</span><span class="n">email_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">wf2str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
455        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span> <span class="s">&quot;email list changed: </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">wf2str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="p">)</span>
456</div>
457<div class="viewcode-block" id="epicsdf.onPeriodPvChange"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.onPeriodPvChange">[docs]</a>    <span class="k">def</span> <span class="nf">onPeriodPvChange</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pvname</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">host</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kws</span><span class="p">):</span>
458        <span class="sd">&#39;&#39;&#39;</span>
459<span class="sd">        callback handler:</span>
460<span class="sd">        Respond to camonitor on the period PV.</span>
461
462<span class="sd">        :param pvname: monitored EPICS process variable name</span>
463<span class="sd">        :type pvname: str</span>
464<span class="sd">        :param value: value of EPICS process variable</span>
465<span class="sd">        :param host: computer host name where the IOC resides</span>
466<span class="sd">        :type host: str</span>
467<span class="sd">        :param kws: PyEPICS keyword dictionary for callback functions</span>
468<span class="sd">        :type kws: dict</span>
469
470<span class="sd">        :note: An acceptable change of period forces an update.</span>
471<span class="sd">        &#39;&#39;&#39;</span>
472        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">isValidPeriod</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
473            <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span> <span class="s">&quot;restored previous period: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">period</span><span class="p">)</span> <span class="p">)</span>
474            <span class="bp">self</span><span class="o">.</span><span class="n">caput</span><span class="p">(</span><span class="s">&#39;period&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">period</span><span class="p">)</span>
475        <span class="k">else</span><span class="p">:</span>
476            <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span> <span class="s">&quot;new period: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="p">)</span>
477            <span class="bp">self</span><span class="o">.</span><span class="n">setPeriod</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
478            <span class="bp">self</span><span class="o">.</span><span class="n">next_update</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="c"># force an immediate update</span>
479</div>
480<div class="viewcode-block" id="epicsdf.isValidPeriod"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.isValidPeriod">[docs]</a>    <span class="k">def</span> <span class="nf">isValidPeriod</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
481        <span class="sd">&#39;&#39;&#39;</span>
482<span class="sd">        check that the given value is valid to be used as a period</span>
483
484<span class="sd">        :param value: candidate value of period,</span>
485<span class="sd">            must be 1.0 or greater AND an int or a float</span>
486<span class="sd">        :type value: int or float</span>
487<span class="sd">        :rtype: bool</span>
488<span class="sd">        &#39;&#39;&#39;</span>
489        <span class="k">return</span> <span class="n">value</span> <span class="o">&gt;=</span> <span class="mf">1.0</span> <span class="ow">and</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="ow">in</span> <span class="p">(</span> <span class="nb">type</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span> <span class="nb">type</span><span class="p">(</span><span class="mf">10.0</span><span class="p">)</span> <span class="p">)</span>
490</div>
491<div class="viewcode-block" id="epicsdf.sendMail"><a class="viewcode-back" href="../src/epicsdf.html#epicsdf.epicsdf.sendMail">[docs]</a>    <span class="k">def</span> <span class="nf">sendMail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
492        <span class="sd">&#39;&#39;&#39;</span>
493<span class="sd">        send an email message when called</span>
494<span class="sd">        &#39;&#39;&#39;</span>
495        <span class="bp">self</span><span class="o">.</span><span class="n">trigger_sendmail</span> <span class="o">=</span> <span class="bp">False</span>
496        <span class="n">subject</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">alarm</span><span class="p">))</span>
497        <span class="c"># option: limit length to 140 char (SMS length)?</span>
498        <span class="n">message</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
499        <span class="n">message</span> <span class="o">+=</span> <span class="s">&#39;host: </span><span class="si">%s</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span><span class="p">()</span>
500        <span class="n">message</span> <span class="o">+=</span> <span class="s">&#39;partition: </span><span class="si">%s</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">disk</span>
501        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;total&#39;</span><span class="p">,</span> <span class="s">&#39;used&#39;</span><span class="p">,</span> <span class="s">&#39;avail&#39;</span><span class="p">):</span>
502            <span class="k">if</span> <span class="n">item</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">space</span><span class="p">:</span>
503                <span class="n">message</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="si">%s</span><span class="s">: </span><span class="si">%.3f</span><span class="s"> MB&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">space</span><span class="p">[</span><span class="n">item</span><span class="p">]</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">toMB</span><span class="p">)</span>
504                <span class="k">if</span> <span class="n">item</span> <span class="o">!=</span> <span class="s">&#39;total&#39;</span><span class="p">:</span>
505                    <span class="n">message</span> <span class="o">+=</span> <span class="s">&#39; (</span><span class="si">%g%%</span><span class="s">)&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">space</span><span class="p">[</span><span class="s">&#39;%&#39;</span><span class="o">+</span><span class="n">item</span><span class="p">]</span>
506                <span class="n">message</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
507        <span class="n">message</span> <span class="o">+=</span> <span class="s">&#39;date: </span><span class="si">%s</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
508        <span class="n">message</span> <span class="o">+=</span> <span class="s">&#39;program: </span><span class="si">%s</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
509        <span class="n">message</span> <span class="o">+=</span> <span class="s">&#39;EPICS database: </span><span class="si">%s</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix</span>
510
511        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span><span class="s">&quot;sending email to: &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">email_list</span><span class="p">)</span>
512        <span class="c"># send the message</span>
513        <span class="n">messageFile</span> <span class="o">=</span> <span class="s">&quot;/tmp/epicsdf_email.txt&quot;</span>
514        <span class="n">pvMailMsg</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">messageFile</span><span class="p">,</span> <span class="s">&quot;w&quot;</span><span class="p">)</span>
515        <span class="n">pvMailMsg</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
516        <span class="n">pvMailMsg</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
517
518        <span class="n">cmd_fmt</span> <span class="o">=</span> <span class="s">&#39;&#39;&#39;mail -s &quot;</span><span class="si">%s</span><span class="s">&quot; -r </span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s"> &lt; </span><span class="si">%s</span><span class="s">&#39;&#39;&#39;</span>
519        <span class="k">for</span> <span class="n">who</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">email_list</span><span class="o">.</span><span class="n">split</span><span class="p">():</span>
520            <span class="c"># send a message to each recipient</span>
521            <span class="n">cmd</span> <span class="o">=</span> <span class="n">cmd_fmt</span> <span class="o">%</span> <span class="p">(</span> <span class="n">subject</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sender</span><span class="p">,</span> <span class="n">who</span><span class="p">,</span> <span class="n">messageFile</span> <span class="p">)</span>
522            <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span> <span class="n">cmd</span> <span class="p">)</span>
523            <span class="n">os</span><span class="o">.</span><span class="n">popen</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
524
525<span class="c">############# ############# ############# ############# #############</span>
526
527</div></div>
528<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span>
529    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
530        <span class="n">database_prefix</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
531    <span class="k">else</span><span class="p">:</span>
532        <span class="n">database_prefix</span> <span class="o">=</span> <span class="s">&#39;prj:p300:df:&#39;</span>
533    <span class="n">df</span> <span class="o">=</span> <span class="n">epicsdf</span><span class="p">(</span><span class="n">database_prefix</span><span class="p">)</span>
534    <span class="c">#df.demo()               # for development only</span>
535    <span class="n">df</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
536</pre></div>
537
538          </div>
539        </div>
540      </div>
541      <div class="clearer"></div>
542    </div>
543    <div class="related">
544      <h3>Navigation</h3>
545      <ul>
546        <li class="right" style="margin-right: 10px">
547          <a href="../genindex.html" title="General Index"
548             >index</a></li>
549        <li class="right" >
550          <a href="../py-modindex.html" title="Python Module Index"
551             >modules</a> |</li>
552        <li><a href="../index.html">epicsdf 1.0 documentation</a> &raquo;</li>
553          <li><a href="index.html" >Module code</a> &raquo;</li> 
554      </ul>
555    </div>
556    <div class="footer">
557        &copy; Copyright 2011, Pete Jemian.
558      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
559    </div>
560  </body>
561</html>
Note: See TracBrowser for help on using the repository browser.