D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
opt
/
saltstack
/
salt
/
lib
/
python3.10
/
site-packages
/
salt
/
modules
/
Filename :
introspect.py
back
Copy
""" Functions to perform introspection on a minion, and return data in a format usable by Salt States """ import os def running_service_owners( exclude=("/dev", "/home", "/media", "/proc", "/run", "/sys/", "/tmp", "/var") ): """ Determine which packages own the currently running services. By default, excludes files whose full path starts with ``/dev``, ``/home``, ``/media``, ``/proc``, ``/run``, ``/sys``, ``/tmp`` and ``/var``. This can be overridden by passing in a new list to ``exclude``. CLI Example: .. code-block:: bash salt myminion introspect.running_service_owners """ error = {} if "pkg.owner" not in __salt__: error["Unsupported Package Manager"] = ( "The module for the package manager on this system does not " "support looking up which package(s) owns which file(s)" ) if "file.open_files" not in __salt__: error["Unsupported File Module"] = ( "The file module on this system does not " "support looking up open files on the system" ) if error: return {"Error": error} ret = {} open_files = __salt__["file.open_files"]() execs = __salt__["service.execs"]() for path in open_files: ignore = False for bad_dir in exclude: if path.startswith(bad_dir): ignore = True if ignore: continue if not os.access(path, os.X_OK): continue for service in execs: if path == execs[service]: pkg = __salt__["pkg.owner"](path) ret[service] = next(iter(pkg.values())) return ret def enabled_service_owners(): """ Return which packages own each of the services that are currently enabled. CLI Example: .. code-block:: bash salt myminion introspect.enabled_service_owners """ error = {} if "pkg.owner" not in __salt__: error["Unsupported Package Manager"] = ( "The module for the package manager on this system does not " "support looking up which package(s) owns which file(s)" ) if "service.show" not in __salt__: error["Unsupported Service Manager"] = ( "The module for the service manager on this system does not " "support showing descriptive service data" ) if error: return {"Error": error} ret = {} services = __salt__["service.get_enabled"]() for service in services: data = __salt__["service.show"](service) if "ExecStart" not in data: continue start_cmd = data["ExecStart"]["path"] pkg = __salt__["pkg.owner"](start_cmd) ret[service] = next(iter(pkg.values())) return ret def service_highstate(requires=True): """ Return running and enabled services in a highstate structure. By default also returns package dependencies for those services, which means that package definitions must be created outside this function. To drop the package dependencies, set ``requires`` to False. CLI Example: .. code-block:: bash salt myminion introspect.service_highstate salt myminion introspect.service_highstate requires=False """ ret = {} running = running_service_owners() for service in running: ret[service] = {"service": ["running"]} if requires: ret[service]["service"].append({"require": {"pkg": running[service]}}) enabled = enabled_service_owners() for service in enabled: if service in ret: ret[service]["service"].append({"enabled": True}) else: ret[service] = {"service": [{"enabled": True}]} if requires: exists = False for item in ret[service]["service"]: if isinstance(item, dict) and next(iter(item.keys())) == "require": exists = True if not exists: ret[service]["service"].append({"require": {"pkg": enabled[service]}}) return ret