Source code for fedmsg.commands.replay

# This file is part of fedmsg.
# Copyright (C) 2012 - 2014 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>
from __future__ import print_function

import requests
import sys

import fedmsg
from fedmsg.commands import BaseCommand


class ReplayCommand(BaseCommand):
    """ Replay a message from the datagrepper history on your local bus.

    Example::

        $ fedmsg-dg-replay --msg-id 2014-8909e1e9-2a46-4e53-9a0e-f5415a9bedcf

    This depends on there being a datagrepper instance available to query.  The
    default is to query the Fedora Project history at
    https://apps.fedoraproject.org/datagrepper

    This also requires that the local configuration be pointed at a
    ``fedmsg-relay`` instance.

    The message is stripped of its original credentials.  Local credentials are
    applied if :ref:`conf-sign_messages` is set to ``True``.
    """

    name = "fedmsg-dg-replay"
    extra_args = [
        (['--msg-id'], {
            'dest': 'msg_id',
            'help': 'The msg_id of the message you want to replay.',
            'default': None,
        }),
        (['--datagrepper-url'], {
            'dest': 'datagrepper_url',
            'help': 'The URL of a datagrepper instance to query for history.',
            'default': 'https://apps.fedoraproject.org/datagrepper',
        }),
    ]

    def run(self):
        self.config['active'] = True
        self.config['name'] = 'relay_inbound'
        fedmsg.init(**self.config)

        idx = self.config.get('msg_id')
        if not idx:
            print("--msg-id is required")
            sys.exit(1)

        print("Retrieving %r" % idx)
        url = self.config['datagrepper_url'] + "/id"
        resp = requests.get(url, params={'id': idx})

        code = resp.status_code
        if code != 200:
            print("datagrepper request of %r failed. Status: %r" % (idx, code))
            sys.exit(2)

        msg = resp.json()
        tokens = msg['topic'].split('.')
        modname = tokens[3]
        topic = '.'.join(tokens[4:])

        print("Broadcasting %r" % idx)
        fedmsg.publish(modname=modname, topic=topic, msg=msg['msg'])
        print("OK.")


[docs]def replay(): command = ReplayCommand() return command.execute()