summaryrefslogtreecommitdiff
blob: 9ec79e6fbbb00f1d43b40e0c5d6455581c927bd2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/net-irc/ircd-hybrid/ircd-hybrid-7.0-r1.ebuild,v 1.7 2004/09/06 19:01:27 ciaranm Exp $

inherit eutils

MAX_NICK_LENGTH=30
MAX_CLIENTS=500
MAX_TOPIC_LENGTH=512
LARGE_NETWORK=
DISABLE_LARGE_NETWORK=1			# true
SMALL_NETWORK=1
DISABLE_SMALL_NETWORK=
ENABLE_POLL=1
DISABLE_POLL=
ENABLE_SELECT=
DISABLE_SELECT=1
ENABLE_EFNET=
ENABLE_RTSIGIO=
DISABLE_RTSIGIO=
ENABLE_SHARED=1
DISABLE_SHARED=
ENABLE_DEVPOLL=
DISABLE_DEVPOLL=1
ENABLE_KQUEUE=
DISABLE_KQUEUE=


IUSE="debug ipv6 ssl static zlib"

DESCRIPTION="IRCD-Hybrid - High Performance Internet Relay Chat"
HOMEPAGE="http://ircd-hybrid.com/"
SRC_URI="mirror://sourceforge/ircd-hybrid/${P}.tgz"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~x86 ~alpha ~ppc"

DEPEND="virtual/libc
	zlib? ( >=sys-libs/zlib-1.1.4-r1 )
	ssl? ( >=dev-libs/openssl-0.9.6j )
	|| ( >=dev-libs/libelf-0.8.2 >=dev-libs/elfutils-0.89 )
	>=sys-devel/flex-2.5.4a-r5
	>=sys-devel/bison-1.35
	>=sys-devel/gettext-0.11.5-r1
	>=sys-apps/sed-4.0.7"
RDEPEND=""

pkg_setup()
{
	# Create a dedicated user for running ircd. UID/GID combination was based
	# on some *BSD passwd files.
	if ! groupmod hybrid; then
		einfo "Creating hybrid group (gid=72)."
		groupadd hybrid -g 72 || die "failed to create group: hybrid (gid=72)"
	fi
	if ! id hybrid; then
		einfo "Creating hybrid user (uid=72)."
		useradd -d /usr/share/ircd-hybrid-7 -g hybrid -s /bin/false -u 72 hybrid \
			|| die "failed to create user: ircd (uid=72)"
	fi

	return 0
}

src_unpack()
{
	unpack ${A}
	cd ${S}

	# Patch Makefile.ins:
	# * Add includedir variable where to install headers.
	# * Remove creation of logdirs under prefix. Use /var/log/ircd instead.
	# * Remove symlinking which won't work in sandbox. Done in src_install().
	# Sed hardcoded CFLAGS to those in make.conf.
	patch -p1 < ${FILESDIR}/${P}.diff || die "patch failed"
	cp configure configure.dist
	sed -e "s:IRC_CFLAGS=\"-O2 -g \":IRC_CFLAGS=\"${CFLAGS}\":" \
		< configure.dist > configure

	# Store unmodified source tree for compiling necessary shared libs and
	# binaries with ipv6 support.
	if use ipv6; then
		mkdir ${T}/ipv6
		cp -r ${S} ${T}/ipv6
	fi
}

