123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- # -*- 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 pprint
- import time
- import os
- # 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)
|