From 0d56006f78ec66b231b16e20d1466dc29391221c Mon Sep 17 00:00:00 2001
From: Mattias Andrée <maandree@operamail.com>
Date: Fri, 20 Jun 2014 16:58:39 +0200
Subject: add files
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Mattias Andrée <maandree@operamail.com>
---
 Makefile               |  5 +++--
 TODO                   | 13 -------------
 examples/plugins/files | 34 +++++++++++++++++++++++++++++++++
 src/plugins/files.py   | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 89 insertions(+), 15 deletions(-)
 create mode 100644 examples/plugins/files
 create mode 100644 src/plugins/files.py

diff --git a/Makefile b/Makefile
index 65138b2..f62cafd 100644
--- a/Makefile
+++ b/Makefile
@@ -19,12 +19,13 @@ SRC = __main__ util x
 PLUGINS = chase clock cpuifo cpuonline cpu df discstats ipaddress  \
           kmsg leapsec linereader loadavg lunar mem moc network    \
           pacman snmp snmp6 softirqs solar uname uptime users      \
-          vmstat weather xdisplay xkb alsa dentrystate inodestate
+          vmstat weather xdisplay xkb alsa dentrystate inodestate  \
+          files
 
 PLUGIN_EXAMPLES = chase clock cpu cpuinfo cpuonline df discstats   \
                   ipaddress kmsg loadavg lunar mem moc network     \
                   pacman uname uptime users xdisplay xkb slsa      \
-                  dentrystate inodestate
+                  dentrystate inodestate files
 
 EXAMPLES = clock mixed moderate plugin-test test xmonad
 
diff --git a/TODO b/TODO
index 2d96866..a962db2 100644
--- a/TODO
+++ b/TODO
@@ -36,19 +36,6 @@ List of plugins to implement:
      /proc/net/sockstat6
      /proc/net/wireless
      /sys/class/net/<nic>/duplex (half, full)
-     /proc/sys/fs/file-nr
-         This (read-only) file contains three numbers: the number of allocated
-         file handles (i.e., the number of files presently opened); the number
-         of free file handles; and the maximum number of file handles (i.e.,
-         the same value as /proc/sys/fs/file-max). If the number of allocated
-         file handles is close to the maximum, you should consider increasing
-         the maximum. Before Linux 2.6, the kernel allocated file handles
-         dynamically, but it didn't free them again. Instead the free file
-         handles were kept in a list for reallocation; the "free file handles"
-         value indicates the size of that list. A large number of free file
-         handles indicates that there was a past peak in the usage of open
-         file handles. Since Linux 2.6, the kernel does deallocate freed file
-         handles, and the "free file handles" value is always zero.
 
 Demo plugins:
 
diff --git a/examples/plugins/files b/examples/plugins/files
new file mode 100644
index 0000000..56b69fd
--- /dev/null
+++ b/examples/plugins/files
@@ -0,0 +1,34 @@
+# -*- python -*-
+
+# A xpybar configuration example testing the features of plugins.files
+
+import time
+import threading
+
+from plugins.files import Files
+from plugins.clock import Clock
+
+
+OUTPUT, HEIGHT, YPOS, TOP = 0, 12, 24, True
+
+
+clock = Clock(sync_to = Clock.SECONDS)
+
+start_ = start
+def start():
+    start_()
+    async(lambda : clock.continuous_sync(lambda : bar.invalidate()))
+
+
+def redraw():
+    files_ = Files()
+    
+    data = [('Files', files_.nr_files),
+            ('Free',  files_.nr_free_files),
+            ('Max',   files_.file_max)]
+    
+    text = ' │ '.join('%s: %i' % (text, value) for (text, value) in data)
+    
+    bar.clear()
+    bar.draw_coloured_text(0, 10, 0, 2, text)
+
diff --git a/src/plugins/files.py b/src/plugins/files.py
new file mode 100644
index 0000000..a1d5638
--- /dev/null
+++ b/src/plugins/files.py
@@ -0,0 +1,52 @@
+# -*- python -*-
+'''
+xpybar – xmobar replacement written in python
+Copyright © 2014  Mattias Andrée (maandree@member.fsf.org)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+'''
+
+
+class Files:
+    '''
+    Data from /proc/sys/fs/file-nr
+    
+    @variable  nr_files:int        The number of allocated file handles, i.e.,
+                                   the number of files presently opened
+    @variable  nr_free_files:int   The number of free file handles
+    @variable  file_max:int        The maximum number of file handles
+    
+    If the number of allocated file handles is close to the maximum,
+    you should consider increasing the maximum. Before Linux 2.6, the
+    kernel allocated file handles dynamically, but it didn't free them
+    again. Instead the free file handles were kept in a list for
+    reallocation; the "free file handles" value indicates the size of
+    that list. A large number of free file handles indicates that there
+    was a past peak in the usage of open file handles. Since Linux 2.6,
+    the kernel does deallocate freed file handles, and the "free file
+    handles" value is always zero.
+    '''
+    
+    
+    def __init__(self):
+        '''
+        Constructor
+        '''
+        state = None
+        with open('/proc/sys/fs/file-nr', 'rb') as file:
+            state = file.read()
+        state = state.decode('utf-8', 'replace').replace('\t', ' ')
+        state = [int(field) for field in state.split(' ') if not field == '']
+        (self.nr_files, self.nr_free_files, self.file_max) = state
+
-- 
cgit v1.2.3-70-g09d2