s3archive 1.2.0 → 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.
- data/lib/s3archive/postrotate.rb +70 -0
- data/lib/tasks/s3archive.thor +42 -15
- metadata +2 -1
@@ -0,0 +1,70 @@
|
|
1
|
+
# The main entry point db:backup_to_s3 is run by /etc/logrotate.d/rails3app
|
2
|
+
# daily. changed
|
3
|
+
|
4
|
+
require 'thor'
|
5
|
+
require 'socket' # For hostname
|
6
|
+
require 'tempfile'
|
7
|
+
require_relative 'logging'
|
8
|
+
require_relative 'config'
|
9
|
+
require_relative 's3_file_synchronizer'
|
10
|
+
|
11
|
+
module S3Archive
|
12
|
+
class Postrotate
|
13
|
+
include Logging
|
14
|
+
|
15
|
+
def self.run(logfile_path)
|
16
|
+
new(logfile_path).run
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :logfile_path
|
20
|
+
def initialize(logfile_path)
|
21
|
+
@logfile_path = logfile_path
|
22
|
+
end
|
23
|
+
|
24
|
+
def run
|
25
|
+
raise "Could not find #{prev_logfile}" unless File.exists?(prev_logfile)
|
26
|
+
bucket = S3Archive.config.bucket
|
27
|
+
logger.info("* Uploading #{prev_logfile} to s3://#{bucket}/#{key}")
|
28
|
+
S3FileSynchronizer.run(prev_logfile, bucket, key)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def key
|
34
|
+
year, month, day = prev_date.strftime("%Y-%m-%d").split('-') # Quick & dirty way to obtain leading zeroes in months and days
|
35
|
+
[hostname, year, month, day, File.basename(prev_logfile)].join('/')
|
36
|
+
end
|
37
|
+
|
38
|
+
def hostname
|
39
|
+
Socket.gethostname
|
40
|
+
end
|
41
|
+
|
42
|
+
def prev_logfile
|
43
|
+
"#{logfile_basename}-#{prev_date_str}.gz"
|
44
|
+
end
|
45
|
+
|
46
|
+
def prev_date_str
|
47
|
+
prev_date.strftime("%Y%m%d")
|
48
|
+
end
|
49
|
+
|
50
|
+
def prev_date
|
51
|
+
logfile_date.prev_day
|
52
|
+
end
|
53
|
+
|
54
|
+
def logfile_date
|
55
|
+
parse_logfile_path unless @logfile_date
|
56
|
+
@logfile_date
|
57
|
+
end
|
58
|
+
|
59
|
+
def logfile_basename
|
60
|
+
parse_logfile_path unless @logfile_basename
|
61
|
+
@logfile_basename
|
62
|
+
end
|
63
|
+
|
64
|
+
def parse_logfile_path
|
65
|
+
logfile_path =~ /\A(.*)-(\d{8})\z/ || raise("Could not parse logfile path")
|
66
|
+
@logfile_basename = $1
|
67
|
+
@logfile_date = Date.strptime($2, "%Y%m%d")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/tasks/s3archive.thor
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'thor'
|
2
2
|
$:.unshift File.join(File.dirname(__FILE__), '..')
|
3
|
+
require 's3archive/postrotate'
|
3
4
|
require 's3archive/compress_and_upload'
|
4
5
|
require 's3archive/logging'
|
5
6
|
|
6
7
|
module S3Archive
|
7
8
|
class Cli < Thor
|
8
|
-
include Logging
|
9
|
+
include ::S3Archive::Logging
|
9
10
|
namespace :s3archive
|
10
11
|
|
11
12
|
class_option :config,
|
@@ -15,31 +16,57 @@ module S3Archive
|
|
15
16
|
:aliases => "-c",
|
16
17
|
:default => "/etc/s3archive.yml"
|
17
18
|
|
18
|
-
desc "
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
desc "postrotate LOGFILE [LOGFILE...]", "A postrotate hook for logrotate."
|
20
|
+
long_desc <<-EOF
|
21
|
+
Uploads the logfile that was rotated yesterday! I.e., after
|
22
|
+
logrotate has run, you will typically three files: application.log-20100805.gz
|
23
|
+
(this is the file that is uploaded), application.log-20100806 and
|
24
|
+
application.log.
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
Note: For this to work, you *must* have the following stanzas in
|
27
|
+
the logrotate configuration: compress, delayedcompress, dateext & ifempty.
|
28
|
+
EOF
|
29
|
+
|
30
|
+
def postrotate (*paths)
|
31
|
+
set_config
|
32
|
+
help(:postrotate) && exit if paths.empty?
|
33
|
+
|
34
|
+
paths.each do |path|
|
35
|
+
begin
|
36
|
+
::S3Archive::Postrotate.run(path)
|
37
|
+
rescue Exception => e
|
38
|
+
logger.error(e)
|
39
|
+
end
|
29
40
|
end
|
41
|
+
end
|
30
42
|
|
31
|
-
|
43
|
+
desc "upload FILE [FILE...]", "Uploads the file(s) (compressed) to s3://bucket/<hostname>/<year>/<month>/<day>/<filename>.gz"
|
44
|
+
def upload (*paths)
|
45
|
+
set_config
|
32
46
|
help(:upload) && exit if paths.empty?
|
33
47
|
|
34
|
-
logger.info("Sleeping for #{options[:sleep]} seconds") && sleep(options[:sleep])
|
35
48
|
paths.each do |path|
|
36
|
-
|
49
|
+
begin
|
50
|
+
::S3Archive::CompressAndUpload.run(path)
|
51
|
+
rescue Exception => e
|
52
|
+
logger.error(e)
|
53
|
+
end
|
37
54
|
end
|
38
55
|
end
|
39
56
|
|
40
57
|
desc "genconfig", "Prints a sample config file to stdout"
|
41
58
|
def genconfig
|
42
|
-
puts S3Archive::Config.sample_yaml
|
59
|
+
puts ::S3Archive::Config.sample_yaml
|
60
|
+
end
|
61
|
+
|
62
|
+
no_tasks do
|
63
|
+
def set_config
|
64
|
+
unless File.exists?(options[:config])
|
65
|
+
logger.error("Could not find config file #{options[:config]}")
|
66
|
+
exit(1)
|
67
|
+
end
|
68
|
+
::S3Archive.config_path = options[:config]
|
69
|
+
end
|
43
70
|
end
|
44
71
|
end
|
45
72
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: s3archive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -71,6 +71,7 @@ files:
|
|
71
71
|
- lib/s3archive/compress_and_upload.rb
|
72
72
|
- lib/s3archive/config.rb
|
73
73
|
- lib/s3archive/logging.rb
|
74
|
+
- lib/s3archive/postrotate.rb
|
74
75
|
- lib/s3archive/s3_file_synchronizer.rb
|
75
76
|
- lib/tasks/s3archive.thor
|
76
77
|
homepage: http://github.com/spab/s3archive
|