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.
@@ -0,0 +1,95 @@
1
+ #
2
+ # Copyright 2020 Xaptum,Inc
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ module EnfApi
17
+ class Dns
18
+ include Singleton
19
+
20
+ def initialize
21
+ @version = "v1"
22
+ @xdns_base_url = "/api/xdns/#{@version}"
23
+ end
24
+
25
+ def list_zones(domain)
26
+ EnfApi::API.instance.get "#{@xdns_base_url}/zones?enf_domain=#{domain}"
27
+ end
28
+
29
+ def create_dns_zone(new_zone)
30
+ json = EnfApi::to_json(new_zone)
31
+ EnfApi::API.instance.post "#{@xdns_base_url}/zones", json
32
+ end
33
+
34
+ def update_dns_zone(zone_id, updated_zone)
35
+ json = EnfApi::to_json(updated_zone)
36
+ EnfApi::API.instance.put "#{@xdns_base_url}/zones/#{zone_id}", json
37
+ end
38
+
39
+ def delete_dns_zone(zone_id)
40
+ EnfApi::API.instance.delete "#{@xdns_base_url}/zones/#{zone_id}"
41
+ end
42
+
43
+ def add_networks_to_zone(zone_id, add_networks)
44
+ json = EnfApi::to_json(add_networks)
45
+ EnfApi::API.instance.post "#{@xdns_base_url}/zones/#{zone_id}/networks", json
46
+ end
47
+
48
+ def replace_networks_in_zone(zone_id, replace_networks)
49
+ json = EnfApi::to_json(replace_networks)
50
+ EnfApi::API.instance.put "#{@xdns_base_url}/zones/#{zone_id}/networks", json
51
+ end
52
+
53
+ def list_networks_in_zone(zone_id)
54
+ EnfApi::API.instance.get "#{@xdns_base_url}/zones/#{zone_id}/networks"
55
+ end
56
+
57
+ def delete_networks_from_zone(zone_id, delete_networks)
58
+ EnfApi::API.instance.delete "#{@xdns_base_url}/zones/#{zone_id}/networks?delete=#{delete_networks}"
59
+ end
60
+
61
+ def list_zones_in_network(network)
62
+ EnfApi::API.instance.get "#{@xdns_base_url}/networks/#{network}/zones"
63
+ end
64
+
65
+ def provision_server(network, new_server)
66
+ json = EnfApi::to_json(new_server)
67
+ EnfApi::API.instance.post "#{@xdns_base_url}/networks/#{network}/servers", json
68
+ end
69
+
70
+ def list_servers(network)
71
+ EnfApi::API.instance.get "#{@xdns_base_url}/networks/#{network}/servers"
72
+ end
73
+
74
+ def delete_server(network, server_ipv6)
75
+ EnfApi::API.instance.delete "#{@xdns_base_url}/networks/#{network}/servers/#{server_ipv6}"
76
+ end
77
+
78
+ def create_dns_record(zone_id, new_record)
79
+ json = EnfApi::to_json(new_record)
80
+ EnfApi::API.instance.post "#{@xdns_base_url}/zones/#{zone_id}/records", json
81
+ end
82
+
83
+ def list_dns_records(zone_id)
84
+ EnfApi::API.instance.get "#{@xdns_base_url}/zones/#{zone_id}/records"
85
+ end
86
+
87
+ def query(network, type, name)
88
+ EnfApi::API.instance.get "#{@xdns_base_url}/networks/#{network}/query/#{type}/#{name}"
89
+ end
90
+
91
+ def delete_dns_record(record_id)
92
+ EnfApi::API.instance.delete "#{@xdns_base_url}/records/#{record_id}"
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,37 @@
1
+ #
2
+ # Copyright 2020 Xaptum,Inc
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require "singleton"
18
+
19
+ module EnfApi
20
+ class Firewall
21
+ include Singleton
22
+
23
+ def list_firewall_rules(network)
24
+ EnfApi::API.instance.get "/api/xfw/v1/#{network}/rule"
25
+ end
26
+
27
+ def add_firewall_rule(network, rule)
28
+ rule_json = EnfApi::to_json(rule)
29
+ EnfApi::API.instance.post "/api/xfw/v1/#{network}/rule", rule_json
30
+ end
31
+
32
+ def delete_firewall_rules(network, id = nil)
33
+ # Same method to call to delete all firewall rules in a network. if id is nil
34
+ EnfApi::API.instance.delete "/api/xfw/v1/#{network}/rule/#{id}"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,75 @@
1
+ #
2
+ # Copyright 2020 Xaptum,Inc
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ module EnfApi
17
+ class UserManager
18
+ include Singleton
19
+
20
+ def initialize
21
+ @version = "v3"
22
+ @xcr_base_url = "/api/xcr/#{@version}"
23
+ end
24
+
25
+ def list_users(query)
26
+ EnfApi::API.instance.get "#{@xcr_base_url}/users#{query}"
27
+ end
28
+
29
+ def get_user(email)
30
+ EnfApi::API.instance.get "#{@xcr_base_url}/users/#{email}"
31
+ end
32
+
33
+ def list_user_roles(user, network)
34
+ url = "#{@xcr_base_url}/users/#{user}/roles"
35
+ url += "?network=#{network}" if network
36
+ EnfApi::API.instance.get url
37
+ end
38
+
39
+ def delete_user_roles(user_id, roles, network)
40
+ url = "#{@xcr_base_url}/users/#{user_id}/roles?roles=#{roles}"
41
+ url += "&network=#{network}" if network
42
+ EnfApi::API.instance.delete url
43
+ end
44
+
45
+ def add_user_role(user_id, role_hash)
46
+ json = EnfApi::to_json(role_hash)
47
+ url = "#{@xcr_base_url}/users/#{user_id}/roles"
48
+ EnfApi::API.instance.post url, json
49
+ end
50
+
51
+ def list_invites(domain)
52
+ url = "#{@xcr_base_url}/invites"
53
+ url += "?domain=#{domain}" if domain
54
+ EnfApi::API.instance.get url
55
+ end
56
+
57
+ def invite(hash)
58
+ json = EnfApi::to_json(hash)
59
+ EnfApi::API.instance.post "#{@xcr_base_url}/invites", json
60
+ end
61
+
62
+ def delete_invite(invite_id)
63
+ EnfApi::API.instance.delete "#{@xcr_base_url}/invites/#{invite_id}"
64
+ end
65
+
66
+ def resend_invite(invite_id)
67
+ EnfApi::API.instance.put "#{@xcr_base_url}/invites/#{invite_id}", "{}"
68
+ end
69
+
70
+ def update_user_status(user_id, status)
71
+ json = EnfApi::to_json(status)
72
+ EnfApi::API.instance.put "#{@xcr_base_url}/users/#{user_id}/status", json
73
+ end
74
+ end
75
+ end
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright 2018 Xaptum,Inc
2
+ # Copyright 2018-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,26 +13,30 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- require 'openssl'
17
- require 'enfapi'
18
- require 'enfthor'
19
- require 'readline'
20
- require 'singleton'
21
- require 'ipaddr'
22
-
23
- require 'rubygems/commands/update_command'
24
- require 'rubygems/commands/search_command'
25
-
26
-
27
- require 'enfcli/version'
28
- require 'enfcli/commands/xcr'
29
- require 'enfcli/commands/xiam'
30
- require 'enfcli/commands/xfw'
31
- require 'enfcli/commands/user'
32
- require 'enfcli/commands/captive'
33
- require 'enfcli/commands/xdns'
16
+ require "openssl"
17
+ require "enfapi"
18
+ require "enfthor"
19
+ require "readline"
20
+ require "singleton"
21
+ require "ipaddr"
22
+ require "clipboard"
23
+ require "json"
24
+ require "securerandom"
25
+
26
+ require "rubygems/commands/update_command"
27
+ require "rubygems/commands/search_command"
28
+
29
+ require "enfcli/version"
30
+ require "enfcli/commands/xcr"
31
+ require "enfcli/commands/xiam"
32
+ require "enfcli/commands/xfw"
33
+ require "enfcli/commands/user"
34
+ require "enfcli/commands/captive"
35
+ require "enfcli/commands/xdns"
34
36
 
