forked from fedora-infra/fedmsg
-
Notifications
You must be signed in to change notification settings - Fork 1
/
tail.py
130 lines (111 loc) · 4.03 KB
/
tail.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
# This file is part of fedmsg.
# Copyright (C) 2012 Red Hat, Inc.
#
# fedmsg is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# fedmsg is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with fedmsg; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#
# Authors: Ralph Bean <rbean@redhat.com>
#
import pprint
import re
import time
import pygments
import pygments.lexers
import pygments.formatters
import fedmsg
import fedmsg.encoding
import fedmsg.text
from fedmsg.commands import command
extra_args = [
(['--topic'], {
'dest': 'topic',
'help': 'The topic pattern to listen for. Everything by default.',
'default': '',
}),
(['--pretty'], {
'dest': 'pretty',
'help': 'Pretty print the JSON messages.',
'default': False,
'action': 'store_true',
}),
(['--really-pretty'], {
'dest': 'really_pretty',
'help': 'Extra-pretty print the JSON messages.',
'default': False,
'action': 'store_true',
}),
(['--terse'], {
'dest': 'terse',
'help': 'Print "english" representations of messages only.',
'default': False,
'action': 'store_true',
}),
(['--filter'], {
'dest': 'exclusive_regexp',
'metavar': 'REGEXP',
'help': 'Only show topics that do not match the supplied regexp.',
'default': '_heartbeat',
}),
(['--regexp'], {
'dest': 'inclusive_regexp',
'metavar': 'REGEXP',
'help': 'Only show topics that match the supplied regexp.',
'default': '^((?!_heartbeat).)*$',
}),
]
@command(name="fedmsg-tail", extra_args=extra_args)
def tail(**kw):
""" Watch all endpoints on the bus and print each message to stdout. """
# Disable sending
kw['publish_endpoint'] = None
# Disable timeouts. We want to tail forever!
kw['timeout'] = 0
# Even though fedmsg-tail won't be sending any messages, give it a name to
# conform with the other commands.
kw['name'] = 'relay_inbound'
# Tail is never going to send any messages, so we suppress warnings about
# having no publishing sockets established.
kw['mute'] = True
fedmsg.init(**kw)
fedmsg.text.make_processors(**kw)
# Build a message formatter
formatter = lambda d: d
if kw['pretty']:
def formatter(d):
d['timestamp'] = time.ctime(d['timestamp'])
d = fedmsg.crypto.strip_credentials(d)
return "\n" + pprint.pformat(d)
if kw['really_pretty']:
def formatter(d):
d = fedmsg.crypto.strip_credentials(d)
fancy = pygments.highlight(
fedmsg.encoding.pretty_dumps(d),
pygments.lexers.JavascriptLexer(),
pygments.formatters.TerminalFormatter()
).strip()
return "\n" + fancy
if kw['terse']:
formatter = lambda d: "\n" + fedmsg.text.msg2repr(d, **kw)
exclusive_regexp = re.compile(kw['exclusive_regexp'])
inclusive_regexp = re.compile(kw['inclusive_regexp'])
# The "proper" fedmsg way to do this would be to spin up or connect to an
# existing Moksha Hub and register a consumer on the "*" topic that simply
# prints out each message it consumes. That seems like overkill, so we're
# just going to directly access the endpoints ourself.
for name, ep, topic, message in fedmsg.tail_messages(**kw):
if exclusive_regexp.search(topic):
continue
if not inclusive_regexp.search(topic):
continue
print name, ep, topic, formatter(message)