def get_mongoctl_database(): # if not using db then return if not has_db_repository(): return global __mongoctl_db__ if __mongoctl_db__ is not None: return __mongoctl_db__ log_verbose("Connecting to mongoctl db...") try: (conn, dbname) = _db_repo_connect() __mongoctl_db__ = conn[dbname] return __mongoctl_db__ except Exception, e: log_exception(e) __mongoctl_db__ = "OFFLINE" log_warning("\n*************\n" "Will not be using database repository for configurations" " at this time!" "\nREASON: Could not establish a database" " connection to mongoctl's database repository." "\nCAUSE: %s." "\n*************" % e)
def setup_server_admin_users(server): admin_users = server.get_admin_users() if server.is_auth(): admin_users = prepend_global_admin_user(admin_users, server) if admin_users is None or len(admin_users) < 1: log_verbose("No users configured for admin DB...") return 0 root_user_added = setup_root_admin_user(server, admin_users) if not root_user_added: log_verbose("Not seeding users for database 'admin'") return 0 log_verbose("Checking setup for other admin users...") count_new_users = 1 try: admin_db = server.get_db("admin") count_new_users += setup_db_users(server, admin_db, admin_users[1:]) return count_new_users except Exception, e: log_exception(e) raise MongoctlException( "Error while setting up admin users on server '%s'." "\n Cause: %s" % (server.id, e))
def get_mongoctl_database(): # if not using db then return if not has_db_repository(): return global __mongoctl_db__ if __mongoctl_db__ is not None: return __mongoctl_db__ log_verbose("Connecting to mongoctl db...") try: client = _db_repo_connect() # issue a call to server to ensure it connects client.get_database("admin").command({"ping": 1}) __mongoctl_db__ = client.get_default_database() return __mongoctl_db__ except Exception, e: log_exception(e) __mongoctl_db__ = "OFFLINE" log_warning("\n*************\n" "Will not be using database repository for configurations" " at this time!" "\nREASON: Could not establish a database" " connection to mongoctl's database repository." "\nCAUSE: %s." "\n*************" % e)
def main(args): try: do_main(args) except MongoctlException,e: log_error("mongoctl error: %s" % e) log_exception(e) exit(1)
def main(args): try: do_main(args) except MongoctlException, e: log_error(e) log_exception(e) exit(1)
def execute(args): """ The real entry for processing requests. """ try: return str(__do_execute(args)) except MongoctlException, e: log_error(e) log_exception(e)
def set_commandline_servers_and_clusters(servers_json_str, clusters_json_str): global __commandline_servers__, __commandline_clusters__ try: if servers_json_str: __commandline_servers__ = json_util.loads(servers_json_str) if clusters_json_str: __commandline_clusters__ = json_util.loads(clusters_json_str) except Exception, ex: log_exception(ex) raise MongoctlException("--servers/--clusters must be a valid json string: %s" % ex)
def setup_server_local_users(server): seed_local_users = False try: local_db = server.get_db("local", retry=False) if not local_db['system.users'].find_one(): seed_local_users = True except Exception, e: log_exception(e) pass
def should_seed_db_users(server, dbname): log_verbose("See if we should seed users for database '%s'" % dbname) try: connection = server.get_db_connection() if connection[dbname]['system.users'].find_one(): return False else: return True except Exception, e: log_exception(e) return False
def should_seed_users(server): log_verbose("See if we should seed users for server '%s'" % server.id) try: connection = server.get_db_connection() dbnames = connection.database_names() for dbname in dbnames: if connection[dbname]['system.users'].find_one(): return False return True except Exception, e: log_exception(e) return False
def execute(args): """ The real entry for processing requests. """ ret_str = "Error" try: ret_str = __do_execute(args) if isinstance(ret_str, basestring) is False: ret_str = str(ret_str) except MongoctlException, e: log_error(e) log_exception(e)
def should_seed_db_users(server, dbname): log_verbose("See if we should seed users for database '%s'" % dbname) try: connection = server.get_db_connection() if connection[dbname]['system.users'].find_one(): return False else: return True except Exception, e: log_exception(e) if is_auth_error(e) and dbname == "admin" and server.try_on_auth_failures(): return True return False
def setup_server_db_users(server, dbname, db_users): log_verbose("Checking if there are any users that needs to be added for " "database '%s'..." % dbname) if not should_seed_db_users(server, dbname): log_verbose("Not seeding users for database '%s'" % dbname) return 0 db = server.get_db(dbname) try: any_new_user_added = setup_db_users(server, db, db_users) if not any_new_user_added: log_verbose("No new users added for database '%s'" % dbname) return any_new_user_added except Exception, e: log_exception(e) raise MongoctlException( "Error while setting up users for '%s'" " database on server '%s'." "\n Cause: %s" % (dbname, server.id, e) )
def setup_server_db_users(server, dbname, db_users): log_verbose("Checking if there are any users that needs to be added for " "database '%s'..." % dbname) if not should_seed_db_users(server, dbname): log_verbose("Not seeding users for database '%s'" % dbname) return 0 db = server.get_db(dbname) try: any_new_user_added = setup_db_users(server, db, db_users) if not any_new_user_added: log_verbose("No new users added for database '%s'" % dbname) return any_new_user_added except Exception, e: log_exception(e) raise MongoctlException( "Error while setting up users for '%s'" \ " database on server '%s'." "\n Cause: %s" % (dbname, server.id, e))
def setup_server_admin_users(server): if not should_seed_db_users(server, "admin"): log_verbose("Not seeding users for database 'admin'") return 0 admin_users = server.get_admin_users() if server.is_auth(): admin_users = prepend_global_admin_user(admin_users, server) if (admin_users is None or len(admin_users) < 1): log_verbose("No users configured for admin DB...") return 0 log_verbose("Checking setup for admin users...") count_new_users = 0 try: admin_db = server.get_db("admin") # potentially create the 1st admin user count_new_users += setup_db_users(server, admin_db, admin_users[0:1]) # the 1st-time init case: # BEFORE adding 1st admin user, auth. is not possible -- # only localhost cxn gets a magic pass. # AFTER adding 1st admin user, authentication is required; # so, to be sure we now have authenticated cxn, re-pull admin db: admin_db = server.get_db("admin") # create the rest of the users count_new_users += setup_db_users(server, admin_db, admin_users[1:]) return count_new_users except Exception, e: log_exception(e) raise MongoctlException( "Error while setting up admin users on server '%s'." "\n Cause: %s" % (server.id, e))
CONF_ROOT_ENV_VAR = "MONGOCTL_CONF" SERVER_ID_PARAM = "server" ############################################################################### # MAIN ############################################################################### def main(args): try: do_main(args) except MongoctlException, e: log_error(e) log_exception(e) exit(1) except Exception, e: log_exception(e) raise ############################################################################### def do_main(args): init_mongoctl_signal_handler() header = """ ------------------------------------------------------------------------------------------- __ _ ___ ___ ___ ____ ____/ /_/ / / ' \/ _ \/ _ \/ _ `/ _ \/ __/ __/ / /_/_/_/\___/_//_/\_, /\___/\__/\__/_/ /___/ ------------------------------------------------------------------------------------------- """
kwargs = {} if server.is_config_server(): # majority is the only valid write concern when writing to config server replica sets kwargs["writeConcern"] = {"w": "majority"} # TODO this method is deprecated and will be removed in 4.0. So we should change this when we upgrade to 4.0 db.add_user(username, password, read_only, **kwargs) except OperationFailure, ofe: # This is a workaround for PYTHON-407. i.e. catching a harmless # error that is raised after adding the first if "login" in str(ofe): pass else: raise except AutoReconnect, ar: log_exception(ar) if num_tries < 3: log_warning("_mongo_add_user: Caught a AutoReconnect error. %s " % ar) # check if the user/pass was saved successfully if db.authenticate(username, password): log_info("_mongo_add_user: user was added successfully. " "no need to retry") else: log_warning("_mongo_add_user: re-trying ...") _mongo_add_user(server, db, username, password, read_only=read_only, num_tries=num_tries + 1)
CONF_ROOT_ENV_VAR = "MONGOCTL_CONF" SERVER_ID_PARAM = "server" ############################################################################### # MAIN ############################################################################### def main(args): try: do_main(args) except MongoctlException,e: log_error("mongoctl error: %s" % e) log_exception(e) exit(1) except Exception, e: log_exception(e) raise ############################################################################### def do_main(args): init_mongoctl_signal_handler() header = """ ------------------------------------------------------------------------------------------- __ _ ___ ___ ___ ____ ____/ /_/ / / ' \/ _ \/ _ \/ _ `/ _ \/ __/ __/ / /_/_/_/\___/_//_/\_, /\___/\__/\__/_/ /___/ ------------------------------------------------------------------------------------------- """
kwargs = {} if server.is_config_server(): # majority is the only valid write concern when writing to config server replica sets kwargs["writeConcern"] = {"w": "majority"} # TODO this method is deprecated and will be removed in 4.0. So we should change this when we upgrade to 4.0 db.add_user(username, password, read_only, **kwargs) except OperationFailure, ofe: # This is a workaround for PYTHON-407. i.e. catching a harmless # error that is raised after adding the first if "login" in str(ofe): pass else: raise except AutoReconnect, ar: log_exception(ar) if num_tries < 3: log_warning("_mongo_add_user: Caught a AutoReconnect error. %s " % ar) # check if the user/pass was saved successfully if db.authenticate(username, password): log_info("_mongo_add_user: user was added successfully. " "no need to retry") else: log_warning("_mongo_add_user: re-trying ...") _mongo_add_user(server, db, username, password, read_only=read_only, num_tries=num_tries+1) else: raise