v0.1.9 - program generates it's own private keys.
This commit is contained in:
216
src/admin_handlers.c
Normal file
216
src/admin_handlers.c
Normal file
@@ -0,0 +1,216 @@
|
||||
/*
|
||||
* Ginxsom Admin Command Handlers
|
||||
* Implements execution of admin commands received via Kind 23456 events
|
||||
*/
|
||||
|
||||
#include "ginxsom.h"
|
||||
#include <cjson/cJSON.h>
|
||||
#include <sqlite3.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <dirent.h>
|
||||
|
||||
// Forward declarations
|
||||
static cJSON* handle_blob_list(char **args, int arg_count);
|
||||
static cJSON* handle_blob_info(char **args, int arg_count);
|
||||
static cJSON* handle_blob_delete(char **args, int arg_count);
|
||||
static cJSON* handle_storage_stats(char **args, int arg_count);
|
||||
static cJSON* handle_config_get(char **args, int arg_count);
|
||||
static cJSON* handle_config_set(char **args, int arg_count);
|
||||
static cJSON* handle_help(char **args, int arg_count);
|
||||
|
||||
// Command dispatch table
|
||||
typedef struct {
|
||||
const char *command;
|
||||
cJSON* (*handler)(char **args, int arg_count);
|
||||
const char *description;
|
||||
} admin_command_t;
|
||||
|
||||
static admin_command_t command_table[] = {
|
||||
{"blob_list", handle_blob_list, "List all blobs"},
|
||||
{"blob_info", handle_blob_info, "Get blob information"},
|
||||
{"blob_delete", handle_blob_delete, "Delete a blob"},
|
||||
{"storage_stats", handle_storage_stats, "Get storage statistics"},
|
||||
{"config_get", handle_config_get, "Get configuration value"},
|
||||
{"config_set", handle_config_set, "Set configuration value"},
|
||||
{"help", handle_help, "Show available commands"},
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
// Execute admin command and return JSON response
|
||||
int execute_admin_command(char **command_array, int command_count, char **response_json_out) {
|
||||
if (!command_array || command_count < 1 || !response_json_out) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
const char *command = command_array[0];
|
||||
|
||||
// Find command handler
|
||||
admin_command_t *cmd = NULL;
|
||||
for (int i = 0; command_table[i].command != NULL; i++) {
|
||||
if (strcmp(command_table[i].command, command) == 0) {
|
||||
cmd = &command_table[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
cJSON *response;
|
||||
if (cmd) {
|
||||
// Execute command handler
|
||||
response = cmd->handler(command_array + 1, command_count - 1);
|
||||
} else {
|
||||
// Unknown command
|
||||
response = cJSON_CreateObject();
|
||||
cJSON_AddStringToObject(response, "status", "error");
|
||||
cJSON_AddStringToObject(response, "message", "Unknown command");
|
||||
cJSON_AddStringToObject(response, "command", command);
|
||||
}
|
||||
|
||||
// Convert response to JSON string
|
||||
char *json_str = cJSON_PrintUnformatted(response);
|
||||
cJSON_Delete(response);
|
||||
|
||||
if (!json_str) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
*response_json_out = json_str;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Command handlers
|
||||
|
||||
static cJSON* handle_blob_list(char **args __attribute__((unused)), int arg_count __attribute__((unused))) {
|
||||
cJSON *response = cJSON_CreateObject();
|
||||
cJSON_AddStringToObject(response, "status", "success");
|
||||
cJSON_AddStringToObject(response, "command", "blob_list");
|
||||
|
||||
// TODO: Implement actual blob listing from database
|
||||
cJSON *blobs = cJSON_CreateArray();
|
||||
cJSON_AddItemToObject(response, "blobs", blobs);
|
||||
cJSON_AddNumberToObject(response, "count", 0);
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
static cJSON* handle_blob_info(char **args, int arg_count) {
|
||||
cJSON *response = cJSON_CreateObject();
|
||||
|
||||
if (arg_count < 1) {
|
||||
cJSON_AddStringToObject(response, "status", "error");
|
||||
cJSON_AddStringToObject(response, "message", "Missing blob hash argument");
|
||||
return response;
|
||||
}
|
||||
|
||||
cJSON_AddStringToObject(response, "status", "success");
|
||||
cJSON_AddStringToObject(response, "command", "blob_info");
|
||||
cJSON_AddStringToObject(response, "hash", args[0]);
|
||||
|
||||
// TODO: Implement actual blob info retrieval from database
|
||||
cJSON_AddStringToObject(response, "message", "Not yet implemented");
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
static cJSON* handle_blob_delete(char **args, int arg_count) {
|
||||
cJSON *response = cJSON_CreateObject();
|
||||
|
||||
if (arg_count < 1) {
|
||||
cJSON_AddStringToObject(response, "status", "error");
|
||||
cJSON_AddStringToObject(response, "message", "Missing blob hash argument");
|
||||
return response;
|
||||
}
|
||||
|
||||
cJSON_AddStringToObject(response, "status", "success");
|
||||
cJSON_AddStringToObject(response, "command", "blob_delete");
|
||||
cJSON_AddStringToObject(response, "hash", args[0]);
|
||||
|
||||
// TODO: Implement actual blob deletion
|
||||
cJSON_AddStringToObject(response, "message", "Not yet implemented");
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
static cJSON* handle_storage_stats(char **args __attribute__((unused)), int arg_count __attribute__((unused))) {
|
||||
cJSON *response = cJSON_CreateObject();
|
||||
cJSON_AddStringToObject(response, "status", "success");
|
||||
cJSON_AddStringToObject(response, "command", "storage_stats");
|
||||
|
||||
// Get filesystem stats
|
||||
struct statvfs stat;
|
||||
if (statvfs(".", &stat) == 0) {
|
||||
unsigned long long total = stat.f_blocks * stat.f_frsize;
|
||||
unsigned long long available = stat.f_bavail * stat.f_frsize;
|
||||
unsigned long long used = total - available;
|
||||
|
||||
cJSON_AddNumberToObject(response, "total_bytes", (double)total);
|
||||
cJSON_AddNumberToObject(response, "used_bytes", (double)used);
|
||||
cJSON_AddNumberToObject(response, "available_bytes", (double)available);
|
||||
}
|
||||
|
||||
// TODO: Add blob count and total blob size from database
|
||||
cJSON_AddNumberToObject(response, "blob_count", 0);
|
||||
cJSON_AddNumberToObject(response, "blob_total_bytes", 0);
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
static cJSON* handle_config_get(char **args, int arg_count) {
|
||||
cJSON *response = cJSON_CreateObject();
|
||||
|
||||
if (arg_count < 1) {
|
||||
cJSON_AddStringToObject(response, "status", "error");
|
||||
cJSON_AddStringToObject(response, "message", "Missing config key argument");
|
||||
return response;
|
||||
}
|
||||
|
||||
cJSON_AddStringToObject(response, "status", "success");
|
||||
cJSON_AddStringToObject(response, "command", "config_get");
|
||||
cJSON_AddStringToObject(response, "key", args[0]);
|
||||
|
||||
// TODO: Implement actual config retrieval from database
|
||||
cJSON_AddStringToObject(response, "value", "");
|
||||
cJSON_AddStringToObject(response, "message", "Not yet implemented");
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
static cJSON* handle_config_set(char **args, int arg_count) {
|
||||
cJSON *response = cJSON_CreateObject();
|
||||
|
||||
if (arg_count < 2) {
|
||||
cJSON_AddStringToObject(response, "status", "error");
|
||||
cJSON_AddStringToObject(response, "message", "Missing config key or value argument");
|
||||
return response;
|
||||
}
|
||||
|
||||
cJSON_AddStringToObject(response, "status", "success");
|
||||
cJSON_AddStringToObject(response, "command", "config_set");
|
||||
cJSON_AddStringToObject(response, "key", args[0]);
|
||||
cJSON_AddStringToObject(response, "value", args[1]);
|
||||
|
||||
// TODO: Implement actual config update in database
|
||||
cJSON_AddStringToObject(response, "message", "Not yet implemented");
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
static cJSON* handle_help(char **args __attribute__((unused)), int arg_count __attribute__((unused))) {
|
||||
cJSON *response = cJSON_CreateObject();
|
||||
cJSON_AddStringToObject(response, "status", "success");
|
||||
cJSON_AddStringToObject(response, "command", "help");
|
||||
|
||||
cJSON *commands = cJSON_CreateArray();
|
||||
for (int i = 0; command_table[i].command != NULL; i++) {
|
||||
cJSON *cmd = cJSON_CreateObject();
|
||||
cJSON_AddStringToObject(cmd, "command", command_table[i].command);
|
||||
cJSON_AddStringToObject(cmd, "description", command_table[i].description);
|
||||
cJSON_AddItemToArray(commands, cmd);
|
||||
}
|
||||
|
||||
cJSON_AddItemToObject(response, "commands", commands);
|
||||
|
||||
return response;
|
||||
}
|
||||
Reference in New Issue
Block a user