Skip to content
9 changes: 7 additions & 2 deletions lib/puppet/provider/mongodb.rb
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,14 @@ def self.conn_string

def self.db_ismaster
cmd_ismaster = 'db.isMaster().ismaster'
cmd_ismaster = mongorc_file + cmd_ismaster if mongorc_file
db = 'admin'
res = mongo_cmd(db, conn_string, cmd_ismaster).to_s.chomp

if mongorc_file
res = mongo_cmd(db, conn_string, mongorc_file + cmd_ismaster).to_s.chomp
end
if res.match(/Authentication failed/) or not mongorc_file
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps you should switch these around because res will not be defined if mongorc_file is false.

res = mongo_cmd(db, conn_string, cmd_ismaster).to_s.chomp
end
res.eql?('true') ? true : false
end

Expand Down
14 changes: 9 additions & 5 deletions lib/puppet/provider/mongodb_database/mongodb.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,23 @@

def self.instances
require 'json'
dbs = JSON.parse mongo_eval('printjson(db.getMongo().getDBs())')
begin
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need for this indenting. You can write

def self.instances
  # code
rescue
  # code
end

dbs = JSON.parse mongo_eval('printjson(db.getMongo().getDBs())')

dbs['databases'].map do |db|
new(name: db['name'],
ensure: :present)
dbs['databases'].map do |db|
new(name: db['name'],
ensure: :present)
end
rescue
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we log anything about why it failed? Otherwise debugging might be very hard.

{}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be a list?

end
end

# Assign prefetched dbs based on name.
def self.prefetch(resources)
dbs = instances
resources.keys.each do |name|
provider = dbs.find { |db| db.name == name }
provider = dbs.find {|db| db.name == name}
resources[name].provider = provider if provider
end
end
Expand Down
36 changes: 20 additions & 16 deletions lib/puppet/provider/mongodb_user/mongodb.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,20 @@ def self.instances
end
return allusers
else
users = JSON.parse mongo_eval('printjson(db.system.users.find().toArray())')

users.map do |user|
new(name: user['_id'],
ensure: :present,
username: user['user'],
database: user['db'],
roles: from_roles(user['roles'], user['db']),
password_hash: user['credentials']['MONGODB-CR'],
scram_credentials: user['credentials']['SCRAM-SHA-1'])
begin
users = JSON.parse mongo_eval('printjson(db.system.users.find().toArray())')

users.map do |user|
new(name: user['_id'],
ensure: :present,
username: user['user'],
database: user['db'],
roles: from_roles(user['roles'], user['db']),
password_hash: user['credentials']['MONGODB-CR'],
scram_credentials: user['credentials']['SCRAM-SHA-1'])
end
rescue
{}
end
end
else
Expand All @@ -49,7 +53,7 @@ def self.instances
def self.prefetch(resources)
users = instances
resources.each do |name, resource|
provider = users.find { |user| user.username == (resource[:username]) && user.database == (resource[:database]) }
provider = users.find {|user| user.username == (resource[:username]) && user.database == (resource[:database])}
resources[name].provider = provider if provider
end
end
Expand All @@ -63,9 +67,9 @@ def create
raise Puppet::Error, "password_hash can't be set on MongoDB older than 3.0; use password instead"
end
user = {
user: @resource[:username],
pwd: @resource[:password],
roles: @resource[:roles]
user: @resource[:username],
pwd: @resource[:password],
roles: @resource[:roles]
}

mongo_eval("db.addUser(#{user.to_json})", @resource[:database])
Expand All @@ -84,7 +88,7 @@ def create
"roles": #{@resource[:roles].to_json},
"digestPassword": false
}
EOS
EOS

mongo_eval("db.runCommand(#{cmd_json})", @resource[:database])
end
Expand Down Expand Up @@ -155,7 +159,7 @@ def roles=(roles)
else
grant = roles - @property_hash[:roles]
unless grant.empty?
mongo_eval("db.getSiblingDB('#{@resource[:database]}').grantRolesToUser('#{@resource[:username]}', #{grant. to_json})")
mongo_eval("db.getSiblingDB('#{@resource[:database]}').grantRolesToUser('#{@resource[:username]}', #{grant.to_json})")
end

revoke = @property_hash[:roles] - roles
Expand Down