irker.git
10 years agoirkerd: Handle missing usernames asyncio
W. Trevor King [Sat, 31 May 2014 00:09:48 +0000 (17:09 -0700)]
irkerd: Handle missing usernames

Restore the default 'irker' username from the pre-asyncio code:

  username=target.username or username or 'irker',

We don't have a username argument, so it's currently either
target.username or the default.  This avoids a handshake with
ircs://:********@irc.example.net/chan that looks like:

  client: PASS ********
  client: NICK irker123
  client: USER  0 * :irker relaying client
               ^ empty, string
  server: :irc.example.net 461 irker123 USER :Syntax error

To make extra sure we don't have problems, we only submit PASS when we
have both a password and username [1], and only submit USER when we
have a username.  There's no sense in trying to authenticate yourself
with PASS if you don't have a username, although with the new code
it's impossibe to not have a username.

[1]: http://tools.ietf.org/html/rfc2812#section-3.1

10 years agoirkerd: Handle UnicodeDecodeError in LineProtocol.data_received
W. Trevor King [Fri, 30 May 2014 23:46:54 +0000 (16:46 -0700)]
irkerd: Handle UnicodeDecodeError in LineProtocol.data_received

I just got the following in a message-of-the-day from
leguin.freenode.net:

  Welcome to leguin.freenode.net in Ume\xe5, Sweden, EU!

Where Ume\xe5 is Ume{U+00E5 LATIN SMALL LETTER A WITH RING ABOVE}.
\xe5 is the ISO-8859-1 encoding.  Since important messages from the
IRC server should be in ASCII [1]:

  Regardless of being an 8-bit protocol, the delimiters and keywords
  are such that protocol is mostly usable from US-ASCII terminal and a
  telnet connection.

So rather than trying some fancy charset-detection heuristics, just
drop lines that don't decode properly.

[1]: http://tools.ietf.org/html/rfc2812#section-2.2

10 years agoirkerd: Close a Dispatcher after a bad-password error
W. Trevor King [Fri, 30 May 2014 00:19:16 +0000 (17:19 -0700)]
irkerd: Close a Dispatcher after a bad-password error

Instead of continually trying to reconnect.  If the server didn't like
your password last time, it's not likely to like it next time either.
Bad-password errors aren't covered in RFC 2812 (the ERROR entry is
very general [1]).  Charybdis seems to use:

  ERROR :Closing Link: webirc. (Bad Password)

and ngIRCd uses:

  ERROR :Access denied: Bad password?

[1]: http://tools.ietf.org/html/rfc2812#section-3.7.4

10 years agoirkerd: Make Dispatcher._target public (rename to .target)
W. Trevor King [Fri, 30 May 2014 00:13:57 +0000 (17:13 -0700)]
irkerd: Make Dispatcher._target public (rename to .target)

We'll need this to find the dispatcher.target.connection() key to
remove entries from IrkerProtocol._dispatchers.

10 years agoirkerd: Record errors (for example bad-password messages)
W. Trevor King [Fri, 30 May 2014 00:11:41 +0000 (17:11 -0700)]
irkerd: Record errors (for example bad-password messages)

We can use these to distinguish between lost connections because of
flaky connections (where trying again is useful) and lost connections
because of bad passwords (where we should just give up).

10 years agoirkerd: Convert from threading to asyncio for juggling connections
W. Trevor King [Fri, 14 Mar 2014 15:58:06 +0000 (08:58 -0700)]
irkerd: Convert from threading to asyncio for juggling connections

This is a fairly extensive restructuring, but I think a
single-threaded, asynchronous framework is easier to debug than the
previous multi-threaded implementatation with it's extensive locking.
The new implementation uses locks for anti-flooding
(Channel._send_message) and new-connection channel joins
(Dispatcher._join_channels) which are in separate coroutines.  This
allows out-of-band communication (e.g. PING/PONG exchanges) to occur
independently, so you won't time out on a PONG response because you're
locked sending some large, multi-line message.

