--- /dev/null
+# discovers against stdin instead of the traditional network discovery
+# the input must be a flat file with a node name per line which should match identities as configured,
+# or it should be a json string as output by the -j option of mco rpc
+require 'mcollective/rpc/helpers'
+
+module MCollective
+ class Discovery
+ class Stdin
+ def self.discover(filter, timeout, limit=0, client=nil)
+ unless client.options[:discovery_options].empty?
+ type = client.options[:discovery_options].first.downcase
+ else
+ type = 'auto'
+ end
+
+ discovered = []
+
+ file = STDIN.read
+
+ if file =~ /^\s*$/
+ raise("data piped on STDIN contained only whitespace - could not discover hosts from it.")
+ end
+
+ if type == 'auto'
+ if file =~ /^\s*\[/
+ type = 'json'
+ else
+ type = 'text'
+ end
+ end
+
+ if type == 'json'
+ hosts = MCollective::RPC::Helpers.extract_hosts_from_json(file)
+ elsif type == 'text'
+ hosts = file.split("\n")
+ else
+ raise("stdin discovery plugin only knows the types auto/text/json, not \"#{type}\"")
+ end
+
+ hosts.map do |host|
+ raise 'Identities can only match /\w\.\-/' unless host.match(/^[\w\.\-]+$/)
+ host
+ end
+
+ # this plugin only supports identity filters, do regex matches etc against
+ # the list found in the flatfile
+ unless filter["identity"].empty?
+ filter["identity"].each do |identity|
+ identity = Regexp.new(identity.gsub("\/", "")) if identity.match("^/")
+
+ if identity.is_a?(Regexp)
+ discovered = hosts.grep(identity)
+ elsif hosts.include?(identity)
+ discovered << identity
+ end
+ end
+ else
+ discovered = hosts
+ end
+
+ discovered
+ end
+ end
+ end
+end
+