morpheus-cli 3.6.12 → 3.6.13

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/lib/morpheus/api/clouds_interface.rb +2 -2
  3. data/lib/morpheus/cli/account_groups_command.rb +84 -106
  4. data/lib/morpheus/cli/apps.rb +12 -11
  5. data/lib/morpheus/cli/archives_command.rb +2 -9
  6. data/lib/morpheus/cli/blueprints_command.rb +0 -8
  7. data/lib/morpheus/cli/boot_scripts_command.rb +3 -6
  8. data/lib/morpheus/cli/cli_command.rb +6 -2
  9. data/lib/morpheus/cli/cloud_datastores_command.rb +2 -5
  10. data/lib/morpheus/cli/clouds.rb +9 -10
  11. data/lib/morpheus/cli/commands/standard/history_command.rb +7 -3
  12. data/lib/morpheus/cli/containers_command.rb +0 -1
  13. data/lib/morpheus/cli/cypher_command.rb +0 -2
  14. data/lib/morpheus/cli/deployments.rb +6 -5
  15. data/lib/morpheus/cli/deploys.rb +0 -2
  16. data/lib/morpheus/cli/groups.rb +7 -10
  17. data/lib/morpheus/cli/hosts.rb +7 -4
  18. data/lib/morpheus/cli/image_builder_command.rb +1 -7
  19. data/lib/morpheus/cli/instances.rb +26 -40
  20. data/lib/morpheus/cli/key_pairs.rb +2 -2
  21. data/lib/morpheus/cli/library_option_lists_command.rb +13 -19
  22. data/lib/morpheus/cli/library_option_types_command.rb +2 -2
  23. data/lib/morpheus/cli/license.rb +0 -1
  24. data/lib/morpheus/cli/load_balancers.rb +1 -2
  25. data/lib/morpheus/cli/mixins/accounts_helper.rb +4 -12
  26. data/lib/morpheus/cli/mixins/print_helper.rb +53 -2
  27. data/lib/morpheus/cli/mixins/processes_helper.rb +0 -1
  28. data/lib/morpheus/cli/mixins/whoami_helper.rb +0 -1
  29. data/lib/morpheus/cli/monitoring_contacts_command.rb +0 -1
  30. data/lib/morpheus/cli/network_domains_command.rb +1 -4
  31. data/lib/morpheus/cli/network_groups_command.rb +2 -5
  32. data/lib/morpheus/cli/network_pool_servers_command.rb +2 -5
  33. data/lib/morpheus/cli/network_pools_command.rb +2 -5
  34. data/lib/morpheus/cli/network_proxies_command.rb +2 -5
  35. data/lib/morpheus/cli/network_services_command.rb +2 -5
  36. data/lib/morpheus/cli/networks_command.rb +2 -5
  37. data/lib/morpheus/cli/old_cypher_command.rb +0 -2
  38. data/lib/morpheus/cli/policies_command.rb +1 -4
  39. data/lib/morpheus/cli/preseed_scripts_command.rb +2 -5
  40. data/lib/morpheus/cli/remote.rb +3 -4
  41. data/lib/morpheus/cli/roles.rb +5 -5
  42. data/lib/morpheus/cli/security_group_rules.rb +0 -1
  43. data/lib/morpheus/cli/security_groups.rb +0 -1
  44. data/lib/morpheus/cli/shell.rb +89 -38
  45. data/lib/morpheus/cli/storage_providers_command.rb +2 -5
  46. data/lib/morpheus/cli/tasks.rb +2 -3
  47. data/lib/morpheus/cli/users.rb +1 -1
  48. data/lib/morpheus/cli/version.rb +1 -1
  49. data/lib/morpheus/cli/virtual_images.rb +4 -7
  50. data/lib/morpheus/cli/whoami.rb +1 -1
  51. data/lib/morpheus/cli/workflows.rb +0 -2
  52. data/lib/morpheus/formatters.rb +17 -0
  53. data/lib/morpheus/logging.rb +17 -7
  54. data/morpheus-cli.gemspec +0 -1
  55. metadata +2 -16
@@ -1,7 +1,6 @@
1
1
  require 'rest_client'
2
2
  require 'optparse'
3
3
  require 'filesize'
4
- require 'table_print'
5
4
  require 'morpheus/cli/cli_command'
6
5
 
7
6
  class Morpheus::Cli::PreseedScriptsCommand