Anti-flood protection sleeps use a per-connection (IRCProtcol) lock,
because the IRC server only cares about connection-level spamming, not
channel-level spamming.  We need the outer channel-level lock to avoid
interleaving multiline messages within a single channel.  Other than
this anti-flood locking, communication for separate channels is
independent, because Channel._send_message coroutines are always
launched in non-blocking Tasks from IRCProtcol.send_message (after
we've taken care of the synchronous _join error handling and such).
The parallel Channel._send_message coroutines function as an outgoing
message queue, with parallel contention for the per-channel
interleaving locks and per-connection anti-flood locks.

Channel._send_message coroutines are reaped by
Channel._reap_message_task, which catches and logs errors, re-queuing
the message for possible follow-up attempts.  This allows us to avoid
sending messages after we've been kicked from a channel or had the
connection dropped, but we can keep the channel (and re-queued
messages) and try to resend them after we rejoin the channel.  We
don't try to rejoin channels after we've been kicked though, because
that's just annoying.

I simplified the time-to-live calculations, with the following drops:

* XMIT_TTL, because we have per-channel timers
  (IRCProtocol._transmit_ttl and Channel.last_tx), which closes quiet
  channels in IRCProtocol._check_ttl (analagous to the old
  CHANNEL_TTL).  The IRCProtocol closes itself (from
  _handle_channel_disconnect) if it no longer has any channels, so a
  separate timeout at the IRCProtocol level isn't needed.

* PING_TTL, because it's a subset of the general case handled by
  IRCProtocol._receive_ttl.

* DISCONNECT_TTL, because I could't reproduce delayed reconnect hangs.
  Requesting a connection to a closed port raised:

    localhost:6667: Multiple exceptions:
      [Errno 111] Connect call failed ('::1', 6667, 0, 0),
      [Errno 111] Connect call failed ('127.0.0.1', 6667)

  which was caught without delay in Dispatcher._connection_created,
  after which the failed connection was dropped.  Connections that are
  open but not responding will be caught by the handshake TTL.

  FIXME: This will leave the target's dispatcher and channel queues in
  memory, so cleaning up after some delay is probably a good idea.

* UNSEEN_TTL, because I could't reproduce invalid-servername hangs.
  Requesting an invalid servername raised:

    example.invalid:6667: [Errno -2] Name or service not known

  which was caught without delay in Dispatcher._connection_created,
  after which the failed connection was dropped.

I also removed ANTI_BUZZ_DELAY, because we're using scheduled
callbacks instead of polling for the timeout checks.

I dropped CONNECTION_MAX, because our limit is now the number of open
connection file descriptors, not thread memory usage.  I don't expect
we'll bump into this limit, but it's easier to catch that exception
than to track global "connection count" state.

10 years agoMerge remote-tracking branch 'anarcat/bug-usage' into next next
W. Trevor King [Thu, 29 May 2014 23:21:46 +0000 (16:21 -0700)]
Merge remote-tracking branch 'anarcat/bug-usage' into next

* anarcat/bug-usage:
  fix usage for --log-level

10 years agofix usage for --log-level
Antoine Beaupré [Thu, 29 May 2014 22:51:21 +0000 (18:51 -0400)]
fix usage for --log-level

10 years agoMerge branch 'host-port' into next
W. Trevor King [Wed, 19 Mar 2014 17:31:02 +0000 (10:31 -0700)]
Merge branch 'host-port' into next

* host-port:
  irkerd: Add command-line options for the listener --host and --port

10 years agoMerge branch 'syslog' into next
W. Trevor King [Wed, 19 Mar 2014 17:30:36 +0000 (10:30 -0700)]
Merge branch 'syslog' into next

* syslog:
  irkerd: Add the --syslog argument to swap in the SysLogHandler

10 years agoirkerd: Add the --syslog argument to swap in the SysLogHandler syslog
W. Trevor King [Sat, 8 Mar 2014 00:39:35 +0000 (16:39 -0800)]
irkerd: Add the --syslog argument to swap in the SysLogHandler

For folks running irkerd as a daemon, it's useful to use a real log
handler ;).

10 years agoirkerd: Add command-line options for the listener --host and --port host-port
W. Trevor King [Fri, 7 Mar 2014 23:31:20 +0000 (15:31 -0800)]
irkerd: Add command-line options for the listener --host and --port

We shouldn't have to edit the file to bind to an alternative
interface.  The lack of a configurable port was an explicit decision
in the original design [1]:

> I even, quite deliberately, omitted the usual option to change the
> port that irker listens on. Because if you think you need an option
> like that, you actually have a problem you need to solve at your
> firewall.

which is fine, but it seems excessive to have to edit irkerd to bind
to 0.0.0.0 instead of localhost.  From the security audit's
assumptions [2]:

> 3. The machine which hosts irkerd has the same owner as the machine
>    which hosts the the repo; these machines are possibly but not
>    necessarily one and the same.

and it's going to be hard for the hooks to communicate with a remote
irkerd if that irkerd is only bound to localhost.  I don't really care
about configuring the port, but it's similar enough to the host
interface that I thought it should have the same config mechanism
(from a "least surprise" perspective).

[1]: http://esr.ibiblio.org/?p=4540
[2]: security.txt in this repo

10 years agoDate-stamp 2.7. 2.7
Eric S. Raymond [Sat, 15 Mar 2014 11:34:20 +0000 (07:34 -0400)]
Date-stamp 2.7.

10 years agoVersion bump for 2.7 release.
Eric S. Raymond [Sat, 15 Mar 2014 11:33:09 +0000 (07:33 -0400)]
Version bump for 2.7 release.

10 years agoSuppress some spuriious pylint warnings.
Eric S. Raymond [Sat, 15 Mar 2014 11:32:07 +0000 (07:32 -0400)]
Suppress some spuriious pylint warnings.

10 years agoirkerd: Fix 'self.socket' -> 'socket' typos in _wrap_socket
W. Trevor King [Wed, 12 Mar 2014 16:58:45 +0000 (09:58 -0700)]
irkerd: Fix 'self.socket' -> 'socket' typos in _wrap_socket

Respect the 'socket' argument passed in by the caller.  Fixes a typo
introducted in a82724f (irkerd: Initial SSL/TLS implementation,
2014-03-06).

