summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2005-08-23 17:57:08 +0000
committerLuke Kanies <luke@madstop.com>2005-08-23 17:57:08 +0000
commitdde841fa4653c11886bb80b8c402629e4f105ba0 (patch)
tree8b280a4242459751cc871ff8d5ba2093141233c4 /lib/puppet
parent49e3e3771cdf2eabb71b406167bc975386392354 (diff)
downloadpuppet-dde841fa4653c11886bb80b8c402629e4f105ba0.tar.gz
puppet-dde841fa4653c11886bb80b8c402629e4f105ba0.tar.xz
puppet-dde841fa4653c11886bb80b8c402629e4f105ba0.zip
Created a Handler base class for all of the server handlers, which allows a lot of the manual work to now be automatic
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@582 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet')
-rw-r--r--lib/puppet/client.rb5
-rw-r--r--lib/puppet/server.rb110
-rw-r--r--lib/puppet/server/ca.rb12
-rwxr-xr-xlib/puppet/server/fileserver.rb16
-rw-r--r--lib/puppet/server/master.rb10
5 files changed, 76 insertions, 77 deletions
diff --git a/lib/puppet/client.rb b/lib/puppet/client.rb
index 7998f2ff8..bc5869a76 100644
--- a/lib/puppet/client.rb
+++ b/lib/puppet/client.rb
@@ -33,9 +33,8 @@ module Puppet
class NetworkClient < XMLRPC::Client
#include Puppet::Daemon
- #@@handlers = [Puppet::FileServer, Puppet::CA, Puppet::Server::Master]
-
- Puppet::Server.eachhandler { |name, handler|
+ # add the methods associated with each namespace
+ Puppet::Server::Handler.each { |handler|
interface = handler.interface
namespace = interface.prefix
diff --git a/lib/puppet/server.rb b/lib/puppet/server.rb
index 5707e6f0d..c3ba0b394 100644
--- a/lib/puppet/server.rb
+++ b/lib/puppet/server.rb
@@ -27,57 +27,9 @@ module Puppet
if $noservernetworking
Puppet.err "Could not create server: %s" % $noservernetworking
else
- class ServerStatus
- attr_reader :ca
-
- def self.interface
- XMLRPC::Service::Interface.new("status") { |iface|
- iface.add_method("int status()")
- }
- end
-
- def initialize(hash = {})
- end
-
- def status(status = nil, request = nil)
- Puppet.warning "Returning status"
- return 1
- end
- end
-
class Server < WEBrick::HTTPServer
include Puppet::Daemon
- @@handlers = {}
-# # a bit of a hack for now, but eh, wadda ya gonna do?
-# @@handlers = {
-# :Master => Puppet::Server::Master,
-# :CA => Puppet::Server::CA,
-# :Status => Puppet::ServerStatus
-# }
-
- def self.addhandler(name, handler)
- @@handlers[name] = handler
- end
-
- Puppet::Server.addhandler(:Status, Puppet::ServerStatus)
-
- def self.eachhandler
- @@handlers.each { |name, klass|
- yield(name, klass)
- }
- end
- def self.inithandler(handler,args)
- unless @@handlers.include?(handler)
- raise ServerError, "Invalid handler %s" % handler
- end
-
- hclass = @@handlers[handler]
-
- obj = hclass.new(args)
- return obj
- end
-
def initialize(hash = {})
hash[:Port] ||= Puppet[:masterport]
hash[:Logger] ||= self.httplog
@@ -92,7 +44,11 @@ module Puppet
end
@handlers = hash[:Handlers].collect { |handler, args|
- self.class.inithandler(handler, args)
+ hclass = nil
+ unless hclass = Handler.handler(handler)
+ raise ServerError, "Invalid handler %s" % handler
+ end
+ hclass.new(args)
}
else
raise ServerError, "A server must have handlers"
@@ -134,6 +90,62 @@ module Puppet
end
end
+ class Server
+ # the base class for the different handlers
+ class Handler
+ @subclasses = []
+
+ def self.each
+ @subclasses.each { |c| yield c }
+ end
+
+ def self.handler(name)
+ @subclasses.find { |h|
+ h.name == name
+ }
+ end
+
+ def self.inherited(sub)
+ @subclasses << sub
+ end
+
+ def self.interface
+ if defined? @interface
+ return @interface
+ else
+ raise Puppet::DevError, "Handler %s has no defined interface" %
+ self
+ end
+ end
+
+ def self.name
+ unless defined? @name
+ @name = self.to_s.sub(/.+::/, '').intern
+ end
+
+ return @name
+ end
+
+ def initialize(hash = {})
+ end
+ end
+
+ class ServerStatus < Handler
+
+ @interface = XMLRPC::Service::Interface.new("status") { |iface|
+ iface.add_method("int status()")
+ }
+
+ @name = :Status
+
+ def status(status = nil, request = nil)
+ Puppet.warning "Returning status"
+ return 1
+ end
+ end
+
+ end
+
#---------------------------------------------------------------
end
diff --git a/lib/puppet/server/ca.rb b/lib/puppet/server/ca.rb
index 65074c3f6..20caee9bb 100644
--- a/lib/puppet/server/ca.rb
+++ b/lib/puppet/server/ca.rb
@@ -9,16 +9,12 @@ require 'xmlrpc/server'
module Puppet
class Server
class CAError < Puppet::Error; end
- class CA
+ class CA < Handler
attr_reader :ca
- def self.interface
- XMLRPC::Service::Interface.new("puppetca") { |iface|
- iface.add_method("array getcert(csr)")
- }
- end
-
- Puppet::Server.addhandler(:CA, self)
+ @interface = XMLRPC::Service::Interface.new("puppetca") { |iface|
+ iface.add_method("array getcert(csr)")
+ }
def autosign?(hostname)
# simple values are easy
diff --git a/lib/puppet/server/fileserver.rb b/lib/puppet/server/fileserver.rb
index 43e08655f..f13c3285f 100755
--- a/lib/puppet/server/fileserver.rb
+++ b/lib/puppet/server/fileserver.rb
@@ -4,21 +4,17 @@ require 'cgi'
module Puppet
class Server
class FileServerError < Puppet::Error; end
- class FileServer
+ class FileServer < Handler
attr_accessor :local
#CHECKPARAMS = %w{checksum type mode owner group}
CHECKPARAMS = [:mode, :type, :owner, :group, :checksum]
- def self.interface
- XMLRPC::Service::Interface.new("fileserver") { |iface|
- iface.add_method("string describe(string)")
- iface.add_method("string list(string, boolean)")
- iface.add_method("string retrieve(string)")
- }
- end
-
- Puppet::Server.addhandler(:FileServer, self)
+ @interface = XMLRPC::Service::Interface.new("fileserver") { |iface|
+ iface.add_method("string describe(string)")
+ iface.add_method("string list(string, boolean)")
+ iface.add_method("string retrieve(string)")
+ }
def check(dir)
unless FileTest.exists?(dir)
diff --git a/lib/puppet/server/master.rb b/lib/puppet/server/master.rb
index f3f0411e9..00d62eb5b 100644
--- a/lib/puppet/server/master.rb
+++ b/lib/puppet/server/master.rb
@@ -7,17 +7,13 @@ require 'xmlrpc/server'
module Puppet
class Server
class MasterError < Puppet::Error; end
- class Master
+ class Master < Handler
attr_accessor :ast, :local
attr_reader :ca
- def self.interface
- XMLRPC::Service::Interface.new("puppetmaster") { |iface|
+ @interface = XMLRPC::Service::Interface.new("puppetmaster") { |iface|
iface.add_method("string getconfig(string)")
- }
- end
-
- Puppet::Server.addhandler(:Master, self)
+ }
def initialize(hash = {})