@@ -369,12 +368,10 @@ class Morpheus::Cli::PreseedScriptsCommand
369
368
  elsif preseed_scripts.size > 1
370
369
  print_red_alert "#{preseed_scripts.size} preseed scripts found by name #{name}"
371
370
  # print_preseed_scripts_table(preseed_scripts, {color: red})
372
- rows = preseed_scripts.collect do |preseed_script|
371
+ rows = preseed_scripts.collect do |it|
373
372
  {id: it['id'], name: it['fileName']}
374
373
  end
375
- print red
376
- tp rows, [:id, :name]
377
- print reset,"\n"
374
+ puts as_pretty_table(rows, [:id, :name], {color:red})
378
375
  return nil
379
376
  else
380
377
  return preseed_scripts[0]
@@ -71,10 +71,9 @@ EOT
71
71
  print reset, "\n"
72
72
  else
73
73
  print cyan
74
- #tp rows, {:active => {:display_name => ""}}, {:name => {:width => 16}}, {:host => {:width => 40}}
75
74
  columns = [
76
- {:active => {:display_name => "", :display_method => lambda {|it| it[:active] ? "=>" : "" } } },
77
- {:name => {:width => 16} },
75
+ #{:active => {:display_name => "", :display_method => lambda {|it| it[:active] ? "=>" : "" } } },
76
+ {:name => {display_method: lambda {|it| it[:active] ? "#{green}#{it[:name]}#{reset}#{cyan}" : it[:name] }, :width => 16 } },
78
77
  {:url => {display_method: lambda {|it| it[:host] || it[:url] }, :width => 40 } },
79
78
  {:version => lambda {|it| it[:build_version] } },
80
79
  {:status => lambda {|it| format_appliance_status(it, cyan) } },
@@ -86,7 +85,7 @@ EOT
86
85
  print reset
87
86
  if @appliance_name
88
87
  #unless appliances.keys.size == 1
89
- print cyan, "\n# => Currently using #{@appliance_name}\n", reset
88
+ print cyan, "\n# => Currently using remote #{green}#{@appliance_name}#{reset}\n", reset
90
89
  #end
91
90
  else
92
91
  print "\n# => No current remote appliance, see `remote use`\n", reset
@@ -200,7 +200,7 @@ class Morpheus::Cli::Roles
200
200
  access: get_access_string(it['access']),
201
201
  }
202
202
  end
203
- tp rows, [:code, :name, :access]
203
+ print as_pretty_table(rows, [:code, :name, :access], options)
204
204
  else
205
205
  puts "Use --feature-access to list feature access"
206
206
  end
@@ -216,7 +216,7 @@ class Morpheus::Cli::Roles
216
216
  access: get_access_string(it['access']),
217
217
  }
218
218
  end
219
- tp rows, [:name, :access]
219
+ print as_pretty_table(rows, [:name, :access], options)
220
220
  else
221
221
  puts "Use --group-access to list custom access"
222
222
  end
@@ -233,7 +233,7 @@ class Morpheus::Cli::Roles
233
233
  access: get_access_string(it['access']),
234
234
  }
235
235
  end
236
- tp rows, [:name, :access]
236
+ print as_pretty_table(rows, [:name, :access], options)
237
237
  else
238
238
  puts "Use --cloud-access to list custom access"
239
239
  end
@@ -250,7 +250,7 @@ class Morpheus::Cli::Roles
250
250
  access: get_access_string(it['access']),
251
251
  }
252
252
  end
253
- tp rows, [:name, :access]
253
+ print as_pretty_table(rows, [:name, :access], options)
254
254
  else
255
255
  puts "Use --instance-type-access to list custom access"
256
256
  end
@@ -269,7 +269,7 @@ class Morpheus::Cli::Roles
269
269
  access: get_access_string(it['access']),
270
270
  }
271
271
  end
272
- tp rows, [:name, :access]
272
+ print as_pretty_table(rows, [:name, :access], options)
273
273
  else
274
274
  puts "Use --blueprint-access to list custom access"
275
275
  end
@@ -3,7 +3,6 @@ require 'io/console'
3
3
  require 'rest_client'
4
4
  require 'optparse'
5
5
  require 'filesize'
6
- require 'table_print'
7
6
  require 'morpheus/cli/cli_command'
8
7
 
9
8
  class Morpheus::Cli::SecurityGroupRules
