You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
proxysql/lib/Admin_Tool_Handler.cpp

162 lines
4.0 KiB

#ifdef PROXYSQLGENAI
#include "proxysql.h"
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include "Admin_Tool_Handler.h"
#include "MCP_Thread.h"
#include "proxysql_debug.h"
Admin_Tool_Handler::Admin_Tool_Handler(MCP_Threads_Handler* handler)
: mcp_handler(handler)
{
pthread_mutex_init(&handler_lock, NULL);
proxy_debug(PROXY_DEBUG_GENERIC, 3, "Admin_Tool_Handler created\n");
}
Admin_Tool_Handler::~Admin_Tool_Handler() {
close();
pthread_mutex_destroy(&handler_lock);
proxy_debug(PROXY_DEBUG_GENERIC, 3, "Admin_Tool_Handler destroyed\n");
}
int Admin_Tool_Handler::init() {
proxy_info("Admin_Tool_Handler initialized\n");
return 0;
}
void Admin_Tool_Handler::close() {
proxy_debug(PROXY_DEBUG_GENERIC, 2, "Admin_Tool_Handler closed\n");
}
json Admin_Tool_Handler::get_tool_list() {
json tools = json::array();
// Stub tools for administrative operations
tools.push_back(create_tool_description(
"admin_list_users",
"List all MySQL users configured in ProxySQL",
{
{"type", "object"},
{"properties", {}}
}
));
tools.push_back(create_tool_description(
"admin_show_processes",
"Show running MySQL processes",
{
{"type", "object"},
{"properties", {}}
}
));
tools.push_back(create_tool_description(
"admin_kill_query",
"Kill a running query by process ID",
{
{"type", "object"},
{"properties", {
{"process_id", {
{"type", "integer"},
{"description", "Process ID to kill"}
}}
}},
{"required", {"process_id"}}
}
));
tools.push_back(create_tool_description(
"admin_flush_cache",
"Flush ProxySQL query cache",
{
{"type", "object"},
{"properties", {
{"cache_type", {
{"type", "string"},
{"enum", {"query_cache", "host_cache", "all"}},
{"description", "Type of cache to flush"}
}}
}},
{"required", {"cache_type"}}
}
));
tools.push_back(create_tool_description(
"admin_reload",
"Reload ProxySQL configuration (users, servers, etc.)",
{
{"type", "object"},
{"properties", {
{"target", {
{"type", "string"},
{"enum", {"users", "servers", "all"}},
{"description", "What to reload"}
}}
}},
{"required", {"target"}}
}
));
json result;
result["tools"] = tools;
return result;
}
json Admin_Tool_Handler::get_tool_description(const std::string& tool_name) {
json tools_list = get_tool_list();
for (const auto& tool : tools_list["tools"]) {
if (tool["name"] == tool_name) {
return tool;
}
}
return create_error_response("Tool not found: " + tool_name);
}
json Admin_Tool_Handler::execute_tool(const std::string& tool_name, const json& arguments) {
pthread_mutex_lock(&handler_lock);
json result;
// Stub implementation - returns placeholder responses
if (tool_name == "admin_list_users") {
result = create_success_response(json{
{"message", "admin_list_users functionality to be implemented"},
{"users", json::array()}
});
} else if (tool_name == "admin_show_processes") {
result = create_success_response(json{
{"message", "admin_show_processes functionality to be implemented"},
{"processes", json::array()}
});
} else if (tool_name == "admin_kill_query") {
int process_id = arguments.value("process_id", 0);
result = create_success_response(json{
{"message", "admin_kill_query functionality to be implemented"},
{"process_id", process_id}
});
} else if (tool_name == "admin_flush_cache") {
std::string cache_type = arguments.value("cache_type", "all");
result = create_success_response(json{
{"message", "admin_flush_cache functionality to be implemented"},
{"cache_type", cache_type}
});
} else if (tool_name == "admin_reload") {
std::string target = arguments.value("target", "all");
result = create_success_response(json{
{"message", "admin_reload functionality to be implemented"},
{"target", target}
});
} else {
result = create_error_response("Unknown tool: " + tool_name);
}
pthread_mutex_unlock(&handler_lock);
return result;
}
#endif /* PROXYSQLGENAI */