[Crash-catcher] abrt plugins
by Jiri Moskovcak
Hi,
I got an idea about the reporters which I'd like to share and maybe
implement if we agree on it. So here it comes:
As you know our reporters has pretty limited options how to communicate
with users - they can only return some text to display. But what if the
plugin would like to ask user to do some action - like use other plugin
or run some command? So we can change the type of the return value to
something better like:
struct report_result {
type: {MESSAGE,ACTION,PLUGIN}
content:
- depends on type, but its always a string:
-> for MESSAGE it would be the message
-> for ACTION it would be a command
-> for PLUGIN it would be the plugin name to use which
might be then represented as a button in gui
}
or maybe a list of these structs, so we can return a message and action
or more actions ...
Ideas?
J.
14 years, 3 months
[Crash-catcher] [PATCH] choosing reporters when reporting in abrt-cli
by Karel Klic
Hi,
The attached patch allows user to select which reporter he wants to use
to report a crash using CLI. The daemon skips reporters which are
not in the list of reporters provided via Report() dbus call.
src/CLI/dbus.cpp
- added GetSettings dbus call
- send reporters list when calling dbus Report()
src/CLI/report.cpp
- new functions split()
- new function get_enabled_reporters(crash_report)
- new function ask_yesno(question)
- get_reporter_plugin_settings now gets the list of reporters
- report using all reporters only in the --report-always mode
- ask if user wants to report using a particular reporter;
if he agrees, then check the reporter configuration
(and ask for login/password if it's missing)
src/Daemon/CommLayerServerDBus.cpp
- pass reporter list from Report() dbus call to Report()
implementation in MiddleWare.cpp
src/Daemon/MiddleWare.cpp
- skip reporters which are not in the list in Report()
- removed old commented ~/.abrt code which is now in CLI
Best regards,
Karel
14 years, 3 months
[Crash-catcher] [PATCH] bz reporter: s/uuid/duphash; moe understandable message; simplify result str generation; fix indentation
by Denys Vlasenko
No substantial code changes.
Please review.
diff -x '*.po' -d -urpN abrt.3/lib/Plugins/Bugzilla.cpp abrt.4/lib/Plugins/Bugzilla.cpp
--- abrt.3/lib/Plugins/Bugzilla.cpp 2010-03-17 13:01:15.000000000 +0100
+++ abrt.4/lib/Plugins/Bugzilla.cpp 2010-03-17 15:48:43.092151654 +0100
@@ -106,7 +106,7 @@ struct ctx: public abrt_xmlrpc_conn {
const char* get_bug_resolution(xmlrpc_value* result_xml);
const char* get_bug_reporter(xmlrpc_value* result_xml);
- xmlrpc_value* call_quicksearch_uuid(const char* component, const char* uuid);
+ xmlrpc_value* call_quicksearch_duphash(const char* component, const char* duphash);
xmlrpc_value* get_cc_member(xmlrpc_value* result_xml);
xmlrpc_value* get_member(const char* member, xmlrpc_value* result_xml);
@@ -298,9 +298,9 @@ void ctx::get_bug_cc(xmlrpc_value* resul
return;
}
-xmlrpc_value* ctx::call_quicksearch_uuid(const char* component, const char* uuid)
+xmlrpc_value* ctx::call_quicksearch_duphash(const char* component, const char* duphash)
{
- std::string query = ssprintf("ALL component:\"%s\" statuswhiteboard:\"%s\"", component, uuid);
+ std::string query = ssprintf("ALL component:\"%s\" statuswhiteboard:\"%s\"", component, duphash);
return call("Bug.search", "({s:s})", "quicksearch", query.c_str());
}
@@ -350,7 +350,7 @@ xmlrpc_int32 ctx::new_bug(const map_cras
const std::string& component = get_crash_data_item_content(pCrashData, FILENAME_COMPONENT);
const std::string& release = get_crash_data_item_content(pCrashData, FILENAME_RELEASE);
const std::string& arch = get_crash_data_item_content(pCrashData, FILENAME_ARCHITECTURE);
- const std::string& uuid = get_crash_data_item_content(pCrashData, CD_DUPHASH);
+ const std::string& duphash = get_crash_data_item_content(pCrashData, CD_DUPHASH);
const char *reason = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_REASON);
std::string summary = "[abrt] crash in " + package;
@@ -359,7 +359,7 @@ xmlrpc_int32 ctx::new_bug(const map_cras
summary += ": ";
summary += reason;
}
- std::string status_whiteboard = "abrt_hash:" + uuid;
+ std::string status_whiteboard = "abrt_hash:" + duphash;
std::string description = "abrt "VERSION" detected a crash.\n\n";
description += make_description_bz(pCrashData);
@@ -455,7 +455,7 @@ int ctx::get_bug_info(struct bug_info* b
// mandatory when bug status is CLOSED and resolution is DUPLICATE
if ((strcmp(bz->bug_status, "CLOSED") == 0)
&& (strcmp(bz->bug_resolution, "DUPLICATE") == 0)
- ) {
+ ) {
bz->bug_dup_id = get_bug_dup_id(result);
if (env.fault_occurred)
return -1;
@@ -554,14 +554,14 @@ std::string CReporterBugzilla::Report(co
}
const std::string& component = get_crash_data_item_content(pCrashData, FILENAME_COMPONENT);
- const std::string& uuid = get_crash_data_item_content(pCrashData, CD_DUPHASH);
+ const std::string& duphash = get_crash_data_item_content(pCrashData, CD_DUPHASH);
ctx bz_server(BugzillaXMLRPC.c_str(), NoSSLVerify);
bz_server.login(Login.c_str(), Password.c_str());
update_client(_("Checking for duplicates..."));
- xmlrpc_value* result = bz_server.call_quicksearch_uuid(component.c_str(), uuid.c_str());
+ xmlrpc_value* result = bz_server.call_quicksearch_duphash(component.c_str(), duphash.c_str());
if (!result)
{
throw_if_xml_fault_occurred(&bz_server.env);
@@ -577,7 +577,7 @@ std::string CReporterBugzilla::Report(co
}
int all_bugs_size = bz_server.get_array_size(all_bugs);
- if (all_bugs_size == -1)
+ if (all_bugs_size < 0)
{
throw_if_xml_fault_occurred(&bz_server.env);
}
@@ -599,17 +599,19 @@ std::string CReporterBugzilla::Report(co
update_client(_("Logging out..."));
bz_server.logout();
- std::string bug_status = "Status: NEW\n";
- BugzillaURL = bug_status + BugzillaURL;
- BugzillaURL += "/show_bug.cgi?id=";
- BugzillaURL += to_string(bug_id);
- return BugzillaURL;
+ std::string bug_status = ssprintf(
+ "Status: NEW\n"
+ "%s/show_bug.cgi?id=%u",
+ BugzillaURL.c_str(),
+ (int)bug_id
+ );
+ return bug_status;
}
- else if (all_bugs_size > 1)
+ else /* all_bugs_size >= 1 */
{
- // When someone clones bug it has same uuid, so we can find more than 1.
+ // When someone clones bug it has same duphash, so we can find more than 1.
// Need to be checked if component is same.
- VERB3 log("Bugzilla has %i same uuids(%s)", all_bugs_size, uuid.c_str());
+ VERB3 log("Bugzilla has %u reports with same duphash '%s'", all_bugs_size, duphash.c_str());
}
// decision based on state
@@ -682,15 +684,15 @@ std::string CReporterBugzilla::Report(co
std::string description = make_description_reproduce_comment(pCrashData);
if (!description.empty())
{
- const char* package = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_PACKAGE);
- const char* release = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
- const char* arch = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_ARCHITECTURE);
+ const char* package = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_PACKAGE);
+ const char* release = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_RELEASE);
+ const char* arch = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_ARCHITECTURE);
- description = ssprintf( "Package: %s\n"
- "Architecture: %s\n"
- "OS Release: %s\n"
- "%s", package, arch, release, description.c_str()
- );
+ description = ssprintf("Package: %s\n"
+ "Architecture: %s\n"
+ "OS Release: %s\n"
+ "%s", package, arch, release, description.c_str()
+ );
update_client(_("Add new comment into bug(%d)"), (int)bug_id);
if (bz_server.add_comment(bug_id, description.c_str()) == -1)
@@ -704,25 +706,19 @@ std::string CReporterBugzilla::Report(co
update_client(_("Logging out..."));
bz_server.logout();
- std::string bug_status;
-
- std::string status = bz.bug_status;
- if (bz.bug_resolution)
- {
- std::string resolution = bz.bug_resolution;
- bug_status = "Status: " + status + " " + resolution + "\n";
- }
- else
- {
- bug_status = "Status: " + status + "\n";
- }
+ std::string bug_status = ssprintf(
+ "Status: %s%s%s\n"
+ "%s/show_bug.cgi?id=%u",
+ bz.bug_status,
+ bz.bug_resolution ? " " : "",
+ bz.bug_resolution ? bz.bug_resolution : "",
+ BugzillaURL.c_str(),
+ (int)bug_id
+ );
bug_info_destroy(&bz);
- BugzillaURL = bug_status + BugzillaURL;
- BugzillaURL += "/show_bug.cgi?id=";
- BugzillaURL += to_string(bug_id);
- return BugzillaURL;
+ return bug_status;
}
//todo: make static
14 years, 3 months
[Crash-catcher] [PATCH] first stab at RH support reporter plugin
by Denys Vlasenko
Run tested.
Please review.
--
vda
diff -x '*.po' -d -urpN abrt.4/abrt.spec abrt.5/abrt.spec
--- abrt.4/abrt.spec 2010-03-17 13:01:15.000000000 +0100
+++ abrt.5/abrt.spec 2010-03-18 02:27:37.400681711 +0100
@@ -147,6 +147,14 @@ Requires: %{name} = %{version}-%{release
%description plugin-bugzilla
Plugin to report bugs into the bugzilla.
+%package plugin-rhticket
+Summary: %{name}'s rhticket plugin
+Group: System Environment/Libraries
+Requires: %{name} = %{version}-%{release}
+
+%description plugin-rhticket
+Plugin to report bugs into RH support system.
+
%package plugin-catcut
Summary: %{name}'s catcut plugin
Group: System Environment/Libraries
@@ -393,6 +401,13 @@ fi
%{_libdir}/%{name}/Bugzilla.GTKBuilder
%{_mandir}/man7/%{name}-Bugzilla.7.gz
+%files plugin-rhticket
+%defattr(-,root,root,-)
+#%config(noreplace) %{_sysconfdir}/%{name}/plugins/rhticket.conf
+%{_libdir}/%{name}/librhticket.so*
+#%{_libdir}/%{name}/rhticket.GTKBuilder
+#%{_mandir}/man7/%{name}-rhticket.7.gz
+
%files plugin-catcut
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/plugins/Catcut.conf
diff -x '*.po' -d -urpN abrt.4/lib/Plugins/Makefile.am abrt.5/lib/Plugins/Makefile.am
--- abrt.4/lib/Plugins/Makefile.am 2010-03-17 19:58:32.755151386 +0100
+++ abrt.5/lib/Plugins/Makefile.am 2010-03-18 02:27:14.418931480 +0100
@@ -11,6 +11,7 @@ pluginslib_LTLIBRARIES = \
libRunApp.la \
libSOSreport.la \
libBugzilla.la \
+ librhticket.la \
libCatcut.la \
libTicketUploader.la \
libPython.la \
@@ -132,6 +133,14 @@ libBugzilla_la_CPPFLAGS = $(XMLRPC_CFLAG
-I$(srcdir)/../../inc -I$(srcdir)/../Utils -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
-DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\"
+# rhticket
+librhticket_la_SOURCES = rhticket.h rhticket.cpp
+librhticket_la_LIBADD =
+librhticket_la_LDFLAGS = -avoid-version
+librhticket_la_CPPFLAGS = \
+ -I$(srcdir)/../../inc -I$(srcdir)/../Utils -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \
+ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\"
+
# Catcut
libCatcut_la_SOURCES = Catcut.h Catcut.cpp
libCatcut_la_LIBADD = $(XMLRPC_LIBS) $(XMLRPC_CLIENT_LIBS)
diff -x '*.po' -d -urpN abrt.4/lib/Plugins/rhticket.cpp abrt.5/lib/Plugins/rhticket.cpp
--- abrt.4/lib/Plugins/rhticket.cpp 1970-01-01 01:00:00.000000000 +0100
+++ abrt.5/lib/Plugins/rhticket.cpp 2010-03-18 05:33:12.846933155 +0100
@@ -0,0 +1,267 @@
+/*
+ Copyright (C) 2010 ABRT team
+ Copyright (C) 2010 RedHat Inc
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "abrtlib.h"
+#include "abrt_xmlrpc.h" /* for xcurl_easy_handle */
+#include "rhticket.h"
+#include "CrashTypes.h"
+#include "DebugDump.h"
+#include "ABRTException.h"
+#include "CommLayerInner.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+using namespace std;
+
+
+static char*
+check_curl_error(CURLcode err, const char* msg)
+{
+ if (err) {
+ return xasprintf("%s: %s", msg, curl_easy_strerror(err));
+ }
+ return NULL;
+}
+
+//
+// Examine each header looking for "Location:" header
+//
+struct Headerdata {
+ char *location;
+};
+
+static size_t
+headerfunction(void *buffer_pv, size_t count, size_t nmemb, void *headerdata_pv)
+{
+ struct Headerdata* headerdata = (struct Headerdata*)headerdata_pv;
+ const char* buffer = (const char*)buffer_pv;
+ const char location_key[] = "Location:";
+ const size_t location_key_size = sizeof(location_key)-1;
+
+ size_t size = count * nmemb;
+ if (size >= location_key_size
+ && 0 == memcmp(buffer, location_key, location_key_size)
+ ) {
+ const char* start = (const char*) buffer + location_key_size + 1;
+ const char* end;
+
+ // skip over any leading space
+ while (start < buffer+size && isspace(*start))
+ ++start;
+
+ end = start;
+
+ // skip till we find the end of the url (first space or end of buffer)
+ while (end < buffer+size && !isspace(*end))
+ ++end;
+
+ headerdata->location = xstrndup(start, end - start);
+ }
+
+ return size;
+}
+
+static char*
+post(int *http_resp_code, const char* url, const char* data)
+{
+ char *retval;
+ CURLcode curl_err;
+ struct curl_slist *httpheader_list = NULL;
+ struct Headerdata headerdata = { NULL };
+
+ if (http_resp_code)
+ *http_resp_code = -1;
+
+ CURL *handle = xcurl_easy_init();
+
+ curl_err = curl_easy_setopt(handle, CURLOPT_VERBOSE, 0);
+ retval = check_curl_error(curl_err, "curl_easy_setopt(CURLOPT_VERBOSE)");
+ if (retval)
+ goto ret;
+
+ curl_err = curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 1);
+ retval = check_curl_error(curl_err, "curl_easy_setopt(CURLOPT_NOPROGRESS)");
+ if (retval)
+ goto ret;
+
+ curl_err = curl_easy_setopt(handle, CURLOPT_POST, 1);
+ retval = check_curl_error(curl_err, "curl_easy_setopt(CURLOPT_POST)");
+ if (retval)
+ goto ret;
+
+ curl_err = curl_easy_setopt(handle, CURLOPT_URL, url);
+ retval = check_curl_error(curl_err, "curl_easy_setopt(CURLOPT_URL)");
+ if (retval)
+ goto ret;
+
+ httpheader_list = curl_slist_append(httpheader_list, "Content-Type: application/xml");
+ curl_err = curl_easy_setopt(handle, CURLOPT_HTTPHEADER, httpheader_list);
+ retval = check_curl_error(curl_err, "curl_easy_setopt(CURLOPT_HTTPHEADER)");
+ if (retval)
+ goto ret;
+
+ curl_err = curl_easy_setopt(handle, CURLOPT_POSTFIELDS, data);
+ retval = check_curl_error(curl_err, "curl_easy_setopt(CURLOPT_POSTFIELDS)");
+ if (retval)
+ goto ret;
+
+ curl_err = curl_easy_setopt(handle, CURLOPT_HEADERFUNCTION, headerfunction);
+ retval = check_curl_error(curl_err, "curl_easy_setopt(CURLOPT_HEADERFUNCTION)");
+ if (retval)
+ goto ret;
+
+ curl_err = curl_easy_setopt(handle, CURLOPT_WRITEHEADER, &headerdata);
+ retval = check_curl_error(curl_err, "curl_easy_setopt(CURLOPT_WRITEHEADER)");
+ if (retval)
+ goto ret;
+
+ curl_err = curl_easy_perform(handle);
+ retval = check_curl_error(curl_err, "curl_easy_perform");
+ if (retval)
+ goto ret;
+
+ long response_code;
+ curl_err = curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &response_code);
+ retval = check_curl_error(curl_err, "curl_easy_getinfo(CURLINFO_RESPONSE_CODE)");
+ if (retval)
+ goto ret;
+
+ if (http_resp_code)
+ *http_resp_code = response_code;
+ switch (response_code) {
+ case 200:
+ case 201:
+ retval = headerdata.location;
+ break;
+ /* default: */
+ /* TODO: extract meaningful error string from server reply */
+ }
+
+ ret:
+ curl_easy_cleanup(handle);
+ curl_slist_free_all(httpheader_list);
+ return retval;
+}
+
+/*
+ * CReporterRHticket
+ */
+
+CReporterRHticket::CReporterRHticket() :
+ m_bSSLVerify(true),
+ m_sStrataURL("http://support-services-devel.gss.redhat.com:8080/Strata")
+{}
+
+CReporterRHticket::~CReporterRHticket()
+{}
+
+string CReporterRHticket::Report(const map_crash_data_t& pCrashData,
+ const map_plugin_settings_t& pSettings,
+ const char *pArgs)
+{
+ const string& package = get_crash_data_item_content(pCrashData, FILENAME_PACKAGE);
+// const string& component = get_crash_data_item_content(pCrashData, FILENAME_COMPONENT);
+ const string& release = get_crash_data_item_content(pCrashData, FILENAME_RELEASE);
+// const string& arch = get_crash_data_item_content(pCrashData, FILENAME_ARCHITECTURE);
+ const string& duphash = get_crash_data_item_content(pCrashData, CD_DUPHASH);
+ const char *reason = get_crash_data_item_content_or_NULL(pCrashData, FILENAME_REASON);
+
+ string summary = "[abrt] crash in " + package;
+ if (reason != NULL) {
+ summary += ": ";
+ summary += reason;
+ }
+// string status_whiteboard = "abrt_hash:" + duphash;
+
+ string description = "abrt "VERSION" detected a crash.\n\n";
+ description += make_description_bz(pCrashData);
+
+// string product;
+// string version;
+// parse_release(release.c_str(), product, version);
+
+ string postdata = ssprintf(
+ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
+ "<IssueTrackerCase xmlns=\"http://www.redhat.com/gss/strata\">"
+ "<name>%s</name>"
+ "<description>%s</description>"
+ // "<reference></reference><notes></notes><tags></tags>"
+ "</IssueTrackerCase>",
+//TODO: xml-encode, check UTF-8 correctness etc:
+ summary.c_str(),
+ description.c_str()
+ );
+ string url = concat_path_file(m_sStrataURL.c_str(), "cases");
+
+ int http_resp_code;
+ char *res = post(&http_resp_code, url.c_str(), postdata.c_str());
+ string result = res ? res : "";
+ free(res);
+ if (http_resp_code / 100 != 2) { /* not 2xx */
+ throw CABRTException(EXCEP_PLUGIN, _("server returned HTTP code %u, error message: %s"),
+ http_resp_code, res ? result.c_str() : "(none)");
+ }
+
+ return result;
+}
+
+void CReporterRHticket::SetSettings(const map_plugin_settings_t& pSettings)
+{
+ m_pSettings = pSettings;
+
+ map_plugin_settings_t::const_iterator end = pSettings.end();
+ map_plugin_settings_t::const_iterator it;
+ it = pSettings.find("URL");
+ if (it != end) {
+ m_sStrataURL = it->second;
+ }
+ it = pSettings.find("Login");
+ if (it != end) {
+ m_sLogin = it->second;
+ }
+ it = pSettings.find("Password");
+ if (it != end) {
+ m_sPassword = it->second;
+ }
+ it = pSettings.find("SSLVerify");
+ if (it != end) {
+ m_bSSLVerify = string_to_bool(it->second.c_str());
+ }
+}
+
+/* Should not be deleted (why?) */
+const map_plugin_settings_t& CReporterRHticket::GetSettings()
+{
+ m_pSettings["URL"] = m_sStrataURL;
+ m_pSettings["Login"] = m_sLogin;
+ m_pSettings["Password"] = m_sPassword;
+ m_pSettings["SSLVerify"] = m_bSSLVerify ? "yes" : "no";
+
+ return m_pSettings;
+}
+
+PLUGIN_INFO(REPORTER,
+ CReporterRHticket,
+ "RHticket",
+ "0.0.4",
+ "Reports bugs to Red Hat support",
+ "Denys Vlasenko <dvlasenk(a)redhat.com>",
+ "https://fedorahosted.org/abrt/wiki",
+ "" /*PLUGINS_LIB_DIR"/rhticket.GTKBuilder"*/);
diff -x '*.po' -d -urpN abrt.4/lib/Plugins/rhticket.h abrt.5/lib/Plugins/rhticket.h
--- abrt.4/lib/Plugins/rhticket.h 1970-01-01 01:00:00.000000000 +0100
+++ abrt.5/lib/Plugins/rhticket.h 2010-03-18 02:26:30.204045289 +0100
@@ -0,0 +1,45 @@
+/*
+ Copyright (C) 2010 ABRT team
+ Copyright (C) 2010 RedHat Inc
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+#ifndef RHTICKET_H_
+#define RHTICKET_H_
+
+#include "Plugin.h"
+#include "Reporter.h"
+
+class CReporterRHticket : public CReporter
+{
+ private:
+ bool m_bSSLVerify;
+ std::string m_sStrataURL;
+ std::string m_sLogin;
+ std::string m_sPassword;
+
+ public:
+ CReporterRHticket();
+ virtual ~CReporterRHticket();
+
+ virtual std::string Report(const map_crash_data_t& pCrashData,
+ const map_plugin_settings_t& pSettings,
+ const char *pArgs);
+
+ virtual void SetSettings(const map_plugin_settings_t& pSettings);
+ virtual const map_plugin_settings_t& GetSettings();
+};
+
+#endif
14 years, 3 months
[Crash-catcher] GUI for fas account creation.
by Sindre Wetjen
Hi to everyone,
My name is Sindre (fas Subfusc), and I am currently a part of the
fedora-tour team.
As you may or may not be aware of, there is a feature request/idea for a
gui type of registration system for fas
(http://lists.fedoraproject.org/pipermail/devel/2010-March/133152.html) , so I thought I would just nip it in the bud before it goes anywhere.
Since we would be the major interest in this I would suggest that we do
a single program for this, rather than multiple ones. That way we avoid
confusing the users and make more code than necessary.
The idea is that we make a fas-register "program" witch can take an
optional argument for GUI selection (KDE vs. GNOME and all that), that
way we can just call the program from our respective programs, and get
the desired effect.
Any other ideas or comments on this would be appreciated.
MvH
Sindre.
14 years, 3 months
[Crash-catcher] Any XMLRPC debugger to suggest?
by Zhu, Peter J
Hi,
I have trouble talking to bugzilla via abrt BZ plugin. I can file a new bug but can't add attachment. The error code(-503) it should be XMLRPC issue. But I need find detail. So any XMLRPC debugger to recommend? Thanks
Peter
14 years, 3 months