wafoo 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/Gemfile +4 -0
- data/README.md +71 -0
- data/Rakefile +7 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/wafoo +5 -0
- data/lib/wafoo.rb +15 -0
- data/lib/wafoo/cli.rb +39 -0
- data/lib/wafoo/helper.rb +17 -0
- data/lib/wafoo/run.rb +164 -0
- data/lib/wafoo/version.rb +3 -0
- data/wafoo.gemspec +41 -0
- metadata +197 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 81207a2ff01529fc7a8a6c6b16fa18942ddd0995dbe0885d809d7d321f83613e
|
4
|
+
data.tar.gz: ffc45230ce3c874623b07798c3da714759e37ac10cccfbc6e62c697e9a3c7ae1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4a427e249bae138a7db185baf1acd76304ccd6391e353c1d55641691c0440cf8531eaf003588d38a87c3725613ca7c80ba7b32961d5774999dec4ca0f06d6c7b
|
7
|
+
data.tar.gz: aada43d74ea2aa377cb6f1643deae6e4a4cb0c7a93fe3aea598d22669f77f31e31c5324cbf34a2cbd891d777544159d294600c7c5da1274aea23e832855dc3c5
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
# wafoo
|
2
|
+
|
3
|
+
## これなに
|
4
|
+
|
5
|
+
* AWS WAF の IPSets をいじるコマンドラインツール
|
6
|
+
* ツッコミどころが満載です
|
7
|
+
|
8
|
+
## Install
|
9
|
+
|
10
|
+
Add this line to your application's Gemfile:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
gem 'wafoo'
|
14
|
+
```
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
|
18
|
+
```sh
|
19
|
+
$ bundle
|
20
|
+
```
|
21
|
+
|
22
|
+
Or install it yourself as:
|
23
|
+
|
24
|
+
```sh
|
25
|
+
$ gem install wafoo
|
26
|
+
```
|
27
|
+
|
28
|
+
## 準備
|
29
|
+
|
30
|
+
とりあえずは, direnv と組み合わせて利用することを想定しており, AWS のクレデンシャル情報は .envrc に記載して下さい.
|
31
|
+
|
32
|
+
```sh
|
33
|
+
export AWS_PROFILE=your-profile
|
34
|
+
export AWS_REGION=ap-northeast-1
|
35
|
+
```
|
36
|
+
|
37
|
+
## Getting Started
|
38
|
+
|
39
|
+
### Step 1: Listing IPSets
|
40
|
+
|
41
|
+
```sh
|
42
|
+
$ bundle exec wafoo list
|
43
|
+
```
|
44
|
+
|
45
|
+
### Step 2: Export IPSets details
|
46
|
+
|
47
|
+
```sh
|
48
|
+
$ bundle exec wafoo export --ip-set-id=${IPSet ID}
|
49
|
+
```
|
50
|
+
|
51
|
+
The IP list is exported to the current directory. (The file name is IPSet ID.)
|
52
|
+
|
53
|
+
### Step 3: Modify IPSets details
|
54
|
+
|
55
|
+
```sh
|
56
|
+
$ vim ${IPSet ID}
|
57
|
+
```
|
58
|
+
|
59
|
+
### Step 4: Check IP list
|
60
|
+
|
61
|
+
Check the IP list before applying.
|
62
|
+
|
63
|
+
```sh
|
64
|
+
$ bundle exec wafoo apply --ip-set-id=${IPSet ID} --dry-run
|
65
|
+
```
|
66
|
+
|
67
|
+
### Step 5: Apply IP list
|
68
|
+
|
69
|
+
```sh
|
70
|
+
$ bundle exec wafoo apply --ip-set-id=${IPSet ID}
|
71
|
+
```
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'wafoo'
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require 'pry'
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require 'irb'
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
data/exe/wafoo
ADDED
data/lib/wafoo.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'aws-sdk'
|
3
|
+
require 'awsecrets'
|
4
|
+
require 'diffy'
|
5
|
+
require 'netaddr'
|
6
|
+
require 'terminal-table'
|
7
|
+
|
8
|
+
require 'wafoo/version'
|
9
|
+
require 'wafoo/cli'
|
10
|
+
require 'wafoo/helper'
|
11
|
+
require 'wafoo/run'
|
12
|
+
|
13
|
+
module Wafoo
|
14
|
+
# Your code goes here...
|
15
|
+
end
|
data/lib/wafoo/cli.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'wafoo'
|
2
|
+
|
3
|
+
module Wafoo
|
4
|
+
class CLI < Thor
|
5
|
+
default_command :version
|
6
|
+
class_option :profile
|
7
|
+
class_option :region
|
8
|
+
|
9
|
+
desc 'version', 'Print version number'
|
10
|
+
def version
|
11
|
+
puts Wafoo::VERSION
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'list', 'Print IPSet list'
|
15
|
+
option :cloudfront, type: :boolean, desc: 'Specify the option when the target is CloudFront.'
|
16
|
+
def list
|
17
|
+
wafoo = Wafoo::Run.new(options)
|
18
|
+
wafoo.list_ipsets
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'export', 'Export IP address list of specified IPSet ID'
|
22
|
+
option :ip_set_id, type: :string, aliases: '-i', desc: 'Specify IPset ID.'
|
23
|
+
option :regional, type: :boolean, default: true, desc: 'Specify the option when the target is CloudFront.'
|
24
|
+
def export
|
25
|
+
wafoo = Wafoo::Run.new(options)
|
26
|
+
wafoo.export_ipsets(options[:ip_set_id])
|
27
|
+
end
|
28
|
+
|
29
|
+
desc 'apply', 'Apply the specified IPSet ID'
|
30
|
+
option :ip_set_id, type: :string, aliases: '-i', desc: 'Specify IPset ID.'
|
31
|
+
option :dry_run, type: :boolean, aliases: '-d', desc: 'Dryrun.'
|
32
|
+
option :regional, type: :boolean, default: true, desc: 'Specify the option when the target is CloudFront.'
|
33
|
+
def apply
|
34
|
+
wafoo = Wafoo::Run.new(options)
|
35
|
+
wafoo.update_ipsets(options[:ip_set_id], options[:dry_run])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
data/lib/wafoo/helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Wafoo
|
2
|
+
module Helper
|
3
|
+
def output_table(ipsets_list)
|
4
|
+
table = Terminal::Table.new(:headings => ['Type', 'IPSets ID', 'Name'],
|
5
|
+
:rows => ipsets_list)
|
6
|
+
puts table
|
7
|
+
end
|
8
|
+
|
9
|
+
def added_print(message)
|
10
|
+
"\e[32m" + message + "\e[0m"
|
11
|
+
end
|
12
|
+
|
13
|
+
def removed_print(message)
|
14
|
+
"\e[31m" + message + "\e[0m"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/wafoo/run.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
require 'wafoo'
|
2
|
+
|
3
|
+
module Wafoo
|
4
|
+
class Run
|
5
|
+
include Wafoo::Helper
|
6
|
+
|
7
|
+
def initialize(options = nil)
|
8
|
+
@waf_regional = Aws::WAFRegional::Client.new
|
9
|
+
@waf = Aws::WAF::Client.new
|
10
|
+
@regional = options[:regional] unless options.nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
def read_ipsets_from_api(ip_set_id)
|
14
|
+
waf = @regional ? @waf_regional : @waf
|
15
|
+
resp = waf.get_ip_set({
|
16
|
+
ip_set_id: ip_set_id
|
17
|
+
})
|
18
|
+
ipsets = []
|
19
|
+
sorted_ipsets = resp.ip_set.ip_set_descriptors.sort {|a,b| a[:value] <=> b[:value]}
|
20
|
+
sorted_ipsets.each do |ipset|
|
21
|
+
ipsets << ipset.value
|
22
|
+
end
|
23
|
+
|
24
|
+
ipsets
|
25
|
+
end
|
26
|
+
|
27
|
+
def read_ipsets_from_file(ip_set_id)
|
28
|
+
ipsets = []
|
29
|
+
File.open(ip_set_id, 'r') do |file|
|
30
|
+
file.read.split("\n").each do |ipset|
|
31
|
+
ipsets << ipset
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
ipsets.sort
|
36
|
+
end
|
37
|
+
|
38
|
+
def list_ipsets
|
39
|
+
ip_sets = []
|
40
|
+
params = {}
|
41
|
+
[ @waf_regional, @waf ].each do |w|
|
42
|
+
loop do
|
43
|
+
res = w.list_ip_sets(params)
|
44
|
+
res.ip_sets.each do |set|
|
45
|
+
ipset = []
|
46
|
+
ipset << w.class.to_s.split('::')[1]
|
47
|
+
ipset << set.ip_set_id
|
48
|
+
ipset << set.name
|
49
|
+
ip_sets << ipset
|
50
|
+
end
|
51
|
+
break if res.next_marker.nil?
|
52
|
+
params[:next_marker] = res.next_marker
|
53
|
+
end
|
54
|
+
end
|
55
|
+
output_table(ip_sets)
|
56
|
+
end
|
57
|
+
|
58
|
+
def export_ipsets(ip_set_id)
|
59
|
+
ipsets = read_ipsets_from_api(ip_set_id)
|
60
|
+
ipsets.sort.each { |ipset| puts ipset }
|
61
|
+
File.open(ip_set_id, 'w') do |f|
|
62
|
+
ipsets.sort.each { |ipset| f.puts(ipset) }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def apply_ipsets(ipsets, ip_set_id)
|
67
|
+
waf = @regional ? @waf_regional : @waf
|
68
|
+
change_token = waf.get_change_token.change_token
|
69
|
+
resp = waf.update_ip_set(
|
70
|
+
ip_set_id: ip_set_id,
|
71
|
+
change_token: change_token,
|
72
|
+
updates: ipsets
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
76
|
+
def split_cidr(ipset)
|
77
|
+
addr = NetAddr::CIDR.create(ipset)
|
78
|
+
addr.enumerate
|
79
|
+
end
|
80
|
+
|
81
|
+
def generate_delete_hash(ipset)
|
82
|
+
ipset.slice!(0)
|
83
|
+
h = {
|
84
|
+
action: 'DELETE',
|
85
|
+
ip_set_descriptor: {
|
86
|
+
type: 'IPV4',
|
87
|
+
value: ipset
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
unless %w(8 16 24 33).include?(ipset.split('/').last)
|
92
|
+
ips = split_cidr(ipset)
|
93
|
+
ipsets_array = []
|
94
|
+
ips.each do |ip|
|
95
|
+
ipsets_array << {
|
96
|
+
action: 'DELETE',
|
97
|
+
ip_set_descriptor: {
|
98
|
+
type: 'IPV4',
|
99
|
+
value: ip + '/32'
|
100
|
+
}
|
101
|
+
}
|
102
|
+
end
|
103
|
+
return ipsets_array
|
104
|
+
end
|
105
|
+
|
106
|
+
ipsets_hash = {
|
107
|
+
action: 'DELETE',
|
108
|
+
ip_set_descriptor: {
|
109
|
+
type: 'IPV4',
|
110
|
+
value: ipset
|
111
|
+
}
|
112
|
+
}
|
113
|
+
ipsets_hash
|
114
|
+
end
|
115
|
+
|
116
|
+
def generate_insert_hash(ipset)
|
117
|
+
ipset.slice!(0)
|
118
|
+
unless %w(8 16 24 33).include?(ipset.split('/').last)
|
119
|
+
ips = split_cidr(ipset)
|
120
|
+
ipsets_array = []
|
121
|
+
ips.each do |ip|
|
122
|
+
ipsets_array << {
|
123
|
+
action: 'INSERT',
|
124
|
+
ip_set_descriptor: {
|
125
|
+
type: 'IPV4',
|
126
|
+
value: ip + '/32'
|
127
|
+
}
|
128
|
+
}
|
129
|
+
end
|
130
|
+
return ipsets_array
|
131
|
+
end
|
132
|
+
|
133
|
+
ipsets_hash = {
|
134
|
+
action: 'INSERT',
|
135
|
+
ip_set_descriptor: {
|
136
|
+
type: 'IPV4',
|
137
|
+
value: ipset
|
138
|
+
}
|
139
|
+
}
|
140
|
+
ipsets_hash
|
141
|
+
end
|
142
|
+
|
143
|
+
def update_ipsets(ip_set_id, dry_run)
|
144
|
+
_old = read_ipsets_from_api(ip_set_id).join("\n")
|
145
|
+
_new = read_ipsets_from_file(ip_set_id).join("\n")
|
146
|
+
ipsets = []
|
147
|
+
Diffy::Diff.new(_old, _new).each do |line|
|
148
|
+
case line
|
149
|
+
when /^\+/ then
|
150
|
+
puts added_print(line.chomp)
|
151
|
+
ipsets << generate_insert_hash(line.chomp)
|
152
|
+
when /^-/ then
|
153
|
+
puts removed_print(line.chomp)
|
154
|
+
ipsets << generate_delete_hash(line.chomp)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
if dry_run == nil and ipsets.length > 0 then
|
159
|
+
apply_ipsets(ipsets.flatten, ip_set_id)
|
160
|
+
export_ipsets(ip_set_id)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
data/wafoo.gemspec
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'wafoo/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'wafoo'
|
8
|
+
spec.version = Wafoo::VERSION
|
9
|
+
spec.authors = ['inokappa']
|
10
|
+
spec.email = ['inokara at gmail.com']
|
11
|
+
|
12
|
+
spec.summary = %q{Small tool to manipulate AWS WAF IPSets.}
|
13
|
+
spec.description = %q{Small tool to manipulate AWS WAF IPSets.}
|
14
|
+
spec.homepage = 'https://github.com/inokappa/wafoo'
|
15
|
+
|
16
|
+
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
17
|
+
# delete this section to allow pushing this gem to any host.
|
18
|
+
# if spec.respond_to?(:metadata)
|
19
|
+
# spec.metadata['allowed_push_host'] = 'TODO: Set to 'http://mygemserver.com''
|
20
|
+
# else
|
21
|
+
# raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
22
|
+
# end
|
23
|
+
|
24
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
25
|
+
spec.bindir = 'exe'
|
26
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
|
+
spec.require_paths = ['lib']
|
28
|
+
|
29
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
30
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
31
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
32
|
+
spec.add_development_dependency "octorelease"
|
33
|
+
|
34
|
+
spec.add_dependency 'thor'
|
35
|
+
spec.add_dependency 'aws-sdk'
|
36
|
+
spec.add_dependency 'awsecrets'
|
37
|
+
spec.add_dependency 'diffy'
|
38
|
+
spec.add_dependency 'netaddr', '1.5.1'
|
39
|
+
spec.add_dependency 'terminal-table'
|
40
|
+
|
41
|
+
end
|
metadata
ADDED
@@ -0,0 +1,197 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wafoo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- inokappa
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-11-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: octorelease
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: thor
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: aws-sdk
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: awsecrets
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: diffy
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: netaddr
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 1.5.1
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 1.5.1
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: terminal-table
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
description: Small tool to manipulate AWS WAF IPSets.
|
154
|
+
email:
|
155
|
+
- inokara at gmail.com
|
156
|
+
executables:
|
157
|
+
- wafoo
|
158
|
+
extensions: []
|
159
|
+
extra_rdoc_files: []
|
160
|
+
files:
|
161
|
+
- ".gitignore"
|
162
|
+
- Gemfile
|
163
|
+
- README.md
|
164
|
+
- Rakefile
|
165
|
+
- bin/console
|
166
|
+
- bin/setup
|
167
|
+
- exe/wafoo
|
168
|
+
- lib/wafoo.rb
|
169
|
+
- lib/wafoo/cli.rb
|
170
|
+
- lib/wafoo/helper.rb
|
171
|
+
- lib/wafoo/run.rb
|
172
|
+
- lib/wafoo/version.rb
|
173
|
+
- wafoo.gemspec
|
174
|
+
homepage: https://github.com/inokappa/wafoo
|
175
|
+
licenses: []
|
176
|
+
metadata: {}
|
177
|
+
post_install_message:
|
178
|
+
rdoc_options: []
|
179
|
+
require_paths:
|
180
|
+
- lib
|
181
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
182
|
+
requirements:
|
183
|
+
- - ">="
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: '0'
|
186
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
|
+
requirements:
|
188
|
+
- - ">="
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: '0'
|
191
|
+
requirements: []
|
192
|
+
rubyforge_project:
|
193
|
+
rubygems_version: 2.7.6
|
194
|
+
signing_key:
|
195
|
+
specification_version: 4
|
196
|
+
summary: Small tool to manipulate AWS WAF IPSets.
|
197
|
+
test_files: []
|