src_compile()
{
	local myconf

	ewarn "Server administrators are encouraged to customize some variables in"
	ewarn "the ebuild if actually deploying hybrid in an IRC network."
	ewarn "The values below reflect a usable configuration but may not be"
	ewarm "for large networks in production environments"
	ewarn "Portage overlay would be benificial for such a senario"
	ewarn
	ewarn "If you require more than 1024 clients per ircd enable poll() support"
	ewarn "or hybrid will not compile due to hard max file descriptor limits"
	ewarn "To change the default settings below you must edit the ebuild"
	ewarn
	ewarn "Maximum nick length       = ${MAX_NICK_LENGTH}"
	ewarn "        topic length      = ${MAX_TOPIC_LENGTH}"
	ewarn "        number of clients = ${MAX_CLIENTS}"
	ewarn
	if [ ${LARGE_NETWORK} ]; then
		ewarn "Configuring for large networks."
		myconf="--enable-large-net"
	fi
	if [ ${DISABLE_LARGE_NETWORK} ]; then
		ewarn "Disabling large networks."
		myconf="--disable-large-net"
	fi
	if [ ${SMALL_NETWORK} ]; then
		ewarn "Configuring for small networks."
		myconf="--enable-small-net"
	fi
	if [ ${DISABLE_SMALL_NETWORK} ]; then
		ewarn "Disabling small networks."
		myconf="--disable-small-net"
	fi
	if [ ${ENABLE_POLL} ]; then
		ewarn "Configuring with poll() enabled"
		myconf="--enable-poll"
	fi
	if [ ${DISABLE_POLL} ]; then
		ewarn "Configuring with poll() disabled"
		myconf="--disable-poll"
	fi
	if [ ${ENABLE_SELECT} ]; then
		ewarn "Configuring with select() enabled."
		myconf="--enable-select"
	fi
	if [ ${DISABLE_SELECT} ]; then
		ewarn "Configuring with select() disabled."
		myconf="--disable-select"
	fi
	if [ ${ENABLE_EFNET} ]; then
		ewarn "Configuring for Efnet."
		myconf="--enable-efnet"
	fi
	if [ ${ENABLE_RTSIGIO} ]; then
		ewarn "Configuring with Superior RTSIGIO."
		myconf="--enable-rtsigio"
	fi
	if [ ${DISABLE_RTSIGIO} ]; then
		ewarn "Disabling Superior RTSIGIO."
		myconf="--disable-rtsigio"
	fi
	if [ ${ENABLE_SHARED} ]; then
		ewarn "Configuring for non-Efnet."
		myconf="--enable-shared"
	fi
	if [ ${ENABLE_KQUEUE} ]; then
		ewarn "Configuring for Kqueue."
		myconf="--enable-kqueue"
	fi
	if [ ${DISABLE_KQUEUE} ]; then
		ewarn "Disabling Kqueue."
		myconf="--disable-kqueue"
	fi
	# Wait for admins to see the default variables.
	epause 5

	use debug || myconf="${myconf} --disable-assert"
	use ssl && myconf="${myconf} --enable-openssl"
	use static && myconf="${myconf} --disable-shared-modules"
	use zlib && myconf="${myconf} --enable-zlib"

	# Set ipv4 defaults to config.h.
	patch include/config.h ${FILESDIR}/config-ipv4.diff \
		|| die "ipv4 defaults patch failed"

	# Set prefix to /usr/share/ircd-hybrid-7 to save some patching.
	./configure \
		--prefix=/usr/share/ircd-hybrid-7 \
		--with-nicklen=${MAX_NICK_LENGTH} \
		--with-topiclen=${MAX_TOPIC_LENGTH} \
		--with-maxclients=${MAX_CLIENTS} ${myconf} || die "ipv4 config failed"
	emake || die "ipv4 make failed"

	# Enable help index.
	cd help
	make index || die "make index failed"
	cd ..

	# Build respond binary for using rsa keys instead of plain text oper 
	# passwords.
	use ssl && \
		gcc ${CFLAGS} -o respond tools/rsa_respond/respond.c -lcrypto

	# Configure and compile with ipv6 support in temp.
	if use ipv6; then
		einfo "IPv6 support"
		cd ${T}/ipv6/${P}

		# Set ipv6 defaults to config.h.
		patch include/config.h ${FILESDIR}/config-ipv6.diff \
			|| die "ipv6 defaults patch failed"

		./configure \
			--prefix=/usr/share/ircd-hybrid-7 \
			--with-nicklen=${MAX_NICK_LENGTH} \
			--with-topiclen=${MAX_TOPIC_LENGTH} \
			--with-maxclients=${MAX_CLIENTS} \
			--enable-ipv6 ${myconf} || die "ipv6 config failed"
		emake || die "ipv6 make failed"
	fi

	# Go back.
	cd ${S}
}

