Module: Cloner::MongoDB

Extended by:
ActiveSupport::Concern
Included in:
Internal
Defined in:
lib/cloner/mongodb.rb

Instance Method Summary collapse

Instance Method Details

#clone_mongodbObject



98
99
100
101
102
# File 'lib/cloner/mongodb.rb', line 98

def clone_mongodb
  mongodb_dump_remote()
  mongodb_dump_copy()
  mongodb_dump_restore()
end

#mongodb_confObject



4
5
6
7
8
9
10
11
12
13
# File 'lib/cloner/mongodb.rb', line 4

def mongodb_conf
  @conf ||= begin
    yml = YAML.load_file(Rails.root.join('config', 'mongoid.yml'))[Rails.env]
    if yml.key?('sessions')
      yml['sessions']['default']
    else
      yml['clients']['default']
    end
  end
end

#mongodb_dump_copyObject



93
94
95
96
# File 'lib/cloner/mongodb.rb', line 93

def mongodb_dump_copy
  FileUtils.mkdir_p(mongodb_path)
  rsync("#{remote_dump_path}/#{mongodb_r_conf['database']}", mongodb_path)
end

#mongodb_dump_extraObject



53
54
55
# File 'lib/cloner/mongodb.rb', line 53

def mongodb_dump_extra
  ""
end

#mongodb_dump_remoteObject



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/cloner/mongodb.rb', line 57

def mongodb_dump_remote
  puts "backup remote DB via ssh"
  do_ssh do |ssh|
    ssh.exec!("rm -R #{remote_dump_path}")
    ret = ssh_exec!(ssh, "mkdir -p #{remote_dump_path}")
    check_ssh_err(ret)
    if mongodb_r_conf['options'].present? && mongodb_r_conf['options']['password'].present?
      username, password = mongodb_r_conf['options']['user'], mongodb_r_conf['options']['password']
    else
      username, password = mongodb_r_conf['username'], mongodb_r_conf['password']
    end
    dump = "mongodump -u #{e username} -p #{e password} -d #{e mongodb_r_conf['database']} --authenticationDatabase #{e mongodb_r_conf['database']} -o #{e remote_dump_path} #{mongodb_dump_extra}"
    puts dump if verbose?
    ret = ssh_exec!(ssh, dump)
    check_ssh_err(ret)
  end
end

#mongodb_dump_restoreObject



75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/cloner/mongodb.rb', line 75

def mongodb_dump_restore
  puts "restoring DB"
  restore = "mongorestore --drop -d #{e mongodb_to} #{mongodb_local_auth} #{e mongodb_path}"
  puts restore if verbose?
  pipe = IO.popen(restore)
  while (line = pipe.gets)
    print line if verbose?
  end
  ret = $?.to_i
  if ret != 0 
    puts "Error: local command exited with #{ret}"
  end
end

#mongodb_local_authObject



43
44
45
46
47
48
49
50
51
# File 'lib/cloner/mongodb.rb', line 43

def mongodb_local_auth
  if mongodb_conf['options'].present? && mongodb_conf['options']['password'].present?
    "-u #{e mongodb_conf['options']['user']} -p #{e mongodb_conf['options']['password']}"
  elsif mongodb_conf['password'].present?
    "-u #{e mongodb_conf['username']} -p #{e mongodb_conf['password']}"
  else
    ""
  end
end

#mongodb_pathObject



89
90
91
# File 'lib/cloner/mongodb.rb', line 89

def mongodb_path
  Rails.root.join("tmp", "dump", mongodb_to).to_s
end

#mongodb_r_confObject



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/cloner/mongodb.rb', line 19

def mongodb_r_conf
  @r_conf ||= begin
    do_ssh do |ssh|
      ret = ssh_exec!(ssh, "cat #{e(remote_app_path + '/config/mongoid.yml')}")
      check_ssh_err(ret)

      begin
        yml = YAML.load(ret[0])[env_from]
        raise 'no data' if yml.blank?
      rescue Exception => e
        puts "unable to read remote database.yml for env #{env_from}."
        puts "Remote file contents:"
        puts ret[0]
      end

      if yml.key?('sessions')
        yml['sessions']['default']
      else
        yml['clients']['default']
      end
    end
  end
end

#mongodb_toObject



15
16
17
# File 'lib/cloner/mongodb.rb', line 15

def mongodb_to
  mongodb_conf['database']
end