Working
Some checks failed
Dropshell Test / Build_and_Test (push) Failing after 27s

This commit is contained in:
Your Name 2025-05-11 13:04:12 +12:00
parent 46396369d7
commit 62191cceed
7 changed files with 134 additions and 43 deletions

View File

@ -29,9 +29,22 @@ std::vector<std::string> CommandRegistry::list_commands(bool include_hidden) con
return std::vector<std::string>(out.begin(), out.end());
}
std::vector<std::string> CommandRegistry::list_primary_commands(bool include_hidden) const {
std::set<std::string> out;
for (const auto& cmd : all_commands_) {
if (!cmd->hidden || include_hidden) {
if (cmd->names.size() > 0)
out.insert(cmd->names[0]);
}
}
return std::vector<std::string>(out.begin(), out.end());
}
void CommandRegistry::autocomplete(const std::vector<std::string>& args) const {
// dropshell autocomplete <command> <arg> <arg> ...
if (args.size() < 3) {
for (const auto& name : list_commands(false)) {
for (const auto& name : list_primary_commands(false)) {
std::cout << name << std::endl;
}
return;
@ -39,7 +52,7 @@ void CommandRegistry::autocomplete(const std::vector<std::string>& args) const {
std::string cmd = args[2];
auto* info = find_command(cmd);
if (info && info->autocomplete) {
CommandContext ctx{args};
CommandContext ctx{args[0], cmd, std::vector<std::string>(args.begin() + 2, args.end())};
info->autocomplete(ctx);
}
}

View File

@ -8,7 +8,10 @@
#include <iostream>
struct CommandContext {
std::string exename;
std::string command;
std::vector<std::string> args;
// Add more fields as needed (e.g., config pointer, output stream, etc.)
};
@ -35,6 +38,7 @@ public:
// List all commands (optionally including hidden)
std::vector<std::string> list_commands(bool include_hidden = false) const;
std::vector<std::string> list_primary_commands(bool include_hidden = false) const;
// For autocomplete
void autocomplete(const std::vector<std::string>& args) const;

View File

@ -140,18 +140,18 @@ int edit_service_config(const std::string &server, const std::string &service)
// ------------------------------------------------------------------------------------------------
int edit_handler(const CommandContext& ctx) {
// edit dropshell config
if (ctx.args.size() < 3)
if (ctx.args.size() < 1)
return edit_config();
// edit server config
if (ctx.args.size() < 4) {
edit_server(safearg(ctx.args,2));
if (ctx.args.size() < 2) {
edit_server(safearg(ctx.args,0));
return 0;
}
// edit service config
if (ctx.args.size() < 5) {
edit_service_config(safearg(ctx.args,2), safearg(ctx.args,3));
if (ctx.args.size() < 3) {
edit_service_config(safearg(ctx.args,0), safearg(ctx.args,1));
return 0;
}

107
src/commands/list.cpp Normal file
View File

@ -0,0 +1,107 @@
#include "command_registry.hpp"
#include "config.hpp"
#include "utils/utils.hpp"
#include "service_runner.hpp"
#include "utils/directories.hpp"
#include "standard_autocomplete.hpp"
#include "servers.hpp"
#include "tableprint.hpp"
#include "transwarp.hpp"
#include <unistd.h>
#include <cstring>
#include <iostream>
#include <sstream>
#include <filesystem>
#include <libassert/assert.hpp>
namespace dropshell {
void list_autocomplete(const CommandContext& ctx);
int list_handler(const CommandContext& ctx);
static std::vector<std::string> list_name_list={"list","ls","info","-l"};
// Static registration
struct ListCommandRegister {
ListCommandRegister() {
CommandRegistry::instance().register_command({
list_name_list,
list_handler,
list_autocomplete,
false, // hidden
false, // requires_config
0, // min_args (after command)
2, // max_args (after command)
"list [SERVER] [SERVICE]",
"List dropshell, server or service configuration"
});
}
} list_command_register;
// ------------------------------------------------------------------------------------------------
// list command autocomplete
// ------------------------------------------------------------------------------------------------
void list_autocomplete(const CommandContext& ctx) {
std_autocomplete(list_name_list, ctx);
}
// ------------------------------------------------------------------------------------------------
// list command handler
// ------------------------------------------------------------------------------------------------
int list_handler(const CommandContext& ctx) {
if (ctx.args.size() == 0) {
list_servers();
return 0;
}
std::cout << "List handler called with " << ctx.args.size() << " args\n";
return 0;
}
// https://github.com/bloomen/transwarp?tab=readme-ov-file#range-functions
void list_servers() {
auto servers = get_configured_servers();
if (servers.empty()) {
std::cout << "No servers found" << std::endl;
std::cout << "Please run 'dropshell edit' to set up dropshell." << std::endl;
std::cout << "Then run 'dropshell create-server' to create a server." << std::endl;
return;
}
tableprint tp("All DropShell Servers");
tp.add_row({"Name", "User", "Address", "Health", "Ports"});
std::cout << "Checking "<<servers.size() << " servers: " << std::flush;
int checked = 0;
transwarp::parallel exec{servers.size()};
auto task = transwarp::for_each(exec, servers.begin(), servers.end(), [&](const ServerInfo& server) {
std::map<std::string, ServiceStatus> status = service_runner::get_all_services_status(server.name);
std::set<int> ports_used;
std::string serviceticks = "";
for (const auto& [service_name, service_status] : status) {
ports_used.insert(service_status.ports.begin(), service_status.ports.end());
serviceticks += service_runner::HealthStatus2String(service_status.health) + " ";
}
std::string ports_used_str = "";
for (const auto& port : ports_used)
ports_used_str += std::to_string(port) + " ";
tp.add_row({server.name, server.ssh_user, server.ssh_host, serviceticks, ports_used_str});
++checked;
// print out a tick character for each server checked.
std::cout << checked << "" << std::flush;
});
task->wait();
std::cout << std::endl << std::endl;
tp.print();
}
} // namespace dropshell

View File

@ -68,7 +68,7 @@ int main(int argc, char* argv[]) {
<< info->help_description << std::endl;
return 1;
}
CommandContext ctx{args};
CommandContext ctx{args[0], cmd, std::vector<std::string>(args.begin() + 2, args.end())};
return info->handler(ctx);
}

View File

@ -71,39 +71,6 @@ ServerInfo get_server_info(const std::string &server_name)
return ServerInfo();
}
// https://github.com/bloomen/transwarp?tab=readme-ov-file#range-functions
void list_servers() {
auto servers = get_configured_servers();
tableprint tp("All DropShell Servers");
tp.add_row({"Name", "User", "Address", "Health", "Ports"});
std::cout << "Checking "<<servers.size() << " servers: " << std::flush;
int checked = 0;
transwarp::parallel exec{servers.size()};
auto task = transwarp::for_each(exec, servers.begin(), servers.end(), [&](const ServerInfo& server) {
std::map<std::string, ServiceStatus> status = service_runner::get_all_services_status(server.name);
std::set<int> ports_used;
std::string serviceticks = "";
for (const auto& [service_name, service_status] : status) {
ports_used.insert(service_status.ports.begin(), service_status.ports.end());
serviceticks += service_runner::HealthStatus2String(service_status.health) + " ";
}
std::string ports_used_str = "";
for (const auto& port : ports_used)
ports_used_str += std::to_string(port) + " ";
tp.add_row({server.name, server.ssh_user, server.ssh_host, serviceticks, ports_used_str});
++checked;
// print out a tick character for each server checked.
std::cout << checked << "" << std::flush;
});
task->wait();
std::cout << std::endl << std::endl;
tp.print();
}
void show_server_details(const std::string& server_name) {
server_env_manager env(server_name);

View File

@ -324,13 +324,13 @@ int die(const std::string & msg) {
std::string safearg(const std::vector<std::string> & args, int index)
{
if (index >= args.size()) return "";
if (index<0 || index >= args.size()) return "";
return args[index];
}
std::string safearg(int argc, char *argv[], int index)
{
if (index >= argc) return "";
if (index<0 || index >= argc) return "";
return argv[index];
}