rapid 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/Rakefile +66 -0
  2. data/lib/rad/http_controller/acts_as/authenticated.rb +131 -0
  3. data/lib/rad/http_controller/acts_as/authenticated_master_domain.rb +119 -0
  4. data/lib/rad/http_controller/acts_as/authorized.rb +83 -0
  5. data/lib/rad/http_controller/acts_as/localized.rb +27 -0
  6. data/lib/rad/http_controller/acts_as/multitenant.rb +53 -0
  7. data/lib/rad/http_controller/helpers/service_mix_helper.rb +50 -0
  8. data/lib/rad/http_controller.rb +15 -0
  9. data/lib/rad/lib/text_utils.rb +334 -0
  10. data/lib/rad/locales/en.yml +80 -0
  11. data/lib/rad/locales/ru.yml +83 -0
  12. data/lib/rad/locales.rb +2 -0
  13. data/lib/rad/models/account.rb +88 -0
  14. data/lib/rad/models/default_permissions.yml +26 -0
  15. data/lib/rad/models/micelaneous.rb +1 -0
  16. data/lib/rad/models/role.rb +88 -0
  17. data/lib/rad/models/secure_token.rb +33 -0
  18. data/lib/rad/models/space.rb +184 -0
  19. data/lib/rad/models/user.rb +158 -0
  20. data/lib/rad/models.rb +41 -0
  21. data/lib/rad/mongo_mapper/acts_as/authenticated_by_open_id.rb +29 -0
  22. data/lib/rad/mongo_mapper/acts_as/authenticated_by_password.rb +120 -0
  23. data/lib/rad/mongo_mapper/acts_as/authorized.rb +197 -0
  24. data/lib/rad/mongo_mapper/acts_as/authorized_object.rb +171 -0
  25. data/lib/rad/mongo_mapper/multitenant.rb +34 -0
  26. data/lib/rad/mongo_mapper/rad_micelaneous.rb +43 -0
  27. data/lib/rad/mongo_mapper/space_keys.rb +62 -0
  28. data/lib/rad/mongo_mapper/text_processor.rb +47 -0
  29. data/lib/rad/mongo_mapper.rb +20 -0
  30. data/lib/rad/paperclip/callbacks.rb +40 -0
  31. data/lib/rad/paperclip/extensions.rb +64 -0
  32. data/lib/rad/paperclip/integration.rb +165 -0
  33. data/lib/rad/paperclip/mime.rb +5 -0
  34. data/lib/rad/paperclip/validations.rb +64 -0
  35. data/lib/rad/paperclip.rb +11 -0
  36. data/lib/rad/spec/controller.rb +51 -0
  37. data/lib/rad/spec/model/factories.rb +65 -0
  38. data/lib/rad/spec/model.rb +85 -0
  39. data/lib/rad/spec/rem_helper.rb +145 -0
  40. data/lib/rad/spec.rb +4 -0
  41. data/lib/rad/tasks/backup.rake +64 -0
  42. data/lib/rad/tasks/initialize.rake +35 -0
  43. data/lib/rad.rb +32 -0
  44. data/readme.md +3 -0
  45. data/spec/controller/authorization_spec.rb +146 -0
  46. data/spec/controller/helper.rb +14 -0
  47. data/spec/lib/helper.rb +7 -0
  48. data/spec/lib/text_utils_spec.rb +238 -0
  49. data/spec/models/authorization_spec.rb +93 -0
  50. data/spec/models/authorized_object_spec.rb +258 -0
  51. data/spec/models/file_audit_spec/100.txt +1 -0
  52. data/spec/models/file_audit_spec/302.txt +3 -0
  53. data/spec/models/file_audit_spec.rb +168 -0
  54. data/spec/models/helper.rb +11 -0
  55. data/spec/models/space_key_spec.rb +68 -0
  56. data/spec/models/user_spec.rb +80 -0
  57. data/spec/mongo_mapper/basic_spec.rb +41 -0
  58. data/spec/mongo_mapper/helper.rb +10 -0
  59. data/spec/spec.opts +4 -0
  60. metadata +138 -0
