Matej Habrnal fa1950
From fcd6406bdb8e0b0005725ae88c03979e62e740ee Mon Sep 17 00:00:00 2001
Matej Habrnal fa1950
From: Jakub Filak <jfilak@redhat.com>
Matej Habrnal fa1950
Date: Mon, 8 Jun 2015 19:39:24 +0200
Matej Habrnal fa1950
Subject: [PATCH] vmcore: use libreport dd API in the harvestor
Matej Habrnal fa1950
Matej Habrnal fa1950
The dd API ensure correct permissions and owner.
Matej Habrnal fa1950
Matej Habrnal fa1950
Signed-off-by: Jakub Filak <jfilak@redhat.com>
Matej Habrnal fa1950
---
Matej Habrnal fa1950
 src/hooks/abrt_harvest_vmcore.py.in | 156 ++++++++++++++----------------------
Matej Habrnal fa1950
 1 file changed, 62 insertions(+), 94 deletions(-)
Matej Habrnal fa1950
Matej Habrnal fa1950
diff --git a/src/hooks/abrt_harvest_vmcore.py.in b/src/hooks/abrt_harvest_vmcore.py.in
Matej Habrnal fa1950
index 256f8f1..f2bddfe 100644
Matej Habrnal fa1950
--- a/src/hooks/abrt_harvest_vmcore.py.in
Matej Habrnal fa1950
+++ b/src/hooks/abrt_harvest_vmcore.py.in
Matej Habrnal fa1950
@@ -15,6 +15,7 @@ import hashlib
Matej Habrnal fa1950
 import augeas
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 import problem
Matej Habrnal fa1950
+import report
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 def get_augeas(module, file_path):
Matej Habrnal fa1950
@@ -93,85 +94,39 @@ def parse_kdump():
Matej Habrnal fa1950
     return path
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-def write_to_file(path, content):
Matej Habrnal fa1950
+def create_abrtd_info(dest, uuid):
Matej Habrnal fa1950
     """
Matej Habrnal fa1950
-    A function for writing into a file
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    path - path to the file
Matej Habrnal fa1950
-    content - content to write into the file
Matej Habrnal fa1950
-    """
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    with open(path, 'w') as wfile:
Matej Habrnal fa1950
-        wfile.write(content)
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-def change_owner_rec(dest):
Matej Habrnal fa1950
-    """
Matej Habrnal fa1950
-    A simple function to recursively change file mode for a directory.
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    dest - path to the directory
Matej Habrnal fa1950
-    """
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    os.chown(dest, 0, 0)
Matej Habrnal fa1950
-    for root, dirs, files in os.walk(dest):
Matej Habrnal fa1950
-        for i in dirs:
Matej Habrnal fa1950
-            os.chown(os.path.join(root, i), 0, 0)
Matej Habrnal fa1950
-        for i in files:
Matej Habrnal fa1950
-            os.chown(os.path.join(root, i), 0, 0)
Matej Habrnal fa1950
-
Matej Habrnal fa1950
+    A simple function to write important information for the abrt daemon into
Matej Habrnal fa1950
+    the vmcore directory to let abrtd know what kind of problem it is.
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-def change_mode_rec(dest):
Matej Habrnal fa1950
+    dest - path to the vmcore directory
Matej Habrnal fa1950
+    uuid - unique indentifier of the vmcore
Matej Habrnal fa1950
     """
Matej Habrnal fa1950
-    A simple function to recursively change file mode for a directory.
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    dest - path to the directory
Matej Habrnal fa1950
-    """
Matej Habrnal fa1950
+    dd = report.dd_create(dest, 0)
Matej Habrnal fa1950
+    if dd is None:
Matej Habrnal fa1950
+        return None
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    os.chmod(dest, 0700)
Matej Habrnal fa1950
-    for root, dirs, files in os.walk(dest):
Matej Habrnal fa1950
-        for i in dirs:
Matej Habrnal fa1950
-            os.chmod(os.path.join(root, i), 0700)
Matej Habrnal fa1950
-        for i in files:
Matej Habrnal fa1950
-            os.chmod(os.path.join(root, i), 0600)
Matej Habrnal fa1950
+    dd.create_basic_files(0)
Matej Habrnal fa1950
+    dd.save_text('analyzer', 'vmcore')
Matej Habrnal fa1950
+    dd.save_text('type', 'vmcore')
Matej Habrnal fa1950
+    dd.save_text('component', 'kernel')
Matej Habrnal fa1950
+    dd.save_text('uuid', uuid)
Matej Habrnal fa1950
+    return dd
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-def create_abrtd_info(dest):
Matej Habrnal fa1950
+def delete_and_close(dd, dd_dirname):
Matej Habrnal fa1950
     """
Matej Habrnal fa1950
-    A simple function to write important information for the abrt daemon into
Matej Habrnal fa1950
-    the vmcore directory to let abrtd know what kind of problem it is.
Matej Habrnal fa1950
+    Deletes the given dump directory and closes it.
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    dest - path to the vmcore directory
Matej Habrnal fa1950
+    dd - dump directory object
Matej Habrnal fa1950
+    dd_dirname - full path to dump directory
Matej Habrnal fa1950
     """
