File: //opt/saltstack/salt/lib/python3.10/site-packages/salt/modules/sysmod.py
"""
The sys module provides information about the available functions on the minion
"""
import fnmatch
import logging
import salt.loader
import salt.runner
import salt.state
import salt.utils.args
import salt.utils.doc
import salt.utils.schema
log = logging.getLogger(__name__)
# Define the module's virtual name
__virtualname__ = "sys"
__proxyenabled__ = ["*"]
def __virtual__():
"""
Return as sys
"""
return __virtualname__
def doc(*args):
"""
Return the docstrings for all modules. Optionally, specify a module or a
function to narrow the selection.
The strings are aggregated into a single document on the master for easy
reading.
Multiple modules/functions can be specified.
CLI Example:
.. code-block:: bash
salt '*' sys.doc
salt '*' sys.doc sys
salt '*' sys.doc sys.doc
salt '*' sys.doc network.traceroute user.info
Modules can be specified as globs.
.. versionadded:: 2015.5.0
.. code-block:: bash
salt '*' sys.doc 'sys.*'
salt '*' sys.doc 'sys.list_*'
"""
docs = {}
if not args:
for fun in __salt__:
docs[fun] = __salt__[fun].__doc__
return salt.utils.doc.strip_rst(docs)
for module in args:
_use_fnmatch = False
if "*" in module:
target_mod = module
_use_fnmatch = True
elif module:
# allow both "sys" and "sys." to match sys, without also matching
# sysctl
target_mod = module + "." if not module.endswith(".") else module
else:
target_mod = ""
if _use_fnmatch:
for fun in fnmatch.filter(__salt__, target_mod):
docs[fun] = __salt__[fun].__doc__
else:
for fun in __salt__:
if fun == module or fun.startswith(target_mod):
docs[fun] = __salt__[fun].__doc__
return salt.utils.doc.strip_rst(docs)
def state_doc(*args):
"""
Return the docstrings for all states. Optionally, specify a state or a
function to narrow the selection.
The strings are aggregated into a single document on the master for easy
reading.
Multiple states/functions can be specified.
.. versionadded:: 2014.7.0
CLI Example:
.. code-block:: bash
salt '*' sys.state_doc
salt '*' sys.state_doc service
salt '*' sys.state_doc service.running
salt '*' sys.state_doc service.running ipables.append
State names can be specified as globs.
.. versionadded:: 2015.5.0
.. code-block:: bash
salt '*' sys.state_doc 'service.*' 'iptables.*'
"""
st_ = salt.state.State(__opts__)
docs = {}
if not args:
for fun in st_.states:
state = fun.split(".")[0]
if state not in docs:
if hasattr(st_.states[fun], "__globals__"):
docs[state] = st_.states[fun].__globals__["__doc__"]
docs[fun] = st_.states[fun].__doc__
return salt.utils.doc.strip_rst(docs)
for module in args:
_use_fnmatch = False
if "*" in module:
target_mod = module
_use_fnmatch = True
elif module:
# allow both "sys" and "sys." to match sys, without also matching
# sysctl
target_mod = module + "." if not module.endswith(".") else module
else:
target_mod = ""
if _use_fnmatch:
for fun in fnmatch.filter(st_.states, target_mod):
state = fun.split(".")[0]
if hasattr(st_.states[fun], "__globals__"):
docs[state] = st_.states[fun].__globals__["__doc__"]
docs[fun] = st_.states[fun].__doc__
else:
for fun in st_.states:
if fun == module or fun.startswith(target_mod):
state = module.split(".")[0]
if state not in docs:
if hasattr(st_.states[fun], "__globals__"):
docs[state] = st_.states[fun].__globals__["__doc__"]
docs[fun] = st_.states[fun].__doc__
return salt.utils.doc.strip_rst(docs)
def runner_doc(*args):
"""
Return the docstrings for all runners. Optionally, specify a runner or a
function to narrow the selection.
The strings are aggregated into a single document on the master for easy
reading.
Multiple runners/functions can be specified.
.. versionadded:: 2014.7.0
CLI Example:
.. code-block:: bash
salt '*' sys.runner_doc
salt '*' sys.runner_doc cache
salt '*' sys.runner_doc cache.grains
salt '*' sys.runner_doc cache.grains mine.get
Runner names can be specified as globs.
.. versionadded:: 2015.5.0
.. code-block:: bash
salt '*' sys.runner_doc 'cache.clear_*'
"""
run_ = salt.runner.Runner(__opts__)
docs = {}
if not args:
for fun in run_.functions:
docs[fun] = run_.functions[fun].__doc__
return salt.utils.doc.strip_rst(docs)
for module in args:
_use_fnmatch = False
if "*" in module:
target_mod = module
_use_fnmatch = True
elif module:
# allow both "sys" and "sys." to match sys, without also matching
# sysctl
target_mod = module + "." if not module.endswith(".") else module
else:
target_mod = ""
if _use_fnmatch:
for fun in fnmatch.filter(run_.functions, target_mod):
docs[fun] = run_.functions[fun].__doc__
else:
for fun in run_.functions:
if fun == module or fun.startswith(target_mod):
docs[fun] = run_.functions[fun].__doc__
return salt.utils.doc.strip_rst(docs)
def returner_doc(*args):
"""
Return the docstrings for all returners. Optionally, specify a returner or a
function to narrow the selection.
The strings are aggregated into a single document on the master for easy
reading.
Multiple returners/functions can be specified.
.. versionadded:: 2014.7.0
CLI Example:
.. code-block:: bash
salt '*' sys.returner_doc
salt '*' sys.returner_doc sqlite3
salt '*' sys.returner_doc sqlite3.get_fun
salt '*' sys.returner_doc sqlite3.get_fun etcd.get_fun
Returner names can be specified as globs.
.. versionadded:: 2015.5.0
.. code-block:: bash
salt '*' sys.returner_doc 'sqlite3.get_*'
"""
returners_ = salt.loader.returners(__opts__, [])
docs = {}
if not args:
for fun in returners_:
docs[fun] = returners_[fun].__doc__
return salt.utils.doc.strip_rst(docs)
for module in args:
_use_fnmatch = False
if "*" in module:
target_mod = module
_use_fnmatch = True
elif module:
# allow both "sys" and "sys." to match sys, without also matching
# sysctl
target_mod = module + "." if not module.endswith(".") else module
else:
target_mod = ""
if _use_fnmatch:
for fun in returners_:
if fun == module or fun.startswith(target_mod):
docs[fun] = returners_[fun].__doc__
else:
for fun in returners_.keys():
if fun == module or fun.startswith(target_mod):
docs[fun] = returners_[fun].__doc__
return salt.utils.doc.strip_rst(docs)
def renderer_doc(*args):
"""
Return the docstrings for all renderers. Optionally, specify a renderer or a
function to narrow the selection.
The strings are aggregated into a single document on the master for easy
reading.
Multiple renderers can be specified.
.. versionadded:: 2015.5.0
CLI Example:
.. code-block:: bash
salt '*' sys.renderer_doc
salt '*' sys.renderer_doc cheetah
salt '*' sys.renderer_doc jinja json
Renderer names can be specified as globs.
.. code-block:: bash
salt '*' sys.renderer_doc 'c*' 'j*'
"""
renderers_ = salt.loader.render(__opts__, [])
docs = {}
if not args:
for func in renderers_.keys():
docs[func] = renderers_[func].__doc__
return salt.utils.doc.strip_rst(docs)
for module in args:
if "*" in module or "." in module:
for func in fnmatch.filter(renderers_, module):
docs[func] = renderers_[func].__doc__
else:
moduledot = module + "."
for func in renderers_.keys():
if func.startswith(moduledot):
docs[func] = renderers_[func].__doc__
return salt.utils.doc.strip_rst(docs)
def list_functions(*args, **kwargs): # pylint: disable=unused-argument
"""
List the functions for all modules. Optionally, specify a module or modules
from which to list.
CLI Example:
.. code-block:: bash
salt '*' sys.list_functions
salt '*' sys.list_functions sys
salt '*' sys.list_functions sys user
.. versionadded:: 0.12.0
.. code-block:: bash
salt '*' sys.list_functions 'module.specific_function'
Function names can be specified as globs.
.. versionadded:: 2015.5.0
.. code-block:: bash
salt '*' sys.list_functions 'sys.list_*'
"""
# ## NOTE: **kwargs is used here to prevent a traceback when garbage
# ## arguments are tacked on to the end.
if not args:
# We're being asked for all functions
return sorted(__salt__)
names = set()
for module in args:
if "*" in module or "." in module:
for func in fnmatch.filter(__salt__, module):
names.add(func)
else:
# "sys" should just match sys without also matching sysctl
moduledot = module + "."
for func in __salt__:
if func.startswith(moduledot):
names.add(func)
return sorted(names)
def list_modules(*args):
"""
List the modules loaded on the minion
.. versionadded:: 2015.5.0
CLI Example:
.. code-block:: bash
salt '*' sys.list_modules
Module names can be specified as globs.
.. code-block:: bash
salt '*' sys.list_modules 's*'
"""
modules = set()
if not args:
for func in __salt__:
modules.add(func.split(".")[0])
return sorted(modules)
for module in args:
if "*" in module:
for func in fnmatch.filter(__salt__, module):
modules.add(func.split(".")[0])
else:
for func in __salt__:
mod_test = func.split(".")[0]
if mod_test == module:
modules.add(mod_test)
return sorted(modules)
def reload_modules():
"""
Tell the minion to reload the execution modules
CLI Example:
.. code-block:: bash
salt '*' sys.reload_modules
"""
# This function is actually handled inside the minion.py file, the function
# is caught before it ever gets here. Therefore, the docstring above is
# only for the online docs, and ANY CHANGES made to it must also be made in
# each of the gen_modules() funcs in minion.py.
return True
def argspec(module=""):
"""
Return the argument specification of functions in Salt execution
modules.
CLI Example:
.. code-block:: bash
salt '*' sys.argspec pkg.install
salt '*' sys.argspec sys
salt '*' sys.argspec
Module names can be specified as globs.
.. versionadded:: 2015.5.0
.. code-block:: bash
salt '*' sys.argspec 'pkg.*'
"""
return salt.utils.args.argspec_report(__salt__, module)
def state_argspec(module=""):
"""
Return the argument specification of functions in Salt state
modules.
.. versionadded:: 2015.5.0
CLI Example:
.. code-block:: bash
salt '*' sys.state_argspec pkg.installed
salt '*' sys.state_argspec file
salt '*' sys.state_argspec
State names can be specified as globs.
.. code-block:: bash
salt '*' sys.state_argspec 'pkg.*'
"""
st_ = salt.state.State(__opts__)
return salt.utils.args.argspec_report(st_.states, module)
def returner_argspec(module=""):
"""
Return the argument specification of functions in Salt returner
modules.
.. versionadded:: 2015.5.0
CLI Example:
.. code-block:: bash
salt '*' sys.returner_argspec xmpp
salt '*' sys.returner_argspec xmpp smtp
salt '*' sys.returner_argspec
Returner names can be specified as globs.
.. code-block:: bash
salt '*' sys.returner_argspec 'sqlite3.*'
"""
returners_ = salt.loader.returners(__opts__, [])
return salt.utils.args.argspec_report(returners_, module)
def runner_argspec(module=""):
"""
Return the argument specification of functions in Salt runner
modules.
.. versionadded:: 2015.5.0
CLI Example:
.. code-block:: bash
salt '*' sys.runner_argspec state
salt '*' sys.runner_argspec http
salt '*' sys.runner_argspec
Runner names can be specified as globs.
.. code-block:: bash
salt '*' sys.runner_argspec 'winrepo.*'
"""
run_ = salt.runner.Runner(__opts__)
return salt.utils.args.argspec_report(run_.functions, module)
def list_state_functions(*args, **kwargs): # pylint: disable=unused-argument
"""
List the functions for all state modules. Optionally, specify a state
module or modules from which to list.
.. versionadded:: 2014.7.0
CLI Example:
.. code-block:: bash
salt '*' sys.list_state_functions
salt '*' sys.list_state_functions file
salt '*' sys.list_state_functions pkg user
State function names can be specified as globs.
.. versionadded:: 2015.5.0
.. code-block:: bash
salt '*' sys.list_state_functions 'file.*'
salt '*' sys.list_state_functions 'file.s*'
.. versionadded:: 2016.9.0
.. code-block:: bash
salt '*' sys.list_state_functions 'module.specific_function'
"""
# NOTE: **kwargs is used here to prevent a traceback when garbage
# arguments are tacked on to the end.
st_ = salt.state.State(__opts__)
if not args:
# We're being asked for all functions
return sorted(st_.states)
names = set()
for module in args:
if "*" in module or "." in module:
for func in fnmatch.filter(st_.states, module):
names.add(func)
else:
# "sys" should just match sys without also matching sysctl
moduledot = module + "."
for func in st_.states:
if func.startswith(moduledot):
names.add(func)
return sorted(names)
def list_state_modules(*args):
"""
List the modules loaded on the minion
.. versionadded:: 2014.7.0
CLI Example:
.. code-block:: bash
salt '*' sys.list_state_modules
State module names can be specified as globs.
.. versionadded:: 2015.5.0
.. code-block:: bash
salt '*' sys.list_state_modules 'mysql_*'
"""
st_ = salt.state.State(__opts__)
modules = set()
if not args:
for func in st_.states:
log.debug("func %s", func)
modules.add(func.split(".")[0])
return sorted(modules)
for module in args:
if "*" in module:
for func in fnmatch.filter(st_.states, module):
modules.add(func.split(".")[0])
else:
for func in st_.states:
mod_test = func.split(".")[0]
if mod_test == module:
modules.add(mod_test)
return sorted(modules)
def list_runners(*args):
"""
List the runners loaded on the minion
.. versionadded:: 2014.7.0
CLI Example:
.. code-block:: bash
salt '*' sys.list_runners
Runner names can be specified as globs.
.. versionadded:: 2015.5.0
.. code-block:: bash
salt '*' sys.list_runners 'm*'
"""
run_ = salt.runner.Runner(__opts__)
runners = set()
if not args:
for func in run_.functions:
runners.add(func.split(".")[0])
return sorted(runners)
for module in args:
if "*" in module:
for func in fnmatch.filter(run_.functions, module):
runners.add(func.split(".")[0])
else:
for func in run_.functions:
mod_test = func.split(".")[0]
if mod_test == module:
runners.add(mod_test)
return sorted(runners)
def list_runner_functions(*args, **kwargs): # pylint: disable=unused-argument
"""
List the functions for all runner modules. Optionally, specify a runner
module or modules from which to list.
.. versionadded:: 2014.7.0
CLI Example:
.. code-block:: bash
salt '*' sys.list_runner_functions
salt '*' sys.list_runner_functions state
salt '*' sys.list_runner_functions state virt
Runner function names can be specified as globs.
.. versionadded:: 2015.5.0
.. code-block:: bash
salt '*' sys.list_runner_functions 'state.*' 'virt.*'
"""
# ## NOTE: **kwargs is used here to prevent a traceback when garbage
# ## arguments are tacked on to the end.
run_ = salt.runner.Runner(__opts__)
if not args:
# We're being asked for all functions
return sorted(run_.functions)
names = set()
for module in args:
if "*" in module or "." in module:
for func in fnmatch.filter(run_.functions, module):
names.add(func)
else:
# "sys" should just match sys without also matching sysctl
moduledot = module + "."
for func in run_.functions:
if func.startswith(moduledot):
names.add(func)
return sorted(names)
def list_returners(*args):
"""
List the returners loaded on the minion
.. versionadded:: 2014.7.0
CLI Example:
.. code-block:: bash
salt '*' sys.list_returners
Returner names can be specified as globs.
.. versionadded:: 2015.5.0
.. code-block:: bash
salt '*' sys.list_returners 's*'
"""
returners_ = salt.loader.returners(__opts__, [])
returners = set()
if not args:
for func in returners_.keys():
returners.add(func.split(".")[0])
return sorted(returners)
for module in args:
if "*" in module:
for func in fnmatch.filter(returners_, module):
returners.add(func.split(".")[0])
else:
for func in returners_:
mod_test = func.split(".")[0]
if mod_test == module:
returners.add(mod_test)
return sorted(returners)
def list_returner_functions(*args, **kwargs): # pylint: disable=unused-argument
"""
List the functions for all returner modules. Optionally, specify a returner
module or modules from which to list.
.. versionadded:: 2014.7.0
CLI Example:
.. code-block:: bash
salt '*' sys.list_returner_functions
salt '*' sys.list_returner_functions mysql
salt '*' sys.list_returner_functions mysql etcd
Returner names can be specified as globs.
.. versionadded:: 2015.5.0
.. code-block:: bash
salt '*' sys.list_returner_functions 'sqlite3.get_*'
"""
# NOTE: **kwargs is used here to prevent a traceback when garbage
# arguments are tacked on to the end.
returners_ = salt.loader.returners(__opts__, [])
if not args:
# We're being asked for all functions
return sorted(returners_)
names = set()
for module in args:
if "*" in module or "." in module:
for func in fnmatch.filter(returners_, module):
names.add(func)
else:
# "sys" should just match sys without also matching sysctl
moduledot = module + "."
for func in returners_:
if func.startswith(moduledot):
names.add(func)
return sorted(names)
def list_renderers(*args):
"""
List the renderers loaded on the minion
.. versionadded:: 2015.5.0
CLI Example:
.. code-block:: bash
salt '*' sys.list_renderers
Render names can be specified as globs.
.. code-block:: bash
salt '*' sys.list_renderers 'yaml*'
"""
renderers_ = salt.loader.render(__opts__, [])
renderers = set()
if not args:
for rend in renderers_.keys():
renderers.add(rend)
return sorted(renderers)
for module in args:
for rend in fnmatch.filter(renderers_, module):
renderers.add(rend)
return sorted(renderers)
def _argspec_to_schema(mod, spec):
args = spec["args"]
defaults = spec["defaults"] or []
args_req = args[: len(args) - len(defaults)]
args_defaults = list(zip(args[-len(defaults) :], defaults))
types = {
"title": mod,
"description": mod,
}
for i in args_req:
types[i] = salt.utils.schema.OneOfItem(
items=(
salt.utils.schema.BooleanItem(title=i, description=i, required=True),
salt.utils.schema.IntegerItem(title=i, description=i, required=True),
salt.utils.schema.NumberItem(title=i, description=i, required=True),
salt.utils.schema.StringItem(title=i, description=i, required=True),
# S.ArrayItem(title=i, description=i, required=True),
# S.DictItem(title=i, description=i, required=True),
)
)
for i, j in args_defaults:
types[i] = salt.utils.schema.OneOfItem(
items=(
salt.utils.schema.BooleanItem(title=i, description=i, default=j),
salt.utils.schema.IntegerItem(title=i, description=i, default=j),
salt.utils.schema.NumberItem(title=i, description=i, default=j),
salt.utils.schema.StringItem(title=i, description=i, default=j),
# S.ArrayItem(title=i, description=i, default=j),
# S.DictItem(title=i, description=i, default=j),
)
)
return type(mod, (salt.utils.schema.Schema,), types).serialize()
def state_schema(module=""):
"""
Return a JSON Schema for the given state function(s)
.. versionadded:: 2016.3.0
CLI Example:
.. code-block:: bash
salt '*' sys.state_schema
salt '*' sys.state_schema pkg.installed
"""
specs = state_argspec(module)
schemas = []
for state_mod, state_spec in specs.items():
schemas.append(_argspec_to_schema(state_mod, state_spec))
return schemas