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]}"
# 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
;;
*)

View File

@ -40,6 +40,27 @@ void print_help() {
} // 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[]) {
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<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;
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) {
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<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;
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) {
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<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
std::cerr << "Error: Unknown command '" << cmd << "'" << std::endl;
dropshell::print_help();