@@ -3,7 +3,6 @@ require 'io/console'
3
3
  require 'rest_client'
4
4
  require 'optparse'
5
5
  require 'filesize'
6
- require 'table_print'
7
6
  require 'morpheus/cli/cli_command'
8
7
 
9
8
  class Morpheus::Cli::SecurityGroups
@@ -246,10 +246,10 @@ class Morpheus::Cli::Shell
246
246
  # logs entire input as one command in shell history
247
247
  # logging is skipped for certain commands: exit, !, !!
248
248
  def execute(input)
249
- result = execute_commands_as_expression(input)
250
- unless input.strip.empty? || (["exit"].include?(input.strip)) || input.strip[0].to_s.chr == "!"
249
+ unless input.strip.empty? || input.strip[0] == "!"
251
250
  log_history_command(input.strip)
252
251
  end
252
+ result = execute_commands_as_expression(input)
253
253
  return result
254
254
  end
255
255
 
@@ -331,7 +331,7 @@ class Morpheus::Cli::Shell
331
331
 
332
332
  if input == 'exit'
333
333
  #print cyan,"Goodbye\n",reset
334
- @history_logger.info "exit" if @history_logger
334
+ #@history_logger.info "exit" if @history_logger
335
335
  @exit_now_please = true
336
336
  return 0
337
337
  #exit 0
@@ -620,7 +620,41 @@ class Morpheus::Cli::Shell
620
620
  return logger
621
621
  end
622
622
 
623
- def load_history_from_log_file(n_commands=1000)
623
+ def load_history_from_log_file
624
+
625
+ # @history ||= {}
626
+ # @last_command_number ||= 0
627
+ @history = {}
628
+ @last_command_number = 0
629
+
630
+ begin
631
+ file_path = history_file_path
632
+ FileUtils.mkdir_p(File.dirname(file_path))
633
+
634
+ File.open(file_path).each_line do |line|
635
+ # this is pretty goofy, but this looks for the format: (cmd $command_number) $command_string
636
+ matches = line.match(/\(cmd (\d+)\) (.+)/)
637
+ if matches && matches.size == 3
638
+ cmd_number = matches[1].to_i
639
+ cmd = matches[2]
640
+
641
+ @last_command_number = cmd_number
642
+ @history[@last_command_number] = cmd
643
+
644
+ # for Ctrl+R history searching
645
+ Readline::HISTORY << cmd
646
+ end
647
+ end
648
+ rescue => e
649
+ # raise e
650
+ puts_error "failed to load history from log: #{e}"
651
+ @history ||= {}
652
+ end
653
+ return @history
654
+ end
655
+
656
+ # remove this..
657
+ def _old_load_history_from_log_file(n_commands=1000)
624
658
  @history ||= {}
625
659
  @last_command_number ||= 0
626
660
 
@@ -659,8 +693,10 @@ class Morpheus::Cli::Shell
659
693
  end
660
694
 
661
695
  def log_history_command(cmd)
662
- @history ||= {}
663
- @last_command_number ||= 0
696
+ load_history_from_log_file if !@history
697
+ #todo: a fast log_history_command, that doesnt need to load the file..
698
+ #@history ||= {}
699
+ #@last_command_number ||= 0
664
700
  previous_cmd = @history[@last_command_number]
665
701
  # skip logging consecutive history commands.
666
702
  if previous_cmd && previous_cmd =~ /history/ && previous_cmd == cmd
@@ -674,7 +710,7 @@ class Morpheus::Cli::Shell
674
710
  return @last_command_number
675
711
  end
676
712
 
677
- def last_command(n=25)
713
+ def last_command
678
714
  if @history && @last_command_number
679
715
  @history[@last_command_number]
680
716
  else
@@ -686,49 +722,54 @@ class Morpheus::Cli::Shell
686
722
  # the most recent 25 are returned by default.
687
723
  # @return Hash like {:commands => [], :command_count => total}
688
724
  def load_history_commands(options={})
689
- options[:phrase] ||= nil
690
- options[:sort] = options[:sort] ? options[:sort].to_sym : :number
691
- options[:direction] ||= 'asc'
692
- options[:offset] = options[:offset].to_i > 0 ? options[:offset].to_i : 0
693
- options[:max] = options[:max].to_i > 0 ? options[:max].to_i : 25
725
+ phrase = options[:phrase]
726
+ sort = options[:sort] ? options[:sort].to_sym : :number
727
+ direction = options[:direction] == 'desc' ? 'desc' : 'asc'
728
+ offset = options[:offset].to_i > 0 ? options[:offset].to_i : 0
729
+ max = options[:max].to_i > 0 ? options[:max].to_i : 25
730
+
731
+ if !@history
732
+ load_history_from_log_file
733
+ end
694
734
 
