+# Determine the mode from its name.
+if mode_name == 'rm' then
+ mode = :rm
+elsif mode_name == 'mv' then
+ mode = :mv
+end
+
+# Since we removed the mode name (if it existed) from ARGV, what
+# remains should be the required arguments. Figure out if we have the
+# wrong number of arguments, and store the associated error message in
+# args_error_message if necessary.
+args_error_message = nil
+
+if mode == :prune and ARGV.length() != 0 then
+ args_error_message = "ERROR: prune mode takes no additional arguments."
+elsif mode == :rm and ARGV.length() < 1 then
+ args_error_message = "ERROR: rm mode takes two or more user arguments."
+elsif mode == :mv and ARGV.length() != 2 then
+ args_error_message = "ERROR: mv mode takes exactly two user arguments."
+end
+
+# If we got the wrong number of arguments, we'll have an error message
+# here. Report it and exit with a failure code.
+if not args_error_message.nil? then
+ STDERR.puts args_error_message
+ puts "Usage: #{UserInterface.usage(program_name)}"
+ Kernel.exit(ExitCodes::BAD_COMMAND_LINE)
+end
+
+
+# Load each of the plugins that we'll need.
+cfg = Configuration.new()
+
+cfg.plugins.each do |plugin_file|
+ require "#{mode_name}/plugins/#{plugin_file}"
+end
+
+# And the runners.
+require "#{mode_name}/#{mode_name}_runner"
+require "#{mode_name}/#{mode_name}_dummy_runner"
+
+# Now we figure out which plugin module to use based on our mode.
+plugin_module = nil
+
+if mode == :rm then
+ plugin_module = RmPlugin
+elsif mode == :mv then
+ plugin_module = MvPlugin
+else
+ # Safe, catch-all default
+ plugin_module = PrunePlugin
+end
+
+# Parse the remaining arguments as User/Domain objects. If we get some
+# other argument that isn't one of those, it's an error.
+parsed_args = []
+
+ARGV.each do |arg|
+ begin
+ u = User.new(arg)
+ parsed_args << u
+ rescue InvalidUserError
+ begin
+ d = Domain.new(arg)
+ parsed_args << d
+ rescue InvalidDomainError
+ STDERR.puts "ERROR: invalid user/domain argument #{arg}"
+ Kernel.exit(ExitCodes::BAD_COMMAND_LINE)
+ end
+ end