raystool 1.0.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.
Files changed (45) hide show
  1. data/bin/__rays_exec.rb +31 -0
  2. data/bin/__rays_init +79 -0
  3. data/lib/rays/config/backup.rb +42 -0
  4. data/lib/rays/config/configuration.rb +376 -0
  5. data/lib/rays/config/environment.rb +73 -0
  6. data/lib/rays/config/templates/global/global.yml +3 -0
  7. data/lib/rays/config/templates/global/scripts/rays +187 -0
  8. data/lib/rays/config/templates/project/.rays +0 -0
  9. data/lib/rays/config/templates/project/config/environment.yml +68 -0
  10. data/lib/rays/config/templates/project/config/project.yml +4 -0
  11. data/lib/rays/core.rb +128 -0
  12. data/lib/rays/exceptions/rays_exception.rb +25 -0
  13. data/lib/rays/interface/commander.rb +394 -0
  14. data/lib/rays/interface/controller.rb +365 -0
  15. data/lib/rays/loaders/highline.rb +24 -0
  16. data/lib/rays/loaders/logging.rb +60 -0
  17. data/lib/rays/models/appmodule/base.rb +185 -0
  18. data/lib/rays/models/appmodule/content.rb +35 -0
  19. data/lib/rays/models/appmodule/ext.rb +36 -0
  20. data/lib/rays/models/appmodule/hook.rb +36 -0
  21. data/lib/rays/models/appmodule/layout.rb +36 -0
  22. data/lib/rays/models/appmodule/manager.rb +130 -0
  23. data/lib/rays/models/appmodule/portlet.rb +36 -0
  24. data/lib/rays/models/appmodule/servicebuilder.rb +36 -0
  25. data/lib/rays/models/appmodule/theme.rb +36 -0
  26. data/lib/rays/models/project.rb +116 -0
  27. data/lib/rays/servers/base.rb +70 -0
  28. data/lib/rays/servers/database.rb +73 -0
  29. data/lib/rays/servers/liferay.rb +64 -0
  30. data/lib/rays/servers/solr.rb +111 -0
  31. data/lib/rays/services/application_service.rb +116 -0
  32. data/lib/rays/services/backup_service.rb +94 -0
  33. data/lib/rays/services/database.rb +59 -0
  34. data/lib/rays/services/remote.rb +75 -0
  35. data/lib/rays/services/scm.rb +92 -0
  36. data/lib/rays/services/sync.rb +90 -0
  37. data/lib/rays/utils/common_utils.rb +153 -0
  38. data/lib/rays/utils/file_utils.rb +118 -0
  39. data/lib/rays/utils/network_utils.rb +50 -0
  40. data/lib/rays/workers/base.rb +134 -0
  41. data/lib/rays/workers/builder.rb +63 -0
  42. data/lib/rays/workers/cleaner.rb +42 -0
  43. data/lib/rays/workers/deployer.rb +92 -0
  44. data/lib/rays/workers/generator.rb +49 -0
  45. metadata +175 -0