10 years agoirkerd: Fix -i / --immediate handling, and add a message argument
W. Trevor King [Wed, 12 Mar 2014 16:58:44 +0000 (09:58 -0700)]
irkerd: Fix -i / --immediate handling, and add a message argument

This fixes some problems with -i/--immediate parsing in ccd311c5
(irkerd: Transition from getopt to argparse, 2014-03-06).

> +    parser.add_argument(
> +        '-i', '--immediate', action='store_const', const=True,
> +        help='disconnect after sending each message')

This does not match the old syntax where -i took two arguments (an IRC
URL and a message).

> -    if immediate:
> +    if args.immediate:
>          irker.irc.add_event_handler("quit", lambda _c, _e: sys.exit(0))
>          irker.handle('{"to":"%s","privmsg":"%s"}' % (immediate, arguments[0]), quit_after=True)
>          irker.irc.spin()

immediate should be args.immediate, and arguments[0] needs to be added
as a new (optional) positional argument.

This patch fixes both issues.

10 years agoFix somre confusion abot argument-passing.
Eric S. Raymond [Wed, 12 Mar 2014 16:16:02 +0000 (12:16 -0400)]
Fix somre confusion abot argument-passing.

10 years agoAllow kwargs use.
Eric S. Raymond [Tue, 11 Mar 2014 18:07:06 +0000 (14:07 -0400)]
Allow kwargs use.

10 years agoDocumentation updates.
Eric S. Raymond [Tue, 11 Mar 2014 17:33:18 +0000 (13:33 -0400)]
Documentation updates.

10 years agoirkerd: Extract username and password from submitted URLs
W. Trevor King [Fri, 7 Mar 2014 04:21:24 +0000 (20:21 -0800)]
irkerd: Extract username and password from submitted URLs

And use them (when present) as the USER username [1] and server PASS
[2] respectively.  The previous implementation gave no way to set
PASS, which will vary on a per-target-server level.  There's unlikely
to be much need to set per-server usernames, except collision
avoidance (e.g. network X already has an 'irker' user).

I changed the existing IRCServerConnection.connect argument from
'ircname' to 'realname' to match the USER specs and our
IRCServerConnection.user implementation.  The 'realname' and
'username' arguments are currently unset, but you could add command
line options to set irker-wide defaults, and use the kwargs chain to
pass them down to the connect method.  The fallback logic is:

* Prefer the setting listed in the URL (although you'd need to add a
  parser to extract 'realname').  If that's empty or missing, fall
  back to
* The irker-wide default passed down the kwargs chain.  If that's
  empty or missing, fall back to
* Local defaults ('irker' and 'irker relaying client').

I also tweaked the servername and port extraction in
Target.__init__(), because they are already parsed out of the netloc
(along with the username and password) by urlparse().

[1]: https://tools.ietf.org/html/rfc2812#section-3.1.3
[2]: https://tools.ietf.org/html/rfc2812#section-3.1.1

10 years agoirkerd: Initial SSL/TLS implementation
W. Trevor King [Fri, 7 Mar 2014 04:21:23 +0000 (20:21 -0800)]
irkerd: Initial SSL/TLS implementation

This is pretty basic, just using as much of Python's ssl module as the
host Python implementation supports.  I also added error-level logging
of IRCServerConnectionError instances, to get helpful messages like:

  Invalid SSL/TLS certificate:
  hostname 'localhost' doesn't match 'irc.example.net'

and:

  Couldn't connect to socket: _ssl.c:334: No root certificates
  specified for verification of other-side certificates.

Important milestones in the standard library's ssl module:

* Python 2.5 [1,2]: No ssl module at all
* Python 2.6 [1,2]: ssl module added
* Python 3.2 [3,4]: ssl.SSLContext class added, with
  SSLContext.set_default_verify_paths [4].  ssl.match_hostname is also
  added [5], which can be used with the existing getpeercert [6] to
  ensure the server certificate belongs to the target host.

So for full verification, we need Python 3.2.  We can scrape by with
2.6 and later, by manually supplying a ca_certs path and ignoring
hostname mismatches.  That's more succeptible to man-in-the-middle
attacks, but still better than sending server, nick, and channel
passwords in plaintext.

[1]: http://docs.python.org/2/library/ssl.html
[2]: http://docs.python.org/2/whatsnew/2.6.html#improved-ssl-support
[3]: http://docs.python.org/3/whatsnew/3.2.html#ssl
[4]: http://docs.python.org/3/library/ssl.html#ssl.SSLContext.set_default_verify_paths
[5]: http://docs.python.org/3/library/ssl.html#ssl.match_hostname
[6]: http://docs.python.org/2/library/ssl.html#ssl.SSLSocket.getpeercert

10 years agoirkerd: Replace Exception.format_exc() with traceback.format_exc()
W. Trevor King [Fri, 7 Mar 2014 04:21:22 +0000 (20:21 -0800)]
irkerd: Replace Exception.format_exc() with traceback.format_exc()