35
37
  module EnfCli
38
+ CONFIG_FILE = "#{Dir.home() + "/.xaptum_config.json"}"
39
+
36
40
  FIREWALL_CMD = "firewall"
37
41
  IAM_CMD = "iam"
38
42
  NETWORK_CMD = "network"
@@ -63,13 +67,13 @@ module EnfCli
63
67
  @ip.hton
64
68
  end
65
69
 
66
- def self.ntoh ipv6_bytes
67
- ip = IPAddr::new_ntoh( ipv6_bytes )
70
+ def self.ntoh(ipv6_bytes)
71
+ ip = IPAddr::new_ntoh(ipv6_bytes)
68
72
  EnfCli::IPV6.new ip.to_s
69
73
  end
70
74
 
71
75
  private
72
-
76
+
73
77
  attr_accessor :ip
74
78
  end
75
79
 
@@ -84,10 +88,9 @@ module EnfCli
84
88
  # store in prefix/len
85
89
  @prefix = EnfCli::IPV6.new tokens[0]
86
90
  @len = tokens[1].to_i
87
-
91
+
88
92
  # raise if len is not 0
89
93
  raise EnfCli::ERROR, "#{ipv6cidr} is not a valid CIDR notation." unless len > 2
90
-
91
94
  end
92
95
 
