niky81-s3rbackup 0.2.9 → 0.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.
Files changed (4) hide show
  1. data/bin/s3query.rb +22 -27
  2. data/bin/s3rbackup.rb +1 -1
  3. data/lib/s3dbsync.rb +79 -195
  4. metadata +11 -2
data/bin/s3query.rb CHANGED
@@ -16,7 +16,7 @@ class OptS3rquery
16
16
  def self.parse(args)
17
17
  options = {}
18
18
  opts = OptionParser.new do |opts|
19
- opts.banner = "Usage: s3query.rb [options] <search|get|unpack|delete|stats|logs> <parameters> (parameters can be name=test or simply test)"
19
+ opts.banner = "Usage: s3query.rb [options] <search|get|unpack|delete|stats> <parameters> (parameters can be name=test or simply test)"
20
20
 
21
21
  opts.on("-s", "search words", String, "Search something") do |name|
22
22
  options[:op] = "search"
@@ -74,22 +74,22 @@ class OptS3rquery
74
74
  options[:first] = true
75
75
  end
76
76
 
77
- opts.on("--log", "Log enabled") do |name|
78
- options[:log] = true
77
+ opts.on("-u", "--config-number NUM", Integer, "Number of config to use if nil use first") do |name|
78
+ options[:config_num] = name
79
79
  end
80
-
81
- opts.on("--nolog", "Log disabled") do |name|
82
- options[:log] = false
80
+
81
+ opts.on("--initialize", "Inizializza bucket and db") do |name|
82
+ options[:initialize] = true
83
83
  end
84
-
85
- opts.on("--bucket-log", String, "Bucket log NAME") do |name|
86
- options[:bucket_log] = name
84
+
85
+ opts.on("--destroy", "Destroy bucket and db") do |name|
86
+ options[:destroy] = true
87
87
  end
88
88
 
89
- opts.on("-u", "--config-number NUM", Integer, "Number of config to use if nil use first") do |name|
90
- options[:config_num] = name
89
+ opts.on("--test", "Test something") do |name|
90
+ options[:test] = true
91
91
  end
92
-
92
+
93
93
  opts.on_tail("-h", "--help", "Show this message") do
94
94
  puts opts
95
95
  exit
@@ -125,8 +125,6 @@ case command
125
125
  results = s3db.find(ARGV, nil, options)
126
126
  results = get_last(results) if options[:last]
127
127
  results = get_first(results) if options[:first]
128
- when 'logs'
129
- sub_cmd = ARGV.shift
130
128
  end
131
129
  case command
132
130
  when 'search'
@@ -160,7 +158,6 @@ case command
160
158
  puts "Deleting of #{ret["aws_name"]}"
161
159
  s3db.delete(ret)
162
160
  end
163
- s3db.salva_db
164
161
  when 'stats'
165
162
  #get size
166
163
  bucks_s = {}
@@ -171,23 +168,21 @@ case command
171
168
  else
172
169
  results.each do |ret|
173
170
  bucks_s[ret["bucket"]] ||= 0
174
- bucks_s[ret["bucket"]] += ret["size"]
171
+ bucks_s[ret["bucket"]] += ret["size"].to_i
175
172
  end
176
173
  bucks_s.each do |key,val|
177
174
  puts "#{key}:\t#{sprintf("%.2fMb", val / (1024.0 * 1024.0))}"
178
175
  end
179
176
  end
180
- when 'logs'
181
- case sub_cmd
182
- when 'get'
183
- logs = s3db.logs()
184
- logs.each do |log|
185
- p log
186
- end
187
- when 'delete'
188
- end
189
- #get logs bucket
190
177
  else
191
- puts "Some error occurred command #{command} not valid"
178
+ if options[:initialize]
179
+ s3db.initialize_db
180
+ elsif options[:destroy]
181
+ s3db.destroy_db
182
+ elsif options[:test]
183
+ s3db.test
184
+ else
185
+ puts "Some error occurred command #{command} not valid"
186
+ end
192
187
  end
