diff options
author | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2006-11-13 04:20:57 +0000 |
---|---|---|
committer | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2006-11-13 04:20:57 +0000 |
commit | 4e96031745a215b84f1ae45916050f35741f9201 (patch) | |
tree | 929ae6e35efe6ffcd417dad1a43bb1d22061b841 /lib/puppet/provider/nameservice/netinfo.rb | |
parent | 064ddbc218c56de91318c9dfedc481e67ed60750 (diff) | |
download | puppet-4e96031745a215b84f1ae45916050f35741f9201.tar.gz puppet-4e96031745a215b84f1ae45916050f35741f9201.tar.xz puppet-4e96031745a215b84f1ae45916050f35741f9201.zip |
Adding a NetInfo provider for hosts. Yay!
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@1865 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/provider/nameservice/netinfo.rb')
-rw-r--r-- | lib/puppet/provider/nameservice/netinfo.rb | 142 |
1 files changed, 75 insertions, 67 deletions
diff --git a/lib/puppet/provider/nameservice/netinfo.rb b/lib/puppet/provider/nameservice/netinfo.rb index 00d1e4478..879bb7757 100644 --- a/lib/puppet/provider/nameservice/netinfo.rb +++ b/lib/puppet/provider/nameservice/netinfo.rb @@ -6,6 +6,9 @@ require 'puppet/provider/nameservice' class Puppet::Provider::NameService class NetInfo < Puppet::Provider::NameService + class << self + attr_writer :netinfodir + end # Attempt to flush the database, but this doesn't seem to work at all. def self.flush begin @@ -34,6 +37,68 @@ class NetInfo < Puppet::Provider::NameService noautogen end end + + # Convert a NetInfo line into a hash of data. + def self.line2hash(line, params) + values = line.split(/\t/) + + hash = {} + params.zip(values).each do |param, value| + next if value == '#NoValue#' + hash[param] = if value =~ /^[-0-9]+$/ + Integer(value) + else + value + end + end + hash + end + + def self.list + report(@model.validstates).collect do |hash| + @model.hash2obj(hash) + end + end + + # What field the value is stored under. + def self.netinfokey(name) + name = symbolize(name) + self.option(name, :key) || name + end + + # Retrieve the data, yo. + # FIXME This should retrieve as much information as possible, + # rather than retrieving it one at a time. + def self.report(*params) + dir = self.netinfodir() + cmd = [command(:nireport), "/", "/%s" % dir] + + # We require the name in order to know if we match. There's no + # way to just report on our individual object, we have to get the + # whole list. + params.unshift :name unless params.include? :name + + params.each do |param| + if key = netinfokey(param) + cmd << key.to_s + else + raise Puppet::DevError, + "Could not find netinfokey for state %s" % + self.class.name + end + end + + begin + output = execute(cmd.join(" ")) + rescue Puppet::ExecutionFailure => detail + Puppet.err "Failed to call nireport: %s" % detail + return nil + end + + return output.split("\n").collect { |line| + line2hash(line, params) + } + end # How to add an object. def addcmd @@ -52,6 +117,10 @@ class NetInfo < Puppet::Provider::NameService def deletecmd creatorcmd("-destroy") end + + def destroy + delete() + end def ensure=(arg) super @@ -91,7 +160,7 @@ class NetInfo < Puppet::Provider::NameService if refresh or (! defined? @infohash or ! @infohash) states = [:name] + self.class.model.validstates states.delete(:ensure) if states.include? :ensure - @infohash = report(*states) + @infohash = single_report(*states) end return @infohash @@ -115,73 +184,12 @@ class NetInfo < Puppet::Provider::NameService # Determine the flag to pass to our command. def netinfokey(name) - name = symbolize(name) - self.class.option(name, :key) || name + self.class.netinfokey(name) end - - # Retrieve the data, yo. - # FIXME This should retrieve as much information as possible, - # rather than retrieving it one at a time. - def report(*params) - dir = self.class.netinfodir() - cmd = [command(:nireport), "/", "/%s" % dir] - - # We require the name in order to know if we match. There's no - # way to just report on our individual object, we have to get the - # whole list. - params.unshift :name unless params.include? :name - - params.each do |param| - if key = netinfokey(param) - cmd << key.to_s - else - raise Puppet::DevError, - "Could not find netinfokey for state %s" % - self.class.name - end - end - - begin - output = execute(cmd.join(" ")) - rescue Puppet::ExecutionFailure => detail - Puppet.err "Failed to call nireport: %s" % detail - return nil - end - - output.split("\n").each { |line| - values = line.split(/\t/) - - hash = {} - params.zip(values).each do |param, value| - next if value == '#NoValue#' - hash[param] = if value =~ /^[-0-9]+$/ - Integer(value) - else - value - end - end - - if hash[:name] == @model[:name] - return hash - else - next - end - -# -# if line =~ /^(\w+)\s+(.+)$/ -# name = $1 -# value = $2.sub(/\s+$/, '') -# -# if name == @model[:name] -# if value =~ /^[-0-9]+$/ -# return Integer(value) -# else -# return value -# end -# end - } - - return nil + + # Get a report for a single resource, not the whole table + def single_report(*states) + self.class.report(*states).find do |hash| hash[:name] == @model[:name] end end def setuserlist(group, list) |