Add generic run

This commit is contained in:
Your Name 2025-04-21 20:10:25 +12:00
parent 5e21c1a306
commit 2e652be9f9
2 changed files with 55 additions and 54 deletions

View File

@ -7,7 +7,7 @@ _dropshell_completions() {
prev="${COMP_WORDS[COMP_CWORD-1]}" prev="${COMP_WORDS[COMP_CWORD-1]}"
# List of main commands # List of main commands
opts="help version status servers templates autocomplete_list_servers autocomplete_list_services autocomplete_list_commands run install backup" opts="help version status servers templates autocomplete_list_servers autocomplete_list_services autocomplete_list_commands install backup"
# add all commands to opts # add all commands to opts
local commands=($(dropshell autocomplete_list_commands)) local commands=($(dropshell autocomplete_list_commands))
@ -32,7 +32,7 @@ _dropshell_completions() {
COMPREPLY=( $(compgen -W "${servers[*]}" -- ${cur}) ) COMPREPLY=( $(compgen -W "${servers[*]}" -- ${cur}) )
return 0 return 0
;; ;;
run|install|backup) install|backup)
# Handle completion for run/install/backup commands # Handle completion for run/install/backup commands
if [[ ${COMP_CWORD} -eq 2 ]]; then if [[ ${COMP_CWORD} -eq 2 ]]; then
# Second argument is server name # Second argument is server name
@ -45,10 +45,6 @@ _dropshell_completions() {
local services=($(dropshell autocomplete_list_services "$server_name")) local services=($(dropshell autocomplete_list_services "$server_name"))
COMPREPLY=( $(compgen -W "${services[*]}" -- ${cur}) ) COMPREPLY=( $(compgen -W "${services[*]}" -- ${cur}) )
return 0 return 0
elif [[ ${COMP_CWORD} -eq 4 && "${COMP_WORDS[1]}" == "run" ]]; then
# Fourth argument is command name - only for run command
COMPREPLY=( $(compgen -W "${commands[*]}" -- ${cur}) )
return 0
fi fi
;; ;;
*) *)

View File

@ -40,6 +40,27 @@ void print_help() {
} // namespace dropshell } // namespace dropshell
bool parseargs(std::string arg2, std::string arg3, std::string & server_name, std::vector<std::string>& servicelist)
{
if (arg2.empty()) return false;
server_name = arg2;
if (arg3.empty()) {
servicelist = dropshell::get_server_services(server_name);
} else {
servicelist.push_back(arg3);
}
return true;
}
std::string safearg(int argc, char *argv[], int index)
{
if (index >= argc) return "";
return argv[index];
}
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
try { try {
// Load configuration // Load configuration
@ -57,6 +78,8 @@ int main(int argc, char* argv[]) {
// Handle commands // Handle commands
std::string cmd = argv[1]; std::string cmd = argv[1];
auto commands = dropshell::autocomplete_list_commands();
if (cmd == "help" || cmd == "-h" || cmd == "--help") { if (cmd == "help" || cmd == "-h" || cmd == "--help") {
dropshell::print_help(); dropshell::print_help();
return 0; return 0;
@ -118,7 +141,6 @@ int main(int argc, char* argv[]) {
} }
if (cmd == "autocomplete_list_commands") { if (cmd == "autocomplete_list_commands") {
auto commands = dropshell::autocomplete_list_commands();
for (const auto& command : commands) { for (const auto& command : commands) {
std::cout << command << std::endl; std::cout << command << std::endl;
} }
@ -126,22 +148,12 @@ int main(int argc, char* argv[]) {
} }
if (cmd == "install") { if (cmd == "install") {
if (argc < 3) { std::string server_name;
std::vector<std::string> servicelist;
if (!parseargs(safearg(argc, argv, 2), safearg(argc, argv, 3), server_name, servicelist)) {
std::cerr << "Error: install command requires server name and optionally service name" << std::endl; std::cerr << "Error: install command requires server name and optionally service name" << std::endl;
return 1; return 1;
} }
std::string server_name = argv[2];
std::vector<std::string> servicelist;
if (argc <= 3) {
servicelist = dropshell::get_server_services(server_name);
if (servicelist.empty()) {
std::cerr << "Error: No services found for server " << server_name << std::endl;
return 1;
}
} else
servicelist.push_back(argv[3]);
for (const auto& service_name : servicelist) { for (const auto& service_name : servicelist) {
dropshell::server_service service; dropshell::server_service service;
if (!service.init(server_name, service_name)) { if (!service.init(server_name, service_name)) {
@ -157,44 +169,13 @@ int main(int argc, char* argv[]) {
return 0; return 0;
} }
if (cmd == "run") {
if (argc < 5) {
std::cerr << "Error: run command requires server name, service name, and command" << std::endl;
return 1;
}
std::string server_name = argv[2];
std::string service_name = argv[3];
std::string command = argv[4];
dropshell::server_service service;
if (!service.init(server_name, service_name)) {
std::cerr << "Error: Failed to initialize service" << std::endl;
return 1;
}
if (!service.run_command(command)) {
std::cerr << command +" failed." << std::endl;
return 1;
}
return 0;
}
if (cmd == "backup") { if (cmd == "backup") {
if (argc < 3) { std::string server_name;
std::vector<std::string> servicelist;
if (!parseargs(safearg(argc, argv, 2), safearg(argc, argv, 3), server_name, servicelist)) {
std::cerr << "Error: backup command requires server name and optionally service name" << std::endl; std::cerr << "Error: backup command requires server name and optionally service name" << std::endl;
return 1; return 1;
} }
std::string server_name = argv[2];
std::vector<std::string> servicelist;
if (argc <= 3) {
servicelist = dropshell::get_server_services(server_name);
if (servicelist.empty()) {
std::cerr << "Error: No services found for server " << server_name << std::endl;
return 1;
}
} else
servicelist.push_back(argv[3]);
for (const auto& service_name : servicelist) { for (const auto& service_name : servicelist) {
dropshell::server_service service; dropshell::server_service service;
@ -210,6 +191,30 @@ int main(int argc, char* argv[]) {
return 0; return 0;
} }
for (const auto& command : commands) {
if (cmd == command) {
std::string server_name;
std::vector<std::string> servicelist;
if (!parseargs(safearg(argc, argv, 2), safearg(argc, argv, 3), server_name, servicelist)) {
std::cerr << "Error: " << command << " command requires server name and optionally service name" << std::endl;
return 1;
}
for (const auto& service_name : servicelist) {
dropshell::server_service service;
if (!service.init(server_name, service_name)) {
std::cerr << "Error: Failed to initialize service" << std::endl;
return 1;
}
if (!service.run_command(command)) {
std::cerr << command +" failed." << std::endl;
return 1;
}
}
return 0;
}
}
// Unknown command // Unknown command
std::cerr << "Error: Unknown command '" << cmd << "'" << std::endl; std::cerr << "Error: Unknown command '" << cmd << "'" << std::endl;
dropshell::print_help(); dropshell::print_help();