summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJiri Moskovcak <jmoskovc@redhat.com>2010-01-18 16:31:03 +0100
committerJiri Moskovcak <jmoskovc@redhat.com>2010-01-18 16:31:03 +0100
commitb8ef905c6455ef98cd7fa488de7d602a70bd57dc (patch)
tree8d99e35017aa08773a8ee63487a67bac983bd6f7 /src
parent675ef3624349fbfbe165913270f24a947e0cb8d0 (diff)
parent3cd4d651565e4afcc3c72bd32bb9ce2285b5c93d (diff)
downloadabrt-b8ef905c6455ef98cd7fa488de7d602a70bd57dc.tar.gz
abrt-b8ef905c6455ef98cd7fa488de7d602a70bd57dc.tar.xz
abrt-b8ef905c6455ef98cd7fa488de7d602a70bd57dc.zip
conflict
Diffstat (limited to 'src')
-rw-r--r--src/CLI/dbus.cpp6
-rw-r--r--src/CLI/dbus.h6
-rw-r--r--src/Daemon/CommLayerServerDBus.cpp10
-rw-r--r--src/Daemon/Daemon.cpp3
-rw-r--r--src/Daemon/PluginManager.cpp96
-rw-r--r--src/Daemon/PluginManager.h13
-rw-r--r--src/Gui/ABRTExceptions.py2
-rw-r--r--src/Gui/ABRTPlugin.py12
-rw-r--r--src/Gui/CCDBusBackend.py24
-rw-r--r--src/Gui/CCDumpList.py2
-rw-r--r--src/Gui/CCMainWindow.py57
-rw-r--r--src/Gui/CCReporterDialog.py2
-rw-r--r--src/Gui/CC_gui_functions.py20
-rw-r--r--src/Gui/ConfBackend.py152
-rw-r--r--src/Gui/PluginList.py22
-rw-r--r--src/Gui/PluginSettingsUI.py2
-rw-r--r--src/Gui/PluginsSettingsDialog.py17
-rw-r--r--src/Gui/SettingsDialog.py2
-rw-r--r--src/Gui/abrt_utils.py43
-rw-r--r--src/Hooks/abrt_exception_handler.py.in2
20 files changed, 323 insertions, 170 deletions
diff --git a/src/CLI/dbus.cpp b/src/CLI/dbus.cpp
index b218679..0d03c4d 100644
--- a/src/CLI/dbus.cpp
+++ b/src/CLI/dbus.cpp
@@ -184,7 +184,8 @@ int32_t call_DeleteDebugDump(const char* uuid)
return result;
}
-vector_map_string_t call_GetPluginsInfo()
+#ifdef UNUSED
+map_map_string_t call_GetPluginsInfo()
{
DBusMessage *msg = new_call_msg(__func__ + 5);
DBusMessage *reply = send_get_reply_and_unref(msg);
@@ -192,7 +193,7 @@ vector_map_string_t call_GetPluginsInfo()
DBusMessageIter in_iter;
dbus_message_iter_init(reply, &in_iter);
- vector_map_string_t argout;
+ map_map_string_t argout;
int r = load_val(&in_iter, argout);
if (r != ABRT_DBUS_LAST_FIELD) /* more values present, or bad type */
error_msg_and_die("dbus call %s: return type mismatch", __func__ + 5);
@@ -200,6 +201,7 @@ vector_map_string_t call_GetPluginsInfo()
dbus_message_unref(reply);
return argout;
}
+#endif
void handle_dbus_err(bool error_flag, DBusError *err)
{
diff --git a/src/CLI/dbus.h b/src/CLI/dbus.h
index 3c157c0..c692e19 100644
--- a/src/CLI/dbus.h
+++ b/src/CLI/dbus.h
@@ -28,15 +28,17 @@ map_crash_report_t call_CreateReport(const char *uuid);
report_status_t call_Report(const map_crash_report_t& report);
int32_t call_DeleteDebugDump(const char* uuid);
+#ifdef UNUSED
/* Gets basic data about all installed plugins.
*/
-vector_map_string_t call_GetPluginsInfo();
+map_map_string_t call_GetPluginsInfo();
/** Gets default plugin settings.
* @param name
- * Corresponds to name obtained from call_GetPluginsInfo.
+ * Corresponds to name obtained from call_GetPluginsInfo.
*/
map_plugin_settings_t call_GetPluginSettings(const char *name);
+#endif
void handle_dbus_err(bool error_flag, DBusError *err);
diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp
index 8589941..db0d2f5 100644
--- a/src/Daemon/CommLayerServerDBus.cpp
+++ b/src/Daemon/CommLayerServerDBus.cpp
@@ -325,11 +325,9 @@ static int handle_DeleteDebugDump(DBusMessage* call, DBusMessage* reply)
static int handle_GetPluginsInfo(DBusMessage* call, DBusMessage* reply)
{
- vector_map_string_t plugins_info = g_pPluginManager->GetPluginsInfo();
-
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
- store_val(&out_iter, plugins_info);
+ store_val(&out_iter, g_pPluginManager->GetPluginsInfo());
send_flush_and_unref(reply);
return 0;
@@ -348,9 +346,9 @@ static int handle_GetPluginSettings(DBusMessage* call, DBusMessage* reply)
return -1;
}
- long unix_uid = get_remote_uid(call);
- VERB1 log("got %s('%s') call from uid %ld", "GetPluginSettings", PluginName, unix_uid);
- map_plugin_settings_t plugin_settings = g_pPluginManager->GetPluginSettings(PluginName, to_string(unix_uid).c_str());
+ //long unix_uid = get_remote_uid(call);
+ //VERB1 log("got %s('%s') call from uid %ld", "GetPluginSettings", PluginName, unix_uid);
+ map_plugin_settings_t plugin_settings = g_pPluginManager->GetPluginSettings(PluginName); //, to_string(unix_uid).c_str());
DBusMessageIter out_iter;
dbus_message_iter_init_append(reply, &out_iter);
diff --git a/src/Daemon/Daemon.cpp b/src/Daemon/Daemon.cpp
index 09d8ab8..a2970af 100644
--- a/src/Daemon/Daemon.cpp
+++ b/src/Daemon/Daemon.cpp
@@ -65,7 +65,8 @@
* Returns report_status_t (map_vector_string_t) - the status of each call.
* 2nd parameter is the contents of user's abrt.conf.
* - DeleteDebugDump(UUID): delete it from DB and delete corresponding /var/cache/abrt/DIR
- * - GetPluginsInfo(): returns vector_map_string_t
+ * - GetPluginsInfo(): returns map_map_string_t
+ * map["plugin"] = { "Name": "plugin", "Enabled": "yes" ... }
* - GetPluginSettings(PluginName): returns map_plugin_settings_t (map_string_t)
* - SetPluginSettings(PluginName, map_plugin_settings_t): returns void
* - RegisterPlugin(PluginName): returns void
diff --git a/src/Daemon/PluginManager.cpp b/src/Daemon/PluginManager.cpp
index 136277c..c552880 100644
--- a/src/Daemon/PluginManager.cpp
+++ b/src/Daemon/PluginManager.cpp
@@ -27,6 +27,8 @@
#include "Polkit.h"
#include "PluginManager.h"
+using namespace std;
+
/**
* Text representation of plugin types.
*/
@@ -40,12 +42,12 @@ static const char *const plugin_type_str[] = {
bool LoadPluginSettings(const char *pPath, map_plugin_settings_t& pSettings)
{
- std::ifstream fIn;
+ ifstream fIn;
fIn.open(pPath);
if (!fIn.is_open())
return false;
- std::string line;
+ string line;
while (!fIn.eof())
{
getline(fIn, line);
@@ -54,8 +56,8 @@ bool LoadPluginSettings(const char *pPath, map_plugin_settings_t& pSettings)
bool is_value = false;
bool valid = false;
bool in_quote = false;
- std::string key;
- std::string value;
+ string key;
+ string value;
for (ii = 0; ii < line.length(); ii++)
{
if (line[ii] == '"')
@@ -157,6 +159,10 @@ void CPluginManager::UnLoadPlugins()
CPlugin* CPluginManager::LoadPlugin(const char *pName, bool enabled_only)
{
+ map_string_t plugin_info;
+
+ plugin_info["Name"] = pName;
+
map_plugin_t::iterator it_plugin = m_mapPlugins.find(pName);
if (it_plugin != m_mapPlugins.end())
{
@@ -170,8 +176,9 @@ CPlugin* CPluginManager::LoadPlugin(const char *pName, bool enabled_only)
conf_name = "Kerneloops";
}
map_plugin_settings_t pluginSettings;
- std::string conf_fullname = ssprintf(PLUGINS_CONF_DIR"/%s."PLUGINS_CONF_EXTENSION, conf_name);
+ string conf_fullname = ssprintf(PLUGINS_CONF_DIR"/%s."PLUGINS_CONF_EXTENSION, conf_name);
LoadPluginSettings(conf_fullname.c_str(), pluginSettings);
+ m_map_plugin_settings[pName] = pluginSettings;
VERB3 log("Loaded %s.conf", conf_name);
if (enabled_only)
@@ -179,12 +186,21 @@ CPlugin* CPluginManager::LoadPlugin(const char *pName, bool enabled_only)
map_plugin_settings_t::iterator it = pluginSettings.find("Enabled");
if (it == pluginSettings.end() || !string_to_bool(it->second.c_str()))
{
+ plugin_info["Enabled"] = "no";
+ string empty;
+ plugin_info["Type"] = empty;
+ plugin_info["Version"] = empty;
+ plugin_info["Description"] = empty;
+ plugin_info["Email"] = empty;
+ plugin_info["WWW"] = empty;
+ plugin_info["GTKBuilder"] = empty;
+ m_map_plugin_info[pName] = plugin_info;
VERB3 log("Plugin %s: 'Enabled' is not set, not loading it (yet)", pName);
return NULL; /* error */
}
}
- std::string libPath = ssprintf(PLUGINS_LIB_DIR"/"PLUGINS_LIB_PREFIX"%s."PLUGINS_LIB_EXTENSION, pName);
+ string libPath = ssprintf(PLUGINS_LIB_DIR"/"PLUGINS_LIB_PREFIX"%s."PLUGINS_LIB_EXTENSION, pName);
CLoadedModule* module = new CLoadedModule(libPath.c_str());
if (module->GetMagicNumber() != PLUGINS_MAGIC_NUMBER
|| module->GetType() < 0
@@ -217,6 +233,16 @@ CPlugin* CPluginManager::LoadPlugin(const char *pName, bool enabled_only)
return NULL; /* error */
}
+ plugin_info["Enabled"] = "yes";
+ plugin_info["Type"] = plugin_type_str[module->GetType()];
+ //plugin_info["Name"] = module->GetName();
+ plugin_info["Version"] = module->GetVersion();
+ plugin_info["Description"] = module->GetDescription();
+ plugin_info["Email"] = module->GetEmail();
+ plugin_info["WWW"] = module->GetWWW();
+ plugin_info["GTKBuilder"] = module->GetGTKBuilder();
+
+ m_map_plugin_info[pName] = plugin_info;
m_mapLoadedModules[pName] = module;
m_mapPlugins[pName] = plugin;
log("Registered %s plugin '%s'", plugin_type_str[module->GetType()], pName);
@@ -344,28 +370,6 @@ plugin_type_t CPluginManager::GetPluginType(const char *pName)
return it_module->second->GetType();
}
-vector_map_string_t CPluginManager::GetPluginsInfo()
-{
- vector_map_string_t ret;
- map_loaded_module_t::iterator it_module = m_mapLoadedModules.begin();
- for (; it_module != m_mapLoadedModules.end(); it_module++)
- {
- map_string_t plugin_info;
-
- plugin_info["Enabled"] = (m_mapPlugins.find(it_module->second->GetName()) != m_mapPlugins.end()) ?
- "yes" : "no";
- plugin_info["Type"] = plugin_type_str[it_module->second->GetType()];
- plugin_info["Name"] = it_module->second->GetName();
- plugin_info["Version"] = it_module->second->GetVersion();
- plugin_info["Description"] = it_module->second->GetDescription();
- plugin_info["Email"] = it_module->second->GetEmail();
- plugin_info["WWW"] = it_module->second->GetWWW();
- plugin_info["GTKBuilder"] = it_module->second->GetGTKBuilder();
- ret.push_back(plugin_info);
- }
- return ret;
-}
-
void CPluginManager::SetPluginSettings(const char *pName,
const char *pUID,
const map_plugin_settings_t& pSettings)
@@ -388,14 +392,14 @@ void CPluginManager::SetPluginSettings(const char *pName,
return;
}
- std::string home = get_home_dir(xatoi_u(pUID.c_str()));
+ string home = get_home_dir(xatoi_u(pUID.c_str()));
if (home == "")
{
return;
}
- std::string confDir = home + "/.abrt";
- std::string confPath = confDir + "/" + pName + "."PLUGINS_CONF_EXTENSION;
+ string confDir = home + "/.abrt";
+ string confPath = confDir + "/" + pName + "."PLUGINS_CONF_EXTENSION;
uid_t uid = xatoi_u(pUID.c_str());
struct passwd* pw = getpwuid(uid);
gid_t gid = pw ? pw->pw_gid : uid;
@@ -440,33 +444,31 @@ void CPluginManager::SetPluginSettings(const char *pName,
#endif
}
-map_plugin_settings_t CPluginManager::GetPluginSettings(const char *pName,
- const char *pUID)
+map_plugin_settings_t CPluginManager::GetPluginSettings(const char *pName)
{
map_plugin_settings_t ret;
+
map_loaded_module_t::iterator it_module = m_mapLoadedModules.find(pName);
if (it_module != m_mapLoadedModules.end())
{
map_plugin_t::iterator it_plugin = m_mapPlugins.find(pName);
if (it_plugin != m_mapPlugins.end())
{
+ VERB3 log("Returning settings for loaded plugin %s", pName);
ret = it_plugin->second->GetSettings();
- /** we don't want to load it from daemon if it's running under root
- but wi might get back to this once we make the daemon to not run
- with root privileges
- */
- /*
- if (it_module->second->GetType() == REPORTER)
- {
- std::string home = get_home_dir(xatoi_u(pUID.c_str()));
- if (home != "")
- {
- LoadPluginSettings(home + "/.abrt/" + pName + "."PLUGINS_CONF_EXTENSION, ret);
- }
- }
- */
return ret;
}
}
+ /* else: module is not loaded */
+ map_map_string_t::iterator it_settings = m_map_plugin_settings.find(pName);
+ if (it_settings != m_map_plugin_settings.end())
+ {
+ /* but it exists, its settings are available nevertheless */
+ VERB3 log("Returning settings for non-loaded plugin %s", pName);
+ ret = it_settings->second;
+ return ret;
+ }
+
+ VERB3 log("Request for settings of unknown plugin %s, returning null result", pName);
return ret;
}
diff --git a/src/Daemon/PluginManager.h b/src/Daemon/PluginManager.h
index d3e686c..22cc387 100644
--- a/src/Daemon/PluginManager.h
+++ b/src/Daemon/PluginManager.h
@@ -50,6 +50,11 @@ class CPluginManager
* Registered plugins. A key is a plugin name.
*/
map_plugin_t m_mapPlugins;
+ /**
+ * List of all possible plugins (loaded or not), with some attributes.
+ */
+ map_map_string_t m_map_plugin_info;
+ map_map_string_t m_map_plugin_settings;
public:
/**
@@ -130,7 +135,7 @@ class CPluginManager
* Then user can fill all needed informations like URLs etc.
* @return A vector of maps <key, value>
*/
- vector_map_string_t GetPluginsInfo();
+ const map_map_string_t& GetPluginsInfo() { return m_map_plugin_info; }
/**
* A method, which sets up a plugin. The settings are also saved in home
* directory of an user.
@@ -144,11 +149,9 @@ class CPluginManager
/**
* A method, which returns plugin's settings according to user.
* @param pName A plugin name.
- * @param pUID An uid of user.
- * @return Plugin's settings accorting to user.
+ * @return Plugin's settings.
*/
- map_plugin_settings_t GetPluginSettings(const char *pName,
- const char *pUID);
+ map_plugin_settings_t GetPluginSettings(const char *pName);
};
/**
diff --git a/src/Gui/ABRTExceptions.py b/src/Gui/ABRTExceptions.py
index c4d6b59..c857f71 100644
--- a/src/Gui/ABRTExceptions.py
+++ b/src/Gui/ABRTExceptions.py
@@ -1,4 +1,4 @@
-from abrt_utils import _
+from abrt_utils import _, log, log1, log2
class IsRunning(Exception):
def __init__(self):
diff --git a/src/Gui/ABRTPlugin.py b/src/Gui/ABRTPlugin.py
index 03b61fb..320c81c 100644
--- a/src/Gui/ABRTPlugin.py
+++ b/src/Gui/ABRTPlugin.py
@@ -10,15 +10,15 @@ Type
Email
Description
"""
-from abrt_utils import _
-from ConfBackend import ConfBackendGnomeKeyring, ConfBackendInitError
+from abrt_utils import _, log, log1, log2
+from ConfBackend import getCurrentConfBackend, ConfBackendInitError
class PluginSettings(dict):
def __init__(self):
dict.__init__(self)
self.client_side_conf = None
try:
- self.client_side_conf = ConfBackendGnomeKeyring()
+ self.client_side_conf = getCurrentConfBackend()
except ConfBackendInitError, e:
print e
pass
@@ -53,7 +53,8 @@ class PluginSettings(dict):
class PluginInfo():
"""Class to represent common plugin info"""
- types = {"Analyzer":_("Analyzer plugins"),
+ types = {"":_("Not loaded plugins"),
+ "Analyzer":_("Analyzer plugins"),
"Action":_("Action plugins"),
"Reporter":_("Reporter plugins"),
"Database":_("Database plugins")}
@@ -62,7 +63,6 @@ class PluginInfo():
"Type", "Email", "Description"]
def __init__(self):
- #print "Init PluginInfo"
self.WWW = None
self.Name = None
self.Enabled = None
@@ -95,7 +95,7 @@ class PluginInfo():
if self.Name:
self.Settings.load_daemon_settings(self.Name, daemon_settings)
else:
- print _("Plugin name is not set, can't load its settings")
+ log("Plugin name is not set, can't load its settings")
def save_settings_on_client_side(self):
self.Settings.save_on_client_side(str(self.Name))
diff --git a/src/Gui/CCDBusBackend.py b/src/Gui/CCDBusBackend.py
index ac378f4..f4ef104 100644
--- a/src/Gui/CCDBusBackend.py
+++ b/src/Gui/CCDBusBackend.py
@@ -6,7 +6,7 @@ from dbus.mainloop.glib import DBusGMainLoop
import gtk
from dbus.exceptions import *
import ABRTExceptions
-from abrt_utils import _
+from abrt_utils import _, log, log1, log2
CC_NAME = 'com.redhat.abrt'
CC_IFACE = 'com.redhat.abrt'
@@ -40,7 +40,7 @@ class DBusManager(gobject.GObject):
if session:
try:
- app_proxy = session.get_object(APP_NAME,APP_PATH)
+ app_proxy = session.get_object(APP_NAME, APP_PATH)
app_iface = dbus.Interface(app_proxy, dbus_interface=APP_IFACE)
# app is running, so make it show it self
app_iface.show()
@@ -111,13 +111,13 @@ class DBusManager(gobject.GObject):
# def disconnected(self, *args):
# print "disconnect"
- def error_handler_cb(self,error):
- self.emit("abrt-error",error)
+ def error_handler_cb(self, error):
+ self.emit("abrt-error", error)
- def warning_handler_cb(self,arg):
- self.emit("warning",arg)
+ def warning_handler_cb(self, arg):
+ self.emit("warning", arg)
- def error_handler(self,arg):
+ def error_handler(self, arg):
# used to silently ingore dbus timeouts
pass
@@ -134,11 +134,11 @@ class DBusManager(gobject.GObject):
self.emit("crash")
def update_cb(self, message, job_id=0):
- print "Update >>%s<<" % message
+ log1("Update:%s", message)
self.emit("update", message)
def warning_cb(self, message, job_id=0):
- print "Warning >>%s<<" % message
+ log1("Warning:%s", message)
self.emit("warning", message)
def owner_changed_cb(self,name, old_owner, new_owner):
@@ -151,7 +151,7 @@ class DBusManager(gobject.GObject):
def jobdone_cb(self, dest, uuid):
# TODO: check that it is indeed OUR job:
# remember uuid in getReport and compare here
- print "Our job for UUID %s is done." % uuid
+ log1("Our job for UUID %s is done", uuid)
dump = self.daemon().CreateReport(uuid)
if dump:
self.emit("analyze-complete", dump)
@@ -191,8 +191,6 @@ class DBusManager(gobject.GObject):
def getPluginSettings(self, plugin_name):
settings = self.daemon().GetPluginSettings(plugin_name)
- #for i in settings.keys():
- # print i
return settings
# "Enable" toggling in GUI is disabled for now. Grep for PLUGIN_DYNAMIC_LOAD_UNLOAD
@@ -210,6 +208,6 @@ class DBusManager(gobject.GObject):
def setSettings(self, settings):
# FIXME: STUB!!!!
- print "setSettings stub"
+ log1("setSettings stub")
retval = self.daemon().SetSettings(self.daemon().GetSettings())
print ">>>", retval
diff --git a/src/Gui/CCDumpList.py b/src/Gui/CCDumpList.py
index 09191f5..a8657e0 100644
--- a/src/Gui/CCDumpList.py
+++ b/src/Gui/CCDumpList.py
@@ -6,7 +6,6 @@ class DumpList(list):
"""Class to store list of debug dumps"""
def __init__(self,dbus_manager=None):
self.dm = dbus_manager
- self.ddict = {}
def load(self):
if self.dm:
@@ -21,7 +20,6 @@ class DumpList(list):
# print "DumpList adding %s:%s" % (column,row[column])
entry.__dict__[column] = row[column]
self.append(entry)
- self.ddict[entry.getUUID()] = entry
except Exception, e:
# FIXME handle exception better
# this is just temporary workaround for rhbz#543725
diff --git a/src/Gui/CCMainWindow.py b/src/Gui/CCMainWindow.py
index f4e3a73..dcb71ae 100644
--- a/src/Gui/CCMainWindow.py
+++ b/src/Gui/CCMainWindow.py
@@ -2,6 +2,7 @@
import sys
import os
import pwd
+import getopt
import pygtk
pygtk.require("2.0")
import gobject
@@ -10,8 +11,14 @@ try:
except RuntimeError,e:
# rhbz#552039
print e
- os.exit()
+ sys.exit()
import gtk.glade
+try:
+ import rpm
+except Exception, ex:
+ rpm = None
+
+from ConfBackend import getCurrentConfBackend, ConfBackendInitError
import CCDBusBackend
from CC_gui_functions import *
from CCDumpList import getDumpList, DumpList
@@ -21,12 +28,7 @@ from SettingsDialog import SettingsDialog
from CCReport import Report
from PluginList import getPluginInfoList
import ABRTExceptions
-from abrt_utils import _
-
-try:
- import rpm
-except Exception, ex:
- rpm = None
+from abrt_utils import _, init_logging, log, log1, log2
class MainWindow():
@@ -41,11 +43,10 @@ class MainWindow():
sys.exit()
except Exception, e:
# show error message if connection fails
- # FIXME add an option to start the daemon
gui_error_message("%s" % e)
sys.exit()
#Set the Glade file
- self.gladefile = "%s%sccgui.glade" % (sys.path[0],"/")
+ self.gladefile = "%s/ccgui.glade" % sys.path[0]
self.wTree = gtk.glade.XML(self.gladefile)
#Get the Main Window, and connect the "destroy" event
@@ -233,9 +234,11 @@ class MainWindow():
# it is not informative (no URL to the report)
for message in dump.getMessage().split('\n'):
if message:
- if "http" in message[0:5] or "file:///"[0:8] in message:
- message = "<a href=\"%s\">%s</a>" % (message, message)
+ #Doesn't work (far too easy to make it worse, not better):
+ #if "http" in message[0:5] or "file:///"[0:8] in message:
+ # message = "<a href=\"%s\">%s</a>" % (message, message)
report_label += "%s\n" % message
+ log2("setting markup '%s'", report_label)
self.wTree.get_widget("lReported").set_markup(report_label)
else:
self.wTree.get_widget("lReported").set_markup(_("<b>Not reported!</b>"))
@@ -297,13 +300,20 @@ class MainWindow():
try:
self.pBarWindow.show_all()
self.timer = gobject.timeout_add(100, self.progress_update_cb)
- reporters_settings = {}
- # self.pluginlist = getPluginInfoList(self.ccdaemon, refresh=True)
- # don't force refresh!
- self.pluginlist = getPluginInfoList(self.ccdaemon)
- for plugin in self.pluginlist.getReporterPlugins():
- reporters_settings[str(plugin)] = plugin.Settings
+ # Old way: it needs to talk to daemon
+ #reporters_settings = {}
+ ## self.pluginlist = getPluginInfoList(self.ccdaemon, refresh=True)
+ ## don't force refresh!
+ #self.pluginlist = getPluginInfoList(self.ccdaemon)
+ #for plugin in self.pluginlist.getReporterPlugins():
+ # reporters_settings[str(plugin)] = plugin.Settings
+ reporters_settings = getCurrentConfBackend().load_all()
+ log2("Report(result,settings):")
+ log2(" result:%s", str(result))
+ # Careful, this will print reporters_settings["Password"] too
+ log2(" settings:%s", str(reporters_settings))
self.ccdaemon.Report(result, reporters_settings)
+ log2("Report() returned")
#self.hydrate()
except Exception, e:
gui_error_message(_("Reporting failed!\n%s" % e))
@@ -381,8 +391,19 @@ class MainWindow():
self.window.present()
if __name__ == "__main__":
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], "v")
+ except getopt.GetoptError, err:
+ print str(err) # prints something like "option -a not recognized"
+ sys.exit(2)
+ verbose = 0
+ for opt, arg in opts:
+ if opt == "-v":
+ verbose += 1
+ init_logging("abrt-gui", verbose)
+ log1("log level:%d", verbose)
+
cc = MainWindow()
cc.hydrate()
cc.show()
gtk.main()
-
diff --git a/src/Gui/CCReporterDialog.py b/src/Gui/CCReporterDialog.py
index bba8942..ab6ad0f 100644
--- a/src/Gui/CCReporterDialog.py
+++ b/src/Gui/CCReporterDialog.py
@@ -12,7 +12,7 @@ from ABRTPlugin import PluginInfo
from PluginSettingsUI import PluginSettingsUI
from PluginList import getPluginInfoList
#from CCDumpList import getDumpList, DumpList
-from abrt_utils import _
+from abrt_utils import _, log, log1, log2
# FIXME - create method or smth that returns type|editable|content
CD_TYPE = 0
diff --git a/src/Gui/CC_gui_functions.py b/src/Gui/CC_gui_functions.py
index 0532ab7..0379f20 100644
--- a/src/Gui/CC_gui_functions.py
+++ b/src/Gui/CC_gui_functions.py
@@ -15,13 +15,15 @@ try:
import rpm
except:
rpm = None
+from abrt_utils import _, log, log1, log2
+
def on_url_clicked(label, url):
import gnomevfs
file_mimetype = gnomevfs.get_mime_type(url)
default_app = gnomevfs.mime_get_default_application(file_mimetype)
if default_app:
- #print "Default Application:", default_app[2]
+ log2("default application:%s", default_app[2])
subprocess.Popen([default_app[2], url])
def gui_report_dialog ( report_status_dict, parent_dialog,
@@ -160,8 +162,8 @@ def gui_question_dialog ( message, parent_dialog=None,
dialog.destroy()
return ret
-def get_icon_for_package(theme,package):
- #print package
+def get_icon_for_package(theme, package):
+ log2("get_icon_for_package('%s')", package)
try:
return theme.load_icon(package, 22, gtk.ICON_LOOKUP_USE_BUILTIN)
except:
@@ -169,7 +171,7 @@ def get_icon_for_package(theme,package):
if not rpm:
return None
ts = rpm.TransactionSet()
- mi = ts.dbMatch( 'name', package )
+ mi = ts.dbMatch('name', package)
possible_icons = []
icon_filename = ""
filenames = ""
@@ -180,19 +182,19 @@ def get_icon_for_package(theme,package):
if filename.rfind(".png") != -1:
possible_icons.append(filename)
if filename.rfind(".desktop") != -1:
- #print filename
+ log2("desktop file:'%s'", filename)
desktop_file = open(filename, 'r')
lines = desktop_file.readlines()
for line in lines:
if line.find("Icon=") != -1:
- #print line[5:-1]
+ log2("Icon='%s'", line[5:-1])
icon_filename = line[5:-1]
break
desktop_file.close()
# .dektop file found
for filename in h['filenames']:
if filename.rfind("%s.png" % icon_filename) != -1:
- #print filename
+ log2("png file:'%s'", filename)
icon_filename = filename
break
#we didn't find the .desktop file
@@ -205,8 +207,8 @@ def get_icon_for_package(theme,package):
if icon_filename:
break
if icon_filename:
- #print "icon created form %s" % icon_filename
- return gtk.gdk.pixbuf_new_from_file_at_size(icon_filename,22,22)
+ log1("icon created from %s", icon_filename)
+ return gtk.gdk.pixbuf_new_from_file_at_size(icon_filename, 22, 22)
else:
return None
diff --git a/src/Gui/ConfBackend.py b/src/Gui/ConfBackend.py
index 1d6ac9e..0d47760 100644
--- a/src/Gui/ConfBackend.py
+++ b/src/Gui/ConfBackend.py
@@ -1,9 +1,8 @@
-from abrt_utils import _
+from abrt_utils import _, log, log1, log2
# Doc on Gnome keyring API:
# http://library.gnome.org/devel/gnome-keyring/stable/
-
-#FIXME: add some backend factory
+# Python bindings are in gnome-python2-desktop package
try:
import gnomekeyring as gkey
@@ -48,22 +47,28 @@ class ConfBackend(object):
#
# Example: Key "abrt:Bugzilla" with bugzilla password as value, and with attributes:
#
+# Application: abrt
# AbrtPluginInfo: Bugzilla
# NoSSLVerify: yes
# Login: user@host.com
# BugzillaURL: https://host.with.bz.com/
#
-# The attribute "AbrtPluginInfo" is special, it is used for retrieving
-# the key via keyring API find_items_sync() function.
+# Attributes "Application" and "AbrtPluginInfo" are special, they are used
+# for efficient key retrieval via keyring API find_items_sync() function.
+g_default_key_ring = None
class ConfBackendGnomeKeyring(ConfBackend):
def __init__(self):
+ global g_default_key_ring
+
ConfBackend.__init__(self)
- if not gkey.is_available():
+ if g_default_key_ring:
+ return
+ if not gkey or not gkey.is_available():
raise ConfBackendInitError(_("Can't connect to Gnome Keyring daemon"))
try:
- self.default_key_ring = gkey.get_default_keyring_sync()
+ g_default_key_ring = gkey.get_default_keyring_sync()
except:
# could happen if keyring daemon is running, but we run gui under
# user who is not the owner of the running session - using su
@@ -71,31 +76,35 @@ class ConfBackendGnomeKeyring(ConfBackend):
def save(self, name, settings):
settings_tmp = settings.copy()
+ settings_tmp["Application"] = "abrt"
settings_tmp["AbrtPluginInfo"] = name
- password = ""
- item_list = []
+ # delete all keyring items containg "AbrtPluginInfo":"<plugin_name>",
+ # so we always have only 1 item per plugin
try:
- item_list = gkey.find_items_sync(gkey.ITEM_GENERIC_SECRET, {"AbrtPluginInfo":str(name)})
+ item_list = gkey.find_items_sync(gkey.ITEM_GENERIC_SECRET, { "AbrtPluginInfo": str(name) })
+ for item in item_list:
+ log2("found old keyring item: ring:'%s' item_id:%s attrs:%s", item.keyring, item.item_id, str(item.attributes))
+ log2("deleting it from keyring '%s'", g_default_key_ring)
+ gkey.item_delete_sync(g_default_key_ring, item.item_id)
except gkey.NoMatchError:
# nothing found
pass
except gkey.DeniedError:
raise ConfBackendSaveError(_("Access to gnome-keyring has been denied, plugins settings won't be saved."))
-
- # delete all items containg "AbrtPluginInfo":<plugin_name>, so we always have only 1 item per plugin
- for item in item_list:
- gkey.item_delete_sync(self.default_key_ring, item.item_id)
-
+ # if plugin has a "Password" setting, we handle it specially: in keyring,
+ # it is stored as item.secret, not as one of attributes
+ password = ""
if "Password" in settings_tmp:
password = settings_tmp["Password"]
del settings_tmp["Password"]
+ # store new settings for this plugin as one keyring item
try:
- gkey.item_create_sync(self.default_key_ring,
+ gkey.item_create_sync(g_default_key_ring,
gkey.ITEM_GENERIC_SECRET,
- "abrt:%s" % name,
- settings_tmp,
- password,
+ "abrt:%s" % name, # display_name
+ settings_tmp, # attrs
+ password, # secret
True)
except gkey.DeniedError, e:
raise ConfBackendSaveError(_("Access to gnome-keyring has been denied, plugins settings won't be saved."))
@@ -103,17 +112,110 @@ class ConfBackendGnomeKeyring(ConfBackend):
def load(self, name):
item_list = None
try:
+ log2("looking for keyring items with 'AbrtPluginInfo:%s' attr", str(name))
item_list = gkey.find_items_sync(gkey.ITEM_GENERIC_SECRET, {"AbrtPluginInfo":str(name)})
+ for item in item_list:
+ # gnome keyring is weeeeird. why display_name, type, mtime, ctime
+ # aren't available in find_items_sync() results? why we need to
+ # get them via additional call, item_get_info_sync()?
+ # internally, item has GNOME_KEYRING_TYPE_FOUND type,
+ # and info has GNOME_KEYRING_TYPE_ITEM_INFO type.
+ # why not use the same type for both?
+ #
+ # and worst of all, this information took four hours of googling...
+ #
+ #info = gkey.item_get_info_sync(item.keyring, item.item_id)
+ log2("found keyring item: ring:'%s' item_id:%s attrs:%s", # "secret:'%s' display_name:'%s'"
+ item.keyring, item.item_id, str(item.attributes) #, item.secret, info.get_display_name()
+ )
except gkey.NoMatchError:
# nothing found
pass
-
if item_list:
retval = item_list[0].attributes.copy()
retval["Password"] = item_list[0].secret
return retval
- else:
- return {}
- #for i in item_list:
- # for attr in i.attributes:
- # print attr, i.attributes[attr]
+ return {}
+
+ # This routine loads setting for all plugins. It doesn't need plugin name.
+ # Thus we can avoid talking to abrtd just in order to get plugin names.
+ def load_all(self):
+ retval = {}
+ item_list = {}
+
+ # UGLY compat cludge for users who has saved items without "Application" attr
+ # (abrt <= 1.0.3 was saving those)
+ item_ids = gkey.list_item_ids_sync(g_default_key_ring)
+ log2("all keyring item ids:%s", item_ids)
+ for item_id in item_ids:
+ info = gkey.item_get_info_sync(g_default_key_ring, item_id)
+ attrs = gkey.item_get_attributes_sync(g_default_key_ring, item_id)
+ log2("keyring item %s: attrs:%s", item_id, str(attrs))
+ if "AbrtPluginInfo" in attrs:
+ if not "Application" in attrs:
+ log2("updating old-style keyring item")
+ attrs["Application"] = "abrt"
+ try:
+ gkey.item_set_attributes_sync(g_default_key_ring, item_id, attrs)
+ except:
+ log2("error updating old-style keyring item")
+ plugin_name = attrs["AbrtPluginInfo"]
+ # If plugin has a "Password" setting, we handle it specially: in keyring,
+ # it is stored as item.secret, not as one of attributes
+ if info.get_secret():
+ attrs["Password"] = info.get_secret()
+ # avoiding sending useless duplicate info over dbus...
+ del attrs["AbrtPluginInfo"]
+ try:
+ del attrs["Application"]
+ except:
+ pass
+ retval[plugin_name] = attrs;
+ # end of UGLY compat cludge
+
+ try:
+ log2("looking for keyring items with 'Application:abrt' attr")
+ item_list = gkey.find_items_sync(gkey.ITEM_GENERIC_SECRET, { "Application": "abrt" })
+ except gkey.NoMatchError:
+ # nothing found
+ pass
+ for item in item_list:
+ # gnome keyring is weeeeird. why display_name, type, mtime, ctime
+ # aren't available in find_items_sync() results? why we need to
+ # get them via additional call, item_get_info_sync()?
+ # internally, item has GNOME_KEYRING_TYPE_FOUND type,
+ # and info has GNOME_KEYRING_TYPE_ITEM_INFO type.
+ # why not use the same type for both?
+ #
+ # and worst of all, this information took four hours of googling...
+ #
+ #info = gkey.item_get_info_sync(item.keyring, item.item_id)
+ log2("found keyring item: ring:%s item_id:%s attrs:%s", # "secret:%s display_name:'%s'"
+ item.keyring, item.item_id, str(item.attributes) #, item.secret, info.get_display_name()
+ )
+ attrs = item.attributes.copy()
+ if "AbrtPluginInfo" in attrs:
+ plugin_name = attrs["AbrtPluginInfo"]
+ # If plugin has a "Password" setting, we handle it specially: in keyring,
+ # it is stored as item.secret, not as one of attributes
+ if item.secret:
+ attrs["Password"] = item.secret
+ # avoiding sending useless duplicate info over dbus...
+ del attrs["AbrtPluginInfo"]
+ try:
+ del attrs["Application"]
+ except:
+ pass
+ retval[plugin_name] = attrs;
+ return retval
+
+
+# Rudimentary backend factory
+
+currentConfBackend = None
+
+def getCurrentConfBackend():
+ global currentConfBackend
+ if not currentConfBackend:
+ currentConfBackend = ConfBackendGnomeKeyring()
+ return currentConfBackend
diff --git a/src/Gui/PluginList.py b/src/Gui/PluginList.py
index 79df126..d2232bb 100644
--- a/src/Gui/PluginList.py
+++ b/src/Gui/PluginList.py
@@ -1,31 +1,27 @@
# -*- coding: utf-8 -*-
import CCDBusBackend
from ABRTPlugin import PluginInfo, PluginSettings
+from abrt_utils import _, log, log1, log2
class PluginInfoList(list):
"""Class to store list of PluginInfos"""
def __init__(self,dbus_manager=None):
self.dm = dbus_manager
- self.ddict = {}
def load(self):
if self.dm:
- #print "loading PluginList"
rows = self.dm.getPluginsInfo()
- #print rows
- for row in rows:
+ for plugin_name in rows:
+ row = rows[plugin_name]
entry = PluginInfo()
- for column in row:
- #print "PluginInfoList adding %s:%s" % (column,row[column])
- entry.__dict__[column] = row[column]
- if entry.Enabled == "yes":
- #entry.Settings = PluginSettings(self.dm.getPluginSettings(str(entry)))
- daemon_settings = self.dm.getPluginSettings(str(entry))
- entry.load_daemon_settings(daemon_settings)
+ for attr_name in row:
+ log2("PluginInfoList: adding %s[%s]:%s", plugin_name, attr_name, row[attr_name])
+ entry.__dict__[attr_name] = row[attr_name]
+ daemon_settings = self.dm.getPluginSettings(plugin_name)
+ entry.load_daemon_settings(daemon_settings)
self.append(entry)
- self.ddict[entry.getName()] = entry
else:
- print "db == None!"
+ log("PluginInfoList: db == None")
def getEnabledPlugins(self):
return [x for x in self if x["Enabled"] == 'yes']
diff --git a/src/Gui/PluginSettingsUI.py b/src/Gui/PluginSettingsUI.py
index a26f87f..c324b31 100644
--- a/src/Gui/PluginSettingsUI.py
+++ b/src/Gui/PluginSettingsUI.py
@@ -1,5 +1,5 @@
import gtk
-from abrt_utils import _
+from abrt_utils import _, log, log1, log2
class PluginSettingsUI(gtk.Dialog):
def __init__(self, pluginfo, parent=None):
diff --git a/src/Gui/PluginsSettingsDialog.py b/src/Gui/PluginsSettingsDialog.py
index 0d41962..611a8c5 100644
--- a/src/Gui/PluginsSettingsDialog.py
+++ b/src/Gui/PluginsSettingsDialog.py
@@ -4,7 +4,7 @@ from PluginList import getPluginInfoList, PluginInfoList
from CC_gui_functions import *
from PluginSettingsUI import PluginSettingsUI
from ABRTPlugin import PluginSettings, PluginInfo
-from abrt_utils import _
+from abrt_utils import _, log, log1, log2
class PluginsSettingsDialog:
@@ -13,7 +13,7 @@ class PluginsSettingsDialog:
self.ccdaemon = daemon
self.builder = gtk.Builder()
- builderfile = "%s%ssettings.glade" % (sys.path[0],"/")
+ builderfile = "%s%ssettings.glade" % (sys.path[0], "/")
#print builderfile
try:
self.builder.add_from_file(builderfile)
@@ -99,13 +99,20 @@ class PluginsSettingsDialog:
except Exception, e:
print e
#gui_error_message("Error while loading plugins info, please check if abrt daemon is running\n %s" % e)
+ return
plugin_rows = {}
for plugin_type in PluginInfo.types.keys():
- it = self.pluginsListStore.append(None, ["<b>%s</b>" % PluginInfo.types[plugin_type], 0, 0, 1, "gray", None])
+ it = self.pluginsListStore.append(None,
+ ["<b>%s</b>" % PluginInfo.types[plugin_type], 0, 0, 1, "gray", None])
plugin_rows[plugin_type] = it
for entry in pluginlist:
+ if entry.Description:
+ text = "<b>%s</b>\n%s" % (entry.getName(), entry.Description)
+ else:
+ # non-loaded plugins have empty description
+ text = "<b>%s</b>" % entry.getName()
self.pluginsListStore.append(plugin_rows[entry.getType()],
- ["<b>%s</b>\n%s" % (entry.getName(), entry.Description), entry.Enabled == "yes", 1, 0, "white", entry])
+ [text, entry.Enabled == "yes", 1, 0, "white", entry])
self.pluginlist.expand_all()
def dehydrate(self):
@@ -149,7 +156,7 @@ class PluginsSettingsDialog:
elif response == gtk.RESPONSE_CANCEL:
pass
else:
- print _("unknown response from settings dialog")
+ log("unknown response from settings dialog:%d", response)
ui.destroy()
def on_bClose_clicked(self, button):
diff --git a/src/Gui/SettingsDialog.py b/src/Gui/SettingsDialog.py
index c2b292f..893c23f 100644
--- a/src/Gui/SettingsDialog.py
+++ b/src/Gui/SettingsDialog.py
@@ -3,7 +3,7 @@ import gtk
from PluginList import getPluginInfoList
from CC_gui_functions import *
#from PluginSettingsUI import PluginSettingsUI
-from abrt_utils import _
+from abrt_utils import _, log, log1, log2
#FIXME: create a better struct, to automatize hydrate/dehydrate process
diff --git a/src/Gui/abrt_utils.py b/src/Gui/abrt_utils.py
index 6122b9c..2fabb54 100644
--- a/src/Gui/abrt_utils.py
+++ b/src/Gui/abrt_utils.py
@@ -1,16 +1,37 @@
+import sys
import gtk.glade
+
PROGNAME = "abrt"
+g_verbose = 0
+
import locale
-try:
- locale.setlocale (locale.LC_ALL, "")
-except locale.Error, e:
- import os
- os.environ['LC_ALL'] = 'C'
- locale.setlocale (locale.LC_ALL, "")
import gettext
-gettext.bind_textdomain_codeset(PROGNAME,locale.nl_langinfo(locale.CODESET))
-gettext.bindtextdomain(PROGNAME, '/usr/share/locale')
-gtk.glade.bindtextdomain(PROGNAME, '/usr/share/locale')
-gtk.glade.textdomain(PROGNAME)
-gettext.textdomain(PROGNAME)
+
_ = lambda x: gettext.lgettext(x)
+
+def init_logging(progname, v):
+ global PROGNAME, g_verbose
+ PROGNAME = progname
+ g_verbose = v
+ try:
+ locale.setlocale(locale.LC_ALL, "")
+ except locale.Error, e:
+ import os
+ os.environ['LC_ALL'] = 'C'
+ locale.setlocale(locale.LC_ALL, "")
+ gettext.bind_textdomain_codeset(PROGNAME, locale.nl_langinfo(locale.CODESET))
+ gettext.bindtextdomain(PROGNAME, '/usr/share/locale')
+ gtk.glade.bindtextdomain(PROGNAME, '/usr/share/locale')
+ gtk.glade.textdomain(PROGNAME)
+ gettext.textdomain(PROGNAME)
+
+def log(fmt, *args):
+ sys.stderr.write("%s: %s\n" % (PROGNAME, fmt % args))
+
+def log1(fmt, *args):
+ if g_verbose >= 1:
+ sys.stderr.write("%s: %s\n" % (PROGNAME, fmt % args))
+
+def log2(fmt, *args):
+ if g_verbose >= 2:
+ sys.stderr.write("%s: %s\n" % (PROGNAME, fmt % args))
diff --git a/src/Hooks/abrt_exception_handler.py.in b/src/Hooks/abrt_exception_handler.py.in
index a0b0519..e0e1954 100644
--- a/src/Hooks/abrt_exception_handler.py.in
+++ b/src/Hooks/abrt_exception_handler.py.in
@@ -213,7 +213,7 @@ def handleMyException((etype, value, tb)):
text += ("\nLocal variables in innermost frame:\n")
try:
for (key, val) in frame.f_locals.items():
- text += "%s: %s\n" % (key, val)
+ text += "%s: %s\n" % (key, repr(val))
except:
pass