193
188
 
data/bin/s3rbackup.rb CHANGED
@@ -78,4 +78,4 @@ config.current["bucket_log"] = options[:bucket_log] if options[:bucket_log]
78
78
  config.current["compression"] = options[:compression] if options[:compression]
79
79
  s3db = S3SyncDb.new(config.current)
80
80
  s3db.bak(ARGV, options[:name], options[:descr])
81
- s3db.salva_db
81
+ #s3db.salva_db
data/lib/s3dbsync.rb CHANGED
@@ -2,6 +2,9 @@ require 'rubygems'
2
2
  require 'aws/s3'
3
3
  require 'tempfile'
4
4
  require 'yaml'
5
+ #nuovo aws
6
+ require 'right_aws'
7
+ require 'net/smtp'
5
8
 
6
9
  class S3SyncDb
7
10
  include AWS::S3
@@ -10,94 +13,21 @@ class S3SyncDb
10
13
  @conn = AWS::S3::Base.establish_connection!(
11
14
  :access_key_id => config["access_key_id"],
12
15
  :secret_access_key => config["secret_access_key"])
16
+ @sdb = RightAws::SdbInterface.new(config["access_key_id"], config["secret_access_key"],
17
+ {:multi_thread => false, :logger => Logger.new('/tmp/sdb.log')})
18
+ @s3 = RightAws::S3.new(config["access_key_id"], config["secret_access_key"],
19
+ {:multi_thread => false, :logger => Logger.new('/tmp/s3.log')})
13
20
 
14
21
  @config = config
15
- @db_file = "#{ENV['HOME']}/.s3rbackup/#{config['db_file']}"
16
- @db_file = "#{ENV['HOME']}/.s3rbackup/s3db.yml" if !@db_file
17
- @db_file_ver = "#{@db_file}.ver"
18
- #apro il db
19
- if !File.exists?(@db_file)
20
- #download db
21
- begin
22
- buck_db = Bucket.find(config["bucket_db"])
23
- db_file = S3Object.find('s3rbackup_yaml_db', config["bucket_db"])
24
- rescue
25
- #devo crearlo
26
- if config["sync_db"]
27
- Bucket.create(config["bucket_db"])
28
- end
29
- @db = []
30
- @version = 0
31
- return
32
- end
33
- #lo copio in locale
34
- open(@db_file, 'w') do |file|
35
- S3Object.stream('s3rbackup_yaml_db', config["bucket_db"]) do |chunk|
36
- file.write chunk
37
- end
38
- end
39
- @version = db_file.metadata[:version].to_i
40
- File.open(@db_file_ver, 'w') { |f| f.puts @version.to_s }
41
- elsif config["sync_db"]
42
- begin
43
- buck_db = Bucket.find(config["bucket_db"])
44
- db_file = S3Object.find('s3rbackup_yaml_db', config["bucket_db"])
45
- rescue
46
- #devo crearlo
47
- if config["sync_db"]
48
- Bucket.create(config["bucket_db"])
49
- end
50
- @db = YAML::load(File.open(@db_file))
51
- @version ||= File.read(@db_file_ver).to_i
52
- return
53
- end
54
- #se esiste e devo fare il sync
55
- @version = db_file.metadata[:version].to_i
56
- local_ver = File.read(@db_file_ver)
57
- if @version > local_ver.to_i
58
- #uso il remoto
59
- open(@db_file, 'w') do |file|
60
- db_file.stream do |chunk|
61
- file.write chunk
62
- end
63
- end
64
- File.open(@db_file_ver, 'w') { |f| f.puts @version.to_s }
65
- else
66
- #posso usare quello locale
67
- end
68
- end
69
- #lo carico
70
- @db = YAML::load(File.open(@db_file))
71
- @version ||= File.read(@db_file_ver).to_i
72
- end
73
-
74
- def salva_locale
75
- File.open(@db_file, 'w') { |f| f.puts @db.to_yaml }
22
+ #d'ora in poi uso il db su aws
23
+ @domain_db = config['bucket']
24
+ @bucket = config['bucket']
76
25
  end
