'\" t .\" Title: irkerd .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets vsnapshot .\" Date: 02/17/2024 .\" Manual: Commands .\" Source: irker .\" Language: English .\" .TH "IRKERD" "8" "02/17/2024" "irker" "Commands" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" irkerd \- relay for shipping notifications to IRC servers .SH "SYNOPSIS" .HP \w'\fBirkerd\fR\ 'u \fBirkerd\fR [\-c\ \fIca\-file\fR] [\-d\ \fIdebuglevel\fR] [\-e\ \fIcert\-file\fR] [\-l\ \fIlogfile\fR] [\-H\ \fIhost\fR] [\-n\ \fInick\fR] [\-p\ \fIpassword\fR] [\-P\ \fIpassword\-file\fR] [\-i\ \fIIRC\-URL\fR] [\-t\ \fItimeout\fR] [\-V] [\-h] [\fImessage\ text\fR] .SH "DESCRIPTION" .PP irkerd is a specialized write\-only IRC client intended to be used for shipping notification messages to IRC channels\&. The use case in mind when it was designed was broadcasting notifications from commit hooks in version\-control systems\&. .PP The main advantage of relaying through this daemon over individual scripted sends from applications is that it can maintain connection state for multiple channels, rather than producing obnoxious join/leave channel spam on every message\&. .PP irkerd is a socket server that listens on for UDP or TCP packets on port 6659 for textual request lines containing JSON objects and terminated by a newline\&. Each JSON object must have two members: "to" specifying a destination or destination list, and "privmsg" specifying the message text\&. Examples: .sp .if n \{\ .RS 4 .\} .nf {"to":"irc://chat\&.freenode\&.net/git\-ciabot", "privmsg":"Hello, world!"} {"to":["irc://chat\&.freenode\&.net/#git\-ciabot","irc://chat\&.freenode\&.net/#gpsd"],"privmsg":"Multichannel test"} {"to":"irc://chat\&.hypothetical\&.net:6668/git\-ciabot", "privmsg":"Hello, world!"} {"to":"ircs://chat\&.hypothetical\&.net/git\-private?key=topsecret", "privmsg":"Keyed channel test"} {"to":"ircs://:topsecret@chat\&.example\&.net/git\-private", "privmsg":"Password\-protected server test"} .fi .if n \{\ .RE .\} .PP If the channel part of the URL does not have one of the prefix characters \(lq#\(rq, \(lq&\(rq, or \(lq+\(rq, a \(lq#\(rq will be prepended to it before shipping \- \fIunless\fR the channel part has the suffix ",isnick" (which is unconditionally removed)\&. .PP The host part of the URL may have a port\-number suffix separated by a colon, as shown in the third example; otherwise irkerd sends plaintext messages to the default 6667 IRC port of each server, and SSL/TLS messages to 6697\&. .PP The password for password\-protected servers can be set using the usual \(lq[{username}:{password}@]{host}:{port}\(rq defined in RFC 3986, as shown in the fifth example\&. Non\-empty URL usernames override the default \(lqirker\(rq username\&. .PP When the \(lqto\(rq URL uses the \(lqircs\(rq scheme (as shown in the fourth and fifth examples), the connection to the IRC server is made via SSL/TLS (vs\&. a plaintext connection with the \(lqirc\(rq scheme)\&. To connect via SSL/TLS with Python 2\&.x, you need to explicitly declare the certificate authority file used to verify server certificates\&. For example, \(lq\-c /etc/ssl/certs/ca\-certificates\&.crt\(rq\&. In Python 3\&.2 and later, you can still set this option to declare a custom CA file, but irkerd; if you don\*(Aqt set it irkerd will use OpenSSL\*(Aqs default file (using Python\*(Aqs \(lqssl\&.SSLContext\&.set_default_verify_paths\(rq)\&. In Python 3\&.2 and later, \(lqssl\&.match_hostname\(rq is used to ensure the server certificate belongs to the intended host, as well as being signed by a trusted CA\&. .PP To join password\-protected (mode +k) channels, the channel part of the URL may be followed with a query\-string indicating the channel key, of the form \(lq?secret\(rq or \(lq?key=secret\(rq, where \(lqsecret\(rq is the channel key\&. .PP An empty message is legal and will cause irkerd to join or maintain a connection to the target channels without actually emitting a message\&. This may be useful for advertising that an instance is up and running, or for joining a channel to log its traffic\&. .SH "OPTIONS" .PP irkerd takes the following options: .PP \-d .RS 4 Takes a following value, setting the debugging level from it; possible values are \*(Aqcritical\*(Aq, \*(Aqerror\*(Aq, \*(Aqwarning\*(Aq, \*(Aqinfo\*(Aq, \*(Aqdebug\*(Aq\&. This option will generally only be of interest to developers, as the logs are designed to help trace irkerd\*(Aqs internal state\&. These tracing logs are independent of the traffic logs controlled by \(lq\-l\(rq\&. .sp Logging will be to standard error (if irkerd is running in the foreground) or to \(lq/dev/syslog\(rq with facility "daemon" (if irkerd is running in the background)\&. The background\-ness of irkerd is determined by comparing the process group id with the process group associated with the terminal attached to stdout (with non\-matches for background processes)\&. We assume you aren\*(Aqt running irkerd in Windows or another OS that doesn\*(Aqt support \(lqos\&.getpgrp\(rq or \(lqtcgetpgrp\(rq\&. We assume that if stdout is attached to a TTY associated with the same process group as irkerd, you do intend to log to stderr and not syslog\&. .RE .PP \-e .RS 4 Takes a following filename in pem format and uses it to authenticate to the IRC server\&. You must be connecting to the IRC server over SSL for this to function properly\&. This is commonly known as \(lqCertFP\&.\(rq .RE .PP \-e .RS 4 Takes a following filename in pem format and uses it to authenticate to the IRC server\&. You must be connecting to the IRC server over SSL for this to function properly\&. This is commonly known as \(lqCertFP\&.\(rq .RE .PP \-l .RS 4 Takes a following filename, logs traffic to that file\&. Each log line consists of three |\-separated fields; a numeric timestamp in Unix time, the FQDN of the sending server, and the message data\&. .RE .PP \-H .RS 4 Takes a following hostname, and binds to that address when listening for messages\&. irkerd binds to localhost by default, but you may want to use your host\*(Aqs public address to listen on a local network\&. Listening on a public interface is not recommended, as it makes spamming IRC channels very easy\&. .RE .PP \-n .RS 4 Takes a following value, setting the nick to be used\&. If the nick contains a numeric format element (such as %03d) it is used to generate suffixed fallback names in the event of a nick collision\&. .RE .PP \-p .RS 4 Takes a following value, setting a nickserv password to be used\&. If given, this password is shipped to authenticate the nick on receipt of a welcome message\&. .RE .PP \-P .RS 4 Liuke p, but the argument is interpreted as a filename from which to read the password .RE .PP \-t .RS 4 Takes a following value, setting the connection timeout for server\-socket opens\&. .RE .PP \-i .RS 4 Immediate mode, to be run in foreground\&. Takes a following following value interpreted as a channel URL\&. May take a second argument giving a message string; if the second argument is absent the message is read from standard input (and may contain newlines)\&. Sends the message, then quits\&. .RE .PP \-V .RS 4 Write the program version to stdout and terminate\&. .RE .PP \-h .RS 4 Print usage instructions and terminate\&. .RE .SH "LIMITATIONS" .PP Requests via UDP optimizes for lowest latency and network load by avoiding TCP connection setup time; the cost is that delivery is not reliable in the face of packet loss\&. .PP An irkerd instance with a publicly\-accessible request socket could complicate blocking of IRC spam by making it easy for spammers to submit while hiding their IP addresses; the better way to deploy, then, is on places like project\-hosting sites where the irkerd socket can be visible from commit\-hook code but not exposed to the outside world\&. Priming your firewall with blocklists of IP addresses known to spew spam is always a good idea\&. .PP The absence of any option to set the service port is deliberate\&. If you think you need to do that, you have a problem better solved at your firewall\&. .PP IRC has a message length limit of 510 bytes; generate your privmsg attribute values with appropriate care\&. .PP IRC ignores any text after an embedded newline\&. Be aware that irkerd will turn payload strings with embedded newlines into multiple IRC sends to avoid having message data discarded\&. .PP Due to a bug in Python URL parsing, IRC urls with both a # and a key part may fail unexpectedly\&. The workaround is to remove the #\&. .SH "SEE ALSO" .PP \fBirkerhook\fR(1), .SH "AUTHOR" .PP Eric S\&. Raymond \&. See the project page at \m[blue]\fBhttp://www\&.catb\&.org/~esr/irker\fR\m[] for updates and other resources, including an installable repository hook script\&.