// retoor #include "tool.h" #include "r_config.h" #include "bash_executor.h" #include #include #include static struct json_object *process_monitor_get_description(void); static char *process_monitor_execute(tool_t *self, struct json_object *args); static void process_monitor_print_action(const char *name, struct json_object *args); static const tool_vtable_t process_monitor_vtable = { .get_description = process_monitor_get_description, .execute = process_monitor_execute, .print_action = process_monitor_print_action }; static tool_t process_monitor_tool = { .vtable = &process_monitor_vtable, .name = "process_monitor" }; tool_t *tool_process_monitor_create(void) { return &process_monitor_tool; } static void process_monitor_print_action(const char *name, struct json_object *args) { (void)name; struct json_object *action; if (json_object_object_get_ex(args, "action", &action)) { fprintf(stderr, " -> Process monitor: %s\n", json_object_get_string(action)); } } static char *process_monitor_execute(tool_t *self, struct json_object *args) { (void)self; struct json_object *action_obj; if (!json_object_object_get_ex(args, "action", &action_obj)) { return strdup("Error: missing 'action' argument (list or kill)"); } const char *action = json_object_get_string(action_obj); if (strcmp(action, "list") == 0) { return r_bash_execute("ps aux | head -n 50", false, 300); } else if (strcmp(action, "kill") == 0) { struct json_object *pid_obj; if (!json_object_object_get_ex(args, "pid", &pid_obj)) { return strdup("Error: missing 'pid' for kill action"); } char cmd[256]; snprintf(cmd, sizeof(cmd), "kill -9 %d", json_object_get_int(pid_obj)); return r_bash_execute(cmd, false, 300); } return strdup("Error: unknown action"); } static struct json_object *process_monitor_get_description(void) { struct json_object *root = json_object_new_object(); json_object_object_add(root, "type", json_object_new_string("function")); struct json_object *function = json_object_new_object(); json_object_object_add(function, "name", json_object_new_string("process_monitor")); json_object_object_add(function, "description", json_object_new_string("Monitor and manage system processes.")); struct json_object *parameters = json_object_new_object(); json_object_object_add(parameters, "type", json_object_new_string("object")); struct json_object *properties = json_object_new_object(); struct json_object *action = json_object_new_object(); json_object_object_add(action, "type", json_object_new_string("string")); json_object_object_add(action, "description", json_object_new_string("Action to perform: 'list' or 'kill'.")); json_object_object_add(properties, "action", action); struct json_object *pid = json_object_new_object(); json_object_object_add(pid, "type", json_object_new_string("integer")); json_object_object_add(pid, "description", json_object_new_string("Process ID to kill (required for 'kill' action).")); json_object_object_add(properties, "pid", pid); json_object_object_add(parameters, "properties", properties); struct json_object *required = json_object_new_array(); json_object_array_add(required, json_object_new_string("action")); json_object_array_add(required, json_object_new_string("pid")); json_object_object_add(parameters, "required", required); json_object_object_add(parameters, "additionalProperties", json_object_new_boolean(0)); json_object_object_add(function, "parameters", parameters); r_config_handle cfg = r_config_get_instance(); if (r_config_use_strict(cfg)) { json_object_object_add(function, "strict", json_object_new_boolean(1)); } json_object_object_add(root, "function", function); return root; }