diff options
Diffstat (limited to 'lib/puppet/network/client.rb')
-rw-r--r-- | lib/puppet/network/client.rb | 132 |
1 files changed, 58 insertions, 74 deletions
diff --git a/lib/puppet/network/client.rb b/lib/puppet/network/client.rb index 604912025..c08acabb1 100644 --- a/lib/puppet/network/client.rb +++ b/lib/puppet/network/client.rb @@ -1,60 +1,73 @@ # the available clients require 'puppet' -require 'puppet/network/networkclient' +require 'puppet/daemon' +require 'puppet/network/xmlrpc/client' +require 'puppet/util/subclass_loader' +require 'puppet/util/methodhelper' +require 'puppet/sslcertificates/support' + +require 'net/http' + +# Some versions of ruby don't have this method defined, which basically causes +# us to never use ssl. Yay. +class Net::HTTP + def use_ssl? + if defined? @use_ssl + @use_ssl + else + false + end + end +end -# FIXME this still isn't a good design, because none of the handlers overlap -# so i could just as easily include them all in the main module -# but at least it's better organized for now +# The base class for all of the clients. Many clients just directly +# call methods, but some of them need to do some extra work or +# provide a different interface. class Puppet::Network::Client + Client = self include Puppet::Daemon include Puppet::Util + extend Puppet::Util::SubclassLoader + include Puppet::Util::MethodHelper + + # This handles reading in the key and such-like. + include Puppet::SSLCertificates::Support - # FIXME The cert stuff should only come up with networking, so it - # should be in the network client, not the normal client. But if i do - # that, it's hard to tell whether the certs have been initialized. - include Puppet::Daemon - attr_reader :secureinit attr_accessor :schedule, :lastrun, :local, :stopping - class << self - attr_reader :drivername, :handler - attr_accessor :netclient - end + # Set up subclass loading + handle_subclasses :client, "puppet/network/client" - def initcerts - unless self.readcert - #if self.is_a? Puppet::Network::Client::CA - unless self.requestcert - return nil - end - #else - # return nil - #end - #unless self.requestcert - #end + # Determine what clients look for when being passed an object for local + # client/server stuff. E.g., you could call Client::CA.new(:CA => ca). + def self.drivername + unless defined? @drivername + @drivername = self.name end + @drivername + end - # unless we have a driver, we're a local client and we can't add - # certs anyway, so it doesn't matter - unless @driver - return true + # Figure out the handler for our client. + def self.handler + unless defined? @handler + @handler = Puppet::Network::Handler.handler(self.name) end + @handler + end - self.setcerts + # The class that handles xmlrpc interaction for us. + def self.xmlrpc_client + unless defined? @xmlrpc_client + @xmlrpc_client = Puppet::Network::XMLRPCClient.handler_class(self.handler) + end + @xmlrpc_client end + # Create our client. def initialize(hash) # to whom do we connect? @server = nil - @nil = nil - @secureinit = hash[:NoSecureInit] || true - - if hash.include?(:FQDN) - @fqdn = hash[:FQDN] - else - self.fqdn - end if hash.include?(:Cache) @cache = hash[:Cache] @@ -64,37 +77,24 @@ class Puppet::Network::Client driverparam = self.class.drivername if hash.include?(:Server) - if $noclientnetworking - raise NetworkClientError.new("Networking not available: %s" % - $nonetworking) - end - args = {:Server => hash[:Server]} args[:Port] = hash[:Port] || Puppet[:masterport] - if self.readcert - args[:Certificate] = @cert - args[:Key] = @key - args[:CAFile] = @cacertfile - end + @driver = self.class.xmlrpc_client.new(args) - netclient = nil - unless netclient = self.class.netclient - unless handler = self.class.handler - raise Puppet::DevError, - "Class %s has no handler defined" % self.class - end - namespace = self.class.handler.interface.prefix - netclient = Puppet::Network::NetworkClient.netclient(namespace) - self.class.netclient = netclient + if self.read_cert + @driver.cert_setup(self) end - @driver = netclient.new(args) + @local = false elsif hash.include?(driverparam) @driver = hash[driverparam] + if @driver == true + @driver = self.class.handler.new + end @local = true else - raise ClientError, "%s must be passed a Server or %s" % + raise Puppet::Network::ClientError, "%s must be passed a Server or %s" % [self.class, driverparam] end end @@ -138,12 +138,6 @@ class Puppet::Network::Client end end - def setcerts - @driver.cert = @cert - @driver.key = @key - @driver.ca_file = @cacertfile - end - def shutdown if self.stopping Puppet.notice "Already in shutdown" @@ -159,7 +153,6 @@ class Puppet::Network::Client # Start listening for events. We're pretty much just listening for # timer events here. def start - setpidfile() # Create our timer. Puppet will handle observing it and such. timer = Puppet.newtimer( :interval => Puppet[:runinterval], @@ -176,15 +169,6 @@ class Puppet::Network::Client end require 'puppet/network/client/proxy' - require 'puppet/network/client/ca' - require 'puppet/network/client/dipper' - require 'puppet/network/client/file' - require 'puppet/network/client/log' - require 'puppet/network/client/master' - require 'puppet/network/client/runner' - require 'puppet/network/client/status' - require 'puppet/network/client/reporter' - require 'puppet/network/client/resource' end # $Id$ |