695
- load_history_from_log_file if !@history
696
735
 
697
736
  # collect records as [{:number => 1, :command => "instances list"}, etc]
698
737
  history_records = []
699
738
  history_count = 0
700
- if options[:sort].to_sym == :command
739
+
740
+ # sort is a bit different for this command, the default sort is by number
741
+ # it sorts oldest -> newest, but shows the very last page by default.
742
+ sort_key = :number
743
+ if sort.to_sym == :command
701
744
  sort_key = :command
702
- else
703
- sort_key = :number
704
745
  end
705
- if options[:phrase] || sort_key != :number
746
+
747
+ if phrase || sort_key != :number
706
748
  # this could be a large object...need to index our shell_history file lol
707
749
  history_records = @history.keys.collect { |k| {number: k, command: @history[k]} }
708
- history_records = history_records.sort {|x,y| x[sort_key] <=> y[sort_key] }
709
- if options[:phrase]
710
- history_records = history_records.select {|it| it[:command].include?(options[:phrase]) || it[:number].to_s == options[:phrase] }
750
+ if direction == 'desc'
751
+ history_records = history_records.sort {|x,y| y[sort_key] <=> x[sort_key] }
752
+ else
753
+ history_records = history_records.sort {|x,y| x[sort_key] <=> y[sort_key] }
754
+ end
755
+ if phrase
756
+ history_records = history_records.select {|it| it[:command].include?(phrase) || it[:number].to_s == phrase }
711
757
  end
712
- # get count and then slice it
713
758
  command_count = history_records.size
714
- history_records = history_records[options[:offset]..options[:max]-1]
759
+ history_records = history_records[offset..max-1]
715
760
  else
716
761
  # default should try to be as fast as possible..
717
762
  # no searching or sorting, default order by :number works
718
763
  # desc here means show oldest commands
719
- if options[:direction] == 'desc'
720
- if options[:offset]
721
- cmd_numbers = @history.keys.first(options[:max] + options[:offset]).first(options[:max])
722
- else
723
- cmd_numbers = @history.keys.first(options[:max])
724
- end
725
- cmd_count = @history.keys.size
764
+ cmd_count = @history.keys.size
765
+ cmd_numbers = []
766
+ if direction == 'desc'
767
+ cmd_numbers = @history.keys[offset..(offset + max-1)]
726
768
  else
727
- cmd_numbers = []
728
- if options[:offset]
729
- cmd_numbers = @history.keys.last(options[:max] + options[:offset]).first(options[:max])
769
+ if offset != 0
770
+ cmd_numbers = @history.keys.last(max + offset).first(max)
730
771
  else
731
- cmd_numbers = @history.keys.last(options[:max])
772
+ cmd_numbers = @history.keys.last(max)
732
773
  end
733
774
  history_records = cmd_numbers.collect { |k| {number: k, command: @history[k]} }
734
775
  command_count = @history.size
@@ -741,12 +782,22 @@ class Morpheus::Cli::Shell
741
782
  history_result = load_history_commands(options)
742
783
  history_records = history_result[:commands]
743
784
  command_count = history_result[:command_count]
744
- print cyan
745
- history_records.each do |history_record|
746
- puts "#{history_record[:number].to_s.rjust(3, ' ')} #{history_record[:command]}"
785
+ if history_records.size == 0
786
+ if options[:phrase]
787
+ print cyan,"0 commands found matching '#{options[:phrase]}'.",reset,"\n"
788
+ else
789
+ print cyan,"0 commands found.",reset,"\n"
790
+ end
791
+ else
792
+ print cyan
793
+ history_records.each do |history_record|
794
+ puts "#{history_record[:number].to_s.rjust(3, ' ')} #{history_record[:command]}"
795
+ end
796
+ if options[:show_pagination]
797
+ print_results_pagination({size:history_records.size,total:command_count.to_i})
798
+ print reset, "\n"
799
+ end
747
800
  end
748
- #print_results_pagination({size:history_records.size,total:command_count.to_i}, {:label => "command", :n_label => "commands"})
749
- print reset
750
801
  #print "\n"