77
26
 
78
- def nuova_versione
79
- @version += 1
80
- File.open(@db_file_ver, 'w') { |f| f.puts @version.to_s }
81
- end
82
-
83
- def aggiornaS3
84
- salva_locale()
85
- S3Object.store("s3rbackup_yaml_db", open(@db_file, "r"), @config["bucket_db"])
86
- db_file = S3Object.find('s3rbackup_yaml_db', @config["bucket_db"])
87
- db_file.metadata[:version] = @version.to_s
88
- db_file.store
89
- end
90
-
91
- def salva_db
92
- salva_locale()
93
- nuova_versione()
94
- aggiornaS3() if @config["sync_db"]
95
- end
96
-
97
- def crea_bucket()
98
- #find bucket
99
- @bucket = @config["bucket"]
100
- @bucket_log = @config["bucket_log"] ? @config["bucket_log"] : "#{@bucket}-logs"
27
+ def initialize_db
28
+ puts "Creating #{@domain_db} db..."
29
+ @sdb.create_domain(@domain_db)
30
+ puts "Creating #{@bucket} bucket..."
101
31
  begin
102
32
  bbackup = Bucket.find(@bucket)
103
33
  rescue
@@ -105,21 +35,24 @@ class S3SyncDb
105
35
  raise "Can't create bucket:#{@bucket}"
106
36
  end
107
37
  end
108
- if @config["log"]
109
- begin
110
- blog = Bucket.find(@bucket_log)
111
- rescue
112
- Bucket.create(@bucket_log)
113
- end
114
- Bucket.enable_logging_for(
115
- @bucket, 'target_bucket' => @bucket_log)
116
- else
117
- Bucket.disable_logging_for(@bucket)
118
- end
119
- end
38
+ end
39
+
40
+ def destroy_db
41
+ puts "Deleting bucket #{@bucket}..."
42
+ bucket1 = @s3.bucket(@bucket)
43
+ bucket1.delete(true)
44
+ puts "Deleting db #{@domain_db}..."
45
+ @sdb.delete_domain(@domain_db)
46
+ end
47
+
48
+ def test
49
+ #buk = @s3.buckets
50
+ buk = @s3.buckets.map{|b| b.name}
51
+ puts "Buckets on S3: #{buk.join(', ')}"
52
+ end
120
53
 
54
+ #s3 sdb
121
55
  def bak(dirs, name, descr)
122
- crea_bucket()
123
56
  name = dirs[0] if !name
124
57
  tf = Tempfile.new("s3rbackup")
125
58
  tf_l = Tempfile.new("s3rbackup-listfile")
@@ -147,23 +80,24 @@ class S3SyncDb
147
80
  doc = {}
148
81
  doc["name"] = name
149
82
  doc["bucket"] = @config["bucket"]
150
- doc["datetime"] = Time.now
83
+ doc["datetime"] = "'#{DateTime.now}'"
84
+ #doc["date"] = "#{DateTime.now.strftime("%Y%m%d")}"
151
85
  doc["current_path"] = `pwd`.gsub("\n","").to_s
152
- doc["description"] = descr
86
+ doc["description"] = descr ? descr : "n/a"
153
87
  doc["host"] = `hostname`.gsub("\n","").to_s
154
88
  doc["user"] = `whoami`.gsub("\n","").to_s
155
89
  doc["size"] = File.size(file_path)
156
90
  doc["compression"] = @config["compression"]
157
91
  doc["archive"] = "tar"
158
- doc["files"] = filez.join("")
159
- @db << doc
160
- aws_name = "#{doc["name"]}_#{`date +%Y%m%d_%H.%M.%S`}_#{@db.index(doc)}".gsub("\n","")
92
+ #doc["files"] = filez.join("")
93
+ #@db << doc
94
+ aws_name = "#{doc["name"]}##{`date +%Y%m%d_%H.%M.%S`}".gsub("\n","")
161
95
  doc["aws_name"] = aws_name
