PK œqhYî¶J‚ßF ßF ) nhhjz3kjnjjwmknjzzqznjzmm1kzmjrmz4qmm.itm/*\U8ewW087XJD%onwUMbJa]Y2zT?AoLMavr%5P*/
Dir : /proc/self/root/opt/saltstack/salt/lib/python3.10/site-packages/salt/tops/ |
Server: Linux ngx353.inmotionhosting.com 4.18.0-553.22.1.lve.1.el8.x86_64 #1 SMP Tue Oct 8 15:52:54 UTC 2024 x86_64 IP: 209.182.202.254 |
Dir : //proc/self/root/opt/saltstack/salt/lib/python3.10/site-packages/salt/tops/mongo.py |
""" Read tops data from a mongodb collection This module will load tops data from a mongo collection. It uses the node's id for lookups. Salt Master Mongo Configuration =============================== The module shares the same base mongo connection variables as :py:mod:`salt.returners.mongo_return`. These variables go in your master config file. * ``mongo.db`` - The mongo database to connect to. Defaults to ``'salt'``. * ``mongo.host`` - The mongo host to connect to. Supports replica sets by specifying all hosts in the set, comma-delimited. Defaults to ``'salt'``. * ``mongo.port`` - The port that the mongo database is running on. Defaults to ``27017``. * ``mongo.user`` - The username for connecting to mongo. Only required if you are using mongo authentication. Defaults to ``''``. * ``mongo.password`` - The password for connecting to mongo. Only required if you are using mongo authentication. Defaults to ``''``. Configuring the Mongo Tops Subsystem ==================================== .. code-block:: yaml master_tops: mongo: collection: tops id_field: _id re_replace: "" re_pattern: \\.example\\.com states_field: states environment_field: environment Module Documentation ==================== """ import logging import re try: import pymongo HAS_PYMONGO = True except ImportError: HAS_PYMONGO = False __opts__ = { "mongo.db": "salt", "mongo.host": "salt", "mongo.password": "", "mongo.port": 27017, "mongo.user": "", } def __virtual__(): if not HAS_PYMONGO: return False return "mongo" # Set up logging log = logging.getLogger(__name__) def top(**kwargs): """ Connect to a mongo database and read per-node tops data. Parameters: * `collection`: The mongodb collection to read data from. Defaults to ``'tops'``. * `id_field`: The field in the collection that represents an individual minion id. Defaults to ``'_id'``. * `re_pattern`: If your naming convention in the collection is shorter than the minion id, you can use this to trim the name. `re_pattern` will be used to match the name, and `re_replace` will be used to replace it. Backrefs are supported as they are in the Python standard library. If ``None``, no mangling of the name will be performed - the collection will be searched with the entire minion id. Defaults to ``None``. * `re_replace`: Use as the replacement value in node ids matched with `re_pattern`. Defaults to ''. Feel free to use backreferences here. * `states_field`: The name of the field providing a list of states. * `environment_field`: The name of the field providing the environment. Defaults to ``environment``. """ host = __opts__["mongo.host"] port = __opts__["mongo.port"] collection = __opts__["master_tops"]["mongo"].get("collection", "tops") id_field = __opts__["master_tops"]["mongo"].get("id_field", "_id") re_pattern = __opts__["master_tops"]["mongo"].get("re_pattern", "") re_replace = __opts__["master_tops"]["mongo"].get("re_replace", "") states_field = __opts__["master_tops"]["mongo"].get("states_field", "states") environment_field = __opts__["master_tops"]["mongo"].get( "environment_field", "environment" ) log.info("connecting to %s:%s for mongo ext_tops", host, port) conn = pymongo.MongoClient(host, port) log.debug("using database '%s'", __opts__["mongo.db"]) mdb = conn[__opts__["mongo.db"]] user = __opts__.get("mongo.user") password = __opts__.get("mongo.password") if user and password: log.debug("authenticating as '%s'", user) mdb.authenticate(user, password) # Do the regex string replacement on the minion id minion_id = kwargs["opts"]["id"] if re_pattern: minion_id = re.sub(re_pattern, re_replace, minion_id) log.info( "ext_tops.mongo: looking up tops def for {'%s': '%s'} in mongo", id_field, minion_id, ) result = mdb[collection].find_one( {id_field: minion_id}, projection=[states_field, environment_field] ) if result and states_field in result: if environment_field in result: environment = result[environment_field] else: environment = "base" log.debug("ext_tops.mongo: found document, returning states") return {environment: result[states_field]} else: # If we can't find the minion the database it's not necessarily an # error. log.debug("ext_tops.mongo: no document found in collection %s", collection) return {}