• このエントリーをはてなブックマークに追加

ss-1323118293

はじめに

開発的お仕事が捗るらしいと聞いて,最近になってようやくIRCというものの利用頻度が上昇し始めた issm です.

IRC関連の各種ツールを使って,外部のサーバが自動的に私の手元に通知を届けるための環境づくりについて少し試してみたので,そのあたりの簡単な記録を残しておきます.

なお,まだまだ不勉強のため,「with SSL」な接続については,本エントリでは触れていません.

目次

こんな感じの構成です:

  • IRCクライアント 〜 LimeChat
  • オレオレIRCサーバを立てる 〜 ngIRCd
  • IRCサーバにつなぎっぱなしにする 〜 Tiarra
  • HTTP経由でIRCへ投げる 〜 ikachan
  • ikachanサーバへPOSTするためのスクリプト

IRCクライアント 〜 LimeChat

まずはメッセージを受け取るための環境から.

私は LimeChat を使ってます.よく知りませんが,定番のひとつっぽいです.まぁ他のクライアントを使ったことないのですが><

Windows向けだけでなく,for Macfor iOS もあるので,シーンを選ばずにメッセージを受け取れますね!

オレオレIRCサーバを立てる 〜 ngIRCd

お仕事なメッセージなど,オープンなサーバで行うのがはばかられる場合には,自分の持っているマシン(自宅サーバとかそういうの)にIRCサーバを立てるのがよいと思います.

「IRC サーバ」とかでググってみたところ,ngIRCd というのがモダンっぽい(?)ので,これを使ってみてます.

Ubuntu の場合,apt で簡単に入れられるので便利です:

% sudo apt-get install ngircd

設定ファイルは /etc/ngircd/ngircd.conf にあります.

[Global]
        ...
        Name = irc.example.com
        ...
        ;Password = hogehoge
        ...
        ;Ports = 6667
        ...

Name はもちろんのこと,Password を設定したり Ports を変更したり(デフォルトは 6667)もしておくとよさげかも.

で,変更後,サーバを再起動:

% sudo /etc/init.d/ngircd restart

これで,クライアントからオレオレIRCサーバに接続できる感じです.

ss-1323119413

IRCサーバにつなぎっぱなしにする 〜 Tiarra

クライアントとサーバが整ったので,これだけでもメッセージ交換はできてしまいます.

ss-1323127440

しかし,オフラインの場合,もちろんIRCサーバとの接続は切れてしまいます.もしその間に,何らかの重要なメッセージ交換があったとしても,オフラインなクライアントには届きません.再度オンラインになったときには時既に遅し,です.(IRCサーバの設定によっては,最近のログが得られると思いますが,まだよく設定方法を知りません><)

そこで,いわゆる「IRCプロキシ」ってヤツが捗ります.Perl界隈では「Tiarra」というのが定番っぽいです.(Perl界隈以外でも?)

ss-1323127454

IRCプロキシがIRCサーバに接続し,かつ,IRCクライアントからの接続を待ち受けます.IRCクライアントはこれに接続することで,IRCプロキシを仲介した形でIRCサーバに接続し,表向きはクライアント・サーバ間でやりとりしているかのようにメッセージ交換を行えます.IRCプロキシが実行中であれば,IRCサーバ間との接続は保たれるので,IRCクライアントとIRCプロキシ間の接続が切れたとしても,メッセージはIRCプロキシに入ってきます.IRCプロキシがそのログを保存するようにしておけば,いろいろ幸せになれそうですね.

セットアップ

次を参考に行いました:

まずはソースコードをチェックアウト:

% svn co http://svn.coderepos.org/share/lang/perl/tiarra/trunk/ /path/to/tiarra

設定を調整します.ファイルは /path/to/tiarra/tiarra.conf です.

general {
  ...
  nick: issm
  user: issm
  name: issm
  ...
  tiarra-port: 6667
  ...
}
 
networks {
  ...
  name: freenode
  ...
  name: oreore
  # ^ こんな感じのを追加
  ...
}
 
# v 追加した "name" に相当する接続先の設定
oreore {
  server: irc.example.com 6667
  password: ********
}
 
...
 
+ Channel::Join::Connect {
  ...
  channel: #nagoya.pm@freenode
  ...
  channel: #server-status@oreore
  # ^ こんな感じのを追加
  ...
}
 
