class Hotdog::Commands::Search
Attributes
remote_command[R]
Public Instance Methods
define_options(optparse, options={})
click to toggle source
# File lib/hotdog/commands/search.rb, line 11 def define_options(optparse, options={}) optparse.on("-n", "--limit LIMIT", "Limit result set to specified size at most", Integer) do |limit| options[:limit] = limit end end
evaluate(data, environment)
click to toggle source
# File lib/hotdog/commands/search.rb, line 95 def evaluate(data, environment) node = Hotdog::Expression::ExpressionTransformer.new.apply(data) if Hotdog::Expression::ExpressionNode === node optimized = node.optimize.tap do |optimized| logger.debug { JSON.pretty_generate(optimized.dump) } end result = optimized.evaluate(environment) if result.empty? and !$did_reload $did_reload = true environment.logger.info("reloading all hosts and tags.") environment.reload(force: true) optimized.evaluate(environment) else result end else raise("parser error: unknown expression: #{node.inspect}") end end
parse(expression)
click to toggle source
# File lib/hotdog/commands/search.rb, line 81 def parse(expression) logger.debug(expression) parser = Hotdog::Expression::ExpressionParser.new parser.parse(expression).tap do |parsed| logger.debug { begin JSON.pretty_generate(JSON.load(parsed.to_json)) rescue JSON::NestingError => error error.message end } end end
parse_options(optparse, args=[])
click to toggle source
# File lib/hotdog/commands/search.rb, line 17 def parse_options(optparse, args=[]) if args.index("--") command_args = args.slice(args.index("--") + 1, args.length) if command_args.length <= 1 # Use given argument as is if the remote command is specified as a quoted string # e.g. 'for f in /tmp/foo*; do echo $f; done' @remote_command = command_args.first else @remote_command = Shellwords.shelljoin(command_args) end optparse.parse(args.slice(0, args.index("--"))) else @remote_command = nil optparse.parse(args) end end
run(args=[], options={})
click to toggle source
# File lib/hotdog/commands/search.rb, line 35 def run(args=[], options={}) if @remote_command logger.warn("ignore remote command: #{@remote_command}") end expression = rewrite_expression(args.join(" ").strip) begin node = parse(expression) rescue Parslet::ParseFailed => error STDERR.puts("syntax error: " + error.cause.ascii_tree) exit(1) end result0 = evaluate(node, self) if 0 < result0.length result, fields = get_hosts_with_search_tags(result0, node) STDOUT.print(format(result, fields: fields)) logger.info("found %d host(s)." % result.length) else logger.error("no match found: #{expression}") exit(1) end end
Private Instance Methods
rewrite_expression(expression)
click to toggle source
# File lib/hotdog/commands/search.rb, line 118 def rewrite_expression(expression) if expression.strip.empty? # return everything if given expression is empty expression = "*" end if options[:status] status_name = application.status_name(options[:status]) expression = "@status:#{status_name} AND (#{expression})" end if options[:limit] expression = "LIMIT((#{expression}), #{options[:limit]})" end expression end