116 lines
3.2 KiB
Crystal
116 lines
3.2 KiB
Crystal
|
require "option_parser"
|
||
|
|
||
|
|
||
|
class OptionParser
|
||
|
def to_s(io : IO)
|
||
|
if banner = @banner
|
||
|
io << banner
|
||
|
io << "\n\n"
|
||
|
end
|
||
|
@flags.join io, "\n"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
def parsing_cli(authd_config : Baguette::Configuration::Auth)
|
||
|
|
||
|
opt_authd_admin = -> (parser : OptionParser, authd_config : Baguette::Configuration::Auth) {
|
||
|
parser.on "-k file", "--key-file file", "Read the authd shared key from a file." do |file|
|
||
|
authd_config.shared_key = File.read(file).chomp
|
||
|
Baguette::Log.info "Key for admin operations: #{authd_config.shared_key}."
|
||
|
end
|
||
|
}
|
||
|
|
||
|
# frequently used functions
|
||
|
opt_authd_login = -> (parser : OptionParser, authd_config : Baguette::Configuration::Auth) {
|
||
|
parser.on "-l LOGIN", "--login LOGIN", "Authd user login." do |login|
|
||
|
authd_config.login = login
|
||
|
Baguette::Log.info "User login for authd: #{authd_config.login}."
|
||
|
end
|
||
|
parser.on "-p PASSWORD", "--password PASSWORD", "Authd user password." do |password|
|
||
|
authd_config.pass = password
|
||
|
Baguette::Log.info "User password for authd: #{authd_config.pass}."
|
||
|
end
|
||
|
}
|
||
|
|
||
|
opt_help = -> (parser : OptionParser) {
|
||
|
parser.on "-h", "--help", "Prints command usage." do
|
||
|
puts "usage: #{PROGRAM_NAME} command -h"
|
||
|
puts
|
||
|
puts parser
|
||
|
|
||
|
case Context.command
|
||
|
when /admin-maintainance/
|
||
|
Baguette::Log.warning "should provide subjects to request"
|
||
|
Baguette::Log.warning "as in:"
|
||
|
DNSManager::Request::Maintainance::Subject.names.each do |n|
|
||
|
Baguette::Log.warning "- #{n}"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
exit 0
|
||
|
end
|
||
|
}
|
||
|
|
||
|
# Unrecognized parameters are used to create commands with multiple arguments.
|
||
|
# Example: user add _login email phone_
|
||
|
# Here, login, email and phone are unrecognized arguments.
|
||
|
# Still, the "user add" command expect them.
|
||
|
unrecognized_args_to_context_args = -> (parser : OptionParser,
|
||
|
nexact : Int32?,
|
||
|
at_least : Int32?) {
|
||
|
|
||
|
# With the right args, these will be interpreted as serialized data.
|
||
|
parser.unknown_args do |args|
|
||
|
|
||
|
# either we test with the exact expected number of arguments or the least.
|
||
|
if exact = nexact
|
||
|
if args.size != exact
|
||
|
Baguette::Log.error "#{parser}"
|
||
|
exit 1
|
||
|
end
|
||
|
elsif least = at_least
|
||
|
if args.size < least
|
||
|
Baguette::Log.error "#{parser}"
|
||
|
exit 1
|
||
|
end
|
||
|
else
|
||
|
Baguette::Log.error "Number of parameters not even provided!"
|
||
|
Baguette::Log.error "#{parser}"
|
||
|
exit 1
|
||
|
end
|
||
|
|
||
|
args.each do |arg|
|
||
|
Baguette::Log.debug "Unrecognized argument: #{arg} (adding to Context.args)"
|
||
|
if Context.args.nil?
|
||
|
Context.args = Array(String).new
|
||
|
end
|
||
|
Context.args.not_nil! << arg
|
||
|
end
|
||
|
end
|
||
|
}
|
||
|
|
||
|
parser = OptionParser.new do |parser|
|
||
|
parser.banner = "Welcome on the DNSManager CLI administration."
|
||
|
|
||
|
# Admin section.
|
||
|
parser.on "admin", "Admin operations." do
|
||
|
# All admin operations require the shared key.
|
||
|
opt_authd_admin.call parser, authd_config
|
||
|
|
||
|
# Maintenance.
|
||
|
parser.on("maintainance", "Maintainance operation of the website.") do
|
||
|
Baguette::Log.info "Maintainance operation of the website."
|
||
|
Context.command = "admin-maintainance"
|
||
|
parser.banner = "COMMAND: admin maintainance subject [value]"
|
||
|
unrecognized_args_to_context_args.call parser, nil, 1
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
opt_help.call parser
|
||
|
end
|
||
|
|
||
|
parser.parse
|
||
|
end
|