...
 
+ Log::Channel {
  ...
}
 
+ Log::Recent {
  ...
  Line: 15
  ...
}
 
...
 
+ User::Nick::Detached {
  ...
  detached: issm_away
}

先でも触れましたが,後々幸せになるために,ログ関連の「プラグイン」は有効にしておくべきでしょう.

そして,Tiarra を起動します.

% /path/to/tiarra/tiarra >> /path/to/tiarra/log/tiarra.log 2>&1 &

クライアントの設定

接続先を,直接指定していたIRCサーバ(ここでは irc.example.com)から,tiarra を実行しているサーバに置き換えればきっとOKです.(必要であればポート指定もね.)

HTTP経由でIRCへ投げる 〜 ikachan

IRC環境について勉強するモチベーションを跳ね上げてくれたのが,IRCへのメッセージ通知をHTTP経由で行うことのできるツール「ikachan」の登場です.

セットアップ

「App::Ikachan」としてCPANに上がっているので,そこからインストールします:

% cpanm App::Ikachan

すると ikachan コマンドを利用できるようになるので,各種オプションを与えて実行します:

% ikachan -S irc.example.com -P 6667 -K ******** -N ika

-S は接続先のIRCサーバ名,-P はそのポート番号,-K はサーバパスワード(必要であれば),-N はニックネーム,となります.

使用方法いくつか

ikachanサーバに対してHTTPリクエストを送ることで各種操作を行います.ポート番号はデフォルトで 4979 です.(起動時に -p オプションで変更することもできます.)

http://localhost:4979/join

channel パラメータとともにPOSTすると,接続先のIRCサーバの指定したチャネルにjoinします.

http://localhost:4979/notice

channel パラメータ,message パラメータとともにPOSTすると,指定のチャネルにメッセージを投げます.

http://localhost:4979/channel_list

GETすると,その時点でjoinしているチャネルのリストが返ってきます.

詳しくは

中の人 yappo さんののエントリを読んでおきましょう:

ikachanを利用した各ホストからの通知環境の構想

ss-1323127463

ikachanサーバが立っているホスト自身からの通知自体は動かせています.ikachanサーバへリバースプロキシするようなWebサーバをフロントに立てておけば,他のホストからのメッセージの受け口にも利用できそうですね.

ikachanサーバへPOSTするためのスクリプト

複数行のメッセージの投げ方がよくわからないので,1行ごとに分割して順に ikachan に投げるようなPerlスクリプトをこさえてみました.localhostにしか対応していませんが.

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Getopt::Long;
 
my $CURL = "curl -s";
 
my ($channel);
 
my $parser = Getopt::Long::Parser->new;
 
my %options;
$parser->getoptions(
    'channel=s' => \$channel,
    'h|help'    => \$options{help},
);
 
die 'Missing mandatory parameter: channel'  unless defined $channel;
$channel = '#' . $channel  unless $channel =~ /^\#/;
 
my $buff;
{
    local $/;
    $buff = <STDIN>;
};
 
my $cmd_join   = "$CURL -F channel=$channel http://localhost:4979/join";
`$cmd_join`;
 
for my $l ( split /\n/, $buff ) {
    my $message = $l;
    my $cmd_notice = "$CURL -F channel=$channel -F message=\"${message}\" http://localhost:4979/notice";
    `$cmd_notice`;
}

次のような感じで使います.

% uptime | perl post-ikachan.pl --channel=\#server-status

結果はこんな感じ:

ss-1323117288

まとめ

ちょうど名言ぽいツイートが流れていたので,こちらに掲げさせていただきますw

IRCは開発ツールです。チャットツールではありません。そんなのはインターネット企業では誰もが知っている常識です。
Twitter / @Yappo: IRCは開発ツールです。チャットツールではありません …

おわりに

以上,IRC関連の各種ツールを使って,外部のサーバが自動的に私の手元に通知を届けるための環境づくりについて,個人的に試してみた記録でした.

まずはこんな感じの環境でいろいろサーバ内の情報を流してみた上で,また方針を検討してみたいと思ってます.あと,SSLな接続についても,ですね.

ネタバレ:イカちゃんかわいい,だけでなくて便利.

amazonさん