From d1de6c5fa3bf7406ff78457b740040d1aeb93109 Mon Sep 17 00:00:00 2001 From: David Wahlstrom Date: Fri, 6 May 2016 08:45:34 -0700 Subject: [PATCH 1/2] openfiles: module to report open file handle count This module will display the current open file handles and the kernel setting for max open file handles. This is particularly useful when running applications that like to grab a lot of file handles to help monitor if/when your system may run out of available file handles. --- i3pystatus/openfiles.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 i3pystatus/openfiles.py diff --git a/i3pystatus/openfiles.py b/i3pystatus/openfiles.py new file mode 100644 index 0000000..0afb43e --- /dev/null +++ b/i3pystatus/openfiles.py @@ -0,0 +1,30 @@ +from i3pystatus import IntervalModule + + +class Openfiles(IntervalModule): + """ + Displays the current/max open files. + """ + + settings = ( + ("filenr_path", "Location to file-nr (usually /proc/sys/fs/file-nr"), + "color", + "format" + ) + color = 'FFFFFF' + interval = 30 + filenr_path = '/proc/sys/fs/file-nr' + format = "open/max: {openfiles}/{maxfiles}" + + def run(self): + + cur_filenr = open(self.filenr_path, 'r').readlines() + openfiles, unused, maxfiles = cur_filenr[0].split() + + cdict = {'openfiles': openfiles, + 'maxfiles': maxfiles} + + self.output = { + "full_text": self.format.format(**cdict), + "color": self.color + } From 12c74674f254f41063cebe017c2250e0be8bfdde Mon Sep 17 00:00:00 2001 From: David Wahlstrom Date: Fri, 6 May 2016 09:12:33 -0700 Subject: [PATCH 2/2] openfiles: add tests and close files Added a functional test and included a close() call on files that are opened when the module/test run. --- i3pystatus/openfiles.py | 5 +++-- tests/test_openfiles.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 tests/test_openfiles.py diff --git a/i3pystatus/openfiles.py b/i3pystatus/openfiles.py index 0afb43e..cc7a7d1 100644 --- a/i3pystatus/openfiles.py +++ b/i3pystatus/openfiles.py @@ -18,8 +18,9 @@ class Openfiles(IntervalModule): def run(self): - cur_filenr = open(self.filenr_path, 'r').readlines() - openfiles, unused, maxfiles = cur_filenr[0].split() + cur_filenr = open(self.filenr_path, 'r') + openfiles, unused, maxfiles = cur_filenr.readlines()[0].split() + cur_filenr.close() cdict = {'openfiles': openfiles, 'maxfiles': maxfiles} diff --git a/tests/test_openfiles.py b/tests/test_openfiles.py new file mode 100644 index 0000000..737fe8a --- /dev/null +++ b/tests/test_openfiles.py @@ -0,0 +1,29 @@ +""" +Basic test for the openfiles module +""" + +import unittest +from tempfile import TemporaryDirectory +from shutil import copyfile +from i3pystatus import openfiles + + +class OpenfilesTest(unittest.TestCase): + + def test_openfiles(self): + """ + Test output of open files + """ + # copy file-nr so we have a known/unchanged source file + with TemporaryDirectory() as tmpdirname: + copyfile('/proc/sys/fs/file-nr', tmpdirname + '/file-nr') + cur_filenr = open(tmpdirname + '/file-nr', 'r') + openfilehandles, ununsed, maxfiles = cur_filenr.readlines()[0].split() + cur_filenr.close() + i3openfiles = openfiles.Openfiles(filenr_path=tmpdirname + '/file-nr') + i3openfiles.run() + self.assertTrue(i3openfiles.output['full_text'] == 'open/max: %s/%s' % (openfilehandles, maxfiles)) + + +if __name__ == '__main__': + unittest.main()