1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
\r
2 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
\r
3 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
\r
5 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
\r
6 <meta name="generator" content="AsciiDoc 8.6.9" />
\r
7 <title>Psensor README</title>
\r
8 <style type="text/css">
\r
11 background: #e2e2e2;
\r
13 font-family: Ubuntu,Arial,sans-serif;
\r
15 font-weight: lighter;
\r
16 margin: 1em 2em 2em 2em;
\r
22 margin: 0 0 0.267em 0;
\r
24 font-weight: normal;
\r
29 margin: 0 0 0.375em;
\r
31 font-weight: normal;
\r
36 margin: 0 0 0.522em;
\r
38 font-weight: normal;
\r
43 margin: 0 0 0.615em;
\r
45 font-weight: normal;
\r
56 font-weight: normal;
\r
58 letter-spacing: 0.1em;
\r
59 margin: 0 0 0.923em;
\r
60 text-transform: uppercase;
\r
80 text-decoration: none;
\r
84 text-decoration: underline;
\r
88 font-family: "Ubuntu Mono","Courier New",Courier,monospace;
\r
89 font-weight: normal;
\r
94 background: none repeat scroll 0 0 #e0e0e0;
\r
96 padding: 0.5em 0.5em;
\r
98 white-space: pre-wrap;
\r
99 word-wrap: break-word;
\r
110 font-weight: lighter;
\r
121 background: #ffffff;
\r
123 -moz-box-sizing: border-box;
\r
125 padding: 2em 2em 2em 2em;
\r
127 -moz-border-radius: 4px;
\r
128 -webkit-border-radius: 4px;
\r
129 border-radius: 4px;
\r
131 -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;
\r
132 box-shadow: 0 2px 2px 0 #C2C2C2;
\r
136 background: #ffffff;
\r
137 -moz-box-sizing: border-box;
\r
138 padding: 2em 2em 2em 2em;
\r
140 -moz-border-radius: 4px;
\r
141 -webkit-border-radius: 4px;
\r
142 border-radius: 4px;
\r
144 -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;
\r
145 box-shadow: 0 2px 2px 0 #C2C2C2;
\r
148 #menu-list, #menu-list > li > ul {
\r
149 list-style-type: none;
\r
152 /* menu on left col, content on right col */
\r
167 margin: 0em 0em 2em 0em;
\r
169 background: #ffffff;
\r
170 -moz-box-sizing: border-box;
\r
171 padding: 2em 2em 2em 2em;
\r
173 -moz-border-radius: 4px;
\r
174 -webkit-border-radius: 4px;
\r
175 border-radius: 4px;
\r
177 -webkit-box-shadow: 0 2px 2px 0 #C2C2C2;
\r
178 box-shadow: 0 2px 2px 0 #C2C2C2;
\r
183 <script type="text/javascript">
\r
185 var asciidoc = { // Namespace.
\r
187 /////////////////////////////////////////////////////////////////////
\r
188 // Table Of Contents generator
\r
189 /////////////////////////////////////////////////////////////////////
\r
191 /* Author: Mihai Bazon, September 2002
\r
192 * http://students.infoiasi.ro/~mishoo
\r
194 * Table Of Content generator
\r
197 * Feel free to use this script under the terms of the GNU General Public
\r
198 * License, as long as you do not remove or alter this notice.
\r
201 /* modified by Troy D. Hanson, September 2006. License: GPL */
\r
202 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
\r
204 // toclevels = 1..4.
\r
205 toc: function (toclevels) {
\r
207 function getText(el) {
\r
209 for (var i = el.firstChild; i != null; i = i.nextSibling) {
\r
210 if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
\r
212 else if (i.firstChild != null)
\r
213 text += getText(i);
\r
218 function TocEntry(el, text, toclevel) {
\r
221 this.toclevel = toclevel;
\r
224 function tocEntries(el, toclevels) {
\r
225 var result = new Array;
\r
226 var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
\r
227 // Function that scans the DOM tree for header elements (the DOM2
\r
228 // nodeIterator API would be a better technique but not supported by all
\r
230 var iterate = function (el) {
\r
231 for (var i = el.firstChild; i != null; i = i.nextSibling) {
\r
232 if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
\r
233 var mo = re.exec(i.tagName);
\r
234 if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
\r
235 result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
\r
245 var toc = document.getElementById("toc");
\r
250 // Delete existing TOC entries in case we're reloading the TOC.
\r
251 var tocEntriesToRemove = [];
\r
253 for (i = 0; i < toc.childNodes.length; i++) {
\r
254 var entry = toc.childNodes[i];
\r
255 if (entry.nodeName.toLowerCase() == 'div'
\r
256 && entry.getAttribute("class")
\r
257 && entry.getAttribute("class").match(/^toclevel/))
\r
258 tocEntriesToRemove.push(entry);
\r
260 for (i = 0; i < tocEntriesToRemove.length; i++) {
\r
261 toc.removeChild(tocEntriesToRemove[i]);
\r
264 // Rebuild TOC entries.
\r
265 var entries = tocEntries(document.getElementById("content"), toclevels);
\r
266 for (var i = 0; i < entries.length; ++i) {
\r
267 var entry = entries[i];
\r
268 if (entry.element.id == "")
\r
269 entry.element.id = "_toc_" + i;
\r
270 var a = document.createElement("a");
\r
271 a.href = "#" + entry.element.id;
\r
272 a.appendChild(document.createTextNode(entry.text));
\r
273 var div = document.createElement("div");
\r
274 div.appendChild(a);
\r
275 div.className = "toclevel" + entry.toclevel;
\r
276 toc.appendChild(div);
\r
278 if (entries.length == 0)
\r
279 toc.parentNode.removeChild(toc);
\r
283 /////////////////////////////////////////////////////////////////////
\r
284 // Footnotes generator
\r
285 /////////////////////////////////////////////////////////////////////
\r
287 /* Based on footnote generation code from:
\r
288 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
\r
291 footnotes: function () {
\r
292 // Delete existing footnote entries in case we're reloading the footnodes.
\r
294 var noteholder = document.getElementById("footnotes");
\r
298 var entriesToRemove = [];
\r
299 for (i = 0; i < noteholder.childNodes.length; i++) {
\r
300 var entry = noteholder.childNodes[i];
\r
301 if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
\r
302 entriesToRemove.push(entry);
\r
304 for (i = 0; i < entriesToRemove.length; i++) {
\r
305 noteholder.removeChild(entriesToRemove[i]);
\r
308 // Rebuild footnote entries.
\r
309 var cont = document.getElementById("content");
\r
310 var spans = cont.getElementsByTagName("span");
\r
313 for (i=0; i<spans.length; i++) {
\r
314 if (spans[i].className == "footnote") {
\r
316 var note = spans[i].getAttribute("data-note");
\r
318 // Use [\s\S] in place of . so multi-line matches work.
\r
319 // Because JavaScript has no s (dotall) regex flag.
\r
320 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
\r
321 spans[i].innerHTML =
\r
322 "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
\r
323 "' title='View footnote' class='footnote'>" + n + "</a>]";
\r
324 spans[i].setAttribute("data-note", note);
\r
326 noteholder.innerHTML +=
\r
327 "<div class='footnote' id='_footnote_" + n + "'>" +
\r
328 "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
\r
329 n + "</a>. " + note + "</div>";
\r
330 var id =spans[i].getAttribute("id");
\r
331 if (id != null) refs["#"+id] = n;
\r
335 noteholder.parentNode.removeChild(noteholder);
\r
337 // Process footnoterefs.
\r
338 for (i=0; i<spans.length; i++) {
\r
339 if (spans[i].className == "footnoteref") {
\r
340 var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
\r
341 href = href.match(/#.*/)[0]; // Because IE return full URL.
\r
343 spans[i].innerHTML =
\r
344 "[<a href='#_footnote_" + n +
\r
345 "' title='View footnote' class='footnote'>" + n + "</a>]";
\r
351 install: function(toclevels) {
\r
354 function reinstall() {
\r
355 asciidoc.footnotes();
\r
357 asciidoc.toc(toclevels);
\r
361 function reinstallAndRemoveTimer() {
\r
362 clearInterval(timerId);
\r
366 timerId = setInterval(reinstall, 500);
\r
367 if (document.addEventListener)
\r
368 document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
\r
370 window.onload = reinstallAndRemoveTimer;
\r
374 asciidoc.install(2);
\r
378 <body class="article">
\r
380 <h1>Psensor README</h1>
\r
382 <div id="toctitle">Table of Contents</div>
383 <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
387 <div class="sect1">
\r
388 <h2 id="_introduction">1. Introduction</h2>
\r
389 <div class="sectionbody">
\r
390 <div class="paragraph"><p>Psensor is a graphical hardware monitoring application for Linux.</p></div>
\r
391 <div class="paragraph"><p>It draws realtime charts and raises alerts about:</p></div>
\r
392 <div class="ulist"><ul>
\r
395 the temperature of the motherboard and CPU sensors (using
\r
401 the temperature of the NVidia GPUs (using XNVCtrl).
\r
406 the temperature of the Hard Disk Drives (using hddtemp or libatasmart).
\r
411 the rotation speed of the fans (using lm-sensors).
\r
416 the temperature of a remote computer.
\r
425 <div class="paragraph"><p>Alerts are using Desktop Notification and a specific GTK+ status icon.</p></div>
\r
426 <div class="paragraph"><p>For Ubuntu users, Psensor is providing an Application Indicator which turns
\r
427 red under alert and a menu for quickly check all sensors.</p></div>
\r
428 <div class="paragraph"><p>It is possible to monitor remotely a computer:</p></div>
\r
429 <div class="ulist"><ul>
\r
432 start <code>psensor-server</code> on the remote computer.
\r
437 start <code>psensor</code> using: <code>psensor --url=http://hostname:3131</code>.
\r
441 <div class="paragraph"><p><code>psensor-server</code> is a minimal Web server, a Web browser can be used to
\r
442 monitor the remote computer by opening the URL:
\r
443 <code>http://hostname:3131</code>.</p></div>
\r
444 <div class="admonitionblock">
\r
447 <div class="title">Warning</div>
\r
449 <td class="content"><code>psensor-server</code> does not provide any way to restrict the connection
\r
450 to the HTTP server, worst, no effort has been made against malicious
\r
451 HTTP attacks. You should make the <code>psensor-server</code> port available
\r
452 only to a network or computer you trust by using the usual network
\r
453 security tools of the system (for example:
\r
454 <a href="http://www.netfilter.org/projects/iptables/index.html">iptables</a>).</td>
\r
459 <div class="sect1">
\r
460 <h2 id="_installation_using_distribution_packages">2. Installation Using Distribution Packages</h2>
\r
461 <div class="sectionbody">
\r
462 <div class="sect2">
\r
463 <h3 id="_debian">2.1. Debian</h3>
\r
464 <div class="paragraph"><p>For Debian, the binary and source packages are available in the
\r
465 Wheezy, unstable and testing repositories.</p></div>
\r
466 <div class="paragraph"><p>Debian package information is available at:
\r
467 <a href="http://packages.qa.debian.org/p/psensor.html">http://packages.qa.debian.org/p/psensor.html</a>.</p></div>
\r
468 <div class="paragraph"><p>To do the installation:</p></div>
\r
469 <div class="listingblock">
\r
470 <div class="content">
\r
471 <pre><code>sudo apt-get install psensor psensor-server</code></pre>
\r
474 <div class="sect2">
\r
475 <h3 id="_ubuntu">2.2. Ubuntu</h3>
\r
476 <div class="paragraph"><p>Since Ubuntu Oneiric (11.10), psensor is available in the universe
\r
477 repository of Ubuntu.</p></div>
\r
478 <div class="paragraph"><p>To install <code>psensor</code> or <code>psensor-server</code>:</p></div>
\r
479 <div class="listingblock">
\r
480 <div class="content">
\r
481 <pre><code>sudo apt-get install psensor
\r
482 sudo apt-get install psensor-server</code></pre>
\r
484 <div class="paragraph"><p>Or search them in the Ubuntu Software Center.</p></div>
\r
485 <div class="paragraph"><p>For other Ubuntu releases or user the more recent release, the easiest
\r
486 way is to use the dedicated PPA.</p></div>
\r
487 <div class="paragraph"><p>Last stable version:</p></div>
\r
488 <div class="listingblock">
\r
489 <div class="content">
\r
490 <pre><code>sudo apt-get apt-add-repository ppa:/jfi/psensor
\r
491 sudo apt-get update
\r
492 sudo apt-get install psensor
\r
493 sudo apt-get install psensor-server</code></pre>
\r
495 <div class="paragraph"><p>Last development version which should not contain major bugs:</p></div>
\r
496 <div class="listingblock">
\r
497 <div class="content">
\r
498 <pre><code>sudo apt-get apt-add-repository ppa:/jfi/psensor-unstable
\r
499 sudo apt-get update
\r
500 sudo apt-get install psensor
\r
501 sudo apt-get install psensor-server</code></pre>
\r
503 <div class="paragraph"><p>Daily trunk build which may contain major bugs and partialy
\r
504 implemented features:</p></div>
\r
505 <div class="listingblock">
\r
506 <div class="content">
\r
507 <pre><code>sudo apt-get apt-add-repository ppa:/jfi/psensor-daily-trunk
\r
508 sudo apt-get update
\r
509 sudo apt-get install psensor
\r
510 sudo apt-get install psensor-server</code></pre>
\r
515 <div class="sect1">
\r
516 <h2 id="_installation_from_source_archive">3. Installation From Source Archive</h2>
\r
517 <div class="sectionbody">
\r
518 <div class="paragraph"><p><code>psensor</code> and <code>psensor-server</code> can be compiled and installed on any
\r
519 modern GNU/Linux distribution.</p></div>
\r
520 <div class="sect2">
\r
521 <h3 id="_compilation_prerequisites">3.1. Compilation Prerequisites</h3>
\r
522 <div class="paragraph"><p>The compilation of <code>psensor</code> requires:</p></div>
\r
523 <div class="ulist"><ul>
\r
546 library gtk3 >=3.4
\r
556 asciidoc (optional, required to produce the html version of the
\r
562 cppcheck (optional, static source checker)
\r
567 library libnotify (optional)
\r
572 library libappindicator (optional)
\r
577 library libXNVCtrl (optional)
\r
582 library json-c >= 0.11.99 and curl (optional, required for remote monitoring)
\r
587 library unity (>=v3.4.2, optional)
\r
592 library gtop2 (optional, required for CPU usage)
\r
597 library atasmart (optional, for disk monitoring)
\r
601 <div class="paragraph"><p>The specific requirements for <code>psensor-server</code>:</p></div>
\r
602 <div class="ulist"><ul>
\r
605 library libmicrohttpd
\r
615 <div class="sect2">
\r
616 <h3 id="_compilation_and_installation_steps">3.2. Compilation and Installation Steps</h3>
\r
617 <div class="olist arabic"><ol class="arabic">
\r
620 download the source archive from: <a href="http://wpitchoune.net/psensor/files">http://wpitchoune.net/psensor/files</a>
\r
625 Extract files from the source archive
\r
630 Compilation: <code>./configure;make clean all</code>
\r
635 Installation: <code>make install</code> (require to have root permission)
\r
640 Start the sensor detection script: <code>sensors-detect</code> and follows the
\r
641 instructions. Reboot or activate the kernel modules which have
\r
647 To monitor HDDs, the <code>hddtemp</code> daemon must be installed and running.
\r
652 Run: <code>psensor</code>
\r
657 <div class="sect2">
\r
658 <h3 id="_ati_amd_gpu_support">3.3. ATI/AMD GPU Support</h3>
\r
659 <div class="paragraph"><p>When the OpenSource ATI driver is used, the monitoring
\r
660 information is available throw lm-sensors and does not require the
\r
661 following instructions.</p></div>
\r
662 <div class="paragraph"><p>When the proprietary ATI driver(Catalyst) is used, the build is
\r
663 requiring an additional library.</p></div>
\r
664 <div class="paragraph"><p>Download the
\r
665 <a href="http://developer.amd.com/sdks/ADLSDK/Pages/default.aspx">ATI ADL SDK</a>
\r
666 and extracts the files of the archive into a directory [dir].</p></div>
\r
667 <div class="paragraph"><p>Replace the step 3. of the above section by <code>./configure
\r
668 --with-libatiadl=[dir]</code> where <code>[dir]</code> must be the directory where you
\r
669 have extracted the ATI ADL SDK. Other steps are indentical.</p></div>
\r
673 <div class="sect1">
\r
674 <h2 id="_contact">4. Contact</h2>
\r
675 <div class="sectionbody">
\r
676 <div class="paragraph"><p>Bugs and comments can be sent to <a href="mailto:jeanfi@gmail.com">jeanfi@gmail.com</a>.</p></div>
\r
677 <div class="paragraph"><p>Home page: <a href="http://wpitchoune.net/psensor">http://wpitchoune.net/psensor</a></p></div>
\r
681 <div id="footnotes"><hr /></div>
\r
683 <div id="footer-text">
\r
684 Last updated 2014-08-23 13:50:12 CEST
\r