#!/usr/bin/env ruby 
#
# = Synopsis
#
# Collect and display facts about the system.
#
# = Usage
#
#   facter [-d|--debug] [-h|--help] [-v|--version] [fact] [fact] [...]
#
# = Description
#
# Collect and display facts about the current system.  The library behind
# Facter is easy to expand, making Facter an easy way to collect information
# about a system from within the shell or within Ruby.
#
# If no facts are specifically asked for, then all facts will be returned.
# 
# = Options
#
# debug::
#   Enable debugging.
#
# help::
#   Print this help message
#
# version::
#   Print the version and exit.
#
# = Example
#
#   facter kernel
#
# = Author
#
# Luke Kanies
#
# = Copyright
#
# Copyright (c) 2006 Reductive Labs, LLC
# Licensed under the GNU Public License

require 'getoptlong'
require 'facter'

$haveusage = true

begin
    require 'rdoc/usage'
rescue Exception
    $haveusage = false
end

$debug = 0

config = nil

result = GetoptLong.new(
    [ "--version",         "-v",     GetoptLong::NO_ARGUMENT ],
    [ "--help",		"-h",            GetoptLong::NO_ARGUMENT ],
    [ "--debug",	"-d",            GetoptLong::NO_ARGUMENT ],
    [ "--yaml",	"-y",                GetoptLong::NO_ARGUMENT ],
    [ "--config",    "-c",           GetoptLong::REQUIRED_ARGUMENT ]
)

options = {
    :yaml => false
}

result.each { |opt,arg|
    case opt
        when "--version"
            puts "%s" % Facter.version
            exit
        when "--yaml"
			options[:yaml] = true
        when "--debug"
			Facter.debugging(1)
        when "--help"
            if $haveusage
                RDoc::usage && exit
            else
                puts "No help available unless you have RDoc::usage installed"
                exit
            end
        else
            $stderr.puts "Invalid option '#{opt}'"
            exit(12)
    end
}

names = []

unless config.nil?
	File.open(config) { |file|
		names = file.readlines.collect { |line|
			line.chomp
		}
	}
end

ARGV.each { |item|
	names.push item
}

facts = {}

if names.empty?
    Facter.each { |name,fact|
        facts[name] = fact
    }
else
    names.each { |name|
        begin
            facts[name] = Facter.value(name)
        rescue => error
            STDERR.puts "Could not retrieve %s: #{error}" % name
            exit 10
        end
    }
end

if options[:yaml]
    require 'yaml'
    puts YAML.dump(facts)
    exit(0)
end

facts.sort { |a, b| a[0].to_s <=> b[0].to_s }.each { |name,value|
    if facts.length == 1
        unless value.nil?
            puts value
        end
    else
        puts "%s => %s" % [name,value]
    end
}

# $Id: facter,v 1.1.1.1 2004/03/21 21:06:27 luke Exp $
