From 2c5690e3e3384b98c1b4dc78c076ae9d59eb7d22 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 17 Nov 2020 17:16:29 +0100 Subject: [PATCH] bin: consolidate clients --- src/bin/common/checks.hpp | 3 +- src/bin/memcat.cc | 30 +++---- src/bin/memcp.cc | 4 +- src/bin/memping.cc | 169 -------------------------------------- test/tests/bin/memcat.cpp | 28 ++++--- 5 files changed, 35 insertions(+), 199 deletions(-) diff --git a/src/bin/common/checks.hpp b/src/bin/common/checks.hpp index e46fffbe..470b4b4a 100644 --- a/src/bin/common/checks.hpp +++ b/src/bin/common/checks.hpp @@ -58,7 +58,8 @@ bool check_return(const client_options &opt, memcached_st &memc, const char *key if (!opt.isset("quiet")) { if (MEMCACHED_NOTFOUND == rc) { if (opt.isset("verbose")) { - std::cerr << "Could not find key '" << key << "'.\n"; + std::cerr << "Could not find key '" << key + << "': " << memcached_strerror(&memc, rc) << "\n";; } } else { std::cerr << "Fatal error for key '" << key diff --git a/src/bin/memcat.cc b/src/bin/memcat.cc index 9e2704af..b8e49486 100644 --- a/src/bin/memcat.cc +++ b/src/bin/memcat.cc @@ -37,12 +37,22 @@ memcached_return_t memcat(const client_options &opt, memcached_st *memc, const c *ref << "key: " << key << "\n"; } if (opt.isset("flags")) { - *ref << "flags: " << flags << "\n"; + if (verbose) { + *ref << "flags: "; + } + *ref << flags << "\n"; } if (verbose) { *ref << "value: "; } - ref->write(val, len) << std::endl; + + ref->write(val, len); + + if (verbose || !opt.isset("file")) { + *ref << std::endl; + } + + ref->flush(); } if (val) { @@ -52,7 +62,7 @@ memcached_return_t memcat(const client_options &opt, memcached_st *memc, const c } int main(int argc, char *argv[]) { - client_options opt{PROGRAM_NAME, PROGRAM_VERSION, PROGRAM_DESCRIPTION, "key [ key ... ]"}; + client_options opt{PROGRAM_NAME, PROGRAM_VERSION, PROGRAM_DESCRIPTION, "key [key ...]"}; for (const auto &def : opt.defaults) { opt.add(def); @@ -89,23 +99,9 @@ int main(int argc, char *argv[]) { for (auto arg = argp; *arg; ++arg) { auto key = *arg; if (*key) { - std::ofstream fstream{}; std::ostream *ostream = check_ostream(opt, opt.argof("file"), fstream); - auto file = opt.argof("file"); - if (file && *file) { - fstream.open(file, std::ios::binary | std::ios::out); - if (!fstream.is_open()) { - exit_code = EXIT_FAILURE; - if (!opt.isset("quiet")) { - std::cerr << "Failed to open " << file << " for writing.\n"; - } - continue; - } - ostream = &fstream; - } - if (!check_return(opt, memc, key, memcat(opt, &memc, key, ostream))) { exit_code = EXIT_FAILURE; } diff --git a/src/bin/memcp.cc b/src/bin/memcp.cc index 713eb570..e2dcccdc 100644 --- a/src/bin/memcp.cc +++ b/src/bin/memcp.cc @@ -111,9 +111,9 @@ int main(int argc, char *argv[]) { }; opt.add("udp", 'U', no_argument, "Use UDP.") - .apply = [](const client_options &opt, const client_options::extended_option &ext, memcached_st *memc) { + .apply = [](const client_options &opt_, const client_options::extended_option &ext, memcached_st *memc) { if (MEMCACHED_SUCCESS != memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_USE_UDP, ext.set)) { - if (!opt.isset("quiet")) { + if (!opt_.isset("quiet")) { std::cerr << memcached_last_error_message(memc) << "\n"; } return false; diff --git a/src/bin/memping.cc b/src/bin/memping.cc index d875280e..6058bc67 100644 --- a/src/bin/memping.cc +++ b/src/bin/memping.cc @@ -90,172 +90,3 @@ int main(int argc, char *argv[]) { memcached_free(&memc); exit(exit_code); } - -#include -#include -#include -#include -#include - -#include "libmemcached-1.0/memcached.h" -#include "libmemcachedutil-1.0/util.h" -#include "client_options.h" -#include "utilities.h" - -#include - -static bool opt_binary = false; -static int opt_verbose = 0; -static time_t opt_expire = 0; -static char *opt_servers = NULL; -static char *opt_username; -static char *opt_passwd; - -#define PROGRAM_NAME "memping" -#define PROGRAM_DESCRIPTION "Ping a server to see if it is alive" - -/* Prototypes */ -void options_parse(int argc, char *argv[]); - -int main(int argc, char *argv[]) { - options_parse(argc, argv); - - if (opt_servers == NULL) { - char *temp; - - if ((temp = getenv("MEMCACHED_SERVERS"))) { - opt_servers = strdup(temp); - } - - if (opt_servers == NULL) { - std::cerr << "No Servers provided" << std::endl; - exit(EXIT_FAILURE); - } - } - - int exit_code = EXIT_SUCCESS; - memcached_server_st *servers = memcached_servers_parse(opt_servers); - if (servers == NULL or memcached_server_list_count(servers) == 0) { - std::cerr << "Invalid server list provided:" << opt_servers << std::endl; - exit_code = EXIT_FAILURE; - } else { - for (uint32_t x = 0; x < memcached_server_list_count(servers); x++) { - memcached_return_t instance_rc; - const char *hostname = servers[x].hostname; - in_port_t port = servers[x].port; - - if (opt_verbose) { - std::cout << "Trying to ping " << hostname << ":" << port << std::endl; - } - - if (libmemcached_util_ping2(hostname, port, opt_username, opt_passwd, &instance_rc) == false) - { - std::cerr << "Failed to ping " << hostname << ":" << port << " " - << memcached_strerror(NULL, instance_rc) << std::endl; - exit_code = EXIT_FAILURE; - } - } - } - memcached_server_list_free(servers); - - free(opt_servers); - - return exit_code; -} - -void options_parse(int argc, char *argv[]) { - memcached_programs_help_st help_options[] = { - {0}, - }; - - static struct option long_options[] = { - {(OPTIONSTRING) "version", no_argument, NULL, OPT_VERSION}, - {(OPTIONSTRING) "help", no_argument, NULL, OPT_HELP}, - {(OPTIONSTRING) "quiet", no_argument, NULL, OPT_QUIET}, - {(OPTIONSTRING) "verbose", no_argument, &opt_verbose, OPT_VERBOSE}, - {(OPTIONSTRING) "debug", no_argument, &opt_verbose, OPT_DEBUG}, - {(OPTIONSTRING) "servers", required_argument, NULL, OPT_SERVERS}, - {(OPTIONSTRING) "expire", required_argument, NULL, OPT_EXPIRE}, - {(OPTIONSTRING) "binary", no_argument, NULL, OPT_BINARY}, - {(OPTIONSTRING) "username", required_argument, NULL, OPT_USERNAME}, - {(OPTIONSTRING) "password", required_argument, NULL, OPT_PASSWD}, - {0, 0, 0, 0}, - }; - - bool opt_version = false; - bool opt_help = false; - int option_index = 0; - while (1) { - int option_rv = getopt_long(argc, argv, "Vhvds:", long_options, &option_index); - - if (option_rv == -1) - break; - - switch (option_rv) { - case 0: - break; - - case OPT_BINARY: - opt_binary = true; - break; - - case OPT_VERBOSE: /* --verbose or -v */ - opt_verbose = OPT_VERBOSE; - break; - - case OPT_DEBUG: /* --debug or -d */ - opt_verbose = OPT_DEBUG; - break; - - case OPT_VERSION: /* --version or -V */ - version_command(PROGRAM_NAME); - break; - - case OPT_HELP: /* --help or -h */ - help_command(PROGRAM_NAME, PROGRAM_DESCRIPTION, long_options, help_options); - break; - - case OPT_SERVERS: /* --servers or -s */ - opt_servers = strdup(optarg); - break; - - case OPT_EXPIRE: /* --expire */ - errno = 0; - opt_expire = time_t(strtoll(optarg, (char **) NULL, 10)); - if (errno) { - std::cerr << "Incorrect value passed to --expire: `" << optarg << "`" << std::endl; - exit(EXIT_FAILURE); - } - break; - - case OPT_USERNAME: - opt_username = optarg; - opt_binary = true; - break; - - case OPT_PASSWD: - opt_passwd = optarg; - break; - - case OPT_QUIET: - close_stdio(); - break; - - case '?': - /* getopt_long already printed an error message. */ - exit(1); - default: - abort(); - } - } - - if (opt_version) { - version_command(PROGRAM_NAME); - exit(EXIT_SUCCESS); - } - - if (opt_help) { - help_command(PROGRAM_NAME, PROGRAM_DESCRIPTION, long_options, help_options); - exit(EXIT_SUCCESS); - } -} diff --git a/test/tests/bin/memcat.cpp b/test/tests/bin/memcat.cpp index b7390aea..f5d63cc5 100644 --- a/test/tests/bin/memcat.cpp +++ b/test/tests/bin/memcat.cpp @@ -12,7 +12,7 @@ TEST_CASE("bin/memcat") { SECTION("no servers provided") { string output; REQUIRE_FALSE(sh.run("memcat", output)); - REQUIRE(output == "No servers provided\n"); + REQUIRE(output == "No servers provided.\n"); } SECTION("connection failure") { @@ -24,13 +24,14 @@ TEST_CASE("bin/memcat") { SECTION("--help") { string output; REQUIRE(sh.run("memcat --help", output)); - REQUIRE_THAT(output, Contains("memcat")); - REQUIRE_THAT(output, Contains("v1")); - REQUIRE_THAT(output, Contains("help")); - REQUIRE_THAT(output, Contains("version")); - REQUIRE_THAT(output, Contains("option")); - REQUIRE_THAT(output, Contains("--")); - REQUIRE_THAT(output, Contains("=")); + REQUIRE_THAT(output, Contains("memcat v1")); + REQUIRE_THAT(output, Contains("Usage:")); + REQUIRE_THAT(output, Contains("key [key ...]")); + REQUIRE_THAT(output, Contains("Options:")); + REQUIRE_THAT(output, Contains("-h|--help")); + REQUIRE_THAT(output, Contains("-V|--version")); + REQUIRE_THAT(output, Contains("Environment:")); + REQUIRE_THAT(output, Contains("MEMCACHED_SERVERS")); } SECTION("with server") { @@ -49,6 +50,13 @@ TEST_CASE("bin/memcat") { string output; REQUIRE_FALSE(sh.run(comm + "memcat", output)); + REQUIRE(output.empty()); + } + SECTION("not found --verbose") { + memcached_delete(*memc, S("memcat"), 0); + + string output; + REQUIRE_FALSE(sh.run(comm + " -v memcat", output)); REQUIRE_THAT(output, !Contains("MEMCAT-SET")); REQUIRE_THAT(output, Contains("NOT FOUND")); } @@ -62,10 +70,10 @@ TEST_CASE("bin/memcat") { } SECTION("flags") { REQUIRE(sh.run(comm + "--flag memcat", output)); - REQUIRE(output == "123\n"); + REQUIRE(output == "123\nMEMCAT-SET\n"); output.clear(); REQUIRE(sh.run(comm + "--flag -v memcat", output)); - REQUIRE(output == "key: memcat\nflags: 123\n"); + REQUIRE(output == "key: memcat\nflags: 123\nvalue: MEMCAT-SET\n"); } SECTION("file") { Tempfile temp; -- 2.30.2