smartmachine 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b3ee76cffa4f2e68ce10d0cf6e2ab0734520ab901fd4cd37dc53b6e15a1690a9
4
- data.tar.gz: 9c48ce88369327fb8914ece890b48349bb27b389b1f71e384bb7611869ac3a9b
3
+ metadata.gz: abf46cdee1bfbf5a35837643f766eed7a83a824e04247cd2cb8a09af34dc6752
4
+ data.tar.gz: f51cc20363a52e15ba30f628d8dafd9897a15f9d5d4252e8bbf4d7af1d012282
5
5
  SHA512:
6
- metadata.gz: c629d1bcf0900c3278fb21e9c794cee97f6f8842a9eadc411d13c4c606ffaa2b9e2ba4f2cc303dc79622e9bbf252e4cecaad72a39033f15747d22e7f972aee8b
7
- data.tar.gz: 9bd5b57762ee72afad778b0883b6a96b430fa334784912e0e91502b9ea61b29befc687fc7bc4ee0bc39b2f7568c484d0fcf353764543f3afb34529b2c7ffc925
6
+ metadata.gz: cc1429cc9ad3bfb04741487b3620f17a5e103af6d817463631cabd9f6aacd85ad0d5921f3bb98275444f24bf78ead7e9c35c7eb17f4282c55946ebdc1e555039
7
+ data.tar.gz: 67879fc2681d7d32129795d7e8b60519997dfed8a40a60c174a2c7d19573e61b46b821fe80e0de7991fd8587451ddc983c865a6d7b1d161f3fd975b9593c55b3
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'smart_machine'
4
+
5
+ command = ARGV.shift
6
+
7
+ scheduler = SmartMachine::Grids::Scheduler.new
8
+
9
+ case command
10
+ when "start"
11
+ action = ARGV.shift
12
+ scheduler.mysql("start") if action == "--mysql"
13
+
14
+ when "stop"
15
+ action = ARGV.shift
16
+ scheduler.mysql("stop") if action == "--mysql"
17
+
18
+ end
@@ -25,4 +25,9 @@ when "prereceiver"
25
25
  prereceiver = SmartMachine::Grids::Prereceiver.new
26
26
  prereceiver.public_send(action, *ARGV)
27
27
 
28
+ when "scheduler"
29
+ action = ARGV.shift
30
+ scheduler = SmartMachine::Grids::Scheduler.new
31
+ scheduler.public_send(action, *ARGV)
32
+
28
33
  end
@@ -24,6 +24,7 @@ require 'smart_machine/grids/minio'
24
24
  require 'smart_machine/grids/mysql'
25
25
  require 'smart_machine/grids/nginx'
26
26
  require 'smart_machine/grids/prereceiver'
27
+ require 'smart_machine/grids/scheduler'
27
28
  require 'smart_machine/grids/solr'
28
29
 
29
30
  require 'smart_machine/apps'
@@ -12,6 +12,7 @@ RUN sed -i "s/999/99/" /etc/group && \
12
12
 
13
13
  # Essentials
14
14
  RUN apk add --update build-base && \
15
+ apk add --update xz && \
15
16
  apk add --update docker && \
16
17
  apk add --update git && \
