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.
@@ -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