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

Last change on this file since 605 was 605, checked in by jemian, 12 years ago

typos

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