summaryrefslogtreecommitdiffstats
path: root/lib/puppet/file_serving/configuration/parser.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet/file_serving/configuration/parser.rb')
-rw-r--r--lib/puppet/file_serving/configuration/parser.rb124
1 files changed, 124 insertions, 0 deletions
diff --git a/lib/puppet/file_serving/configuration/parser.rb b/lib/puppet/file_serving/configuration/parser.rb
new file mode 100644
index 000000000..707c3f9b1
--- /dev/null
+++ b/lib/puppet/file_serving/configuration/parser.rb
@@ -0,0 +1,124 @@
+require 'puppet/file_serving/configuration'
+require 'puppet/util/loadedfile'
+
+class Puppet::FileServing::Configuration::Parser < Puppet::Util::LoadedFile
+ Mount = Puppet::FileServing::Mount
+ MODULES = 'modules'
+
+ # Parse our configuration file.
+ def parse
+ raise("File server configuration %s does not exist" % self.file) unless FileTest.exists?(self.file)
+ raise("Cannot read file server configuration %s" % self.file) unless FileTest.readable?(self.file)
+
+ @mounts = {}
+ @count = 0
+
+ File.open(self.file) { |f|
+ mount = nil
+ f.each { |line|
+ # Have the count increment at the top, in case we throw exceptions.
+ @count += 1
+
+ case line
+ when /^\s*#/: next # skip comments
+ when /^\s*$/: next # skip blank lines
+ when /\[([-\w]+)\]/:
+ mount = newmount($1)
+ when /^\s*(\w+)\s+(.+)$/:
+ var = $1
+ value = $2
+ raise(ArgumentError, "Fileserver configuration file does not use '=' as a separator") if value =~ /^=/
+ case var
+ when "path":
+ path(mount, value)
+ when "allow":
+ allow(mount, value)
+ when "deny":
+ deny(mount, value)
+ else
+ raise ArgumentError.new("Invalid argument '%s'" % var,
+ @count, file)
+ end
+ else
+ raise ArgumentError.new("Invalid line '%s'" % line.chomp,
+ @count, file)
+ end
+ }
+ }
+
+ return @mounts
+ end
+
+ private
+
+ # Add the mount for getting files from modules.
+ def add_module_mount
+ unless @mounts[MODULES]
+ mount = Mount.new(MODULES)
+ mount.allow("*")
+ @mounts[MODULES] = mount
+ end
+ end
+
+ # Allow a given pattern access to a mount.
+ def allow(mount, value)
+ value.split(/\s*,\s*/).each { |val|
+ begin
+ mount.info "allowing %s access" % val
+ mount.allow(val)
+ rescue AuthStoreError => detail
+ raise ArgumentError.new(detail.to_s,
+ @count, file)
+ end
+ }
+ end
+
+ # Deny a given pattern access to a mount.
+ def deny(mount, value)
+ value.split(/\s*,\s*/).each { |val|
+ begin
+ mount.info "denying %s access" % val
+ mount.deny(val)
+ rescue AuthStoreError => detail
+ raise ArgumentError.new(detail.to_s,
+ @count, file)
+ end
+ }
+ end
+
+ # Create a new mount.
+ def newmount(name)
+ if @mounts.include?(name)
+ raise ArgumentError, "%s is already mounted at %s" %
+ [@mounts[name], name], @count, file
+ end
+ mount = Mount.new(name)
+ @mounts[name] = mount
+ return mount
+ end
+
+ # Set the path for a mount.
+ def path(mount, value)
+ if mount.name == MODULES
+ Puppet.warning "The '#{MODULES}' module can not have a path. Ignoring attempt to set it"
+ else
+ begin
+ mount.path = value
+ rescue ArgumentError => detail
+ Puppet.err "Removing mount %s: %s" %
+ [mount.name, detail]
+ @mounts.delete(mount.name)
+ end
+ end
+ end
+
+ # Make sure all of our mounts are valid. We have to do this after the fact
+ # because details are added over time as the file is parsed.
+ def validate
+ @mounts.each { |name, mount|
+ unless mount.valid?
+ raise ArgumentError, "No path specified for mount %s" % name
+ end
+ }
+ end
+end