2005-07-13 22:57:29 +00:00
|
|
|
require 'shellwords'
|
|
|
|
|
2005-07-10 07:15:20 +00:00
|
|
|
module Rex
|
|
|
|
module Parser
|
|
|
|
|
|
|
|
###
|
|
|
|
#
|
|
|
|
# Arguments
|
|
|
|
# ---------
|
|
|
|
#
|
|
|
|
# This class parses arguments in a getopt style format, kind of.
|
|
|
|
# Unfortunately, the default ruby getopt implementation will only
|
|
|
|
# work on ARGV, so we can't use it.
|
|
|
|
#
|
|
|
|
###
|
|
|
|
class Arguments
|
|
|
|
|
|
|
|
#
|
|
|
|
# Specifies that an option is expected to have an argument
|
|
|
|
#
|
|
|
|
HasArgument = (1 << 0)
|
|
|
|
|
|
|
|
#
|
|
|
|
# Initializes the format list with an array of formats like:
|
|
|
|
#
|
|
|
|
# Arguments.new(
|
|
|
|
# '-b' => [ false, "some text" ]
|
|
|
|
# )
|
|
|
|
#
|
|
|
|
def initialize(fmt)
|
|
|
|
self.fmt = fmt
|
|
|
|
end
|
|
|
|
|
2005-07-10 07:27:50 +00:00
|
|
|
#
|
|
|
|
# Takes a string and converts it into an array of arguments
|
|
|
|
#
|
|
|
|
def self.from_s(str)
|
2005-07-13 22:57:29 +00:00
|
|
|
Shellwords.shellwords(str)
|
2005-07-10 07:27:50 +00:00
|
|
|
end
|
|
|
|
|
2005-07-10 07:15:20 +00:00
|
|
|
#
|
|
|
|
# Parses the supplied arguments into a set of options
|
|
|
|
#
|
|
|
|
def parse(args, &block)
|
2005-07-18 14:39:00 +00:00
|
|
|
skip_next = false
|
|
|
|
|
2005-07-10 07:15:20 +00:00
|
|
|
args.each_with_index { |arg, idx|
|
2005-07-18 14:39:00 +00:00
|
|
|
if (skip_next == true)
|
|
|
|
skip_next = false
|
|
|
|
next
|
|
|
|
end
|
|
|
|
|
2005-07-10 07:15:20 +00:00
|
|
|
if (arg.match(/^-/))
|
|
|
|
cfs = arg[0..2]
|
|
|
|
|
|
|
|
fmt.each_pair { |fmtspec, val|
|
|
|
|
next if (fmtspec != cfs)
|
|
|
|
|
|
|
|
param = nil
|
|
|
|
|
|
|
|
if (val[0])
|
|
|
|
param = args[idx+1]
|
|
|
|
end
|
|
|
|
|
2005-07-18 14:39:00 +00:00
|
|
|
skip_next = true
|
|
|
|
|
2005-07-10 07:15:20 +00:00
|
|
|
yield fmtspec, idx, param
|
|
|
|
}
|
|
|
|
else
|
|
|
|
yield nil, idx, arg
|
|
|
|
end
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
#
|
|
|
|
# Returns usage information for this parsing context
|
|
|
|
#
|
|
|
|
def usage
|
|
|
|
txt = "\nOPTIONS:\n\n"
|
|
|
|
|
2005-07-11 05:25:50 +00:00
|
|
|
fmt.sort.each { |entry|
|
|
|
|
fmtspec, val = entry
|
|
|
|
|
2005-07-10 07:15:20 +00:00
|
|
|
txt += " #{fmtspec}" + ((val[0] == true) ? " <opt> " : " ")
|
|
|
|
txt += val[1] + "\n"
|
|
|
|
}
|
|
|
|
|
|
|
|
txt += "\n"
|
|
|
|
|
|
|
|
return txt
|
|
|
|
end
|
|
|
|
|
|
|
|
attr_accessor :fmt
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|