---
 lib/puppet/provider/sysctl/linux.rb |   69 +++++++++++++++++++++++++++++++++++
 lib/puppet/type/sysctl.rb           |   36 ++++++++++++++++++
 spec/unit/provider/sysctl/linux.rb  |   25 +++++++++++++
 spec/unit/type/sysctl.rb            |   23 ++++++++++++
 4 files changed, 153 insertions(+), 0 deletions(-)
 create mode 100644 lib/puppet/provider/sysctl/linux.rb
 create mode 100644 lib/puppet/type/sysctl.rb
 create mode 100644 spec/unit/provider/sysctl/linux.rb
 create mode 100644 spec/unit/type/sysctl.rb

diff --git a/lib/puppet/provider/sysctl/linux.rb 
b/lib/puppet/provider/sysctl/linux.rb
new file mode 100644
index 0000000..ca9de35
--- /dev/null
+++ b/lib/puppet/provider/sysctl/linux.rb
@@ -0,0 +1,69 @@
+# Manage the linux kernel stack, should work for most sysctl unixes
+require 'pathname'
+
+Puppet::Type.type(:sysctl).provide(:linux) do
+
+    desc "Support for managing the linux kernel stack
+    Manages the /etc/sysctl.conf file and uses the sysctl command to apply 
changes
+    "
+
+    defaultfor :operatingsystem => [:redhat, :fedora, :suse, :centos, :sles, 
:debian, :ubuntu, :gentoo]
+
+    commands :sysctl_cmd => "sysctl"
+
+    #Verify that the setting is available and add the setting to the file
+    def create
+        # First, apply the setting, if the setting is invalid the commands
+        # interface will throw and prevent the value from being applied.
+        sysctl_cmd "-w", "#...@resource[:name]}...@resource[:value]}"
+        lines = File.new('/etc/sysctl.conf', 'r').readlines
+        done = false
+        lines.each_index do |i|
+            if lines[i].split('=')[0].strip == @resource[:name]
+                lines[i] = "#...@resource[:name]} = #...@resource[:value]}\n"
+                done = true
+            end
+        end
+        unless done
+            lines << "#...@resource[:name]} = #...@resource[:value]}\n"
+        end
+            sysfile = File.new('/etc/sysctl.conf', 'w')
+        for line in lines
+            sysfile.write(line)
+        end
+        sysfile.close
+        sysctl_cmd "-p"
+    end
+
+    # Remove the setting from the file - Will not return the setting to the 
kernel default!!
+    def destroy
+        lines = File.new('/etc/sysctl.conf', 'r').readlines
+        lines.each_index do |i|
+            if lines[i].split('=')[0].strip == @resource[:name]
+                lines[i] = ""
+            end
+            sysfile = File.new('/etc/sysctl.conf', 'w')
+            for line in lines
+                sysfile.write(line)
+            end
+            sysfile.close
+        end
+    end
+    
+    # Checks for the setting in the sysctl.conf file, if the rule is set to be 
absent
+    # then it can exist with any value.
+    def exists?
+        lines = File.new('/etc/sysctl.conf', 'r').readlines
+        lines.each do |line|
+            if line.split('=')[0].strip == @resource[:name]
+                if line.split('=')[1].strip == @resource[:value]
+                return true
+                elsif @resource[:ensure] == :absent
+                    return true
+                end
+            end
+        end
+        return false
+    end
+end
+
diff --git a/lib/puppet/type/sysctl.rb b/lib/puppet/type/sysctl.rb
new file mode 100644
index 0000000..2633e2e
--- /dev/null
+++ b/lib/puppet/type/sysctl.rb
@@ -0,0 +1,36 @@
+module Puppet
+    newtype(:sysctl) do
+        @doc = "Manages the sysctl interface for unix-like systems.
+        The sysctl module works primarily by managing the /etc/sysctl.conf
+        file, and then by calling the 'sysctl -p' command to apply the state
+        of the /etc/sysctl.conf file.
+    
+        This is a very simple type and only makes use of a few paramaters.
+        The type only supports three paramaters, the namevar paramater, name,
+        is the dot notation reference to the desired sysctl setting, aka
+        'vm.swappiness'.  The value paramater is always a string and is the
+        value to pass to the gives sysctl setting.  The sysctl trype is also
+        ensurable, so all rules need to have the regular ensure => present
+        option set.
+    
+        A typical rule will look like this:
+    
+            sysctl {'vm.swappiness':
+                ensure => present,
+                value => '20',
+            }
+        
+        This rule would ensure that the kernel swappiness setting be set to 
'20'"
+
+        ensurable
+
+        newparam(:name, :namevar => true) do
+            desc "The name of the variable in the sysctl tree, given in dot 
notation, eg vm.swappiness"
+        end
+
+        newparam(:value) do
+            desc "The value to enforce for the sysctl variable."
+        end
+    end
+end
+
diff --git a/spec/unit/provider/sysctl/linux.rb 
b/spec/unit/provider/sysctl/linux.rb
new file mode 100644
index 0000000..95b5203
--- /dev/null
+++ b/spec/unit/provider/sysctl/linux.rb
@@ -0,0 +1,25 @@
+#/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+provider_class = Puppet::Type.type(:sysctl).provider(:linux)
+
+describe provider_class do
+    before do
+        @resource = stub("resource", :name => "vm.swappiness")
+        @resource.stubs(:[]).with(:name).returns "vm.swappiness"
+        @provider = provider_class.new(@resource)
+    end
+    it "should have a create method" do
+        @provider.should respond_to(:create)
+    end
+
+    it "should have a destroy method" do
+        @provider.should respond_to(:destroy)
+    end
+
+    it "should have an exists? method" do
+        @provider.should respond_to(:exists?)
+    end
+
+end
diff --git a/spec/unit/type/sysctl.rb b/spec/unit/type/sysctl.rb
new file mode 100644
index 0000000..185d7ab
--- /dev/null
+++ b/spec/unit/type/sysctl.rb
@@ -0,0 +1,23 @@
+#/usr/bin/env ruby
+
+Dir.chdir(File.dirname(__FILE__)) { (s = lambda { |f| File.exist?(f) ? 
require(f) : Dir.chdir("..") { s.call(f) } }).call("spec/spec_helper.rb") }
+
+sysctl = Puppet::Type.type(:sysctl)
+
+describe sysctl do
+    properties = [:ensure]
+
+    properties.each do |property|
+        it "should have a %s property" % property do
+            sysctl.attrclass(property).ancestors.should 
be_include(Puppet::Property)
+        end
+    end 
+    parameters = [:name, :value]
+
+    parameters.each do |parameter|
+        it "should have a %s parameter" % parameter do
+            sysctl.attrclass(parameter).ancestors.should 
be_include(Puppet::Parameter)
+        end
+    end
+end
+
-- 
1.7.0.1

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to