mongo-db-utils 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,17 +1,21 @@
1
1
  # MongoDbUtils
2
2
 
3
+ ## Warning - not safe for production use - undergoing development!
4
+
3
5
  A little gem that simplifies backing up and copying your mongo dbs.
4
6
 
7
+ ![Sample](https://github.com/edeustace/mongo-db-utils/raw/master/images/sample.png)
8
+
5
9
  It saves your database urls so any task is just a few clicks.
6
10
 
7
11
  * backup a database
8
- * copy a database from one server to another (whilst backing up the target db if it exits)
12
+ * copy a database from one server to another (whilst backing up the target db if it exists)
9
13
 
10
14
 
11
15
 
12
16
  ## Installation
13
17
 
14
- You need to have mongodump on your path.
18
+ You need to have *mongodump* and *mongorestore* on your path.
15
19
 
16
20
  gem install 'mongo-db-utils'
17
21
 
@@ -33,10 +37,3 @@ When it does backups it stores them in ````~/.mongo-db-utils/backups/````. The n
33
37
  rake build
34
38
  gem install pkg/mongo-db-utils.gem
35
39
 
36
- ## Contributing
37
-
38
- 1. Fork it
39
- 2. Create your feature branch (`git checkout -b my-new-feature`)
40
- 3. Commit your changes (`git commit -am 'Added some feature'`)
41
- 4. Push to the branch (`git push origin my-new-feature`)
42
- 5. Create new Pull Request
data/images/sample.png ADDED
Binary file
@@ -35,6 +35,28 @@ module MongoDbUtils
35
35
  `#{cmd}`
36
36
 
37
37
  end
38
+
39
+
40
+ def self.restore(host,port,db,source_folder,username = "", password = "")
41
+
42
+ options = []
43
+ options << Option.new("-h", "#{host}:#{port}")
44
+ options << Option.new("-db", db)
45
+ options << Option.new("-u", username)
46
+ options << Option.new("-p", password)
47
+
48
+ cmd = "mongorestore "
49
+
50
+ options.each do |o|
51
+ cmd << "#{o.key} #{o.value} " unless o.empty?
52
+ end
53
+ cmd << "#{source_folder}"
54
+ puts "cmd:"
55
+ puts cmd
56
+ `#{cmd}`
57
+
58
+ end
59
+
38
60
  end
39
61
  end
40
62
  end
@@ -5,58 +5,114 @@ require 'mongo/connection'
5
5
  module MongoDbUtils
6
6
  class Cmd
7
7
 
8
- def self.backup(db, path)
9
-
8
+ def self.backup(db, folder, final_path = nil, tar_it = true)
9
+ puts "--"
10
+ puts ">> Backing up: #{db}, #{folder}, #{final_path}"
10
11
  unless( db_exists?(db) )
11
12
  return false
12
13
  end
13
14
 
14
15
  t = Time.new
15
16
  timestamp = t.strftime("%Y.%m.%d__%H.%M")
16
- out_path = "#{path}/#{db.host}_#{db.port}/#{db.name}/#{timestamp}"
17
+
18
+ if( final_path.nil? )
19
+ out_path = "#{folder}/#{db.host}_#{db.port}/#{db.name}/#{timestamp}"
20
+ else
21
+ puts "final path not nil out_path: #{out_path}"
22
+ end
23
+
17
24
  full_path = File.expand_path(out_path)
18
25
 
26
+ puts ">> final backup path: #{full_path}"
27
+
19
28
  FileUtils.mkdir_p(full_path)
20
- MongoDbUtils::Commands::MongoTools.dump(db.host,db.port,db.name,full_path,db.username,db.password)
29
+ MongoDbUtils::Commands::MongoTools.dump(
30
+ db.host,
31
+ db.port,
32
+ db.name,
33
+ full_path,
34
+ db.username,
35
+ db.password)
36
+
37
+ if( tar_it )
38
+ Dir.chdir(full_path)
39
+ `tar cvf #{db.name}.tar #{db.name}`
40
+ `rm -fr #{full_path}/#{db.name}`
41
+ end
21
42
 
22
- `tar cvf #{full_path}/#{db.name}.tar.gz #{full_path}/#{db.name}`
23
- `rm -fr #{full_path}/#{db.name}`
24
43
  true
25
44
  end
26
45
 
46
+ # With remote dbs you can't do a copy_database if you're not an admin.
47
+ # so using restore instead
48
+ # connection = Mongo::Connection.from_uri(destination.to_s)
49
+ # mongo_db = connection[destination.name]
50
+ # if( destination.authentication_required? )
51
+ # login_result = mongo_db.authenticate(destination.username, destination.password)
52
+ # end
53
+ # host = "#{source.host}:#{source.port}"
54
+ # connection.copy_database(source.name, destination.name, host, source.username, source.password)
55
+ #
56
+ #
27
57
  def self.copy(path, source, destination, halt_on_no_backup = true)
28
58
 
29
59
  backup_made = self.backup(destination, path)
30
60
 
31
-
32
61
  if( !backup_made && halt_on_no_backup)
33
62
  puts "aborting - no backup was made"
34
63
  return
35
64
  end
36
65
 
37
- remove_db(destination)
38
- puts "copying... please wait..."
39
- connection = Mongo::Connection.from_uri(destination.to_s)
40
- source_server = "#{source.host}:#{source.port}"
41
- connection.copy_database(source.name,destination.name,source_server,source.username, source.password)
42
- connection.close
66
+ tmp_path = "~/.mongo-db-utils/tmp"
67
+
68
+ FileUtils.mkdir_p(tmp_path)
69
+
70
+ puts "backup to: #{tmp_path}/#{source.name}"
71
+ backup(source,tmp_path, source.name, false)
72
+
73
+ MongoDbUtils::Commands::MongoTools.restore(
74
+ destination.host,
75
+ destination.port,
76
+ destination.name,
77
+ "#{tmp_path}/#{source.name}/#{source.name}",
78
+ destination.username,
79
+ destination.password)
80
+
81
+ `rm -fr #{tmp_path}`
43
82
  end
44
83
 
45
84
 
46
85
  private
47
86
  def self.db_exists?(db)
87
+
88
+ puts "DB exists? #{db.to_s}"
89
+
48
90
  connection = Mongo::Connection.from_uri(db.to_s)
49
- contains_db = connection.database_names.include?(db.name)
91
+ mongo_db = connection[db.name]
92
+
93
+ exists = !mongo_db.nil?
94
+
95
+ puts "mongo_db: #{mongo_db}"
96
+ if( db.authentication_required? && exists )
97
+ login_result = mongo_db.authenticate(db.username, db.password)
98
+ exists = !login_result.nil?
99
+ else
100
+ end
50
101
  connection.close
51
- contains_db
102
+ exists
52
103
  end
53
104
 
54
105
  def self.remove_db(db)
55
- connection = Mongo::Connection.from_uri(db.to_s)
56
- if( connection.database_names.include?(db.name))
106
+ if( db_exists?(db))
107
+ connection = Mongo::Connection.from_uri(db.to_s)
108
+ if( db.authentication_required? )
109
+ mongo_db = connection[db.name]
110
+ mongo_db.authenticate(db.username, db.password)
111
+ end
112
+
57
113
  connection.drop_database(db.name)
114
+ connection.close
58
115
  end
59
- connection.close
60
116
  end
61
117
  end
62
118
  end
@@ -10,6 +10,7 @@ module MongoDbUtils
10
10
  Mongo Db Utils - Version: #{MongoDbUtils::VERSION}
11
11
  ===================================
12
12
  eos
13
+
13
14
 
14
15
  def initialize(config, cmd)
15
16
  @config = config
@@ -18,6 +19,7 @@ eos
18
19
 
19
20
  def run
20
21
  say(HEADER)
22
+ say(MongoDbUtils::READY_FOR_USE)
21
23
  main_menu
22
24
  end
23
25
 
@@ -77,7 +79,8 @@ eos
77
79
  def add_config
78
80
  entry = Hash.new
79
81
  entry[:mongo_uri] = ask("Mongo uri (eg: 'mongodb://user:pass@locahost:27017/db')")
80
- successful = @config.add_db_from_uri(entry[:mongo_uri])
82
+ new_uri = entry[:mongo_uri].gsub(" ", "")
83
+ successful = @config.add_db_from_uri(new_uri)
81
84
 
82
85
  if successful
83
86
  say("added server")
@@ -99,7 +102,7 @@ eos
99
102
  choose do |menu|
100
103
  prep_menu(menu)
101
104
  @config.dbs.each do |db|
102
- menu.choice "#{db.to_s_simple}" do backup(db) end
105
+ menu.choice "#{db.to_s}" do backup(db) end
103
106
  end
104
107
  menu.choice "back" do main_menu end
105
108
  end
@@ -114,7 +117,7 @@ eos
114
117
  choose do |menu|
115
118
  prep_menu(menu)
116
119
  @config.dbs.sort.each do |db|
117
- menu.choice "#{db.to_s_simple}" do
120
+ menu.choice "#{db.to_s}" do
118
121
  copy_plan[:source] = db
119
122
  end
120
123
 
@@ -130,7 +133,7 @@ eos
130
133
  choose do |menu|
131
134
  prep_menu(menu)
132
135
  @config.dbs.sort.each do |db|
133
- menu.choice "#{db.to_s_simple}" do
136
+ menu.choice "#{db.to_s}" do
134
137
  copy_plan[:destination] = db
135
138
  end unless db == copy_plan[:source]
136
139
  end
@@ -141,7 +144,7 @@ eos
141
144
 
142
145
  def show_copy_plan(plan)
143
146
  say("Copy: (we'll backup the destination before we copy)")
144
- say("#{plan[:source].to_s_simple} --> #{plan[:destination].to_s_simple}")
147
+ say("#{plan[:source].to_s} --> #{plan[:destination].to_s}")
145
148
 
146
149
  choose do |menu|
147
150
  prep_menu(menu)
@@ -73,6 +73,14 @@ module MongoDbUtils
73
73
  Db.new(name,host,port,user,pwd)
74
74
  end
75
75
 
76
+ def authentication_required?
77
+ has?(self.username) && has?(self.password)
78
+ end
79
+
80
+ def has?(s)
81
+ !s.nil? && !s.empty?
82
+ end
83
+
76
84
 
77
85
  def to_s
78
86
  user_pass = ""
@@ -1,3 +1,4 @@
1
1
  module MongoDbUtils
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
+ READY_FOR_USE = "(Alpha version - not for production use!!)"
3
4
  end
@@ -13,6 +13,8 @@ describe MongoDbUtils::Model do
13
13
  db.name.should eql("ed-backup")
14
14
  db.username.should eql("")
15
15
 
16
+ db.authentication_required?.should eql(false)
17
+
16
18
  end
17
19
 
18
20
  it "should parse mongo uris" do
@@ -25,6 +27,7 @@ describe MongoDbUtils::Model do
25
27
  db.name.should eql("ed-backup")
26
28
  db.username.should eql("ed")
27
29
  db.password.should eql("password")
30
+ db.authentication_required?.should eql(true)
28
31
 
29
32
  end
30
33
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo-db-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-22 00:00:00.000000000 Z
12
+ date: 2012-07-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -156,6 +156,7 @@ files:
156
156
  - bin/mongo-db-utils
157
157
  - features/mongo-db-utils.feature
158
158
  - features/support/setup.rb
159
+ - images/sample.png
159
160
  - install_rdebug.sh
160
161
  - lib/mongo-db-utils/cli.rb
161
162
  - lib/mongo-db-utils/cmd.rb