enfcli 4.0.0 → 5.0.0.pre.alpha
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|