123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- # -*- coding: utf-8 -*-
- """
- Use this script to dump the event data out to the terminal. It needs to know
- what the sock_dir is.
- This script is a generic tool to test event output
- """
- # Import Python libs
- from __future__ import absolute_import, print_function
- import optparse
- import os
- import pprint
- import time
- # Import Salt libs
- import salt.utils.event
- # Import 3rd-party libs
- from salt.ext import six
- def parse():
- """
- Parse the script command line inputs
- """
- parser = optparse.OptionParser()
- parser.add_option(
- "-s",
- "--sock-dir",
- dest="sock_dir",
- default="/var/run/salt",
- help=(
- "Statically define the directory holding the salt unix "
- "sockets for communication"
- ),
- )
- parser.add_option(
- "-n",
- "--node",
- dest="node",
- default="master",
- help=(
- "State if this listener will attach to a master or a "
- 'minion daemon, pass "master" or "minion"'
- ),
- )
- parser.add_option(
- "-f",
- "--func_count",
- default="",
- help=(
- "Return a count of the number of minions which have "
- "replied to a job with a given func."
- ),
- )
- parser.add_option(
- "-i",
- "--id",
- default="",
- help=("If connecting to a live master or minion, pass in the id"),
- )
- parser.add_option(
- "-t",
- "--transport",
- default="zeromq",
- help=("Transport to use. (Default: 'zeromq'"),
- )
- options, args = parser.parse_args()
- opts = {}
- for k, v in six.iteritems(options.__dict__):
- if v is not None:
- opts[k] = v
- opts["sock_dir"] = os.path.join(opts["sock_dir"], opts["node"])
- if "minion" in options.node:
- if args:
- opts["id"] = args[0]
- return opts
- if options.id:
- opts["id"] = options.id
- else:
- opts["id"] = options.node
- return opts
- def check_access_and_print_warning(sock_dir):
- """
- Check if this user is able to access the socket
- directory and print a warning if not
- """
- if (
- os.access(sock_dir, os.R_OK)
- and os.access(sock_dir, os.W_OK)
- and os.access(sock_dir, os.X_OK)
- ):
- return
- else:
- print(
- "WARNING: Events will not be reported"
- " (not able to access {0})".format(sock_dir)
- )
- def listen(opts):
- """
- Attach to the pub socket and grab messages
- """
- event = salt.utils.event.get_event(
- opts["node"],
- sock_dir=opts["sock_dir"],
- transport=opts["transport"],
- opts=opts,
- listen=True,
- )
- check_access_and_print_warning(opts["sock_dir"])
- print(event.puburi)
- jid_counter = 0
- found_minions = []
- while True:
- ret = event.get_event(full=True)
- if ret is None:
- continue
- if opts["func_count"]:
- data = ret.get("data", False)
- if data:
- if (
- "id" in six.iterkeys(data)
- and data.get("id", False) not in found_minions
- ):
- if data["fun"] == opts["func_count"]:
- jid_counter += 1
- found_minions.append(data["id"])
- print(
- "Reply received from [{0}]. Total replies now: [{1}].".format(
- ret["data"]["id"], jid_counter
- )
- )
- continue
- else:
- print("Event fired at {0}".format(time.asctime()))
- print("*" * 25)
- print("Tag: {0}".format(ret["tag"]))
- print("Data:")
- pprint.pprint(ret["data"])
- if __name__ == "__main__":
- opts = parse()
- listen(opts)
|