読者です 読者をやめる 読者になる 読者になる

海馬のかわり

最近記憶力に難がある、地方在住サーバエンジニアの備忘録です。

キーワードに反応しシェルコマンドを実行するだけのTiarra用モジュール(Auto::RunCMD)

職場の業務連絡にはIRCを使用していますが、特定のキーワード(例えば名前やシステムの障害通知)が流れた際に、シェルスクリプトをキックして自動処理させるためのIRC Proxy Tiarra用モジュールを用意しました。

今回は面白法人カヤックさんのAuto::IMモジュールをひな形に、ごにょっとさせていただきました。ありがとうございます。

RunCMD.pm
tiarraを格納したディレクトリのmodule/Auto以下に保存します。

# -----------------------------------------------------------------------------
# $Id$
# -----------------------------------------------------------------------------
package Auto::RunCMD;
use strict;
use warnings;
use base qw(Module);
use Module::Use qw(Auto::AliasDB Auto::Utils);
use Auto::AliasDB;
use Auto::Utils;

sub new {
  my ($class) = shift;
  my $this = $class->SUPER::new(@_);

  $this->config_reload(undef);

  return $this;
}

sub config_reload {
  my ($this, $old_config) = @_;

  my $regex = join '|', (
    (map { "(?:$_)" } $this->config->regex_keyword('all')),
    (map { "(?i:\Q$_\E)" } map { split /,/ } $this->config->keyword('all')),
   );
  eval {
    $this->{regex} = qr/$regex/;
  }; if ($@) {
    $this->_runloop->notify_error($@);
  }

  return $this;
}

sub message_arrived {
  my ($this,$msg,$sender) = @_;
  my @result = ($msg);

  # サーバーからのメッセージか?
  if ($sender->isa('IrcIO::Server')) {
      # PRIVMSGか?
      if ($msg->command eq 'PRIVMSG') {
          my $text = $msg->param(1);
          my $full_ch_name = $msg->param(0);

          if ($text =~ $this->{regex} && Mask::match_deep_chan(
              [Mask::array_or_all_chan($this->config->mask('all'))],
              $msg->prefix,$full_ch_name)) {
              my $run_command = system $this->config->command;
          }
      }
  }

  return @result;
}

1;

=pod
info: 特定のキーワードが呼ばれると、指定のシェルコマンドを実行する。
default: off

# 反応する人のマスクを指定します。
# 省略すると全員に反応します。
mask: * *!*@*

# 反応するキーワードを正規表現で指定します。
# 複数指定したい時は複数行指定してください。
-regex-keyword: (?i:fugahoge)

# 反応するキーワードを指定します。
# 複数指定したい時は,(コンマ)で区切るか、複数行指定してください。
keyword: hoge
keyword: 日本語,テスト

# 実行するシェルコマンドを指定します。
# コマンドは、ワンライナーで記述し、()で綴じてください。
# キーワードにマッチする度に何度でも実行されるので、困る場合は
# スクリプトをキックするようにして、そちら側で制御してください。
command: (echo hogehoge >> /tmp/hoge.txt)

=cut

tiarra.conf
下記を追記します。

+ Auto::RunCMD {
  # 特定のキーワードが呼ばれると、指定のシェルコマンドを実行する

  # 反応する人のマスクを指定します。
  # 省略すると全員に反応します。
  mask: * *!*@*

  # 反応するキーワードを正規表現で指定します。
  # 複数指定したい時は複数行指定してください。
  -regex-keyword: (?i:fugahoge)

  # 反応するキーワードを指定します。
  # 複数指定したい時は,(コンマ)で区切るか、複数行指定してください。
  keyword: hoge
  keyword: 日本語,テスト

  # 実行するシェルコマンドを指定します。
  # コマンドは、ワンライナーで記述し、()で綴じてください。
  # キーワードにマッチする度に何度でも実行されるので、困る場合は
  # スクリプトをキックするようにして、そちら側で制御してください。
  command: (echo hogehoge >> /tmp/hoge.txt)
}

以上