summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2008-08-18 21:50:59 -0500
committerLuke Kanies <luke@madstop.com>2008-08-20 12:13:25 -0500
commita5ab52c628cae7ac9ed5ca1bd5de779944840802 (patch)
treed2c0db0f2859efaa25225fba82c40da94623d910 /lib/puppet
parent4f275b669b0336c6032204bfa9694fa6522eb267 (diff)
downloadpuppet-a5ab52c628cae7ac9ed5ca1bd5de779944840802.tar.gz
puppet-a5ab52c628cae7ac9ed5ca1bd5de779944840802.tar.xz
puppet-a5ab52c628cae7ac9ed5ca1bd5de779944840802.zip
Adding files temporarily, since I've decided this work is a dead-end.
I'm merely adding these so that they're in the history if I decided to look at them again. Signed-off-by: Luke Kanies <luke@madstop.com>
Diffstat (limited to 'lib/puppet')
-rw-r--r--lib/puppet/provider/newfile/default.rb89
-rw-r--r--lib/puppet/type/newfile.rb38
-rw-r--r--lib/puppet/util/state_machine.rb52
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