17
18
  rm -rf /var/cache/apk/*
@@ -8,7 +8,7 @@ module SmartMachine
8
8
 
9
9
  module VERSION
10
10
  MAJOR = 0
11
- MINOR = 7
11
+ MINOR = 8
12
12
  TINY = 0
13
13
  PRE = nil
14
14
 
@@ -7,7 +7,10 @@ module SmartMachine
7
7
  grid_name = args.shift
8
8
  action = args.shift
9
9
 
10
- raise "invalid action on the grid" unless ['up', 'down'].include? action
10
+ valid_actions = ['up', 'down']
11
+ valid_actions.push(*['backup', 'flushlogs']) if grid_name == 'mysql'
12
+ valid_actions.push(*["start", "stop"]) if grid_name == 'scheduler'
13
+ raise "invalid action on the grid #{grid_name}" unless valid_actions.include? action
11
14
 
12
15
  Object.const_get("SmartMachine::Grids::#{grid_name.capitalize}").new.public_send(action, *args)
13
16
  end
@@ -21,7 +21,7 @@ module SmartMachine
21
21
  # Creating & Starting containers
22
22
  print "-----> Creating container mysql ... "
23
23
  if system("docker create \
24
- --name='mysql' \
24
+ --name='#{container_name}' \
25
25
  --env MYSQL_ROOT_PASSWORD=#{SmartMachine.credentials.mysql[:root_password]} \
26
26
  --env MYSQL_USER=#{SmartMachine.credentials.mysql[:username]} \
27
27
  --env MYSQL_PASSWORD=#{SmartMachine.credentials.mysql[:password]} \
@@ -60,7 +60,144 @@ module SmartMachine
60
60
  puts "done"
61
61
  end
62
62
  end
63
- end
63
+ end
64
+
65
+ # Flushing logs
66
+ def flushlogs(*args)
67
+ print "-----> Flushing logs for #{container_name} ... "
68
+ if system("docker exec #{container_name} sh -c \
69
+ 'exec mysqladmin \
70
+ --user=root \
71
+ --password=#{SmartMachine.credentials.mysql[:root_password]} \
72
+ flush-logs'")
73
+
74
+ puts "done"
75
+ else
76
+ puts "error"
77
+ end
78
+ end
79
+
80
+ # Create backup using the grids backup command
81
+ def backup(*args)
82
+ args.flatten!
83
+ type = args.empty? ? '--snapshot' : args.shift
84
+
85
+ if type == "--daily"
86
+ run_backup(type: "daily")
87
+ elsif type == "--promote-to-weekly"
88
+ run_backup(type: "weekly")
89
+ elsif type == "--snapshot"
90
+ run_backup(type: "snapshot")
91
+ elsif type == "--transfer"
92
+ transfer_backups_to_external_storage
93
+ end
94
+ end
95
+
96
+ private
97
+
98
+ # Transfer all current backups to external storage
99
+ def transfer_backups_to_external_storage
100
+ end
101
+
102
+ def run_backup(type:)
103
+ FileUtils.mkdir_p("#{backups_path}/#{type}")
104
+
105
+ unless type == "weekly"
106
+ standard_backup(type: type)
107
+ else
108
+ weekly_backup_from_latest_daily
109
+ end
110
+ end
111
+
112
+ def restore(type:, version:)
113
+ printf "Are you sure you want to do this? It will destroy/overwrite all the current databases? Type 'YES' and press enter to continue: ".red
114
+ prompt = STDIN.gets.chomp
115
+ return unless prompt == 'YES'
116
+
117
+ print "-----> Restoring the backup of all databases with version #{version} (without binlogs) in #{container_name} ... "
118
+ if system("docker exec -i #{container_name} sh -c \
119
+ 'exec xz < #{backups_path}/#{type}/#{version}.sql.xz \
120
+ | mysql \
121
+ --user=root \
122
+ --password=#{SmartMachine.credentials.mysql[:root_password]}")
123
+
124
+ puts "done"
125
+ else
126
+ puts "error... check data & try again"
127
+ end
128
+ end
129
+
130
+ # Create a standard backup
131
+ def standard_backup(type:)
132
+ # Note: There should be no space between + and " in version.
133
+ # Note: date will be UTC date until timezone has been changed.
134
+ version = `date +"%Y%m%d%H%M%S"`.chomp!
135
+ backup_version_file = "#{version}.sql.xz"
136
+
137
+ print "-----> Creating #{type} backup of all databases with backup version file #{backup_version_file} in #{container_name} ... "
138
+ if system("docker exec #{container_name} sh -c \
139
+ 'exec mysqldump \
140
+ --user=root \
141
+ --password=#{SmartMachine.credentials.mysql[:root_password]} \
142
+ --all-databases \
143
+ --single-transaction \
144
+ --flush-logs \
145
+ --master-data=2 \
146
+ --events \
147
+ --routines \
148
+ --triggers' \
149
+ | xz -9 > #{backups_path}/#{type}/#{backup_version_file}")
150
+
151
+ puts "done"
152
+
153
+ clean_up(type: type)
154
+ else
155
+ puts "error... check data & try again"
156
+ end
157
+ end
158
+
159
+ # Copy weekly backup from the daily backup
160
+ def weekly_backup_from_latest_daily
161
+ Dir.chdir("#{backups_path}/daily") do
162
+ backup_versions = Dir.glob('*').sort
163
+ backup_version = backup_versions.last
164
+
165
+ if backup_version
166
+ print "-----> Creating weekly backup from daily backup version file #{backup_version} ... "
167
+ system("cp ./#{backup_version} ../weekly/#{backup_version}")
168
+ puts "done"
169
+
170
+ clean_up(type: "weekly")
171
+ else
172
+ puts "-----> Could not find daily backup to copy to weekly ... error"
173
+ end
174
+ end
175
+ end
176
+
177
+ # Clean up very old versions
178
+ def clean_up(type:)
179
+ keep_releases = { snapshot: 2, daily: 7, weekly: 3 }
180
+
181
+ Dir.chdir("#{backups_path}/#{type}") do
182
+ backup_versions = Dir.glob('*').sort
183
+ destroy_count = backup_versions.count - keep_releases[type.to_sym]
184
+ if destroy_count > 0
185
+ print "Deleting older #{type} backups ... "
186
+ destroy_count.times do
187
+ FileUtils.rm_r(File.join(Dir.pwd, backup_versions.shift))
188
+ end
189
+ puts "done"
190
+ end
191
+ end
192
+ end
193
+
194
+ def backups_path
195
+ "#{SmartMachine.config.user_home_path}/.smartmachine/grids/mysql/backups"
196
+ end
197
+
198
+ def container_name
199
+ "mysql"
200
+ end
64
201
  end
65
202
  end
66
203
  end
@@ -0,0 +1,188 @@
1
+ # The main SmartMachine Grids Scheduler driver
2
+ module SmartMachine
3
+ class Grids
4
+ class Scheduler < SmartMachine::Base
5
+
6
+ def initialize
7
+ end
8
+
9
+ def install
10
+ puts "-----> Installing Scheduler"
11
+
12
+ ssh = SmartMachine::SSH.new
13
+ commands = ["smartmachine runner scheduler create"]
14
+ ssh.run commands
15
+
16
+ puts "-----> Scheduler Installation Complete"
17
+ end
18
+
19
+ def uninstall
20
+ puts "-----> Uninstalling Scheduler"
21
+
22
+ ssh = SmartMachine::SSH.new
23
+ commands = ["smartmachine runner scheduler destroy"]
24
+ ssh.run commands
25
+
26
+ puts "-----> Scheduler Uninstallation Complete"
27
+ end
28
+
29
+ def update
30
+ uninstall
31
+ install
32
+ end
33
+
34
+ def create
35
+ unless system("docker image inspect #{scheduler_image_name}", [:out, :err] => File::NULL)
36
+ print "-----> Creating image #{scheduler_image_name} ... "
37
+ if system("docker image build -t #{scheduler_image_name} \
38
+ --build-arg SMARTMACHINE_VERSION=#{SmartMachine.version} \
39
+ #{SmartMachine.config.root_path}/lib/smart_machine/grids/scheduler", out: File::NULL)
40
+ puts "done"
41
+
42
+ up
43
+ end
44
+ end
45
+ end
46
+
47
+ def destroy
48
+ down
49
+
50
+ if system("docker image inspect #{scheduler_image_name}", [:out, :err] => File::NULL)
51
+ print "-----> Removing image #{scheduler_image_name} ... "
52
+ if system("docker image rm #{scheduler_image_name}", out: File::NULL)
53
+ puts "done"
54
+ end
55
+ end
56
+ end
57
+
58
+ def up
59
+ if SmartMachine::Docker.running?
60
+ if system("docker image inspect #{scheduler_image_name}", [:out, :err] => File::NULL)
61
+ print "-----> Creating container scheduler with image #{scheduler_image_name} ... "
62
+ if system("docker create \
63
+ --name='scheduler' \
64
+ --env MAILTO=#{SmartMachine.config.sysadmin_email} \
65
+ --user `id -u` \
66
+ --workdir /home/`id -un`/.smartmachine \
67
+ --volume='#{SmartMachine.config.user_home_path}/.smartmachine/config:#{SmartMachine.config.user_home_path}/.smartmachine/config' \
68
+ --volume='#{SmartMachine.config.user_home_path}/.smartmachine/grids/scheduler:#{SmartMachine.config.user_home_path}/.smartmachine/grids/scheduler' \
69
+ --volume='#{SmartMachine.config.user_home_path}/.smartmachine/bin/smartmachine.sh:/usr/local/bundle/bin/smartmachine' \
70
+ --volume='/var/run/docker.sock:/var/run/docker.sock:ro' \
71
+ --restart='always' \
72
+ #{scheduler_image_name}", out: File::NULL)
73
+ puts "done"
74
+
75
+ print "-----> Starting container scheduler with image #{scheduler_image_name} ... "
76
+ if system("docker start scheduler", out: File::NULL)
77
+ puts "done"
78
+
79
+ restore_crontabs
80
+ else
81
+ puts "error"
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ def down
89
+ if SmartMachine::Docker.running?
90
+ # Stopping & Removing containers - in reverse order
91
+ if system("docker inspect -f '{{.State.Running}}' 'scheduler'", [:out, :err] => File::NULL)
92
+ print "-----> Stopping container scheduler with image #{scheduler_image_name} ... "
93
+ if system("docker stop 'scheduler'", out: File::NULL)
94
+ puts "done"
95
+
96
+ print "-----> Removing container scheduler with image #{scheduler_image_name} ... "
97
+ if system("docker rm 'scheduler'", out: File::NULL)
98
+ puts "done"
99
+ end
100
+ end
101
+ else
102
+ puts "-----> Container 'scheduler' is currently not running."
103
+ end
104
+ end
105
+ end
106
+
107
+
108
+ def start(*args)
109
+ args.flatten!
110
+ type = args.empty? ? '--all' : args.shift
111
+
112
+ self.class.running!
113
+
114
+ if type == '--mysql'
115
+ system("docker exec -i scheduler sh -c 'exec scheduler start --mysql'")
116
+ end
117
+ end
118
+
119
+ def stop(*args)
120
+ args.flatten!
121
+ type = args.empty? ? '--all' : args.shift
122
+
123
+ self.class.running!
124
+
125
+ if type == '--mysql'
126
+ system("docker exec -i scheduler sh -c 'exec scheduler stop --mysql'")
127
+ end
128
+ end
129
+
130
+ def mysql(*args)
131
+ args.flatten!
132
+ action = args.empty? ? '' : args.shift
133
+
134
+ return unless ['start', 'stop'].include? action
135
+
136
+ command = "whenever --set 'output=#{SmartMachine.config.user_home_path}/.smartmachine/grids/scheduler/crontabs/crontabs.log' --load-file #{SmartMachine.config.user_home_path}/.smartmachine/config/mysql/schedule.rb"
137
+
138
+ if action == 'start'
139
+ command += " --update-crontab"
140
+ action_text = "Starting"
141
+ elsif action == 'stop'
142
+ command += " --clear-crontab"
143
+ action_text = "Stopping"
144
+ end
145
+
146
+ print "-----> #{action_text} automatic backup schedule for mysql ... "
147
+ if system(command, out: File::NULL)
148
+ puts "done"
149
+ else
150
+ puts "error"
151
+ end
152
+ ensure
153
+ backup_crontabs
154
+ end
155
+
156
+ def scheduler_image_name
157
+ "smartmachine/scheduler:#{SmartMachine.version}"
158
+ end
159
+
160
+ def restore_crontabs
161
+ if system("docker exec scheduler sh -c 'exec test -f #{SmartMachine.config.user_home_path}/.smartmachine/grids/scheduler/crontabs/`id -un`'")
162
+ print "-----> Restoring latest crontabs ... "
163
+
164
+ if system("docker exec scheduler sh -c 'exec crontab - < #{SmartMachine.config.user_home_path}/.smartmachine/grids/scheduler/crontabs/`id -un`'")
165
+ puts "done"
166
+ else
167
+ puts "error"
168
+ end
169
+ end
170
+ end
171
+
172
+ def backup_crontabs
173
+ print "-----> Backing up latest crontabs ... "
174
+ if system("crontab -l > #{SmartMachine.config.user_home_path}/.smartmachine/grids/scheduler/crontabs/`id -un`", out: File::NULL)
175
+ puts "done"
176
+ else
177
+ puts "error"
178
+ end
179
+ end
180
+
181
+ def self.running!
182
+ unless system("docker inspect -f '{{.State.Running}}' 'scheduler'", [:out, :err] => File::NULL)
183
+ raise "Scheduler is not running. Please start scheduler before scheduling"
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,14 @@
1
+ ARG SMARTMACHINE_VERSION
2
+
3
+ FROM smartmachine:$SMARTMACHINE_VERSION
4
+ LABEL maintainer="Timeboard <hello@timeboard.me>"
5
+
6
+ # Scheduler Essentials
7
+ RUN apk add --update busybox-suid && \
8
+ apk add --update bash && \
9
+ rm -rf /var/cache/apk/*
10
+
11
+ # Gems
12
+ RUN gem install whenever -v 1.0.0
13
+
14
+ CMD ["crond", "-f", "-l", "0", "-L", "/dev/stdout"]
@@ -64,6 +64,11 @@ module SmartMachine
64
64
  prereceiver.public_send(action)
65
65
  end
66
66
 
67
+ if args.empty? || args.include?("scheduler")
68
+ scheduler = SmartMachine::Grids::Scheduler.new
69
+ scheduler.public_send(action)
70
+ end
71
+
67
72
  if args.empty? || args.include?("elasticsearch")
68
73
  elasticsearch = SmartMachine::Grids::Elasticsearch.new
69
74
  elasticsearch.public_send(action)
@@ -43,11 +43,15 @@ module SmartMachine
43
43
  'grids/minio/data/***',
44
44
 
45
45
  'grids/mysql',
46
+ 'grids/mysql/backups/***',
46
47
  'grids/mysql/data/***',
47
48
 
48
49
  'grids/nginx',
49
50
  'grids/nginx/certificates/***',
50
51
 
52
+ 'grids/scheduler',
53
+ 'grids/scheduler/crontabs/***',
54
+
51
55
  'grids/solr',
52
56
  'grids/solr/solr/***',
53
57
  ]
@@ -63,6 +67,8 @@ module SmartMachine
63
67
  'apps/repositories/.keep',
64
68
 
65
69
  'config',
70
+ 'config/mysql',
71
+ 'config/mysql/schedule.rb',
66
72
  'config/credentials.yml.enc',
67
73
  'config/environment.rb',
68
74
 
@@ -79,6 +85,8 @@ module SmartMachine
79
85
  'grids/minio/data/.keep',
80
86
 
81
87
  'grids/mysql',
88
+ 'grids/mysql/backups',
89
+ 'grids/mysql/backups/.keep',
82
90
  'grids/mysql/data',
83
91
  'grids/mysql/data/.keep',
84
92
 
@@ -96,6 +104,10 @@ module SmartMachine
96
104
  'grids/redis/data',
97
105
  'grids/redis/data/.keep',
98
106
 
107
+ 'grids/scheduler',
108
+ 'grids/scheduler/crontabs',
109
+ 'grids/scheduler/crontabs/.keep',
110
+
99
111
  'grids/solr',
100
112
  'grids/solr/solr',
101
113
  'grids/solr/solr/.keep',
@@ -0,0 +1,19 @@
1
+ # Recommended defaults have been setup.
2
+ # This file should be changed only when you know what you are doing.
3
+
4
+ # Flush logs used to create consistent binlogs to be used for incremental backups
5
+ every :day, at: '12:00 pm' do
6
+ command "smartmachine runner grids mysql flushlogs"
7
+ end
8
+
9
+ # Create daily backup.
10
+ # This also flushes the logs before backup
11
+ every :day, at: '12:00 am' do
12
+ command "smartmachine runner grids mysql backup --daily"
13
+ end
14
+
15
+ # Promote currently latest daily backup to weekly backup.
16
+ # This is only possible when a daily backup creation has already been completed.
17
+ every :monday, at: '3:00 am' do
18
+ command "smartmachine runner grids mysql backup --promote-to-weekly"
19
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smartmachine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Timeboard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-12 00:00:00.000000000 Z
11
+ date: 2020-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-ssh
@@ -58,6 +58,20 @@ dependencies:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '6.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: whenever
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.0'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.0'
61
75
  description: SmartMachine is a full-stack deployment framework for rails optimized
62
76
  for admin programmer happiness and peaceful administration. It encourages natural
63
77
  simplicity by favoring convention over configuration.
@@ -65,6 +79,7 @@ email: hello@timeboard.me
65
79
  executables:
66
80
  - buildpacker
67
81
  - prereceiver
82
+ - scheduler
68
83
  - smartmachine
69
84
  - smartrunner
70
85
  extensions: []
@@ -76,6 +91,7 @@ files:
76
91
  - README.rdoc
77
92
  - bin/buildpacker
78
93
  - bin/prereceiver
94
+ - bin/scheduler
79
95
  - bin/smartmachine
80
96
  - bin/smartrunner
81
97
  - lib/smart_machine.rb
@@ -112,6 +128,8 @@ files:
112
128
  - lib/smart_machine/grids/prereceiver/fcgiwrap/packages/main/x86_64/fcgiwrap-openrc-1.1.1-r4.apk
113
129
  - lib/smart_machine/grids/redis.rb
114
130
  - lib/smart_machine/grids/redis/.keep
131
+ - lib/smart_machine/grids/scheduler.rb
132
+ - lib/smart_machine/grids/scheduler/Dockerfile
115
133
  - lib/smart_machine/grids/solr.rb
116
134
  - lib/smart_machine/grids/solr/config/.keep
117
135
  - lib/smart_machine/grids/solr/config/README.txt
@@ -283,10 +301,12 @@ files:
283
301
  - lib/smart_machine/templates/dotsmartmachine/apps/containers/.keep
284
302
  - lib/smart_machine/templates/dotsmartmachine/apps/repositories/.keep
285
303
  - lib/smart_machine/templates/dotsmartmachine/config/environment.rb
304
+ - lib/smart_machine/templates/dotsmartmachine/config/mysql/schedule.rb
286
305
  - lib/smart_machine/templates/dotsmartmachine/config/users.yml
287
306
  - lib/smart_machine/templates/dotsmartmachine/grids/elasticsearch/data/.keep
288
307
  - lib/smart_machine/templates/dotsmartmachine/grids/elasticsearch/logs/.keep
289
308
  - lib/smart_machine/templates/dotsmartmachine/grids/minio/data/.keep
309
+ - lib/smart_machine/templates/dotsmartmachine/grids/mysql/backups/.keep
290
310
  - lib/smart_machine/templates/dotsmartmachine/grids/mysql/data/.keep
291
311
  - lib/smart_machine/templates/dotsmartmachine/grids/nginx/certificates/.keep
292
312
  - lib/smart_machine/templates/dotsmartmachine/grids/nginx/fastcgi.conf
@@ -294,6 +314,7 @@ files:
294
314
  - lib/smart_machine/templates/dotsmartmachine/grids/nginx/nginx.tmpl
295
315
  - lib/smart_machine/templates/dotsmartmachine/grids/prereceiver/pre-receive
296
316
  - lib/smart_machine/templates/dotsmartmachine/grids/redis/data/.keep
317
+ - lib/smart_machine/templates/dotsmartmachine/grids/scheduler/crontabs/.keep
297
318
  - lib/smart_machine/templates/dotsmartmachine/grids/solr/solr/.keep
298
319
  - lib/smart_machine/templates/dotsmartmachine/tmp/.keep
299
320
  - lib/smart_machine/user.rb
@@ -303,8 +324,8 @@ licenses:
303
324
  - MIT
304
325
  metadata:
305
326
  bug_tracker_uri: https://github.com/timeboarders/smartbytes/issues
306
- changelog_uri: https://github.com/timeboarders/smartbytes/blob/v0.7.0/smartmachine/CHANGELOG.rdoc
307
- source_code_uri: https://github.com/timeboarders/smartbytes/tree/v0.7.0/smartmachine
327
+ changelog_uri: https://github.com/timeboarders/smartbytes/blob/v0.8.0/smartmachine/CHANGELOG.rdoc
328
+ source_code_uri: https://github.com/timeboarders/smartbytes/tree/v0.8.0/smartmachine
308
329
  post_install_message:
309
330
  rdoc_options:
310
331
  - "--main"