diff options
author | Sunmin Lee <sunm.lee@samsung.com> | 2016-11-07 18:02:57 +0900 |
---|---|---|
committer | Sunmin Lee <sunm.lee@samsung.com> | 2016-11-07 19:31:20 +0900 |
commit | f84c7115b4e7a3fd1d2899d0e1892e5c492dd469 (patch) | |
tree | e2ae68ef182a84a87101600abe447aea4687c51b /src/log_dump | |
parent | 93a7b84b260fa6f2ea69cba3d31aed0aa3873ba3 (diff) | |
download | crash-worker-f84c7115b4e7a3fd1d2899d0e1892e5c492dd469.tar.gz crash-worker-f84c7115b4e7a3fd1d2899d0e1892e5c492dd469.tar.bz2 crash-worker-f84c7115b4e7a3fd1d2899d0e1892e5c492dd469.zip |
log_dump: triggered by dbus method callsubmit/tizen/20161108.022628accepted/tizen/wearable/20161109.002218accepted/tizen/tv/20161109.002159accepted/tizen/mobile/20161109.002140accepted/tizen/ivi/20161109.002238accepted/tizen/common/20161108.131657
Add dbus activation feature to log_dump.
It handles two method: normal_dump, short_dump.
Each method corresponds to the options of log_dump.
Change-Id: I3384954f70c55fb7990fe9c5e14405ba63673a63
Signed-off-by: Sunmin Lee <sunm.lee@samsung.com>
Diffstat (limited to 'src/log_dump')
-rw-r--r-- | src/log_dump/CMakeLists.txt | 5 | ||||
-rw-r--r-- | src/log_dump/dbus-handler.c | 186 | ||||
-rw-r--r-- | src/log_dump/dbus-handler.h | 24 | ||||
-rw-r--r-- | src/log_dump/log_dump.c | 129 | ||||
-rw-r--r-- | src/log_dump/log_dump.h | 34 | ||||
-rw-r--r-- | src/log_dump/org.tizen.system.crash.service | 5 |
6 files changed, 334 insertions, 49 deletions
diff --git a/src/log_dump/CMakeLists.txt b/src/log_dump/CMakeLists.txt index 8920559..12bab7e 100644 --- a/src/log_dump/CMakeLists.txt +++ b/src/log_dump/CMakeLists.txt @@ -4,6 +4,7 @@ PROJECT(log_dump C) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src) SET(LOG_DUMP_SRCS log_dump.c + dbus-handler.c ${CMAKE_SOURCE_DIR}/src/shared/util.c ) @@ -12,6 +13,8 @@ pkg_check_modules(log_dump_pkgs REQUIRED dlog capi-system-info libtzplatform-config + glib-2.0 + gio-2.0 ) FOREACH(flag ${log_dump_pkgs_CFLAGS}) @@ -23,6 +26,8 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") ADD_EXECUTABLE(${PROJECT_NAME} ${LOG_DUMP_SRCS}) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${log_dump_pkgs_LDFLAGS}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/org.tizen.system.crash.service + DESTINATION /usr/share/dbus-1/system-services) INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) diff --git a/src/log_dump/dbus-handler.c b/src/log_dump/dbus-handler.c new file mode 100644 index 0000000..adfe7ac --- /dev/null +++ b/src/log_dump/dbus-handler.c @@ -0,0 +1,186 @@ +/* + * log_dump + * + * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdbool.h> +#include <glib.h> +#include <gio/gio.h> +#include "log_dump.h" +#include "dbus-handler.h" + +#define CRASH_BUS_NAME "org.tizen.system.crash" +#define CRASH_BUS_PATH "/Org/Tizen/System/Crash" + +#define TIMEOUT_INTERVAL 30 + +static GMainLoop *loop; +static GMutex timeout_mutex; +static guint timeout_id; +static GDBusNodeInfo *introspection_data; +static const gchar introspection_xml[] = +"<node>" +" <interface name='org.tizen.system.crash'>" +" <method name='normal_dump'>" +" <arg type='i' name='response' direction='out'/>" +" </method>" +" <method name='short_dump'>" +" <arg type='i' name='response' direction='out'/>" +" </method>" +" </interface>" +"</node>"; + +static int timeout_cb(gpointer data) +{ + LOGI("Time out!"); + g_main_loop_quit((GMainLoop *)data); + + return 0; +} + +static void add_timeout(void) +{ + g_mutex_lock(&timeout_mutex); + + if (timeout_id) + g_source_remove(timeout_id); + timeout_id = g_timeout_add_seconds(TIMEOUT_INTERVAL, timeout_cb, loop); + + g_mutex_unlock(&timeout_mutex); + LOGI("Add loop timeout (%d)", TIMEOUT_INTERVAL); +} + +static void remove_timeout(void) +{ + g_mutex_lock(&timeout_mutex); + + if (timeout_id) { + g_source_remove(timeout_id); + timeout_id = 0; + } + + g_mutex_unlock(&timeout_mutex); + LOGI("Remove loop timeout"); +} + +static void method_call_handler(GDBusConnection *conn, + const gchar *sender, + const gchar *object_path, + const gchar *iface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + int ret = -1; + int option = -1; + + remove_timeout(); + + if (g_strcmp0(method_name, "normal_dump") == 0) + option = OPT_NORMAL; + else if (g_strcmp0(method_name, "short_dump") == 0) + option = OPT_SHORT; + + if (option >= 0) + ret = log_dump(option); + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", ret)); + + add_timeout(); +} + +static const GDBusInterfaceVTable interface_vtable = { + method_call_handler, + NULL, + NULL +}; + +static void on_bus_acquired(GDBusConnection *conn, + const gchar *name, + gpointer user_data) +{ + guint registration_id; + + registration_id = g_dbus_connection_register_object(conn, + CRASH_BUS_PATH, introspection_data->interfaces[0], + &interface_vtable, NULL, NULL, NULL); + if (registration_id == 0) + LOGE("Failed to g_dbus_connection_register_object"); +} + +static void on_name_acquired(GDBusConnection *conn, + const gchar *name, + gpointer user_data) +{ + LOGD("Acquired the name %s on the system bus", name); +} + +static void on_name_lost(GDBusConnection *conn, + const gchar *name, + gpointer user_data) +{ + LOGD("Lost the name %s on the system bus", name); +} + +static void dbus_init(void) +{ + GDBusConnection *conn = NULL; + GError *error = NULL; + + introspection_data = + g_dbus_node_info_new_for_xml(introspection_xml, NULL); + if (introspection_data == NULL) { + LOGE("Failed to init g_dbus_info_new_for_xml"); + return; + } + + conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + if (!conn) { + LOGE("Failed to get dbus"); + return; + } + + if (error) { + LOGE("Failed to get dbus"); + g_error_free(error); + return; + } + + g_bus_own_name(G_BUS_TYPE_SYSTEM, CRASH_BUS_NAME, + G_BUS_NAME_OWNER_FLAGS_NONE, on_bus_acquired, + on_name_acquired, on_name_lost, NULL, NULL); +} + +int log_dump_dbus(void) +{ + loop = g_main_loop_new(NULL, false); + + dbus_init(); + + g_mutex_init(&timeout_mutex); + add_timeout(); + + LOGI("log_dump_dbus activated"); + g_main_loop_run(loop); + + if (introspection_data) + g_dbus_node_info_unref(introspection_data); + g_mutex_clear(&timeout_mutex); + g_main_loop_unref(loop); + + return 0; +} diff --git a/src/log_dump/dbus-handler.h b/src/log_dump/dbus-handler.h new file mode 100644 index 0000000..0d3d5d9 --- /dev/null +++ b/src/log_dump/dbus-handler.h @@ -0,0 +1,24 @@ +/* + * log_dump + * + * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LOGDUMP_DBUS_H__ +#define __LOGDUMP_DBUS_H__ + +int log_dump_dbus(void); + +#endif diff --git a/src/log_dump/log_dump.c b/src/log_dump/log_dump.c index 38180f5..cdfa7f0 100644 --- a/src/log_dump/log_dump.c +++ b/src/log_dump/log_dump.c @@ -1,4 +1,5 @@ -/* log_dump: dump current system states +/* + * log_dump: dump current system states * * Copyright (c) 2016 Samsung Electronics Co., Ltd. * @@ -22,10 +23,11 @@ #include <time.h> #include <unistd.h> #include <dirent.h> -#include <dlog.h> #include <system_info.h> #include <tzplatform_config.h> #include "shared/util.h" +#include "log_dump.h" +#include "dbus-handler.h" #undef LOG_TAG #define LOG_TAG "LOG_DUMP" @@ -34,14 +36,10 @@ #define DUMP_SCRIPTS_DIR tzplatform_getenv(TZ_SYS_DUMPGEN) #define SYSTEM_INFO_KEY_BUILD_STRING "http://tizen.org/system/build.string" -enum { - OPT_NORMAL, - OPT_SHORT, -}; - static const struct option opts[] = { { "normal", no_argument, 0, OPT_NORMAL }, { "short", no_argument, 0, OPT_SHORT }, + { "dbus", no_argument, 0, OPT_DBUS }, { 0, 0, 0, 0 } }; @@ -53,6 +51,8 @@ static inline void usage(void) "dump all logs", DUMP_SCRIPTS_DIR); printf(" %-10s %s\n", "--short", "dump systemstate only"); + printf(" %-10s %s\n", "--dbus", + "activate dbus interface"); } static int dump_scripts(const char *path) @@ -85,10 +85,9 @@ static int dump_scripts(const char *path) return 0; } -int main(int argc, char *argv[]) +int log_dump(int option) { - int c, ret; - int opt_normal, opt_short; + int ret; char *version_str = NULL; char timestr[80]; char command[PATH_MAX]; @@ -96,40 +95,16 @@ int main(int argc, char *argv[]) time_t cur_time; struct tm loc_tm; - if (argc < 2) { - usage(); - exit(EXIT_SUCCESS); - } - - opt_normal = opt_short = 0; - while ((c = getopt_long_only(argc, argv, "", opts, NULL)) != -1) { - switch (c) { - case OPT_NORMAL: - opt_normal = 1; - break; - case OPT_SHORT: - opt_short = 1; - break; - default: - usage(); - exit(EXIT_SUCCESS); - break; - } - } - - if (opt_normal & opt_short) { - usage(); - exit(EXIT_SUCCESS); - } - /* Make debug directory */ - ret = snprintf(command, sizeof(command), - "/usr/bin/mkdir -p %s", LOG_DUMP_DIR); - if (ret < 0) { - LOGE("Failed to mkdir"); - exit(EXIT_FAILURE); + if (access(LOG_DUMP_DIR, F_OK) != 0) { + ret = snprintf(command, sizeof(command), + "/usr/bin/mkdir -p %s", LOG_DUMP_DIR); + if (ret < 0) { + LOGE("Failed to mkdir"); + return -1; + } + system_command(command); } - system_command(command); /* Get timestamp */ cur_time = time(NULL); @@ -150,12 +125,12 @@ int main(int argc, char *argv[]) "%s/dump_systemstate_%s.log", LOG_DUMP_DIR, timestr); if (ret < 0) { LOGE("Failed to snprintf for command"); - exit(EXIT_FAILURE); + goto exit; } system_command(command); /* Dump all logs */ - if (opt_normal) + if (option == OPT_NORMAL) dump_scripts(DUMP_SCRIPTS_DIR); if (version_str) { @@ -163,14 +138,14 @@ int main(int argc, char *argv[]) "log_dump", version_str); if (ret < 0) { LOGE("Failed to snprintf for dump path"); - exit(EXIT_FAILURE); + goto exit; } } else { ret = snprintf(dump_filename, sizeof(dump_filename), "%s", "log_dump"); if (ret < 0) { LOGE("Failed to snprintf for dump path"); - exit(EXIT_FAILURE); + return -1; } } @@ -180,19 +155,75 @@ int main(int argc, char *argv[]) LOG_DUMP_ROOT, dump_filename, timestr, LOG_DUMP_ROOT); if (ret < 0) { LOGE("Failed to snprintf for command"); - exit(EXIT_FAILURE); + goto exit; } system_command(command); sync(); - if (remove_dir(LOG_DUMP_DIR, 0) < 0) { - ret = -1; + ret = remove_dir(LOG_DUMP_DIR, 0); + if (ret < 0) { LOGE("Failed to delete dump directory"); + goto exit; } + /* Further operations for log_dump here */ + +exit: if (version_str) free(version_str); return ret; } + +int main(int argc, char *argv[]) +{ + int c, ret; + int option; + + if (argc < 2) { + usage(); + exit(EXIT_SUCCESS); + } + + option = -1; + while ((c = getopt_long_only(argc, argv, "", opts, NULL)) != -1) { + switch (c) { + case OPT_NORMAL: + if (option >= 0) { + usage(); + exit(EXIT_SUCCESS); + } + option = OPT_NORMAL; + break; + case OPT_SHORT: + if (option >= 0) { + usage(); + exit(EXIT_SUCCESS); + } + option = OPT_SHORT; + break; + case OPT_DBUS: + if (option >= 0) { + usage(); + exit(EXIT_SUCCESS); + } + option = OPT_DBUS; + break; + default: + usage(); + exit(EXIT_SUCCESS); + break; + } + } + + if (option == OPT_DBUS) + ret = log_dump_dbus(); + else + ret = log_dump(option); + + if (ret < 0) + exit(EXIT_FAILURE); + + return 0; +} diff --git a/src/log_dump/log_dump.h b/src/log_dump/log_dump.h new file mode 100644 index 0000000..9936a08 --- /dev/null +++ b/src/log_dump/log_dump.h @@ -0,0 +1,34 @@ +/* + * log_dump + * + * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LOGDUMP_H__ +#define __LOGDUMP_H__ + +#include <dlog.h> +#undef LOG_TAG +#define LOG_TAG "LOG_DUMP" + +enum { + OPT_NORMAL, + OPT_SHORT, + OPT_DBUS, +}; + +int log_dump(int option); + +#endif diff --git a/src/log_dump/org.tizen.system.crash.service b/src/log_dump/org.tizen.system.crash.service new file mode 100644 index 0000000..1e9a605 --- /dev/null +++ b/src/log_dump/org.tizen.system.crash.service @@ -0,0 +1,5 @@ +[D-BUS Service] +Name=org.tizen.system.crash +Exec=/usr/bin/log_dump --dbus +User=root +Group=root |