HEX
Server: Apache
System: Linux sg241.singhost.net 2.6.32-896.16.1.lve1.4.51.el6.x86_64 #1 SMP Wed Jan 17 13:19:23 EST 2018 x86_64
User: honghock (909)
PHP: 8.0.30
Disabled: passthru,system,shell_exec,show_source,exec,popen,proc_open
Upload Files
File: //proc/self/root/usr/lib/python2.7/site-packages/salt/engines/http_logstash.py
# -*- coding: utf-8 -*-
'''
HTTP Logstash engine
==========================

An engine that reads messages from the salt event bus and pushes
them onto a logstash endpoint via HTTP requests.

.. versionchanged:: 2018.3.0

.. note::
    By default, this engine take everything from the Salt bus and exports into
    Logstash.
    For a better selection of the events that you want to publish, you can use
    the ``tags`` and ``funs`` options.

:configuration: Example configuration

    .. code-block:: yaml

        engines:
          - http_logstash:
              url: http://blabla.com/salt-stuff
              tags:
                  - salt/job/*/new
                  - salt/job/*/ret/*
              funs:
                  - probes.results
                  - bgp.config
'''

from __future__ import absolute_import, print_function, unicode_literals

# Import python lib
import fnmatch

# Import salt libs
import salt.utils.http
import salt.utils.event
import salt.utils.json

# ----------------------------------------------------------------------------------------------------------------------
# module properties
# ----------------------------------------------------------------------------------------------------------------------

_HEADERS = {'Content-Type': 'application/json'}

# ----------------------------------------------------------------------------------------------------------------------
# module properties
# ----------------------------------------------------------------------------------------------------------------------

# ----------------------------------------------------------------------------------------------------------------------
# helpers
# ----------------------------------------------------------------------------------------------------------------------


def _logstash(url, data):
    '''
    Issues HTTP queries to the logstash server.
    '''
    result = salt.utils.http.query(
        url,
        'POST',
        header_dict=_HEADERS,
        data=salt.utils.json.dumps(data),
        decode=True,
        status=True,
        opts=__opts__
    )
    return result

# ----------------------------------------------------------------------------------------------------------------------
# main
# ----------------------------------------------------------------------------------------------------------------------


def start(url, funs=None, tags=None):
    '''
    Listen to salt events and forward them to logstash.

    url
        The Logstash endpoint.

    funs: ``None``
        A list of functions to be compared against, looking into the ``fun``
        field from the event data. This option helps to select the events
        generated by one or more functions.
        If an event does not have the ``fun`` field in the data section, it
        will be published. For a better selection, consider using the ``tags``
        option.
        By default, this option accepts any event to be submitted to Logstash.

    tags: ``None``
        A list of pattern to compare the event tag against.
        By default, this option accepts any event to be submitted to Logstash.
    '''
    if __opts__.get('id').endswith('_master'):
        instance = 'master'
    else:
        instance = 'minion'
    with salt.utils.event.get_event(
            instance,
            sock_dir=__opts__['sock_dir'],
            transport=__opts__['transport'],
            opts=__opts__,
        ) as event_bus:
        while True:
            event = event_bus.get_event(full=True)
            if event:
                publish = True
                if tags and isinstance(tags, list):
                    found_match = False
                    for tag in tags:
                        if fnmatch.fnmatch(event['tag'], tag):
                            found_match = True
                    publish = found_match
                if funs and 'fun' in event['data']:
                    if not event['data']['fun'] in funs:
                        publish = False
                if publish:
                    _logstash(url, event['data'])