syc-backup 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -25,7 +25,7 @@ Create a cron job that is scheduled every day at 2:30
25
25
  $ sycbackup -d database -uuser -ppass -f directory,file1 --cron 30,2,*,*,*
26
26
 
27
27
  If the user or password contains characters as '(' you have to escape
28
- them. A password like 123(56 has to be provided with pass\"123\\\\(56\".
28
+ them. A password like 123(56 has to be provided with pass\"123\(56\".
29
29
 
30
30
  == Usage of --override and --no-compress
31
31
  Whether the backup directory and the backup files are time stamped depends how
@@ -165,6 +165,16 @@ already exist in the crontab they are overridden.</p>
165
165
  <dd class="description"><p>Temporary file that holds the entries to be written to the crontab</p>
166
166
 
167
167
 
168
+ <dt id="POST_COMMENT">POST_COMMENT
169
+
170
+ <dd class="description"><p>Post comment after the entered command</p>
171
+
172
+
173
+ <dt id="PRE_COMMENT">PRE_COMMENT
174
+
175
+ <dd class="description"><p>Pre comment before the entered command</p>
176
+
177
+
168
178
  </dl>
169
179
  </section>
170
180
 
@@ -198,7 +208,7 @@ and the application exits</p>
198
208
 
199
209
 
200
210
  <div class="method-source-code" id="add_command-source">
201
- <pre><span class="ruby-comment"># File lib/backup/cron_edit.rb, line 20</span>
211
+ <pre><span class="ruby-comment"># File lib/backup/cron_edit.rb, line 25</span>
202
212
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">add_command</span>(<span class="ruby-identifier">command</span>, <span class="ruby-identifier">environment</span>=[])
203
213
  <span class="ruby-identifier">command</span> = <span class="ruby-identifier">command</span>.<span class="ruby-identifier">strip</span>.<span class="ruby-identifier">squeeze</span>(<span class="ruby-string">&quot; &quot;</span>)
204
214
 
@@ -224,7 +234,9 @@ and the application exits</p>
224
234
  <span class="ruby-keyword">end</span>
225
235
 
226
236
  <span class="ruby-keyword">unless</span> <span class="ruby-identifier">entries</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">command</span>
237
+ <span class="ruby-identifier">entries</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">PRE_COMMENT</span>
227
238
  <span class="ruby-identifier">entries</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">command</span>
239
+ <span class="ruby-identifier">entries</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">POST_COMMENT</span>
228
240
 
229
241
  <span class="ruby-identifier">cron_entries_file</span> = <span class="ruby-constant">CRON_ENTRIES_FILE</span>
230
242
  <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">cron_entries_file</span>, <span class="ruby-string">'w'</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span>
@@ -275,7 +287,7 @@ after the values have been written to crontab</p>
275
287
 
276
288
 
277
289
  <div class="method-source-code" id="cleanup-source">
278
- <pre><span class="ruby-comment"># File lib/backup/cron_edit.rb, line 123</span>
290
+ <pre><span class="ruby-comment"># File lib/backup/cron_edit.rb, line 132</span>
279
291
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">cleanup</span>
280
292
  <span class="ruby-constant">File</span>.<span class="ruby-identifier">delete</span> <span class="ruby-constant">CRON_ENTRIES_FILE</span> <span class="ruby-keyword">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exists?</span> <span class="ruby-constant">CRON_ENTRIES_FILE</span>
281
293
  <span class="ruby-keyword">end</span></pre>
@@ -310,7 +322,7 @@ crontab call fails the error message and exit status of
310
322
 
311
323
 
312
324
  <div class="method-source-code" id="remove_command-source">
313
- <pre><span class="ruby-comment"># File lib/backup/cron_edit.rb, line 75</span>
325
+ <pre><span class="ruby-comment"># File lib/backup/cron_edit.rb, line 82</span>
314
326
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">remove_command</span>(<span class="ruby-identifier">command</span>)
315
327
  <span class="ruby-identifier">command</span> = <span class="ruby-identifier">command</span>.<span class="ruby-identifier">strip</span>.<span class="ruby-identifier">squeeze</span>(<span class="ruby-string">&quot; &quot;</span>)
316
328
 
@@ -332,9 +344,11 @@ crontab call fails the error message and exit status of
332
344
 
333
345
  <span class="ruby-identifier">entries</span> = <span class="ruby-identifier">stdout</span>.<span class="ruby-identifier">split</span>(<span class="ruby-regexp">%r\n/</span>).<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">entry</span><span class="ruby-operator">|</span> <span class="ruby-identifier">entry</span>.<span class="ruby-identifier">strip</span>.<span class="ruby-identifier">squeeze</span>(<span class="ruby-string">&quot; &quot;</span>)}
334
346
 
347
+ <span class="ruby-identifier">entries</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-constant">PRE_COMMENT</span>)
335
348
  <span class="ruby-identifier">entries</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">command</span>)
349
+ <span class="ruby-identifier">entries</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-constant">POST_COMMENT</span>)
336
350
 
337
- <span class="ruby-identifier">cron_entries_file</span> = <span class="ruby-constant">CRON_ENTRIES_FILE</span> <span class="ruby-comment">#&quot;.cron_entries&quot;</span>
351
+ <span class="ruby-identifier">cron_entries_file</span> = <span class="ruby-constant">CRON_ENTRIES_FILE</span>
338
352
 
339
353
  <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">cron_entries_file</span>, <span class="ruby-string">'w'</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">file</span><span class="ruby-operator">|</span>
340
354
  <span class="ruby-identifier">entries</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">entry</span><span class="ruby-operator">|</span> <span class="ruby-identifier">file</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">entry</span>}
@@ -115,28 +115,43 @@ command is added to crontab.</p>
115
115
  <p><a href="Backup.html">Backup</a> a database to the default folder
116
116
  _~/backup_</p>
117
117
 
118
- <pre>$ sycup -d database -uuser -ppass</pre>
118
+ <pre>$ sycbackup -d database -uuser -ppass</pre>
119
119
 
120
120
  <p><a href="Backup.html">Backup</a> a MySQL database, a directory and files to
121
121
  the default folder</p>
122
122
 
123
- <pre>$ sycup -d database -uuser -ppass -f directory,file1,file2</pre>
123
+ <pre>$ sycbackup -d database -uuser -ppass -f directory,file1,file2</pre>
124
124
 
125
125
  <p>Specify a backup folder</p>
126
126
 
127
- <pre>$ sycup backup/folder -d database -uuser -ppass -f directory,file1,file2</pre>
127
+ <pre>$ sycbackup backup/folder -d database -uuser -ppass -f directory,file1,file2</pre>
128
128
 
129
129
  <p>Override files in the backup folder if they exist</p>
130
130
 
131
- <pre>$ sycup backup/folder --override -f directory,file1,file2</pre>
131
+ <pre>$ sycbackup backup/folder --override -f directory,file1,file2</pre>
132
132
 
133
133
  <p>Don’t compress the backup</p>
134
134
 
135
- <pre>$ sycup --no-compress -f directory,file1,file2</pre>
135
+ <pre>$ sycbackup --no-compress -f directory,file1,file2</pre>
136
136
 
137
137
  <p>Create a cron job that is scheduled every day at 2:30</p>
138
138
 
139
- <pre>$ sycup -d database -uuser -ppass -f directory,file1 --cron 30,2,*,*,*</pre>
139
+ <pre>$ sycbackup -d database -uuser -ppass -f directory,file1 --cron 30,2,*,*,*</pre>
140
+
141
+ <p>If the user or password contains characters as ‘(’ you have to escape them.
142
+ A password like 123(56 has to be provided with pass"123\\(56".</p>
143
+
144
+ <h2 id="label-Usage+of+--override+and+--no-compress">Usage of –override and –no-compress</h2>
145
+
146
+ <p>Whether the backup directory and the backup files are time stamped depends
147
+ how –override and –no-compress is set. The results are shown in the table
148
+ below.</p>
149
+
150
+ <pre>--override --no-compress backup directory backup file(s)
151
+ 0 0 w/o timestamp w/ timestamp
152
+ 1 0 w/o timestamp w/ timestamp
153
+ 0 1 w/ timestamp uncompressed
154
+ 1 1 w/o timestamp uncompressed</pre>
140
155
 
141
156
  <h2 id="label-Supported+Platform">Supported Platform</h2>
142
157
 
@@ -167,6 +182,10 @@ finish. <em>MySQLBackup</em> needs to run a MySQL database with a database
167
182
 
168
183
  <p>The test files live in the test folder and begin with test_.</p>
169
184
 
185
+ <p>There is a rake file available which can be used to run all tests with</p>
186
+
187
+ <pre>$ rake test</pre>
188
+
170
189
  <h2 id="label-Links">Links</h2>
171
190
  <ul><li><dl class="rdoc-list label-list"><dt><a href="http://sugaryourcoffee.github.com/syc-backup">sugaryourcoffee.github.com/syc-backup</a>
172
191
  <dd><ul><li>
@@ -1,17 +1,17 @@
1
- Sat, 02 Feb 2013 19:22:09 +0100
2
- ./README.rdoc Sun, 27 Jan 2013 22:13:29 +0100
1
+ Mon, 04 Feb 2013 22:11:40 +0100
2
+ ./README.rdoc Mon, 04 Feb 2013 22:04:33 +0100
3
3
  ./test/test_process.rb Sat, 02 Feb 2013 16:04:30 +0100
4
4
  ./test/test_mysql_backup.rb Sat, 02 Feb 2013 16:05:39 +0100
5
- ./test/test_options.rb Sat, 02 Feb 2013 14:21:39 +0100
5
+ ./test/test_options.rb Mon, 04 Feb 2013 21:31:24 +0100
6
6
  ./test/test_cron_edit.rb Sat, 26 Jan 2013 23:41:31 +0100
7
7
  ./test/test_environment.rb Sat, 02 Feb 2013 15:56:51 +0100
8
8
  ./test/test_file_backup.rb Sat, 02 Feb 2013 16:09:39 +0100
9
- ./lib/backup_version.rb Sat, 02 Feb 2013 17:53:41 +0100
9
+ ./lib/backup_version.rb Mon, 04 Feb 2013 22:05:10 +0100
10
10
  ./lib/backup/file_backup.rb Sat, 02 Feb 2013 17:58:42 +0100
11
- ./lib/backup/process.rb Mon, 28 Jan 2013 08:46:33 +0100
11
+ ./lib/backup/process.rb Mon, 04 Feb 2013 21:15:51 +0100
12
12
  ./lib/backup/mysql_backup.rb Sun, 27 Jan 2013 22:30:18 +0100
13
- ./lib/backup/options.rb Sat, 02 Feb 2013 18:13:34 +0100
14
- ./lib/backup/cron_edit.rb Sat, 02 Feb 2013 18:31:29 +0100
13
+ ./lib/backup/options.rb Mon, 04 Feb 2013 21:37:20 +0100
14
+ ./lib/backup/cron_edit.rb Sat, 02 Feb 2013 21:17:07 +0100
15
15
  ./lib/backup/environment.rb Sat, 02 Feb 2013 15:55:40 +0100
16
16
  ./lib/backup/runner.rb Sat, 02 Feb 2013 15:29:54 +0100
17
17
  ./bin/sycbackup Sun, 27 Jan 2013 13:07:36 +0100
@@ -33,6 +33,7 @@
33
33
  <li><a href="README_rdoc.html#label-Backup+utility+for+database%2C+folders+and+files">Backup utility for database, folders and files</a>
34
34
  <li><a href="README_rdoc.html#label-Install">Install</a>
35
35
  <li><a href="README_rdoc.html#label-Usage">Usage</a>
36
+ <li><a href="README_rdoc.html#label-Usage+of+--override+and+--no-compress">Usage of –override and –no-compress</a>
36
37
  <li><a href="README_rdoc.html#label-Supported+Platform">Supported Platform</a>
37
38
  <li><a href="README_rdoc.html#label-Notes">Notes</a>
38
39
  <li><a href="README_rdoc.html#label-Tests">Tests</a>
@@ -25,6 +25,9 @@ module Backup
25
25
  # Determines whether to compress the backup if not to compress it returns
26
26
  # false, otherwise true
27
27
  attr_reader :no_compress
28
+ # Specifies the maximum backup files to keep. Count < 1 means infinite
29
+ # backup files
30
+ attr_reader :max_backups
28
31
 
29
32
  # Takes the arguments from the command line and parses them
30
33
  def initialize(argv)
@@ -158,6 +161,12 @@ module Backup
158
161
  @cron = validate_cron_values c.split(/ /).slice(0..4)
159
162
  end
160
163
 
164
+ opts.on("-m", "--max-backups COUNT", Integer,
165
+ "The maximum compressed backup files count",
166
+ "to keep") do |m|
167
+ @max_backups = m
168
+ end
169
+
161
170
  opts.on("-v", "--version", "Show version") do |v|
162
171
  puts Backup::VERSION
163
172
  exit 0
@@ -14,11 +14,12 @@ module Backup
14
14
  # provided the files in the backup folder are overridden. no_compress will
15
15
  # prevent compressing the backed up files and will just copy them to the
16
16
  # provided backup folder
17
- def initialize(backup_folder, files, override, no_compress)
17
+ def initialize(backup_folder, files, override, no_compress, max_backups = 9)
18
18
  @backup_folder = backup_folder
19
19
  @files = files
20
20
  @override = override
21
21
  @no_compress = no_compress
22
+ @max_backups = max_backups
22
23
  end
23
24
 
24
25
  # Creates the backup of the database and the files. If at least one of the
@@ -36,14 +37,43 @@ module Backup
36
37
 
37
38
  if @no_compress
38
39
  copy_files
40
+ delete_uncompressed_backups
39
41
  else
40
42
  compress_files_and_copy
43
+ delete_compressed_backups
41
44
  end
42
45
 
43
46
  end
44
47
 
45
48
  private
46
49
 
50
+ # Checks if the compressed backups exceed the max backups denoted by
51
+ # @max_backups and respectively deletes the oldest files to meet the
52
+ # @max_backups count. @max_backups less than 1 is equivalent to infinite
53
+ # backup count, so no files will be deleted and 0 is returned otherwise
54
+ # the count of files deleted is returned.
55
+ def delete_compressed_backups
56
+ return 0 if @max_backups < 1
57
+
58
+ pattern = "#{@backup_folder}*-*_syc-backup.tar.gz"
59
+ files = Dir.glob(pattern).sort_by {|f| File.mtime(f)}
60
+
61
+ file_count_to_delete = [0, files.count-@max_backups].max
62
+ return 0 if file_count_to_delete == 0
63
+
64
+ files.first(file_count_to_delete).each {|f| File.delete f}
65
+
66
+ file_count_to_delete
67
+ end
68
+
69
+ # Checks if the uncompressed backups exceed the max backups denoted by
70
+ # @max_backups and respectively deletes the oldest files to meet the
71
+ # @max_backups count. @max_backups less than 1 is equivalent to infinite
72
+ # backup count, so no files will be deleted and 0 is returned otherwise
73
+ # the count of files deleted is returned.
74
+ def delete_uncompressed_backups
75
+ end
76
+
47
77
  # Checks if files to backup have been provided that don't exist. Returns the
48
78
  # inexistent files
49
79
  def check_for_inexistent_files
@@ -19,7 +19,7 @@ module Backup
19
19
  def run
20
20
  if @options.cron
21
21
  create_cron
22
- else
22
+ elsif @options.database or @options.file
23
23
  create_backup
24
24
  end
25
25
  end
@@ -42,6 +42,7 @@ module Backup
42
42
  ' -u' + @options.user +
43
43
  ' -p' + @options.password if @options.database
44
44
  command += ' -f ' + @options.files.join(',') if @options.files
45
+ command += ' -m ' + @options.max_backups if @options.max_backups
45
46
  command += ' --no-compress' if @options.no_compress
46
47
  command += ' --override' if @options.override
47
48
 
@@ -66,7 +67,8 @@ module Backup
66
67
  process = Process.new(@options.backup_folder,
67
68
  files,
68
69
  @options.override,
69
- @options.no_compress)
70
+ @options.no_compress,
71
+ @options.max_backups)
70
72
  process.backup
71
73
  puts "--> backed up files"
72
74
  puts " #{files.join("\n ")}"
@@ -5,5 +5,5 @@
5
5
  # per default compressed but this can be ommitted
6
6
  module Backup
7
7
  # Version of the application
8
- VERSION = '0.0.6'
8
+ VERSION = '0.0.7'
9
9
  end
@@ -4,8 +4,7 @@ require 'backup_version'
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "syc-backup"
6
6
  s.summary = %q{Back up a database and files}
7
- s.description = %q{Back up a database and files or schedule cron job
8
- for backup}
7
+ s.description = File.read(File.join(File.dirname(__FILE__), 'README.rdoc'))
9
8
  s.requirements = ['No requirements']
10
9
  s.version = Backup::VERSION
11
10
  s.author = "Pierre Sugar"
@@ -19,6 +19,7 @@ class TestProcess < Test::Unit::TestCase
19
19
  def teardown
20
20
  @files.each {|f| File.delete f}
21
21
  Dir["test/backup_p/*"].each {|f| File.delete f if File.file? f}
22
+ FileUtils.remove_dir "test/backup_p" if File.exists? "test/backup_p"
22
23
  end
23
24
 
24
25
  should "backup files to provided folder without compressing" do
@@ -35,6 +36,35 @@ class TestProcess < Test::Unit::TestCase
35
36
  assert_equal 1, Dir["test/backup_p/*.tar.gz"].size
36
37
  end
37
38
 
39
+ should "delete backups according to --max-backups" do
40
+ pro = Backup::Process.new("test/backup_p/", @files, false, false, 3)
41
+ 4.times.with_index do |i|
42
+ assert_equal i, Dir["test/backup_p/*.tar.gz"].size
43
+ pro.backup
44
+ print "."
45
+ sleep 1
46
+ end
47
+ assert_equal 3, Dir["test/backup_p/*.tar.gz"].size
48
+ end
49
+
50
+ should "don't delete backups due to max backups count < 1" do
51
+ pro = Backup::Process.new("test/backup_p/", @files, false, false, 0)
52
+ 2.times.with_index do |i|
53
+ pro.backup
54
+ print "."
55
+ sleep 1
56
+ end
57
+ assert_equal 2, Dir["test/backup_p/*.tar.gz"].size
58
+
59
+ pro = Backup::Process.new("test/backup_p/", @files, false, false, -3)
60
+ 2.times.with_index do |i|
61
+ pro.backup
62
+ print "."
63
+ sleep 1
64
+ end
65
+ assert_equal 4, Dir["test/backup_p/*.tar.gz"].size
66
+ end
67
+
38
68
  end
39
69
 
40
70
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: syc-backup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,17 +9,51 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-04 00:00:00.000000000 Z
12
+ date: 2013-02-07 00:00:00.000000000 Z
13
13
  dependencies: []
14
- description: ! "Back up a database and files or schedule cron job \n for
15
- backup"
14
+ description: ! "= Backup utility for database, folders and files\nBacks up a MySQL
15
+ database, folders and files to a default folder (~/backup) or to a specified folder.
16
+ If the --cron switch is provided the specified database and files are not backed
17
+ up rather a cron job of the provided command is added to crontab.\n\n== Install\nThe
18
+ application can be installed with\n $ gem install syc-backup\n\n== Usage\nBackup
19
+ a database to the default folder _~/backup_\n $ sycbackup -d database -uuser
20
+ -ppass\n\nBackup a MySQL database, a directory and files to the default folder\n
21
+ \ $ sycbackup -d database -uuser -ppass -f directory,file1,file2\n\nSpecify a
22
+ backup folder\n $ sycbackup backup/folder -d database -uuser -ppass -f directory,file1,file2\n\nOverride
23
+ files in the backup folder if they exist\n $ sycbackup backup/folder --override
24
+ -f directory,file1,file2\n\nDon't compress the backup\n $ sycbackup --no-compress
25
+ -f directory,file1,file2\n\nCreate a cron job that is scheduled every day at 2:30\n
26
+ \ $ sycbackup -d database -uuser -ppass -f directory,file1 --cron 30,2,*,*,*\n\nIf
27
+ the user or password contains characters as '(' you have to escape\nthem. A password
28
+ like 123(56 has to be provided with pass\\\"123\\(56\\\".\n\n== Usage of --override
29
+ and --no-compress\nWhether the backup directory and the backup files are time stamped
30
+ depends how\n--override and --no-compress is set. The results are shown in the table
31
+ below.\n\n --override --no-compress backup directory backup file(s)\n
32
+ \ 0 0 w/o timestamp w/ timestamp\n 1
33
+ \ 0 w/o timestamp w/ timestamp\n 0 1
34
+ \ w/ timestamp uncompressed\n 1 1 w/o
35
+ timestamp uncompressed\n\n== Supported Platform\nsyc-backup has been tested
36
+ with 1.9.3\n\n== Notes\nThe application backs up the MySQL database with _mysqldump_.
37
+ The dumpfile has the form yyyymmdd-HHMMSS_databasename.sql. After the files are
38
+ backed up the dumpfile will be deleted.\n\nIf the --no-compress is provided the
39
+ files are copied to the backup folder. Otherwise they are compressed with _tar cfz
40
+ YYYYmmdd-HHMMSS_syc-backup.tar.gz_.\n\nIf the --override switch is not provided
41
+ the backup directory will be added a timestamp. So if you create a cron job you
42
+ should every now and then delete obsolete backup folders.\n\nThe source contains
43
+ lib/backup/file_backup.rb which is not used in the application.\n \n== Tests\nThe
44
+ tests create folders and files and will be deleted after the tests finish. _MySQLBackup_
45
+ needs to run a MySQL database with a database _test_ and a user _user_ with the
46
+ password _pass_.\n\nThe test files live in the test folder and begin with test_.\n\nThere
47
+ is a rake file available which can be used to run all tests with\n $ rake test\n\n==
48
+ Links\n* [http://sugaryourcoffee.github.com/syc-backup] - RubyDoc\n* [http://www.github.com/sugaryourcoffee/syc-backup]
49
+ - Source code on GitHub\n* [http://syc.dyndns.org/drupal/content/backup-drupal-database]
50
+ - Development notebook\n* [https://rubygems.org/gems/syc-backup] - RubyGems\n"
16
51
  email: pierre@sugaryourcoffee.de
17
52
  executables:
18
53
  - sycbackup
19
54
  extensions: []
20
55
  extra_rdoc_files: []
21
56
  files:
22
- - syc-backup-0.0.5.gem
23
57
  - README.rdoc
24
58
  - test/test_process.rb
25
59
  - test/test_mysql_backup.rb
@@ -86,6 +120,7 @@ files:
86
120
  - doc/rdoc.css
87
121
  - doc/TestMySQLBackup.html
88
122
  - doc/TestOptions.html
123
+ - syc-backup-0.0.6.gem
89
124
  - bin/sycbackup
90
125
  - Rakefile
91
126
  homepage: http://syc.dyndns.org/drupal