Skip to content

Commit 25dff54

Browse files
committed
Speed up ipset entries changes
We now use `--add-entries-from-file` and `--remove-entries-from-file` to change firewalld ipset. Adding or removing entries one by one was really slow. This pull request is based on https://github.com/42wim/puppet-firewalld/blob/04683b46cbe6e6a925c585283941cc363752aceb/lib/puppet/provider/firewalld_ipset/firewall_cmd.rb
1 parent 882e722 commit 25dff54

File tree

2 files changed

+32
-16
lines changed

2 files changed

+32
-16
lines changed

lib/puppet/provider/firewalld_ipset/firewall_cmd.rb

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,37 @@ def create
1717
args << ["--type=#{@resource[:type]}"]
1818
args << ["--option=#{@resource[:options].map { |a,b| "#{a}=#{b}" }.join(',')}"] if @resource[:options]
1919
execute_firewall_cmd(args.flatten, nil)
20-
@resource[:entries].each { |e| add_entry(e) }
20+
add_entries_from_file(@resource[:entries])
2121
end
2222

2323
def entries
2424
execute_firewall_cmd(["--ipset=#{@resource[:name]}", "--get-entries"], nil).split("\n").sort
2525
end
2626

27-
def add_entry(entry)
28-
execute_firewall_cmd(["--ipset=#{@resource[:name]}", "--add-entry=#{entry}"], nil)
27+
def add_entries_from_file(entries)
28+
f = Tempfile.new('ipset')
29+
entries.each { |e| f.write(e+"\n") }
30+
f.close
31+
execute_firewall_cmd(["--ipset=#{@resource[:name]}", "--add-entries-from-file=#{f.path}"], nil)
2932
end
3033

31-
def remove_entry(entry)
32-
execute_firewall_cmd(["--ipset=#{@resource[:name]}", "--remove-entry=#{entry}"], nil)
34+
def remove_entries_from_file(entry)
35+
f = Tempfile.new('ipset')
36+
entries.each { |e| f.write(e+"\n") }
37+
f.close
38+
execute_firewall_cmd(["--ipset=#{@resource[:name]}", "--remove-entries-from-file=#{f.path}"], nil)
3339
end
3440

3541
def entries=(should_entries)
3642
cur_entries = entries
3743
delete_entries = cur_entries-should_entries
3844
add_entries = should_entries-cur_entries
39-
delete_entries.each { |e| remove_entry(e) }
40-
add_entries.each { |e| add_entry(e) }
45+
if delete_entries
46+
remove_entries_from_file(delete_entries)
47+
end
48+
if add_entries
49+
add_entries_from_file(add_entries)
50+
end
4151
end
4252

4353
def destroy

spec/unit/puppet/type/firewalld_ipset_spec.rb

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@
44

55
before do
66
Puppet::Provider::Firewalld.any_instance.stubs(:state).returns(:true)
7+
tempfile = stub('tempfile', :class => Tempfile,
8+
:write => true,
9+
:flush => true,
10+
:close! => true,
11+
:close => true,
12+
:path => '/tmp/ipset-rspec'
13+
)
14+
Tempfile.stubs(:new).returns(tempfile)
715
end
816

917
describe "type" do
@@ -55,8 +63,7 @@
5563

5664
it "should create" do
5765
provider.expects(:execute_firewall_cmd).with(['--new-ipset=whitelist', '--type=hash:ip'], nil)
58-
provider.expects(:execute_firewall_cmd).with(['--ipset=whitelist', '--add-entry=192.168.2.2'], nil)
59-
provider.expects(:execute_firewall_cmd).with(['--ipset=whitelist', '--add-entry=10.72.1.100'], nil)
66+
provider.expects(:execute_firewall_cmd).with(["--ipset=whitelist", "--add-entries-from-file=/tmp/ipset-rspec"], nil)
6067
provider.create
6168
end
6269

@@ -66,17 +73,16 @@
6673
end
6774

6875
it "should set entries" do
69-
provider.expects(:entries).returns([])
70-
provider.expects(:execute_firewall_cmd).with(['--ipset=whitelist', '--add-entry=192.168.2.2'], nil)
71-
provider.expects(:execute_firewall_cmd).with(['--ipset=whitelist', '--add-entry=10.72.1.100'], nil)
76+
provider.expects(:entries).returns([]).at_least_once()
77+
provider.expects(:execute_firewall_cmd).with(["--ipset=whitelist", "--add-entries-from-file=/tmp/ipset-rspec"], nil)
78+
provider.expects(:execute_firewall_cmd).with(["--ipset=whitelist", "--remove-entries-from-file=/tmp/ipset-rspec"], nil)
7279
provider.entries=(['192.168.2.2', '10.72.1.100'])
7380
end
7481

7582
it "should remove unconfigured entries" do
76-
provider.expects(:entries).returns(['10.9.9.9', '10.8.8.8', '10.72.1.100'])
77-
provider.expects(:execute_firewall_cmd).with(['--ipset=whitelist', '--add-entry=192.168.2.2'], nil)
78-
provider.expects(:execute_firewall_cmd).with(['--ipset=whitelist', '--remove-entry=10.9.9.9'], nil)
79-
provider.expects(:execute_firewall_cmd).with(['--ipset=whitelist', '--remove-entry=10.8.8.8'], nil)
83+
provider.expects(:entries).returns(['10.9.9.9', '10.8.8.8', '10.72.1.100']).at_least_once()
84+
provider.expects(:execute_firewall_cmd).with(["--ipset=whitelist", "--add-entries-from-file=/tmp/ipset-rspec"], nil)
85+
provider.expects(:execute_firewall_cmd).with(["--ipset=whitelist", "--remove-entries-from-file=/tmp/ipset-rspec"], nil)
8086
provider.entries=(['192.168.2.2', '10.72.1.100'])
8187
end
8288

0 commit comments

Comments
 (0)