sct 1.1.1 → 1.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a7b7da8359137491424793ea19a9ae9d845bb11cb84a8df92b2c0135fe335948
4
- data.tar.gz: 6ebe428263d46c7fd9d36f43c7503c6b640ed6d2ce30f5ef32204e12d50a771e
3
+ metadata.gz: 1ca92e3c8b95fa282f479795b17cd3b0c349afee8f07c50ee53626396e1473fd
4
+ data.tar.gz: 61313bc641c95704bf4c4591914f3a9a8b33b29b4962ec5c22f4cfc6a84d990b
5
5
  SHA512:
6
- metadata.gz: fca4bbe727e063bd35b3676a7a98c1c2349b05d69517b9c2104871358b17a1571077c3735dc4967157580a1e6d5a83a3515b6fe833b1b5c13a82189e06af1af0
7
- data.tar.gz: f03408e6083a32af44de9f65784dee6d3b74deb9f72915babc3f3c8a50713eaf312697da77e50826391ab58f3990c7c81cbcb49cc881d3e231fa213fe50da61f
6
+ metadata.gz: f6453c0b80246ab00dbcb6ea69c36801259f3666867c0a78ec4bb56827647740a245d1df47d3e4e207a068c969689264cd0668373e036a3420e3c603b45ec3db
7
+ data.tar.gz: ce6bced4dce7f734ef8b724c1400974ee1a8a51136b0ca6d3e506108ee62ce571dd3375289caef18f8474ebd5b7ed974b4869d118b9f8e13778633ae0ca92ae6
@@ -26,7 +26,7 @@ module Cluster
26
26
 
27
27
  run "docker container prune -f"
28
28
 
29
- run_dc "up --detach"
29
+ run_dc "up --detach --remove-orphans --force-recreate --always-recreate-deps"
30
30
 
31
31
  if options.pull or options.build
32
32
  system "docker image prune -f"
@@ -40,7 +40,7 @@ module Henk
40
40
  Henk::Runner.new.encrypt_config_data options.domain
41
41
  end
42
42
  end
43
-
43
+
44
44
  command :copy do |c|
45
45
  c.syntax = 'sct henk copy'
46
46
  c.description = 'Copy a client from another environment to your local environment'
@@ -81,7 +81,7 @@ module Henk
81
81
  Henk::Runner.new.synchronize_employees options.target_domain
82
82
  end
83
83
  end
84
-
84
+
85
85
  command :remove do |c|
86
86
  c.syntax = 'sct henk remove'
87
87
  c.description = 'Remove a client from your local environment.'
@@ -105,6 +105,44 @@ module Henk
105
105
  end
106
106
  end
107
107
 
108
+ command :"list-dumps" do |c|
109
+ c.syntax = 'sct henk list-dumps'
110
+ c.description = 'List the customer dumps currently available for import.'
111
+
112
+ c.action do |args, options|
113
+ Henk::Runner.new.list_dumps args, options
114
+ end
115
+ end
116
+
117
+ command :"import" do |c|
118
+ c.syntax = 'sct henk import <URL>'
119
+ c.description = 'Import a customer dump from GCP.'
120
+
121
+ c.action do |args, options|
122
+ case args.length
123
+ when 0
124
+ puts "Loading available customer dumps...".blue
125
+
126
+ available_dumps = `sct henk list-dumps`.lines chomp: true
127
+
128
+ dump_url = choose do |menu|
129
+ menu.prompt = "Please choose a dump to import:"
130
+
131
+ for dump in available_dumps
132
+ menu.choice dump
133
+ end
134
+ end
135
+ when 1
136
+ dump_url = args.first
137
+ else
138
+ UI.error "Expected 0 or 1 arguments, received #{args.length}: #{args}"
139
+ exit 1
140
+ end
141
+
142
+ Henk::Runner.new.import args, options, dump_url
143
+ end
144
+ end
145
+
108
146
  run!
109
147
  end
110
148
 
@@ -3,7 +3,7 @@ require 'pp'
3
3
  module Henk
4
4
  class Runner
5
5
  attr_accessor :options_mapping
6
-
6
+
7
7
  def initialize
