diff options
Diffstat (limited to 'lib/puppet')
-rw-r--r-- | lib/puppet/provider/newfile/default.rb | 89 | ||||
-rw-r--r-- | lib/puppet/type/newfile.rb | 38 | ||||
-rw-r--r-- | lib/puppet/util/state_machine.rb | 52 |
3 files changed, 179 insertions, 0 deletions
diff --git a/lib/puppet/provider/newfile/default.rb b/lib/puppet/provider/newfile/default.rb new file mode 100644 index 000000000..4da98718f --- /dev/null +++ b/lib/puppet/provider/newfile/default.rb @@ -0,0 +1,89 @@ +Puppet::Type.type(:newfile).provide(:default) do + # Remove the file. + def destroy + end + + # Does the file currently exist? + def exist? + ! stat.nil? + end + + def content + return :absent unless exist? + begin + File.read(name) + rescue => detail + fail "Could not read %s: %s" % [name, detail] + end + end + + def content=(value) + File.open(name, "w") { |f| f.print value } + end + + def flush + @stat = nil + end + + def group + return :absent unless exist? + stat.gid + end + + def group=(value) + File.chown(nil, value, name) + end + + def mkdir + begin + Dir.mkdir(name) + rescue Errno::ENOENT + fail "Cannot create %s; parent directory does not exist" % name + rescue => detail + fail "Could not create directory %s: %s" % [name, detail] + end + end + + def mkfile + end + + def mklink + end + + def mode + return :absent unless exist? + stat.mode & 007777 + end + + def mode=(value) + File.chmod(value, name) + end + + def owner + return :absent unless exist? + stat.uid + end + + def owner=(value) + File.chown(value, nil, name) + end + + def type + return :absent unless exist? + stat.ftype + end + + private + + def stat + unless defined?(@stat) and @stat + begin + @stat = File.stat(name) + # Map the property names to the stat values, yo. + rescue Errno::ENOENT + @stat = nil + end + end + @stat + end +end diff --git a/lib/puppet/type/newfile.rb b/lib/puppet/type/newfile.rb new file mode 100644 index 000000000..e8763748d --- /dev/null +++ b/lib/puppet/type/newfile.rb @@ -0,0 +1,38 @@ +Puppet::Type.newtype(:newfile) do + newparam(:path, :namevar => true) do + desc "The file path." + end + + newproperty(:ensure) do + desc "What type the file should be." + + newvalue(:absent) { provider.destroy } + newvalue(:file) { provider.mkfile } + newvalue(:directory) {provider.mkdir } + newvalue(:link) {provider.mklink} + + def retrieve + provider.type + end + end + + newproperty(:content) do + desc "The file content." + end + + newproperty(:owner) do + desc "The file owner." + end + + newproperty(:group) do + desc "The file group." + end + + newproperty(:mode) do + desc "The file mode." + end + + newproperty(:type) do + desc "The read-only file type." + end +end diff --git a/lib/puppet/util/state_machine.rb b/lib/puppet/util/state_machine.rb new file mode 100644 index 000000000..9329df3ce --- /dev/null +++ b/lib/puppet/util/state_machine.rb @@ -0,0 +1,52 @@ +require 'puppet/util' + +# A simple class for defining simple state machines. You define +# the state transitions, which translate to the states a given property +# can be in and the methods used to transition between those states. +# +# == Example +# +# newproperty(:ensure) do +# +# :absent => :present (:create) +# +# statemachine.new(:create => {:absent => :present}, :destroy => {:present => :absent}) +# +# mach.transition(:absent => :present).with :create +# mach.transition(:present => :absent).with :destroy +# +# mach.transition :create => {:absent => :present}, :destroy => {:present => :absent} + +require 'puppet/simple_graph' +require 'puppet/relationship' + +class Puppet::Util::StateMachine + class Transition < Puppet::Relationship + end + + def initialize(&block) + @graph = Puppet::SimpleGraph.new + @docs = {} + + instance_eval(&block) if block + end + + # Define a state, with docs. + def state(name, docs) + @docs[name] = docs + @graph.add_vertex(name) + end + + # Check whether a state is defined. + def state?(name) + @graph.vertex?(name) + end + + def transition(from, to) + raise ArgumentError, "Unknown starting state %s" % from unless state?(from) + raise ArgumentError, "Unknown ending state %s" % to unless state?(to) + raise ArgumentError, "Transition %s => %s already exists" % [from, to] if @graph.edge?(from, to) + transition = Transition.new(from, to) + @graph.add_edge(transition) + end +end |