Matej Habrnal fa1950
+    if not dd.delete() == 0:
Matej Habrnal fa1950
+        sys.stderr.write("Unable to delete '%s'\n" % (dd_dirname))
Matej Habrnal fa1950
+        return
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-    write_to_file(os.path.join(dest, 'analyzer'), 'vmcore')
Matej Habrnal fa1950
-    write_to_file(os.path.join(dest, 'type'), 'vmcore')
Matej Habrnal fa1950
-    write_to_file(os.path.join(dest, 'component'), 'kernel')
Matej Habrnal fa1950
-    write_to_file(os.path.join(dest, 'time'), str(time.time()).split('.')[0])
Matej Habrnal fa1950
-    shutil.copy(os.path.join(dest, 'time'),
Matej Habrnal fa1950
-                os.path.join(dest, 'last_occurrence'))
Matej Habrnal fa1950
-    write_to_file(os.path.join(dest, 'architecture'), os.uname()[4])
Matej Habrnal fa1950
-    write_to_file(os.path.join(dest, 'uid'), '0')
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    # TODO: need to generate *real* UUID,
Matej Habrnal fa1950
-    # one which has a real chance of catching dups!
Matej Habrnal fa1950
-    # This one generates different hashes even for similar cores:
Matej Habrnal fa1950
-    hashobj = hashlib.sha1()
Matej Habrnal fa1950
-    # Iterate over the file a line at a time in order to not load the whole
Matej Habrnal fa1950
-    # vmcore file
Matej Habrnal fa1950
-    with open(os.path.join(dest, 'vmcore'), 'r') as corefile:
Matej Habrnal fa1950
-        for line in corefile:
Matej Habrnal fa1950
-            hashobj.update(line)
Matej Habrnal fa1950
-    write_to_file(os.path.join(dest, 'uuid'), hashobj.hexdigest())
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    # Write os info into the vmcore directory
Matej Habrnal fa1950
-    if os.path.exists('/etc/system-release'):
Matej Habrnal fa1950
-        shutil.copy('/etc/system-release', os.path.join(dest, 'os_release'))
Matej Habrnal fa1950
-    elif os.path.exists('/etc/redhat-release'):
Matej Habrnal fa1950
-        shutil.copy('/etc/redhat-release', os.path.join(dest, 'os_release'))
Matej Habrnal fa1950
-    elif os.path.exists('/etc/SuSE-release'):
Matej Habrnal fa1950
-        shutil.copy('/etc/SuSE-release', os.path.join(dest, 'os_release'))
Matej Habrnal fa1950
-    if os.path.exists('/etc/os-release'):
Matej Habrnal fa1950
-        shutil.copy('/etc/os-release', os.path.join(dest, 'os_info'))
Matej Habrnal fa1950
+    dd.close()
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 def harvest_vmcore():
Matej Habrnal fa1950
@@ -200,8 +155,11 @@ def harvest_vmcore():
Matej Habrnal fa1950
         else:
Matej Habrnal fa1950
             break
Matej Habrnal fa1950
 
Matej Habrnal fa1950
+<<<<<<< HEAD
Matej Habrnal fa1950
     os.umask(077)
Matej Habrnal fa1950
 
Matej Habrnal fa1950
+=======
Matej Habrnal fa1950
+>>>>>>> 71360a6... vmcore: use libreport dd API in the harvestor
Matej Habrnal fa1950
     # Check abrt config files for copy/move settings and
Matej Habrnal fa1950
     try:
Matej Habrnal fa1950
         conf = problem.load_plugin_conf_file("vmcore.conf")
Matej Habrnal fa1950
@@ -245,6 +203,8 @@ def harvest_vmcore():
Matej Habrnal fa1950
                     "VMCore dir '%s' doesn't contain 'vmcore' file.\n" % f_full)
Matej Habrnal fa1950
                 continue
Matej Habrnal fa1950
 
Matej Habrnal fa1950
+        # We use .new suffix - we must make sure abrtd doesn't try
Matej Habrnal fa1950
+        # to process partially-copied directory.
Matej Habrnal fa1950
         destdir = os.path.join(abrtdumpdir, ('vmcore-' + cfile))
Matej Habrnal fa1950
         destdirnew = destdir + '.new'
Matej Habrnal fa1950
         # Did we already copy it last time we booted?