751
802
  return 0
752
803
  end
@@ -1,7 +1,6 @@
1
1
  require 'rest_client'
2
2
  require 'optparse'
3
3
  require 'filesize'
4
- require 'table_print'
5
4
  require 'morpheus/cli/cli_command'
6
5
  require 'morpheus/cli/mixins/infrastructure_helper'
7
6
 
@@ -1277,12 +1276,10 @@ class Morpheus::Cli::StorageProvidersCommand
1277
1276
  return nil
1278
1277
  elsif storage_providers.size > 1
1279
1278
  print_red_alert "#{storage_providers.size} storage buckets found by name #{name}"
1280
- rows = storage_providers.collect do |storage_provider|
1279
+ rows = storage_providers.collect do |it|
1281
1280
  {id: it['id'], name: it['name']}
1282
1281
  end
1283
- print red
1284
- tp rows, [:id, :name]
1285
- print reset,"\n"
1282
+ puts as_pretty_table(rows, [:id, :name], {color:red})
1286
1283
  return nil
1287
1284
  else
1288
1285
  return storage_providers[0]
@@ -2,7 +2,6 @@
2
2
  require 'io/console'
3
3
  require 'rest_client'
4
4
  require 'optparse'
5
- require 'table_print'
6
5
  require 'morpheus/cli/cli_command'
7
6
 
8
7
  class Morpheus::Cli::Tasks
@@ -244,10 +243,10 @@ class Morpheus::Cli::Tasks
244
243
  print yellow,"No task types currently exist on this appliance. This could be a seed issue.",reset,"\n"
245
244
  else
246
245
  print cyan
247
- tasks_table_data = task_types.collect do |task_type|
246
+ rows = task_types.collect do |task_type|
248
247
  {name: task_type['name'], id: task_type['id'], code: task_type['code'], description: task_type['description']}
249
248
  end
250
- tp tasks_table_data, :id, :name, :code
249
+ puts as_pretty_table(rows, [:id, :name, :code], {color:red})
251
250
  end
252
251
 
253
252
  print reset,"\n"
@@ -223,7 +223,7 @@ class Morpheus::Cli::Users
223
223
  rows = user_feature_permissions.collect do |code, access|
224
224
  {code: code, access: get_access_string(access) }
225
225
  end
226
- tp rows, [:code, :access]
226
+ print as_pretty_table(rows, [:name, :access], options)
227
227
  else
228
228
  puts yellow,"No permissions found.",reset
229
229
  end
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Morpheus
3
3
  module Cli
4
- VERSION = "3.6.12"
4
+ VERSION = "3.6.13"
5
5
  end
6
6
  end
@@ -2,7 +2,6 @@
2
2
  require 'io/console'
3
3
  require 'rest_client'
4
4
  require 'optparse'
5
- require 'table_print'
6
5
  require 'morpheus/cli/cli_command'
7
6
 
8
7
  # JD: I don't think a lot of this has ever worked, fix it up.
@@ -310,16 +309,14 @@ class Morpheus::Cli::VirtualImages
310
309
  if image_types.nil? || image_types.empty?
311
310
  print yellow,"No image types currently exist on this appliance. This could be a seed issue.",reset,"\n"
312
311
  else
313
- print cyan
314
- lb_table_data = image_types.collect do |lb_type|
312
+ rows = image_types.collect do |lb_type|
315
313
  {name: lb_type['name'], code: lb_type['code']}
316
314
  end
317
- tp lb_table_data, :name, :code
315
+ puts as_pretty_table(rows, [:name, :code], options)
318
316
  end
319
-
320
- print reset,"\n"
317
+ return 0
321
318
  end
322
- rescue RestClient::Exception => e
319
+ rescue RestClient::Exception => e
323
320
  print_rest_exception(e, options)
324
321
  exit 1
325
322
  end
@@ -191,7 +191,7 @@ class Morpheus::Cli::Whoami
191
191
  rows = @user_permissions.collect do |code, access|
192
192
  {code: code, access: get_access_string(access) }
193
193
  end
194
- tp rows, [:code, :access]
194
+ print as_pretty_table(rows, [:code, :access], options)
195
195
  else
196
196
  puts yellow,"No permissions found.",reset
197
197
  end
@@ -1,8 +1,6 @@
1
1
  # require 'yaml'
