X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_common%2Fdbmongo.py;h=16da6e7762bef2ff6d9c0ef763af19ee84ceccfe;hb=f71fcff0e66c178f6edcaf7c6f35b15eafe9f3ba;hp=86ec7b79c46590ab31b122f2eaa5e6610a4def4a;hpb=ae049d8467e5ce1b1be8487ed93031b594dc0230;p=osm%2Fcommon.git diff --git a/osm_common/dbmongo.py b/osm_common/dbmongo.py index 86ec7b7..16da6e7 100644 --- a/osm_common/dbmongo.py +++ b/osm_common/dbmongo.py @@ -66,6 +66,22 @@ class DbMongo(DbBase): super().__init__(logger_name, lock) self.client = None self.db = None + self.database_key = None + self.secret_obtained = False + # ^ This is used to know if database serial has been got. Database is inited by NBI, who generates the serial + # In case it is not ready when connected, it should be got later on before any decrypt operation + + def get_secret_key(self): + if self.secret_obtained: + return + + self.secret_key = None + if self.database_key: + self.set_secret_key(self.database_key) + version_data = self.get_one("admin", {"_id": "version"}, fail_on_empty=False, fail_on_more=True) + if version_data and version_data.get("serial"): + self.set_secret_key(b64decode(version_data["serial"])) + self.secret_obtained = True def db_connect(self, config, target_version=None): """ @@ -79,6 +95,7 @@ class DbMongo(DbBase): self.logger = logging.getLogger(config["logger_name"]) master_key = config.get("commonkey") or config.get("masterpassword") if master_key: + self.database_key = master_key self.set_secret_key(master_key) if config.get("uri"): self.client = MongoClient(config["uri"]) @@ -104,6 +121,7 @@ class DbMongo(DbBase): raise DbException("Invalid database version {}. Expected {}".format(db_version, target_version)) # get serial if version_data and version_data.get("serial"): + self.secret_obtained = True self.set_secret_key(b64decode(version_data["serial"])) self.logger.info("Connected to database {} version {}".format(config["name"], db_version)) return @@ -364,18 +382,33 @@ class DbMongo(DbBase): except Exception as e: # TODO refine raise DbException(e) - def set_list(self, table, q_filter, update_dict): + def set_list(self, table, q_filter, update_dict, unset=None, pull=None, push=None): """ Modifies al matching entries at database :param table: collection or table :param q_filter: Filter :param update_dict: Plain dictionary with the content to be updated. It is a dot separated keys and a value + :param unset: Plain dictionary with the content to be removed if exist. It is a dot separated keys, value is + ignored. If not exist, it is ignored + :param pull: Plain dictionary with the content to be removed from an array. It is a dot separated keys and value + if exist in the array is removed. If not exist, it is ignored + :param push: Plain dictionary with the content to be appended to an array. It is a dot separated keys and value + is appended to the end of the array :return: Dict with the number of entries modified """ try: + db_oper = {} + if update_dict: + db_oper["$set"] = update_dict + if unset: + db_oper["$unset"] = unset + if pull: + db_oper["$pull"] = pull + if push: + db_oper["$push"] = push with self.lock: collection = self.db[table] - rows = collection.update_many(self._format_filter(q_filter), {"$set": update_dict}) + rows = collection.update_many(self._format_filter(q_filter), db_oper) return {"modified": rows.modified_count} except Exception as e: # TODO refine raise DbException(e)