summaryrefslogtreecommitdiff
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
parent49e3e3771cdf2eabb71b406167bc975386392354 (diff)
downloadpuppet-dde841fa4653c11886bb80b8c402629e4f105ba0.tar.gz
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
-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
-rwxr-xr-xtest/server/tc_fileserver.rb50
6 files changed, 126 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 = {})
diff --git a/test/server/tc_fileserver.rb b/test/server/tc_fileserver.rb
index 93b31db58..692981fe3 100755
--- a/test/server/tc_fileserver.rb
+++ b/test/server/tc_fileserver.rb
@@ -19,9 +19,17 @@ class TestFileServer < TestPuppet
Puppet[:loglevel] = :debug
end
+ @@tmppids = []
super
end
+ def teardown
+ super
+ @@tmppids.each { |pid|
+ system("kill -INT %s" % pid)
+ }
+ end
+
def mkrandomdirs(dir, depth, width)
assert_nothing_raised {
Dir.mkdir(dir)
@@ -378,6 +386,48 @@ class TestFileServer < TestPuppet
}
}
end
+
+ def test_networksources
+ server = nil
+ Puppet[:ssldir] = "/tmp/serverconnecttesting"
+ Puppet[:autosign] = true
+ @@tmpfiles << "/tmp/serverconnecttesting"
+ serverpid = nil
+ port = 8080
+ assert_nothing_raised() {
+ server = Puppet::Server.new(
+ :Port => port,
+ :Handlers => {
+ :CA => {}, # so that certs autogenerate
+ :Status => nil
+ }
+ )
+
+ }
+ serverpid = fork {
+ assert_nothing_raised() {
+ #trap(:INT) { server.shutdown; Kernel.exit! }
+ trap(:INT) { server.shutdown }
+ server.start
+ }
+ }
+ @@tmppids << serverpid
+
+ sleep(3)
+ client = nil
+ assert_nothing_raised() {
+ client = XMLRPC::Client.new("localhost", "/RPC2", port, nil, nil,
+ nil, nil, true, 3)
+ }
+ retval = nil
+
+ assert_nothing_raised() {
+ Puppet.notice "calling status"
+ retval = client.call("status.status")
+ }
+
+ assert_equal(1, retval)
+ end
end
# $Id$