また古いサーバの構築です。昔に使われていたチャットサーバですね。今でいうところのslackに近いのかな。
パッケージがあるかどうか確認します。
[root@ace ~]# dnf info ngircd
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 2:44:32 前の 2024年02月07日 05時09分27秒 に実施 しました。
利用可能なパッケージ
名前 : ngircd
バージョン : 26.1
リリース : 8.el9
Arch : x86_64
サイズ : 202 k
ソース : ngircd-26.1-8.el9.src.rpm
リポジトリー : epel
概要 : Next Generation IRC Daemon
URL : http://ngircd.barton.de/
ライセンス : GPLv2+
説明 : ngIRCd is a free open source daemon for Internet Relay Chat
: (IRC), developed under the GNU General Public License (GPL). It's
: written from scratch and is not based upon the original IRCd like
: many others.
[root@ace ~]#
ngircdのパッケージがありました。
パッケージからインストール
[root@ace ~]# dnf install ngircd
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 2:46:35 前の 2024年02月07日 05時09分27秒 に実施 しました。
依存関係が解決しました。
================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
================================================================================
インストール:
ngircd x86_64 26.1-8.el9 epel 202 k
トランザクションの概要
================================================================================
インストール 1 パッケージ
ダウンロードサイズの合計: 202 k
インストール後のサイズ: 580 k
これでよろしいですか? [y/N]: y
:
略
:
インストール済み:
ngircd-26.1-8.el9.x86_64
完了しました!
[root@ace ~]#
完了!コンパイルするよりすごい楽です。
テキトーに環境設定
ircサーバは通常、他のサーバと接続してサーバ間でもチャットができるようにするのですが、ここでは他のサーバと連携しないので、誰にも迷惑をかけないということで、適当に設定しておきます。
[root@ace ~]# ls -l /etc/ngircd.conf
-rw-rw---- 1 root ngircd 15335 6月 12 2023 /etc/ngircd.conf
[root@ace ~]# cp -p /etc/ngircd.conf /etc/ngircd.conf.orig
[root@ace ~]# vi /etc/ngircd.conf
[root@ace ~]# diff /etc/ngircd.conf /etc/ngircd.conf.orig
28c28
< Name = irc.zeke.ne.jp
---
> Name = irc.example.net
32c32
< AdminInfo1 = ZEKE Network
---
> ;AdminInfo1 = Description
34c34
< AdminEMail = zeke@mail.zeke.ne.jp
---
> ;AdminEMail = admin@irc.server
42c42
< Info = ZEKE Network
---
> Info = Server Info Text
48c48
< Listen = ::,0.0.0.0
---
> Listen = 127.0.0.1
52c52
< MotdFile = /etc/ngircd.motd
---
> ;MotdFile = /etc/ngircd.motd
61c61
< Network = ZEKE_Network
---
> ;Network = aIRCnetwork
186c186
< DNS = no
---
> ;DNS = yes
191c191
< Ident = no
---
> ;Ident = yes
[root@ace ~]#
「/etc/ngircd.conf」が設定ファイルなので、これを書き換えます。替えたのは名前の部分と、外部からの受付許可(IPv6を含む)と、「MotdFile」(ユーザが接続したときに表示するメッセージ)と、DNSによる逆引きとIdent(ユーザ名の調査)を無効にしたことです。Identはconfigureで無効にしていますが、現行の記述をそのまま引き継いでます。
[root@ace ~]# id ngircd
uid=990(ngircd) gid=990(ngircd) groups=990(ngircd)
[root@ace ~]# scp -p ns.zeke.ne.jp:/etc/ngircd.motd /etc/ngircd.motd
root@ns.zeke.ne.jp's password:
ngircd.motd 100% 556 381.2KB/s 00:00
[root@ace ~]# cat /etc/ngircd.motd
このIRCサーバーはZEKE Networkにて動いています。
サーバーの管理上の都合などにより予告なく停止や再立ち上げ
などを行なうことがあります。
channelやnicknameに関するトラブルなどは一切関知しません。
システムへの悪影響を与えること及びその他の理由などにより
管理上の判断によって種々の接続制限を行なうことがあります。
IRC関係のファイルについては、
ftp://ftp.kyoto.wide.ad.jp/IRC/
などをご参考下さい。
IRC関係のweb pageとして、次のものがあります。
http://irc.kyoto-u.ac.jp/
[root@ace ~]# ls -l /etc/ngircd.motd
-rw-r--r-- 1 root root 556 6月 11 2017 /etc/ngircd.motd
[root@ace ~]# ls -l /etc/ngircd.conf
-rw-rw---- 1 root ngircd 15328 2月 7 08:05 /etc/ngircd.conf
[root@ace ~]# chgrp ngircd /etc/ngircd.motd
[root@ace ~]# chmod 660 /etc/ngircd.motd
[root@ace ~]# ls -l /etc/ngircd.motd
-rw-rw---- 1 root ngircd 556 6月 11 2017 /etc/ngircd.motd
[root@ace ~]#
ngircdのユーザ、グループがあることを確認します。
「/etc/ngircd.motd」は現行のサーバからコピーしました。日本語メッセージの文字コードはISO-2022-JP(JIS)コードになってます。権限はngircd.motdと合わせておきました。
試しに動作確認
[root@ace ~]# systemctl status ngircd
○ ngircd.service - Next Generation IRC Daemon
Loaded: loaded (/usr/lib/systemd/system/ngircd.service; disabled; preset: >
Active: inactive (dead)
Docs: man:ngircd(8)
man:ngircd.conf(5)
http://ngircd.barton.de/documentation.php.en
[root@ace ~]# systemctl enable ngircd
Created symlink /etc/systemd/system/multi-user.target.wants/ngircd.service → /usr/lib/systemd/system/ngircd.service.
[root@ace ~]# systemctl start ngircd
[root@ace ~]# systemctl status ngircd
● ngircd.service - Next Generation IRC Daemon
Loaded: loaded (/usr/lib/systemd/system/ngircd.service; enabled; preset: d>
Active: active (running) since Wed 2024-02-07 08:28:31 JST; 25s ago
Docs: man:ngircd(8)
man:ngircd.conf(5)
http://ngircd.barton.de/documentation.php.en
Main PID: 1674 (ngircd)
Tasks: 1 (limit: 23114)
Memory: 856.0K
CPU: 7ms
CGroup: /system.slice/ngircd.service
mq1674 /usr/sbin/ngircd -n
2月 07 08:28:31 ace.zeke.ne.jp systemd[1]: Started Next Generation IRC Daemon.
2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:5 0] ngIRCd 26.1-IPv6+IR>
2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:6 0] Using configuration>
2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:6 0] Running as user ngi>
2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:6 0] Not running with ch>
2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:6 0] IO subsystem: epoll>
2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:6 0] Now listening on [0>
2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:6 0] Now listening on [0>
2月 07 08:28:31 ace.zeke.ne.jp ngircd[1674]: [1674:5 0] Server "irc.zeke.ne>
[root@ace ~]#
とりあえず「systemctl enable ngircd」で自動起動を有効にし、「systemctl start ngircd」コマンドで立ち上げてみて、動作確認です。
ちゃんとつながって、日本語メッセージも正しく表示されるようですね。
こんな感じで、自動起動設定を書きました。
Firewallの穴あけ
[root@ace ~]# ss -natup|grep ircd
tcp LISTEN 0 10 0.0.0.0:6667 0.0.0.0:* users:(("ngircd",pid=1674,fd=7))
tcp ESTAB 0 0 192.168.1.1:6667 192.168.1.88:1074 users:(("ngircd",pid=1674,fd=8))
tcp LISTEN 0 10 [::]:6667 [::]:* users:(("ngircd",pid=1674,fd=6))
[root@ace ~]#
で、ポートの確認をして
[root@ace ~]# firewall-cmd --zone=public --permanent --add-service=irc
success
[root@ace ~]# firewall-cmd --reload
success
[root@ace ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3
sources:
services: dns irc ssh
ports: 5500-5501/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@ace ~]#
[root@ace ~]# cat /usr/lib/firewalld/services/irc.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>IRC</short>
<description>An IRCd, short for Internet Relay Chat daemon, is server software that implements the IRC protocol.</description>
<port protocol="tcp" port="6667"/>
</service>
[root@ace ~]#
で、バッチリです。
おまけ
ircのbotとして、c言語で書かれている1995年製の
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
_/ HOFBOT IS DEDICATED TO DREAM DELTA GROUP _/
_/THIS HOFBOT V1.03F DOES NOT CONTAIN ANY BACKDOORS OR WHAT SO EVER. _/
_/THERE ARE TWO WAYS TO GET THE NEWEST HOFBOT VERSION OR OTHER HOFBOT _/
_/RELATED INFORMATION: _/
_/1. VIA BOT(S) IN #HOF OR #HOFBOT ON IRC(efnet or undernet) _/
_/2. HTTP://WWW.UG.CS.SUNYSB.EDU/~POONJ/HOFBOT.HTML -*HOF*- _/
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
を使っているのだけど、RHEL9でコンパイルすると
hofbot.c: 関数 ‘add_bot’ 内:
hofbot.c:113:36: エラー: expected identifier before ‘restrict’
113 | thebots[i].restrict = 0;
| ^~~~~~~~
こんなエラーが出るようになりました。CentOS 7では大丈夫だったので、gccの仕様が変わった模様。
[zeke@ace source]$ grep hof_restrict *
commands.c: if (current->hof_restrict)
commands.c: current->hof_restrict);
commands.c: if (current->hof_restrict)
commands.c: current->hof_restrict);
commands.c: current->hof_restrict = newlevel;
hof-ons.c: if ((max_userlevel(from) < current->hof_restric ) &&
hof-ons.c: send_to_user(from, "[zeke@ace source]$ grep hof_restrict *
commands.c: if (current->hof_restrict)
commands.c: current->hof_restrict);
commands.c: if (current->hof_restrict)
commands.c: current->hof_restrict);
commands.c: current->hof_restrict = newlevel;
hof-ons.c: if ((max_userlevel(from) < current->hof_restric ) &&
hof-ons.c: send_to_user(from, "\002Sorry, I'm being restricted to at least level %i\002", current->hof_restrict);
hofbot.c: thebots[i].hof_restrict = 0;
hofbot.h: int hof_restrict;
[zeke@ace source]$
2Sorry, I'm being restricted to at least level %i[zeke@ace source]$ grep hof_restrict *
commands.c: if (current->hof_restrict)
commands.c: current->hof_restrict);
commands.c: if (current->hof_restrict)
commands.c: current->hof_restrict);
commands.c: current->hof_restrict = newlevel;
hof-ons.c: if ((max_userlevel(from) < current->hof_restric ) &&
hof-ons.c: send_to_user(from, "\002Sorry, I'm being restricted to at least level %i\002", current->hof_restrict);
hofbot.c: thebots[i].hof_restrict = 0;
hofbot.h: int hof_restrict;
[zeke@ace source]$
2", current->hof_restrict);
hofbot.c: thebots[i].hof_restrict = 0;
hofbot.h: int hof_restrict;
[zeke@ace source]$
どうも「restrict」を変数として使っていたのに、予約語にされてしまったっぽいので、変数名を「hof_restrict」に変更してみたら、コンパイルが通ってちゃんと動いているみたい。
うーむ、適当だ。
ちなみにこのプログラム、1日1回ログを取るためにファイルをオープンするのだけど、ログファイルのクローズをしないために、ファイルディスクリプタを食いつぶして、プロバイダの共用サーバを止めちゃったといういわくつきです。
自力でなんとかバグ修正して、自宅サーバで動かしてます。
お勧めのKindle本です!
コメント