ript 0.8.4 → 0.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e8be9583d1347183f21a3d6fd027aa05a071f1b2
4
+ data.tar.gz: b1c113e7c5d266b1d8deaf94879abdba4164f4c6
5
+ SHA512:
6
+ metadata.gz: a9c22e90daffccc7485dda9993b68451ef7da57bc2c22fbbbf080f3f357323144df7ba84b395683b72e1849c558188a3410351b30b0f198e361fe9e9d28dbc24
7
+ data.tar.gz: 35669bb525b1450409e94c5f70ff88257e2ffebaa82f4d75e54c227b9803857ccaca46fa7a0515c2a3eee8e3b80a58525303087d6df4b1026e144acc8b7bc675
data/.gitignore CHANGED
@@ -4,3 +4,4 @@ pkg/
4
4
  *~
5
5
  vendor
6
6
  .bundle
7
+ .vagrant
@@ -0,0 +1 @@
1
+ 2.3.0
data/AUTHORS.md CHANGED
@@ -8,9 +8,14 @@ Patches have been merged from:
8
8
  Arthur Barton (@arthurbarton)
9
9
  John Ferlito (@johnf)
10
10
  Jesse Reynolds (@jessereynolds)
11
+ Michael Baker (@elmobp)
12
+ Greg Cockburn (@gergnz)
11
13
 
12
14
  Inspiration given by:
13
15
 
14
16
  Matt Moor (@mattm0)
15
17
 
16
- Ript is copyright Bulletproof Networks 2011-2012, all rights reserved.
18
+ Contact:
19
+ foundation@bulletproof.net will send an email to the development team within Bulletproof Networks, any issues should be raised via Github.
20
+
21
+ Ript is copyright Bulletproof Networks 2011-2016, all rights reserved.
@@ -1,6 +1,21 @@
1
1
  ## Changelog
2
2
 
3
- # 0.8.4 - 2012/08/121
3
+ # 0.8.8 - 2016/12/02
4
+ - Bug: Support for an array of protocols (@elmobp)
5
+ - Bug: Support Ruby 2.0+ (@elmobp)
6
+ - Feature: Protocol validation using /etc/protocols, by adding this support in the validation ensures many other parts of the software performed correctly (@elmobp)
7
+ - Feature: Protocol validation whitelist (@elmobp)
8
+
9
+ # 0.8.7 - 2013/06/23
10
+ - Bug: The I forgot to push to github release, just a version bump (@johnf)
11
+
12
+ # 0.8.6 - 2013/06/23
13
+ - Feature: Add `ript rules flush` command to flush all rules (@johnf)
14
+
15
+ # 0.8.5 - 2013/04/16
16
+ - Bug: Write the output of `ript diff` to a file and execute that, so sh doesn't choke on huge insertions #8
17
+
18
+ # 0.8.4 - 2012/08/12
4
19
  - Bug: DNAT rules from one port to another were adding a filter rule for the
5
20
  source instead of destination port (@johnf)
6
21
 
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ript (0.8.4)
4
+ ript (0.8.9)
5
5
 
6
6
  GEM
7
- remote: http://rubygems.org/
7
+ remote: https://rubygems.org/
8
8
  specs:
9
9
  arr-pm (0.0.7)
10
10
  cabin (> 0)
@@ -27,8 +27,7 @@ GEM
27
27
  json (>= 1.4.6)
28
28
  term-ansicolor (>= 1.0.6)
29
29
  diff-lcs (1.1.3)
30
- ffi (1.0.7)
31
- rake (>= 0.8.7)
30
+ ffi (1.0.11)
32
31
  fpm (0.4.5)
33
32
  arr-pm (~> 0.0.7)
34
33
  backports (= 2.3.0)
@@ -38,7 +37,7 @@ GEM
38
37
  gherkin (2.9.3)
39
38
  json (>= 1.4.6)
40
39
  json (1.6.6)
41
- rake (0.8.7)
40
+ rake (10.1.0)
42
41
  rspec (2.5.0)
43
42
  rspec-core (~> 2.5.0)
44
43
  rspec-expectations (~> 2.5.0)
@@ -60,3 +59,6 @@ DEPENDENCIES
60
59
  rake
61
60
  ript!
62
61
  rspec
62
+
63
+ BUNDLED WITH
64
+ 1.13.6
@@ -1,4 +1,4 @@
1
- Copyright 2011-2012 Bulletproof Networks. All rights reserved.
1
+ Copyright 2011-2012 Bulletproof Networks.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy of
4
4
  this software and associated documentation files (the "Software"), to deal in
