Blame src/lib/problem_api_dbus.c

Packit Service 8a8a03
/*
Packit Service 8a8a03
    Copyright (C) 2011  ABRT Team
Packit Service 8a8a03
    Copyright (C) 2011  RedHat inc.
Packit Service 8a8a03
Packit Service 8a8a03
    This program is free software; you can redistribute it and/or modify
Packit Service 8a8a03
    it under the terms of the GNU General Public License as published by
Packit Service 8a8a03
    the Free Software Foundation; either version 2 of the License, or
Packit Service 8a8a03
    (at your option) any later version.
Packit Service 8a8a03
Packit Service 8a8a03
    This program is distributed in the hope that it will be useful,
Packit Service 8a8a03
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 8a8a03
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 8a8a03
    GNU General Public License for more details.
Packit Service 8a8a03
Packit Service 8a8a03
    You should have received a copy of the GNU General Public License along
Packit Service 8a8a03
    with this program; if not, write to the Free Software Foundation, Inc.,
Packit Service 8a8a03
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Packit Service 8a8a03
*/
Packit Service 8a8a03
Packit Service 8a8a03
#include "abrt_glib.h"
Packit Service 8a8a03
#include "internal_libabrt.h"
Packit Service 8a8a03
Packit Service 8a8a03
static GDBusProxy *get_dbus_proxy(void)
Packit Service 8a8a03
{
Packit Service 8a8a03
    static GDBusProxy *proxy;
Packit Service 8a8a03
Packit Service 8a8a03
    /* we cache it, so we can't free it! */
Packit Service 8a8a03
    if (proxy != NULL)
Packit Service 8a8a03
        return proxy;
Packit Service 8a8a03
Packit Service 8a8a03
    GError *error = NULL;
Packit Service 8a8a03
    proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
Packit Service 8a8a03
                                         G_DBUS_PROXY_FLAGS_NONE,
Packit Service 8a8a03
                                         NULL,
Packit Service 8a8a03
                                         ABRT_DBUS_NAME,
Packit Service 8a8a03
                                         ABRT_DBUS_OBJECT,
Packit Service 8a8a03
                                         ABRT_DBUS_IFACE,
Packit Service 8a8a03
                                         NULL,
Packit Service 8a8a03
                                         &error);
Packit Service 8a8a03
    if (error)
Packit Service 8a8a03
    {
Packit Service 8a8a03
        error_msg(_("Can't connect to system DBus: %s"), error->message);
Packit Service 8a8a03
        g_error_free(error);
Packit Service 8a8a03
        /* proxy is NULL in this case */
Packit Service 8a8a03
    }
Packit Service 8a8a03
    return proxy;
