Skip to main content

Remotely and collaboratively debug your Python application via IRC

Project description

ircpdb - Remotely and collaboratively debug your Python application via an IRC channel

https://travis-ci.org/coddingtonbear/ircpdb.svg?branch=master https://badge.fury.io/py/ircpdb.svg https://pypip.in/d/ircpdb/badge.png

Ircpdb is an adaptation of rpdb that, instead of opening a port and allowing you to debug over telnet, connects to a configurable IRC channel so you can collaboratively debug an application remotely.

import ircpdb
ircpdb.set_trace(
    channel="#debugger_hangout",
    limit_access_to=['mynickname'], # List of nicknames that are allowed access
)

By default, ircpdb will select a nickname on its own and enter the channel you specify on Freenode, but you can feel free to configure ircpdb to connect anywhere:

import ircpdb
ircpdb.set_trace(
    channel="#debugger_hangout",
    nickname='im_a_debugger',
    server='irc.mycompany.org',
    limit_access_to=['mynickname', 'someothernickname', 'mybestfriend'],
    port=6667,
    ssl=True,
)  # See 'Options' below for descriptions of the above arguments

Upon reaching set_trace(), your script will “hang” and the only way to get it to continue is to access ircpdb by talking to the user that connected to the above IRC channel.

By default, the debugger will enter the channel you’ve specified using a username starting with the hostname of the computer from which it was launched (in the following example: ‘MyHostname’). To interact with the debugger, just send messages in the channel prefixed with “MyHostname:”, or simply “!”.

For example, the following two commands are equivalent, and each will display the pdb help screen (be sure to replace ‘MyHostname’ with whatever username the bot selected):

!help
MyHostname: help

Installation

From pip:

pip install ircpdb

Options

  • channel (REQUIRED): The name of the channel (starting with #) to connect to on the IRC server.

  • limit_access_to (REQUIRED): A list of nicknames that are allowed to interact with the debugger.

  • nickname: The nickname to use when connecting. Note that an alternate name will be selected if this name is already in use. Defaults to using the hostname of the machine on which the debugger was executed.

  • server: The hostname or IP address of the IRC server. Default: chat.freenode.net.

  • port: The port number of the IRC server. Default: 6697.

  • ssl: Use SSL when connecting to the IRC server? Default: True.

  • password: The server password (if necessary) for the IRC server. Default: None.

  • message_wait_seconds: The number of seconds that the bot should wait between sending messages on IRC. Many servers, including Freenode, will kick clients that send too many messages in too short of a time frame. Default: 0.8 seconds.

  • dpaste_minimum_response_length: Try to post messages this length or longer to dpaste rather than sending each line individually via IRC. This is a useful parameter to use if you happen to be connected to a server having very austere limits on the number of lines a client can send per minute. Default: 10 lines.

Security Disclaimer

The way that this library works is inherently dangerous; given that you’re able to execute arbitrary Python code from within your debugger, it is strongly recommended that you take all reasonable measures to ensure that you control who are able to execute debugger commands.

To limit your risk as much as possible, you should consider taking the following steps:

  • Always use an SSL-capable IRC server (read: leave the ssl argument set to it’s default: True).

  • Connect to an IRC server you or a company you work for owns rather than Freenode (the default).

Just to make absolutely sure this is clear: you’re both responsible for determining what level of risk you are comfortable with, and for taking appropriate actions to mitigate that risk.

As is clearly and thunderously stated library’s license (see the included LICENSE.txt):

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.

Good luck, and happy debugging!

Troubleshooting

If you do not see the bot entering your specified channel, try increasing the logging level by adding the following lines above your trace to gather a little more information about problems that may have occurred while connecting to the IRC server:

import logging
logging.basicConfig(filename='/path/to/somewhere.log', level=logging.DEBUG)

Author(s)

Adam Coddington <me@adamcoddington.net> - http://adamcoddington.net/

This library is a fork of rpdb, and the underpinnings of this library are owed to Bertrand Janin <b@janin.com> - http://tamentis.com/ and all other contributors to rpdb <https://github.com/tamentis/rpdb> including the following:

1.4 (2014-11-11)

  • Simpler internal handling of prompt.

  • Adding internal support for IRC CTCP commands.

  • Pinning jaraco/irc library version at 0.9 to preserve Python 2.6 support.

1.3 (2014-11-01)

  • Reduced security concerns by making it impossible to configure the debugger to respond to all usernames.

  • Fixed a UI glitch in which the prompt would be displayed in inappropriate situations.

1.2 (2014-10-31)

  • Many UI improvements including: - Display a prompt after the response has been written.

  • Added ‘!!forbid’ command.

  • Added a thunderous warning to the readme about the security implications of this library.

1.1 (2014-10-30)

  • Added functionality for automatically sending long messages to Dpaste.

  • Added additional commands including !!set_dpaste_minimum_response_length and !!set_message_wait_seconds.

  • Send a hello message once connected to the channel.

1.0 (2014-10-29)

  • Forked from rpdb to, instead of opening a socket to interact with,

0.1.5 (2014-10-16)

  • Write addr/port to stderr instead of stdout (thanks to @onlynone).

  • Allow for dynamic host port (thanks to @onlynone).

  • Make q/quit do proper cleanup (@kenmanheimer)

  • Benignly disregard repeated rpdb.set_trace() to same port as currently active session (@kenmanheimer)

  • Extend backwards compatibility down to Python 2.5 (@kenmanheimer)

0.1.4 (2014-04-28)

  • Expose the addr, port arguments to the set_trace method (thanks to @niedbalski).

0.1.3 (2013-08-02)

  • Remove a try/finally that seemed to shift the trace location (thanks to k4ml@github).

0.1.2 (2012-01-26)

  • Catch IOError raised by print in initialization, it may not work in some environments (e.g. mod_wsgi). (Menno Smits)

0.1.1 (2010-05-09)

Initial release.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ircpdb-1.4.tar.gz (11.9 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page