The former was giving me:

  Traceback (most recent call last):
    File "/usr/lib64/python3.3/threading.py", line 901, in _bootstrap_inner
      self.run()
    File "/usr/lib64/python3.3/threading.py", line 858, in run
      self._target(*self._args, **self._kwargs)
    File "./irkerd", line 637, in dequeue
      LOG.debug(e.format_exc())
  AttributeError: 'TypeError' object has no attribute 'format_exc'

In Python 3.3.4.

10 years agoirkerd: Add Python-3-compatible string handling
W. Trevor King [Fri, 7 Mar 2014 04:21:21 +0000 (20:21 -0800)]
irkerd: Add Python-3-compatible string handling

This implements the necessary changes to work around the (str,
unicode) -> (bytes, str) transition.  We decode the bytes as soon as
possible after receiving them in the Irker*Handler classes.  For
IRC-side connections, we still encode outgoing data right before
sending it in IRCServerConnection.ship.

We decode incoming IRC-side bytes in IRCServerConnection.consume,
after storing them as bytes in the LineBufferedStream
IRCServerConnection.buffer.  That ensures that we don't try and decode
partial code points which are split across two socket messages.

10 years agoirkerd: Use self instead of LineBufferedStream in lines()
W. Trevor King [Fri, 7 Mar 2014 04:21:20 +0000 (20:21 -0800)]
irkerd: Use self instead of LineBufferedStream in lines()

That's what 'self' is for ;).  Also prefix 'crlf_re' with an
underscore to mark it as private data, and not part of
LineBufferedStream's API.

10 years agoirkerd: Add Python-3-compatible import names
W. Trevor King [Fri, 7 Mar 2014 04:21:19 +0000 (20:21 -0800)]
irkerd: Add Python-3-compatible import names

Prefer the Python 3 names to the Python 2 names for forward
compatibility.

10 years agoirkerd: Drop scheme replacement in Target.__init__
W. Trevor King [Fri, 7 Mar 2014 04:21:18 +0000 (20:21 -0800)]
irkerd: Drop scheme replacement in Target.__init__

Now that we've dropped support for Python 2.5, we don't need this
workaround anymore.

10 years agoirkerd: Drop simplejson replacement
W. Trevor King [Fri, 7 Mar 2014 04:21:17 +0000 (20:21 -0800)]
irkerd: Drop simplejson replacement

Since we no longer officially support Python 2.5, there's no *need* to
use a fallback JSON library.  Removing it makes our dependencies
cleaner, and JSON-parsing speed is not likely to be a large fraction
of irkerd cycles anyway.

10 years agoirkerd: Convert to Python 3's "except x as y" syntax
W. Trevor King [Fri, 7 Mar 2014 04:21:16 +0000 (20:21 -0800)]
irkerd: Convert to Python 3's "except x as y" syntax

Support for this was added in Python 2.6 and 3.0.  We can't have
Python 3 compatibility without removing the old "except x, y" syntax,
and I think 3.x support is more imporant than 2.5 support.  In any
case, the existing irkerd has been using the new syntax since 3cc8751
(Truncate messages that are longer than 512 bytes and catch any
exceptions irclib throws about rejected messages, 2013-01-21), so this
commit is not a *new* break with 2.5 support.

10 years agoirkerd: Replace sys.stderr.write with LOG.error
W. Trevor King [Fri, 7 Mar 2014 04:21:15 +0000 (20:21 -0800)]
irkerd: Replace sys.stderr.write with LOG.error

Thie makes logging more consistent with other errors (e.g. you can
adjust the logging Handler and get all the errors sent to syslog or a
file).  I also removed the 'irkerd: ' prefix; if we want that, I think
we should add it to all logged messages by using a custom string in
the logging Formatter.

10 years agoirkerd: Replace a print statement with LOG.error
W. Trevor King [Fri, 7 Mar 2014 04:21:14 +0000 (20:21 -0800)]
irkerd: Replace a print statement with LOG.error

Print statements are gone in Python 3, so this removes a barrier to
Python 3 support.  It also makes the logging more consistent with
other errors (e.g. the StreamHandler will print it to stdout, while
the print statement was sending it to stderr).

10 years agoirkerd: Transition from getopt to argparse
W. Trevor King [Fri, 7 Mar 2014 04:21:13 +0000 (20:21 -0800)]
irkerd: Transition from getopt to argparse

This gives us long options and removes the need to code our own usage
string and choice-base argument processing.  I also removed the blurb
about options from the module docstring, to avoid duplicating
information.

10 years agoirkerd: Replace 'password' global with local Connection.password
W. Trevor King [Fri, 7 Mar 2014 04:21:12 +0000 (20:21 -0800)]
irkerd: Replace 'password' global with local Connection.password

Using the new kwargs handling to pass the data through Irker() down to
Connection().  Note that this is the nickserv password, not the
server-wide login password used by Connection.connect().

10 years agoirkerd: Replace 'logfile' global with local Irker.logfile
W. Trevor King [Fri, 7 Mar 2014 04:21:11 +0000 (20:21 -0800)]
irkerd: Replace 'logfile' global with local Irker.logfile