Packit Service 8a8a03
}
Packit Service 8a8a03
Packit Service 8a8a03
int chown_dir_over_dbus(const char *problem_dir_path)
Packit Service 8a8a03
{
Packit Service 8a8a03
    INITIALIZE_LIBABRT();
Packit Service 8a8a03
Packit Service 8a8a03
    GDBusProxy *proxy = get_dbus_proxy();
Packit Service 8a8a03
    if (!proxy)
Packit Service 8a8a03
        return 1;
Packit Service 8a8a03
Packit Service 8a8a03
    GError *error = NULL;
Packit Service 8a8a03
    g_dbus_proxy_call_sync(proxy,
Packit Service 8a8a03
                        "ChownProblemDir",
Packit Service 8a8a03
                        g_variant_new("(s)", problem_dir_path),
Packit Service 8a8a03
                        G_DBUS_CALL_FLAGS_NONE,
Packit Service 8a8a03
                        -1,
Packit Service 8a8a03
                        NULL,
Packit Service 8a8a03
                        &error);
Packit Service 8a8a03
Packit Service 8a8a03
    if (error)
Packit Service 8a8a03
    {
Packit Service 8a8a03
        error_msg(_("Can't chown '%s': %s"), problem_dir_path, error->message);
Packit Service 8a8a03
        g_error_free(error);
Packit Service 8a8a03
        return 1;
Packit Service 8a8a03
    }
Packit Service 8a8a03
    return 0;
Packit Service 8a8a03
}
Packit Service 8a8a03
Packit Service 8a8a03
int delete_problem_dirs_over_dbus(const GList *problem_dir_paths)
Packit Service 8a8a03
{
Packit Service 8a8a03
    INITIALIZE_LIBABRT();
Packit Service 8a8a03
Packit Service 8a8a03
    GDBusProxy *proxy = get_dbus_proxy();
Packit Service 8a8a03
    if (!proxy)
Packit Service 8a8a03
        return 1;
Packit Service 8a8a03
Packit Service 8a8a03
    GVariant *parameters = variant_from_string_list(problem_dir_paths);
Packit Service 8a8a03
Packit Service 8a8a03
    GError *error = NULL;
Packit Service 8a8a03
    g_dbus_proxy_call_sync(proxy,
Packit Service 8a8a03
                    "DeleteProblem",
Packit Service 8a8a03
                    parameters,
Packit Service 8a8a03
                    G_DBUS_CALL_FLAGS_NONE,
Packit Service 8a8a03
                    -1,
Packit Service 8a8a03
                    NULL,
Packit Service 8a8a03
                    &error);
Packit Service 8a8a03
//g_variant_unref(parameters); -- need this??? no?? why?
Packit Service 8a8a03
Packit Service 8a8a03
    if (error)
Packit Service 8a8a03
    {
Packit Service 8a8a03
        error_msg(_("Deleting problem directory failed: %s"), error->message);
Packit Service 8a8a03
        g_error_free(error);
Packit Service 8a8a03
        return 1;
Packit Service 8a8a03
    }
Packit Service 8a8a03
    return 0;
Packit Service 8a8a03
}
Packit Service 8a8a03
Packit Service 8a8a03
int fill_problem_data_over_dbus(const char *problem_id, const char **elements, problem_data_t *problem_data)
Packit Service 8a8a03
{
Packit Service 8a8a03
    INITIALIZE_LIBABRT();
Packit Service 8a8a03
Packit Service 8a8a03
    GDBusProxy *proxy = get_dbus_proxy();
Packit Service 8a8a03
    if (!proxy)
Packit Service 8a8a03
        return -1;
Packit Service 8a8a03
Packit Service 8a8a03
    GVariantBuilder *args_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
Packit Service 8a8a03
Packit Service 8a8a03
    for (const char **iter = elements; *iter; ++iter)
Packit Service 8a8a03
        g_variant_builder_add(args_builder, "s", *iter);
Packit Service 8a8a03
Packit Service 8a8a03
    GVariant *params = g_variant_new("(sas)", problem_id, args_builder);
Packit Service 8a8a03
    g_variant_builder_unref(args_builder);
Packit Service 8a8a03
Packit Service 8a8a03
    GError *error = NULL;
Packit Service 8a8a03
    GVariant *result = g_dbus_proxy_call_sync(proxy,
Packit Service 8a8a03
                                            "GetInfo",
Packit Service 8a8a03
                                            params,
Packit Service 8a8a03
                                            G_DBUS_CALL_FLAGS_NONE,
Packit Service 8a8a03
                                            -1,
Packit Service 8a8a03
                                            NULL,
Packit Service 8a8a03
                                            &error);
Packit Service 8a8a03
Packit Service 8a8a03
    if (error)
Packit Service 8a8a03
    {
Packit Service 8a8a03
        error_msg(_("D-Bus GetInfo method call failed: %s"), error->message);
Packit Service 8a8a03
        g_error_free(error);
Packit Service 8a8a03
        return -2;
Packit Service 8a8a03
    }
Packit Service 8a8a03
Packit Service 8a8a03
Packit Service 8a8a03
    char *key, *val;
Packit Service 8a8a03
    GVariantIter *iter;
Packit Service 8a8a03
    g_variant_get(result, "(a{ss})", &iter);
Packit Service 8a8a03
    while (g_variant_iter_loop(iter, "{ss}", &key, &val))
Packit Service 8a8a03
        problem_data_add_text_noteditable(problem_data, key, val);
Packit Service 8a8a03
Packit Service 8a8a03
    g_variant_unref(result);
Packit Service 8a8a03
Packit Service 8a8a03
    return 0;
Packit Service 8a8a03
}
Packit Service 8a8a03
Packit Service 8a8a03
problem_data_t *get_problem_data_dbus(const char *problem_dir_path)
Packit Service 8a8a03
{
Packit Service 8a8a03
    INITIALIZE_LIBABRT();
Packit Service 8a8a03
Packit Service 8a8a03
    static const char *elements[] = {
Packit Service 8a8a03
        FILENAME_TIME,
Packit Service 8a8a03
        FILENAME_REASON,
Packit Service 8a8a03
        FILENAME_NOT_REPORTABLE,
Packit Service 8a8a03
        FILENAME_COMPONENT,
Packit Service 8a8a03
        FILENAME_EXECUTABLE,
Packit Service 8a8a03
        FILENAME_REPORTED_TO,
Packit Service 8a8a03
        NULL,
Packit Service 8a8a03
    };
Packit Service 8a8a03
Packit Service 8a8a03
    problem_data_t *pd = problem_data_new();
Packit Service 8a8a03
Packit Service 8a8a03
    if (fill_problem_data_over_dbus(problem_dir_path, elements, pd) != 0)
Packit Service 8a8a03
    {
Packit Service 8a8a03
        error_msg(_("Can't get problem data from abrt-dbus"));
Packit Service 8a8a03
        problem_data_free(pd);
Packit Service 8a8a03
        return ERR_PTR;
Packit Service 8a8a03
    }
Packit Service 8a8a03
Packit Service 8a8a03
    return pd;
Packit Service 8a8a03
}
Packit Service 8a8a03
Packit Service 8a8a03
GList *get_problems_over_dbus(bool authorize)
Packit Service 8a8a03
{
Packit Service 8a8a03
    INITIALIZE_LIBABRT();
Packit Service 8a8a03
Packit Service 8a8a03
    GDBusProxy *proxy = get_dbus_proxy();
Packit Service 8a8a03
    if (!proxy)
Packit Service 8a8a03
        return ERR_PTR;
Packit Service 8a8a03
Packit Service 8a8a03
    GError *error = NULL;
Packit Service 8a8a03
    GVariant *result = g_dbus_proxy_call_sync(proxy,
Packit Service 8a8a03
                                    authorize ? "GetAllProblems" : "GetProblems",
Packit Service 8a8a03
                                    g_variant_new("()"),
Packit Service 8a8a03
                                    G_DBUS_CALL_FLAGS_NONE,
Packit Service 8a8a03
                                    -1,
Packit Service 8a8a03
                                    NULL,
Packit Service 8a8a03
                                    &error);
Packit Service 8a8a03
Packit Service 8a8a03
    if (error)
Packit Service 8a8a03
    {
Packit Service 8a8a03
        error_msg(_("Can't get problem list from abrt-dbus: %s"), error->message);
Packit Service 8a8a03
        g_error_free(error);
Packit Service 8a8a03
        return ERR_PTR;
Packit Service 8a8a03
    }
Packit Service 8a8a03
Packit Service 8a8a03
    GList *list = NULL;
Packit Service 8a8a03
    if (result)
Packit Service 8a8a03
    {
Packit Service 8a8a03
        /* Fetch "as" from "(as)" */
Packit Service 8a8a03
        GVariant *array = g_variant_get_child_value(result, 0);
Packit Service 8a8a03
        list = string_list_from_variant(array);
Packit Service 8a8a03
        g_variant_unref(array);
Packit Service 8a8a03
        g_variant_unref(result);
Packit Service 8a8a03
    }
Packit Service 8a8a03
Packit Service 8a8a03
    return list;
Packit Service 8a8a03
}
Packit Service 8a8a03
Packit Service 8a8a03
problem_data_t *get_full_problem_data_over_dbus(const char *problem_dir_path)
Packit Service 8a8a03
{
Packit Service 8a8a03
    INITIALIZE_LIBABRT();
Packit Service 8a8a03
Packit Service 8a8a03
    GDBusProxy *proxy = get_dbus_proxy();
Packit Service 8a8a03
    if (!proxy)
Packit Service 8a8a03
        return ERR_PTR;
Packit Service 8a8a03
Packit Service 8a8a03
    GError *error = NULL;
Packit Service 8a8a03
    GVariant *result = g_dbus_proxy_call_sync(proxy,
Packit Service 8a8a03
                                    "GetProblemData",
Packit Service 8a8a03
                                    g_variant_new("(s)", problem_dir_path),
Packit Service 8a8a03
                                    G_DBUS_CALL_FLAGS_NONE,
Packit Service 8a8a03
                                    -1,
Packit Service 8a8a03
                                    NULL,
Packit Service 8a8a03
                                    &error);
Packit Service 8a8a03
Packit Service 8a8a03
    if (error)
Packit Service 8a8a03
    {
Packit Service 8a8a03
        error_msg(_("Can't get problem data from abrt-dbus: %s"), error->message);
Packit Service 8a8a03
        g_error_free(error);
Packit Service 8a8a03
        return ERR_PTR;
Packit Service 8a8a03
    }
Packit Service 8a8a03
Packit Service 8a8a03
    GVariantIter *iter = NULL;
Packit Service 8a8a03
    g_variant_get(result, "(a{s(its)})", &iter);
Packit Service 8a8a03
Packit Service 8a8a03
    gchar *name = NULL;
Packit Service 8a8a03
    gint flags;
Packit Service 8a8a03
    gulong size;
Packit Service 8a8a03
    gchar *value = NULL;
Packit Service 8a8a03
Packit Service 8a8a03
    problem_data_t *pd = problem_data_new();
Packit Service 8a8a03
    while (g_variant_iter_loop(iter, "{&s(it&s)}", &name, &flags, &size, &value))
Packit Service 8a8a03
        problem_data_add_ext(pd, name, value, flags, size);
Packit Service 8a8a03
Packit Service 8a8a03
    problem_data_add(pd, CD_DUMPDIR, problem_dir_path,
Packit Service 8a8a03
            CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE + CD_FLAG_LIST);
Packit Service 8a8a03
Packit Service 8a8a03
    g_variant_unref(result);
Packit Service 8a8a03
Packit Service 8a8a03
    return pd;
Packit Service 8a8a03
}
Packit Service 8a8a03
Packit Service 8a8a03
int test_exist_over_dbus(const char *problem_id, const char *element_name)
Packit Service 8a8a03
{
Packit Service 8a8a03
    INITIALIZE_LIBABRT();
Packit Service 8a8a03
Packit Service 8a8a03
    GDBusProxy *proxy = get_dbus_proxy();
Packit Service 8a8a03
    if (!proxy)
Packit Service 8a8a03
        return -1;
Packit Service 8a8a03
Packit Service 8a8a03
    GError *error = NULL;
Packit Service 8a8a03
    GVariant *result = g_dbus_proxy_call_sync(proxy,
Packit Service 8a8a03
                                            "TestElementExists",
Packit Service 8a8a03
                                            g_variant_new("(ss)", problem_id, element_name),
Packit Service 8a8a03
                                            G_DBUS_CALL_FLAGS_NONE,
Packit Service 8a8a03
                                            -1,
Packit Service 8a8a03
                                            NULL,
Packit Service 8a8a03
                                            &error);
Packit Service 8a8a03
Packit Service 8a8a03
    if (error)
Packit Service 8a8a03
    {
Packit Service 8a8a03
        error_msg(_("Can't test whether the element exists over abrt-dbus: %s"), error->message);
Packit Service 8a8a03
        g_error_free(error);
Packit Service 8a8a03
        return -1;
Packit Service 8a8a03
    }
Packit Service 8a8a03
Packit Service 8a8a03
    gboolean retval;
Packit Service 8a8a03
    g_variant_get(result, "(b)", &retval);
Packit Service 8a8a03
    g_variant_unref(result);
Packit Service 8a8a03
Packit Service 8a8a03
    return retval;
Packit Service 8a8a03
}
Packit Service 8a8a03
Packit Service 8a8a03
int dbus_problem_is_complete(const char *problem_id)
Packit Service 8a8a03
{
Packit Service 8a8a03
    return test_exist_over_dbus(problem_id, FILENAME_COUNT);
Packit Service 8a8a03
}
Packit Service 8a8a03
Packit Service 8a8a03
char *load_text_over_dbus(const char *problem_id, const char *element_name)
Packit Service 8a8a03
{
Packit Service 8a8a03
    INITIALIZE_LIBABRT();
Packit Service 8a8a03
Packit Service 8a8a03
    GDBusProxy *proxy = get_dbus_proxy();
Packit Service 8a8a03
    if (!proxy)
Packit Service 8a8a03
        return ERR_PTR;
Packit Service 8a8a03
Packit Service 8a8a03
    GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
Packit Service 8a8a03
    g_variant_builder_add(builder, "s", element_name);
Packit Service 8a8a03
    GVariant *params = g_variant_new("(sas)", problem_id, builder);
Packit Service 8a8a03
    g_variant_builder_unref(builder);
Packit Service 8a8a03
Packit Service 8a8a03
    GError *error = NULL;
Packit Service 8a8a03
    GVariant *result = g_dbus_proxy_call_sync(proxy,
Packit Service 8a8a03
                                            "GetInfo",
Packit Service 8a8a03
                                            params,
Packit Service 8a8a03
                                            G_DBUS_CALL_FLAGS_NONE,
Packit Service 8a8a03
                                            -1,
Packit Service 8a8a03
                                            NULL,
Packit Service 8a8a03
                                            &error);
Packit Service 8a8a03
Packit Service 8a8a03
    if (error)
Packit Service 8a8a03
    {
Packit Service 8a8a03
        error_msg(_("Can't get problem data from abrt-dbus: %s"), error->message);
Packit Service 8a8a03
        g_error_free(error);
Packit Service 8a8a03
        return ERR_PTR;
Packit Service 8a8a03
    }
Packit Service 8a8a03
Packit Service 8a8a03
    GVariant *values = g_variant_get_child_value(result, 0);
Packit Service 8a8a03
    g_variant_unref(result);
Packit Service 8a8a03
Packit Service 8a8a03
    char *retval = NULL;
Packit Service 8a8a03
    if (g_variant_n_children(values) == 1)
Packit Service 8a8a03
    {
Packit Service 8a8a03
        GVariant *contents = g_variant_get_child_value(values, 0);
Packit Service 8a8a03
        gchar *key;
Packit Service 8a8a03
        g_variant_get(contents, "{&ss}", &key, &retval);
Packit Service 8a8a03
    }
Packit Service 8a8a03
Packit Service 8a8a03
    g_variant_unref(values);
Packit Service 8a8a03
    return retval;
Packit Service 8a8a03
}