banacle 0.2.3 → 0.2.4
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 +4 -4
- data/Gemfile.lock +12 -11
- data/README.md +4 -2
- data/exe/cli +5 -0
- data/lib/banacle/aws_wrapper/nacl.rb +2 -2
- data/lib/banacle/cli.rb +114 -0
- data/lib/banacle/interactive_message/parser.rb +2 -10
- data/lib/banacle/slash_command/command.rb +17 -1
- data/lib/banacle/slash_command/parser.rb +4 -3
- data/lib/banacle/slash_command/renderer.rb +1 -3
- data/lib/banacle/version.rb +1 -1
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1543019743d70530ef2330bceb9ea597fa75d87447a2cd6a094221fb8f82123f
|
4
|
+
data.tar.gz: ad9c0cb85d7599fc902c152a98157ebe8f4d80d40e09c13ab39bf81d9a54c6a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba7fc79a90cedba53edf12f195d4dd3e5ebbde15e4f97b8db50ba6872da3a17f469deff93004b112f1895c90766319645145d0d0288c25635641c5e1d4353539
|
7
|
+
data.tar.gz: 87caa3ccf655e65159121c3a321a349811d15a31a9f15d0944de7cadcbee9e489d2bc5e87880151b23c5fbdd07fcd49822ca78ac9db53ef0c08ad9a4c0f8f959
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
banacle (0.2.
|
4
|
+
banacle (0.2.4)
|
5
5
|
aws-sdk-ec2
|
6
6
|
sinatra
|
7
7
|
unicorn
|
@@ -9,17 +9,18 @@ PATH
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
|
-
aws-eventstream (1.0.
|
13
|
-
aws-partitions (1.
|
14
|
-
aws-sdk-core (3.
|
15
|
-
aws-eventstream (~> 1.0)
|
12
|
+
aws-eventstream (1.0.3)
|
13
|
+
aws-partitions (1.184.0)
|
14
|
+
aws-sdk-core (3.59.0)
|
15
|
+
aws-eventstream (~> 1.0, >= 1.0.2)
|
16
16
|
aws-partitions (~> 1.0)
|
17
|
-
aws-sigv4 (~> 1.
|
17
|
+
aws-sigv4 (~> 1.1)
|
18
18
|
jmespath (~> 1.0)
|
19
|
-
aws-sdk-ec2 (1.
|
20
|
-
aws-sdk-core (~> 3, >= 3.
|
21
|
-
aws-sigv4 (~> 1.
|
22
|
-
aws-sigv4 (1.0
|
19
|
+
aws-sdk-ec2 (1.99.0)
|
20
|
+
aws-sdk-core (~> 3, >= 3.58.0)
|
21
|
+
aws-sigv4 (~> 1.1)
|
22
|
+
aws-sigv4 (1.1.0)
|
23
|
+
aws-eventstream (~> 1.0, >= 1.0.2)
|
23
24
|
backports (3.11.4)
|
24
25
|
coderay (1.1.2)
|
25
26
|
diff-lcs (1.3)
|
@@ -62,7 +63,7 @@ GEM
|
|
62
63
|
sinatra (= 2.0.5)
|
63
64
|
tilt (>= 1.3, < 3)
|
64
65
|
tilt (2.0.9)
|
65
|
-
unicorn (5.
|
66
|
+
unicorn (5.5.1)
|
66
67
|
kgio (~> 2.6)
|
67
68
|
raindrops (~> 0.7)
|
68
69
|
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Banacle: Create or delete DENY NACL entries on AWS VPC as ChatOps (Slack Slash Command)
|
1
|
+
# Banacle: Create or delete DENY NACL ingress entries on AWS VPC as ChatOps (Slack Slash Command)
|
2
2
|
|
3
3
|
## Installation
|
4
4
|
|
@@ -35,7 +35,9 @@ See example directory which implements a customized authentication feature for d
|
|
35
35
|
|
36
36
|
## Example: ban 1.2.3.4 from my VPC
|
37
37
|
|
38
|
-
|
38
|
+
Note: Use documentation block for testing. https://tools.ietf.org/html/rfc5737
|
39
|
+
|
40
|
+
Execute a command that create a DENY NACL ingress entry for 1.2.3.4 on a VPC named "test" in ap-northeast-1.
|
39
41
|
|
40
42
|

|
41
43
|
|
data/exe/cli
ADDED
@@ -34,7 +34,7 @@ module Banacle
|
|
34
34
|
begin
|
35
35
|
rule_number = create_network_acl_ingress_entry(cidr_block)
|
36
36
|
Result.new(cidr_block: cidr_block, status: true, rule_number: rule_number)
|
37
|
-
rescue AwsWrapper::Error => e
|
37
|
+
rescue AwsWrapper::Error, Aws::EC2::Errors::ServiceError => e
|
38
38
|
Result.new(cidr_block: cidr_block, status: false, error: e)
|
39
39
|
end
|
40
40
|
end
|
@@ -45,7 +45,7 @@ module Banacle
|
|
45
45
|
begin
|
46
46
|
rule_number = delete_network_acl_entry(cidr_block)
|
47
47
|
Result.new(cidr_block: cidr_block, status: true, rule_number: rule_number)
|
48
|
-
rescue AwsWrapper::Error => e
|
48
|
+
rescue AwsWrapper::Error, Aws::EC2::Errors::ServiceError => e
|
49
49
|
Result.new(cidr_block: cidr_block, status: false, error: e)
|
50
50
|
end
|
51
51
|
end
|
data/lib/banacle/cli.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'banacle/slash_command/builder'
|
2
|
+
require 'banacle/slash_command/parser'
|
3
|
+
|
4
|
+
module Banacle
|
5
|
+
class Cli
|
6
|
+
SLASH_ACTION = 'slash'.freeze
|
7
|
+
INTERACTIVE_ACTION = 'interactive'.freeze
|
8
|
+
HELP_ACTION = 'help'.freeze
|
9
|
+
EXIT_ACTION = 'exit'.freeze
|
10
|
+
|
11
|
+
def self.start
|
12
|
+
new.start
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@store = MemoryStore.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def start
|
20
|
+
main_loop
|
21
|
+
end
|
22
|
+
|
23
|
+
def main_loop
|
24
|
+
loop do
|
25
|
+
print '> '
|
26
|
+
input = STDIN.gets.chomp
|
27
|
+
args = input.split(" ")
|
28
|
+
|
29
|
+
case args.first
|
30
|
+
when SLASH_ACTION
|
31
|
+
handle_slash_action(args[1..-1].join(" "))
|
32
|
+
when INTERACTIVE_ACTION
|
33
|
+
handle_interactive_action(args[1..-1].join(" "))
|
34
|
+
when EXIT_ACTION
|
35
|
+
exit 0
|
36
|
+
when HELP_ACTION
|
37
|
+
print_help
|
38
|
+
else
|
39
|
+
print_help
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def print_help
|
45
|
+
puts <<-EOS
|
46
|
+
#{SLASH_ACTION} #{SlashCommand::Parser.help}
|
47
|
+
execute slash command
|
48
|
+
#{INTERACTIVE_ACTION} key
|
49
|
+
approve slash command
|
50
|
+
#{HELP_ACTION}
|
51
|
+
print help
|
52
|
+
EOS
|
53
|
+
end
|
54
|
+
|
55
|
+
def handle_slash_action(input)
|
56
|
+
execute_slash_command(input)
|
57
|
+
end
|
58
|
+
|
59
|
+
def execute_slash_command(input)
|
60
|
+
begin
|
61
|
+
command = SlashCommand::Parser.parse(input)
|
62
|
+
i = @store.put(command)
|
63
|
+
puts "stored (key=#{i}, command=#{command.to_h})"
|
64
|
+
rescue SlashCommand::Error => e
|
65
|
+
puts e.message
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def handle_interactive_action(input)
|
70
|
+
k = input.split(" ").first.to_i
|
71
|
+
command = @store.get(k)
|
72
|
+
unless command
|
73
|
+
puts "key=#{k} not found"
|
74
|
+
return
|
75
|
+
end
|
76
|
+
execute_interactive_message(command)
|
77
|
+
end
|
78
|
+
|
79
|
+
def execute_interactive_message(command)
|
80
|
+
puts command.execute
|
81
|
+
end
|
82
|
+
|
83
|
+
class MemoryStore
|
84
|
+
def initialize
|
85
|
+
@store = {}
|
86
|
+
@max_key = 0
|
87
|
+
end
|
88
|
+
|
89
|
+
def get(k)
|
90
|
+
@store[k]
|
91
|
+
end
|
92
|
+
|
93
|
+
def put(v)
|
94
|
+
put_with_key(k: nil, v: v)
|
95
|
+
end
|
96
|
+
|
97
|
+
def put_with_key(k:, v:)
|
98
|
+
if k
|
99
|
+
@store[k] = v
|
100
|
+
k
|
101
|
+
else
|
102
|
+
k = @max_key
|
103
|
+
@store[k] = v
|
104
|
+
@max_key += 1
|
105
|
+
k
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def delete(k)
|
110
|
+
@store.delete(k)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -8,16 +8,8 @@ module Banacle
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def parse(payload)
|
11
|
-
|
12
|
-
|
13
|
-
original_text.match(command_json_regex)[1].strip, symbolize_names: true,
|
14
|
-
)
|
15
|
-
command = SlashCommand::Command.new(**original_json)
|
16
|
-
end
|
17
|
-
|
18
|
-
# TODO: sync slash_command/renderer
|
19
|
-
def command_json_regex
|
20
|
-
/```([^`]+)```/.freeze
|
11
|
+
original_message = payload["original_message"]["text"]
|
12
|
+
SlashCommand::Command.new_from_original_message(original_message)
|
21
13
|
end
|
22
14
|
end
|
23
15
|
end
|
@@ -6,9 +6,17 @@ module Banacle
|
|
6
6
|
class Command
|
7
7
|
CREATE_ACTION = 'create'.freeze
|
8
8
|
DELETE_ACTION = 'delete'.freeze
|
9
|
-
|
10
9
|
PERMITTED_ACTIONS = [CREATE_ACTION, DELETE_ACTION].freeze
|
11
10
|
|
11
|
+
CODE_BLOCK_JSON_REGEX = /```([^`]+)```/.freeze
|
12
|
+
|
13
|
+
def self.new_from_original_message(message)
|
14
|
+
original_json = JSON.parse(
|
15
|
+
message.match(CODE_BLOCK_JSON_REGEX)[1].strip, symbolize_names: true,
|
16
|
+
)
|
17
|
+
new(**original_json)
|
18
|
+
end
|
19
|
+
|
12
20
|
def initialize(action:, region:, vpc_id:, cidr_blocks:)
|
13
21
|
@action = action
|
14
22
|
@region = region
|
@@ -29,6 +37,14 @@ module Banacle
|
|
29
37
|
end
|
30
38
|
end
|
31
39
|
|
40
|
+
def to_code_block
|
41
|
+
<<-EOS
|
42
|
+
```
|
43
|
+
#{JSON.pretty_generate(self.to_h)}
|
44
|
+
```
|
45
|
+
EOS
|
46
|
+
end
|
47
|
+
|
32
48
|
def to_h
|
33
49
|
{
|
34
50
|
action: action,
|
@@ -10,9 +10,10 @@ module Banacle
|
|
10
10
|
new.parse(text)
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
def self.help
|
14
|
+
'(create|delete) [region] [vpc_id or vpc_name] [cidr_block1,cidr_block2,...]'
|
15
|
+
end
|
16
|
+
|
16
17
|
def parse(text)
|
17
18
|
elems = text.split(" ")
|
18
19
|
|
@@ -21,9 +21,7 @@ module Banacle
|
|
21
21
|
def render_approval_request
|
22
22
|
text = <<-EOS
|
23
23
|
<@#{user_id}> wants to *#{command.action} NACL DENY entry* under the following conditions:
|
24
|
-
|
25
|
-
#{JSON.pretty_generate(command.to_h)}
|
26
|
-
```
|
24
|
+
#{command.to_code_block}
|
27
25
|
EOS
|
28
26
|
|
29
27
|
Slack::Response.new(
|
data/lib/banacle/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: banacle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Takuya Kosugiyama
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -126,7 +126,8 @@ description: Create or delete DENY NACL entries on AWS VPC as ChatOps (Slack Sla
|
|
126
126
|
Command)
|
127
127
|
email:
|
128
128
|
- re@itkq.jp
|
129
|
-
executables:
|
129
|
+
executables:
|
130
|
+
- cli
|
130
131
|
extensions: []
|
131
132
|
extra_rdoc_files: []
|
132
133
|
files:
|
@@ -149,11 +150,13 @@ files:
|
|
149
150
|
- example/Gemfile.lock
|
150
151
|
- example/README.md
|
151
152
|
- example/config.ru
|
153
|
+
- exe/cli
|
152
154
|
- lib/banacle.rb
|
153
155
|
- lib/banacle/app.rb
|
154
156
|
- lib/banacle/aws_wrapper/error.rb
|
155
157
|
- lib/banacle/aws_wrapper/nacl.rb
|
156
158
|
- lib/banacle/aws_wrapper/vpc.rb
|
159
|
+
- lib/banacle/cli.rb
|
157
160
|
- lib/banacle/config.rb
|
158
161
|
- lib/banacle/interactive_message/authenticator.rb
|
159
162
|
- lib/banacle/interactive_message/handler.rb
|
@@ -189,8 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
189
192
|
- !ruby/object:Gem::Version
|
190
193
|
version: '0'
|
191
194
|
requirements: []
|
192
|
-
|
193
|
-
rubygems_version: 2.7.6
|
195
|
+
rubygems_version: 3.0.4
|
194
196
|
signing_key:
|
195
197
|
specification_version: 4
|
196
198
|
summary: Create or delete DENY NACL entries on AWS VPC as ChatOps (Slack Slash Command)
|