data/README.md CHANGED
@@ -9,7 +9,7 @@ Ript works with `iptables` on Linux, and is written in Ruby.
9
9
  Installing
10
10
  ----------
11
11
 
12
- Make sure you have Ruby 1.9.2 installed, and run:
12
+ Make sure you have Ruby 1.9+ installed, and run:
13
13
 
14
14
  ``` bash
15
15
  gem install ript
@@ -24,6 +24,8 @@ sudo update-rc.d ript defaults
24
24
  sudo mkdir /var/lib/ript
25
25
  sudo chown root.adm /var/lib/ript
26
26
  sudo chmod 770 /var/lib/ript
27
+ # Only If you are using Xenial
28
+ sudo cp "$(dirname $(dirname $(dirname $(gem which ript/dsl.rb))))"/dist/ript.conf /etc/systemd/system/
27
29
  ```
28
30
 
29
31
  Applying rules
@@ -48,12 +50,12 @@ to your workflow.
48
50
  Developing
49
51
  ----------
50
52
 
51
- It is recommended to use a Ubuntu Lucid VM to develop Ript. If you develop on a machine without iptables some of the tests will fail.
53
+ It is recommended to use a Ubuntu Xenial VM to develop Ript. If you develop on a machine without iptables some of the tests will fail.
52
54
 
