>>> On 5/10/2009 at 4:33 pm, in message
<[email protected]>, Luke Kanies
<[email protected]> wrote:
> ruby -rpuppet <path/to/file.rb>
>
Tried removing the require line and still no luck. I also ran it with the line
above and that produced no syntax errors.
> If that doesn't work, can you resend the patch inline, rather than as
> an attachment?
Here you go.
diff --git a/lib/puppet/provider/firewall/iptables.rb
b/lib/puppet/provider/firewall/iptables.rb
new file mode 100644
index 0000000..d8e8ddb
--- /dev/null
+++ b/lib/puppet/provider/firewall/iptables.rb
@@ -0,0 +1,142 @@
+require 'puppet/type/firewall'
+
+Puppet::Type.type(:firewall).provide(:iptables) do
+ desc "Iptables firewall provider"
+ commands :iptables => "iptables"
+ commands :iptables_save => "iptables-save"
+
+ # Set this provider to be the default for the following operating systems
+# defaultfor :operatingsystem => [:redhat, :sles, :ubuntu]
+
+ @@rulens = Array.new
+
+ def create
+
+ puts "create has been called"
+
+ ipts = `which iptables`.strip
+ if ipts.nil then
+ `which /sbin/iptables`.strip
+ end
+
+ raise "iptables command not found" if ipts.nil
+
+ `#{ipts} -A #{command_string}`
+
+ end
+
+ def destroy
+
+ puts "destroy has been called"
+
+ strme = command_string
+
+ ipts = `which iptables`.strip
+ if ipts.nil then
+ `which /sbin/iptables`.strip
+ end
+
+ raise "iptables command not found" if ipts.nil
+
+ `#{ipts} -D #{strme}`
+
+ # remove from list of rules
+ end
+
+ def command_string(rule = @resource)
+ strme = ""
+ strme += rule[:chain].to_s
+ strme += " -i " + rule[:i].to_s if rule[:i]
+ strme += " -o " + rule[:o].to_s if rule[:o]
+ strme += " -p " + rule[:p].to_s if rule[:p]
+ strme += " -m state" if rule[:mstate]
+ strme += " --state " + rule[:state].to_s if rule[:state]
+ strme += " -m icmp" if rule[:micmp]
+ strme += " --icmp-type " + rule[:icmp_type].to_s if rule[:icmp_type]
+ strme += " -m limit" if rule[:mlimit]
+ strme += " --limit " + rule[:limit].to_s if rule[:limit]
+ strme += " -j " + rule[:j].to_s if rule[:j]
+ strme += " --log-prefix " + rule[:log_prefix].to_s if rule[:log_prefix]
+ strme += " --log-tcp-options " + rule[:log_tcp_options].to_s if
rule[:log_tcp_options]
+ strme += " --log-ip-options " + rule[:log_ip_options].to_s if
rule[:log_ip_options]
+ strme += " --reject-with " + rule[:reject_with].to_s if rule[:reject_with]
+
+ rule[:cmd] = strme.to_s
+ puts "Generated command of " + strme.to_s
+ strme.to_s
+ end
+
+ def exists?
+
+ puts "Checking if a rule exists"
+
+ populate if @@rulens.empty?
+ command_string if @resource[:cmd].empty?
+
+ @@rulens.each do |rule|
+ # Check if the rule exists
+ puts "Checking rule " + rule[:name].to_s + " against " +
@resource[:name].to_s
+ return true if rule[:cmd].equal? @resource[:cmd]
+ end
+
+ return false
+
+ end
+
+ def populate
+ ipts = `which iptables-save`.strip
+
+ puts "Populating iptables from iptables-save"
+
+ if ipts.empty? then
+ ipts = `which /sbin/iptables-save`.strip
+ end
+
+ raise "iptables-save not found" unless !ipts.empty?
+
+ `#{ipts}`.each do |rule|
+ unless rule.index('#').eql? 0 or rule.index(':').eql? 0 or
rule.index('*').eql? 0 then
+ # Use regex to obtain the chain and other rules
+ exp = /(\-[A-Za-z\-]+\s)([\w\-\"\/]+\s?\"?)/
+ matches = rule.strip.scan(exp)
+
+ if matches then
+
+ # return create a new hash
+ rulen = Puppet::Type.type(:firewall).new(:name => rule.to_s)
+
+ matches.each do |component|
+ key = ""
+ value = ""
+ strme = component.to_s
+
+ while strme.index(/\-/).eql? 0 do
+ strme = strme[1,strme.length - 1]
+ end
+
+ # Split the string based upon the first occurance of /\s/
+ splitloc = strme.index(/\s/)
+
+ key = strme[0, splitloc].strip
+ value = strme[splitloc + 1, strme.length - 1]
+ # Check if key is 'm' and change to key + value
+ key = key + value.strip if key.to_s.eql? "m"
+ key.gsub! "-", "_"
+ key = "chain" if key.to_s.eql? "A"
+
+ # Insert the value for the specific key
+ rulen[key] = value.strip unless key.empty? or value.empty?
+
+ end
+
+ # Store the rule in an array
+ @@rulens << rulen
+ end
+
+ end
+
+ end
+
+ end
+
+end
diff --git a/lib/puppet/type/firewall.rb b/lib/puppet/type/firewall.rb
new file mode 100644
index 0000000..2f8d0b0
--- /dev/null
+++ b/lib/puppet/type/firewall.rb
@@ -0,0 +1,159 @@
+module Puppet
+
+ newtype(:firewall) do
+ @doc = "Define, manipulate, add and remove iptables rules"
+
+ ensurable
+
+ newparam(:name) do
+ desc "The name of the resource"
+ isnamevar
+ end
+
+ newparam(:chain) do
+ desc "holds value of iptables -A parameter.
+ Possible values are: 'INPUT', 'FORWARD', 'OUTPUT',
'PREROUTING', 'POSTROUTING'.
+ Default value is 'INPUT'"
+ defaultto ""
+ end
+
+ newparam(:t) do
+ desc "one of the following tables: 'nat', 'mangle',
+ 'filter' and 'raw'. Default one is 'filter'"
+ newvalues(:nat, :mangle, :filter, :raw)
+ defaultto "filter"
+ end
+
+ newparam(:p) do
+ desc "holds value of iptables --protocol parameter.
+ Possible values are: 'tcp', 'udp', 'icmp', 'esp', 'ah',
'vrrp', 'igmp', 'all'.
+ Default value is 'all'"
+ newvalues(:tcp, :udp, :icmp, :esp, :ah, :vrrp, :igmp, :all)
+ defaultto :all
+ end
+
+ newparam(:j) do
+ desc "holds value of iptables --jump target
+ Possible values are: 'ACCEPT', 'DROP', 'REJECT', 'DNAT',
'LOG'."
+ defaultto ""
+ end
+
+ newparam(:source) do
+ desc "value for iptables --source parameter"
+ end
+
+ newparam(:destination) do
+ desc "value for iptables --destination parameter"
+ end
+
+ newparam(:sport) do
+ desc "holds value of iptables [..] --source-port parameter.
+ If array is specified, values will be passed to multiport
module.
+ Only applies to tcp/udp."
+ defaultto ""
+ end
+
+ newparam(:dport) do
+ desc "holds value of iptables [..] --destination-port parameter.
+ If array is specified, values will be passed to multiport
module.
+ Only applies to tcp/udp."
+ defaultto ""
+ end
+
+ newparam(:i) do
+ desc "value for iptables --in-interface parameter"
+ end
+
+ newparam(:o) do
+ desc "value for iptables --out-interface parameter"
+ end
+
+ newparam(:to_dest) do
+ desc "value for iptables '-j DNAT --to-destination' parameter"
+ defaultto ""
+ end
+
+ newparam(:log_level) do
+ desc "value for iptables '--log-level' parameter"
+ defaultto ""
+ end
+
+ newparam(:log_prefix) do
+ desc "value for iptables '--log-prefix' parameter"
+ defaultto ""
+ end
+
+ newparam(:log_tcp_options) do
+ desc "value for iptables '--log-tcp-options' parameter"
+ defaultto ""
+ end
+
+ newparam(:log_ip_options) do
+ desc "value for iptables '--log-ip-options' parameter"
+ defaultto ""
+ end
+
+ newparam(:icmp_type) do
+ desc "value for iptables '--icmp-type' parameter"
+ defaultto ""
+ end
+
+ newparam(:mstate) do
+ desc "value for iptables '-m state' parameter"
+ defaultto ""
+ end
+
+ newparam(:micmp) do
+ desc "value for iptables '-m icmp' parameter"
+ defaultto ""
+ end
+
+ newparam(:mlimit) do
+ desc "value for iptables '-m limit' parameter"
+ defaultto ""
+ end
+
+ newparam(:mpkttype) do
+ desc "value for iptables '-m pkttype' parameter"
+ defaultto ""
+ end
+
+ newparam(:pkt_type) do
+ desc "value for iptables '-m pkttype --pkt-type' parameter"
+ defaultto ""
+ end
+
+ newparam(:mtcp) do
+ desc "value for iptables '-m tcp' parameter"
+ defaultto ""
+ end
+
+ newparam(:tcp_flags) do
+ desc "value for iptables '-m tcp --tcp-flags' parameter"
+ defaultto ""
+ end
+
+ newparam(:state) do
+ desc "value for iptables '--state' parameter.
+ Possible values are: 'INVALID', 'ESTABLISHED', 'NEW',
'RELATED'."
+ newvalues(:INVALID, :ESTABLISHED, :NEW, :RELATED)
+ end
+
+ newparam(:reject_with) do
+ desc "value for iptables '--reject-with' parameter"
+ defaultto ""
+ end
+
+ newparam(:limit) do
+ desc "value for iptables '--limit' parameter"
+ defaultto ""
+ end
+
+ newparam(:cmd) do
+ desc "The command line value for the iptables parameter"
+ defaultto ""
+ end
+
+ end
+
+end
diff --git a/spec/unit/provider/firewall/iptables.rb
b/spec/unit/provider/firewall/iptables.rb
new file mode 100755
index 0000000..57fd98b
--- /dev/null
+++ b/spec/unit/provider/firewall/iptables.rb
@@ -0,0 +1,34 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+require 'puppet/provider/firewall/iptables'
+
+provider = Puppet::Type.type(:firewall).provide(:iptables)
+
+describe provider do
+
+ before :each do
+ @prov = provider.new
+ end
+
+ it "should have the puppet provider class as its baseclass" do
+ provider.superclass.should equal Puppet::Provider
+ end
+
+ it 'should know how to populate known rules' do
+ @prov.should respond_to :populate
+ end
+
+ it 'should ensure the absense of a specified simple rule' do
+ rule = Puppet::Type.type(:firewall).new(
+ :name => "INPUT -m state --sate ESTABLISHED -j ACCEPT",
+ :ensure => "absent",
+ :chain => "INPUT",
+ :mstate => "sate",
+ :state => "ESTABLISHED",
+ :j => "ACCEPT",
+ :provider => "iptables")
+ end
+
+end
diff --git a/spec/unit/type/firewall.rb b/spec/unit/type/firewall.rb
new file mode 100755
index 0000000..ce708f2
--- /dev/null
+++ b/spec/unit/type/firewall.rb
@@ -0,0 +1,24 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'puppet/type/firewall'
+require 'puppet/provider/firewall/iptables'
+
+describe Puppet::Type.type(:firewall) do
+
+ it "should ensure presense of specified simple route" do
+ rule = Puppet::Type.type(:firewall).new(
+ :name => "INPUT -m state --sate ESTABLISHED -j ACCEPT",
+ :ensure => "present",
+ :chain => "INPUT",
+ :mstate => "sate",
+ :state => "ESTABLISHED",
+ :j => "ACCEPT",
+ :provider => "iptables")
+ end
+
+ it "should ensure absense of specified simple route" do
+
+ end
+
+end
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---