Source code for saltext.mattermost.returners.mattermost_returner
"""
Return Salt data via Mattermost
.. important::
Using this module requires the :ref:`general setup <mattermost-setup>`.
Usage
-----
To use the mattermost returner, append ``--return mattermost`` to the Salt command.
.. code-block:: bash
salt '*' test.ping --return mattermost
To override individual configuration items, append ``--return_kwargs '{'key:': 'value'}'`` to the Salt command.
.. code-block:: bash
salt '*' test.ping --return mattermost --return_kwargs '{'channel': '#random'}'
"""
import logging
import salt.returners
from salt.utils import json
from saltext.mattermost.utils import mattermost
log = logging.getLogger(__name__)
__virtualname__ = "mattermost"
def __virtual__():
return __virtualname__
def _get_options(ret=None):
"""
Get the mattermost options from salt.
"""
attrs = {
"channel": "channel",
"username": "username",
"hook": "hook",
"api_url": "api_url",
}
_options = salt.returners.get_returner_options(
__virtualname__, ret, attrs, __salt__=__salt__, __opts__=__opts__
)
log.debug("Options: %s", _options)
return _options
[docs]
def returner(ret):
"""
Send an mattermost message with the data
"""
_options = _get_options(ret)
api_url = _options.get("api_url")
channel = _options.get("channel")
username = _options.get("username")
hook = _options.get("hook")
if not hook:
log.error("mattermost.hook not defined in salt config")
return None
returns = ret.get("return")
message = "id: {}\r\nfunction: {}\r\nfunction args: {}\r\njid: {}\r\nreturn: {}\r\n".format( # pylint: disable=consider-using-f-string
ret.get("id"), ret.get("fun"), ret.get("fun_args"), ret.get("jid"), returns
)
return post_message(channel, message, username, api_url, hook)
[docs]
def event_return(events):
"""
Send the events to a mattermost room.
:param events: List of events
:return: Boolean if messages were sent successfully.
"""
_options = _get_options()
api_url = _options.get("api_url")
channel = _options.get("channel")
username = _options.get("username")
hook = _options.get("hook")
is_ok = True
for event in events:
log.debug("Event: %s", event)
log.debug("Event data: %s", event["data"])
message = f"tag: {event['tag']}\r\n"
for key, value in event["data"].items():
message += f"{key}: {value}\r\n"
result = post_message(channel, message, username, api_url, hook)
if not result:
is_ok = False
return is_ok
[docs]
def post_message(channel, message, username, api_url, hook):
"""
Send a message to a mattermost room.
:param channel: The room name.
:param message: The message to send to the mattermost room.
:param username: Specify who the message is from.
:param hook: The mattermost hook, if not specified in the configuration.
:return: Boolean if message was sent successfully.
"""
parameters = {}
if channel:
parameters["channel"] = channel
if username:
parameters["username"] = username
parameters["text"] = "```" + message + "```" # pre-formatted, fixed-width text
log.debug("Parameters: %s", parameters)
result = mattermost.query(
api_url=api_url,
hook=hook,
data=f"payload={json.dumps(parameters)}",
)
log.debug("result %s", result)
return bool(result)