|
11 | 11 | test_rules(new_resource, rules)
|
12 | 12 |
|
13 | 13 | if not node["simple_iptables"]["chains"][new_resource.table].include?(new_resource.chain)
|
14 |
| - node.set["simple_iptables"]["chains"][new_resource.table] = node["simple_iptables"]["chains"][new_resource.table].dup << new_resource.chain |
15 |
| - node.set["simple_iptables"]["rules"][new_resource.table] = node["simple_iptables"]["rules"][new_resource.table].dup << "-A #{new_resource.direction} --jump #{new_resource.chain}" |
| 14 | + node.set["simple_iptables"]["chains"][new_resource.table] = node["simple_iptables"]["chains"][new_resource.table].dup << new_resource.chain unless ["PREROUTING", "INPUT", "FORWARD", "OUTPUT", "POSTROUTING"].include?(new_resource.chain) |
| 15 | + unless new_resource.chain == new_resource.direction |
| 16 | + node.set["simple_iptables"]["rules"][new_resource.table] = node["simple_iptables"]["rules"][new_resource.table].dup << "-A #{new_resource.direction} --jump #{new_resource.chain}" |
| 17 | + end |
16 | 18 | end
|
17 | 19 |
|
18 | 20 | # Then apply the rules to the node
|
|
29 | 31 | end
|
30 | 32 |
|
31 | 33 | def test_rules(new_resource, rules)
|
32 |
| - #always flush and remove first in case the previous run left it lying around. Ignore any return values. |
33 |
| - shell_out("iptables --table #{new_resource.table} --flush _chef_lwrp_test") |
34 |
| - shell_out("iptables --table #{new_resource.table} --delete-chain _chef_lwrp_test") |
35 |
| - #create the test chain |
36 |
| - shell_out!("iptables --table #{new_resource.table} --new-chain _chef_lwrp_test") |
| 34 | + test_chains = ["_chef_lwrp_test1"] |
| 35 | + cleanup_test_chain(new_resource.table, test_chains.first) |
| 36 | + shell_out!("iptables --table #{new_resource.table} --new-chain #{test_chains.first}") |
37 | 37 | begin
|
38 | 38 | rules.each do |rule|
|
39 | 39 | new_rule = rule_string(new_resource, rule, true)
|
40 |
| - new_rule.gsub!("-A #{new_resource.chain}", "-A _chef_lwrp_test") |
| 40 | + new_rule.gsub!("-A #{new_resource.chain}", "-A #{test_chains.first}") |
| 41 | + |
| 42 | + # Test for jumps to chains that are not actually created on the system yet, but are already processed in the current recipe |
| 43 | + if node["simple_iptables"]["chains"][new_resource.table].include?(new_resource.jump) |
| 44 | + test_chains.push("_chef_lwrp_test2") |
| 45 | + cleanup_test_chain(new_resource.table, test_chains.last) |
| 46 | + shell_out!("iptables --table #{new_resource.table} --new-chain #{test_chains.last}") |
| 47 | + new_rule.gsub!("--jump #{new_resource.jump}", "--jump #{test_chains.last}") |
| 48 | + end |
41 | 49 | shell_out!("iptables #{new_rule}")
|
42 | 50 | end
|
43 | 51 | ensure
|
44 |
| - shell_out("iptables --table #{new_resource.table} --flush _chef_lwrp_test") |
45 |
| - shell_out("iptables --table #{new_resource.table} --delete-chain _chef_lwrp_test") |
| 52 | + test_chains.each do |test_chain| |
| 53 | + cleanup_test_chain(new_resource.table, test_chain) |
| 54 | + end |
46 | 55 | end
|
47 | 56 | end
|
48 | 57 |
|
| 58 | +def cleanup_test_chain(table, chain) |
| 59 | + #always flush and remove first in case the previous run left it lying around. Ignore any return values. |
| 60 | + shell_out("iptables --table #{table} --flush #{chain}") |
| 61 | + shell_out("iptables --table #{table} --delete-chain #{chain}") |
| 62 | +end |
| 63 | + |
49 | 64 | def rule_string(new_resource, rule, include_table)
|
50 |
| - jump = new_resource.jump ? " --jump #{new_resource.jump}" : "" |
| 65 | + jump = new_resource.jump ? "--jump #{new_resource.jump} " : "" |
51 | 66 | table = include_table ? "--table #{new_resource.table} " : ""
|
52 |
| - rule = "#{table}-A #{new_resource.chain} #{rule}#{jump}" |
| 67 | + rule = "#{table}-A #{new_resource.chain} #{jump}#{rule}" |
53 | 68 | rule
|
54 | 69 | end
|
0 commit comments