enfcli 4.0.0 → 5.0.0.pre.alpha
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/.circleci/Dockerfile +2 -2
- data/.circleci/config.yml +5 -0
- data/Gemfile.lock +38 -26
- data/Makefile +7 -0
- data/README.md +52 -7
- data/enfcli.gemspec +28 -26
- data/format.sh +9 -0
- data/lib/enfapi.rb +184 -237
- data/lib/enfapi/dns.rb +95 -0
- data/lib/enfapi/firewall.rb +37 -0
- data/lib/enfapi/user.rb +75 -0
- data/lib/enfcli.rb +211 -111
- data/lib/enfcli/commands/captive.rb +518 -157
- data/lib/enfcli/commands/user.rb +208 -160
- data/lib/enfcli/commands/xcr.rb +151 -119
- data/lib/enfcli/commands/xdns.rb +65 -55
- data/lib/enfcli/commands/xfw.rb +37 -37
- data/lib/enfcli/commands/xiam.rb +87 -80
- data/lib/enfcli/version.rb +2 -2
- data/lib/enfthor.rb +38 -14
- metadata +65 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29f4309503935f6931b068e80a850488b2f8833474734c05e8455a04f84293e0
|
4
|
+
data.tar.gz: 2488271b45ee7c7e5b96cc95546d2f625fb1c503d9ad6720f62649073d4a1874
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 033366cb4db237f61526ddf357bbdfd57d60b482398d21eee798413b5afc91b51a6baae60526b957f07a80f01dea5b47372d72193d40b0af20a98fb88de1cd51
|
7
|
+
data.tar.gz: e7bd3d1c7da7a861a89f242bd5a2d2f898e5e5b4f848c2412fa9a1b5acb7ac73fb5c679979e80b9b7d1e81ba87de761f157141d49eda2d6c3c5d55b1b315c249
|
data/.circleci/Dockerfile
CHANGED
data/.circleci/config.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
enfcli (
|
4
|
+
enfcli (5.0.0.pre.alpha)
|
5
|
+
clipboard
|
6
|
+
ffi
|
7
|
+
readline
|
5
8
|
rest-client (~> 2.0)
|
6
9
|
terminal-table
|
7
10
|
thor (~> 0.20.0)
|
@@ -9,61 +12,69 @@ PATH
|
|
9
12
|
GEM
|
10
13
|
remote: https://rubygems.org/
|
11
14
|
specs:
|
12
|
-
addressable (2.
|
13
|
-
public_suffix (>= 2.0.2, <
|
14
|
-
bump (0.
|
15
|
+
addressable (2.7.0)
|
16
|
+
public_suffix (>= 2.0.2, < 5.0)
|
17
|
+
bump (0.8.0)
|
18
|
+
clipboard (1.3.3)
|
15
19
|
crack (0.4.3)
|
16
20
|
safe_yaml (~> 1.0.0)
|
17
21
|
diff-lcs (1.3)
|
18
22
|
domain_name (0.5.20190701)
|
19
23
|
unf (>= 0.0.5, < 1.0.0)
|
20
|
-
|
24
|
+
ffi (1.12.2)
|
25
|
+
fuubar (2.5.0)
|
21
26
|
rspec-core (~> 3.0)
|
22
27
|
ruby-progressbar (~> 1.4)
|
23
|
-
hashdiff (0.
|
28
|
+
hashdiff (1.0.0)
|
24
29
|
http-accept (1.7.0)
|
25
30
|
http-cookie (1.0.3)
|
26
31
|
domain_name (~> 0.5)
|
27
|
-
|
32
|
+
io-console (0.5.5)
|
33
|
+
mime-types (3.3.1)
|
28
34
|
mime-types-data (~> 3.2015)
|
29
35
|
mime-types-data (3.2019.1009)
|
30
36
|
netrc (0.11.0)
|
31
|
-
public_suffix (
|
37
|
+
public_suffix (4.0.3)
|
32
38
|
rake (10.5.0)
|
39
|
+
readline (0.0.2)
|
40
|
+
reline
|
41
|
+
reline (0.1.2)
|
42
|
+
io-console (~> 0.5)
|
33
43
|
rest-client (2.1.0)
|
34
44
|
http-accept (>= 1.7.0, < 2.0)
|
35
45
|
http-cookie (>= 1.0.2, < 2.0)
|
36
46
|
mime-types (>= 1.16, < 4.0)
|
37
47
|
netrc (~> 0.8)
|
38
|
-
rspec (3.
|
39
|
-
rspec-core (~> 3.
|
40
|
-
rspec-expectations (~> 3.
|
41
|
-
rspec-mocks (~> 3.
|
42
|
-
rspec-core (3.
|
43
|
-
rspec-support (~> 3.
|
44
|
-
rspec-expectations (3.
|
48
|
+
rspec (3.9.0)
|
49
|
+
rspec-core (~> 3.9.0)
|
50
|
+
rspec-expectations (~> 3.9.0)
|
51
|
+
rspec-mocks (~> 3.9.0)
|
52
|
+
rspec-core (3.9.1)
|
53
|
+
rspec-support (~> 3.9.1)
|
54
|
+
rspec-expectations (3.9.0)
|
45
55
|
diff-lcs (>= 1.2.0, < 2.0)
|
46
|
-
rspec-support (~> 3.
|
47
|
-
rspec-mocks (3.
|
56
|
+
rspec-support (~> 3.9.0)
|
57
|
+
rspec-mocks (3.9.1)
|
48
58
|
diff-lcs (>= 1.2.0, < 2.0)
|
49
|
-
rspec-support (~> 3.
|
50
|
-
rspec-support (3.
|
59
|
+
rspec-support (~> 3.9.0)
|
60
|
+
rspec-support (3.9.2)
|
51
61
|
rspec_junit_formatter (0.4.1)
|
52
62
|
rspec-core (>= 2, < 4, != 2.12.0)
|
53
|
-
ruby-progressbar (1.10.
|
54
|
-
|
63
|
+
ruby-progressbar (1.10.1)
|
64
|
+
rufo (0.8.1)
|
65
|
+
safe_yaml (1.0.5)
|
55
66
|
terminal-table (1.8.0)
|
56
67
|
unicode-display_width (~> 1.1, >= 1.1.1)
|
57
68
|
thor (0.20.3)
|
58
69
|
unf (0.1.4)
|
59
70
|
unf_ext
|
60
71
|
unf_ext (0.0.7.6)
|
61
|
-
unicode-display_width (1.6.
|
62
|
-
vcr (
|
63
|
-
webmock (3.
|
72
|
+
unicode-display_width (1.6.1)
|
73
|
+
vcr (5.0.0)
|
74
|
+
webmock (3.7.6)
|
64
75
|
addressable (>= 2.3.6)
|
65
76
|
crack (>= 0.3.2)
|
66
|
-
hashdiff
|
77
|
+
hashdiff (>= 0.4.0, < 2.0.0)
|
67
78
|
|
68
79
|
PLATFORMS
|
69
80
|
ruby
|
@@ -76,8 +87,9 @@ DEPENDENCIES
|
|
76
87
|
rake (~> 10.0)
|
77
88
|
rspec
|
78
89
|
rspec_junit_formatter
|
90
|
+
rufo
|
79
91
|
vcr
|
80
92
|
webmock
|
81
93
|
|
82
94
|
BUNDLED WITH
|
83
|
-
2.
|
95
|
+
2.1.4
|
data/Makefile
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# enfcli
|
2
2
|
|
3
|
-
|
3
|
+
The `enfcli` - Xaptum's CLI tool - allows you to easily manage your ENF resources. Check out [the docs](https://docs.xaptum.com/api) for examples of the various `enfcli` commands available for you to use.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -24,16 +24,62 @@ $ gem install enfcli --pre
|
|
24
24
|
|
25
25
|
## Usage
|
26
26
|
|
27
|
-
|
27
|
+
There are two ways to connect to the ENF through the `enfcli`.
|
28
|
+
|
29
|
+
1. Configuration file
|
30
|
+
|
31
|
+
The recommended way to connect to the ENF through the `enfcli` is by creating a configuration file (`.xaptum_config.json`) in your home directory. The `enfcli` will read your configuration from this file whenever you attempt to connect, and will save you from entering in your `host` and `username` parameters each time. The following command creates a config file in your home directory.
|
32
|
+
|
33
|
+
```
|
34
|
+
$ enfcli create-config-file --host=<HOST> --user=<USERNAME>
|
35
|
+
Config file created successfully at /Users/dylanirlbeck/.xaptum_config.json!
|
36
|
+
```
|
37
|
+
|
38
|
+
You can view your current configuration at any time by doing the following:
|
39
|
+
|
40
|
+
```
|
41
|
+
$ enfcli display-config-file
|
42
|
+
{"host":<HOST>,"user":<USERNAME>}
|
43
|
+
```
|
44
|
+
|
45
|
+
With your configuration file created, connect to the ENF by simply doing
|
46
|
+
```
|
47
|
+
$ enfcli
|
48
|
+
Connecting to <HOST>.....
|
49
|
+
Enter Password: <PASSWORD>
|
50
|
+
```
|
51
|
+
|
52
|
+
2. CLI parameters
|
53
|
+
|
54
|
+
Instead of a configuration file, you can always connect to the ENF through the `enfcli` by providing your host and username as command line parameters
|
55
|
+
|
56
|
+
```bash
|
57
|
+
$ enfcli --host <host> --user <user>
|
58
|
+
```
|
59
|
+
|
60
|
+
Whichever way you choose, you'll be prompted for your account password as the final step of authentication. Once authenticated, type `help` in `enfcli` prompt to list all available `enfcli` commands
|
61
|
+
|
62
|
+
```bash
|
63
|
+
enfcli-user@acme> help
|
64
|
+
```
|
65
|
+
|
66
|
+
## Development
|
67
|
+
- Clone the repository
|
68
|
+
- Create a new branch
|
28
69
|
```bash
|
29
|
-
|
70
|
+
git checkout -b <GIT_USER_NAME>/<BRANCH_NAME>
|
30
71
|
```
|
31
|
-
|
32
|
-
|
72
|
+
- Bump the version
|
33
73
|
```bash
|
34
|
-
|
74
|
+
make bump-pre
|
75
|
+
```
|
76
|
+
- Ensure code is formatted using `rufo`. The build process will fail if the code is not formatted.
|
77
|
+
```bash
|
78
|
+
make format
|
35
79
|
```
|
36
80
|
|
81
|
+
**NOTE: Do not fork the repository**
|
82
|
+
|
37
83
|
## Release
|
38
84
|
`enfcli` pre-release and release versions are automatically published to [RubyGems](https://rubygems.org) by the build process. Each commit to `master` branch publishes a pre-release version of the gem.
|
39
85
|
|
@@ -64,4 +110,3 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
64
110
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
65
111
|
License for the specific language governing permissions and limitations under
|
66
112
|
the License.
|
67
|
-
|
data/enfcli.gemspec
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require "enfcli/version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.authors
|
10
|
-
spec.email
|
11
|
-
|
12
|
-
spec.
|
13
|
-
spec.homepage = "https://www.xaptum.com"
|
7
|
+
spec.name = "enfcli"
|
8
|
+
spec.version = EnfCli::VERSION
|
9
|
+
spec.authors = ["Venkatakumar Srinivasan"]
|
10
|
+
spec.email = ["venkat@xaptum.com"]
|
11
|
+
spec.summary = "Xaptum ENF CLI."
|
12
|
+
spec.homepage = "https://www.xaptum.com"
|
14
13
|
|
15
14
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
16
15
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
@@ -20,27 +19,30 @@ Gem::Specification.new do |spec|
|
|
20
19
|
# raise "RubyGems 2.0 or newer is required to protect against " \
|
21
20
|
# "public gem pushes."
|
22
21
|
#end
|
23
|
-
|
24
|
-
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
22
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
25
23
|
f.match(%r{^(test|spec|features)/})
|
26
24
|
end
|
27
|
-
|
28
|
-
spec.
|
25
|
+
|
26
|
+
spec.bindir = "bin"
|
27
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
29
28
|
spec.require_paths = ["lib"]
|
30
29
|
|
31
|
-
spec.add_dependency
|
32
|
-
spec.add_dependency
|
33
|
-
spec.add_dependency
|
30
|
+
spec.add_dependency("thor", "~> 0.20.0")
|
31
|
+
spec.add_dependency("rest-client", "~> 2.0")
|
32
|
+
spec.add_dependency("terminal-table")
|
33
|
+
spec.add_dependency("clipboard")
|
34
|
+
spec.add_dependency("ffi")
|
35
|
+
spec.add_dependency("readline")
|
36
|
+
|
34
37
|
#spec.add_dependency "websocket-client-simple"
|
35
38
|
#spec.add_dependency "colorize"
|
36
|
-
|
37
|
-
spec.add_development_dependency "
|
38
|
-
spec.add_development_dependency
|
39
|
-
spec.add_development_dependency
|
40
|
-
spec.add_development_dependency
|
41
|
-
spec.add_development_dependency
|
42
|
-
spec.add_development_dependency
|
43
|
-
spec.add_development_dependency
|
44
|
-
spec.add_development_dependency
|
45
|
-
|
39
|
+
spec.add_development_dependency("bundler")
|
40
|
+
spec.add_development_dependency("rake", "~> 10.0")
|
41
|
+
spec.add_development_dependency("bump")
|
42
|
+
spec.add_development_dependency("rspec")
|
43
|
+
spec.add_development_dependency("rspec_junit_formatter")
|
44
|
+
spec.add_development_dependency("fuubar")
|
45
|
+
spec.add_development_dependency("vcr")
|
46
|
+
spec.add_development_dependency("webmock")
|
47
|
+
spec.add_development_dependency("rufo")
|
46
48
|
end
|
data/format.sh
ADDED
data/lib/enfapi.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright
|
2
|
+
# Copyright 2020 Xaptum,Inc
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
# you may not use this file except in compliance with the License.
|
@@ -13,11 +13,11 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
16
|
+
require "rest-client"
|
17
|
+
require "singleton"
|
18
|
+
require "json"
|
19
|
+
require "date"
|
20
|
+
require "cgi"
|
21
21
|
|
22
22
|
#
|
23
23
|
# NOTE: When api's are refactored into individual classes
|
@@ -26,13 +26,20 @@ require 'cgi'
|
|
26
26
|
#
|
27
27
|
|
28
28
|
module EnfApi
|
29
|
-
|
30
29
|
def self.to_json(hash)
|
31
30
|
JSON.generate(hash)
|
32
31
|
end
|
33
32
|
|
33
|
+
def self.from_json(string)
|
34
|
+
begin
|
35
|
+
JSON.parse(string, { symbolize_names: true })
|
36
|
+
rescue
|
37
|
+
raise EnfApi::ERROR, "Unable to parse api response json!"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
34
41
|
def self.url_encode(str)
|
35
|
-
CGI.escape(
|
42
|
+
CGI.escape(str).gsub("+", "%20")
|
36
43
|
end
|
37
44
|
|
38
45
|
class ERROR < StandardError
|
@@ -41,104 +48,6 @@ module EnfApi
|
|
41
48
|
end
|
42
49
|
end
|
43
50
|
|
44
|
-
class Dns
|
45
|
-
include Singleton
|
46
|
-
|
47
|
-
def initialize
|
48
|
-
@version = "2019-05-27"
|
49
|
-
@xdns_base_url = "/api/xdns/#{@version}"
|
50
|
-
end
|
51
|
-
|
52
|
-
def list_zones(domain)
|
53
|
-
EnfApi::API.instance.get "#{@xdns_base_url}/zones?enf_domain=#{domain}"
|
54
|
-
end
|
55
|
-
|
56
|
-
def create_dns_zone(new_zone)
|
57
|
-
json = EnfApi::to_json(new_zone)
|
58
|
-
EnfApi::API.instance.post "#{@xdns_base_url}/zones", json
|
59
|
-
end
|
60
|
-
|
61
|
-
def update_dns_zone(zone_id, updated_zone)
|
62
|
-
json = EnfApi::to_json(updated_zone)
|
63
|
-
EnfApi::API.instance.put "#{@xdns_base_url}/zones/#{zone_id}", json
|
64
|
-
end
|
65
|
-
|
66
|
-
def delete_dns_zone(zone_id)
|
67
|
-
EnfApi::API.instance.delete "#{@xdns_base_url}/zones/#{zone_id}"
|
68
|
-
end
|
69
|
-
|
70
|
-
def add_networks_to_zone(zone_id, add_networks)
|
71
|
-
json = EnfApi::to_json(add_networks)
|
72
|
-
EnfApi::API.instance.post "#{@xdns_base_url}/zones/#{zone_id}/networks", json
|
73
|
-
end
|
74
|
-
|
75
|
-
def replace_networks_in_zone(zone_id, replace_networks)
|
76
|
-
json = EnfApi::to_json(replace_networks)
|
77
|
-
EnfApi::API.instance.put "#{@xdns_base_url}/zones/#{zone_id}/networks", json
|
78
|
-
end
|
79
|
-
|
80
|
-
def list_networks_in_zone(zone_id)
|
81
|
-
EnfApi::API.instance.get "#{@xdns_base_url}/zones/#{zone_id}/networks"
|
82
|
-
end
|
83
|
-
|
84
|
-
def delete_networks_from_zone(zone_id, delete_networks)
|
85
|
-
EnfApi::API.instance.delete "#{@xdns_base_url}/zones/#{zone_id}/networks?delete=#{delete_networks}"
|
86
|
-
end
|
87
|
-
|
88
|
-
def list_zones_in_network(network)
|
89
|
-
EnfApi::API.instance.get "#{@xdns_base_url}/networks/#{network}/zones"
|
90
|
-
end
|
91
|
-
|
92
|
-
def provision_server(network, new_server)
|
93
|
-
json = EnfApi::to_json(new_server)
|
94
|
-
EnfApi::API.instance.post "#{@xdns_base_url}/networks/#{network}/servers", json
|
95
|
-
end
|
96
|
-
|
97
|
-
def list_servers(network)
|
98
|
-
EnfApi::API.instance.get "#{@xdns_base_url}/networks/#{network}/servers"
|
99
|
-
end
|
100
|
-
|
101
|
-
def delete_server(network, server_ipv6)
|
102
|
-
EnfApi::API.instance.delete "#{@xdns_base_url}/networks/#{network}/servers/#{server_ipv6}"
|
103
|
-
end
|
104
|
-
|
105
|
-
def create_dns_record(zone_id, new_record)
|
106
|
-
json = EnfApi::to_json(new_record)
|
107
|
-
EnfApi::API.instance.post "#{@xdns_base_url}/zones/#{zone_id}/records", json
|
108
|
-
end
|
109
|
-
|
110
|
-
def list_dns_records(zone_id)
|
111
|
-
EnfApi::API.instance.get "#{@xdns_base_url}/zones/#{zone_id}/records"
|
112
|
-
end
|
113
|
-
|
114
|
-
def query(network, type, name)
|
115
|
-
EnfApi::API.instance.get "#{@xdns_base_url}/networks/#{network}/query/#{type}/#{name}"
|
116
|
-
end
|
117
|
-
|
118
|
-
def delete_dns_record(record_id)
|
119
|
-
EnfApi::API.instance.delete "#{@xdns_base_url}/records/#{record_id}"
|
120
|
-
end
|
121
|
-
|
122
|
-
end
|
123
|
-
|
124
|
-
class Firewall
|
125
|
-
include Singleton
|
126
|
-
|
127
|
-
def list_firewall_rules(network)
|
128
|
-
EnfApi::API.instance.get "/api/xfw/v1/#{network}/rule"
|
129
|
-
end
|
130
|
-
|
131
|
-
def add_firewall_rule(network, rule)
|
132
|
-
rule_json = EnfApi::to_json(rule)
|
133
|
-
EnfApi::API.instance.post "/api/xfw/v1/#{network}/rule", rule_json
|
134
|
-
end
|
135
|
-
|
136
|
-
def delete_firewall_rules(network, id = nil)
|
137
|
-
# Same method to call to delete all firewall rules in a network. if id is nil
|
138
|
-
EnfApi::API.instance.delete "/api/xfw/v1/#{network}/rule/#{id}"
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
51
|
class Iam
|
143
52
|
include Singleton
|
144
53
|
|
@@ -188,7 +97,6 @@ module EnfApi
|
|
188
97
|
json = EnfApi::to_json(credentials)
|
189
98
|
EnfApi::API.instance.post "/api/xiam/v1/endpoints/#{ipv6}/credentials", json
|
190
99
|
end
|
191
|
-
|
192
100
|
end
|
193
101
|
|
194
102
|
##############################################################################
|
@@ -229,13 +137,13 @@ module EnfApi
|
|
229
137
|
## NO_TEST
|
230
138
|
def create_device(new_dev_hash)
|
231
139
|
json = EnfApi.to_json(new_dev_hash)
|
232
|
-
EnfApi::API.instance.post
|
140
|
+
EnfApi::API.instance.post "/api/captive/v1/device", json
|
233
141
|
end
|
234
142
|
|
235
143
|
# Get the list of devices
|
236
144
|
## NO_TEST
|
237
145
|
def list_devices(network)
|
238
|
-
url =
|
146
|
+
url = "/api/captive/v1/device"
|
239
147
|
url = "#{url}?#{network}" if network
|
240
148
|
EnfApi::API.instance.get url
|
241
149
|
end
|
@@ -253,7 +161,6 @@ module EnfApi
|
|
253
161
|
EnfApi::API.instance.put "/api/captive/v1/device/#{id}", json
|
254
162
|
end
|
255
163
|
|
256
|
-
|
257
164
|
# Get the status of a device
|
258
165
|
## NO_TEST
|
259
166
|
def get_device_status(dev_id)
|
@@ -267,7 +174,6 @@ module EnfApi
|
|
267
174
|
EnfApi::API.instance.post "/api/captive/v1/profile", json
|
268
175
|
end
|
269
176
|
|
270
|
-
|
271
177
|
# Get the list of profiles
|
272
178
|
# name is a substring of the profile names to be returned
|
273
179
|
## NO_TEST
|
@@ -279,16 +185,99 @@ module EnfApi
|
|
279
185
|
|
280
186
|
# Get detail on a specific profile
|
281
187
|
## NO_TEST
|
282
|
-
def get_profile
|
188
|
+
def get_profile(profile_id)
|
283
189
|
EnfApi::API.instance.get "/api/captive/v1/profile/#{profile_id}"
|
284
190
|
end
|
285
191
|
|
286
192
|
# Send update PUT request for profile
|
287
193
|
## NO_TEST
|
288
|
-
def update_profile
|
194
|
+
def update_profile(id, profile_updates)
|
289
195
|
json = EnfApi.to_json(profile_updates)
|
290
196
|
EnfApi::API.instance.put "/api/captive/v1/profile/#{id}", json
|
291
197
|
end
|
198
|
+
|
199
|
+
# Get the list of devices
|
200
|
+
## NO_TEST
|
201
|
+
def list_firmware_images()
|
202
|
+
url = "/api/captive/v1/firmware/release"
|
203
|
+
EnfApi::API.instance.get url
|
204
|
+
end
|
205
|
+
|
206
|
+
# Upload the firmware image
|
207
|
+
# Current version sends an empty body - captive server doesn't support
|
208
|
+
# sending the binary image yet.
|
209
|
+
## NO_TEST
|
210
|
+
def upload_firmware_image(version, image_name)
|
211
|
+
url = "/api/captive/v1/firmware/release/#{version}/#{image_name}"
|
212
|
+
EnfApi::API.instance.put url
|
213
|
+
end
|
214
|
+
|
215
|
+
# gets the details for a specific firmware version
|
216
|
+
## NO_TEST
|
217
|
+
def get_firmware_info(version)
|
218
|
+
url = "/api/captive/v1/firmware/release/#{version}"
|
219
|
+
EnfApi::API.instance.get url
|
220
|
+
end
|
221
|
+
|
222
|
+
# creates a new schedule object via POST
|
223
|
+
## NO_TEST
|
224
|
+
def create_schedule(sched_hash)
|
225
|
+
json = EnfApi.to_json(sched_hash)
|
226
|
+
EnfApi::API.instance.post "/api/captive/v1/schedule", json
|
227
|
+
end
|
228
|
+
|
229
|
+
# GETs a list of all existing schedules
|
230
|
+
## NO_TEST
|
231
|
+
def list_schedules
|
232
|
+
EnfApi::API.instance.get "/api/captive/v1/schedule"
|
233
|
+
end
|
234
|
+
|
235
|
+
# GETs the details of a specific schedule
|
236
|
+
## NO_TEST
|
237
|
+
def get_schedule(id)
|
238
|
+
EnfApi::API.instance.get "/api/captive/v1/schedule/#{id}"
|
239
|
+
end
|
240
|
+
|
241
|
+
# update the details of a specific schedule
|
242
|
+
## NO_TEST
|
243
|
+
def update_schedule(id, sched_hash)
|
244
|
+
json = EnfApi.to_json(sched_hash)
|
245
|
+
url = "/api/captive/v1/schedule/#{id}"
|
246
|
+
EnfApi::API.instance.put url, json
|
247
|
+
end
|
248
|
+
|
249
|
+
# DELETEs the specified schedule
|
250
|
+
## NO_TEST
|
251
|
+
def delete_schedule(id)
|
252
|
+
EnfApi::API.instance.delete "/api/captive/v1/schedule/#{id}"
|
253
|
+
end
|
254
|
+
|
255
|
+
# GET the list of existing update objects
|
256
|
+
## NO_TEST
|
257
|
+
def list_firmware_updates()
|
258
|
+
EnfApi::API.instance.get "/api/captive/v1/firmware/update"
|
259
|
+
end
|
260
|
+
|
261
|
+
# GET details of a specified firmware update task
|
262
|
+
## NO_TEST
|
263
|
+
def get_firmware_update(update_id)
|
264
|
+
EnfApi::API.instance.get "/api/captive/v1/firmware/update/#{update_id}"
|
265
|
+
end
|
266
|
+
|
267
|
+
# POSTs a new firmware-udpate object
|
268
|
+
## NO_TEST
|
269
|
+
def create_firmware_update(update_hash)
|
270
|
+
json = EnfApi.to_json(update_hash)
|
271
|
+
EnfApi::API.instance.post "/api/captive/v1/firmware/update", json
|
272
|
+
end
|
273
|
+
|
274
|
+
# uses PUT to modify an existing firmware update task
|
275
|
+
## NO_TEST
|
276
|
+
def modify_firmware_update(update_id, update_hash)
|
277
|
+
url = "/api/captive/v1/firmware/update/#{update_id}"
|
278
|
+
json = EnfApi.to_json(update_hash)
|
279
|
+
EnfApi::API.instance.put url, json
|
280
|
+
end
|
292
281
|
end
|
293
282
|
|
294
283
|
class NetworkManager
|
@@ -311,11 +300,11 @@ module EnfApi
|
|
311
300
|
@api = RestClient::Resource.new(host)
|
312
301
|
|
313
302
|
# Create request json
|
314
|
-
hash = { :
|
315
|
-
json = to_json(
|
303
|
+
hash = { username: user, password: password }
|
304
|
+
json = to_json(hash)
|
316
305
|
|
317
306
|
# call api
|
318
|
-
@api["/api/xcr/
|
307
|
+
@api["/api/xcr/v3/xauth"].post(json, { content_type: :json, accept: :json }) { |response, request, result|
|
319
308
|
case response.code
|
320
309
|
when 200
|
321
310
|
# get resp from json
|
@@ -323,7 +312,7 @@ module EnfApi
|
|
323
312
|
|
324
313
|
# set request headers for subsequent api calls
|
325
314
|
token = resp[:data][0][:token]
|
326
|
-
@headers = {content_type: :json, accept: :json, "Authorization" => "Bearer #{token}"}
|
315
|
+
@headers = { content_type: :json, accept: :json, "Authorization" => "Bearer #{token}" }
|
327
316
|
|
328
317
|
# return resp
|
329
318
|
resp
|
@@ -334,267 +323,225 @@ module EnfApi
|
|
334
323
|
end
|
335
324
|
|
336
325
|
def get(request_uri)
|
337
|
-
@api[request_uri].get(@headers) {|response, request, result|
|
326
|
+
@api[request_uri].get(@headers) { |response, request, result|
|
338
327
|
process_api_response response, request, result
|
339
328
|
}
|
340
329
|
end
|
341
330
|
|
342
|
-
def post(request_uri, request_body =
|
343
|
-
@api[request_uri].post(request_body, @headers) {|response, request, result|
|
331
|
+
def post(request_uri, request_body = "")
|
332
|
+
@api[request_uri].post(request_body, @headers) { |response, request, result|
|
344
333
|
process_api_response response, request, result
|
345
334
|
}
|
346
335
|
end
|
347
336
|
|
348
|
-
def put(request_uri, request_body =
|
349
|
-
@api[request_uri].put(request_body, @headers) {|response, request, result|
|
337
|
+
def put(request_uri, request_body = "")
|
338
|
+
@api[request_uri].put(request_body, @headers) { |response, request, result|
|
350
339
|
process_api_response response, request, result
|
351
340
|
}
|
352
341
|
end
|
353
342
|
|
354
343
|
def delete(request_uri)
|
355
|
-
@api[request_uri].delete(@headers) {|response, request, result|
|
344
|
+
@api[request_uri].delete(@headers) { |response, request, result|
|
356
345
|
process_api_response response, request, result
|
357
346
|
}
|
358
347
|
end
|
359
348
|
|
360
|
-
############################################################################################################################
|
361
|
-
# NOT READY API. MOVE ABOVE THIS LINE AFTER RSPEC OR INTO OWN CLASS
|
362
|
-
############################################################################################################################
|
349
|
+
############################################################################################################################
|
350
|
+
# NOT READY API. MOVE ABOVE THIS LINE AFTER RSPEC OR INTO OWN CLASS
|
351
|
+
############################################################################################################################
|
363
352
|
def list_domain_nws(domain_id)
|
364
|
-
@api["/api/xcr/
|
353
|
+
@api["/api/xcr/v3/domains/#{domain_id}/nws"].get(@headers) { |response, request, result|
|
365
354
|
process_api_response response, request, result
|
366
355
|
}
|
367
356
|
end
|
368
357
|
|
369
358
|
def list_enfnws
|
370
|
-
@api["/api/xcr/
|
359
|
+
@api["/api/xcr/v3/enfnws"].get(@headers) { |response, request, result|
|
371
360
|
process_api_response response, request, result
|
372
361
|
}
|
373
362
|
end
|
374
363
|
|
375
364
|
def list_domains
|
376
|
-
@api["/api/xcr/
|
365
|
+
@api["/api/xcr/v3/domains"].get(@headers) { |response, request, result|
|
377
366
|
process_api_response response, request, result
|
378
367
|
}
|
379
368
|
end
|
380
369
|
|
381
370
|
def get_domain(domain_id)
|
382
|
-
@api["/api/xcr/
|
371
|
+
@api["/api/xcr/v3/domains/#{domain_id}"].get(@headers) { |response, request, result|
|
383
372
|
process_api_response response, request, result
|
384
373
|
}
|
385
374
|
end
|
386
375
|
|
387
376
|
def create_domain(domain_hash)
|
388
|
-
json = to_json(
|
389
|
-
@api["/api/xcr/
|
377
|
+
json = to_json(domain_hash)
|
378
|
+
@api["/api/xcr/v3/domains"].post(json, @headers) { |response, request, result|
|
390
379
|
process_api_response response, request, result
|
391
380
|
}
|
392
381
|
end
|
393
382
|
|
394
383
|
def update_domain_rate_limits(domain_network, limit, limits_hash)
|
395
|
-
json = to_json(
|
396
|
-
@api["/api/xcr/
|
384
|
+
json = to_json(limits_hash)
|
385
|
+
@api["/api/xcr/v3/domains/#{domain_network}/ep_rate_limits/#{limit}"].put(json, @headers) { |response, request, result|
|
397
386
|
process_api_response response, request, result
|
398
387
|
}
|
399
388
|
end
|
400
389
|
|
401
390
|
def update_network_rate_limits(network, limit, limits_hash)
|
402
|
-
json = to_json(
|
403
|
-
@api["/api/xcr/
|
391
|
+
json = to_json(limits_hash)
|
392
|
+
@api["/api/xcr/v3/nws/#{network}/ep_rate_limits/#{limit}"].put(json, @headers) { |response, request, result|
|
404
393
|
process_api_response response, request, result
|
405
394
|
}
|
406
395
|
end
|
407
396
|
|
408
397
|
def update_ep_rate_limits(ipv6, limit, limits_hash)
|
409
|
-
json = to_json(
|
410
|
-
@api["/api/xcr/
|
398
|
+
json = to_json(limits_hash)
|
399
|
+
@api["/api/xcr/v3/cxns/#{ipv6}/ep_rate_limits/#{limit}"].put(json, @headers) { |response, request, result|
|
411
400
|
process_api_response response, request, result
|
412
401
|
}
|
413
402
|
end
|
414
403
|
|
415
404
|
def get_domain_rate_limits(domain_network, filter = nil)
|
416
|
-
api_url = "/api/xcr/
|
405
|
+
api_url = "/api/xcr/v3/domains/#{domain_network}/ep_rate_limits"
|
417
406
|
api_url = "#{api_url}/#{filter}" if filter
|
418
407
|
|
419
|
-
@api[api_url].get(
|
408
|
+
@api[api_url].get(@headers) { |response, request, result|
|
420
409
|
process_api_response response, request, result
|
421
410
|
}
|
422
411
|
end
|
423
412
|
|
424
413
|
def get_network_rate_limits(network, filter = nil)
|
425
|
-
api_url = "/api/xcr/
|
414
|
+
api_url = "/api/xcr/v3/nws/#{network}/ep_rate_limits"
|
426
415
|
api_url = "#{api_url}/#{filter}" if filter
|
427
416
|
|
428
|
-
@api[api_url].get(
|
417
|
+
@api[api_url].get(@headers) { |response, request, result|
|
429
418
|
process_api_response response, request, result
|
430
419
|
}
|
431
420
|
end
|
432
421
|
|
433
422
|
def get_ep_rate_limits(ipv6, filter = nil)
|
434
|
-
api_url = "/api/xcr/
|
423
|
+
api_url = "/api/xcr/v3/cxns/#{ipv6}/ep_rate_limits"
|
435
424
|
api_url = "#{api_url}/#{filter}" if filter
|
436
425
|
|
437
|
-
@api[api_url].get(
|
426
|
+
@api[api_url].get(@headers) { |response, request, result|
|
438
427
|
process_api_response response, request, result
|
439
428
|
}
|
440
429
|
end
|
441
430
|
|
442
431
|
def update_domain_status(domain_network, status)
|
443
432
|
json = to_json(status)
|
444
|
-
@api["/api/xcr/
|
433
|
+
@api["/api/xcr/v3/domains/#{domain_network}/status"].put(json, @headers) { |response, request, result|
|
445
434
|
process_api_response response, request, result
|
446
435
|
}
|
447
436
|
end
|
448
437
|
|
449
|
-
def create_nw(nw_hash)
|
438
|
+
def create_nw(domain, nw_hash)
|
450
439
|
json = to_json(nw_hash)
|
451
|
-
|
452
|
-
@api["/api/xcr/v2/domains/#{domain_id}/nws"].post(json, @headers) {|response, request, result|
|
440
|
+
@api["/api/xcr/v3/domains/#{domain}/nws"].post(json, @headers) { |response, request, result|
|
453
441
|
process_api_response response, request, result
|
454
442
|
}
|
455
443
|
end
|
456
444
|
|
457
445
|
def update_nw(network_cidr, nw_hash)
|
458
446
|
json = to_json(nw_hash)
|
459
|
-
@api["/api/xcr/
|
447
|
+
@api["/api/xcr/v3/nws/#{network_cidr}"].put(json, @headers) { |response, request, result|
|
460
448
|
process_api_response response, request, result
|
461
449
|
}
|
462
450
|
end
|
463
451
|
|
464
452
|
def get_nw(network_cidr)
|
465
|
-
@api["/api/xcr/
|
453
|
+
@api["/api/xcr/v3/nws/#{network_cidr}"].get(@headers) { |response, request, result|
|
466
454
|
process_api_response response, request, result
|
467
455
|
}
|
468
456
|
end
|
469
457
|
|
470
|
-
def list_nw_connections(
|
471
|
-
@api["/api/xcr/
|
458
|
+
def list_nw_connections(network_cidr, file = nil)
|
459
|
+
@api["/api/xcr/v3/nws/#{network_cidr}/cxns"].get(@headers) { |response, request, result|
|
472
460
|
process_api_response response, request, result
|
473
461
|
}
|
474
462
|
end
|
475
463
|
|
476
464
|
def list_endpoint_events(ipv6)
|
477
|
-
@api["/api/xcr/
|
465
|
+
@api["/api/xcr/v3/cxns/#{ipv6}/events"].get(@headers) { |response, request, result|
|
478
466
|
process_api_response response, request, result
|
479
467
|
}
|
480
468
|
end
|
481
469
|
|
482
470
|
def list_network_events(network_cidr)
|
483
|
-
@api["/api/xcr/
|
471
|
+
@api["/api/xcr/v3/nws/#{network_cidr}/events"].get(@headers) { |response, request, result|
|
484
472
|
process_api_response response, request, result
|
485
473
|
}
|
486
474
|
end
|
487
475
|
|
488
476
|
def get_endpoint(ipv6)
|
489
|
-
@api["/api/xcr/
|
477
|
+
@api["/api/xcr/v3/cxns/#{ipv6}"].get(@headers) { |response, request, result|
|
490
478
|
process_api_response response, request, result
|
491
479
|
}
|
492
480
|
end
|
493
481
|
|
494
482
|
def update_endpoint(ipv6, name)
|
495
|
-
hash = { :
|
496
|
-
json = to_json(
|
483
|
+
hash = { ipv6: ipv6, name: name }
|
484
|
+
json = to_json(hash)
|
497
485
|
|
498
|
-
@api["/api/xcr/
|
486
|
+
@api["/api/xcr/v3/cxns/#{ipv6}"].put(json, @headers) { |response, request, result|
|
499
487
|
process_api_response response, request, result
|
500
488
|
}
|
501
489
|
end
|
502
490
|
|
503
491
|
def activate_enfnw(subnet)
|
504
|
-
@api["/api/xcr/
|
505
|
-
process_api_response response, request, result
|
506
|
-
}
|
507
|
-
end
|
508
|
-
|
509
|
-
def list_domain_users(domain_network)
|
510
|
-
@api["/api/xcr/v2/domains/#{domain_network}/users"].get( @headers) {|response, request, result|
|
511
|
-
process_api_response response, request, result
|
512
|
-
}
|
513
|
-
end
|
514
|
-
|
515
|
-
def list_domain_invites(domain_network)
|
516
|
-
@api["/api/xcr/v2/domains/#{domain_network}/invites"].get(@headers) {|response, request, result|
|
517
|
-
process_api_response response, request, result
|
518
|
-
}
|
519
|
-
end
|
520
|
-
|
521
|
-
def invite(domain_network, hash)
|
522
|
-
json = to_json( hash )
|
523
|
-
@api["/api/xcr/v2/domains/#{domain_network}/invites"].post( json, @headers) { |response, request, result|
|
524
|
-
process_api_response response, request, result
|
525
|
-
}
|
526
|
-
end
|
527
|
-
|
528
|
-
def cancel_invite(email)
|
529
|
-
@api["/api/xcr/v2/invites/#{email}"].delete( @headers) {|response, request, result|
|
530
|
-
process_api_response response, request, result
|
531
|
-
}
|
532
|
-
end
|
533
|
-
|
534
|
-
def resend_invite(email)
|
535
|
-
@api["/api/xcr/v2/invites/#{email}"].put( "{}", @headers) {|response, request, result|
|
536
|
-
process_api_response response, request, result
|
537
|
-
}
|
538
|
-
end
|
539
|
-
|
540
|
-
def update_user_status(user_id, status)
|
541
|
-
json = to_json( status )
|
542
|
-
@api["/api/xcr/v2/users/#{user_id}/status"].put( json, @headers) { |response, request, result|
|
492
|
+
@api["/api/xcr/v3/enfnws/#{subnet}"].put("", @headers) { |response, request, result|
|
543
493
|
process_api_response response, request, result
|
544
494
|
}
|
545
495
|
end
|
546
496
|
|
547
|
-
############################################################################################################################
|
548
|
-
# Private functions
|
549
|
-
############################################################################################################################
|
497
|
+
############################################################################################################################
|
498
|
+
# Private functions
|
499
|
+
############################################################################################################################
|
550
500
|
def process_api_response(response, request, result)
|
551
501
|
case response.code
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
502
|
+
when 200
|
503
|
+
# return json
|
504
|
+
from_json(response.body)
|
505
|
+
when 201
|
506
|
+
# return response body
|
507
|
+
from_json(response.body)
|
508
|
+
when 400
|
509
|
+
# api returns and error
|
510
|
+
raise EnfApi::ERROR, api_error_msg(from_json(response.body))
|
511
|
+
when 401
|
512
|
+
# api returns and error
|
513
|
+
raise EnfApi::ERROR, api_error_msg(from_json(response.body))
|
514
|
+
when 403
|
515
|
+
# api returns and error
|
516
|
+
raise EnfApi::ERROR, "AUTHORIZATION_ERROR: User is not authorized to perform this operation!"
|
517
|
+
when 404
|
518
|
+
# api returns an error
|
519
|
+
# for the 404, we're going to check if it is JSON before parsing the
|
520
|
+
# error message
|
521
|
+
begin
|
522
|
+
JSON.parse(response.body)
|
562
523
|
raise EnfApi::ERROR, api_error_msg(from_json(response.body))
|
563
|
-
|
564
|
-
|
565
|
-
|
524
|
+
rescue JSON::ParserError => e
|
525
|
+
raise EnfApi::ERROR, "Not Found"
|
526
|
+
end
|
527
|
+
when 500
|
528
|
+
begin
|
529
|
+
JSON.parse(response.body)
|
566
530
|
raise EnfApi::ERROR, api_error_msg(from_json(response.body))
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
when 404
|
573
|
-
# api returns an error
|
574
|
-
# for the 404, we're going to check if it is JSON before parsing the
|
575
|
-
# error message
|
576
|
-
begin
|
577
|
-
JSON.parse(response.body)
|
578
|
-
raise EnfApi::ERROR, api_error_msg(from_json(response.body))
|
579
|
-
rescue JSON::ParserError => e
|
580
|
-
raise EnfApi::ERROR, "Not Found"
|
581
|
-
end
|
582
|
-
|
583
|
-
else
|
584
|
-
raise EnfApi::ERROR, "Unexpected error! Please try again!"
|
531
|
+
rescue JSON::ParserError => e
|
532
|
+
raise EnfApi::ERROR, "Server error was received without details."
|
533
|
+
end
|
534
|
+
else
|
535
|
+
raise EnfApi::ERROR, "Unexpected error! Please try again!"
|
585
536
|
end
|
586
537
|
end
|
587
538
|
|
588
539
|
def from_json(string)
|
589
|
-
|
590
|
-
JSON.parse(string, {:symbolize_names => true})
|
591
|
-
rescue
|
592
|
-
raise EnfApi::ERROR, "Unable to parse api response json!"
|
593
|
-
end
|
540
|
+
EnfApi::from_json(string)
|
594
541
|
end
|
595
542
|
|
596
543
|
def to_json(hash)
|
597
|
-
|
544
|
+
EnfApi::to_json(hash)
|
598
545
|
end
|
599
546
|
|
600
547
|
def api_error_msg(err)
|