src_install()
{
	# Directories need to exist beforehand or the install will fail.
	dodir /usr/share/man/man8 \
	      /usr/lib/ircd-hybrid-7 \
	      /usr/include/ircd-hybrid-7 \
	      /var/log/ircd \
	      /var/run/ircd \
	      /etc/init.d \
	      /etc/conf.d

	# Override all install directories according to the patches with sandbox
	# prefix. 
	make prefix=${D}/usr/share/ircd-hybrid-7/ \
	     bindir=${D}/usr/sbin/ \
	     sysconfdir=${D}/etc/ircd/ \
	     moduledir=${D}/usr/lib/ircd-hybrid-7/ipv4 \
	     automoduledir=${D}/usr/lib/ircd-hybrid-7/ipv4/autoload/ \
	     messagedir=${D}/usr/share/ircd-hybrid-7/messages/ \
	     includedir=${D}/usr/include/ircd-hybrid-7 \
	     mandir=${D}/usr/share/man/man8/ \
	     install || die "ipv4 install failed"

	# Rename the binary according to config-ipv4.diff.
	mv ${D}/usr/sbin/ircd ${D}/usr/sbin/ircd-ipv4

	# Install the respond binary.
	if use ssl; then
		exeinto /usr/sbin
		doexe ${S}/respond
	fi

	# Do the symlinking.
	local link
	local symlinks="topic accept cjoin cmode admin names links away whowas \
	                version kick who invite quit join list nick oper part \
	                time credits motd userhost users whois ison lusers \
	                user help pass error challenge knock ping pong"
	for link in ${symlinks}; do
		dosym ../opers/$link /usr/share/ircd-hybrid-7/help/users/$link
	done
	dosym viconf /usr/sbin/vimotd
	dosym viconf /usr/sbin/viklines

	# Install documentation.
	dodoc BUGS ChangeLog Hybrid-team INSTALL LICENSE README.* RELNOTES TODO
	docinto doc
	dodoc doc/*.txt doc/README.cidr_bans doc/Tao-of-IRC.940110 \
	      doc/convertconf-example.conf doc/example.* doc/ircd.motd \
	      doc/simple.conf doc/server-version-info
	docinto doc/technical
	dodoc doc/technical/*

	# Fix the config files according to the patches.
	rm ${D}/etc/ircd/.convertconf-example.conf  # No need for 2 copies.
	local conf
	for conf in ${D}/etc/ircd/*.conf; do
		sed -e "s:/usr/local/ircd/modules:/usr/lib/ircd-hybrid-7/ipv4:g" \
			< ${conf} > ${conf/%.conf/-ipv4.conf}
		rm ${conf}
	done
	mv ${D}/etc/ircd/ircd.motd ${D}/etc/ircd/ircd-ipv4.motd

	# Only the shared libraries and the ircd binary differ from the ipv4
	# installation. Thus installing those is sufficient to make ipv6 support
	# work (and different config files, pid files etc. of cource). 
	if use ipv6; then
		cd ${T}/ipv6/${P}/modules
		make prefix=${D}/usr/share/ircd-hybrid-7/ \
			 moduledir=${D}/usr/lib/ircd-hybrid-7/ipv6 \
			 automoduledir=${D}/usr/lib/ircd-hybrid-7/ipv6/autoload/ \
			 install || die "ipv6 install failed"
		cp ../src/ircd ${D}/usr/sbin/ircd-ipv6

		# Fix the config files according to the patches.
		for conf in ${D}/etc/ircd/*.conf; do
			sed -e "s:ircd-hybrid-7/ipv4:ircd-hybrid-7/ipv6:g" \
				< ${conf} > ${conf/ipv4/ipv6}
		done
	fi

	# Install the init script and the respective config file.
	cp ${FILESDIR}/init.d_ircd ${D}/etc/init.d/ircd
	cp ${FILESDIR}/conf.d_ircd ${D}/etc/conf.d/ircd

	chmod +x ${D}/etc/init.d/ircd
	# Go back.
	cd ${S}
}

pkg_postinst()
{
	# Create the default config files out of example ones.
	cp /etc/ircd/example-ipv4.conf /etc/ircd/ircd-ipv4.conf
	if use ipv6; then
		cp /etc/ircd/example-ipv6.conf /etc/ircd/ircd-ipv6.conf
	fi

	chown -R ircd:ircd /etc/ircd /var/log/ircd /var/run/ircd
	chmod 700 /etc/ircd /var/log/ircd
	find /etc/ircd -type f -exec chmod 600 {} \;

	einfo "Modify /etc/ircd/ircd-{ipv4,ipv6}.conf and /etc/conf.d/ircd"
	einfo "otherwise the daemon(s) will quietly refuse to run."

	if use ssl; then
		einfo "To create a rsa keypair for crypted links execute:"
		einfo "ebuild /var/db/pkg/net-irc/${PF}/${PF}.ebuild config"
	fi
}

pkg_config()
{
	local proto="ipv4"
	[[ -x "/usr/sbin/ircd-ipv6" ]] && proto="ipv4 ipv6"

	local i
	for i in ${proto}; do
		einfo "Generating 2048 bit RSA keypair /etc/ircd/ircd-${i}.rsa"
		einfo "The public key is stored in /etc/ircd/ircd-${i}.pub."

		openssl genrsa -rand /var/run/random-seed \
			-out /etc/ircd/ircd-${i}.rsa 2048
		openssl rsa -in /etc/ircd/ircd-${i}.rsa -pubout \
			-out /etc/ircd/ircd-${i}.pub
		chown ircd:ircd /etc/ircd/ircd-${i}.rsa /etc/ircd/ircd-${i}.pub
		chmod 600 /etc/ircd/ircd-${i}.rsa
		chmod 644 /etc/ircd/ircd-${i}.pub

		einfo "Update the rsa keypair in /etc/ircd/ircd-${i}.conf and /REHASH."
	done
}

# vim:ts=4