2
2
  require 'io/console'
3
3
  require 'rest_client'
4
- require 'optparse'
5
- require 'table_print'
6
4
  require 'morpheus/cli/cli_command'
7
5
 
8
6
  class Morpheus::Cli::Workflows
@@ -309,3 +309,20 @@ end
309
309
  def no_colors(str)
310
310
  str.to_s.gsub /\e\[\d+m/, ""
311
311
  end
312
+
313
+ def format_number(n, opts={})
314
+ delim = opts[:delimiter] || ','
315
+ out = ""
316
+ parts = n.to_s.split(".")
317
+ whole_number = parts[0]
318
+ decimal = parts[1] ? parts[1..-1].join('.') : nil
319
+ i = 0
320
+ whole_number.reverse.each_char do |c|
321
+ out = (i > 0 && i % 3 == 0) ? "#{c}#{delim}#{out}" : "#{c}#{out}"
322
+ i+= 1
323
+ end
324
+ if decimal
325
+ out << "." + decimal
326
+ end
327
+ return out
328
+ end
@@ -8,6 +8,9 @@ module Morpheus::Logging
8
8
 
9
9
  DEFAULT_LOG_LEVEL = ENV['DEBUG'] ? Logger::DEBUG : Logger::INFO
10
10
 
11
+ AUTHORIZATION_HEADER = 'Authorization'
12
+ SECRET_TOKEN_HEADERS = ['X-Morpheus-Token', 'X-Cypher-Token', 'X-Vault-Token', 'X-Morpheus-Lease']
13
+
11
14
  @@log_level = DEFAULT_LOG_LEVEL
12
15
  @@logger = nil
13
16
 
@@ -80,13 +83,20 @@ module Morpheus::Logging
80
83
  def self.scrub_message(msg)
81
84
  if msg.is_a?(String)
82
85
  msg = msg.clone
83
- msg.gsub!(/Authorization\"\s?\=\>\s?\"Bearer [^"]+/, 'Authorization"=>"Bearer ************')
84
- msg.gsub!(/Authorization\:\s?Bearer [^"'']+/, 'Authorization: Bearer ************')
85
- msg.gsub!(/password\"\s?\=\>\s?\"[^"]+/, 'password"=>"************')
86
- msg.gsub!(/password\=\"[^"]+/, 'password="************')
87
- msg.gsub!(/password\=[^"'&\Z]+/, 'password=************') # buggy, wont work with ampersand or quotes in passwords! heh
88
- msg.gsub!(/passwordConfirmation\=[^" ]+/, 'passwordConfirmation="************')
89
- msg.gsub!(/passwordConfirmation\=[^" ]+/, 'passwordConfirmation=************')
86
+ # looks for RestClient format (hash.inspect) and request/curl output name: value
87
+ msg.gsub!(/Authorization\"\s?\=\>\s?\"Bearer [^"]+/i, 'Authorization"=>"Bearer ************')
88
+ msg.gsub!(/Authorization\:\s?Bearer [^"'']+/i, 'Authorization: Bearer ************')
89
+ # msg.gsub!(/#{AUTHORIZATION_HEADER}\"\s?\=\>\s?\"Bearer [^"]+/, "#{AUTHORIZATION_HEADER}"=>"Bearer ************")
90
+ # msg.gsub!(/#{AUTHORIZATION_HEADER}\:\s?Bearer [^"'']+/, "#{AUTHORIZATION_HEADER}: Bearer ************")
91
+ SECRET_TOKEN_HEADERS.each do |header|
92
+ msg.gsub!(/#{header}\"\s?\=\>\s?\"[^"]+/, "#{header}\"=>\"************")
93
+ msg.gsub!(/#{header}\:\s?[^"'']+/, "#{header}: ************")
94
+ end
95
+ msg.gsub!(/password\"\s?\=\>\s?\"[^"]+/i, 'password"=>"************')
96
+ msg.gsub!(/password\=\"[^"]+/i, 'password="************')
97
+ msg.gsub!(/password\=[^"'&\Z]+/i, 'password=************') # buggy, wont work with ampersand or quotes in passwords! heh
98
+ msg.gsub!(/passwordConfirmation\=[^" ]+/i, 'passwordConfirmation="************')
99
+ msg.gsub!(/passwordConfirmation\=[^" ]+/i, 'passwordConfirmation=************')
90
100
  end
91
101
  msg
92
102
  end