@@ -0,0 +1,165 @@
1
+ Paperclip.class_eval do
2
+ def self.registered_classes
3
+ @registered_classes ||= Hash.new{|h, k| h[k] = []}
4
+ end
5
+ end
6
+
7
+ Paperclip::ClassMethods.class_eval do
8
+ def has_attached_file name, options = {}
9
+ name = name.to_s
10
+
11
+ Paperclip.registered_classes[self] << name
12
+
13
+ define_paperclip_keys_for name
14
+
15
+ include Paperclip::InstanceMethods
16
+
17
+ write_inheritable_attribute(:attachment_definitions, {}) if attachment_definitions.nil?
18
+ attachment_definitions[name] = {:validations => []}.merge(options)
19
+
20
+ after_save :save_attached_files
21
+ before_destroy :destroy_attached_files
22
+
23
+ define_callbacks :before_post_process, :after_post_process
24
+ define_callbacks :"before_#{name}_post_process", :"after_#{name}_post_process"
25
+
26
+ define_method name do |*args|
27
+ a = attachment_for(name)
28
+ (args.length > 0) ? a.to_s(args.first) : a
29
+ end
30
+
31
+ define_method "#{name}=" do |file|
32
+ attachment_for(name).assign(file)
33
+ end
34
+
35
+ define_method "#{name}?" do
36
+ attachment_for(name).file?
37
+ end
38
+
39
+ validates_each name, :logic => lambda {
40
+ attachment = attachment_for(name)
41
+ attachment.send(:flush_errors) unless attachment.valid?
42
+ }
43
+ end
44
+
45
+ def disable_file_audit &block
46
+ begin
47
+ Thread.current['disable_file_audit'] = true
48
+ block.call
49
+ ensure
50
+ Thread.current['disable_file_audit'] = nil
51
+ end
52
+ end
53
+
54
+ def enable_file_audit &block
55
+ begin
56
+ Thread.current['disable_file_audit'] = false
57
+ block.call
58
+ ensure
59
+ Thread.current['disable_file_audit'] = nil
60
+ end
61
+ end
62
+
63
+ protected
64
+ def define_paperclip_keys_for attachment
65
+ key "#{attachment}_file_name", String
66
+ key "#{attachment}_content_type", String
67
+ key "#{attachment}_file_size", Integer
68
+ key "#{attachment}_updated_at", Time
69
+
70
+ key "#{attachment}_old_file_size"
71
+ end
72
+ end
73
+
74
+ Paperclip::InstanceMethods.class_eval do
75
+ protected
76
+ def disable_file_audit?
77
+ disable = Thread.current['disable_file_audit']
78
+ if disable != nil
79
+ disable
80
+ else
81
+ crystal.config.test?
82
+ end
83
+ end
84
+
85
+ def file_size_for attachment
86
+ send("#{attachment}_file_size") || 0
87
+ end
88
+
89
+ def old_file_size_for attachment
90
+ send("#{attachment}_old_file_size") || 0
91
+ end
92
+
93
+ def set_old_file_size_for attachment, size
94
+ send("#{attachment}_old_file_size=", size)
95
+ end
96
+ end
97
+
98
+ Paperclip::Interpolations.class_eval do
99
+ # fix filename to works with files without extension
100
+ def filename attachment, style
101
+ unless (ext = extension(attachment, style)).blank?
102
+ "#{basename(attachment, style)}.#{ext}"
103
+ else
104
+ basename(attachment, style)
105
+ end
106
+ end
107
+ end
108
+
109
+ Paperclip::Attachment.class_eval do
110
+ # allow spaces in filename
111
+ def assign uploaded_file
112
+ ensure_required_accessors!
113
+
114
+ if uploaded_file.is_a?(Paperclip::Attachment)
115
+ uploaded_file = uploaded_file.to_file(:original)
116
+ close_uploaded_file = uploaded_file.respond_to?(:close)
117
+ end
118
+
119
+ return nil unless valid_assignment?(uploaded_file)
120
+
121
+ uploaded_file.binmode if uploaded_file.respond_to? :binmode
122
+ self.clear
123
+
124
+ return nil if uploaded_file.nil?
125
+
126
+ @queued_for_write[:original] = uploaded_file.to_tempfile
127
+ instance_write(:file_name, uploaded_file.original_filename.strip.gsub(/[^A-Za-z\d\.\-_ ]+/, '_'))
128
+ instance_write(:content_type, uploaded_file.content_type.to_s.strip)
129
+ instance_write(:file_size, uploaded_file.size.to_i)
130
+ instance_write(:updated_at, Time.now)
131
+
132
+ @dirty = true
133
+
134
+ post_process if valid?
135
+
136
+ # Reset the file size if the original file was reprocessed.
137
+ instance_write(:file_size, @queued_for_write[:original].size.to_i)
138
+ ensure
139
+ uploaded_file.close if close_uploaded_file
140
+ validate
141
+ end
142
+
143
+ alias_method :file_name, :original_filename
144
+
145
+ def blank?; file_name.blank? end
146
+
147
+ # returns nil if file_name is blank
148
+ def url_with_default *args
149
+ unless file_name.nil?
150
+ url_without_default *args
151
+ else
152
+ nil
153
+ end
154
+ end
155
+ alias_method_chain :url, :default
156
+
157
+ # Hack to use styles with no processors
158
+ def post_process_styles_with_blank
159
+ @styles.each do |name, args|
160
+ return if args[:processors].blank?
161
+ end
162
+ post_process_styles_without_blank
163
+ end
164
+ alias_method_chain :post_process_styles, :blank
165
+ end
@@ -0,0 +1,5 @@
1
+ # MIME::Types.class_eval do
2
+ # def self.image? file_name
3
+ # !file_name.blank? and type_for(file_name).any?{|t| t.content_type =~ /image/}
4
+ # end
5
+ # end
@@ -0,0 +1,64 @@
1
+ Paperclip::ClassMethods.class_eval do
2
+
3
+ def validates_file attachment
4
+ validates_maximum_file_size attachment
5
+ validates_maximum_user_files_size attachment
6
+ validates_maximum_account_files_size attachment
7
+ end
8
+
9
+ def validates_maximum_file_size attachment
10
+ # defer do
11
+ method_name = "validates_maximum_#{attachment}_size"
12
+ define_method method_name do
13
+ max_size = Account.current? ? Account.current.max_file_size : config.max_file_size(1.megabyte)
14
+ size = file_size_for(attachment)
15
+ errors.add attachment, t(:invalid_file_size, :max_size => (max_size / 1000)) if size > max_size
16
+ end
17
+ protected method_name
18
+ validate method_name
19
+ # end
20
+ end
21
+
22
+ def validates_maximum_user_files_size attachment
23
+ method_name = "validates_maximum_user_files_size_for_#{attachment}"
24
+ define_method method_name do
25
+ return if disable_file_audit?
26
+ max_files_size = Space.current.max_user_files_size
27
+ return if max_files_size == 0
28
+
29
+ files_size = User.current.files_size
30
+ size = file_size_for(attachment)
31
+ old_size = old_file_size_for(attachment)
32
+ if size + files_size > max_files_size - old_size
33
+ errors.add(attachment, t(
34
+ :maximum_user_files_size_exceeded,
35
+ :max_files_size => (max_files_size / 1000),
36
+ :files_size => (files_size / 1000)
37
+ ))
38
+ end
39
+ end
40
+ protected method_name
41
+ validate method_name
42
+ end
43
+
44
+ def validates_maximum_account_files_size attachment
45
+ method_name = "validates_maximum_account_files_size_for_#{attachment}"
46
+ define_method method_name do
47
+ return if disable_file_audit?
48
+
49
+ files_size = Account.current.files_size
50
+ max_files_size = Account.current.max_account_files_size
51
+ size = file_size_for(attachment)
52
+ old_size = old_file_size_for(attachment)
53
+ if size + files_size > max_files_size - old_size
54
+ errors.add(attachment, t(
55
+ :maximum_account_files_size_exceeded,
56
+ :max_files_size => (max_files_size / 1000),
57
+ :files_size => (files_size / 1000)
58
+ ))
59
+ end
60
+ end
61
+ protected method_name
62
+ validate method_name
63
+ end
64
+ end
@@ -0,0 +1,11 @@
1
+ # require 'mime/types' TODO1 use Mime from Rack
2
+ gem 'paperclip', '=2.3.1.1'
3
+ require 'paperclip'
4
+
5
+ %w(
6
+ callbacks
7
+ integration
8
+ extensions
9
+ validations
10
+ ).each{|f| require "rad/paperclip/#{f}"}
11
+ # 'mime
@@ -0,0 +1,51 @@
1
+ require 'crystal/spec/controller'
2
+
3
+ #
4
+ # User
5
+ #
6
+ Spec::Example::ExampleGroup.class_eval do
7
+ def self.with_user_controller
8
+ return if @with_user_controller
9
+ @with_user_controller = true
10
+
11
+ Crystal::HttpController::Authenticated::InstanceMethods.class_eval do
12
+ def prepare_current_user_for_slave_domain_with_test
13
+ prepare_current_user_for_slave_domain_without_test if $do_not_skip_authentication
14
+ end
15
+ alias_method_chain :prepare_current_user_for_slave_domain, :test
16
+ end
17
+
18
+ Crystal::HttpController::AuthenticatedMasterDomain::InstanceMethods.class_eval do
19
+ def prepare_current_user_for_master_domain_with_test
20
+ prepare_current_user_for_master_domain_without_test if $do_not_skip_authentication
21
+ end
22
+ alias_method_chain :prepare_current_user_for_master_domain, :test
23
+ end
24
+ end
25
+ end
26
+
27
+
28
+ #
29
+ # Miltitenancy
30
+ #
31
+ Spec::Example::ExampleGroup.class_eval do
32
+ def self.with_multitenancy
33
+ return if @with_multitenancy
34
+ @with_multitenancy = true
35
+
36
+ # db_name = "#{SETTING.db_prefix!}_default_#{Rails.env}"
37
+ # global_db_name = "#{SETTING.db_prefix!}_global_#{Rails.env}"
38
+ # MongoMapper.database = db_name
39
+ Crystal::HttpController::Multitenant::InstanceMethods.class_eval do
40
+ protected
41
+
42
+ def select_account_and_space
43
+ yield
44
+ end
45
+
46
+ def select_multitenant_database
47
+ yield
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,65 @@
1
+ require 'factory_girl'
2
+
3
+ #
4
+ # User
5
+ #
6
+ Factory.define :blank_user, :class => User do |u|
7
+ u.sequence(:name){|i| "user#{i}"}
8
+ end
9
+
10
+ Factory.define :new_user, :class => User do |u|
11
+ u.sequence(:name){|i| "user#{i}"}
12
+ u.sequence(:email){|i| "user#{i}@email.com"}
13
+ u.sequence(:password){|i| "user#{i}"}
14
+ u.password_confirmation{|_self| _self.password}
15
+ end
16
+
17
+ Factory.define :user, :parent => :new_user do |u|
18
+ u.state 'active'
19
+ end
20
+
21
+ Factory.define :open_id_user, :class => User do |u|
22
+ u.sequence(:name){|i| "user#{i}"}
23
+ u.sequence(:open_ids){|i| ["open_id_#{i}"]}
24
+ u.state 'active'
25
+ end
26
+
27
+ Factory.define :anonymous, :class => User, :parent => :new_user do |u|
28
+ u.name 'anonymous'
29
+ u.email "anonymous@mail.com"
30
+ u.password "anonymous_password"
31
+ u.password_confirmation{|_self| _self.password}
32
+ end
33
+
34
+ Factory.define :admin, :class => User, :parent => :new_user do |u|
35
+ u.admin_of_accounts{[Account.current.id]}
36
+ # u.roles_containers{[RolesContainer.new(:space_id => Space.current.id, :roles => %w{member manager})]}
37
+ u.space_roles{%w{member manager}}
38
+ end
39
+
40
+ Factory.define :member, :class => User, :parent => :new_user do |u|
41
+ # u.roles_containers{[RolesContainer.new(:space_id => Space.current.id, :roles => %w{member})]}
42
+ u.space_roles{%w{member}}
43
+ end
44
+
45
+ Factory.define :manager, :class => User, :parent => :member do |u|
46
+ # u.roles_containers{[RolesContainer.new(:space_id => Space.current.id, :roles => %w{member manager})]}
47
+ u.space_roles{%w{member manager}}
48
+ end
49
+
50
+ Factory.define :global_admin, :parent => :user, :parent => :new_user do |u|
51
+ u.global_admin true
52
+ end
53
+
54
+
55
+ #
56
+ # Account and Space
57
+ #
58
+ Factory.define :account do |a|
59
+ a.name "test-account"
60
+ end
61
+
62
+ Factory.define :space do |s|
63
+ s.name "default"
64
+ s.account{|a| a.association(:account)}
65
+ end
@@ -0,0 +1,85 @@
1
+ require 'mongo_mapper_ext/spec/helper'
2
+ require 'crystal/environment'
3
+
4
+ #
5
+ # User
6
+ #
7
+ Spec::Example::ExampleGroup.class_eval do
8
+ def with_user
9
+ return if @with_user
10
+ @with_user = true
11
+
12
+ User.class_eval do
13
+ def self.anonymous
14
+ @anonymous ||= Factory.build :anonymous
15
+ end
16
+ end
17
+ end
18
+
19
+ def login_as user
20
+ User.current = user
21
+ # controller.stub!(:current_user).and_return(user)
22
+ end
23
+ end
24
+
25
+
26
+ #
27
+ # Miltitenancy
28
+ #
29
+ Spec::Example::ExampleGroup.class_eval do
30
+ def set_default_space
31
+ account = Factory.create :account
32
+
33
+ Account.current = account
34
+ Space.current = account.spaces.first
35
+ end
36
+
37
+ def set_space space
38
+ if space
39
+ Space.current = space
40
+ Account.current = space.account
41
+ else
42
+ Space.current = nil
43
+ Account.current = nil
44
+ end
45
+ end
46
+ end
47
+
48
+
49
+ #
50
+ # Database
51
+ #
52
+ Spec::Example::ExampleGroup.class_eval do
53
+ def self.with_test_database
54
+ before :all do
55
+ MongoMapper.db_config = {
56
+ 'global' => {'name' => 'global_test'},
57
+ 'accounts' => {'name' => "accounts_test"}
58
+ }
59
+
60
+ MongoMapper.database = 'global_test'
61
+ # MongoMapper.call_deferred
62
+ end
63
+ end
64
+ end
65
+
66
+
67
+ #
68
+ # Rad
69
+ #
70
+ Spec::Example::ExampleGroup.class_eval do
71
+ def self.with_rad_model
72
+ # with_mail
73
+ with_mongo_mapper
74
+ with_test_database
75
+ # with_user
76
+
77
+ before :all do
78
+ crystal[:logger] = Logger.new nil
79
+
80
+ require 'rad/models'
81
+ require 'rad/spec/model/factories'
82
+ with_user
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,145 @@
1
+ # require 'mongo_mapper_ext/spec/helper'
2
+ #
3
+ #
4
+ # #
5
+ # # Mail
6
+ # #
7
+ # Spec::Example::ExampleGroup.class_eval do
8
+ # def self.with_mail
9
+ # raise 'not implemented'
10
+ # end
11
+ #
12
+ # def clear_mail
13
+ # # ActionMailer::Base.delivery_method = :test
14
+ # # ActionMailer::Base.perform_deliveries = true
15
+ # # ActionMailer::Base.deliveries = []
16
+ # end
17
+ #
18
+ # def sent_letters
19
+ # # ActionMailer::Base.deliveries
20
+ # end
21
+ # end
22
+ #
23
+ #
24
+ # #
25
+ # # Routes
26
+ # #
27
+ # def default_path
28
+ # crystal.config.default_path!
29
+ # end
30
+ #
31
+ #
32
+ # #
33
+ # # User
34
+ # #
35
+ # Spec::Example::ExampleGroup.class_eval do
36
+ # def self.with_user
37
+ # return if @with_user
38
+ # @with_user = true
39
+ #
40
+ # User.class_eval do
41
+ # def self.anonymous
42
+ # @anonymous ||= Factory.build :anonymous
43
+ # end
44
+ # end
45
+ # end
46
+ #
47
+ # def self.with_user_controller
48
+ # return if @with_user_controller
49
+ # @with_user_controller = true
50
+ #
51
+ # Crystal::Remote::Authenticated::InstanceMethods.class_eval do
52
+ # def prepare_current_user_for_slave_domain_with_test
53
+ # prepare_current_user_for_slave_domain_without_test if $do_not_skip_authentication
54
+ # end
55
+ # alias_method_chain :prepare_current_user_for_slave_domain, :test
56
+ # end
57
+ #
58
+ # Crystal::Remote::AuthenticatedMasterDomain::InstanceMethods.class_eval do
59
+ # def prepare_current_user_for_master_domain_with_test
60
+ # prepare_current_user_for_master_domain_without_test if $do_not_skip_authentication
61
+ # end
62
+ # alias_method_chain :prepare_current_user_for_master_domain, :test
63
+ # end
64
+ # end
65
+ #
66
+ # def login_as user
67
+ # User.current = user
68
+ # # controller.stub!(:current_user).and_return(user)
69
+ # end
70
+ # end
71
+ #
72
+ #
73
+ # #
74
+ # # Miltitenancy
75
+ # #
76
+ # Spec::Example::ExampleGroup.class_eval do
77
+ # def self.with_multitenancy
78
+ # return if @with_multitenancy
79
+ # @with_multitenancy = true
80
+ #
81
+ # # db_name = "#{SETTING.db_prefix!}_default_#{Rails.env}"
82
+ # # global_db_name = "#{SETTING.db_prefix!}_global_#{Rails.env}"
83
+ # # MongoMapper.database = db_name
84
+ # Crystal::Remote::Multitenant::InstanceMethods.class_eval do
85
+ # protected
86
+ #
87
+ # def select_account_and_space
88
+ # yield
89
+ # end
90
+ #
91
+ # def select_multitenant_database
92
+ # yield
93
+ # end
94
+ # end
95
+ # end
96
+ #
97
+ # def set_default_space
98
+ # account = Factory.create :account
99
+ #
100
+ # Account.current = account
101
+ # Space.current = account.spaces.first
102
+ # end
103
+ #
104
+ # def set_space space
105
+ # if space
106
+ # Space.current = space
107
+ # Account.current = space.account
108
+ # else
109
+ # Space.current = nil
110
+ # Account.current = nil
111
+ # end
112
+ # end
113
+ # end
114
+ #
115
+ #
116
+ # #
117
+ # # Database
118
+ # #
119
+ # Spec::Example::ExampleGroup.class_eval do
120
+ # def self.with_test_database
121
+ # before :all do
122
+ # MongoMapper.db_config = {
123
+ # 'global' => {'name' => 'global_test'},
124
+ # 'accounts' => {'name' => "accounts_test"}
125
+ # }
126
+ #
127
+ # MongoMapper.database = 'global_test'
128
+ #
129
+ # MongoMapper.call_deferred
130
+ # end
131
+ # end
132
+ # end
133
+ #
134
+ #
135
+ # #
136
+ # # Rad
137
+ # #
138
+ # Spec::Example::ExampleGroup.class_eval do
139
+ # def self.with_rad_model
140
+ # # with_mail
141
+ # with_mongo_mapper
142
+ # with_test_database
143
+ # with_user
144
+ # end
145
+ # end
data/lib/rad/spec.rb ADDED
@@ -0,0 +1,4 @@
1
+ %w(
2
+ model
3
+ controller
4
+ ).each{|n| require "rad/spec/#{n}"}
@@ -0,0 +1,64 @@
1
+ require 'net/ssh'
2
+
3
+ folders = {
4
+ '/apps/spaces/shared/system' => '/spaces/shared',
5
+ '/apps/service_mix/shared/system' => '/service_mix/shared'
6
+ }
7
+
8
+ databases = [
9
+ "accounts_production",
10
+ "global_production"
11
+ ]
12
+
13
+ backup_directory = '/Users/alex/Documents/saas4b_backup'
14
+ user = 'web'
15
+ host = 'saas4b.com'
16
+
17
+ task :backup do
18
+ raise "Backup directory doesn't exist! (#{backup_directory})" unless File.exist? backup_directory
19
+
20
+ # Create Databases Dump
21
+ Net::SSH.start(host, user) do |ssh|
22
+ databases.each do |dbname|
23
+ command = "/opt/mongodb/bin/mongodump --db #{dbname} --out /tmp/#{dbname}.mongo.dump"
24
+ puts "Executing Remotelly: #{command}"
25
+ result = ssh.exec!(command)
26
+ puts result
27
+ end
28
+ end
29
+
30
+ # Copying Database
31
+ databases.each do |dbname|
32
+ dump_file = "/tmp/#{dbname}.mongo.dump"
33
+ backup_tmp_file = "#{backup_directory}/#{dbname}.tmp"
34
+ command = "rsync -e 'ssh' -al --delete --stats --progress #{user}@#{host}:#{dump_file}/ #{backup_tmp_file}"
35
+ puts "Executing: #{command}"
36
+ system command
37
+
38
+ raise "Can't find downloaded dump file for #{dbname} Database (#{backup_tmp_file})!" unless File.exist? backup_tmp_file
39
+ backup_file = "#{backup_directory}/#{dbname}.mongo.dump"
40
+ FileUtils.rm_r backup_file if File.exist? backup_file
41
+ File.rename backup_tmp_file, backup_file
42
+ end
43
+
44
+ # Remove tmp dump files
45
+ Net::SSH.start(host, user) do |ssh|
46
+ databases.each do |dbname|
47
+ command = "rm -r /tmp/#{dbname}.mongo.dump"
48
+ puts "Executing Remotelly: #{command}"
49
+ result = ssh.exec!(command)
50
+ puts result
51
+ end
52
+ end
53
+
54
+ # Copying Data Files
55
+ folders.each do |from, to|
56
+ to_full_path = "#{backup_directory}#{to}"
57
+ FileUtils.mkdir_p to_full_path unless File.exist? to_full_path
58
+ command = "rsync -e 'ssh' -al --delete --stats --progress #{user}@#{host}:#{from} #{to_full_path}"
59
+ puts "Executing: #{command}"
60
+ system command
61
+ end
62
+
63
+ puts "Backup finished!"
64
+ end
@@ -0,0 +1,35 @@
1
+ namespace :db do
2
+ SAMPLE_DATA_DIR = File.dirname(__FILE__) + "/sample_data"
3
+
4
+ desc "Initialize database with initial data"
5
+ task :initialize => :environment do
6
+ # Anonymous User
7
+ User.find_by_name('anonymous').try :destroy
8
+ u = User.new :name => 'anonymous',
9
+ :email => "anonymous@mail.com",
10
+ :password => "anonymous_password",
11
+ :password_confirmation => "anonymous_password"
12
+ u.save :validate => false
13
+ u.activate!
14
+ u.save :validate => false
15
+
16
+ # Admin User
17
+ User.find_by_name('admin').try :destroy
18
+ u = User.new :name => 'admin',
19
+ :email => "admin@mail.com",
20
+ :password => 'admin',
21
+ :password_confirmation => 'admin',
22
+ :global_admin => true
23
+ u.save :validate => false
24
+ u.activate!
25
+ u.save :validate => false
26
+
27
+ # Default Account
28
+ Account.find_by_name('development').try :destroy
29
+ Account.create! :name => 'development', :domains => ["localhost"]
30
+ end
31
+
32
+ desc "Rollback db:initialize action"
33
+ task :deinitialize => :environment do
34
+ end
35
+ end