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) }