morpheus-cli 3.6.12 → 3.6.13

Sign up to get free protection for your applications and to get access to all the features.
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