diff --git a/lib/utils/io.py b/lib/utils/io.py index 4c1df6c17b02b5d183c2e35c6e07b9870226875f..413a119c7049c1b4d8016d3b26013079022c60a0 100644 --- a/lib/utils/io.py +++ b/lib/utils/io.py @@ -38,17 +38,22 @@ from ganeti.utils import filelock _RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid" -def ReadFile(file_name, size=-1): +def ReadFile(file_name, size=-1, preread=None): """Reads a file. @type size: int @param size: Read at most size bytes (if negative, entire file) + @type preread: callable receiving file handle as single parameter + @param preread: Function called before file is read @rtype: str @return: the (possibly partial) content of the file """ f = open(file_name, "r") try: + if preread: + preread(f) + return f.read(size) finally: f.close() diff --git a/test/ganeti.utils.io_unittest.py b/test/ganeti.utils.io_unittest.py index ed67f6898840a64fa1e5ebbb59b168ce286fa413..be1b4abb65c1460f8b62332616502c1bcf167e51 100755 --- a/test/ganeti.utils.io_unittest.py +++ b/test/ganeti.utils.io_unittest.py @@ -55,6 +55,12 @@ class TestReadFile(testutils.GanetiTestCase): h.update(data) self.assertEqual(h.hexdigest(), "893772354e4e690b9efd073eed433ce7") + def testCallback(self): + def _Cb(fh): + self.assertEqual(fh.tell(), 0) + data = utils.ReadFile(self._TestDataFilename("cert1.pem"), preread=_Cb) + self.assertEqual(len(data), 814) + def testError(self): self.assertRaises(EnvironmentError, utils.ReadFile, "/dev/null/does-not-exist")