From 2e652be9f9700dd06aef22a94b10c736696413fc Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 21 Apr 2025 20:10:25 +1200 Subject: [PATCH] Add generic run --- src/dropshell-completion.bash | 8 +-- src/main.cpp | 101 ++++++++++++++++++---------------- 2 files changed, 55 insertions(+), 54 deletions(-) diff --git a/src/dropshell-completion.bash b/src/dropshell-completion.bash index 9c34fd7..fcc6434 100755 --- a/src/dropshell-completion.bash +++ b/src/dropshell-completion.bash @@ -7,7 +7,7 @@ _dropshell_completions() { prev="${COMP_WORDS[COMP_CWORD-1]}" # 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 local commands=($(dropshell autocomplete_list_commands)) @@ -32,7 +32,7 @@ _dropshell_completions() { COMPREPLY=( $(compgen -W "${servers[*]}" -- ${cur}) ) return 0 ;; - run|install|backup) + install|backup) # Handle completion for run/install/backup commands if [[ ${COMP_CWORD} -eq 2 ]]; then # Second argument is server name @@ -45,10 +45,6 @@ _dropshell_completions() { local services=($(dropshell autocomplete_list_services "$server_name")) COMPREPLY=( $(compgen -W "${services[*]}" -- ${cur}) ) 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 ;; *) diff --git a/src/main.cpp b/src/main.cpp index ae215c6..e2d05fd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -40,6 +40,27 @@ void print_help() { } // namespace dropshell + +bool parseargs(std::string arg2, std::string arg3, std::string & server_name, std::vector& 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[]) { try { // Load configuration @@ -56,6 +77,8 @@ int main(int argc, char* argv[]) { // Handle commands std::string cmd = argv[1]; + + auto commands = dropshell::autocomplete_list_commands(); if (cmd == "help" || cmd == "-h" || cmd == "--help") { dropshell::print_help(); @@ -118,7 +141,6 @@ int main(int argc, char* argv[]) { } if (cmd == "autocomplete_list_commands") { - auto commands = dropshell::autocomplete_list_commands(); for (const auto& command : commands) { std::cout << command << std::endl; } @@ -126,22 +148,12 @@ int main(int argc, char* argv[]) { } if (cmd == "install") { - if (argc < 3) { + std::string server_name; + std::vector 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; return 1; } - std::string server_name = argv[2]; - - std::vector 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) { dropshell::server_service service; if (!service.init(server_name, service_name)) { @@ -157,44 +169,13 @@ int main(int argc, char* argv[]) { 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 (argc < 3) { + std::string server_name; + std::vector 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; return 1; } - std::string server_name = argv[2]; - - std::vector 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) { dropshell::server_service service; @@ -210,6 +191,30 @@ int main(int argc, char* argv[]) { return 0; } + for (const auto& command : commands) { + if (cmd == command) { + std::string server_name; + std::vector 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 std::cerr << "Error: Unknown command '" << cmd << "'" << std::endl; dropshell::print_help();