bim 0.1.2 → 1.0.0
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/.rubocop.yml +3 -1
- data/.travis.yml +7 -0
- data/README.md +2 -0
- data/completions/bim.bash +2 -2
- data/lib/bim/action/fw.rb +71 -0
- data/lib/bim/action/meta.rb +12 -18
- data/lib/bim/action/node.rb +41 -0
- data/lib/bim/action/pool.rb +73 -0
- data/lib/bim/action/ssl.rb +12 -20
- data/lib/bim/action/sync.rb +1 -2
- data/lib/bim/action/vs.rb +31 -15
- data/lib/bim/action.rb +3 -0
- data/lib/bim/cli.rb +6 -11
- data/lib/bim/subcommands/fw.rb +22 -0
- data/lib/bim/subcommands/meta.rb +2 -2
- data/lib/bim/subcommands/node.rb +38 -0
- data/lib/bim/subcommands/pool.rb +46 -0
- data/lib/bim/subcommands/ssl.rb +2 -2
- data/lib/bim/subcommands/sync.rb +3 -3
- data/lib/bim/subcommands/vs.rb +37 -5
- data/lib/bim/subcommands.rb +3 -0
- data/lib/bim/util.rb +53 -0
- data/lib/bim/version.rb +1 -1
- data/lib/bim.rb +4 -3
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c6f9989b1a73b84f166b102c06b20f48bffa922f
|
4
|
+
data.tar.gz: 485d78106d2ed26cab37cfa6cb4e1cfb9131bd23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e378820b2071376e3a5353134c9ed16e7f6d1d0c68adb6b5b240bb6434051fea7f1ae0ca4d6e93bbbf51bd0225c62cc4b17d65f658f6fadc1f983d735c6a0d9
|
7
|
+
data.tar.gz: 0a8e22881900de573bf0969731351c25d053c431be7af6a1b836083afd2b606f715fff8c74120093cd6fcc7d98bc32baec6a4faed9275fe987dbfc0d41414fe1
|
data/.rubocop.yml
CHANGED
data/.travis.yml
ADDED
data/README.md
CHANGED
data/completions/bim.bash
CHANGED
@@ -4,10 +4,10 @@ _bim() {
|
|
4
4
|
_get_comp_words_by_ref -n : cur prev
|
5
5
|
|
6
6
|
if [ "$COMP_CWORD" -eq 1 ]; then
|
7
|
-
COMPREPLY=( $(compgen -W "$(bim help | tail -n +2 | awk '{ print $2}')" -- "$cur") )
|
7
|
+
COMPREPLY=( $(compgen -W "$(./bin/bim help | tail -n +2 | awk '{ print $2}')" -- "$cur") )
|
8
8
|
elif [ $COMP_CWORD -eq 2 ]; then
|
9
9
|
if [ $prev = "ssl" ] || [ $prev = "meta" ] || [ $prev = "sync" ]; then
|
10
|
-
COMPREPLY=( $(compgen -W "$(bim $prev help | tail -n +2 | awk '{ print $3}')" -- $cur) )
|
10
|
+
COMPREPLY=( $(compgen -W "$(./bin/bim $prev help | tail -n +2 | awk '{ print $3}')" -- $cur) )
|
11
11
|
fi
|
12
12
|
fi
|
13
13
|
}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Bim
|
2
|
+
module Action
|
3
|
+
# Fw class uses by Bim::Subcommands::Fw
|
4
|
+
class Fw
|
5
|
+
extend Bim::Util
|
6
|
+
|
7
|
+
FW_PATH = '/mgmt/tm/security/firewall/policy'.freeze
|
8
|
+
FW_URI = URI.join(Bim::BASE_URL, Bim::Action::Fw::FW_PATH)
|
9
|
+
|
10
|
+
DETAIL_CONF = {
|
11
|
+
name: 'firewall_policy',
|
12
|
+
items: false,
|
13
|
+
attrs: %w[name fullPath],
|
14
|
+
under_key: 'rulesReference',
|
15
|
+
under_layer: {
|
16
|
+
name: 'rules_reference',
|
17
|
+
items: true,
|
18
|
+
attrs: %w[name description ipProtocol ruleList],
|
19
|
+
under_key: 'ruleListReference',
|
20
|
+
under_layer: {
|
21
|
+
name: 'rule_list_reference',
|
22
|
+
items: false,
|
23
|
+
attrs: %w[name fullPath],
|
24
|
+
under_key: 'rulesReference',
|
25
|
+
under_layer: {
|
26
|
+
name: 'rules_reference',
|
27
|
+
items: true,
|
28
|
+
attrs: %w[name description destination source]
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
}.freeze
|
33
|
+
|
34
|
+
class << self
|
35
|
+
def ls
|
36
|
+
map(FW_URI) do |item|
|
37
|
+
{ 'item' => item['name'], 'fullPath' => item['fullPath'] }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def detail(name)
|
42
|
+
start_uri = URI(sub_localhost(specify_link_by_name(FW_URI, name)))
|
43
|
+
detail_depth(start_uri, DETAIL_CONF).to_json
|
44
|
+
end
|
45
|
+
|
46
|
+
def detail_depth(uri, conf)
|
47
|
+
datas = JSON.parse(get_body(uri))
|
48
|
+
if conf[:items]
|
49
|
+
datas['items'].map do |data|
|
50
|
+
detail_proc.call(data, conf, true)
|
51
|
+
end
|
52
|
+
else
|
53
|
+
detail_proc.call(datas, conf)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def detail_proc
|
58
|
+
proc do |data, conf, map = false|
|
59
|
+
d = {}
|
60
|
+
conf[:attrs].each { |attr| d[attr] = data[attr] }
|
61
|
+
|
62
|
+
(map ? (next d) : (return d)) unless data.key?(conf[:under_key])
|
63
|
+
next_uri = URI(sub_localhost(data[conf[:under_key]]['link']))
|
64
|
+
d[conf[:under_key]] = detail_depth(next_uri, conf[:under_layer])
|
65
|
+
d
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/bim/action/meta.rb
CHANGED
@@ -9,27 +9,21 @@ module Bim
|
|
9
9
|
|
10
10
|
class << self
|
11
11
|
def actives
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
.inject([]) do |infos, item|
|
17
|
-
infos.push(hostname: item['hostname'], ip: item['managementIp'])
|
18
|
-
end.to_json
|
12
|
+
cond = proc { |item| item['failoverState'] == 'active' }
|
13
|
+
select_map(URI.join(Bim::BASE_URL, Bim::Action::Meta::DEVICE_PATH), cond) do |item|
|
14
|
+
{ hostname: item['hostname'], ip: item['managementIp'] }
|
15
|
+
end
|
19
16
|
end
|
20
17
|
|
21
18
|
def device_groups
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
infos.push(name: item['name'], members: m)
|
32
|
-
end.to_json
|
19
|
+
cond = proc { |item| item['type'] == 'sync-failover' }
|
20
|
+
select_map(URI.join(Bim::BASE_URL, Bim::Action::Meta::DEVICE_GROUP_PATH), cond) do |item|
|
21
|
+
m = if item&.dig('devicesReference')&.dig('link')
|
22
|
+
uri_r = URI.parse(item['devicesReference']['link'].sub('localhost', BIGIP_HOST))
|
23
|
+
JSON.parse(get_body(uri_r))['items'].map { |item_in| item_in['name'] }
|
24
|
+
end
|
25
|
+
{ name: item['name'], members: m }
|
26
|
+
end
|
33
27
|
end
|
34
28
|
end
|
35
29
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Bim
|
2
|
+
module Action
|
3
|
+
# Node class uses by Bim::Subcommands::Node
|
4
|
+
class Node
|
5
|
+
extend Bim::Util
|
6
|
+
|
7
|
+
NODE_PATH = '/mgmt/tm/ltm/node'.freeze
|
8
|
+
NODE_URI = URI.join(Bim::BASE_URL, Bim::Action::Node::NODE_PATH)
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def ls
|
12
|
+
map(NODE_URI) do |item|
|
13
|
+
{ name: item['name'], address: item['address'] }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def detail(name)
|
18
|
+
specify(NODE_URI) { |d| d['name'] == name }
|
19
|
+
end
|
20
|
+
|
21
|
+
def create(name, address)
|
22
|
+
post(
|
23
|
+
NODE_URI,
|
24
|
+
{ 'name' => name, 'address' => address }.to_json
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def delete(name)
|
29
|
+
self_link = JSON.parse(detail(name))&.fetch('selfLink')
|
30
|
+
return "not found #{name} node" if self_link.nil?
|
31
|
+
return "cancel delete #{name} node" unless yes_or_no?("you want to delete #{name} node? [y|n]")
|
32
|
+
|
33
|
+
uri = URI(self_link.sub('localhost', Bim::BIGIP_HOST))
|
34
|
+
req = request(uri, Bim::AUTH, 'application/json', 'DELETE')
|
35
|
+
msg = http(uri).request(req).body
|
36
|
+
msg.empty? ? "success delete #{name} node" : msg
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Bim
|
2
|
+
module Action
|
3
|
+
# Node class uses by Bim::Subcommands::Node
|
4
|
+
class Pool
|
5
|
+
extend Bim::Util
|
6
|
+
|
7
|
+
POOL_PATH = '/mgmt/tm/ltm/pool'.freeze
|
8
|
+
POOL_URI = URI.join(Bim::BASE_URL, Bim::Action::Pool::POOL_PATH)
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def ls
|
12
|
+
map(POOL_URI) do |item|
|
13
|
+
r = { name: item['name'] }
|
14
|
+
r['members'] = JSON.parse(map(URI(sub_localhost(item['membersReference']['link']))) do |in_item|
|
15
|
+
{ name: in_item['name'], address: in_item['address'] }
|
16
|
+
end)
|
17
|
+
r
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def create(name, members = nil)
|
22
|
+
j = members ? { 'name' => name, 'members' => JSON.parse(members) } : { 'name' => name }
|
23
|
+
post(POOL_URI, j.to_json)
|
24
|
+
end
|
25
|
+
|
26
|
+
def members(name)
|
27
|
+
cond = proc { |item| name == item['name'] }
|
28
|
+
select_map(POOL_URI, cond) do |item|
|
29
|
+
JSON.parse(map(URI(sub_localhost(item['membersReference']['link']))) do |in_item|
|
30
|
+
{ name: in_item['name'], address: in_item['address'] }
|
31
|
+
end)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def drop_members(name, members)
|
36
|
+
members_link = specify_link(POOL_URI, %w[membersReference link]) do |item|
|
37
|
+
item['name'] == name
|
38
|
+
end
|
39
|
+
|
40
|
+
drop_members = []
|
41
|
+
|
42
|
+
cond = proc { |item| members.include?(item['name']) }
|
43
|
+
JSON.parse(select_map(URI(sub_localhost(members_link)), cond) do |item|
|
44
|
+
{ 'name': item['name'], 'self_link': sub_localhost(item['selfLink']) }
|
45
|
+
end).each do |item|
|
46
|
+
next unless yes_or_no?("drop #{item['name']} from #{name}? [y|n]")
|
47
|
+
uri = URI.parse(item['self_link'])
|
48
|
+
req = request(uri, Bim::AUTH, 'application/json', 'DELETE')
|
49
|
+
drop_members.push(item['name']) if http(uri).request(req).code == '200'
|
50
|
+
end
|
51
|
+
|
52
|
+
{ 'drop_members': drop_members }
|
53
|
+
end
|
54
|
+
|
55
|
+
def add_members(name, members)
|
56
|
+
members_link = specify_link(POOL_URI, %w[membersReference link]) do |item|
|
57
|
+
item['name'] == name
|
58
|
+
end
|
59
|
+
|
60
|
+
add_members = []
|
61
|
+
|
62
|
+
members.each do |member|
|
63
|
+
if post(URI(sub_localhost(members_link)), { 'name': member }.to_json, false).code == '200'
|
64
|
+
add_members.push(member)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
{ 'add_members': add_members }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/bim/action/ssl.rb
CHANGED
@@ -13,33 +13,27 @@ module Bim
|
|
13
13
|
VS_PATH = '/mgmt/tm/ltm/virtual'.freeze
|
14
14
|
CRT_FILES_PATH = '/mgmt/tm/sys/file/sslCert'.freeze
|
15
15
|
CRT_PROFILES_PATH = '/mgmt/tm/ltm/profile/client-ssl'.freeze
|
16
|
+
CRT_FILES_URI = URI.join(Bim::BASE_URL, Bim::Action::SSL::CRT_FILES_PATH)
|
17
|
+
CRT_PROFILES_URI = URI.join(Bim::BASE_URL, Bim::Action::SSL::CRT_PROFILES_PATH)
|
16
18
|
|
17
19
|
class << self
|
18
20
|
def bundles
|
19
|
-
|
20
|
-
|
21
|
-
.
|
22
|
-
|
23
|
-
.map do |item|
|
24
|
-
{ 'name' => item['name'].split('.')[0...-1].join('.') }
|
25
|
-
end.to_json
|
21
|
+
cond = proc { |item| item['isBundle'] == 'true' }
|
22
|
+
select_map(CRT_FILES_URI, cond) do |item|
|
23
|
+
{ 'name' => item['name'].split('.')[0...-1].join('.') }
|
24
|
+
end
|
26
25
|
end
|
27
26
|
|
28
27
|
def profiles
|
29
|
-
|
30
|
-
JSON.parse(get_body(uri))['items'].map do |item|
|
28
|
+
map(CRT_PROFILES_URI) do |item|
|
31
29
|
{ 'name' => item['name'], 'fullPath' => item['fullPath'], 'key' => item['key'], 'chain' => item['chain'] }
|
32
|
-
end
|
30
|
+
end
|
33
31
|
end
|
34
32
|
|
35
33
|
def detail(profile_name)
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
.select { |item| item['name'] == profile_name || item['fullPath'] == profile_name }
|
40
|
-
.map do |item|
|
41
|
-
{ 'name' => item['name'], 'fullPath' => item['fullPath'], 'key' => item['key'], 'chain' => item['chain'] }
|
42
|
-
end.to_json
|
34
|
+
specify(CRT_PROFILES_URI) do |item|
|
35
|
+
item['name'] == profile_name || item['fullPath'] == profile_name
|
36
|
+
end
|
43
37
|
end
|
44
38
|
|
45
39
|
def upload(filepath)
|
@@ -117,9 +111,7 @@ module Bim
|
|
117
111
|
|
118
112
|
def update_profiles(link, names)
|
119
113
|
uri = URI.parse(link.sub('localhost', BIGIP_HOST))
|
120
|
-
|
121
|
-
|
122
|
-
http(uri).request(req)
|
114
|
+
post(uri, { profiles: names }.to_json)
|
123
115
|
end
|
124
116
|
|
125
117
|
def output_msg(vs_name, old_names, new_names)
|
data/lib/bim/action/sync.rb
CHANGED
@@ -14,8 +14,7 @@ module Bim
|
|
14
14
|
return { 'message' => "cancel sync #{BIGIP_HOST} to #{dest}" } unless yes_or_no?(msg)
|
15
15
|
uri = URI.join(Bim::BASE_URL, Bim::Action::Sync::SYNC_PATH)
|
16
16
|
j = { "command": 'run', "utilCmdArgs": "config-sync #{'force-full-load-push ' if overwrite}to-group #{dest}" }
|
17
|
-
|
18
|
-
http(uri).request(req).body
|
17
|
+
post(uri, j.to_json)
|
19
18
|
end
|
20
19
|
|
21
20
|
def state
|
data/lib/bim/action/vs.rb
CHANGED
@@ -4,26 +4,42 @@ module Bim
|
|
4
4
|
class VS
|
5
5
|
extend Bim::Util
|
6
6
|
|
7
|
-
|
7
|
+
VS_PATH = '/mgmt/tm/ltm/virtual'.freeze
|
8
|
+
VS_URI = URI.join(Bim::BASE_URL, Bim::Action::VS::VS_PATH)
|
8
9
|
|
9
10
|
class << self
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
.map do |
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
def ls
|
12
|
+
map(VS_URI) do |item|
|
13
|
+
r = { name: item['name'] }
|
14
|
+
r['profiles'] = JSON.parse(map(URI(sub_localhost(item['profilesReference']['link']))) do |in_item|
|
15
|
+
in_item['fullPath']
|
16
|
+
end)
|
17
|
+
r
|
18
|
+
end
|
17
19
|
end
|
18
20
|
|
19
21
|
def detail(name)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
specify(VS_URI) { |d| d['name'] == name }
|
23
|
+
end
|
24
|
+
|
25
|
+
def update_dnat(name, dnat_addr, port)
|
26
|
+
j = { 'destination' => "#{dnat_addr}:#{port}" }.to_json
|
27
|
+
self_patch(name, VS_URI, j)
|
28
|
+
end
|
29
|
+
|
30
|
+
def update_snat(name, snat_addr, bitmask)
|
31
|
+
j = { 'source' => "#{snat_addr}/#{bitmask}" }.to_json
|
32
|
+
self_patch(name, VS_URI, j)
|
33
|
+
end
|
34
|
+
|
35
|
+
def change_nf(name, nf_name)
|
36
|
+
j = { 'fwEnforcedPolicy' => nf_name }.to_json
|
37
|
+
self_patch(name, VS_URI, j)
|
38
|
+
end
|
39
|
+
|
40
|
+
def change_pool(name, pool_name)
|
41
|
+
j = { 'pool' => pool_name }.to_json
|
42
|
+
self_patch(name, VS_URI, j)
|
27
43
|
end
|
28
44
|
end
|
29
45
|
end
|
data/lib/bim/action.rb
CHANGED
data/lib/bim/cli.rb
CHANGED
@@ -4,16 +4,11 @@ require 'bim/subcommands'
|
|
4
4
|
module Bim
|
5
5
|
# CLI class is import subcommands
|
6
6
|
class CLI < Thor
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
desc 'ssl [Subcommand]', "Subcommands: #{Bim::Subcommands::SSL.instance_methods(false).join(',')}"
|
14
|
-
subcommand 'ssl', Bim::Subcommands::SSL
|
15
|
-
|
16
|
-
desc 'vs [Subcommand]', "Subcommands: #{Bim::Subcommands::VS.instance_methods(false).join(',')}"
|
17
|
-
subcommand 'vs', Bim::Subcommands::VS
|
7
|
+
# define under subcommands files as subcommands
|
8
|
+
Dir.glob(::Pathname.new(__dir__) + 'subcommands/*').map { |fp| File.basename(fp).split('.rb')[0] }.each do |cmd|
|
9
|
+
klass = Object.const_get('Bim').const_get('Subcommands').const_get(cmd.capitalize)
|
10
|
+
desc "#{cmd} [Subcommand]", "Subcommands: #{klass.instance_methods(false).join(',')}"
|
11
|
+
subcommand cmd, klass
|
12
|
+
end
|
18
13
|
end
|
19
14
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Bim
|
2
|
+
module Subcommands
|
3
|
+
# Fw class defines subcommands
|
4
|
+
class Fw < Thor
|
5
|
+
desc(
|
6
|
+
'ls',
|
7
|
+
'output firewall policy list'
|
8
|
+
)
|
9
|
+
def ls
|
10
|
+
puts Bim::Action::Fw.ls
|
11
|
+
end
|
12
|
+
|
13
|
+
desc(
|
14
|
+
'detail [NAME]',
|
15
|
+
'output firewall policy detail'
|
16
|
+
)
|
17
|
+
def detail(name)
|
18
|
+
puts Bim::Action::Fw.detail(name)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/bim/subcommands/meta.rb
CHANGED
@@ -4,7 +4,7 @@ module Bim
|
|
4
4
|
class Meta < Thor
|
5
5
|
desc(
|
6
6
|
'actives',
|
7
|
-
'output active
|
7
|
+
'output active hosts'
|
8
8
|
)
|
9
9
|
def actives
|
10
10
|
puts Bim::Action::Meta.actives
|
@@ -12,7 +12,7 @@ module Bim
|
|
12
12
|
|
13
13
|
desc(
|
14
14
|
'device_groups',
|
15
|
-
'
|
15
|
+
'output device groups'
|
16
16
|
)
|
17
17
|
def device_groups
|
18
18
|
puts Bim::Action::Meta.device_groups
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Bim
|
2
|
+
module Subcommands
|
3
|
+
# Node class defines subcommands
|
4
|
+
class Node < Thor
|
5
|
+
desc(
|
6
|
+
'ls',
|
7
|
+
'output node list'
|
8
|
+
)
|
9
|
+
def ls
|
10
|
+
puts Bim::Action::Node.ls
|
11
|
+
end
|
12
|
+
|
13
|
+
desc(
|
14
|
+
'detail [NAME]',
|
15
|
+
'output node detail'
|
16
|
+
)
|
17
|
+
def detail(name)
|
18
|
+
puts Bim::Action::Node.detail(name)
|
19
|
+
end
|
20
|
+
|
21
|
+
desc(
|
22
|
+
'create [NAME] [ADDRESS]',
|
23
|
+
'create node'
|
24
|
+
)
|
25
|
+
def create(name, address)
|
26
|
+
puts Bim::Action::Node.create(name, address)
|
27
|
+
end
|
28
|
+
|
29
|
+
desc(
|
30
|
+
'delete [NAME]',
|
31
|
+
'delete node'
|
32
|
+
)
|
33
|
+
def delete(name)
|
34
|
+
puts Bim::Action::Node.delete(name)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Bim
|
2
|
+
module Subcommands
|
3
|
+
# Pool class defines subcommands
|
4
|
+
class Pool < Thor
|
5
|
+
desc(
|
6
|
+
'ls',
|
7
|
+
'output pool list'
|
8
|
+
)
|
9
|
+
def ls
|
10
|
+
puts Bim::Action::Pool.ls
|
11
|
+
end
|
12
|
+
|
13
|
+
desc(
|
14
|
+
'create [NAME] [MEMBERS(optional: \'[{"name": "NodeName:Port", "address": "NodeAddress"}, {"name": "NodeName:Port", "address": "NodeAddress"}]\')]',
|
15
|
+
'create pool with node members'
|
16
|
+
)
|
17
|
+
def create(name, members = nil)
|
18
|
+
puts Bim::Action::Pool.create(name, members)
|
19
|
+
end
|
20
|
+
|
21
|
+
desc(
|
22
|
+
'members [NAME]',
|
23
|
+
'output members belongs to pool'
|
24
|
+
)
|
25
|
+
def members(name)
|
26
|
+
puts Bim::Action::Pool.members(name)
|
27
|
+
end
|
28
|
+
|
29
|
+
desc(
|
30
|
+
'drop [NAME] [MEMBERS(NodeName:Port)]',
|
31
|
+
'drop node members (members are variable length)'
|
32
|
+
)
|
33
|
+
def drop(name, *members)
|
34
|
+
puts Bim::Action::Pool.drop_members(name, members)
|
35
|
+
end
|
36
|
+
|
37
|
+
desc(
|
38
|
+
'add [NAME] [MEMBERS(NodeName:Port)]',
|
39
|
+
'add node members (members aer variable length)'
|
40
|
+
)
|
41
|
+
def add(name, *members)
|
42
|
+
puts Bim::Action::Pool.add_members(name, members)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/bim/subcommands/ssl.rb
CHANGED
data/lib/bim/subcommands/sync.rb
CHANGED
@@ -8,14 +8,14 @@ module Bim
|
|
8
8
|
'[GROUP_NAME] [--overwrite]',
|
9
9
|
'sync device configuration to group. if set overwrite option, sync force-full-load-push mode.'
|
10
10
|
)
|
11
|
-
option :overwrite, :
|
11
|
+
option :overwrite, type: :boolean
|
12
12
|
def to_group(group)
|
13
13
|
puts Bim::Action::Sync.sync!(group, overwrite: options.key?(:overwrite))
|
14
14
|
end
|
15
15
|
|
16
16
|
desc(
|
17
17
|
'state',
|
18
|
-
'
|
18
|
+
'output sync state'
|
19
19
|
)
|
20
20
|
def state
|
21
21
|
puts Bim::Action::Sync.state
|
@@ -23,7 +23,7 @@ module Bim
|
|
23
23
|
|
24
24
|
desc(
|
25
25
|
'failover_state',
|
26
|
-
'
|
26
|
+
'output failover state'
|
27
27
|
)
|
28
28
|
def failover_state
|
29
29
|
puts Bim::Action::Sync.failover_state
|
data/lib/bim/subcommands/vs.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module Bim
|
2
2
|
module Subcommands
|
3
|
-
#
|
4
|
-
class
|
3
|
+
# Vs class defines subcommands
|
4
|
+
class Vs < Thor
|
5
5
|
desc(
|
6
|
-
'
|
6
|
+
'ls',
|
7
7
|
'output virtual server info list'
|
8
8
|
)
|
9
|
-
def
|
10
|
-
puts Bim::Action::VS.
|
9
|
+
def ls
|
10
|
+
puts Bim::Action::VS.ls
|
11
11
|
end
|
12
12
|
|
13
13
|
desc(
|
@@ -17,6 +17,38 @@ module Bim
|
|
17
17
|
def detail(name)
|
18
18
|
puts Bim::Action::VS.detail(name)
|
19
19
|
end
|
20
|
+
|
21
|
+
desc(
|
22
|
+
'update_dnat [NAME] [DNAT_ADDRESS] [PORT]',
|
23
|
+
'update dnat configuration'
|
24
|
+
)
|
25
|
+
def update_dnat(name, dnat_addr, port)
|
26
|
+
puts Bim::Action::VS.update_dnat(name, dnat_addr, port)
|
27
|
+
end
|
28
|
+
|
29
|
+
desc(
|
30
|
+
'update_snat [NAME] [SNAT_ADDRESS] [BIT_MASK]',
|
31
|
+
'update snat configuration'
|
32
|
+
)
|
33
|
+
def update_snat(name, snat_addr, bit_mask)
|
34
|
+
puts Bim::Action::VS.update_snat(name, snat_addr, bit_mask)
|
35
|
+
end
|
36
|
+
|
37
|
+
desc(
|
38
|
+
'change_nf [VS_NAME] [NETWORK_FIREWALL_FULLPATH]',
|
39
|
+
'change network firewall policy'
|
40
|
+
)
|
41
|
+
def change_nf(name, nf_name)
|
42
|
+
puts Bim::Action::VS.change_nf(name, nf_name)
|
43
|
+
end
|
44
|
+
|
45
|
+
desc(
|
46
|
+
'change_pool [NAME] [POOL_FULLPATH]',
|
47
|
+
'change pool'
|
48
|
+
)
|
49
|
+
def change_pool(name, pool_name)
|
50
|
+
puts Bim::Action::VS.change_pool(name, pool_name)
|
51
|
+
end
|
20
52
|
end
|
21
53
|
end
|
22
54
|
end
|
data/lib/bim/subcommands.rb
CHANGED
@@ -3,6 +3,9 @@ require 'bim/subcommands/meta'
|
|
3
3
|
require 'bim/subcommands/sync'
|
4
4
|
require 'bim/subcommands/ssl'
|
5
5
|
require 'bim/subcommands/vs'
|
6
|
+
require 'bim/subcommands/node'
|
7
|
+
require 'bim/subcommands/pool'
|
8
|
+
require 'bim/subcommands/fw'
|
6
9
|
|
7
10
|
module Bim
|
8
11
|
# Subcommands module is namespace
|
data/lib/bim/util.rb
CHANGED
@@ -36,6 +36,8 @@ module Bim
|
|
36
36
|
Net::HTTP::Post.new(uri)
|
37
37
|
when 'PATCH'
|
38
38
|
Net::HTTP::Patch.new(uri)
|
39
|
+
when 'DELETE'
|
40
|
+
Net::HTTP::Delete.new(uri)
|
39
41
|
end
|
40
42
|
|
41
43
|
req['Content-Type'] = content_type
|
@@ -50,6 +52,53 @@ module Bim
|
|
50
52
|
STDIN.gets.chomp.match?(/^[yY]/)
|
51
53
|
end
|
52
54
|
|
55
|
+
def select_map(uri, select_block, &map_block)
|
56
|
+
JSON
|
57
|
+
.parse(get_body(uri))['items']
|
58
|
+
.select(&select_block)
|
59
|
+
.map(&map_block)
|
60
|
+
.to_json
|
61
|
+
end
|
62
|
+
|
63
|
+
def map(uri, &block)
|
64
|
+
JSON
|
65
|
+
.parse(get_body(uri))['items']
|
66
|
+
.map(&block)
|
67
|
+
.to_json
|
68
|
+
end
|
69
|
+
|
70
|
+
def specify(uri, &block)
|
71
|
+
JSON
|
72
|
+
.parse(get_body(uri))['items']
|
73
|
+
.select(&block)
|
74
|
+
.first
|
75
|
+
.to_json
|
76
|
+
end
|
77
|
+
|
78
|
+
def specify_link(uri, key = ['selfLink'], &block)
|
79
|
+
JSON
|
80
|
+
.parse(get_body(uri))['items']
|
81
|
+
.select(&block)
|
82
|
+
.first
|
83
|
+
.dig(*key)
|
84
|
+
end
|
85
|
+
|
86
|
+
def specify_link_by_name(uri, name, key = ['selfLink'])
|
87
|
+
specify_link(uri, key) { |item| item['name'] == name }
|
88
|
+
end
|
89
|
+
|
90
|
+
def post(uri, j, body = true)
|
91
|
+
req = request(uri, Bim::AUTH, 'application/json', 'POST', j)
|
92
|
+
body ? http(uri).request(req).body : http(uri).request(req)
|
93
|
+
end
|
94
|
+
|
95
|
+
def self_patch(name, list_uri, j)
|
96
|
+
self_link = sub_localhost(specify_link(list_uri) { |item| item['name'] == name })
|
97
|
+
uri = URI(self_link)
|
98
|
+
req = request(uri, Bim::AUTH, 'application/json', 'PATCH', j)
|
99
|
+
http(uri).request(req).body
|
100
|
+
end
|
101
|
+
|
53
102
|
def vs_list
|
54
103
|
uri = URI.join(BASE_URL, VS_PATH)
|
55
104
|
get_body(uri)
|
@@ -59,5 +108,9 @@ module Bim
|
|
59
108
|
uri = URI.parse(link.sub('localhost', BIGIP_HOST))
|
60
109
|
get_body(uri)
|
61
110
|
end
|
111
|
+
|
112
|
+
def sub_localhost(url)
|
113
|
+
url.sub('localhost', BIGIP_HOST)
|
114
|
+
end
|
62
115
|
end
|
63
116
|
end
|
data/lib/bim/version.rb
CHANGED
data/lib/bim.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
require 'bim/version'
|
2
|
-
require 'bim/cli'
|
3
|
-
require 'json'
|
4
1
|
require 'base64'
|
2
|
+
require 'json'
|
3
|
+
require 'bim/version'
|
5
4
|
|
6
5
|
module Bim
|
7
6
|
BIGIP_HOST = ENV['BIGIP_HOST']
|
@@ -17,3 +16,5 @@ module Bim
|
|
17
16
|
class UnsetPasswordEnvironmentError < UnsetEnvironmentError; end
|
18
17
|
class UnauthorizedError < StandardError; end
|
19
18
|
end
|
19
|
+
|
20
|
+
require 'bim/cli'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bim
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- littlekbt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -76,6 +76,7 @@ extra_rdoc_files: []
|
|
76
76
|
files:
|
77
77
|
- ".gitignore"
|
78
78
|
- ".rubocop.yml"
|
79
|
+
- ".travis.yml"
|
79
80
|
- Gemfile
|
80
81
|
- LICENSE.txt
|
81
82
|
- README.md
|
@@ -85,13 +86,19 @@ files:
|
|
85
86
|
- completions/bim.bash
|
86
87
|
- lib/bim.rb
|
87
88
|
- lib/bim/action.rb
|
89
|
+
- lib/bim/action/fw.rb
|
88
90
|
- lib/bim/action/meta.rb
|
91
|
+
- lib/bim/action/node.rb
|
92
|
+
- lib/bim/action/pool.rb
|
89
93
|
- lib/bim/action/ssl.rb
|
90
94
|
- lib/bim/action/sync.rb
|
91
95
|
- lib/bim/action/vs.rb
|
92
96
|
- lib/bim/cli.rb
|
93
97
|
- lib/bim/subcommands.rb
|
98
|
+
- lib/bim/subcommands/fw.rb
|
94
99
|
- lib/bim/subcommands/meta.rb
|
100
|
+
- lib/bim/subcommands/node.rb
|
101
|
+
- lib/bim/subcommands/pool.rb
|
95
102
|
- lib/bim/subcommands/ssl.rb
|
96
103
|
- lib/bim/subcommands/sync.rb
|
97
104
|
- lib/bim/subcommands/vs.rb
|