diff --git a/CmdOptions.h b/CmdOptions.h index d4be757..c9ff98d 100644 --- a/CmdOptions.h +++ b/CmdOptions.h @@ -16,6 +16,7 @@ typedef struct program_options_t { bool upload = false; bool share = false; bool insecure = false; + bool list_servers = false; std::string selected_server = ""; OutputType output_type = OutputType::verbose; } ProgramOptions; @@ -27,12 +28,13 @@ static struct option CmdLongOptions[] = { {"upload", no_argument, 0, 'u' }, {"share", no_argument, 0, 's' }, {"insecure", no_argument, 0, 'i' }, + {"list-servers",no_argument, 0, 'L' }, {"test-server", required_argument, 0, 't' }, {"output", required_argument, 0, 'o' }, {0, 0, 0, 0 } }; -const char *optStr = "hldusiqt:o:"; +const char *optStr = "hldusiqLt:o:"; bool ParseOptions(const int argc, const char **argv, ProgramOptions& options){ int long_index =0; @@ -57,6 +59,9 @@ bool ParseOptions(const int argc, const char **argv, ProgramOptions& options){ case 'i': options.insecure = true; break; + case 'L': + options.list_servers = true; + break; case 't': options.selected_server.append(optarg); break; diff --git a/main.cpp b/main.cpp index b21acf3..280933b 100644 --- a/main.cpp +++ b/main.cpp @@ -26,6 +26,7 @@ void usage(const char* name){ std::cerr << " --upload Perform upload test only. It includes latency test\n"; std::cerr << " --share Generate and provide a URL to the speedtest.net share results image\n"; std::cerr << " --insecure Skip SSL certificate verify (Useful for Embedded devices)\n"; + std::cerr << " --list-servers List available speed test servers\n"; std::cerr << " --test-server host:port Run speed test against a specific server\n"; std::cerr << " --quality-server host:port Run line quality test against a specific server\n"; std::cerr << " --output verbose|text|json Set output type. Default: verbose\n"; @@ -55,6 +56,32 @@ int main(const int argc, const char **argv) { auto sp = SpeedTest(SPEED_TEST_MIN_SERVER_VERSION); + + if (programOptions.list_servers) { + if (programOptions.output_type == OutputType::json) { + std::cout << "["; + const auto &servers = sp.serverList(); + bool first = true; + for (const auto &server : servers) { + if (!first) { + std::cout << ","; + } + std::cout << "{\"id\":\"" << server.id << "\",\"host\":\"" << server.host + << "\",\"country\":\"" << server.country << "\",\"sponsor\":\"" << server.sponsor << "\"}"; + first = false; + } + std::cout << "]" << std::endl; + } else { + const auto &servers = sp.serverList(); + for (const auto &server : servers) { + std::cout << "ID: " << server.id << ", Host: " << server.host + << ", Country: " << server.country << ", Sponsor: " << server.sponsor << std::endl; + } + } + + return EXIT_SUCCESS; + } + IPInfo info; ServerInfo serverInfo; ServerInfo serverQualityInfo;