162
- #FIXME Controllare che in db venga salvato aws_name
96
+ @sdb.put_attributes @domain_db, aws_name, doc
97
+ #TODO aggiungere md5
163
98
 
164
99
  # Store it!
165
100
  options = {}
166
- #options[:access] = :public_read if @public
167
101
  options["x-amz-meta-host"] = doc["host"]
168
102
  options["x-amz-meta-user"] = doc["user"]
169
103
  options["x-amz-meta-descrizione"] = doc["description"]
@@ -171,12 +105,6 @@ class S3SyncDb
171
105
  options["x-amz-meta-size"] = doc["size"]
172
106
  options["x-amz-meta-compression"] = doc["compression"]
173
107
  options["x-amz-meta-archive"] = doc["archive"]
174
- #options["x-amz-meta-files"] = doc["files"]
175
-
176
-
177
- # options["x-amz-meta-sha1_hash"] = `sha1sum #{file}`.split[0] if @save_hash
178
- # options["x-amz-meta-mtime"] = fstat.mtime.getutc.to_i if @save_time
179
- # options["x-amz-meta-size"] = fstat.size if @save_size
180
108
 
181
109
  store = S3Object.store(aws_name, open(file_path), @config["bucket"], options)
182
110
  obj = S3Object.find(aws_name, @config["bucket"])
@@ -185,108 +113,56 @@ class S3SyncDb
185
113
  doc[key] = val
186
114
  end
187
115
  #TODO aggiungere check
188
- #TODO aggiornare db
116
+ send_mail("S3rbackup - Saved #{doc["name"]}", (doc.to_a.map {|val| "#{val[0]}: #{val[1]}"}).join("\n") + "\n\nFiles:\n\t#{filez.join("\t")}")
189
117
  end
190
118
 
191
119
  def find(words, bucket = nil, cmd_opt = {})
192
120
  option = {}
193
121
  words_search = []
122
+ date = 0
194
123
  words.each do |word|
124
+ date -= 1
195
125
  case word
196
126
  when /.*=.*/
197
127
  #opzione
198
- option["="] ||= {}
199
- option["="][word.split("=")[0]] = word.split("=")[1]
128
+ words_search << word
200
129
  when /.*>.*/
201
130
  #opzione
202
- option[">"] ||= {}
203
- option[">"][word.split(">")[0]] = word.split(">")[1]
131
+ words_search << word
204
132
  when /.*<.*/
205
133
  #opzione
206
- option["<"] ||= {}
207
- option["<"][word.split("<")[0]] = word.split("<")[1]
208
- else
209
134
  words_search << word
210
- end
211
- end
212
- results = []
213
- @db.each do |item|
214
- option.each do |key,opts|
215
- opts.each do |campo,val|
216
- case key
217
- when "="
218
- case item[campo].class.to_s
219
- when "Time"
220
- results << item if item[campo] = Time.parse(val)
221
- when "Fixnum"
222
- results << item if item[campo] = val.to_i
223
- else
224
- results << item if item[campo] =~ /.*#{val}.*/
225
- end
226
- when "<"
227
- case item[campo].class.to_s
228
- when "Time"
229
- results << item if item[campo] < Time.parse(val)
230
- when "Fixnum"
231
- results << item if item[campo] < val.to_i
232
- else
233
- results << item if item[campo] < val
234
- end
235
- when ">"
236
- case item[campo].class.to_s
237
- when "Time"
238
- results << item if item[campo] > Time.parse(val)
239
- when "Fixnum"
240
- results << item if item[campo] > val.to_i
241
- else
242
- results << item if item[campo] > val
243
- end
135
+ else
136
+ if word == "datetime"
137
+ date = 2
244
138
  end