93
96
  def prefix_bytes
@@ -101,47 +104,47 @@ module EnfCli
101
104
  def to_s
102
105
  "#{@prefix.to_s}/#{@len}"
103
106
  end
104
-
107
+
105
108
  private
109
+
106
110
  attr_accessor :prefix, :len
107
111
  end
108
-
112
+
109
113
  def self.ask_password(prompt = nil)
110
114
  begin
111
- prompt = 'Enter Password:' unless prompt
115
+ prompt ||= "Enter Password:"
112
116
  print prompt
113
117
  # We hide the entered characters before to ask for the password
114
- system 'stty -echo'
118
+ system "stty -echo"
115
119
  password = $stdin.gets.chomp
116
- system 'stty echo'
120
+ system "stty echo"
117
121
  puts ""
118
122
  return password
119
-
120
123
  rescue NoMethodError, Interrupt
121
124
  # When the process is exited, we display the characters again
122
125
  # And we exit
123
- system 'stty echo'
126
+ system "stty echo"
124
127
  exit
125
128
  end
126
129
  end
127
130
 
128
131
  def self.generate_ec_cert(key, ipv6)
129
- # monkey patch
132
+ # monkey patch
130
133
  OpenSSL::PKey::EC.send(:alias_method, :private?, :private_key?)
131
-
134
+
132
135
  # Generate cert
133
136
  cert = OpenSSL::X509::Certificate.new
134
- cert.subject = cert.issuer = OpenSSL::X509::Name.new([['CN', "#{ipv6}"]])
137
+ cert.subject = cert.issuer = OpenSSL::X509::Name.new([["CN", ipv6.to_s]])
135
138
  cert.not_before = Time.now
136
139
  cert.not_after = Time.now + 365 * 24 * 60 * 60
137
140
  cert.public_key = key
138
- cert.serial = 0x0
141
+ cert.serial = SecureRandom.random_number(2 ** 159 - 2) + 1
139
142
  cert.version = 2
140
-
141
- cert.sign key, OpenSSL::Digest::SHA1.new
143
+
144
+ cert.sign key, OpenSSL::Digest::SHA256.new
142
145
  cert
143
- end
144
-
146
+ end
147
+
145
148
  def self.expand_path(file)
146
149
  new_file = File.expand_path(EnfCli::expand_env(file))
147
150
  end
@@ -154,7 +157,7 @@ module EnfCli
154
157
  ip = EnfCli::IPV6.new ipv6
155
158
  ip.to_s
156
159
  end
157
-
160
+
158
161
  ##
159
162
  # EnfCli error
160
163
  #
@@ -174,38 +177,67 @@ module EnfCli
174
177
 
175
178
  def initialize
176
179
  @prompt = "enfcli"
177
- @host = ''
180
+ @host = ""
181
+ @user = ""
182
+ @session = nil
183
+ end
184
+
185
+ def init(host, user, session)
186
+ @host = host
187
+ @user = user
188
+ @session = session
189
+ @prompt = "enfcli-#{user}" if user
178
190
  end
179
191
 
180
192
  def xaptum_admin?
181
- self.user_role == "XAPTUM_ADMIN"
193
+ has_role? "XAPTUM_ADMIN"
182
194
  end
183
195
 
184
- def user_role
185
- @session[:type]
196
+ def domain_admin?
197
+ has_role? "DOMAIN_ADMIN"
186
198
  end
187
199
 
188
- def host
189
- "#{@host}"
200
+ def domain_user?
201
+ has_role? "DOMAIN_USER"
190
202
  end
191
203
 
192
- def host=(value)
193
- @host = value
204
+ def network_admin?
205
+ has_role? "NETWORK_ADMIN"
194
206
  end
195
207
 
196
- def prompt
197
- "\001\033[1;32m\002#{@prompt}>\001\033[0m\002 "
208
+ def network_user?
209
+ has_role? "NETWORK_USER"
198
210
  end
199
211
 
200
- def prompt=(value)
201
- if value
202
- @prompt = "enfcli-#{value}"
203
- else
204
- @prompt= "enfcli"
212
+ def edit_domain_role?
213
+ xaptum_admin? || domain_admin?
214
+ end
215
+
216
+ def has_role?(role)
217
+ all_roles = @session[:roles]
218
+ all_roles.each do |cur_role|
219
+ if cur_role[:role] == role
220
+ return true
221
+ end
205
222
  end
206
-
223
+ false
224
+ end
225
+
226
+ def host
227
+ @host.to_s
228
+ end
229
+
230
+ def auth_token
231
+ @session[:token]
232
+ end
233
+
234
+ def user
235
+ @user
236
+ end
237
+
238
+ def prompt
239
+ "\001\033[1;32m\002#{@prompt}>\001\033[0m\002 "
207
240
  end
208
-
209
241
  end
210
242
 
211
243
  ##
@@ -213,75 +245,112 @@ module EnfCli
213
245
  #
214
246
  class CLI < EnfThor
215
247
  no_commands {
216
- def execute_gem_cmd cmd
217
- begin
248
+ def execute_gem_cmd(cmd)
249
+ begin
218
250
  cmd.execute
219
251
  rescue Gem::SystemExitException => e
220
252
  say "Unable to execute commnad. Please try again!", :red
221
253
  end
222
254
  end
223
255
  }
224
-
256
+
225
257
  desc "connect", "Connect to ENF Controller"
226
- method_option :host, :type => :string, :required => true
227
- method_option :user, :type => :string, :required => true
228
- method_option :password, :type => :string
258
+ method_option :host, type: :string
259
+ method_option :user, type: :string
260
+
229
261
  def connect(*names)
230
- host = options[:host]
231
- user = options[:user]
262
+ host = ""
263
+ user = ""
232
264
 
233
265
  try_with_rescue do
266
+ ## first check for command options
267
+ if options[:host] && options[:user]
268
+ host = options[:host]
269
+ user = options[:user]
270
+ elsif File.file?(CONFIG_FILE) # then check for config file
271
+ config_json = JSON.load(File.open(CONFIG_FILE))
272
+ host = config_json["host"]
273
+ user = config_json["user"]
274
+ else
275
+ raise EnfCli::ERROR, "You must either specify the --host and --user parameters or create a Xaptum config file to connect."
276
+ end
277
+
234
278
  # Make sure to use https as default
235
279
  host = "https://#{host}" unless host =~ /^(http|https):\/\//
236
-
280
+
237
281
  # Ask for password
238
282
  say "Connecting to '#{host}'.....", :bold
239
283
  password = EnfCli::ask_password()
240
-
284
+
241
285
  # Authenticate
242
286
  resp = EnfApi::API.instance.authenticate(host, user, password)
243
287
 
244
- # set session
245
- EnfCli::CTX.instance.session = resp[:data][0]
288
+ # initialize CTX
289
+ EnfCli::CTX.instance.init host, user, resp[:data][0]
246
290
 
247
291
  # launch shell/exec cmd
248
292
  if names.empty?
249
- EnfCli::Shell::Console::start host, user
293
+ EnfCli::Shell::Console::start
250
294
  else
251
295
  EnfCli::Shell::CLI.start names
252
296
  end
253
297
  end
254
- end
298
+ end
255
299
 
256
300
  map %w[--version -v] => :__print_version
257
301
  desc "--version, -v", "print the version"
302
+
258
303
  def __print_version
259
304
  puts EnfCli::VERSION
260
305
  end
261
306
 
