kpm 0.7.0 → 0.8.2
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.
- checksums.yaml +5 -5
- data/.rubocop.yml +73 -0
- data/Gemfile +2 -0
- data/README.adoc +111 -109
- data/Rakefile +2 -1
- data/bin/kpm +4 -2
- data/kpm.gemspec +8 -6
- data/lib/kpm.rb +3 -0
- data/lib/kpm/account.rb +268 -337
- data/lib/kpm/base_artifact.rb +40 -36
- data/lib/kpm/base_installer.rb +71 -84
- data/lib/kpm/blob.rb +29 -0
- data/lib/kpm/cli.rb +3 -1
- data/lib/kpm/coordinates.rb +6 -9
- data/lib/kpm/database.rb +92 -103
- data/lib/kpm/diagnostic_file.rb +126 -146
- data/lib/kpm/formatter.rb +74 -46
- data/lib/kpm/inspector.rb +22 -32
- data/lib/kpm/installer.rb +53 -46
- data/lib/kpm/kaui_artifact.rb +4 -3
- data/lib/kpm/killbill_plugin_artifact.rb +10 -7
- data/lib/kpm/killbill_server_artifact.rb +24 -10
- data/lib/kpm/migrations.rb +8 -7
- data/lib/kpm/nexus_helper/actions.rb +47 -8
- data/lib/kpm/nexus_helper/nexus_api_calls_v2.rb +87 -94
- data/lib/kpm/nexus_helper/nexus_facade.rb +5 -3
- data/lib/kpm/plugins_directory.rb +14 -9
- data/lib/kpm/plugins_directory.yml +16 -175
- data/lib/kpm/plugins_manager.rb +29 -24
- data/lib/kpm/sha1_checker.rb +56 -15
- data/lib/kpm/system.rb +104 -135
- data/lib/kpm/system_helpers/cpu_information.rb +56 -55
- data/lib/kpm/system_helpers/disk_space_information.rb +60 -63
- data/lib/kpm/system_helpers/entropy_available.rb +37 -39
- data/lib/kpm/system_helpers/memory_information.rb +52 -51
- data/lib/kpm/system_helpers/os_information.rb +45 -47
- data/lib/kpm/system_helpers/system_proxy.rb +10 -10
- data/lib/kpm/tasks.rb +370 -443
- data/lib/kpm/tenant_config.rb +68 -83
- data/lib/kpm/tomcat_manager.rb +9 -8
- data/lib/kpm/trace_logger.rb +18 -16
- data/lib/kpm/uninstaller.rb +81 -14
- data/lib/kpm/utils.rb +13 -14
- data/lib/kpm/version.rb +3 -1
- data/packaging/Gemfile +2 -0
- data/pom.xml +1 -1
- data/spec/kpm/remote/base_artifact_spec.rb +26 -12
- data/spec/kpm/remote/base_installer_spec.rb +30 -29
- data/spec/kpm/remote/installer_spec.rb +74 -72
- data/spec/kpm/remote/kaui_artifact_spec.rb +7 -6
- data/spec/kpm/remote/killbill_plugin_artifact_spec.rb +19 -24
- data/spec/kpm/remote/killbill_server_artifact_spec.rb +30 -13
- data/spec/kpm/remote/migrations_spec.rb +12 -11
- data/spec/kpm/remote/nexus_facade_spec.rb +30 -26
- data/spec/kpm/remote/tenant_config_spec.rb +27 -26
- data/spec/kpm/remote/tomcat_manager_spec.rb +2 -1
- data/spec/kpm/unit/actions_spec.rb +52 -0
- data/spec/kpm/unit/base_artifact_spec.rb +17 -16
- data/spec/kpm/unit/cpu_information_spec.rb +67 -0
- data/spec/kpm/unit/disk_space_information_spec.rb +47 -0
- data/spec/kpm/unit/entropy_information_spec.rb +36 -0
- data/spec/kpm/unit/formatter_spec.rb +163 -0
- data/spec/kpm/unit/inspector_spec.rb +34 -42
- data/spec/kpm/unit/installer_spec.rb +5 -4
- data/spec/kpm/unit/memory_information_spec.rb +102 -0
- data/spec/kpm/unit/os_information_spec.rb +38 -0
- data/spec/kpm/unit/plugins_directory_spec.rb +34 -18
- data/spec/kpm/unit/plugins_manager_spec.rb +61 -65
- data/spec/kpm/unit/sha1_checker_spec.rb +107 -60
- data/spec/kpm/unit/uninstaller_spec.rb +107 -61
- data/spec/kpm/unit_mysql/account_spec.rb +137 -136
- data/spec/spec_helper.rb +19 -17
- data/tasks/package.rake +18 -18
- metadata +19 -34
data/lib/kpm.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module KPM
|
2
4
|
autoload :Utils, 'kpm/utils'
|
3
5
|
autoload :BaseArtifact, 'kpm/base_artifact'
|
@@ -19,6 +21,7 @@ module KPM
|
|
19
21
|
autoload :Migrations, 'kpm/migrations'
|
20
22
|
autoload :System, 'kpm/system'
|
21
23
|
autoload :Account, 'kpm/account'
|
24
|
+
autoload :Blob, 'kpm/blob'
|
22
25
|
autoload :Database, 'kpm/database'
|
23
26
|
autoload :TenantConfig, 'kpm/tenant_config'
|
24
27
|
autoload :DiagnosticFile, 'kpm/diagnostic_file'
|
data/lib/kpm/account.rb
CHANGED
@@ -1,17 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'net/http'
|
2
4
|
require 'tmpdir'
|
3
5
|
require 'yaml'
|
4
6
|
require 'date'
|
5
7
|
require 'securerandom'
|
8
|
+
require 'base64'
|
6
9
|
require 'killbill_client'
|
7
10
|
|
8
11
|
module KPM
|
9
|
-
|
10
12
|
class Account
|
11
|
-
|
12
13
|
# Killbill server
|
13
14
|
KILLBILL_HOST = ENV['KILLBILL_HOST'] || '127.0.0.1'
|
14
|
-
KILLBILL_URL =
|
15
|
+
KILLBILL_URL = "http://#{KILLBILL_HOST}:8080"
|
15
16
|
KILLBILL_API_VERSION = '1.0'
|
16
17
|
|
17
18
|
# USER/PWD
|
@@ -24,7 +25,7 @@ module KPM
|
|
24
25
|
|
25
26
|
# Temporary directory
|
26
27
|
TMP_DIR_PEFIX = 'killbill'
|
27
|
-
TMP_DIR = Dir.mktmpdir(TMP_DIR_PEFIX)
|
28
|
+
TMP_DIR = Dir.mktmpdir(TMP_DIR_PEFIX)
|
28
29
|
|
29
30
|
# Created By
|
30
31
|
WHO = 'kpm_export_import'
|
@@ -34,93 +35,86 @@ module KPM
|
|
34
35
|
PLUGIN_NAME_COLUMN = 'plugin_name'
|
35
36
|
|
36
37
|
# fields to remove from the export files
|
37
|
-
REMOVE_DATA_FROM = {:
|
38
|
-
|
38
|
+
REMOVE_DATA_FROM = { accounts: %i[name address1 address2 city state_or_province phone email],
|
39
|
+
account_history: %i[name address1 address2 city state_or_province phone email] }.freeze
|
39
40
|
|
40
|
-
DATE_COLUMNS_TO_FIX = [
|
41
|
-
|
42
|
-
|
41
|
+
DATE_COLUMNS_TO_FIX = %w[created_date updated_date processing_available_date effective_date
|
42
|
+
boot_date start_timestamp last_access_time payment_date original_created_date
|
43
|
+
last_sys_update_date charged_through_date bundle_start_date start_date catalog_effective_date reference_time].freeze
|
43
44
|
|
44
45
|
# round trip constants duplicate record
|
45
|
-
ROUND_TRIP_EXPORT_IMPORT_MAP = {:
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
46
|
+
ROUND_TRIP_EXPORT_IMPORT_MAP = { accounts: { id: :accounts_id, external_key: :accounts_id }, all: { account_id: :accounts_id },
|
47
|
+
account_history: { id: :account_history_id, external_key: :accounts_id, payment_method_id: :payment_methods_id },
|
48
|
+
account_emails: { id: :account_emails_id }, account_email_history: { id: :account_email_history_id },
|
49
|
+
subscription_events: { id: :subscription_events_id }, subscriptions: { id: :subscriptions_id },
|
50
|
+
bundles: { id: :bundles_id }, blocking_states: { id: :blocking_states_id, blockable_id: nil },
|
51
|
+
invoice_items: { id: :invoice_items_id, child_account_id: nil, invoice_id: :invoices_id, bundle_id: :bundles_id, subscription_id: :subscriptions_id },
|
52
|
+
invoices: { id: :invoices_id },
|
53
|
+
invoice_payments: { id: :invoice_payments_id, invoice_id: :invoices_id, payment_id: :payments_id },
|
54
|
+
invoice_parent_children: { id: :invoice_parent_children_id, parent_invoice_id: nil, child_invoice_id: nil, child_account_id: nil },
|
55
|
+
payment_attempts: { id: :payment_attempts_id, payment_method_id: :payment_methods_id, transaction_id: :payment_transactions_id },
|
56
|
+
payment_attempt_history: { id: :payment_attempt_history_id, payment_method_id: :payment_methods_id, transaction_id: :payment_transactions_id },
|
57
|
+
payment_methods: { id: :payment_methods_id, external_key: :generate }, payment_method_history: { id: :payment_method_history_id },
|
58
|
+
payments: { id: :payments_id, payment_method_id: :payment_methods_id },
|
59
|
+
payment_history: { id: :payment_history_id, payment_method_id: :payment_methods_id },
|
60
|
+
payment_transactions: { id: :payment_transactions_id, payment_id: :payments_id },
|
61
|
+
payment_transaction_history: { id: :payment_transaction_history_id, payment_id: :payments_id },
|
62
|
+
_invoice_payment_control_plugin_auto_pay_off: { payment_method_id: :payment_methods_id, payment_id: :payments_id },
|
63
|
+
rolled_up_usage: { id: :rolled_up_usage_id, subscription_id: :subscriptions_id, tracking_id: nil },
|
64
|
+
custom_fields: { id: :custom_fields_id }, custom_field_history: { id: :custom_field_history_id },
|
65
|
+
tag_definitions: { id: :tag_definitions_id }, tag_definition_history: { id: :tag_definition_history_id },
|
66
|
+
tags: { id: :tags_id, object_id: nil },
|
67
|
+
tag_history: { id: :tag_history_id, object_id: nil },
|
68
|
+
audit_log: { id: :audit_log_id } }.freeze
|
69
|
+
|
70
|
+
# delimeters to sniff
|
71
|
+
DELIMITERS = [',', '|'].freeze
|
72
|
+
DEFAULT_DELIMITER = '|'
|
73
|
+
|
74
|
+
B64_REGEX = %r{^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$}.freeze
|
73
75
|
|
74
76
|
def initialize(config_file = nil, killbill_api_credentials = nil, killbill_credentials = nil, killbill_url = nil,
|
75
77
|
database_name = nil, database_credentials = nil, database_host = nil, database_port = nil, data_delimiter = nil, logger = nil)
|
76
78
|
@killbill_api_key = KILLBILL_API_KEY
|
77
|
-
@
|
79
|
+
@killbill_api_secret = KILLBILL_API_SECRET
|
78
80
|
@killbill_url = KILLBILL_URL
|
79
81
|
@killbill_user = KILLBILL_USER
|
80
82
|
@killbill_password = KILLBILL_PASSWORD
|
81
83
|
@delimiter = data_delimiter || DEFAULT_DELIMITER
|
82
84
|
@logger = logger
|
83
|
-
@tables_id =
|
85
|
+
@tables_id = {}
|
84
86
|
|
87
|
+
set_killbill_options(killbill_api_credentials, killbill_credentials, killbill_url)
|
85
88
|
|
86
|
-
|
87
|
-
|
89
|
+
database_credentials ||= [nil, nil]
|
90
|
+
@database = Database.new(database_name, database_host, database_port, database_credentials[0], database_credentials[1], logger)
|
88
91
|
|
89
92
|
load_config_from_file(config_file)
|
90
|
-
|
91
93
|
end
|
92
94
|
|
93
95
|
def export_data(account_id = nil)
|
94
|
-
|
95
|
-
if account_id === :export.to_s
|
96
|
-
raise Interrupt, 'Need to specify an account id'
|
97
|
-
end
|
96
|
+
raise Interrupt, 'Need to specify an account id' if account_id == :export.to_s
|
98
97
|
|
99
98
|
export_data = fetch_export_data(account_id)
|
100
99
|
export_file = export(export_data)
|
101
100
|
|
102
|
-
unless File.exist?(export_file)
|
103
|
-
|
104
|
-
|
105
|
-
@logger.info "\e[32mData exported under #{export_file}\e[0m"
|
106
|
-
end
|
101
|
+
raise Interrupt, 'Account id not found' unless File.exist?(export_file)
|
102
|
+
|
103
|
+
@logger.info "\e[32mData exported under #{export_file}\e[0m"
|
107
104
|
|
108
105
|
export_file
|
109
106
|
end
|
110
107
|
|
111
108
|
def import_data(source_file, tenant_record_id, skip_payment_methods, round_trip_export_import = false, generate_record_id = false)
|
109
|
+
source_file = File.expand_path(source_file)
|
112
110
|
|
113
111
|
@generate_record_id = generate_record_id
|
114
112
|
@tenant_record_id = tenant_record_id
|
115
113
|
@round_trip_export_import = round_trip_export_import
|
116
114
|
|
117
|
-
if source_file
|
118
|
-
raise Interrupt, 'Need to specify a file'
|
119
|
-
end
|
115
|
+
raise Interrupt, 'Need to specify a file' if source_file == :import.to_s
|
120
116
|
|
121
|
-
unless File.exist?(source_file)
|
122
|
-
raise Interrupt, 'Need to specify a valid file'
|
123
|
-
end
|
117
|
+
raise Interrupt, "File #{source_file} does not exist" unless File.exist?(source_file)
|
124
118
|
|
125
119
|
@delimiter = sniff_delimiter(source_file) || @delimiter
|
126
120
|
|
@@ -129,393 +123,330 @@ module KPM
|
|
129
123
|
|
130
124
|
private
|
131
125
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
end
|
147
|
-
|
148
|
-
account_data
|
126
|
+
# export helpers: fetch_export_data; export; process_export_data; remove_export_data;
|
127
|
+
def fetch_export_data(account_id)
|
128
|
+
KillBillClient.url = @killbill_url
|
129
|
+
options = {
|
130
|
+
username: @killbill_user,
|
131
|
+
password: @killbill_password,
|
132
|
+
api_key: @killbill_api_key,
|
133
|
+
api_secret: @killbill_api_secret
|
134
|
+
}
|
135
|
+
|
136
|
+
begin
|
137
|
+
account_data = KillBillClient::Model::Export.find_by_account_id(account_id, 'KPM', options)
|
138
|
+
rescue StandardError
|
139
|
+
raise Interrupt, 'Account id not found'
|
149
140
|
end
|
150
141
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
open (export_file), 'w' do |io|
|
155
|
-
|
156
|
-
table_name = nil
|
157
|
-
cols_names = nil
|
158
|
-
export_data.split("\n").each do |line|
|
159
|
-
words = line.strip.split(" ")
|
160
|
-
clean_line = line
|
161
|
-
if not /--/.match(words[0]).nil?
|
162
|
-
table_name = words[1]
|
163
|
-
cols_names = words[2].strip.split(@delimiter)
|
164
|
-
elsif not table_name.nil?
|
165
|
-
clean_line = process_export_data(line,table_name,cols_names)
|
166
|
-
end
|
167
|
-
io.puts clean_line
|
142
|
+
account_data
|
143
|
+
end
|
168
144
|
|
145
|
+
def export(export_data)
|
146
|
+
export_file = TMP_DIR + File::SEPARATOR + 'kbdump'
|
147
|
+
|
148
|
+
File.open(export_file, 'w') do |io|
|
149
|
+
table_name = nil
|
150
|
+
cols_names = nil
|
151
|
+
export_data.split("\n").each do |line|
|
152
|
+
words = line.strip.split(' ')
|
153
|
+
clean_line = line
|
154
|
+
if !/--/.match(words[0]).nil?
|
155
|
+
table_name = words[1]
|
156
|
+
cols_names = words[2].strip.split(@delimiter)
|
157
|
+
elsif !table_name.nil?
|
158
|
+
clean_line = process_export_data(line, table_name, cols_names)
|
169
159
|
end
|
170
|
-
|
160
|
+
io.puts clean_line
|
171
161
|
end
|
172
|
-
|
173
|
-
export_file
|
174
162
|
end
|
175
163
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
row = []
|
180
|
-
cols = clean_line.strip.split(@delimiter)
|
181
|
-
cols_names.each_with_index { |col_name, index|
|
182
|
-
sanitized_value = remove_export_data(table_name,col_name,cols[index])
|
183
|
-
|
184
|
-
row << sanitized_value
|
164
|
+
export_file
|
165
|
+
end
|
185
166
|
|
186
|
-
|
167
|
+
def process_export_data(line_to_process, table_name, cols_names)
|
168
|
+
clean_line = line_to_process
|
187
169
|
|
188
|
-
|
170
|
+
row = []
|
171
|
+
cols = clean_line.strip.split(@delimiter)
|
172
|
+
cols_names.each_with_index do |col_name, index|
|
173
|
+
sanitized_value = remove_export_data(table_name, col_name, cols[index])
|
189
174
|
|
190
|
-
|
175
|
+
row << sanitized_value
|
191
176
|
end
|
192
177
|
|
193
|
-
|
194
|
-
|
195
|
-
if not REMOVE_DATA_FROM[table_name.to_sym].nil?
|
178
|
+
row.join(@delimiter)
|
179
|
+
end
|
196
180
|
|
197
|
-
|
198
|
-
|
199
|
-
end
|
181
|
+
def remove_export_data(table_name, col_name, value)
|
182
|
+
unless REMOVE_DATA_FROM[table_name.to_sym].nil?
|
200
183
|
|
201
|
-
|
184
|
+
return nil if REMOVE_DATA_FROM[table_name.to_sym].include? col_name.to_sym
|
202
185
|
|
203
|
-
value
|
204
186
|
end
|
205
187
|
|
206
|
-
|
207
|
-
|
208
|
-
def sanitize_and_import(source_file, skip_payment_methods)
|
209
|
-
tables = Hash.new
|
210
|
-
error_importing_data = false
|
211
|
-
|
212
|
-
open (source_file), 'r' do |data|
|
213
|
-
|
214
|
-
rows = nil;
|
215
|
-
table_name = nil;
|
216
|
-
cols_names = nil;
|
217
|
-
|
218
|
-
data.each_line do |line|
|
219
|
-
words = line.strip.split(" ")
|
220
|
-
|
221
|
-
if /--/.match(words[0])
|
222
|
-
unless table_name.nil?
|
223
|
-
if @generate_record_id
|
224
|
-
cols_names.shift
|
225
|
-
end
|
188
|
+
value
|
189
|
+
end
|
226
190
|
|
227
|
-
|
228
|
-
|
191
|
+
# import helpers: sanitize_and_import; import; sanitize; replace_tenant_record_id; replace_account_record_id; replace_boolean;
|
192
|
+
# fix_dates; fill_empty_column;
|
193
|
+
def sanitize_and_import(source_file, skip_payment_methods)
|
194
|
+
tables = {}
|
195
|
+
error_importing_data = false
|
229
196
|
|
230
|
-
|
231
|
-
|
197
|
+
File.open(source_file, 'r:UTF-8') do |data|
|
198
|
+
rows = nil
|
199
|
+
table_name = nil
|
200
|
+
cols_names = nil
|
232
201
|
|
233
|
-
|
234
|
-
|
235
|
-
row = process_import_data(line, table_name,cols_names, skip_payment_methods, rows)
|
202
|
+
data.each_line do |line|
|
203
|
+
words = line.strip.split(' ')
|
236
204
|
|
237
|
-
|
205
|
+
if /--/.match(words[0])
|
206
|
+
unless table_name.nil?
|
207
|
+
cols_names.shift if @generate_record_id
|
238
208
|
|
239
|
-
rows
|
240
|
-
else
|
241
|
-
error_importing_data = true
|
242
|
-
break
|
209
|
+
tables[table_name] = { col_names: cols_names, rows: rows }
|
243
210
|
end
|
244
|
-
end
|
245
211
|
|
246
|
-
|
247
|
-
|
248
|
-
cols_names.shift
|
249
|
-
end
|
212
|
+
table_name = words[1]
|
213
|
+
cols_names = words[2].strip.split(@delimiter)
|
250
214
|
|
251
|
-
|
252
|
-
|
215
|
+
rows = []
|
216
|
+
elsif !table_name.nil?
|
217
|
+
row = process_import_data(line, table_name, cols_names, skip_payment_methods, rows)
|
253
218
|
|
254
|
-
|
219
|
+
next if row.nil?
|
220
|
+
|
221
|
+
rows.push(row)
|
222
|
+
else
|
255
223
|
error_importing_data = true
|
224
|
+
break
|
256
225
|
end
|
257
226
|
end
|
258
227
|
|
259
|
-
unless error_importing_data
|
260
|
-
|
261
|
-
|
262
|
-
|
228
|
+
unless table_name.nil? || error_importing_data
|
229
|
+
cols_names.shift if @generate_record_id
|
230
|
+
|
231
|
+
tables[table_name] = { col_names: cols_names, rows: rows }
|
263
232
|
end
|
264
233
|
|
234
|
+
error_importing_data = true if tables.empty?
|
265
235
|
end
|
266
236
|
|
267
|
-
|
268
|
-
# to make sure that the last column is not omitted if is empty
|
269
|
-
cols = line.strip.split(@delimiter,line.count(@delimiter)+1)
|
270
|
-
|
271
|
-
if cols_names.size != cols.size
|
272
|
-
@logger.warn "\e[32mWARNING!!! On #{table_name} table there is a mismatch on column count[#{cols.size}] versus header count[#{cols_names.size}]\e[0m"
|
273
|
-
return nil
|
274
|
-
end
|
237
|
+
raise Interrupt, "Data on #{source_file} is invalid" if error_importing_data
|
275
238
|
|
276
|
-
|
239
|
+
import(tables)
|
240
|
+
end
|
277
241
|
|
278
|
-
|
279
|
-
|
242
|
+
def process_import_data(line, table_name, cols_names, skip_payment_methods, _rows)
|
243
|
+
# to make sure that the last column is not omitted if is empty
|
244
|
+
cols = line.strip.split(@delimiter, line.count(@delimiter) + 1)
|
280
245
|
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
end
|
285
|
-
|
286
|
-
return row
|
246
|
+
if cols_names.size != cols.size
|
247
|
+
@logger.warn "\e[32mWARNING!!! On #{table_name} table there is a mismatch on column count[#{cols.size}] versus header count[#{cols_names.size}]\e[0m"
|
248
|
+
return nil
|
287
249
|
end
|
288
250
|
|
289
|
-
|
290
|
-
record_id = nil;
|
291
|
-
statements = Database.generate_insert_statement(tables)
|
292
|
-
statements.each do |statement|
|
293
|
-
response = Database.execute_insert_statement(statement[:table_name],statement[:query], statement[:qty_to_insert], statement[:table_data],record_id)
|
251
|
+
row = []
|
294
252
|
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
if response === false
|
300
|
-
break
|
301
|
-
end
|
302
|
-
end
|
253
|
+
@logger.debug "Processing table_name=#{table_name}, line=#{line}"
|
254
|
+
cols_names.each_with_index do |col_name, index|
|
255
|
+
sanitized_value = sanitize(table_name, col_name, cols[index], skip_payment_methods)
|
303
256
|
|
257
|
+
row << sanitized_value unless sanitized_value.nil?
|
304
258
|
end
|
305
259
|
|
306
|
-
|
307
|
-
|
308
|
-
sanitized_value = fill_empty_column(sanitized_value)
|
260
|
+
row
|
261
|
+
end
|
309
262
|
|
310
|
-
|
311
|
-
|
312
|
-
|
263
|
+
def import(tables)
|
264
|
+
record_id = nil
|
265
|
+
statements = @database.generate_insert_statement(tables)
|
266
|
+
statements.each do |statement|
|
267
|
+
response = @database.execute_insert_statement(statement[:table_name], statement[:query], statement[:qty_to_insert], statement[:table_data], record_id)
|
313
268
|
|
314
|
-
if
|
315
|
-
sanitized_value = fix_dates(sanitized_value)
|
316
|
-
end
|
269
|
+
record_id = { variable: '@account_record_id', value: response } if statement[:table_name] == 'accounts' && response.is_a?(String)
|
317
270
|
|
318
|
-
|
319
|
-
|
320
|
-
|
271
|
+
break unless response
|
272
|
+
end
|
273
|
+
end
|
321
274
|
|
322
|
-
|
323
|
-
|
324
|
-
end
|
275
|
+
def sanitize(table_name, column_name, value, skip_payment_methods)
|
276
|
+
sanitized_value = replace_boolean(value)
|
325
277
|
|
326
|
-
|
327
|
-
sanitized_value = replace_uuid(table_name,column_name,sanitized_value)
|
328
|
-
end
|
278
|
+
sanitized_value = fill_empty_column(sanitized_value)
|
329
279
|
|
330
|
-
|
331
|
-
end
|
280
|
+
sanitized_value = SAFE_PAYMENT_METHOD if table_name == 'payment_methods' && skip_payment_methods && column_name == PLUGIN_NAME_COLUMN
|
332
281
|
|
333
|
-
|
334
|
-
return @tenant_record_id if column_name == 'tenant_record_id' || column_name == 'search_key2'
|
335
|
-
value
|
336
|
-
end
|
282
|
+
sanitized_value = fix_dates(sanitized_value) if DATE_COLUMNS_TO_FIX.include? column_name
|
337
283
|
|
338
|
-
|
284
|
+
sanitized_value = replace_tenant_record_id(table_name, column_name, sanitized_value) unless @tenant_record_id.nil?
|
339
285
|
|
340
|
-
|
286
|
+
sanitized_value = replace_account_record_id(table_name, column_name, sanitized_value) if @generate_record_id
|
341
287
|
|
342
|
-
|
343
|
-
end
|
288
|
+
sanitized_value = replace_uuid(table_name, column_name, sanitized_value) if @round_trip_export_import
|
344
289
|
|
345
|
-
|
346
|
-
return nil
|
347
|
-
end
|
290
|
+
sanitized_value = b64_decode_if_needed(sanitized_value) if column_name == 'billing_events'
|
348
291
|
|
349
|
-
|
292
|
+
sanitized_value
|
293
|
+
end
|
350
294
|
|
351
|
-
|
352
|
-
|
353
|
-
end
|
354
|
-
end
|
295
|
+
def replace_tenant_record_id(_table_name, column_name, value)
|
296
|
+
return @tenant_record_id if %w[tenant_record_id search_key2].include?(column_name)
|
355
297
|
|
356
|
-
|
357
|
-
|
358
|
-
end
|
298
|
+
value
|
299
|
+
end
|
359
300
|
|
360
|
-
|
361
|
-
|
362
|
-
end
|
301
|
+
def replace_account_record_id(table_name, column_name, value)
|
302
|
+
return :@account_record_id if column_name == 'account_record_id'
|
363
303
|
|
364
|
-
|
304
|
+
return nil if column_name == 'record_id'
|
365
305
|
|
366
|
-
|
306
|
+
if column_name == 'target_record_id'
|
367
307
|
|
368
|
-
|
369
|
-
if value.to_s === 'true'
|
370
|
-
return 1
|
371
|
-
elsif value.to_s === 'false'
|
372
|
-
return 0
|
373
|
-
else
|
374
|
-
return value
|
375
|
-
end
|
308
|
+
return :@account_record_id if table_name == 'account_history'
|
376
309
|
end
|
377
310
|
|
378
|
-
|
379
|
-
if !value.equal?(:DEFAULT)
|
311
|
+
return :@account_record_id if column_name == 'search_key1' && table_name == 'bus_ext_events_history'
|
380
312
|
|
381
|
-
|
382
|
-
return dt.strftime('%F %T').to_s
|
313
|
+
return :@account_record_id if column_name == 'search_key1' && table_name == 'bus_events_history'
|
383
314
|
|
384
|
-
|
315
|
+
value
|
316
|
+
end
|
385
317
|
|
318
|
+
def replace_boolean(value)
|
319
|
+
if value.to_s == 'true'
|
320
|
+
1
|
321
|
+
elsif value.to_s == 'false'
|
322
|
+
0
|
323
|
+
else
|
386
324
|
value
|
387
325
|
end
|
326
|
+
end
|
388
327
|
|
389
|
-
|
390
|
-
|
391
|
-
return :DEFAULT
|
392
|
-
else
|
393
|
-
return value
|
394
|
-
end
|
395
|
-
end
|
396
|
-
|
397
|
-
def replace_uuid(table_name,column_name,value)
|
398
|
-
|
399
|
-
if column_name == 'id'
|
400
|
-
@tables_id["#{table_name}_id"] = SecureRandom.uuid
|
401
|
-
end
|
402
|
-
|
403
|
-
if ROUND_TRIP_EXPORT_IMPORT_MAP[table_name.to_sym] && ROUND_TRIP_EXPORT_IMPORT_MAP[table_name.to_sym][column_name.to_sym]
|
404
|
-
key = ROUND_TRIP_EXPORT_IMPORT_MAP[table_name.to_sym][column_name.to_sym]
|
328
|
+
def fix_dates(value)
|
329
|
+
unless value.equal?(:DEFAULT)
|
405
330
|
|
406
|
-
|
407
|
-
|
408
|
-
else
|
409
|
-
new_value = @tables_id[key.to_s]
|
410
|
-
end
|
411
|
-
|
412
|
-
if new_value.nil?
|
413
|
-
new_value = SecureRandom.uuid
|
414
|
-
@tables_id[key.to_s] = new_value
|
415
|
-
end
|
416
|
-
return new_value
|
417
|
-
end
|
331
|
+
dt = DateTime.parse(value)
|
332
|
+
return dt.strftime('%F %T').to_s
|
418
333
|
|
419
|
-
|
420
|
-
key = ROUND_TRIP_EXPORT_IMPORT_MAP[:all][column_name.to_sym]
|
421
|
-
new_value = @tables_id[key.to_s]
|
334
|
+
end
|
422
335
|
|
423
|
-
|
424
|
-
|
336
|
+
value
|
337
|
+
end
|
425
338
|
|
339
|
+
def fill_empty_column(value)
|
340
|
+
if value.to_s.strip.empty?
|
341
|
+
:DEFAULT
|
342
|
+
else
|
426
343
|
value
|
427
344
|
end
|
345
|
+
end
|
428
346
|
|
429
|
-
|
430
|
-
|
431
|
-
return nil if File.size?(file).nil?
|
432
|
-
|
433
|
-
first_line = File.open(file) {|f| f.readline}
|
347
|
+
def replace_uuid(table_name, column_name, value)
|
348
|
+
@tables_id["#{table_name}_id"] = SecureRandom.uuid if column_name == 'id'
|
434
349
|
|
435
|
-
|
350
|
+
if ROUND_TRIP_EXPORT_IMPORT_MAP[table_name.to_sym] && ROUND_TRIP_EXPORT_IMPORT_MAP[table_name.to_sym][column_name.to_sym]
|
351
|
+
key = ROUND_TRIP_EXPORT_IMPORT_MAP[table_name.to_sym][column_name.to_sym]
|
436
352
|
|
437
|
-
|
353
|
+
new_value = if key.equal?(:generate)
|
354
|
+
SecureRandom.uuid
|
355
|
+
else
|
356
|
+
@tables_id[key.to_s]
|
357
|
+
end
|
438
358
|
|
439
|
-
|
440
|
-
|
359
|
+
if new_value.nil?
|
360
|
+
new_value = SecureRandom.uuid
|
361
|
+
@tables_id[key.to_s] = new_value
|
441
362
|
end
|
442
|
-
|
443
|
-
sniff = sniff.sort {|a,b| b[1]<=>a[1]}
|
444
|
-
sniff.size > 0 ? sniff[0][0] : nil
|
363
|
+
return new_value
|
445
364
|
end
|
446
365
|
|
447
|
-
|
448
|
-
|
449
|
-
|
366
|
+
unless ROUND_TRIP_EXPORT_IMPORT_MAP[:all][column_name.to_sym].nil?
|
367
|
+
key = ROUND_TRIP_EXPORT_IMPORT_MAP[:all][column_name.to_sym]
|
368
|
+
new_value = @tables_id[key.to_s]
|
450
369
|
|
451
|
-
|
370
|
+
return new_value
|
371
|
+
end
|
452
372
|
|
453
|
-
|
454
|
-
|
373
|
+
value
|
374
|
+
end
|
455
375
|
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
376
|
+
def b64_decode_if_needed(input)
|
377
|
+
# Exclude nil or non string
|
378
|
+
return input if input.nil? || !input.is_a?(String)
|
379
|
+
# Apply regex to check that string is built as a B64 string: the character set is [A-Z, a-z, 0-9, and + /]
|
380
|
+
# and if the rest length is less than 4, the string is padded with '=' characters.
|
381
|
+
return input if input.match(B64_REGEX).nil?
|
461
382
|
|
462
|
-
|
383
|
+
# Decode
|
384
|
+
result = Base64.decode64(input)
|
385
|
+
# Verify encoded of the decoded value == input prior return result
|
386
|
+
return input if Base64.strict_encode64(result) != input
|
463
387
|
|
464
|
-
|
465
|
-
|
466
|
-
[config_db['username'],config_db['password']],
|
467
|
-
@logger)
|
388
|
+
Blob.new(result, TMP_DIR)
|
389
|
+
end
|
468
390
|
|
469
|
-
|
470
|
-
|
471
|
-
end
|
391
|
+
def sniff_delimiter(file)
|
392
|
+
return nil if File.size?(file).nil?
|
472
393
|
|
473
|
-
|
474
|
-
@config = nil
|
394
|
+
first_line = File.open(file, &:readline)
|
475
395
|
|
476
|
-
|
477
|
-
if not Dir[config_file][0].nil?
|
478
|
-
@config = YAML::load_file(config_file)
|
479
|
-
end
|
480
|
-
end
|
396
|
+
return nil if first_line.nil?
|
481
397
|
|
398
|
+
sniff = {}
|
399
|
+
|
400
|
+
DELIMITERS.each do |delimiter|
|
401
|
+
sniff[delimiter] = first_line.count(delimiter)
|
482
402
|
end
|
483
403
|
|
484
|
-
|
404
|
+
sniff = sniff.sort { |a, b| b[1] <=> a[1] }
|
405
|
+
!sniff.empty? ? sniff[0][0] : nil
|
406
|
+
end
|
485
407
|
|
486
|
-
|
408
|
+
def load_config_from_file(config_file)
|
409
|
+
self.config = config_file
|
487
410
|
|
488
|
-
|
489
|
-
Database.set_database_name(database_name) unless database_name.nil?
|
490
|
-
Database.set_host(database_host) unless database_host.nil?
|
491
|
-
Database.set_port(database_port) unless database_port.nil?
|
411
|
+
return if @config.nil?
|
492
412
|
|
493
|
-
|
413
|
+
config_killbill = @config['killbill']
|
414
|
+
|
415
|
+
unless config_killbill.nil?
|
416
|
+
set_killbill_options([config_killbill['api_key'], config_killbill['api_secret']],
|
417
|
+
[config_killbill['user'], config_killbill['password']],
|
418
|
+
"http://#{config_killbill['host']}:#{config_killbill['port']}")
|
494
419
|
end
|
495
420
|
|
496
|
-
|
421
|
+
config_db = @config['database']
|
497
422
|
|
498
|
-
|
423
|
+
@database = Database.new(config_db['name'], config_db['host'], config_db['port'], config_db['username'], config_db['password'], @logger) unless config_db.nil?
|
424
|
+
end
|
499
425
|
|
500
|
-
|
501
|
-
|
426
|
+
def config=(config_file = nil)
|
427
|
+
@config = nil
|
502
428
|
|
503
|
-
|
429
|
+
return if config_file.nil?
|
504
430
|
|
505
|
-
|
431
|
+
@config = YAML.load_file(config_file) unless Dir[config_file][0].nil?
|
432
|
+
end
|
506
433
|
|
507
|
-
|
508
|
-
|
434
|
+
def set_killbill_options(killbill_api_credentials, killbill_credentials, killbill_url)
|
435
|
+
unless killbill_api_credentials.nil?
|
509
436
|
|
510
|
-
|
437
|
+
@killbill_api_key = killbill_api_credentials[0]
|
438
|
+
@killbill_api_secret = killbill_api_credentials[1]
|
511
439
|
|
512
|
-
|
440
|
+
end
|
513
441
|
|
514
|
-
|
442
|
+
unless killbill_credentials.nil?
|
443
|
+
|
444
|
+
@killbill_user = killbill_credentials[0]
|
445
|
+
@killbill_password = killbill_credentials[1]
|
515
446
|
|
516
|
-
end
|
517
447
|
end
|
518
448
|
|
449
|
+
@killbill_url = killbill_url unless killbill_url.nil?
|
450
|
+
end
|
519
451
|
end
|
520
|
-
|
521
|
-
end
|
452
|
+
end
|