@@ -0,0 +1,111 @@
1
+ =begin
2
+ Copyright (c) 2012 Dmitri Carpov
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ =end
23
+
24
+ module Rays
25
+ module Server
26
+
27
+ class SolrServer < BaseServer
28
+ attr_reader :solr_instance
29
+
30
+ def initialize(name, host, remote, java_home, java_bin, port, url, application_service)
31
+ super(name, host, remote, java_home, java_bin)
32
+ @port = port
33
+ @url = url
34
+ @solr_instance = RSolr.connect(:url => solr_url)
35
+ @service = application_service
36
+ end
37
+
38
+ def port
39
+ raise RaysException.new(missing_environment_option('SOLR server', 'port')) if @port.nil?
40
+ @port
41
+ end
42
+
43
+ def url
44
+ raise RaysException.new(missing_environment_option('SOLR server', 'instance')) if @url.nil?
45
+ @url
46
+ end
47
+
48
+ def service
49
+ raise RaysException.new(missing_environment_option('SOLR service', 'service')) if @service.nil?
50
+ @service
51
+ end
52
+
53
+ def alive?
54
+ begin
55
+ @solr_instance.get('select', :params => { :q => '*:*', :limit => 1})
56
+ return true
57
+ rescue
58
+ return false
59
+ end
60
+ end
61
+
62
+ def clean_all
63
+ solr_transaction do
64
+ @solr_instance.delete_by_query('*:*')
65
+ end
66
+ end
67
+
68
+ private
69
+ def solr_transaction
70
+ $log.info("Connecting to the solr server ...")
71
+ unless alive?
72
+ $log.error("Cannot connect to the solr server.")
73
+ return
74
+ end
75
+ begin
76
+ log_block("execute solr query") do
77
+ yield
78
+ @solr_instance.commit
79
+ end
80
+ rescue Errno::ECONNREFUSED => e
81
+ rollback
82
+ $log.error("Cannot connect to the solr server. URL: " + solr_url)
83
+ $log.debug("Cause: #{e.message}.\tBacktrace:\r\n#{e.backtrace.join("\r\n")}")
84
+ rescue RSolr::Error::Http => e
85
+ rollback
86
+ $log.error("Bad solr request. URL: " + solr_url)
87
+ $log.debug("Cause: #{e.message}.\tBacktrace:\r\n#{e.backtrace.join("\r\n")}")
88
+ rescue => e
89
+ rollback
90
+ $log.error("Unknown solr error.")
91
+ $log.debug("Cause: #{e.message}.\tBacktrace:\r\n#{e.backtrace.join("\r\n")}")
92
+ end
93
+ end
94
+
95
+ def solr_url
96
+ url_string = "http://#{host}"
97
+ url_string << ":#{port}"
98
+ url_string << "/#{url}"
99
+ url_string
100
+ end
101
+
102
+ def rollback
103
+ begin
104
+ @solr_instance.rollback
105
+ rescue
106
+ # stub
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,116 @@
1
+ =begin
2
+ Copyright (c) 2012 Dmitri Carpov
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ =end
23
+
24
+ module Rays
25
+ module Service
26
+ class ApplicationService
27
+
28
+ def initialize(name, host, port, start_script, debug_script, stop_script, log_file, remote)
29
+ @name = name
30
+ @host = host
31
+ @port = port
32
+ @start_script = start_script
33
+ @debug_script = debug_script
34
+ @stop_script = stop_script
35
+ @log_file = log_file
36
+ @remote = remote
37
+ end
38
+
39
+ def host
40
+ raise RaysException.new(missing_environment_option('Service', 'host')) if @host.nil?
41
+ @host
42
+ end
43
+
44
+ def port
45
+ raise RaysException.new(missing_environment_option('Service', 'port')) if @port.nil?
46
+ @port
47
+ end
48
+
49
+ # Start service
50
+ def start
51
+ unless alive?
52
+ execute @start_script
53
+ else
54
+ raise RaysException.new('service is already running')
55
+ end
56
+ end
57
+
58
+ # Debug service
59
+ def debug
60
+ if @debug_script.nil?
61
+ $log.warn('debug is disabled for this server')
62
+ return
63
+ end
64
+ unless alive?
65
+ execute @debug_script
66
+ else
67
+ raise RaysException.new('service is already running')
68
+ end
69
+ end
70
+
71
+ # Stop service
72
+ def stop
73
+ if alive?
74
+ execute @stop_script
75
+ else
76
+ raise RaysException.new('service is not running')
77
+ end
78
+ end
79
+
80
+ # Show logs (live)
81
+ def log
82
+ if remote?
83
+ remote.exec(command)
84
+ else
85
+ Thread.new do
86
+ exec("tail -f #{@log_file}")
87
+ end
88
+ end
89
+ $log.info("Following logs of #{@name} service on #{@host}.\nUse ctrl+c to interrupt.")
90
+ end
91
+
92
+ # Is the service resides on a remote service?
93
+ # returns true if the service is on a remote server and false if the service is local.
94
+ def remote?
95
+ !@remote.nil?
96
+ end
97
+
98
+ # Is the service running?
99
+ # Returns true is the service is running or false otherwise
100
+ def alive?
101
+ Utils::NetworkUtils.port_open?(@host, @port)
102
+ end
103
+
104
+ private
105
+
106
+ # Executing command on local or a remote server depending on the service configuration.
107
+ def execute(command)
108
+ if remote?
109
+ remote.exec(command)
110
+ else
111
+ rays_exec(command)
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,94 @@
1
+ =begin
2
+ Copyright (c) 2012 Dmitri Carpov
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ =end
23
+
24
+ module Rays
25
+ module Service
26
+ class Backup
27
+
28
+ def initialize(environment = $rays_config.environment)
29
+ @environment = environment
30
+ @backup_directory = create_backup_directory
31
+ @dump_file_name = 'db.dump'
32
+ @package_file = "archive-#{Time.now.to_i.to_s}.tar"
33
+ end
34
+
35
+ def backup
36
+ package = ''
37
+
38
+ service_safe(@environment.backup.stop_server) do
39
+ database
40
+ data
41
+ package = pack
42
+ end
43
+
44
+ package
45
+ end
46
+
47
+ private
48
+
49
+ def create_backup_directory
50
+ base_directory = @environment.backup.directory
51
+ # remove until multiple backups support
52
+ execute("rm -rf #{base_directory}")
53
+ execute("mkdir #{base_directory}")
54
+ backup_directory = File.join(base_directory, Time.now.to_i.to_s)
55
+ execute("mkdir #{backup_directory}")
56
+ backup_directory
57
+ end
58
+
59
+ def execute(command)
60
+ if @environment.liferay.remote?
61
+ @environment.liferay.remote.exec(command)
62
+ else
63
+ rays_exec(command)
64
+ end
65
+ end
66
+
67
+ #
68
+ # Database backup
69
+ #
70
+ def database
71
+ dump_file = File.join(@backup_directory, 'db.dump')
72
+ task("creating database backup", "done", "failed") do
73
+ execute(@environment.database.instance.export_command(@environment.database.db_name, dump_file))
74
+ end
75
+ end
76
+
77
+ #
78
+ # Data backup
79
+ #
80
+ def data
81
+ task("creating data backup", "done", "failed") do
82
+ execute("cp -r #{@environment.liferay.data_directory} #{@backup_directory}")
83
+ end
84
+ end
85
+
86
+ def pack
87
+ task("creating backup archive", "done", "failed") do
88
+ execute("cd #{@backup_directory} && tar -cf #{@package_file} * && mv #{@package_file} .. && cd .. && rm -rf #{@backup_directory}")
89
+ end
90
+ "#{@environment.backup.directory}/#{@package_file}"
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,59 @@
1
+ =begin
2
+ Copyright (c) 2012 Dmitri Carpov
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ =end
23
+
24
+ module Rays
25
+ module Database
26
+ class MySQL
27
+ def initialize(host, port, username, password, db_name=nil)
28
+ @host = host
29
+ @port = port
30
+ @username = username
31
+ @password = password
32
+ @db_name = db_name
33
+ end
34
+
35
+ def export_command(db_name, dump_file)
36
+ "mysqldump -u#{@username} #{pass_param} -h#{@host} --port=#{@port} #{db_name} > #{dump_file}"
37
+ end
38
+
39
+ def import_command(db_name, dump_file)
40
+ "mysql -u#{@username} #{pass_param} #{db_name} < #{dump_file}"
41
+ end
42
+
43
+ def create_database_command(db_name)
44
+ "mysqladmin -u#{@username} #{pass_param} create #{db_name}"
45
+ end
46
+
47
+ def delete_database_command(db_name)
48
+ "mysqladmin -u#{@username} #{pass_param} -f drop #{db_name}"
49
+ end
50
+
51
+ private
52
+ def pass_param
53
+ password = ''
54
+ password = "-p#{@password}" unless @password.nil? or @password.empty?
55
+ password
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,75 @@
1
+ =begin
2
+ Copyright (c) 2012 Dmitri Carpov
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ =end
23
+
24
+ module Rays
25
+ module Service
26
+ module Remote
27
+ class SSH
28
+
29
+ def initialize(host, port, user)
30
+ @host = host
31
+ @port = port # TODO: not used for now.
32
+ @user = user
33
+ defaults
34
+ end
35
+
36
+ def host
37
+ raise RaysException.new(missing_environment_option('ssh', 'host')) if @host.nil?
38
+ @host
39
+ end
40
+
41
+ def port
42
+ raise RaysException.new(missing_environment_option('ssh', 'port')) if @port.nil?
43
+ @port
44
+ end
45
+
46
+ def user
47
+ raise RaysException.new(missing_environment_option('ssh', 'user')) if @user.nil?
48
+ @user
49
+ end
50
+
51
+ def exec(command)
52
+ response = ""
53
+ Net::SSH.start("#{host}", "#{user}") do |ssh|
54
+ response = ssh.exec!(command)
55
+ $log.debug(response)
56
+ end
57
+ response
58
+ end
59
+
60
+ def copy_to(local_file, remote_file)
61
+ rays_exec("#{$rays_config.scp} #{local_file} #{user}@#{host}:#{remote_file}")
62
+ end
63
+
64
+ def copy_from(remote_file, local_file)
65
+ rays_exec("#{$rays_config.scp} #{user}@#{host}:#{remote_file} #{local_file}")
66
+ end
67
+
68
+ private
69
+ def defaults
70
+ @port ||= 22
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,92 @@
1
+ =begin
2
+ Copyright (c) 2012 Dmitri Carpov
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ =end
23
+
24
+ #
25
+ # NOT SUPPORTED
26
+ #
27
+ module Rays
28
+
29
+ class SCM
30
+ def initialize(path, username, password, type)
31
+ raise RaysException "unknown SCM type." if type.nil?
32
+ if type.eql? "svn"
33
+ @instance = SVN.new path, username, password, $rays_config.project_root
34
+ else
35
+ @instance = Git.new path, Rays::Utils::FileUtils.project_root
36
+ end
37
+ end
38
+
39
+ def update
40
+ @instance.update
41
+ end
42
+
43
+ def checkout
44
+ @instance.checkout
45
+ end
46
+
47
+ def clean_checkout
48
+ @instance.checkout "/tmp/#{Project.instance.name}"
49
+ end
50
+
51
+ end
52
+
53
+ private
54
+
55
+ class Git
56
+ def initialize path, source_dir
57
+ @path = path
58
+ @source_dir = source_dir
59
+ end
60
+
61
+ def checkout dir = nil
62
+ dir ||= @source_dir
63
+ rays_exec "git clone #{@path} #{dir}"
64
+ @source_dir = dir
65
+ end
66
+
67
+ def update
68
+ in_directory(@source_dir) do
69
+ rays_exec "git pull origin"
70
+ end
71
+ end
72
+ end
73
+
74
+ class SVN
75
+ def initialize path, username, password, source_dir
76
+ @path = path
77
+ @username = username
78
+ @password = password
79
+ @source_dir = source_dir
80
+ end
81
+
82
+ def checkout(dir = nil)
83
+ dir ||= @source_dir
84
+ rays_exec("svn co #{@path} --username=#{@username} --password=#{@password} #{dir}")
85
+ @source_dir = dir
86
+ end
87
+
88
+ def update
89
+ system_exec("cd #{@source_dir} && svn up", $rays_config.debug)
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,90 @@
1
+ =begin
2
+ Copyright (c) 2012 Dmitri Carpov
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ =end
23
+
24
+ module Rays
25
+ module Service
26
+ class Sync
27
+
28
+ def initialize
29
+ @import_directory = '/tmp/rays_import'
30
+ @dump_file_name = 'db.dump'
31
+ @data_dir_name = 'data'
32
+ recreate_import_directory
33
+ @import_package = File.join(@import_directory, 'import_package.tar')
34
+ end
35
+
36
+ def sync(environment = $rays_config.environment)
37
+ backup = Backup.new(environment)
38
+ package_location = backup.backup
39
+ task("copy backup file from #{environment.name}", 'done', 'failed') do
40
+ environment.liferay.remote.copy_from(package_location, @import_package)
41
+ end
42
+ task('unpack backup file', 'done', 'failed') do
43
+ in_directory(@import_directory) do
44
+ rays_exec("tar -xf #{@import_package}")
45
+ File.delete(@import_package)
46
+ end
47
+ end
48
+ task('check backup integrity', 'backup looks OK', 'failed') do
49
+ in_directory(@import_directory) do
50
+ raise RaysException.new('Cannot find dump.db') unless File.exists?(@dump_file_name)
51
+ raise RaysException.new('Cannot find data folder') unless Dir.exists?(@data_dir_name)
52
+ end
53
+ end
54
+
55
+ in_local_environment do
56
+ service_safe do
57
+ # create local backup
58
+ Backup.new.backup
59
+ in_directory(@import_directory) do
60
+ db = $rays_config.environment.database.instance
61
+ db_name = $rays_config.environment.database.db_name
62
+ begin
63
+ rays_exec(db.delete_database_command(db_name))
64
+ rescue => ex
65
+ $log.warn("Cannot drop database #{db_name}")
66
+ end
67
+ task("re-create database #{db_name}", 'done', 'failed') do
68
+ rays_exec(db.create_database_command(db_name))
69
+ end
70
+ task('import database dump', 'done', 'failed') do
71
+ rays_exec(db.import_command(db_name, File.join(@import_directory, @dump_file_name)))
72
+ end
73
+ task('re-create data folder', 'done', 'failed') do
74
+ FileUtils.rm_rf($rays_config.environment.liferay.data_directory)
75
+ FileUtils.cp_r(@data_dir_name, $rays_config.environment.liferay.data_directory)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ private
83
+ def recreate_import_directory
84
+ FileUtils.rm_rf(@import_directory) if Dir.exist?(@import_directory)
85
+ FileUtils.mkdir_p(@import_directory)
86
+ end
87
+
88
+ end
89
+ end
90
+ end