-
Notifications
You must be signed in to change notification settings - Fork 5.5k
/
eventlisten.py
140 lines (120 loc) · 3.56 KB
/
eventlisten.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# -*- 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)