262
- desc "update", "", :hide => true
307
+ desc "update", "", hide: true
308
+
263
309
  def update
264
310
  cmd = Gem::Commands::UpdateCommand.new
265
- cmd.handle_options ['enfcli']
311
+ cmd.handle_options ["enfcli"]
266
312
  execute_gem_cmd cmd
267
313
  end
268
314
 
269
- desc "search", "", :hide => true
315
+ desc "search", "", hide: true
316
+
270
317
  def search
271
318
  cmd = Gem::Commands::SearchCommand.new
272
319
  cmd.handle_options ["enfcli"]
273
320
  execute_gem_cmd cmd
274
321
  end
275
322
 
323
+ desc "create-config-file", "Create a Xaptum configuration file in your home directory"
324
+ method_option :host, type: :string, required: true
325
+ method_option :user, type: :string, required: true
326
+
327
+ def create_config_file
328
+ host = options[:host]
329
+ user = options[:user]
330
+ config_file = File.new(CONFIG_FILE, "w+")
331
+ config_file.puts({ host: host, user: user }.to_json)
332
+ config_file.close
333
+ say "Config file created successfully at #{CONFIG_FILE}!", :green
334
+ end
335
+
336
+ desc "display-config-file", "Displays your Xaptum configuraton file, if it exists"
337
+
338
+ def display_config_file
339
+ file = CONFIG_FILE
340
+
341
+ ## return if file not found
342
+ raise EnfCli::ERROR, "#{file} not found!" unless File.exists?(file)
343
+
344
+ say File.readlines(file).join
345
+ end
346
+
276
347
  default_task :connect
277
-
278
348
  end
279
349
 
280
350
  ##
281
351
  # Shell Module
282
352
  #
283
353
  module Shell
284
-
285
354
  class Console
286
355
  class << self
287
356
  def execute(input)