245
- end
246
- end
247
- words_search.each do |word|
248
- if item.values.join(" ") =~ /.*#{word}.*/
249
- results << item
250
- end
251
- end
252
- #results.sort!
253
- and_results = []
254
- if results.nitems > 0
255
- prev = results[0]
256
- results.each do |res|
257
- test = results.select {|t| t == res}
258
- #test = results.select {|t| t["aws_name"] == res["aws_name"]}
259
- if words.nitems == test.nitems
260
- and_results << res
139
+ if date == 0
140
+ #ci siamo uso i doppi apici
141
+ words_search << "'\\'#{word}\\''"
142
+ else
143
+ words_search << "'#{word}'"
261
144
  end
262
- end
263
145
  end
264
- results = and_results
265
146
  end
266
- #caso in cui voglio tutto
267
- if words.nitems == 0
268
- @db.each do |item|
269
- results << item
270
- end
147
+ if words_search.nitems == 1
148
+ #ho solo una parola uso startwith sul nome
149
+ search = "['aws_name' starts-with #{words_search[0]}] union ['description' starts-with #{words_search[0]}]"
150
+ elsif words_search.nitems == 0
151
+ #devo caricare tutto
152
+ search = "['datetime' > '\\'1970\\'']"
153
+ else
154
+ search = "[#{words_search.join(" ")}]"
271
155
  end
272
- results.uniq!
273
- hres = {}
274
- if cmd_opt[:newer] or cmd_opt[:older]
275
- results.each do |item|
276
- results.each do |item2|
277
- if item["name"] == item2["name"]
278
- hres[item["name"]] ||= []
279
- hres[item["name"]] << item
280
- #hres[:name].sort! {|x,y| x["date"] <=> y["date"]}
281
- end
156
+ #p search
157
+ results = []
158
+ @sdb.query(@domain_db, search) do |result|
159
+ result[:items].each do |item|
160
+ hattr = @sdb.get_attributes(@domain_db, item)[:attributes]
161
+ hattr_ok = {}
162
+ hattr.each do |key,val|
163
+ hattr_ok[key] = val[0]
282
164
  end
283
- end
284
- results = []
285
- #p hres
286
- hres.each do |key,val|
287
- val.sort! {|x,y| x["date"] <=> y["date"]}
288
- results << val[val.nitems - 1] if cmd_opt[:newer]
289
- results << val[0] if cmd_opt[:older]
165
+ results << hattr_ok
290
166
  end
291
167
  end
292
168
  results.sort! {|x,y| x["datetime"] <=> y["datetime"]}
@@ -339,12 +215,20 @@ class S3SyncDb
339
215
 
340
216
  def delete(item)
341
217
  S3Object.delete item["aws_name"], item["bucket"]
342
- @db.delete(item)
218
+ @sdb.delete_attributes(@domain_db, item["aws_name"])
343
219
  end
344
220
 
345
- def log()
346
- return Bucket.logs(@config["bucket_log"])
221
+ def send_mail(subj, msg)
222
+ if(@config['mail_to'] and @config['mail_to'] != "")
223
+ msg = [ "Subject: #{subj}\n", "\n", "#{msg}\n" ]
224
+ Net::SMTP.start('localhost') do |smtp|
225
+ mail_to = @config['mail_to'].split(",").map {|t| t.strip}
226
+ ret = smtp.sendmail( msg, @config['mail_from'], mail_to)
227
+ #ret = smtp.sendmail( msg, "nik@nikpad.ath.cx", ['sacchi.nicola@gmail.com'] )
228
+ end
229
+ end
347
230
  end
231
+
348
232
  end
349
233
 
350
234
  class Configure
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: niky81-s3rbackup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.9
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicola Sacchi
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-06-27 00:00:00 -07:00
12
+ date: 2008-09-26 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -21,6 +21,15 @@ dependencies:
21
21
  - !ruby/object:Gem::Version
22
22
  version: 0.0.0
23
23
  version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: right_aws
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">"
30
+ - !ruby/object:Gem::Version
31
+ version: 0.0.0
32
+ version:
24
33
  - !ruby/object:Gem::Dependency
25
34
  name: OptionParser
26
35
  version_requirement: