diff options
author | 2012-03-29 18:49:04 +0100 | |
---|---|---|
committer | 2012-03-30 18:43:15 +0100 | |
commit | de6b2ae2f2ec414b30fa953b80a9cc58f2d875df (patch) | |
tree | ec0131d7131941a3fac4686ac45f417fd2e1c55a | |
parent | 9bf46f1a321dd62b8a81aaf811a85422b39e564c (diff) | |
download | paludis-de6b2ae2f2ec414b30fa953b80a9cc58f2d875df.tar.gz paludis-de6b2ae2f2ec414b30fa953b80a9cc58f2d875df.tar.xz |
Add cave-print-checksum
Mostly to help test the hash algorithms.
-rw-r--r-- | src/clients/cave/Makefile.am | 2 | ||||
-rw-r--r-- | src/clients/cave/cmd_print_checksum.cc | 129 | ||||
-rw-r--r-- | src/clients/cave/cmd_print_checksum.hh | 43 | ||||
-rw-r--r-- | src/clients/cave/command_factory.cc | 2 |
4 files changed, 176 insertions, 0 deletions
diff --git a/src/clients/cave/Makefile.am b/src/clients/cave/Makefile.am index 2f042c844..62cce44ce 100644 --- a/src/clients/cave/Makefile.am +++ b/src/clients/cave/Makefile.am @@ -43,6 +43,7 @@ command_MANS = \ cave-perform.1 \ cave-print-best-version.1 \ cave-print-categories.1 \ + cave-print-checksum.1 \ cave-print-commands.1 \ cave-print-dependent-ids.1 \ cave-print-environment-metadata.1 \ @@ -173,6 +174,7 @@ libcave_a_SOURCES = \ cmd_perform.cc cmd_perform.hh cmd_perform-fmt.hh \ cmd_print_best_version.cc cmd_print_best_version.hh \ cmd_print_categories.cc cmd_print_categories.hh \ + cmd_print_checksum.cc cmd_print_checksum.hh \ cmd_print_commands.cc cmd_print_commands.hh \ cmd_print_dependent_ids.cc cmd_print_dependent_ids.hh \ cmd_print_environment_metadata.cc cmd_print_environment_metadata.hh \ diff --git a/src/clients/cave/cmd_print_checksum.cc b/src/clients/cave/cmd_print_checksum.cc new file mode 100644 index 000000000..7210c678d --- /dev/null +++ b/src/clients/cave/cmd_print_checksum.cc @@ -0,0 +1,129 @@ +/* vim: set sw=4 sts=4 et foldmethod=syntax : */ + +/* + * Copyright (c) 2012 David Leverton + * + * This file is part of the Paludis package manager. Paludis is free software; + * you can redistribute it and/or modify it under the terms of the GNU General + * Public License version 2, as published by the Free Software Foundation. + * + * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "cmd_print_checksum.hh" +#include "command_command_line.hh" + +#include <paludis/util/digest_registry.hh> +#include <paludis/util/fs_path.hh> +#include <paludis/util/safe_ifstream.hh> +#include <paludis/util/upper_lower.hh> + +#include <paludis/args/do_help.hh> + +#include <cstdlib> +#include <iostream> +#include <sstream> + +using namespace paludis; +using namespace paludis::cave; + +namespace +{ + struct PrintChecksumCommandLine : + CaveCommandCommandLine + { + args::ArgsGroup g_input; + args::SwitchArg a_stdin; + args::StringArg a_file; + args::StringArg a_text; + + PrintChecksumCommandLine() : + g_input(main_options_section(), "Input Options", "Input Options"), + a_stdin(&g_input, "stdin", 's', "Calculate the checksum of standard input.", false), + a_file(&g_input, "file", 'f', "Calculate the checksum of the contents of the specified file."), + a_text(&g_input, "text", 't', "Calculate the checksum of the specified text.") + { + add_usage_line("ALGORITHM --stdin"); + add_usage_line("ALGORITHM --file FILENAME"); + add_usage_line("ALGORITHM --text TEXT"); + } + + virtual std::string app_name() const + { + return "cave print-checksum"; + } + + virtual std::string app_synopsis() const + { + return "prints cryptographic checksums"; + } + + virtual std::string app_description() const + { + return "Prints the checksum of the specified input using the specified algorithm. No formatting " + "is used, making the output suitable for parsing by scripts."; + } + }; +} + +int +PrintChecksumCommand::run(const std::shared_ptr<Environment> &, + const std::shared_ptr<const Sequence<std::string> > & args) +{ + PrintChecksumCommandLine cmdline; + cmdline.run(args, "CAVE", "CAVE_PRINT_CHECKSUM_OPTIONS", "CAVE_PRINT_CHECKSUM_CMDLINE"); + + if (cmdline.a_help.specified()) + { + std::cout << cmdline; + return EXIT_SUCCESS; + } + + if (std::distance(cmdline.begin_parameters(), cmdline.end_parameters()) != 1) + throw args::DoHelp("print-checksum takes exactly one parameter"); + + std::string algo(toupper(*cmdline.begin_parameters())); + DigestRegistry::Function f(DigestRegistry::get_instance()->get(algo)); + if (! f) + throw args::DoHelp("algorithm '" + algo + "' is not supported"); + + if (cmdline.a_stdin.specified() + cmdline.a_file.specified() + cmdline.a_text.specified() != 1) + throw args::DoHelp("print-checksum requires exactly one of --stdin, --file or --text"); + + std::string result; + if (cmdline.a_stdin.specified()) + result = f(std::cin); + else if (cmdline.a_file.specified()) + { + SafeIFStream s(FSPath(cmdline.a_file.argument())); + result = f(s); + } + else if (cmdline.a_text.specified()) + { + std::istringstream s(cmdline.a_text.argument()); + result = f(s); + } + + std::cout << result << std::endl; + return EXIT_SUCCESS; +} + +std::shared_ptr<args::ArgsHandler> +PrintChecksumCommand::make_doc_cmdline() +{ + return std::make_shared<PrintChecksumCommandLine>(); +} + +CommandImportance +PrintChecksumCommand::importance() const +{ + return ci_scripting; +} + diff --git a/src/clients/cave/cmd_print_checksum.hh b/src/clients/cave/cmd_print_checksum.hh new file mode 100644 index 000000000..cba0b5fc2 --- /dev/null +++ b/src/clients/cave/cmd_print_checksum.hh @@ -0,0 +1,43 @@ +/* vim: set sw=4 sts=4 et foldmethod=syntax : */ + +/* + * Copyright (c) 2012 David Leverton + * + * This file is part of the Paludis package manager. Paludis is free software; + * you can redistribute it and/or modify it under the terms of the GNU General + * Public License version 2, as published by the Free Software Foundation. + * + * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef PALUDIS_GUARD_SRC_CLIENTS_CAVE_CMD_PRINT_CHECKSUM_HH +#define PALUDIS_GUARD_SRC_CLIENTS_CAVE_CMD_PRINT_CHECKSUM_HH 1 + +#include "command.hh" + +namespace paludis +{ + namespace cave + { + class PALUDIS_VISIBLE PrintChecksumCommand : + public Command + { + public: + virtual CommandImportance importance() const PALUDIS_ATTRIBUTE((warn_unused_result)); + + int run(const std::shared_ptr<Environment> &, + const std::shared_ptr<const Sequence<std::string> > & args); + + std::shared_ptr<args::ArgsHandler> make_doc_cmdline(); + }; + } +} + +#endif diff --git a/src/clients/cave/command_factory.cc b/src/clients/cave/command_factory.cc index 132bd7019..d08d67965 100644 --- a/src/clients/cave/command_factory.cc +++ b/src/clients/cave/command_factory.cc @@ -58,6 +58,7 @@ #include "cmd_perform.hh" #include "cmd_print_best_version.hh" #include "cmd_print_categories.hh" +#include "cmd_print_checksum.hh" #include "cmd_print_commands.hh" #include "cmd_print_dependent_ids.hh" #include "cmd_print_environment_metadata.hh" @@ -179,6 +180,7 @@ CommandFactory::CommandFactory() : _imp->handlers.insert(std::make_pair("purge", std::bind(&make_command<PurgeCommand>))); _imp->handlers.insert(std::make_pair("print-best-version", std::bind(&make_command<PrintBestVersionCommand>))); _imp->handlers.insert(std::make_pair("print-categories", std::bind(&make_command<PrintCategoriesCommand>))); + _imp->handlers.insert(std::make_pair("print-checksum", std::bind(&make_command<PrintChecksumCommand>))); _imp->handlers.insert(std::make_pair("print-commands", std::bind(&make_command<PrintCommandsCommand>))); _imp->handlers.insert(std::make_pair("print-dependent-ids", std::bind(&make_command<PrintDependentIDsCommand>))); _imp->handlers.insert(std::make_pair("print-environment-metadata", std::bind(&make_command<PrintEnvironmentMetadataCommand>))); |