f6eb96
From aa86e1a4ba6a472b6eb2af6cad07672322eafded Mon Sep 17 00:00:00 2001
f6eb96
From: Jakub Filak <jfilak@redhat.com>
f6eb96
Date: Sun, 10 Nov 2013 10:19:57 +0100
f6eb96
Subject: [ABRT PATCH 69/76] Load conf from /usr/share/abrt/conf.d and
f6eb96
 /etc/abrt
f6eb96
f6eb96
Related to #752
f6eb96
f6eb96
Signed-off-by: Jakub Filak <jfilak@redhat.com>
f6eb96
---
f6eb96
 configure.ac                                 |  4 ++
f6eb96
 src/daemon/Makefile.am                       |  2 +
f6eb96
 src/daemon/abrt-action-save-package-data.c   | 22 ++++++++---
f6eb96
 src/hooks/Makefile.am                        |  3 ++
f6eb96
 src/hooks/abrt-hook-ccpp.c                   |  2 +-
f6eb96
 src/hooks/abrt_exception_handler.py.in       | 18 ++-------
f6eb96
 src/hooks/abrt_harvest_vmcore.py.in          | 30 +++++++-------
f6eb96
 src/include/libabrt.h                        |  6 +++
f6eb96
 src/lib/Makefile.am                          |  3 ++
f6eb96
 src/lib/abrt_conf.c                          | 22 +++++++++--
f6eb96
 src/plugins/Makefile.am                      |  4 +-
f6eb96
 src/plugins/abrt-action-analyze-xorg.c       |  8 ++--
f6eb96
 src/plugins/abrt-action-generate-backtrace.c |  5 ++-
f6eb96
 src/plugins/abrt-action-install-debuginfo.in | 20 +++-------
f6eb96
 src/python-problem/problem/common.h          |  2 +
f6eb96
 src/python-problem/problem/pyabrt.c          | 59 ++++++++++++++++++++++++++++
f6eb96
 src/python-problem/problem/pyabrtmodule.c    |  2 +
f6eb96
 17 files changed, 151 insertions(+), 61 deletions(-)