53
55
  It is also recommended that you use [rbenv](http://rbenv.org/).
54
56
 
55
57
  ``` bash
56
- rbenv install 1.9.2-p290
58
+ rbenv install 2.3.0
57
59
  gem install bundler
58
60
  rbenv rehash
59
61
  ```
data/bin/ript CHANGED
@@ -6,6 +6,7 @@ $: << Pathname.new(__FILE__).parent.parent.join('lib').expand_path.to_s
6
6
  $: << Pathname.new(__FILE__).parent.parent.expand_path.to_s
7
7
  $: << Dir.pwd
8
8
  require 'ript/dsl'
9
+ require 'tempfile'
9
10
 
10
11
  if RUBY_VERSION =~ /^1.8/ then
11
12
  puts "Ript requires Ruby 1.9 to run. Exiting."
@@ -119,10 +120,40 @@ if ARGV[0] == 'rules'
119
120
  end
120
121
 
121
122
  if ARGV[1] == "apply" then
122
- output = `#{$0} rules diff #{ARGV[2..-1].join(' ')} 2>&1`
123
+ output = `#{$0} rules diff #{ARGV[2..-1].join(' ')} 2>&1`
124
+ tempfile = Tempfile.open("ript-apply-#{Time.now.to_i}") {|f| f << output}
123
125
  puts "#{output}"
124
- system("bash -c '#{output}'")
126
+ system("sh -e #{tempfile.path}")
127
+ exit
128
+ end
125
129
 
130
+ if ARGV[1] == 'flush' then
131
+ output = <<-EOF
132
+ iptables --flush --table filter
133
+ iptables --delete-chain --table filter
134
+ iptables --table filter --policy INPUT ACCEPT
135
+ iptables --table filter --policy FORWARD ACCEPT
136
+ iptables --table filter --policy OUTPUT ACCEPT
137
+
138
+ # Clean NAT
139
+ iptables --flush --table nat
140
+ iptables --delete-chain --table nat
141
+ iptables --table nat --policy PREROUTING ACCEPT
142
+ iptables --table nat --policy POSTROUTING ACCEPT
143
+ iptables --table nat --policy OUTPUT ACCEPT
144
+
145
+ # Clean mangle
146
+ iptables --flush --table mangle
147
+ iptables --delete-chain --table mangle
148
+ iptables --table mangle --policy PREROUTING ACCEPT
149
+ iptables --table mangle --policy POSTROUTING ACCEPT
150
+ iptables --table mangle --policy INPUT ACCEPT
151
+ iptables --table mangle --policy FORWARD ACCEPT
152
+ iptables --table mangle --policy OUTPUT ACCEPT
153
+ EOF
154
+ tempfile = Tempfile.open("ript-apply-#{Time.now.to_i}") {|f| f << output}
155
+ puts "#{output}"
156
+ system("sh -e #{tempfile.path}")
126
157
  exit
127
158
  end
128
159
 
@@ -172,7 +203,7 @@ if ARGV[0] == "clean" then
172
203
  chains.uniq.each do |chain|
173
204
  table = types[type]
174
205
 
175
- clean_command = `iptables-save --table #{table} 2>&1 | grep -- '-A partition-#{type}' | grep -- '-j #{chain}'`.split("\n")
206
+ clean_command = `iptables-save --table #{table} 2>&1 | grep -- '-A partition-#{type}' | grep -- '-j #{chain}'`.split("\n")
176
207
  clean_command.map! {|line| "iptables --table #{table} #{line}" }
177
208
  clean_command.map! {|line| line.gsub(" -A", " --delete") }
178
209
  clean_command.map! {|line| line.gsub(" -s", " --source") }
@@ -0,0 +1,9 @@
1
+ [Unit]
2
+ Description=Load ript rules on startup
3
+ [Service]
4
+ Type=oneshot
5
+ ExecStart=/etc/init.d/ript start
6
+ ExecStop=/etc/init.d/ript stop
7
+ RemainAfterExit=yes
8
+ [Install]
9
+ WantedBy=multi-user.target
@@ -113,3 +113,32 @@ Feature: Ript cli utility
113
113
  :OUTPUT ACCEPT \[\d+:\d+\]
114
114
  COMMIT
115
115
  """
116
+
117
+ @sudo @timeout-10
118
+ Scenario: Flush rules
119
+ Given I have no iptables rules loaded
120
+ When I run `ript rules flush`
121
+ Then the output from "ript rules flush" should match:
122
+ """
123
+ iptables --flush --table filter
124
+ iptables --delete-chain --table filter
125
+ iptables --table filter --policy INPUT ACCEPT
126
+ iptables --table filter --policy FORWARD ACCEPT
127
+ iptables --table filter --policy OUTPUT ACCEPT
128
+
129
+ # Clean NAT
130
+ iptables --flush --table nat
131
+ iptables --delete-chain --table nat
132
+ iptables --table nat --policy PREROUTING ACCEPT
133
+ iptables --table nat --policy POSTROUTING ACCEPT
134
+ iptables --table nat --policy OUTPUT ACCEPT
135
+
136
+ # Clean mangle
137
+ iptables --flush --table mangle
138
+ iptables --delete-chain --table mangle
139
+ iptables --table mangle --policy PREROUTING ACCEPT
140
+ iptables --table mangle --policy POSTROUTING ACCEPT
141
+ iptables --table mangle --policy INPUT ACCEPT
142
+ iptables --table mangle --policy FORWARD ACCEPT
143
+ iptables --table mangle --policy OUTPUT ACCEPT
144
+ """
@@ -18,6 +18,7 @@ Then /^the created chain name in all tables should match$/ do
18
18
  next if line.size == 0
19
19
  next if line =~ /--(new-chain|jump) partition-/
20
20
  next if line =~ /--(new-chain|jump) ript_bootstrap-/
21
+ next if line =~ /^\(in \/.*\)$/ # Exclude rake output from clean_slate
21
22
 
22
23
  line.should match(%r{(^\# #{@chain_name})|(#{@chain_names.join('|')})}) if line !~ /LOG/
23
24
  end
@@ -3,10 +3,10 @@ module Ript
3
3
  def self.partition
4
4
  rules = []
5
5
 
6
- rules << Rule.new("table" => "filter", "new-chain" => "partition-a")
7
- rules << Rule.new("table" => "filter", "insert" => "INPUT 1", "jump" => "partition-a")
8
- rules << Rule.new("table" => "filter", "insert" => "OUTPUT 1", "jump" => "partition-a")
9
- rules << Rule.new("table" => "filter", "insert" => "FORWARD 1", "jump" => "partition-a")
6
+ rules << Rule.new("table" => "filter", "new-chain" => "partition-a")
7
+ rules << Rule.new("table" => "filter", "insert" => "INPUT 1", "jump" => "partition-a")
8
+ rules << Rule.new("table" => "filter", "insert" => "OUTPUT 1", "jump" => "partition-a")
9
+ rules << Rule.new("table" => "filter", "insert" => "FORWARD 1", "jump" => "partition-a")
10
10
 
11
11
  rules << Rule.new("table" => "nat", "new-chain" => "partition-d")
12
12
  rules << Rule.new("table" => "nat", "insert" => "PREROUTING 1", "jump" => "partition-d")
@@ -6,7 +6,6 @@ if RUBY_VERSION =~ /^1.8/ then
6
6
  end
7
7
 
8
8
  $: << Pathname.new(__FILE__).dirname.parent.expand_path.to_s
9
-
10
9
  require 'ript/dsl/primitives'
11
10
  require 'ript/rule'
12
11
  require 'ript/partition'
@@ -94,8 +94,7 @@ module Ript
94
94
  "source" => from_address,
95
95
  "jump" => jump
96
96
  }
97
- attributes.insert_before("destination", "in-interface" => @interface) if @interface
98
-
97
+ attributes.insert_before("destination", [ "in-interface", @interface ]) if @interface
99
98
  # Build up a list of arguments we need to build expanded rules.
100
99
  #
101
100
  # This allows us to expand shorthand definitions like:
@@ -122,24 +121,42 @@ module Ript
122
121
  # If we have arguments, iterate through them
123
122
  if arguments.size > 0
124
123
  arguments.each do |options|
125
- options.each_pair do |key, value|
126
- attributes = attributes.dup # avoid overwriting existing hash values from previous iterations
127
- attributes.insert_before("destination", key => value)
128
- end
129
-
130
- @table << Rule.new(attributes.merge("jump" => "LOG")) if log
124
+ options.each_pair do |key, value|
125
+ supported_protocols = IO.readlines("/etc/protocols")
126
+ ignored_values = %w(all tcp udp)
127
+ supported_protocols.map! {|proto| proto.split("\t")[0] }
128
+ if key == "protocol" and value.instance_of?(String) and !ignored_values.include? value.downcase and value != "" and !supported_protocols.include? value
129
+ puts "Invalid protocol a) #{value} specified cannot continue"
130
+ exit
131
+ end
132
+ if value.is_a? Array
133
+ value.each do |valueout|
134
+ if !ignored_values.include? valueout.downcase and !supported_protocols.include? valueout
135
+ puts "Invalid protocol b) #{valueout} specified cannot continue"
136
+ exit 100
137
+ end
138
+ attributes = attributes.dup # avoid overwriting existing hash values from previous iterations
139
+ attributes.insert_before("destination", [ key, valueout ])
140
+ @table << Rule.new(attributes.merge("jump" => "LOG")) if log
141
+ @table << Rule.new(attributes)
142
+ end
143
+ return
144
+ else
145
+ attributes = attributes.dup # avoid overwriting existing hash values from previous iterations
146
+ attributes.insert_before("destination", [ key, value ])
147
+ end
148
+ end
149
+ @table << Rule.new(attributes.merge("jump" => "LOG")) if log
131
150
  @table << Rule.new(attributes)
132
- end
151
+ end
133
152
  else
134
- @table << Rule.new(attributes.merge("jump" => "LOG")) if log
153
+ @table << Rule.new(attributes.merge("jump" => "LOG")) if log
135
154
  @table << Rule.new(attributes)
136
155
  end # if
137
156
  end # @tos.each
138
157
  end # @froms.each
139
-
140
158
  end # def build_rule
141
159
  end
142
160
  end
143
161
  end
144
162
  end
145
-
@@ -57,7 +57,7 @@ module Ript
57
57
  "jump" => "ACCEPT" }
58
58
 
59
59
  @froms.map {|from| @labels[from][:address]}.each do |address|
60
- attributes.insert_before("destination", "source" => address)
60
+ attributes.insert_before("destination", ["source", address])
61
61
  end
62
62
 
63
63
  @table << Rule.new(attributes.merge("jump" => "LOG")) if log
@@ -113,7 +113,7 @@ module Ript
113
113
  "dport" => destination_port,
114
114
  "jump" => "ACCEPT" }
115
115
 
116
- attributes.insert_before("destination", "source" => from_address) unless from_address == "0.0.0.0/0"
116
+ attributes.insert_before("destination", ["source", from_address]) unless from_address == "0.0.0.0/0"
117
117
 
118
118
  @table << Rule.new(attributes.merge("jump" => "LOG")) if log
119
119
  @table << Rule.new(attributes)
@@ -136,7 +136,7 @@ module Ript
136
136
  "dport" => port,
137
137
  "jump" => "ACCEPT" }
138
138
 
139
- attributes.insert_before("destination", "source" => from_address) unless from_address == "0.0.0.0/0"
139
+ attributes.insert_before("destination", ["source" , from_address]) unless from_address == "0.0.0.0/0"
140
140
 
141
141
  @table << Rule.new(attributes.merge("jump" => "LOG")) if log
142
142
  @table << Rule.new(attributes)
@@ -1,10 +1,12 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  class Hash
4
- def insert_before(key, opts={})
5
- before = self.dup.take_while {|k, v| k != key }
6
- after = self.dup.drop_while {|k, v| k != key }
7
- before << opts.to_a.flatten
8
- self.clear.merge!(Hash[before]).merge!(Hash[after])
2
+ def insert_before(key, kvpair)
3
+ arr = to_a
4
+ pos = arr.index(arr.assoc(key))
5
+ if pos
6
+ arr.insert(pos, kvpair)
7
+ else
8
+ arr << kvpair
9
+ end
10
+ replace Hash[arr]
9
11
  end
10
12
  end
@@ -1,3 +1,3 @@
1
1
  module Ript
2
- VERSION = '0.8.4'
2
+ VERSION = '0.8.8'
3
3
  end
@@ -7,8 +7,8 @@ Gem::Specification.new do |s|
7
7
  s.name = "ript"
8
8
  s.version = Ript::VERSION
9
9
  s.platform = Gem::Platform::RUBY
10
- s.authors = [ "Lindsay Holmwood" ]
11
- s.email = [ "lindsay@bulletproof.net" ]
10
+ s.authors = [ "Bulletproof Group Ltd" ]
11
+ s.email = [ "foundation@bulletproof.net" ]
12
12
  s.homepage = "http://bulletproof.net/"
13
13
  s.summary = %q{DSL for iptables, and tool for incrementally applying firewall rules}
14
14
  s.description = %q{Ript provides a clean Ruby DSL for describing firewall rules, and implements database migrations-like functionality for applying the rules}
metadata CHANGED
@@ -1,134 +1,122 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ript
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
5
- prerelease:
4
+ version: 0.8.8
6
5
  platform: ruby
7
6
  authors:
8
- - Lindsay Holmwood
7
+ - Bulletproof Group Ltd
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-11-18 00:00:00.000000000 Z
11
+ date: 2016-12-12 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rake
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rspec
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: cucumber
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: 1.1.9
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: 1.1.9
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: aruba
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: colorize
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ">="
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - ">="
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: fpm
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - ">="
100
88
  - !ruby/object:Gem::Version
101
89
  version: 0.4.5
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - ">="
108
95
  - !ruby/object:Gem::Version
109
96
  version: 0.4.5
110
97
  description: Ript provides a clean Ruby DSL for describing firewall rules, and implements
111
98
  database migrations-like functionality for applying the rules
112
99
  email:
113
- - lindsay@bulletproof.net
100
+ - foundation@bulletproof.net
114
101
  executables:
115
102
  - rbenv-sudo
116
103
  - ript
117
104
  extensions: []
118
105
  extra_rdoc_files: []
119
106
  files:
120
- - .gitignore
121
- - .rbenv-version
107
+ - ".gitignore"
108
+ - ".ruby-version"
122
109
  - AUTHORS.md
123
110
  - CHANGELOG.md
124
111
  - Gemfile
125
112
  - Gemfile.lock
126
- - LICENCE
113
+ - LICENSE
127
114
  - README.md
128
115
  - Rakefile
129
116
  - bin/rbenv-sudo
130
117
  - bin/ript
131
118
  - dist/init.d
119
+ - dist/ript.conf
132
120
  - examples/accept-multiple-from-and-to.rb
133
121
  - examples/accept-with-a-list-of-ports.rb
134
122
  - examples/accept-with-specific-port-and-interface.rb
@@ -197,27 +185,26 @@ files:
197
185
  - ript.gemspec
198
186
  homepage: http://bulletproof.net/
199
187
  licenses: []
188
+ metadata: {}
200
189
  post_install_message:
201
190
  rdoc_options: []
202
191
  require_paths:
203
192
  - lib
204
193
  required_ruby_version: !ruby/object:Gem::Requirement
205
- none: false
206
194
  requirements:
207
- - - ! '>='
195
+ - - ">="
208
196
  - !ruby/object:Gem::Version
209
197
  version: 1.9.2
210
198
  required_rubygems_version: !ruby/object:Gem::Requirement
211
- none: false
212
199
  requirements:
213
- - - ! '>='
200
+ - - ">="
214
201
  - !ruby/object:Gem::Version
215
202
  version: 1.3.6
216
203
  requirements: []
217
204
  rubyforge_project: ript
218
- rubygems_version: 1.8.23
205
+ rubygems_version: 2.5.1
219
206
  signing_key:
220
- specification_version: 3
207
+ specification_version: 4
221
208
  summary: DSL for iptables, and tool for incrementally applying firewall rules
222
209
  test_files:
223
210
  - features/cli.feature
@@ -1 +0,0 @@
1
- 1.9.2-p290