faultd_object_unref(obj);
return ret;
}
+
+int database_dump(struct faultd_object **out)
+{
+ struct faultd_object *query, *query_child, *result;
+ uint32_t num;
+ int ret;
+
+ ret = faultd_object_new_flags(&query_child, FAULTD_FLAG_QUERY_MODE);
+ if (ret < 0) {
+ log_error("Unable to create faultd_object");
+ goto error;
+ }
+
+ ret = faultd_object_append_string(query_child, "$not", "magicstring");
+ if (ret < 0) {
+ log_error("Unable to append string to faultd_object");
+ goto unref_query_child;
+ }
+
+ ret = faultd_object_new_flags(&query, FAULTD_FLAG_QUERY_MODE);
+ if (ret < 0) {
+ log_error("Unable to create faultd_object");
+ goto unref_query_child;
+ }
+
+ ret = faultd_object_append_object(query, database_get_id_key(), query_child);
+ if (ret < 0) {
+ log_error("Unable to append string to faultd_object");
+ faultd_object_unref(query);
+ goto unref_query_child;
+ }
+
+ faultd_object_unref(query_child);
+
+ ret = faultd_object_new(&result);
+ if (ret < 0) {
+ log_error("Unable to create faultd_object");
+ faultd_object_unref(query);
+ goto error;
+ }
+
+ ret = database_load(query, NULL, result, &num);
+ faultd_object_unref(query);
+ if (ret < 0) {
+ log_error("Unable to load from database");
+ faultd_object_unref(result);
+ goto error;
+ }
+
+ *out = result;
+ return 0;
+
+unref_query_child:
+ faultd_object_unref(query_child);
+error:
+ *out = NULL;
+ return ret;
+}
#include "common.h"
#include "faultd-glib.h"
#include "json-config.h"
+#include "database.h"
static int terminate = 0;
+enum faultd_running_modes {
+ FAULTD_MODE_NORMAL,
+ FAULTD_MODE_CTL,
+};
+
+static int running_mode = FAULTD_MODE_NORMAL;
+
static int signal_handler(sd_event_source *s,
const struct signalfd_siginfo *si,
void *userdata)
static void print_help(const char *name)
{
printf("Usage: %s [OPTIONS]\n"
- "Options: \n"
- " --log-level <level> Set log level to <level>\n"
- " -D Set log level to debug\n"
- " -d, --disable-module <module> Disable <module>\n"
- " --no-action Do not execute any action\n"
- " -c, --config-file <file> Read faultd configuration from <file>\n"
- " -h, --help Display this help and exit\n", name);
+ "Options: \n"
+ " --log-level <level> Set log level to <level>\n"
+ " -D Set log level to debug\n"
+ " -c, --config-file <file> Read faultd configuration from <file>\n",
+ name);
+
+ switch (running_mode) {
+ case FAULTD_MODE_NORMAL:
+ printf(" -d, --disable-module <module> Disable <module>\n"
+ " --no-action Do not execute any action\n");
+ break;
+
+ case FAULTD_MODE_CTL:
+ /* No command line arguments for now */;
+ break;
+ }
+
+ printf(" -h, --help Display this help and exit\n");
}
static int parse_argv(int ac, char *av[])
{
int c, r;
+
+ #define CHECK_MODE(m) \
+ if (running_mode != m) { \
+ print_help(av[0]); \
+ return -EINVAL; \
+ }
+
enum {
ARG_LOG_LEVEL = 0x100,
ARG_NO_ACTION,
};
+
static const struct option options[] = {
{"log-level", required_argument, NULL, ARG_LOG_LEVEL},
{"disable-module", required_argument, NULL, 'd'},
struct faultd_module *module;
const char *custom_config_file = FAULTD_CUSTOM_CONFIG_FILE;
+ if (strcmp(basename(av[0]), "faultctl") == 0)
+ running_mode = FAULTD_MODE_CTL;
+
while ((c = getopt_long(ac, av, "Dc:d:h", options, NULL)) >= 0) {
switch (c) {
-
case ARG_LOG_LEVEL:
r = log_parse_level_name(optarg);
if (r < 0) {
case 'h':
print_help(av[0]);
exit(0);
+
case 'd':
+ CHECK_MODE(FAULTD_MODE_NORMAL);
+
module = faultd_get_module_by_name(optarg);
if (module) {
module->disabled = 1;
break;
case ARG_NO_ACTION:
+ CHECK_MODE(FAULTD_MODE_NORMAL);
+
faultd_disable_module_category(FAULTD_MODULE_TYPE_ACTION);
break;
}
return faultd_load_config(custom_config_file);
+ #undef CHECK_MODE
}
int main(int ac, char *av[])
faultd_get_modules_config(&modules_config);
- rc = faultd_modules_init(loop, modules_config);
- if (rc < 0) {
- log_error("Failed to initialize modules %d.", rc);
- return -1;
- }
+ switch (running_mode) {
+ case FAULTD_MODE_NORMAL:
+ rc = faultd_modules_init(loop, modules_config);
+ if (rc < 0) {
+ log_error("Failed to initialize modules %d.", rc);
+ return -1;
+ }
- printf("Hello world!\n");
+ printf("Hello world!\n");
#ifdef FAULTD_GLIB_MAINLOOP
- rc = faultd_g_main_loop_wrapper(loop);
+ rc = faultd_g_main_loop_wrapper(loop);
#else
- rc = sd_event_loop(loop);
+ rc = sd_event_loop(loop);
#endif /* FAULTD_GLIB_MAINLOOP */
- if (rc < 0)
- log_error_errno(rc, "Failed to run main loop: %m");
+ if (rc < 0)
+ log_error_errno(rc, "Failed to run main loop: %m");
+ break;
+
+ case FAULTD_MODE_CTL:
+ {
+ struct faultd_object *result = NULL;
+ char *buf = NULL;
+
+ faultd_disable_module_category(FAULTD_MODULE_TYPE_UNCATEGORIZED);
+ faultd_disable_module_category(FAULTD_MODULE_TYPE_EVENT);
+ faultd_disable_module_category(FAULTD_MODULE_TYPE_ACTION_EXECUTOR);
+ faultd_disable_module_category(FAULTD_MODULE_TYPE_ACTION);
+ faultd_disable_module_category(FAULTD_MODULE_TYPE_DECISION_MAKER);
+ faultd_disable_module_category(FAULTD_MODULE_TYPE_LISTENER);
+
+ rc = faultd_modules_init(loop, modules_config);
+ if (rc < 0) {
+ log_error("Failed to initialize modules %d.", rc);
+ return -1;
+ }
+
+ rc = database_dump(&result);
+ if (rc < 0) {
+ log_error("Failed to dump database");
+ return -1;
+ }
+
+ rc = faultd_object_to_string(&buf, result, 0);
+ faultd_object_unref(result);
+ if (rc < 0) {
+ log_error("Unable to convert faultd object to string");
+ return -1;
+ }
+
+ printf("%s\n", buf);
+
+ free(buf);
+ break;
+ }
+ }
faultd_modules_cleanup();
faultd_config_cleanup_global();