File add-check-for-tmpfiles-created-at-r.diff of Package rpmlint

From: Ludwig Nussel <ludwig.nussel@suse.de>
Date: Fri, 5 Sep 2014 12:53:40 +0200
Subject: [PATCH] add check for tmpfiles created at runtime

this check parses files in /usr/lib/tmpfiles.d and verifies that entries
that create files or directories are actually listed in %files.
---
 TmpFilesCheck.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 76 insertions(+)
 create mode 100644 TmpFilesCheck.py

diff --git a/TmpFilesCheck.py b/TmpFilesCheck.py
new file mode 100644
index 0000000..8c4db8d
--- /dev/null
+++ b/TmpFilesCheck.py
@@ -0,0 +1,76 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+# File          : TmpFilesCheck.py
+# Package       : rpmlint
+# Author        : Ludwig Nussel
+# Created on    : Wed Sep 03 10:36 2014
+# Purpose       : Check systemd created tmpfiles are included in filelist
+#############################################################################
+
+import os
+import re
+
+from Filter import addDetails, printError, printWarning
+import AbstractCheck
+import Pkg
+import stat
+
+class TmpFilesCheck(AbstractCheck.AbstractCheck):
+    '''Check systemd created tmpfiles are included in filelist'''
+
+    def __init__(self):
+        AbstractCheck.AbstractCheck.__init__(self, "TmpFilesCheck")
+        self._spec_file = None
+
+    def check(self, pkg):
+        if pkg.isSource():
+            return
+
+        # see tmpfiles.d(5)
+        interesting_types = ('f', 'F', 'w', 'd', 'D', 'p', 'L', 'c', 'b')
+
+        for fn, pkgfile in pkg.files().items():
+            if not fn.startswith('/usr/lib/tmpfiles.d/'):
+                continue
+            if not stat.S_ISREG(pkgfile.mode):
+                printWarning(pkg, "tmpfile-not-regular-file", fn)
+                continue
+            for line in open(pkgfile.path):
+                # skip comments
+                line = line.split('#')[0].split('\n')[0]
+                line = line.lstrip()
+                if not len(line):
+                    continue
+                line = re.split(r'\s+', line)
+                # format is
+                #Type Path        Mode UID  GID  Age Argument
+                # we only need type and path
+                if len(line) < 3:
+                    continue
+                t = line[0]
+                p = line[1]
+                if t.endswith('!'):
+                    t = t[:-1]
+                if not t in interesting_types:
+                    continue
+
+                if not p in pkg.files():
+                    printWarning(pkg, "tmpfile-not-in-filelist", p)
+                    continue
+                if not pkg.files()[p].is_ghost:
+                    printWarning(pkg, "tmpfile-not-ghost", p)
+
+check = TmpFilesCheck()
+
+addDetails(
+'tmpfile-not-regular-file',
+'''files in tmpfiles.d need to be regular files''', # otherwise we won't open it :-)
+'tmpfile-not-in-filelist',
+'''please add the specified file to your %files section as %ghost so
+users can easily query who created the file, it gets uninstalled on
+package removal and finally other rpmlint checks see it''',
+'tmpfile-not-ghost',
+'''the specified file is not marked as %ghost although created at
+runtime via tmpfiles mechanism.'''
+)
+# vim: sw=4 et
openSUSE Build Service is sponsored by