@@ -289,61 +358,57 @@ module EnfCli
289
358
  argv = input.split(/[\s=](?=(?:[^"]|"[^"]*")*$)/)
290
359
  # now remove quotes.
291
360
  argv.each do |arg|
292
- arg.gsub!(/\A"|"\Z/, '')
361
+ arg.gsub!(/\A"|"\Z/, "")
293
362
  end
294
363
  EnfCli::Shell::CLI.start(argv)
295
364
  end
296
365
 
297
- def start(host, user)
366
+ def start
298
367
  $stdout.sync = true
299
- # Set prompt
300
- EnfCli::CTX.instance.prompt = user
301
368
 
302
- # Set host
303
- EnfCli::CTX.instance.host = host
304
-
305
369
  # Read each line
306
- comp = proc { |s| Readline::HISTORY.grep(/^#{Regexp.escape(s)}/) }
370
+ comp = proc { |s| Readline::HISTORY.grep(/^#{Regexp.escape(s)}/) }
307
371
  Readline.completion_append_character = " "
308
372
  Readline.completion_proc = comp
309
373
 
310
374
  stty_save = `stty -g`.chomp
311
- trap('INT') { system('stty', stty_save); exit }
312
-
375
+ trap("INT") { system("stty", stty_save); exit }
376
+
313
377
  while input = Readline.readline(EnfCli::CTX.instance.prompt, true)
314
- break if input == "exit" or input == "\\q" or input == "quit"
315
-
378
+ break if input == "exit" or input == '\q' or input == "quit"
379
+
316
380
  # Remove blank lines from history
317
381
  Readline::HISTORY.pop if input == ""
318
-
382
+
319
383
  execute(input) unless input == ""
320
384
  end
321
- end
322
- end
385
+ end
386
+ end
323
387
  end
324
388
 
325
389
  # Shell CLI class
326
- class CLI < EnfThor
390
+ class CLI < EnfCli::EnfThor
391
+ desc "ls [<dir>]", "List files in a directory", hide: true
392
+ method_option :dir, type: :string, required: false
327
393
 
328
- desc "ls [<dir>]", "List files in a directory", :hide => true
329
- method_option :dir, :type => :string, :required => false
330
394
  def ls(dir = nil)
331
395
  try_with_rescue do
332
- dir = "." unless dir
333
- dir = EnfCli::expand_path( dir )
334
-
335
- Dir.entries( dir ).each{ |f|
336
- puts f unless f.start_with?('.')
396
+ dir ||= "."
397
+ dir = EnfCli::expand_path(dir)
398
+
399
+ Dir.entries(dir).each { |f|
400
+ puts f unless f.start_with?(".")
337
401
  }
338
402
  end
339
403
  end
340
404
 
341
- desc "cat <file>", "Display contents of a file", :hide => true
405
+ desc "cat <file>", "Display contents of a file", hide: true
406
+
342
407
  def cat(file)
343
408
  try_with_rescue do
344
409
  # expand path
345
410
  file = EnfCli::expand_path(file)
346
-
411
+
347
412
  ## return if keyfile not found
348
413
  raise EnfCli::ERROR, "#{file} not found!" unless File.exists?(file)
349
414
 
@@ -351,43 +416,79 @@ module EnfCli
351
416
  end
352
417
  end
353
418
 
354
- desc "pwd", "Current Working Directory", :hide => true
419
+ desc "pwd", "Current Working Directory", hide: true
420
+
355
421
  def pwd
356
422
  try_with_rescue do
357
423
  say Dir.pwd
358
424
  end
359
425
  end
360
426
 
361
- desc "cd [<dir>]", "Change working directory", :hide => true
427
+ desc "cd [<dir>]", "Change working directory", hide: true
428
+
362
429
  def cd(dir = "~")
363
430
  try_with_rescue do
364
- dir = EnfCli::expand_path( dir )
431
+ dir = EnfCli::expand_path(dir)
365
432
  raise EnfCli::ERROR, "No such directory #{dir}" unless Dir.exist?(dir)
433
+
366
434
  Dir.chdir(dir)
367
435
  end
368
436
  end
369
437
 
370
- desc "host", "Display ENF Controller host", :hide => true
438
+ desc "host", "Display ENF Controller host", hide: true
439
+
371
440
  def host
372
441
  try_with_rescue do
373
442
  say EnfCli::CTX.instance.host, :bold
374
443
  end
375
444
  end
376
-
377
- desc "clear", "Clear Terminal Screen", :hide => true
445
+
446
+ desc "clear", "Clear Terminal Screen", hide: true
447
+
378
448
  def clear
379
449
  try_with_rescue do
380
450
  clear_code = %x{clear}
381
451
  print clear_code or system("cls")
382
452
  end
383
453
  end
384
-
454
+
455
+ desc "display-session-token", "Gets the current session token"
456
+
457
+ def display_session_token
458
+ try_with_rescue_in_session do
459
+ say EnfCli::CTX.instance.auth_token.to_s
460
+ end
461
+ end
462
+
463
+ desc "refresh-session-token", "Refreshes the current session token"
464
+
465
+ def refresh_session_token
466
+ try_with_rescue_in_session do
467
+ # Get user and host
468
+ host = EnfCli::CTX.instance.host
469
+ user = EnfCli::CTX.instance.user
470
+
471
+ # Ask for password
472
+ say "Refreshing session token.....", :bold
473
+ password = EnfCli::ask_password()
474
+
475
+ # Authenticate
476
+ resp = EnfApi::API.instance.authenticate(host, user, password)
477
+
478
+ # update session
479
+ EnfCli::CTX.instance.session = resp[:data][0]
480
+
481
+ # display success
482
+ say "Refreshed session token!", :green
483
+ end
484
+ end
485
+
385
486
  desc "#{EnfCli::NETWORK_CMD} COMMANDS", "#{EnfCli::NETWORK_CMD} commands"
386
487
  subcommand EnfCli::NETWORK_CMD, EnfCli::Cmd::Xcr
387
-
488
+
388
489
  desc "#{EnfCli::IAM_CMD} COMMANDS", "#{EnfCli::IAM_CMD} commands"
389
490
  subcommand EnfCli::IAM_CMD, EnfCli::Cmd::Xiam
390
-
491
+
391
492
  desc "#{EnfCli::FIREWALL_CMD} COMMANDS", "#{EnfCli::FIREWALL_CMD} commands"
392
493
  subcommand EnfCli::FIREWALL_CMD, EnfCli::Cmd::Xfw
393
494
 
@@ -401,5 +502,4 @@ module EnfCli
401
502
  subcommand EnfCli::DNS_CMD, EnfCli::Cmd::Xdns
402
503
  end
403
504
  end
404
-
405
505
  end