f6eb96
f6eb96
diff --git a/configure.ac b/configure.ac
f6eb96
index 113b315..f6ae82e 100644
f6eb96
--- a/configure.ac
f6eb96
+++ b/configure.ac
f6eb96
@@ -132,8 +132,10 @@ AC_CHECK_HEADER([sys/inotify.h], [],
f6eb96
 AC_CHECK_HEADERS([locale.h])
f6eb96
 
f6eb96
 CONF_DIR='${sysconfdir}/${PACKAGE_NAME}'
f6eb96
+DEFAULT_CONF_DIR='${datadir}/${PACKAGE_NAME}/conf.d'
f6eb96
 VAR_RUN='${localstatedir}/run'
f6eb96
 PLUGINS_CONF_DIR='${sysconfdir}/${PACKAGE_NAME}/plugins'
f6eb96
+DEFAULT_PLUGINS_CONF_DIR='${datadir}/${PACKAGE_NAME}/conf.d/plugins'
f6eb96
 EVENTS_DIR='${datadir}/libreport/events'
f6eb96
 EVENTS_CONF_DIR='${sysconfdir}/libreport/events.d'
f6eb96
 ENABLE_SOCKET_OR_DBUS='-DENABLE_DBUS=1'
f6eb96
@@ -191,8 +193,10 @@ AC_ARG_ENABLE([native-unwinder],
f6eb96
 
f6eb96
 
f6eb96
 AC_SUBST(CONF_DIR)
f6eb96
+AC_SUBST(DEFAULT_CONF_DIR)
f6eb96
 AC_SUBST(VAR_RUN)
f6eb96
 AC_SUBST(PLUGINS_CONF_DIR)
f6eb96
+AC_SUBST(DEFAULT_PLUGINS_CONF_DIR)
f6eb96
 AC_SUBST(EVENTS_CONF_DIR)
f6eb96
 AC_SUBST(EVENTS_DIR)
f6eb96
 AC_SUBST(DEFAULT_DUMP_LOCATION)
f6eb96
diff --git a/src/daemon/Makefile.am b/src/daemon/Makefile.am
f6eb96
index fba6b83..158f3e5 100644
f6eb96
--- a/src/daemon/Makefile.am
f6eb96
+++ b/src/daemon/Makefile.am
f6eb96
@@ -104,6 +104,8 @@ dist_daemonconf_DATA = \
f6eb96
     abrt.conf \
f6eb96
     abrt-action-save-package-data.conf \
f6eb96
     gpg_keys.conf
f6eb96
+defaultdaemonconfdir = $(DEFAULT_CONF_DIR)
f6eb96
+dist_defaultdaemonconf_DATA = $(dist_daemonconf_DATA)
f6eb96
 
f6eb96
 EXTRA_DIST = abrt-handle-upload.in
f6eb96
 
f6eb96
diff --git a/src/daemon/abrt-action-save-package-data.c b/src/daemon/abrt-action-save-package-data.c
f6eb96
index 5da6905..6dbcfc2 100644
f6eb96
--- a/src/daemon/abrt-action-save-package-data.c
f6eb96
+++ b/src/daemon/abrt-action-save-package-data.c
f6eb96
@@ -20,6 +20,8 @@
f6eb96
 #include "libabrt.h"
f6eb96
 #include "rpm.h"
f6eb96
 
f6eb96
+#define GPG_CONF "gpg_keys.conf"
f6eb96
+
f6eb96
 static bool   settings_bOpenGPGCheck = false;
f6eb96
 static GList *settings_setOpenGPGPublicKeys = NULL;
f6eb96
 static GList *settings_setBlackListedPkgs = NULL;
f6eb96
@@ -79,10 +81,9 @@ static void ParseCommon(map_string_t *settings, const char *conf_filename)
f6eb96
 static void load_gpg_keys(void)
f6eb96
 {
f6eb96
     map_string_t *settings = new_map_string();
f6eb96
-    const char *conf_filename = CONF_DIR"/gpg_keys.conf";
f6eb96
-    if (!load_conf_file(conf_filename, settings, /*skip key w/o values:*/ false))
f6eb96
+    if (!load_abrt_conf_file(GPG_CONF, settings))
f6eb96
     {
f6eb96
-        error_msg("Can't open '%s'", conf_filename);
f6eb96
+        error_msg("Can't load '%s'", GPG_CONF);
f6eb96
         return;
f6eb96
     }
f6eb96
 
f6eb96
@@ -106,8 +107,17 @@ static void load_gpg_keys(void)
f6eb96
 static int load_conf(const char *conf_filename)
f6eb96
 {
f6eb96
     map_string_t *settings = new_map_string();
f6eb96
-    if (!load_conf_file(conf_filename, settings, /*skip key w/o values:*/ false))
f6eb96
-        error_msg("Can't open '%s'", conf_filename);
f6eb96
+    if (conf_filename != NULL)
f6eb96
+    {
f6eb96
+        if (!load_conf_file(conf_filename, settings, false))
f6eb96
+            error_msg("Can't open '%s'", conf_filename);
f6eb96
+    }
f6eb96
+    else
f6eb96
+    {
f6eb96
+        conf_filename = "abrt-action-save-package-data.conf";
f6eb96
+        if (!load_abrt_conf_file(conf_filename, settings))
f6eb96
+            error_msg("Can't load '%s'", conf_filename);
f6eb96
+    }
f6eb96
 
f6eb96
     ParseCommon(settings, conf_filename);
f6eb96
     free_map_string(settings);
f6eb96
@@ -365,7 +375,7 @@ int main(int argc, char **argv)
f6eb96
     abrt_init(argv);
f6eb96
 
f6eb96
     const char *dump_dir_name = ".";
f6eb96
-    const char *conf_filename = CONF_DIR"/abrt-action-save-package-data.conf";
f6eb96
+    const char *conf_filename = NULL;
f6eb96
 
f6eb96
     /* Can't keep these strings/structs static: _() doesn't support that */
f6eb96
     const char *program_usage_string = _(
f6eb96
diff --git a/src/hooks/Makefile.am b/src/hooks/Makefile.am
f6eb96
index 567da6a..45ecba4 100644
f6eb96
--- a/src/hooks/Makefile.am
f6eb96
+++ b/src/hooks/Makefile.am
f6eb96
@@ -10,6 +10,9 @@ dist_pluginsconf_DATA = \
f6eb96
     CCpp.conf \
f6eb96
     python.conf
f6eb96
 
f6eb96
+defaultpluginsconfdir = $(DEFAULT_PLUGINS_CONF_DIR)
f6eb96
+dist_defaultpluginsconf_DATA = $(dist_pluginsconf_DATA)
f6eb96
+
f6eb96
 sbin_SCRIPTS = \
f6eb96
     abrt-install-ccpp-hook \
f6eb96
     abrt-harvest-vmcore \
f6eb96
diff --git a/src/hooks/abrt-hook-ccpp.c b/src/hooks/abrt-hook-ccpp.c
f6eb96
index a3f72a7..8e141d4 100644
f6eb96
--- a/src/hooks/abrt-hook-ccpp.c
f6eb96
+++ b/src/hooks/abrt-hook-ccpp.c
f6eb96
@@ -499,7 +499,7 @@ int main(int argc, char** argv)
f6eb96
     bool setting_SaveBinaryImage;
f6eb96
     {
f6eb96
         map_string_t *settings = new_map_string();
f6eb96
-        load_conf_file(PLUGINS_CONF_DIR"/CCpp.conf", settings, /*skip key w/o values:*/ false);
f6eb96
+        load_abrt_plugin_conf_file("CCpp.conf", settings);
f6eb96
         const char *value;
f6eb96
         value = get_map_string_item_or_NULL(settings, "MakeCompatCore");
f6eb96
         setting_MakeCompatCore = value && string_to_bool(value);
f6eb96
diff --git a/src/hooks/abrt_exception_handler.py.in b/src/hooks/abrt_exception_handler.py.in
f6eb96
index 4396178..96a63ff 100644
f6eb96
--- a/src/hooks/abrt_exception_handler.py.in
f6eb96
+++ b/src/hooks/abrt_exception_handler.py.in
f6eb96
@@ -167,23 +167,11 @@ def get_dso_list(tb):
f6eb96
 
f6eb96
 def conf_enabled(var_name):
f6eb96
     try:
f6eb96
-        file = open(@CONF_DIR@ + "/plugins/python.conf", "r")
f6eb96
+        conf = problem.load_plugin_conf_file("python.conf")
f6eb96
     except:
f6eb96
         return -1
f6eb96
-    for line in file:
f6eb96
-        w = line.split("=", 1)  # split on '=' to 2 parts max
f6eb96
-        if len(w) < 2:
f6eb96
-            continue
f6eb96
-        var = w[0].strip()  # remove whitespace
f6eb96
-        if var != var_name:
f6eb96
-            continue
f6eb96
-        val = w[1].strip()  # remove whitespace
f6eb96
-        if val == "yes":
f6eb96
-            return 1
f6eb96
-        if val == "no":
f6eb96
-            return 0
f6eb96
-    file.close()
f6eb96
-    return -1
f6eb96
+    else:
f6eb96
+        conf.get(var_name, -1)
f6eb96
 
f6eb96
 def handleMyException((etype, value, tb)):
f6eb96
     """
f6eb96
diff --git a/src/hooks/abrt_harvest_vmcore.py.in b/src/hooks/abrt_harvest_vmcore.py.in
f6eb96
index 894dd47..25eddb0 100644
f6eb96
--- a/src/hooks/abrt_harvest_vmcore.py.in
f6eb96
+++ b/src/hooks/abrt_harvest_vmcore.py.in
f6eb96
@@ -203,23 +203,21 @@ def harvest_vmcore():
f6eb96
     os.umask(077)
f6eb96
 
f6eb96
     # Check abrt config files for copy/move settings and
f6eb96
-    config = ConfigParser.ConfigParser()
f6eb96
-    # We need to add a root section as ConfigParser doesn't know how to work
f6eb96
-    # with config files without any sections
f6eb96
-    with open('@CONF_DIR@/abrt-harvest-vmcore.conf') as conf_file:
f6eb96
-        conf_str = '[section]\n' + conf_file.read()
f6eb96
-    conf_fp = StringIO.StringIO(conf_str)
f6eb96
-    config.readfp(conf_fp)
f6eb96
-    copyvmcore = config.get('section', 'CopyVMcore')
f6eb96
-    with open('@CONF_DIR@/abrt.conf') as conf_file:
f6eb96
-        conf_str = '[section]\n' + conf_file.read()
f6eb96
-    conf_fp = StringIO.StringIO(conf_str)
f6eb96
-    config = ConfigParser.ConfigParser()
f6eb96
-    config.readfp(conf_fp)
f6eb96
     try:
f6eb96
-        abrtdumpdir = config.get('section', 'DumpLocation')
f6eb96
-    except ConfigParser.NoOptionError:
f6eb96
-        abrtdumpdir = '@DEFAULT_DUMP_LOCATION@'
f6eb96
+        conf = problem.load_conf_file("abrt-harvest-vmcore.conf")
f6eb96
+    except OSError as ex:
f6eb96
+        sys.stderr.write(str(ex))
f6eb96
+        sys.exit(1)
f6eb96
+    else:
f6eb96
+        copyvmcore = conf.get("CopyVMcore", "no")
f6eb96
+
f6eb96
+    try:
f6eb96
+        conf = problem.load_conf_file("abrt.conf")
f6eb96
+    except OSError as ex:
f6eb96
+        sys.stderr.write(str(ex))
f6eb96
+        sys.exit(1)
f6eb96
+    else:
f6eb96
+        abrtdumpdir = conf.get("DumpLocation", "@DEFAULT_DUMP_LOCATION@")
f6eb96
 
f6eb96
     try:
f6eb96
         filelist = os.listdir(dump_dir)
f6eb96
diff --git a/src/include/libabrt.h b/src/include/libabrt.h
f6eb96
index 30399b6..518e989 100644
f6eb96
--- a/src/include/libabrt.h
f6eb96
+++ b/src/include/libabrt.h
f6eb96
@@ -82,6 +82,12 @@ int load_abrt_conf(void);
f6eb96
 #define free_abrt_conf_data abrt_free_abrt_conf_data
f6eb96
 void free_abrt_conf_data(void);
f6eb96
 
f6eb96
+#define load_abrt_conf_file abrt_load_abrt_conf_file
f6eb96
+int load_abrt_conf_file(const char *file, map_string_t *settings);
f6eb96
+
f6eb96
+#define load_abrt_plugin_conf_file abrt_load_abrt_plugin_conf_file
f6eb96
+int load_abrt_plugin_conf_file(const char *file, map_string_t *settings);
f6eb96
+
f6eb96
 
f6eb96
 void migrate_to_xdg_dirs(void);
f6eb96
 
f6eb96
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
f6eb96
index c5a6e2f..8823f01 100644
f6eb96
--- a/src/lib/Makefile.am
f6eb96
+++ b/src/lib/Makefile.am
f6eb96
@@ -23,6 +23,9 @@ libabrt_la_CPPFLAGS = \
f6eb96
     -I$(srcdir)/../lib \
f6eb96
     -DVAR_RUN=\"$(VAR_RUN)\" \
f6eb96
     -DCONF_DIR=\"$(CONF_DIR)\" \
f6eb96
+    -DDEFAULT_CONF_DIR=\"$(DEFAULT_CONF_DIR)\" \
f6eb96
+    -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \
f6eb96
+    -DDEFAULT_PLUGINS_CONF_DIR=\"$(DEFAULT_PLUGINS_CONF_DIR)\" \
f6eb96
     -DEVENTS_DIR=\"$(EVENTS_DIR)\" \
f6eb96
     -DDEFAULT_DUMP_LOCATION=\"$(DEFAULT_DUMP_LOCATION)\" \
f6eb96
     $(GLIB_CFLAGS) \
f6eb96
diff --git a/src/lib/abrt_conf.c b/src/lib/abrt_conf.c
f6eb96
index 7230b77..5bb11e9 100644
f6eb96
--- a/src/lib/abrt_conf.c
f6eb96
+++ b/src/lib/abrt_conf.c
f6eb96
@@ -18,6 +18,8 @@
f6eb96
 */
f6eb96
 #include "libabrt.h"
f6eb96
 
f6eb96
+#define ABRT_CONF "abrt.conf"
f6eb96
+
f6eb96
 char *        g_settings_sWatchCrashdumpArchiveDir = NULL;
f6eb96
 unsigned int  g_settings_nMaxCrashReportsSize = 1000;
f6eb96
 char *        g_settings_dump_location = NULL;
f6eb96
@@ -119,11 +121,25 @@ int load_abrt_conf()
f6eb96
     free_abrt_conf_data();
f6eb96
 
f6eb96
     map_string_t *settings = new_map_string();
f6eb96
-    if (!load_conf_file(CONF_DIR"/abrt.conf", settings, /*skip key w/o values:*/ false))
f6eb96
-        perror_msg("Can't open '%s'", CONF_DIR"/abrt.conf");
f6eb96
+    if (!load_abrt_conf_file(ABRT_CONF, settings))
f6eb96
+        perror_msg("Can't load '%s'", ABRT_CONF);
f6eb96
 
f6eb96
-    ParseCommon(settings, CONF_DIR"/abrt.conf");
f6eb96
+    ParseCommon(settings, ABRT_CONF);
f6eb96
     free_map_string(settings);
f6eb96
 
f6eb96
     return 0;
f6eb96
 }
f6eb96
+
f6eb96
+int load_abrt_conf_file(const char *file, map_string_t *settings)
f6eb96
+{
f6eb96
+    static const char *const base_directories[] = { DEFAULT_CONF_DIR, CONF_DIR, NULL };
f6eb96
+
f6eb96
+    return load_conf_file_from_dirs(file, base_directories, settings, /*skip key w/o values:*/ false);
f6eb96
+}
f6eb96
+
f6eb96
+int load_abrt_plugin_conf_file(const char *file, map_string_t *settings)
f6eb96
+{
f6eb96
+    static const char *const base_directories[] = { DEFAULT_PLUGINS_CONF_DIR, PLUGINS_CONF_DIR, NULL };
f6eb96
+
f6eb96
+    return load_conf_file_from_dirs(file, base_directories, settings, /*skip key w/o values:*/ false);
f6eb96
+}
f6eb96
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
f6eb96
index 370d5fd..60246f2 100644
f6eb96
--- a/src/plugins/Makefile.am
f6eb96
+++ b/src/plugins/Makefile.am
f6eb96
@@ -96,9 +96,11 @@ EXTRA_DIST = \
f6eb96
     post_report.xml.in \
f6eb96
     abrt-action-analyze-ccpp-local
f6eb96
 
f6eb96
-confdir = $(CONF_DIR)
f6eb96
+confdir = $(PLUGINS_CONF_DIR)
f6eb96
 dist_conf_DATA = \
f6eb96
     xorg.conf
f6eb96
+defaultconfdir = $(DEFAULT_PLUGINS_CONF_DIR)
f6eb96
+dist_defaultconf_DATA = $(dist_conf_DATA)
f6eb96
 
f6eb96
 abrt_watch_log_SOURCES = \
f6eb96
     abrt-watch-log.c
f6eb96
diff --git a/src/plugins/abrt-action-analyze-xorg.c b/src/plugins/abrt-action-analyze-xorg.c
f6eb96
index 5cf6d1e..5d11830 100644
f6eb96
--- a/src/plugins/abrt-action-analyze-xorg.c
f6eb96
+++ b/src/plugins/abrt-action-analyze-xorg.c
f6eb96
@@ -19,6 +19,8 @@
f6eb96
 #include <paths.h>
f6eb96
 #include "libabrt.h"
f6eb96
 
f6eb96
+#define XORG_CONF "xorg.conf"
f6eb96
+
f6eb96
 static
f6eb96
 void trim_spaces(char *str)
f6eb96
 {
f6eb96
@@ -87,9 +89,9 @@ int main(int argc, char **argv)
f6eb96
     export_abrt_envvars(0);
f6eb96
 
f6eb96
     map_string_t *settings = new_map_string();
f6eb96
-    VERB1 log("Loading settings from '%s'", "/etc/abrt/xorg.conf");
f6eb96
-    load_conf_file("/etc/abrt/xorg.conf", settings, /*skip key w/o values:*/ false);
f6eb96
-    VERB3 log("Loaded '%s'", "/etc/abrt/xorg.conf");
f6eb96
+    VERB1 log("Loading settings from '%s'", XORG_CONF);
f6eb96
+    load_abrt_plugin_conf_file(XORG_CONF, settings);
f6eb96
+    VERB3 log("Loaded '%s'", XORG_CONF);
f6eb96
     char *BlacklistedXorgModules = xstrdup(get_map_string_item_or_empty(settings, "BlacklistedXorgModules"));
f6eb96
     trim_spaces(BlacklistedXorgModules);
f6eb96
     free_map_string(settings);
f6eb96
diff --git a/src/plugins/abrt-action-generate-backtrace.c b/src/plugins/abrt-action-generate-backtrace.c
f6eb96
index 5612a1c..30ce446 100644
f6eb96
--- a/src/plugins/abrt-action-generate-backtrace.c
f6eb96
+++ b/src/plugins/abrt-action-generate-backtrace.c
f6eb96
@@ -18,6 +18,7 @@
f6eb96
 */
f6eb96
 #include "libabrt.h"
f6eb96
 
f6eb96
+#define CCPP_CONF "CCpp.conf"
f6eb96
 
f6eb96
 static const char *dump_dir_name = ".";
f6eb96
 /* 60 seconds was too limiting on slow machines */
f6eb96
@@ -61,8 +62,8 @@ int main(int argc, char **argv)
f6eb96
     export_abrt_envvars(0);
f6eb96
 
f6eb96
     map_string_t *settings = new_map_string();
f6eb96
-    if (!load_conf_file(PLUGINS_CONF_DIR"/CCpp.conf", settings, /*skip key w/o values:*/ false))
f6eb96
-        error_msg("Can't open '%s'", PLUGINS_CONF_DIR"/CCpp.conf");
f6eb96
+    if (!load_abrt_plugin_conf_file(CCPP_CONF, settings))
f6eb96
+        error_msg("Can't load '%s'", CCPP_CONF);
f6eb96
 
f6eb96
     const char *value = get_map_string_item_or_NULL(settings, "DebuginfoLocation");
f6eb96
     char *debuginfo_location;
f6eb96
diff --git a/src/plugins/abrt-action-install-debuginfo.in b/src/plugins/abrt-action-install-debuginfo.in
f6eb96
index b734796..5fd3110 100644
f6eb96
--- a/src/plugins/abrt-action-install-debuginfo.in
f6eb96
+++ b/src/plugins/abrt-action-install-debuginfo.in
f6eb96
@@ -14,6 +14,7 @@ from subprocess import Popen, PIPE
f6eb96
 from reportclient import _, verbose, log, log1, log2, set_verbosity, error_msg_and_die, error_msg
f6eb96
 import time
f6eb96
 from reportclient.debuginfo import DebugInfoDownload, filter_installed_debuginfos, build_ids_to_path, clean_up
f6eb96
+import problem
f6eb96
 
f6eb96
 # everything was ok
f6eb96
 RETURN_OK = 0
f6eb96
@@ -144,20 +145,11 @@ if __name__ == "__main__":
f6eb96
 
f6eb96
     if not cachedirs:
f6eb96
         try:
f6eb96
-            fp = open("@sysconfdir@/@PACKAGE_NAME@/plugins/CCpp.conf", "r")
f6eb96
-            for line in fp:
f6eb96
-                stripped = line.lstrip()
f6eb96
-                if len(stripped) == 0:
f6eb96
-                    continue
f6eb96
-                if stripped[0] == "#":
f6eb96
-                    continue
f6eb96
-                if stripped[:len("DebuginfoLocation")] != "DebuginfoLocation":
f6eb96
-                    continue
f6eb96
-
f6eb96
-                cachedirs =  stripped[len("DebuginfoLocation"):].strip(" =\n").split(":")
f6eb96
-            fp.close()
f6eb96
-        except IOError as (errno, strerror):
f6eb96
-            print "I/O error({0}): {1}".format(errno, strerror)
f6eb96
+            conf = problem.load_plugin_conf_file("CCpp.conf")
f6eb96
+        except OSError as ex:
f6eb96
+            print str(ex)
f6eb96
+        else:
f6eb96
+            cachedirs = conf.get("DebuginfoLocation", None)
f6eb96
 
f6eb96
         if not cachedirs:
f6eb96
             cachedirs = ["/var/cache/abrt-di"]
f6eb96
diff --git a/src/python-problem/problem/common.h b/src/python-problem/problem/common.h
f6eb96
index ef323a5..2dd06c7 100644
f6eb96
--- a/src/python-problem/problem/common.h
f6eb96
+++ b/src/python-problem/problem/common.h
f6eb96
@@ -20,3 +20,5 @@
f6eb96
 
f6eb96
 /* module-level functions */
f6eb96
 PyObject *p_notify_new_path(PyObject *pself, PyObject *args);
f6eb96
+PyObject *p_load_conf_file(PyObject *pself, PyObject *args);
f6eb96
+PyObject *p_load_plugin_conf_file(PyObject *pself, PyObject *args);
f6eb96
diff --git a/src/python-problem/problem/pyabrt.c b/src/python-problem/problem/pyabrt.c
f6eb96
index 16621d3..16d455f 100644
f6eb96
--- a/src/python-problem/problem/pyabrt.c
f6eb96
+++ b/src/python-problem/problem/pyabrt.c
f6eb96
@@ -32,3 +32,62 @@ PyObject *p_notify_new_path(PyObject *pself, PyObject *args)
f6eb96
     notify_new_path(path);
f6eb96
     Py_RETURN_NONE;
f6eb96
 }
f6eb96
+
f6eb96
+static PyObject *
f6eb96
+load_settings_to_dict(const char *file, int (*loader)(const char *, map_string_t *))
f6eb96
+{
f6eb96
+    PyObject *dict = NULL;
f6eb96
+    map_string_t *settings = new_map_string();
f6eb96
+    if (!loader(file, settings))
f6eb96
+    {
f6eb96
+        PyErr_SetString(PyExc_OSError, "Failed to load configuration file.");
f6eb96
+        goto lacf_error;
f6eb96
+    }
f6eb96
+
f6eb96
+    dict = PyDict_New();
f6eb96
+    if (dict == NULL)
f6eb96
+    {
f6eb96
+        goto lacf_error;
f6eb96
+    }
f6eb96
+
f6eb96
+    map_string_iter_t iter;
f6eb96
+    const char *key = NULL;
f6eb96
+    const char *value = NULL;
f6eb96
+    init_map_string_iter(&iter, settings);
f6eb96
+    while(next_map_string_iter(&iter, &key, &value))
f6eb96
+    {
f6eb96
+        if (0 != PyDict_SetItemString(dict, key, PyString_FromString(value)))
f6eb96
+        {
f6eb96
+            goto lacf_error;
f6eb96
+        }
f6eb96
+    }
f6eb96
+    free_map_string(settings);
f6eb96
+    return dict;
f6eb96
+
f6eb96
+lacf_error:
f6eb96
+    Py_XDECREF(dict);
f6eb96
+    free_map_string(settings);
f6eb96
+    return NULL;
f6eb96
+}
f6eb96
+
f6eb96
+/* C: void load_abrt_conf_file(const char *file, map_string_t *settings); */
f6eb96
+PyObject *p_load_conf_file(PyObject *pself, PyObject *args)
f6eb96
+{
f6eb96
+    const char *file;
f6eb96
+    if (!PyArg_ParseTuple(args, "s", &file))
f6eb96
+    {
f6eb96
+        return NULL;
f6eb96
+    }
f6eb96
+    return load_settings_to_dict(file, load_abrt_conf_file);
f6eb96
+}
f6eb96
+
f6eb96
+/* C: void load_abrt_plugin_conf_file(const char *file, map_string_t *settings); */
f6eb96
+PyObject *p_load_plugin_conf_file(PyObject *pself, PyObject *args)
f6eb96
+{
f6eb96
+    const char *file;
f6eb96
+    if (!PyArg_ParseTuple(args, "s", &file))
f6eb96
+    {
f6eb96
+        return NULL;
f6eb96
+    }
f6eb96
+    return load_settings_to_dict(file, load_abrt_plugin_conf_file);
f6eb96
+}
f6eb96
diff --git a/src/python-problem/problem/pyabrtmodule.c b/src/python-problem/problem/pyabrtmodule.c
f6eb96
index 7ff58b3..e31d8b4 100644
f6eb96
--- a/src/python-problem/problem/pyabrtmodule.c
f6eb96
+++ b/src/python-problem/problem/pyabrtmodule.c
f6eb96
@@ -24,6 +24,8 @@ static PyMethodDef module_methods[] = {
f6eb96
     /* method_name, func, flags, doc_string */
f6eb96
     /* for include/client.h */
f6eb96
     { "notify_new_path"           , p_notify_new_path         , METH_VARARGS },
f6eb96
+    { "load_conf_file"            , p_load_conf_file          , METH_VARARGS },
f6eb96
+    { "load_plugin_conf_file"     , p_load_plugin_conf_file   , METH_VARARGS },
f6eb96
     { NULL }
f6eb96
 };
f6eb96
 
f6eb96
-- 
f6eb96
1.8.3.1
f6eb96