summaryrefslogtreecommitdiffstats
path: root/lib/puppet/network/server/resource.rb
diff options
context:
space:
mode:
authorluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-02-08 01:39:39 +0000
committerluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-02-08 01:39:39 +0000
commit7e07e3dc843798bdbc7a03428ca054adaff2fb72 (patch)
tree34d0f9f8c2ee11bdc281e6e4d18cad444253fe36 /lib/puppet/network/server/resource.rb
parent6d8068eddd0d29ec53f62557eb53f6ebb8e40591 (diff)
downloadpuppet-7e07e3dc843798bdbc7a03428ca054adaff2fb72.tar.gz
puppet-7e07e3dc843798bdbc7a03428ca054adaff2fb72.tar.xz
puppet-7e07e3dc843798bdbc7a03428ca054adaff2fb72.zip
Moving all of the client and server code into a single network/ directory. In other words, more code structure cleanup.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2179 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/network/server/resource.rb')
-rwxr-xr-xlib/puppet/network/server/resource.rb190
1 files changed, 190 insertions, 0 deletions
diff --git a/lib/puppet/network/server/resource.rb b/lib/puppet/network/server/resource.rb
new file mode 100755
index 000000000..37e331a13
--- /dev/null
+++ b/lib/puppet/network/server/resource.rb
@@ -0,0 +1,190 @@
+require 'puppet'
+require 'puppet/network/server'
+
+# Serve Puppet elements. Useful for querying, copying, and, um, other stuff.
+class Puppet::Network::Server
+ class Resource < Handler
+ attr_accessor :local
+
+ @interface = XMLRPC::Service::Interface.new("resource") { |iface|
+ iface.add_method("string apply(string, string)")
+ iface.add_method("string describe(string, string, array, array)")
+ iface.add_method("string list(string, array, string)")
+ }
+
+ # Apply a TransBucket as a transaction.
+ def apply(bucket, format = "yaml", client = nil, clientip = nil)
+ unless @local
+ begin
+ case format
+ when "yaml":
+ bucket = YAML::load(Base64.decode64(bucket))
+ else
+ raise Puppet::Error, "Unsupported format '%s'" % format
+ end
+ rescue => detail
+ raise Puppet::Error, "Could not load YAML TransBucket: %s" % detail
+ end
+ end
+
+ component = bucket.to_type
+
+ # Create a client, but specify the remote machine as the server
+ # because the class requires it, even though it's unused
+ client = Puppet::Network::Client::MasterClient.new(:Server => client||"localhost")
+
+ # Set the objects
+ client.objects = component
+
+ # And then apply the configuration. This way we're reusing all
+ # the code in there. It should probably just be separated out, though.
+ transaction = client.apply
+
+ # And then clean up
+ component.remove
+
+ # It'd be nice to return some kind of report, but... at this point
+ # we have no such facility.
+ return "success"
+ end
+
+ # Describe a given object. This returns the 'is' values for every property
+ # available on the object type.
+ def describe(type, name, retrieve = nil, ignore = [], format = "yaml", client = nil, clientip = nil)
+ Puppet.info "Describing %s[%s]" % [type.to_s.capitalize, name]
+ @local = true unless client
+ typeklass = nil
+ unless typeklass = Puppet.type(type)
+ raise Puppet::Error, "Puppet type %s is unsupported" % type
+ end
+
+ obj = nil
+
+ retrieve ||= :all
+ ignore ||= []
+
+ if obj = typeklass[name]
+ obj[:check] = retrieve
+ else
+ begin
+ obj = typeklass.create(:name => name, :check => retrieve)
+ rescue Puppet::Error => detail
+ raise Puppet::Error, "%s[%s] could not be created: %s" %
+ [type, name, detail]
+ end
+ end
+
+ unless obj
+ raise XMLRPC::FaultException.new(
+ 1, "Could not create %s[%s]" % [type, name]
+ )
+ end
+
+ trans = obj.to_trans
+
+ # Now get rid of any attributes they specifically don't want
+ ignore.each do |st|
+ if trans.include? st
+ trans.delete(st)
+ end
+ end
+
+ # And get rid of any attributes that are nil
+ trans.each do |attr, value|
+ if value.nil?
+ trans.delete(attr)
+ end
+ end
+
+ unless @local
+ case format
+ when "yaml":
+ trans = Base64.encode64(YAML::dump(trans))
+ else
+ raise XMLRPC::FaultException.new(
+ 1, "Unavailable config format %s" % format
+ )
+ end
+ end
+
+ return trans
+ end
+
+ # Create a new fileserving module.
+ def initialize(hash = {})
+ if hash[:Local]
+ @local = hash[:Local]
+ else
+ @local = false
+ end
+ end
+
+ # List all of the elements of a given type.
+ def list(type, ignore = [], base = nil, format = "yaml", client = nil, clientip = nil)
+ @local = true unless client
+ typeklass = nil
+ unless typeklass = Puppet.type(type)
+ raise Puppet::Error, "Puppet type %s is unsupported" % type
+ end
+
+ # They can pass in false
+ ignore ||= []
+ ignore = [ignore] unless ignore.is_a? Array
+ bucket = Puppet::TransBucket.new
+ bucket.type = typeklass.name
+
+ typeklass.list.each do |obj|
+ next if ignore.include? obj.name
+
+ object = Puppet::TransObject.new(obj.name, typeklass.name)
+ bucket << object
+ end
+
+ unless @local
+ case format
+ when "yaml":
+ begin
+ bucket = Base64.encode64(YAML::dump(bucket))
+ rescue => detail
+ Puppet.err detail
+ raise XMLRPC::FaultException.new(
+ 1, detail.to_s
+ )
+ end
+ else
+ raise XMLRPC::FaultException.new(
+ 1, "Unavailable config format %s" % format
+ )
+ end
+ end
+
+ return bucket
+ end
+
+ private
+
+ def authcheck(file, mount, client, clientip)
+ unless mount.allowed?(client, clientip)
+ mount.warning "%s cannot access %s" %
+ [client, file]
+ raise Puppet::AuthorizationError, "Cannot access %s" % mount
+ end
+ end
+
+ # Deal with ignore parameters.
+ def handleignore(children, path, ignore)
+ ignore.each { |ignore|
+ Dir.glob(File.join(path,ignore), File::FNM_DOTMATCH) { |match|
+ children.delete(File.basename(match))
+ }
+ }
+ return children
+ end
+
+ def to_s
+ "resource"
+ end
+ end
+end
+
+# $Id$