Matej Habrnal fa1950
@@ -252,38 +212,46 @@ def harvest_vmcore():
Matej Habrnal fa1950
             continue
Matej Habrnal fa1950
         if os.path.isdir(destdirnew):
Matej Habrnal fa1950
             continue
Matej Habrnal fa1950
-        # Copy/move vmcore directory to abrt spool dir.
Matej Habrnal fa1950
-        # We use .new suffix - we must make sure abrtd doesn't try
Matej Habrnal fa1950
-        # to process partially-copied directory.
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-        try:
Matej Habrnal fa1950
-            shutil.copytree(f_full, destdirnew)
Matej Habrnal fa1950
-        except (OSError, shutil.Error):
Matej Habrnal fa1950
-            sys.stderr.write("Unable to copy '%s' to '%s'. Skipping\n"
Matej Habrnal fa1950
-                             % (f_full, destdirnew))
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-            # delete .new dir so we don't create mess
Matej Habrnal fa1950
-            shutil.rmtree(destdirnew)
Matej Habrnal fa1950
+        # TODO: need to generate *real* UUID,
Matej Habrnal fa1950
+        # one which has a real chance of catching dups!
Matej Habrnal fa1950
+        # This one generates different hashes even for similar cores:
Matej Habrnal fa1950
+        hashobj = hashlib.sha1()
Matej Habrnal fa1950
+        # Iterate over the file a line at a time in order to not load the whole
Matej Habrnal fa1950
+        # vmcore file
Matej Habrnal fa1950
+        with open(os.path.join(f_full, 'vmcore'), 'r') as corefile:
Matej Habrnal fa1950
+            for line in corefile:
Matej Habrnal fa1950
+                hashobj.update(line)
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+        dd = create_abrtd_info(destdirnew, hashobj.hexdigest())
Matej Habrnal fa1950
+        if dd is None:
Matej Habrnal fa1950
+            sys.stderr.write("Unable to create problem directory info")
Matej Habrnal fa1950
             continue
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-        try:
Matej Habrnal fa1950
-            # Let abrtd know what type of problem it is:
Matej Habrnal fa1950
-            create_abrtd_info(destdirnew)
Matej Habrnal fa1950
-        except EnvironmentError as ex:
Matej Habrnal fa1950
-            sys.stderr.write("Unable to create problem directory info: " + str(ex))
Matej Habrnal fa1950
+        # Copy/move vmcore directory to abrt spool dir.
Matej Habrnal fa1950
+        for name in os.listdir(f_full):
Matej Habrnal fa1950
+            full_name = os.path.join(f_full, name)
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+            # Skip sub-directories, abrt ignores them in its processing anyway
Matej Habrnal fa1950
+            if not os.path.isfile(full_name):
Matej Habrnal fa1950
+                continue
Matej Habrnal fa1950
+
Matej Habrnal fa1950
             try:
Matej Habrnal fa1950
-                shutil.rmtree(destdirnew)
Matej Habrnal fa1950
-            except Exception as ex:
Matej Habrnal fa1950
-                sys.stderr.write("Unable to remove incomplete problem directory: " + str(ex))
Matej Habrnal fa1950
-            continue
Matej Habrnal fa1950
+                if not dd.copy_file(name, full_name) == 0:
Matej Habrnal fa1950
+                    raise OSError
Matej Habrnal fa1950
+            except (OSError, shutil.Error):
Matej Habrnal fa1950
+                sys.stderr.write("Unable to copy '%s' to '%s'. Skipping\n"
Matej Habrnal fa1950
+                                 % (full_name, destdirnew))
Matej Habrnal fa1950
+                delete_and_close(dd)
Matej Habrnal fa1950
+                continue
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-        # chown -R 0:0
Matej Habrnal fa1950
-        change_owner_rec(destdirnew)
Matej Habrnal fa1950
-        # chmod -R u+rwX,go-rwxst
Matej Habrnal fa1950
-        change_mode_rec(destdirnew)
Matej Habrnal fa1950
+        # Get rid of the .new suffix
Matej Habrnal fa1950
+        if not dd.rename(destdir) == 0:
Matej Habrnal fa1950
+            sys.stderr.write("Unable to rename '%s' to '%s'. Skipping\n" % (destdirnew, destdir))
Matej Habrnal fa1950
+            delete_and_close(dd)
Matej Habrnal fa1950
+            continue
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-        # Get rid of  the .new suffix
Matej Habrnal fa1950
-        shutil.move(destdirnew, destdir)
Matej Habrnal fa1950
+        dd.close()
Matej Habrnal fa1950
 
Matej Habrnal fa1950
         if copyvmcore == 'no':
Matej Habrnal fa1950
             try:
Matej Habrnal fa1950
-- 
Matej Habrnal fa1950
2.1.0
Matej Habrnal fa1950