lib/longleaf/cli.rb in longleaf-0.3.0 vs lib/longleaf/cli.rb in longleaf-1.0.0

- old
+ new

@@ -7,12 +7,11 @@ require 'longleaf/commands/validate_config_command' require 'longleaf/commands/validate_metadata_command' require 'longleaf/commands/register_command' require 'longleaf/commands/reindex_command' require 'longleaf/commands/preserve_command' -require 'longleaf/candidates/file_selector' -require 'longleaf/candidates/registered_file_selector' +require 'longleaf/helpers/selection_options_parser' module Longleaf # Main commandline interface setup for Longleaf using Thor. class CLI < Thor include Longleaf::Logging @@ -70,53 +69,81 @@ :location, :file_selection, { :aliases => "-s", :required => false, :desc => 'Name or comma separated names of storage locations to perform this operation over.' }) + add_shared_option( + :from_list, :registered_selection, { + :aliases => "-l", + :required => false, + :desc => %q{Provide a list of files to perform this operation on. The list must be new line separated, one file per line. + To provide a list from a file: + '-l /path/to/file_list.txt' + To provide a list from STDIN: + '-l @-'}}) + # Commands map %w[--version] => :__print_version desc "--version", "Prints the Longleaf version number." def __print_version puts "longleaf version #{Longleaf::VERSION}" end desc "register", "Register files with Longleaf" shared_options_group(:file_selection) + method_option(:manifest, + :aliases => "-m", + :type => :array, + :desc => %q{Checksum manifests of files to register. Supports the following formats: + To submit a md5 manifest from a file + '-m md5:/path/to/manifest.txt' + + To provide a sha1 manifest from STDIN + '-m sha1:@-' + Where the content in STDIN adheres to the format: + <digest> <path> + <digest> <path> + ... + + To submit multiple manifests from files + '-m md5:/path/to/manifest1.txt sha1:/path/to/manifest2.txt' + + To provide multiple digests via STDIN + '-m @-' + Where the content in STDIN adheres to the following format: + sha1: + <digest> <path> + ... + md5: + <digest> <path> + ...}) method_option(:force, :type => :boolean, :default => false, :desc => 'Force the registration of already registered files.') method_option(:checksums, - :desc => %q{Checksums for the submitted file. Each checksum must be prefaced with an algorithm prefix. Multiple checksums must be comma separated. If multiple files were submitted, they will be provided with the same checksums. For example: + :desc => %q{Checksums for the submitted file. Only applicable with the -f option. + Each checksum must be prefaced with an algorithm prefix. Multiple checksums must be comma separated. If multiple files were submitted, they will be provided with the same checksums. For example: '--checksums "md5:d8e8fca2dc0f896fd7cb4cb0031ba249,sha1:4e1243bd22c66e76c2ba9eddc1f91394e57f9f83"'}) shared_options_group(:common) # Register event command def register verify_config_provided(options) setup_logger(options) app_config_manager = load_application_config(options) - file_selector = create_file_selector(options, app_config_manager) - if options[:checksums] - checksums = options[:checksums] - # validate checksum list format, must a comma delimited list of prefix:checksums - if /^[^:,]+:[^:,]+(,[^:,]+:[^:,]+)*$/.match(checksums) - # convert checksum list into hash with prefix as key - checksums = Hash[*checksums.split(/\s*[:,]\s*/)] - else - logger.failure("Invalid checksums parameter format, see `longleaf help <command>` for more information") - exit 1 - end - end + file_selector, digest_provider = SelectionOptionsParser.parse_registration_selection_options( + options, app_config_manager) command = RegisterCommand.new(app_config_manager) - exit command.execute(file_selector: file_selector, force: options[:force], checksums: checksums) + exit command.execute(file_selector: file_selector, force: options[:force], digest_provider: digest_provider) end desc "deregister", "Deregister files with Longleaf" shared_options_group(:file_selection) + shared_options_group(:registered_selection) method_option(:force, :type => :boolean, :default => false, :desc => 'Force the deregistration of already deregistered files.') shared_options_group(:common) @@ -124,18 +151,19 @@ def deregister verify_config_provided(options) setup_logger(options) app_config_manager = load_application_config(options) - file_selector = create_registered_selector(options, app_config_manager) + file_selector = SelectionOptionsParser.create_registered_selector(options, app_config_manager) command = DeregisterCommand.new(app_config_manager) exit command.execute(file_selector: file_selector, force: options[:force]) end desc "preserve", "Perform preservation services on files with Longleaf" shared_options_group(:file_selection) + shared_options_group(:registered_selection) method_option(:force, :type => :boolean, :default => false, :desc => 'Force the execution of preservation services, disregarding scheduling information.') shared_options_group(:common) @@ -143,11 +171,11 @@ verify_config_provided(options) setup_logger(options) extend_load_path(options[:load_path]) app_config_manager = load_application_config(options) - file_selector = create_registered_selector(options, app_config_manager) + file_selector = SelectionOptionsParser.create_registered_selector(options, app_config_manager) command = PreserveCommand.new(app_config_manager) exit command.execute(file_selector: file_selector, force: options[:force]) end @@ -162,18 +190,19 @@ exit Longleaf::ValidateConfigCommand.new(options[:config]).execute end desc "validate_metadata", "Validate metadata files." shared_options_group(:file_selection) + shared_options_group(:registered_selection) shared_options_group(:common) # File metadata validation command def validate_metadata verify_config_provided(options) setup_logger(options) app_config_manager = load_application_config(options) - file_selector = create_registered_selector(options, app_config_manager) + file_selector = SelectionOptionsParser.create_registered_selector(options, app_config_manager) exit Longleaf::ValidateMetadataCommand.new(app_config_manager).execute(file_selector: file_selector) end desc "setup_index", "Sets up the structure of the metadata index, if one is configured using the system configuration file provided using the --system_config option. Some index types may require additional steps to be taken by an administrator before hand, such as creating users and databases." @@ -218,34 +247,18 @@ def load_application_config(options) begin app_manager = ApplicationConfigDeserializer.deserialize(options[:config]) rescue ConfigurationError => err - logger.failure("Failed to load application configuration due to the following issue:\n#{err.message}") + logger.failure("Failed to load application configuration due to the following issue(s):\n#{err.message}") exit 1 end end def verify_config_provided(options) if options[:config].nil? || options[:config].empty? raise "No value provided for required options '--config'" end - end - - def create_file_selector(options, app_config_manager, selector_class: FileSelector) - file_paths = options[:file]&.split(/\s*,\s*/) - storage_locations = options[:location]&.split(/\s*,\s*/) - - begin - selector_class.new(file_paths: file_paths, storage_locations: storage_locations, app_config: app_config_manager) - rescue ArgumentError => e - logger.failure(e.message) - exit 1 - end - end - - def create_registered_selector(options, app_config_manager) - create_file_selector(options, app_config_manager, selector_class: RegisteredFileSelector) end def extend_load_path(load_paths) load_paths = load_paths&.split(/\s*,\s*/) load_paths&.each { |path| $LOAD_PATH.unshift(path) }