10 years agoirkerd: Replace 'namestyle' global with local 'nick_template'
W. Trevor King [Fri, 7 Mar 2014 04:21:10 +0000 (20:21 -0800)]
irkerd: Replace 'namestyle' global with local 'nick_template'

Using the new kwargs handling to pass the data through Irker() down to
Connection().  I think 'nick_template' more clearly reflects
the contents of this variable.

10 years agoirkerd: Replace 'fallback' global with local 'nick_needs_number'
W. Trevor King [Fri, 7 Mar 2014 04:21:09 +0000 (20:21 -0800)]
irkerd: Replace 'fallback' global with local 'nick_needs_number'

Using the new kwargs handling to pass the data through Irker() down to
Connection().

10 years agoirkerd: Add kwargs handling to pass data to IRCServerConnection.connect
W. Trevor King [Fri, 7 Mar 2014 04:21:08 +0000 (20:21 -0800)]
irkerd: Add kwargs handling to pass data to IRCServerConnection.connect

This makes it easy to pass data down the stack:

  Irker() (stored in Irker.kwargs)
  `-- Irker.handle() -> Dispatcher() (stored in Dispatcher.kwargs)
      `-- Dispatcher.dispatch() -> Connection() (stored in Connection.kwargs)
          `-- Connection.dequeue() -> IRCServerConnection.connect()

You can easily add data at every point in the stack (e.g. we add
'target' in Irker.handle()) and pull it back out when that's
appropriate (e.g. we tap 'target' back out in Connection()).  With
this setup we can reduce the number of global variables currently in
use, because it will be easy to pass data like passwords,
nickame-fallback-ness, etc. down to the appropriate level, without the
intermediate levels needing any changes.

10 years agoirkerd: Add Target.__str__ for pretty-printing targets in log messages
W. Trevor King [Fri, 7 Mar 2014 04:21:07 +0000 (20:21 -0800)]
irkerd: Add Target.__str__ for pretty-printing targets in log messages

Prefer the servername, falling back to the URL, falling back to
Target.__repr__().

10 years agoirkerd: Convert to Python's logging module
W. Trevor King [Fri, 7 Mar 2014 04:21:06 +0000 (20:21 -0800)]
irkerd: Convert to Python's logging module

Instead of using the local IRCClient.debug() method, use the more
flexible standard library logger.  This makes it easy to log to
syslog, rotating files, etc, using the usual logging Handlers.  The
mapping from the old implementation to the new implementation is:

  IRCClient.debug(1, message)  -> LOG.info(message)
  IRCClient.debug(2, message)  -> LOG.debug(message)
  IRCClient.debug(50, message) -> LOG.debug(message)
  Irker.logerr(errmsg)         -> LOG.error(message)

with the exception of the failed-message error, which is logged as
LOG.warning().  I didn't try and recategorize the other message log
levels, although I think a number of info-level log messages should
really be debug-level log messages.

To set the log level, the -d option now takes string arguments
(e.g. 'info', 'debug') instead of numeric arguments (e.g. '1', '2').
This breaks backward compatibility, but I think it makes the argument
more user-friendly.  If you try and set an invalid level, there's a
helpful error message to guide you in the right direction.

I also use format_exc() in Connection.dequeue (following the existing
example deeper in the Connection.dequeue nest).  The log level should
decide whether the traceback is printed or not, not whether the
exception should be raised or ignored.

10 years agoirkerd: Split imported modules onto their own lines
W. Trevor King [Fri, 7 Mar 2014 04:21:05 +0000 (20:21 -0800)]
irkerd: Split imported modules onto their own lines

Following PEP 8 [1]:

  Imports should usually be on separate lines, e.g.:

    Yes: import os
         import sys

    No:  import sys, os

This also makes it easier to read diffs that add and remove imports,
since you won't need a word-diff to see exactly what changed.

[1]: http://legacy.python.org/dev/peps/pep-0008/#imports

Conflicts:
irkerd

10 years agoirkerd: Pull request-parsing out into Irker._parse_request
W. Trevor King [Fri, 7 Mar 2014 04:21:04 +0000 (20:21 -0800)]
irkerd: Pull request-parsing out into Irker._parse_request

There is a lot of error checking here, which is good, but it distracts
from the core logic of Irker.handle.  By pulling the parsing out into
a private helper function, we isolate the code focused on parsing and
error checking from the code focused on dispatching and connection
management, making both easier to read.

I've also changed the Target-validation logic.  The old Target.valid
returned True if the Target URL was valid, and False otherwise.  The
new Target.validate returns None, and raises an InvalidRequest
exception with an error message describing exactly why the URL is
invalid.  We print these messages when dropping server URLs in
Irker._parse_request, while the old Irker.handle code silently dropped
invalid targets.  We also continue processing other server URLs after
an invalid Target, while the old Irker.handle code bailed out after
the first invalid Target.  Besides making the invalid URLs more
obvious in the logs and increasing resiliency to invalid URLs, these
changes allow us to pull the URL-to-Target conversion out of
Irker.handle entirely, so it can focus more strongly on dispatch and
connection management.

10 years agoirkerd: Add InvalidRequest and use it to flatten Irker.handle()
W. Trevor King [Fri, 7 Mar 2014 04:21:03 +0000 (20:21 -0800)]
irkerd: Add InvalidRequest and use it to flatten Irker.handle()

The old implementation had several instances of logic like this:

  if exception_condition:
      self.logerr("invalid request")
  else:
      # continue_processing

This increases nesting after each round of exception checking, and
makes the logic of the whole function harder to follow.  This commit
replaces that logic with:

  try:
      if exception_condition:
          raise InvalidRequest("invalid request")
      # continue peocessing
  except InvalidRequest, e:
      self.logerr(str(e))

Because the guts of the handle() function are already inside a
try/except block, we can add our except clause to the existing block,
and now exception checks don't increase nesting at all.

The exception to this global try/except block is the 'URL has
unexpected type' error, where we do want a local try/except block
inside the channel loop.  That way we get both errors about invalid
URLs and continue to attempt valid URLs.  This matches the existing
logic for this check, but conflicts with the current target.valid
check (which doesn't log an error and does stop processing of further
channels).

10 years agoirkerd: Store less state in IRCServerConnection.connect()
W. Trevor King [Fri, 7 Mar 2014 04:21:02 +0000 (20:21 -0800)]
irkerd: Store less state in IRCServerConnection.connect()

We will never need the connection-time port, server_address, username,
ircname, or password again, so don't store them.  We *do* need server
and real_server_name for Event handling, so keep them around.

10 years agoVersion bump for 2.6. 2.6
Eric S. Raymond [Tue, 4 Feb 2014 22:59:59 +0000 (17:59 -0500)]
Version bump for 2.6.

10 years agoAdd a check for expired connections that are still running
Alexander van Gessel [Tue, 4 Feb 2014 20:59:09 +0000 (21:59 +0100)]
Add a check for expired connections that are still running

10 years agoDon't loop forever after failing to connect to IRC
Alexander van Gessel [Tue, 4 Feb 2014 20:58:51 +0000 (21:58 +0100)]
Don't loop forever after failing to connect to IRC

11 years agoAI0867 gets more credit.
Eric S. Raymond [Wed, 25 Dec 2013 03:55:51 +0000 (22:55 -0500)]
AI0867 gets more credit.

11 years agoDocumentation improvements.
Eric S. Raymond [Wed, 25 Dec 2013 03:14:02 +0000 (22:14 -0500)]
Documentation improvements.

11 years agoVersion bump for 2.5 release. 2.5
Eric S. Raymond [Wed, 25 Dec 2013 02:29:53 +0000 (21:29 -0500)]
Version bump for 2.5 release.

11 years agoFix a deadlock
Alexander van Gessel [Tue, 24 Dec 2013 22:23:04 +0000 (23:23 +0100)]
Fix a deadlock

11 years agoMy typo fix was typoed. Clearly I need more sleep.
Eric S. Raymond [Sun, 22 Dec 2013 11:10:47 +0000 (06:10 -0500)]
My typo fix was typoed.  Clearly I need more sleep.

11 years agoTypo fix.
Eric S. Raymond [Sun, 22 Dec 2013 11:09:00 +0000 (06:09 -0500)]
Typo fix.

11 years agoDocumentation tweak.
Eric S. Raymond [Sun, 22 Dec 2013 11:06:37 +0000 (06:06 -0500)]
Documentation tweak.

11 years agoStupid markup fix. 2.4
Eric S. Raymond [Wed, 4 Dec 2013 00:37:49 +0000 (19:37 -0500)]
Stupid markup fix.

11 years agoVersion bump for release 2.4.
Eric S. Raymond [Wed, 4 Dec 2013 00:35:21 +0000 (19:35 -0500)]
Version bump for release 2.4.

11 years agoOnly convert to unicode when needed
Laurent Bachelier [Sun, 1 Dec 2013 19:13:23 +0000 (20:13 +0100)]
Only convert to unicode when needed

Otherwise, it would crash if any unicode string was already
present.

Signed-off-by: Eric S. Raymond <esr@thyrsus.com>
11 years agoSupply a missing parameter.
Eric S. Raymond [Tue, 3 Dec 2013 22:41:09 +0000 (17:41 -0500)]
Supply a missing parameter.

11 years agoCleaner exit code.
Eric S. Raymond [Mon, 2 Dec 2013 15:45:18 +0000 (10:45 -0500)]
Cleaner exit code.

11 years agoWe don't want to return an error status in immediate mode.
Eric S. Raymond [Mon, 2 Dec 2013 15:42:38 +0000 (10:42 -0500)]
We don't want to return an error status in immediate mode.

11 years agofix crash after introduction of immediate mode
Antoine Beaupré [Sun, 1 Dec 2013 06:07:19 +0000 (01:07 -0500)]
fix crash after introduction of immediate mode

this fixes the following backtrace:

Exception happened during processing of request from ('127.0.0.1', 41192)
Traceback (most recent call last):
  File /usr/lib/python2.7/SocketServer.py, line 295, in _handle_request_noblock
    self.process_request(request, client_address)
  File /usr/lib/python2.7/SocketServer.py, line 321, in process_request
    self.finish_request(request, client_address)
  File /usr/lib/python2.7/SocketServer.py, line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File /usr/lib/python2.7/SocketServer.py, line 649, in __init__
    self.handle()
  File ./irkerd, line 820, in handle
    irker.handle(line.strip())
  File ./irkerd, line 786, in handle
    self.servers[target.server()].dispatch(target.channel, message, target.key, quit_after=quit_after)
  File ./irkerd, line 641, in dispatch
    eligibles[0].enqueue(channel, message, key)
TypeError: enqueue() takes exactly 5 arguments (4 given)

when running: ./irk irker-test test

11 years agoadd a more helpful hook example: in post-receive
Antoine Beaupré [Sun, 1 Dec 2013 06:39:07 +0000 (01:39 -0500)]
add a more helpful hook example: in post-receive

the previous suggestion seemed to be about the update hook, but it's
usually bad practice to setup notification hooks there, because if
they fail, the push fails.

parsing the git documentation to find exactly the incantation is not
exactly trivial either...

11 years agoAnother shipper metadata change.
Eric S. Raymond [Sun, 1 Dec 2013 04:30:39 +0000 (23:30 -0500)]
Another shipper metadata change.

11 years agoVersion bump for 2.3 release. 2.3
Eric S. Raymond [Sun, 1 Dec 2013 02:41:09 +0000 (21:41 -0500)]
Version bump for 2.3 release.

11 years agoReinstate a simpler irk that only works with irkerd running.
Eric S. Raymond [Sun, 1 Dec 2013 02:31:42 +0000 (21:31 -0500)]
Reinstate a simpler irk that only works with irkerd running.

11 years agoClean up and document immediate mode.
Eric S. Raymond [Sat, 30 Nov 2013 20:00:00 +0000 (15:00 -0500)]
Clean up and document immediate mode.

11 years agoImmediate mode work.
Eric S. Raymond [Sat, 30 Nov 2013 19:43:52 +0000 (14:43 -0500)]
Immediate mode work.

11 years agoRemove unecessary elaboration.
Eric S. Raymond [Sat, 30 Nov 2013 19:29:45 +0000 (14:29 -0500)]
Remove unecessary elaboration.

11 years agoAn until string is not the answer.
Eric S. Raymond [Sat, 30 Nov 2013 17:38:58 +0000 (12:38 -0500)]
An until string is not the answer.

11 years agoTurning off DEAF is mecessary for this technique...
Eric S. Raymond [Sat, 30 Nov 2013 14:52:39 +0000 (09:52 -0500)]
Turning off DEAF is mecessary for this technique...

...but, alas, the server doesn't echo pings back to their sources.

11 years agoI think this would work to terminate immediaate mode...
Eric S. Raymond [Sat, 30 Nov 2013 14:14:35 +0000 (09:14 -0500)]
I think this would work to terminate immediaate mode...

...if we could see message traffic!

11 years agoRefactoring step: don't uncomditionally spawn a thread...
Eric S. Raymond [Sat, 30 Nov 2013 12:31:56 +0000 (07:31 -0500)]
Refactoring step: don't uncomditionally spawn a thread...

...immediate mode doesn't need it.

11 years agoNote a deficiency
Eric S. Raymond [Sat, 30 Nov 2013 12:09:22 +0000 (07:09 -0500)]
Note a deficiency

11 years agoHalf-working immediate mode.
Eric S. Raymond [Fri, 29 Nov 2013 13:45:52 +0000 (08:45 -0500)]
Half-working immediate mode.

We can now send messages with -i but we don't ger clean termination
afterwards yet.

11 years agoNEWS typo fix.
Eric S. Raymond [Fri, 29 Nov 2013 11:14:11 +0000 (06:14 -0500)]
NEWS typo fix.

11 years agoVersion bump for 2.2 release. 2.2
Eric S. Raymond [Fri, 29 Nov 2013 11:11:31 +0000 (06:11 -0500)]
Version bump for 2.2 release.

11 years agoFix up some shipper metadata.
Eric S. Raymond [Fri, 29 Nov 2013 11:05:57 +0000 (06:05 -0500)]
Fix up some shipper metadata.

11 years agoRequired magic to kill the spawned instance.
Eric S. Raymond [Wed, 27 Nov 2013 00:45:58 +0000 (19:45 -0500)]
Required magic to kill the spawned instance.

11 years agoShow traceback on higher debug levels
Laurent Bachelier [Tue, 26 Nov 2013 23:24:51 +0000 (00:24 +0100)]
Show traceback on higher debug levels

Signed-off-by: Eric S. Raymond <esr@thyrsus.com>
11 years agoFix some documentation typos
Laurent Bachelier [Tue, 26 Nov 2013 23:24:50 +0000 (00:24 +0100)]
Fix some documentation typos

Signed-off-by: Eric S. Raymond <esr@thyrsus.com>
11 years agoAn attempt at making irk clean up after itself.
Eric S. Raymond [Tue, 26 Nov 2013 23:32:42 +0000 (18:32 -0500)]
An attempt at making irk clean up after itself.

Perplexingly, the terminate() method call doesn't.

11 years agoFix unicode processing
Alexander van Gessel [Tue, 26 Nov 2013 20:47:50 +0000 (21:47 +0100)]
Fix unicode processing

Signed-off-by: Eric S. Raymond <esr@thyrsus.com>
11 years agoRemove some irclib cruft
Alexander van Gessel [Tue, 26 Nov 2013 20:47:26 +0000 (21:47 +0100)]
Remove some irclib cruft

Signed-off-by: Eric S. Raymond <esr@thyrsus.com>
11 years agoVersion bump for release 2.1. 2.1
Eric S. Raymond [Tue, 26 Nov 2013 15:13:08 +0000 (10:13 -0500)]
Version bump for release 2.1.

11 years agoUndo some damage from an overambitious patch.
Eric S. Raymond [Tue, 26 Nov 2013 15:12:43 +0000 (10:12 -0500)]
Undo some damage from an overambitious patch.

11 years agoMore documentation polishing.
Eric S. Raymond [Tue, 26 Nov 2013 11:35:24 +0000 (06:35 -0500)]
More documentation polishing.

11 years agoweechat doesn't do ANSI color, only mIRC.
Eric S. Raymond [Tue, 26 Nov 2013 11:03:49 +0000 (06:03 -0500)]
weechat doesn't do ANSI color, only mIRC.

11 years agoNews update.
Eric S. Raymond [Tue, 26 Nov 2013 10:56:35 +0000 (05:56 -0500)]
News update.

11 years agoExplain why relaying through this is a good idea!
Eric S. Raymond [Tue, 26 Nov 2013 10:53:28 +0000 (05:53 -0500)]
Explain why relaying through this is a good idea!

11 years agoDocumentation polishing.
Eric S. Raymond [Tue, 26 Nov 2013 10:20:15 +0000 (05:20 -0500)]
Documentation polishing.

11 years agoCosmetic fix to Makefile.
Eric S. Raymond [Tue, 26 Nov 2013 10:06:07 +0000 (05:06 -0500)]
Cosmetic fix to Makefile.

11 years agoBe more flexible about where irker can be installed.
dak180 [Mon, 25 Nov 2013 14:23:54 +0000 (09:23 -0500)]
Be more flexible about where irker can be installed.

11 years agoClean up the make file and use a more portable method of making tarballs.
dak180 [Sun, 17 Nov 2013 21:23:59 +0000 (16:23 -0500)]
Clean up the make file and use a more portable method of making tarballs.

11 years agoMerge commit 'refs/merge-requests/26' of git://gitorious.org/irker/irker into merge...
Eric S. Raymond [Thu, 21 Nov 2013 06:54:48 +0000 (01:54 -0500)]
Merge commit 'refs/merge-requests/26' of git://gitorious.org/irker/irker into merge-requests/26

11 years agoAdapt for new shipper conventions.
Eric S. Raymond [Thu, 21 Nov 2013 06:52:35 +0000 (01:52 -0500)]
Adapt for new shipper conventions.

11 years agoSpeed up parsing the Git commit author and subject
Beat Bolli [Sat, 16 Nov 2013 14:32:23 +0000 (15:32 +0100)]
Speed up parsing the Git commit author and subject

This uses the same idiom as a few lines lower to split the
formatted message into the three fields.

11 years agoVersion bump for 2.0. 2.0
Eric S. Raymond [Sat, 16 Nov 2013 10:39:22 +0000 (05:39 -0500)]
Version bump for 2.0.

11 years agoImproved .gitignore based om an idea bu dak180.
Eric S. Raymond [Sat, 16 Nov 2013 10:35:30 +0000 (05:35 -0500)]
Improved .gitignore based om an idea bu dak180.

11 years agoSlightly more elegant fix, no need for new connectfail status.
Eric S. Raymond [Sat, 16 Nov 2013 10:15:18 +0000 (05:15 -0500)]
Slightly more elegant fix, no need for new connectfail status.

11 years agoMeatball-surgery fix for invalid-name bug.
Eric S. Raymond [Sat, 16 Nov 2013 10:11:32 +0000 (05:11 -0500)]
Meatball-surgery fix for invalid-name bug.

00:07:27   AI0867 | esr: it reproduces on git head                   │
00:07:42   AI0867 | ./irk irc://chat.freendoe.net/foo                │
00:07:45   AI0867 | that's sufficient                                │
00:08:01      esr | OK, please email me a description of how to      │
                  | reproduce, I'll fix it.                          │
00:08:39      esr | Oh.  Is therec anything special about that       │
                  | channel?                                         │
00:08:42   AI0867 | no                                               │
00:08:48   AI0867 | any incorrect servername will do                 │
00:08:56   AI0867 | it then attempts to quit the server              │
00:09:01   AI0867 | and tries to send a QUIT                         │
00:09:06   AI0867 | which throws an exception                        │
00:09:10   AI0867 | so it tries to quit the server                   │

11 years agoAdd a todo note.
Eric S. Raymond [Tue, 22 Oct 2013 23:53:17 +0000 (19:53 -0400)]
Add a todo note.