irkerd: Initial SSL/TLS implementation
[irker.git] / irkerd.xml
1 <!DOCTYPE refentry PUBLIC 
2    "-//OASIS//DTD DocBook XML V4.1.2//EN"
3    "docbook/docbookx.dtd">
4 <refentry id='irkerd.8'>
5 <refmeta>
6 <refentrytitle>irkerd</refentrytitle>
7 <manvolnum>8</manvolnum>
8 <refmiscinfo class='date'>Aug 27 2012</refmiscinfo>
9 <refmiscinfo class='source'>irker</refmiscinfo>
10 <refmiscinfo class='product'>irker</refmiscinfo>
11 <refmiscinfo class='manual'>Commands</refmiscinfo>
12 </refmeta>
13 <refnamediv id='name'>
14 <refname>irkerd</refname>
15 <refpurpose>relay for shipping notifications to IRC servers</refpurpose>
16 </refnamediv>
17 <refsynopsisdiv id='synopsis'>
18
19 <cmdsynopsis>
20   <command>irkerd</command>
21      <arg>-c <replaceable>ca-file</replaceable></arg>
22      <arg>-d <replaceable>debuglevel</replaceable></arg>
23      <arg>-l <replaceable>logfile</replaceable></arg>
24      <arg>-n <replaceable>nick</replaceable></arg>
25      <arg>-p <replaceable>password</replaceable></arg>
26      <arg>-i <replaceable>IRC-URL</replaceable></arg>
27      <arg>-V</arg>
28      <arg>-h</arg>
29      <arg choice='opt'><replaceable>message text</replaceable></arg>
30 </cmdsynopsis>
31 </refsynopsisdiv>
32
33 <refsect1 id='description'><title>DESCRIPTION</title>
34
35 <para><application>irkerd</application> is a specialized write-only IRC
36 client intended to be used for shipping notification messages to IRC
37 channels. The use case in mind when it was designed was broadcasting
38 notifications from commit hooks in version-control systems.</para>
39
40 <para>The main advantage of relaying through this daemon over
41 individual scripted sends from applications is that it can maintain
42 connection state for multiple channels, rather than producing obnoxious
43 join/leave channel spam on every message.</para>
44
45 <para><application>irkerd</application> is a socket server that
46 listens on for UDP or TCP packets on port 6659 for textual request
47 lines containing JSON objects and terminated by a newline. Each JSON
48 object must have two members: "to" specifying a destination or
49 destination list, and "privmsg" specifying the message text.
50 Examples:
51
52 <programlisting>
53 {"to":"irc://chat.freenode.net/git-ciabot", "privmsg":"Hello, world!"}
54 {"to":["irc://chat.freenode.net/#git-ciabot","irc://chat.freenode.net/#gpsd"],"privmsg":"Multichannel test"}
55 {"to":"irc://chat.hypothetical.net:6668/git-ciabot", "privmsg":"Hello, world!"}
56 {"to":"ircs://chat.hypothetical.net/git-private?key=topsecret", "privmsg":"Keyed channel test"}
57 </programlisting></para>
58
59 <para>If the channel part of the URL does not have one of the prefix
60 characters <quote>#</quote>, <quote>&amp;</quote>, or
61 <quote>+</quote>, a <quote>#</quote> will be prepended to it before
62 shipping - <emphasis>unless</emphasis>the channel part has the suffix
63 ",isnick" (which is unconditionally removed).</para>
64
65 <para>The host part of the URL may have a port-number suffix separated by a
66 colon, as shown in the third example; otherwise
67 <application>irkerd</application> sends plaintext messages to the default
68 6667 IRC port of each server, and SSL/TLS messages to 6697.</para>
69
70 <para>When the <quote>to</quote> URL uses the <quote>ircs</quote>
71 scheme (as shown in the fourth and fifth examples), the connection to
72 the server is made via SSL/TLS (vs. a plaintext connection with the
73 <quote>irc</quote> scheme).  To connect via SSL/TLS with Python 2.x,
74 you need to explicitly declare the certificate authority file used to
75 verify server certificates.  For example, <quote>-c
76 /etc/ssl/certs/ca-certificates.crt</quote>.  In Python 3.2 and later,
77 you can still set this option to declare a custom CA file, but
78 <application>irkerd</application>; if you don't set it
79 <application>irkerd</application> will use OpenSSL's default file
80 (using Python's
81 <quote>ssl.SSLContext.set_default_verify_paths</quote>).  In Python
82 3.2 and later, <quote>ssl.match_hostname</quote> is used to ensure the
83 server certificate belongs to the intended host, as well as being
84 signed by a trusted CA.</para>
85
86 <para>To join password-protected (mode +k) channels, the channel part of the
87 URL may be followed with a query-string indicating the channel key, of the
88 form <quote>?secret</quote> or <quote>?key=secret</quote>, where
89 <quote>secret</quote> is the channel key.</para>
90
91 <para>An empty message is legal and will cause
92 <application>irkerd</application> to join or maintain a connection to
93 the target channels without actually emitting a message.  This may be
94 useful for advertising that an instance is up and running, or for
95 joining a channel to log its traffic.</para>
96 </refsect1>
97
98 <refsect1 id='options'><title>OPTIONS</title>
99
100 <para><application>irkerd</application> takes the following options:</para>
101
102 <variablelist>
103 <varlistentry>
104 <term>-d</term>
105 <listitem><para>Takes a following value, setting the debugging level from
106 it. This option will generally only be of interest to developers;
107 consult the source code for details.</para></listitem>
108 </varlistentry>
109 <varlistentry>
110 <term>-l</term>
111 <listitem><para>Takes a following filename, logs traffic to that file.
112 Each log line consists of three |-separated fields; a numeric
113 timestamp in Unix time, the FQDN of the sending server, and the
114 message data.</para></listitem>
115 </varlistentry>
116 <varlistentry>
117 <term>-n</term>
118 <listitem><para>Takes a following value, setting the nick
119 to be used. If the nick contains a numeric format element
120 (such as %03d) it is used to generate suffixed fallback names
121 in the event of a nick collision.</para></listitem>
122 </varlistentry>
123 <varlistentry>
124 <term>-p</term>
125 <listitem><para>Takes a following value, setting a nickserv
126 password to be used. If given, this password is shipped to
127 authenticate the nick on receipt of a welcome message.</para></listitem>
128 </varlistentry>
129 <varlistentry>
130 <term>-i</term>
131 <listitem><para>Immediate mode, to be run in foreground. Takes two
132 following values interpreted as a channel URL and a message
133 string. Sends the message, then quits.</para></listitem>
134 </varlistentry>
135 <varlistentry>
136 <term>-V</term>
137 <listitem><para>Write the program version to stdout and
138 terminate.</para></listitem>
139 </varlistentry>
140 <varlistentry>
141 <term>-h</term>
142 <listitem><para>Print usage instructions and terminate.</para></listitem>
143 </varlistentry>
144 </variablelist>
145
146 </refsect1>
147
148 <refsect1 id='limitations'><title>LIMITATIONS</title>
149 <para>Requests via UDP optimizes for lowest latency and network load
150 by avoiding TCP connection setup time; the cost is that delivery is
151 not reliable in the face of packet loss.</para>
152
153 <para>An <application>irkerd</application> instance with a
154 publicly-accessible request socket could complicate blocking of IRC
155 spam by making it easy for spammers to submit while hiding their IP
156 addresses; the better way to deploy, then, is on places like
157 project-hosting sites where the <application>irkerd</application>
158 socket can be visible from commit-hook code but not exposed to the
159 outside world. Priming your firewall with blocklists of IP addresses
160 known to spew spam is always a good idea.</para>
161
162 <para>The absence of any option to set the service port is deliberate.
163 If you think you need to do that, you have a problem better solved at
164 your firewall.</para>
165
166 <para>IRC has a message length limit of 510 bytes; generate your
167 privmsg attribute values with appropriate care.</para>
168
169 <para>IRC ignores any text after an embedded newline. Be aware that
170 <application>irkerd</application> will turn payload strings with
171 embedded newlines into multiple IRC sends to avoid having message data
172 discarded. </para>
173 </refsect1>
174
175 <refsect1 id='see_also'><title>SEE ALSO</title>
176 <para>
177 <citerefentry><refentrytitle>irkerhook</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
178 </para>
179 </refsect1>
180
181 <refsect1 id='authors'><title>AUTHOR</title>
182 <para>Eric S. Raymond <email>esr@snark.thyrsus.com</email>.  See the
183 project page at <ulink
184 url='http://www.catb.org/~esr/irker'>http://www.catb.org/~esr/irker</ulink>
185 for updates and other resources, including an installable repository
186 hook script.</para>
187 </refsect1>
188 </refentry>
189