8
8
  @options_mapping = {
9
9
  "organization_name" => {
@@ -56,8 +56,8 @@ module Henk
56
56
 
57
57
  connected_to_network = `docker network inspect spend-cloud | jq '.[0] | .Containers | map(select((.Name | test("^#{required_containers.join('|^')}")))) | length'`
58
58
 
59
- if connected_to_network.to_s.strip! != "3"
60
- puts "Error: ".red + "Not all required services are running or connected to the cluster (#{connected_to_network}/3)"
59
+ if connected_to_network.to_s.strip! != "5"
60
+ puts "Error: ".red + "Not all required services are running or connected to the cluster (#{connected_to_network}/5)"
61
61
  exit(1)
62
62
  end
63
63
 
@@ -88,7 +88,7 @@ module Henk
88
88
  def encrypt_config_data domain
89
89
  puts "Manually encrypting config data for #{domain}".green
90
90
  php_command = "php /var/www/scripts/encryptConfigData.php -c='#{domain}' --execute"
91
- command = 'docker exec -it proactive-config bash -c "#{php_command}"'
91
+ command = 'docker exec -it proactive-config-php bash -c "#{php_command}"'
92
92
  self.run command
93
93
  end
94
94
 
@@ -171,5 +171,127 @@ module Henk
171
171
  options_str += parsed_options.join(' ')
172
172
  return options_str
173
173
  end
174
+
175
+ def list_dumps args, options
176
+ run "gsutil ls gs://henk-db-dumps/"
177
+ end
178
+
179
+ def import args, options, dump_url
180
+ puts "Going to import #{dump_url}".blue
181
+
182
+ dir = Dir.mktmpdir
183
+
184
+ begin
185
+ zip = download_and_unzip dump_url, dir
186
+
187
+ customer = zip.slice 0, zip.rindex("_")
188
+
189
+ customer_database = customer.gsub "-", "_"
190
+
191
+ remove_customer customer
192
+
193
+ copy_db_encryption_key customer, dir
194
+
195
+ run_sql_files dir
196
+
197
+ add_customer_account customer, customer_database
198
+
199
+ update_and_encrypt_customer_config customer, customer_database
200
+
201
+ puts "Finished importing #{customer}".green
202
+ ensure
203
+ run "rm -r #{dir}"
204
+ end
205
+ end
206
+
207
+ def download_and_unzip dump_url, dir
208
+ run "gsutil cp #{dump_url} #{dir}"
209
+
210
+ zip_path = Dir["#{dir}/*.zip"].first
211
+
212
+ run "unzip #{zip_path} -d #{dir}"
213
+
214
+ zip = File.basename zip_path
215
+ end
216
+
217
+ def remove_customer customer
218
+ local_customers = `sct henk list-clients`.lines chomp: true
219
+
220
+ if local_customers.include? customer
221
+ puts "Customer already exists. Removing customer before importing...".yellow
222
+
223
+ run "sct henk remove --domain #{customer}"
224
+
225
+ puts "Removed existing customer".green
226
+ end
227
+ end
228
+
229
+ def copy_db_encryption_key customer, dir
230
+ run "docker exec proactive-config-php mkdir /data/#{customer}"
231
+ run "docker cp #{dir}/db_encryption.key proactive-config-php:/data/#{customer}/"
232
+
233
+ puts "Copied db_encryption.key to proactive-config-php:/data/#{customer}/".green
234
+ end
235
+
236
+ def run_sql_files dir
237
+ sql_paths = Dir["#{dir}/*.sql"]
238
+
239
+ sql_paths.each_with_index do |path, index|
240
+ file = File.basename path
241
+ database = File.basename path, ".*"
242
+
243
+ puts "Running #{file} (#{index + 1}/#{sql_paths.length})".blue
244
+
245
+ run_query "CREATE DATABASE IF NOT EXISTS `#{database}`"
246
+
247
+ run_query "source /sql/#{file}", database: database, volume: "#{dir}:/sql"
248
+ end
249
+
250
+ puts "Finished running SQL files".green
251
+ end
252
+
253
+ def add_customer_account customer, customer_database
254
+ account_data = "\n[#{customer}]\ndatabase = #{customer_database}\ndomain = NULL\nrewrite = #{customer}\nimport_planning = 1\njobs = 1\nscan_upload = 0\nfiatteren_mailbox = 1\ncontracten_mailbox = 1"
255
+
256
+ run "docker exec proactive-config-php sh -c 'echo \"#{account_data}\" >> /data/proactive_accounts.ini'"
257
+
258
+ puts "Added account to proactive_accounts.ini".green
259
+ end
260
+
261
+ def update_and_encrypt_customer_config customer, customer_database
262
+ dsn = "mysql:host=mysql-service;user=root;dbname=#{customer_database};config=proactive-php;config-path=cfg/db;"
263
+
264
+ website_application = "https://#{customer}.dev.spend.cloud"
265
+
266
+ email_administrator = "noreply@dev.spend.cloud"
267
+
268
+ debug_email_address = "noreply@dev.spend.cloud"
269
+
270
+ query = "UPDATE `00_settings` SET `045` = \"#{dsn}\", `029` = \"#{website_application}\", `002` = \"#{email_administrator}\", `031` = \"#{debug_email_address}\" WHERE `043` = \"#{customer}\""
271
+
272
+ run_query query, database: "spend-cloud-config"
273
+
274
+ puts "Updated config values".green
275
+
276
+ run "docker exec proactive-config-php php /var/www/scripts/encryptConfigData.php -c='#{customer}' --execute"
277
+
278
+ puts "Encrypted config values".green
279
+ end
280
+
281
+ def run_query query, database: nil, volume: nil
282
+ command = "docker run --rm --network container:mysql-service"
283
+
284
+ if volume
285
+ command = "#{command} -v #{volume}"
286
+ end
287
+
288
+ command = "#{command} arey/mysql-client -h mysql-service"
289
+
290
+ if database
291
+ command = "#{command} -D #{database}"
292
+ end
293
+
294
+ run "#{command} -e '#{query}'"
295
+ end
174
296
  end
175
297
  end
@@ -29,15 +29,6 @@ module Sct
29
29
  def execute args, options
30
30
  services = manifest["services"].to_a
31
31
 
32
- if services.length != 1
33
- error "Currently sct only supports a single service declaration in '#{@@file}'. Contact the infra guild if you consider this a limitation."
34
- end
35
-
36
- service, service_spec = services.first
37
-
38
- container = service_spec["container_name"]
39
- command = service_spec["command"] || ""
40
-
41
32
  if Sct::Helper.is_windows?
42
33
  host_machine_IP = (options.wsl_debugger ? `hostname -I | awk '{print $1}'` : `powershell.exe -c '(Test-Connection -ComputerName $env:computername -count 1).ipv4address.IPAddressToString' | dos2unix`).chomp
43
34
  elsif Sct::Helper.is_mac_os?
@@ -55,7 +46,7 @@ module Sct
55
46
  }
56
47
 
57
48
  if options.pull
58
- return unless dc_dev "pull"
49
+ return unless dc_dev "pull", env
59
50
  end
60
51
 
61
52
  if options.build
@@ -66,11 +57,30 @@ module Sct
66
57
  system "docker image prune -f"
67
58
  end
68
59
 
69
- return unless dc "rm --stop --force #{service}"
60
+ for service, service_spec in services
61
+ return unless dc "rm --stop --force #{service}"
62
+ end
63
+
64
+ if services.length == 1
65
+ service, service_spec = services.first
70
66
 
71
- dc_dev "run --rm --service-ports --name #{container} #{service} #{command}", env
67
+ container = service_spec["container_name"]
68
+ command = service_spec["command"] || ""
72
69
 
73
- dc "up --detach #{service}"
70
+ dc_dev "run --rm --service-ports --name #{container} #{service} #{command}", env
71
+ else
72
+ begin
73
+ dc_dev "up --remove-orphans --force-recreate --always-recreate-deps", env
74
+ rescue Interrupt
75
+ # user pressed Ctrl+C, do nothing
76
+ end
77
+
78
+ dc_dev "down --remove-orphans", env
79
+ end
80
+
81
+ for service, service_spec in services
82
+ dc "up --detach #{service}"
83
+ end
74
84
  end
75
85
 
76
86
  end
@@ -21,10 +21,6 @@ module Sct
21
21
 
22
22
  services = manifest["services"].to_a
23
23
 
24
- if services.length != 1
25
- error "Currently sct only supports a single service declaration in '#{file}'. Contact the infra guild if you consider this a limitation."
26
- end
27
-
28
24
  service, service_spec = services.first
29
25
 
30
26
  container = service_spec["container_name"]
@@ -43,6 +39,8 @@ module Sct
43
39
 
44
40
  user = options.root ? "root:root" : "$(id -u):$(id -g)"
45
41
 
42
+ puts "Attaching to shell in container #{container.bold}".green
43
+
46
44
  system "docker exec -it --user #{user} #{container} #{command}"
47
45
  end
48
46
 
@@ -1,3 +1,3 @@
1
1
  module Sct
2
- VERSION = "1.1.1"
2
+ VERSION = "1.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sct
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reshad Farid
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-20 00:00:00.000000000 Z
11
+ date: 2022-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colored