summaryrefslogtreecommitdiff
blob: 62eb9c616886524e3175d7d466b482c440bc32bd (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
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI=5
PYTHON_COMPAT=( python2_7 )

inherit autotools eutils multilib python-single-r1 ssl-cert toolchain-funcs

DESCRIPTION="The Internet News daemon, fully featured NNTP server"
HOMEPAGE="https://www.isc.org/software/inn"
SRC_URI="ftp://ftp.isc.org/isc/inn/${P}.tar.gz"

# GPL-2 only for init script
LICENSE="ISC GPL-2+ public-domain BSD-4 BSD-2 RSA BSD MIT GPL-2"
SLOT="0"
KEYWORDS="~amd64 ~ppc ~x86"
IUSE="berkdb innkeywords inntaggedhash ipv6 kerberos perl python sasl ssl"

REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"

DEPEND="
	virtual/mta
	dev-perl/MIME-tools
	sys-libs/pam
	sys-libs/zlib
	kerberos? ( virtual/krb5 )
	sasl? ( >=dev-libs/cyrus-sasl-2 )
	ssl? ( dev-libs/openssl )
	python? ( ${PYTHON_DEPS} )
	berkdb? ( sys-libs/db )
"
RDEPEND="${DEPEND}"

pkg_setup() {
	use python && python-single-r1_pkg_setup
}

src_prepare() {
	epatch "${FILESDIR}"/${P}-ar.patch
	epatch "${FILESDIR}"/${P}-tests.patch

	sed -e 's: -B .OLD::' -i Makefile.global.in || die

	# Do not treat LDFLAGS as if it contained libraries to link to
	sed -e 's:LDFLAGS::g' -i m4/python.m4 || die

	# We do not have the biff service, but we do have comsat
	sed -e 's:"biff":"comsat":g' -i tests/lib/getnameinfo-t.c || die

	eautoreconf
}

src_configure() {
	tc-export AR

	econf \
		--prefix=/usr/$(get_libdir)/news \
		--sysconfdir=/etc/news \
		--mandir=/usr/share/man \
		--infodir=/usr/share/info \
		--with-control-dir=/usr/$(get_libdir)/news/bin/control \
		--with-filter-dir=/usr/$(get_libdir)/news/bin/filter \
		--with-db-dir=/var/spool/news/db \
		--with-doc-dir=/usr/share/doc/${PF} \
		--with-spool-dir=/var/spool/news \
		--with-log-dir=/var/log/news \
		--with-run-dir=/run/news \
		--with-tmp-dir=/var/spool/news/tmp \
		--disable-libtool \
		--with-gnu-ld \
		--enable-setgid-inews \
		--enable-uucp-rnews \
		$(use_with perl) \
		$(use_with python) \
		$(use_with kerberos kerberos /usr) \
		$(use_with sasl) \
		$(use_with ssl openssl) \
		$(use_with berkdb berkeleydb /usr) \
		$(use_enable ipv6) \
		$(use_enable !inntaggedhash largefiles) \
		$(use_enable inntaggedhash tagged-hash) \
		$(use_enable innkeywords keywords)
}

src_install() {
	emake DESTDIR="${D}/" P="" SPECIAL="" install

	chown -R root:0 \
		"${D}"/usr/$(get_libdir)/news/$(get_libdir) \
		"${D}"/usr/$(get_libdir)/news/include \
		"${D}"/usr/share/doc \
		"${D}"/usr/share/man \
		|| die
	chmod 644 "${D}"/etc/news/* || die
	chmod 640 \
		"${D}"/etc/news/control.ctl \
		"${D}"/etc/news/expire.ctl \
		"${D}"/etc/news/incoming.conf \
		"${D}"/etc/news/innfeed.conf \
		"${D}"/etc/news/nntpsend.ctl \
		"${D}"/etc/news/passwd.nntp \
		"${D}"/etc/news/readers.conf \
		|| die

	# Prevent old db/* files from being overwritten
	insinto /usr/share/inn/dbexamples
	newins site/active.minimal active
	newins site/newsgroups.minimal newsgroups

	keepdir \
		/var/log/news \
		/var/spool/news/archive \
		/var/spool/news/articles \
		/var/spool/news/db \
		/var/spool/news/incoming \
		/var/spool/news/incoming/bad \
		/var/spool/news/innfeed \
		/var/spool/news/outgoing \
		/var/spool/news/overview \
		/var/spool/news/tmp

	fowners news:news /var/log/news

	dodoc ChangeLog MANIFEST README* doc/checklist
	use ipv6 && dodoc doc/IPv6-info

	# So other programs can build against INN
	insinto /usr/$(get_libdir)/news/include
	doins include/*.h

	newinitd "${FILESDIR}"/innd-r1 innd
}

pkg_postinst() {
	for db_file in active newsgroups
	do
		[[ -f ${ROOT}var/spool/news/db/${db_file} ]] && continue

		if [[ -f ${ROOT}usr/share/inn/dbexamples/${db_file} ]]
		then
			cp "${ROOT}"usr/share/inn/dbexamples/${db_file} \
				"${ROOT}"var/spool/news/db/${db_file}
		else
			touch "${ROOT}"var/spool/news/db/${db_file}
		fi

		chown news:news "${ROOT}"var/spool/news/db/${db_file}
		chmod 664 "${ROOT}"var/spool/news/db/${db_file}
	done

	elog "It is recommended to run emerge --config ${CATEGORY}/${PN}"
	elog "now to finish setting up this package."
	elog
	elog "Do not forget to update your cron entries, and also run"
	elog "makedbz if you need to.  If this is a first-time installation"
	elog "a minimal active file has been installed.  You will need to"
	elog "touch history and run 'makedbz -i' to initialize the history"
	elog "database.  See INSTALL for more information."
	elog
	elog "You need to assign a real shell to the news user, or else"
	elog "starting inn will fail. You can use 'usermod -s /bin/bash news'"
	elog "for this."

	if use ssl
	then
		install_cert /etc/news/cert/cert
		chown news:news \
			"${ROOT}"etc/news/cert/cert.{crt,csr,key,pem}

		elog
		elog "You may want to start nnrpd manually for native ssl support."
		elog "If you choose to do so, automating this with a bootscript might"
		elog "also be a good choice."
		elog "Have a look at man nnrpd for valid parameters."
		elog
		elog "The certificate location in /etc/news/sasl.conf has been changed"
		elog "to /etc/news/cert!"

	fi
}

pkg_postrm() {
	elog
	elog "If you want your newsspool or altered configuration files"
	elog "to be removed, please do so now manually."
	elog
}

pkg_config() {
	NEWSSPOOL_DIR="${ROOT}var/spool/news"
	NEWS_SHELL="$( awk -F':' '/^news:/ {print $7;}' ${ROOT}etc/passwd )"
	NEWS_ERRFLAG="0"

	if [[ ${NEWS_SHELL} == /bin/false || ${NEWS_SHELL} == /dev/null ]]; then
		einfo "Changing shell to /bin/bash for user news..."
		usermod -s /bin/bash news
	else
		einfo "Shell for user news unchanged ('${NEWS_SHELL}')."
		if [[ ${NEWS_SHELL} != /bin/sh && ${NEWS_SHELL} != /bin/bash ]]; then
			ewarn "You might want to change it to '/bin/bash', though."
		fi
	fi

	if [[ ! -e ${NEWSSPOOL_DIR}/db/history ]]; then
		if [[ ! -f ${NEWSSPOOL_DIR}/db/history.dir \
			&& ! -f ${NEWSSPOOL_DIR}/db/history.pag \
			&& ! -f ${NEWSSPOOL_DIR}/db/history.hash \
			&& ! -f ${NEWSSPOOL_DIR}/db/history.index ]]
		then
			einfo "Building history database ..."

			touch "${NEWSSPOOL_DIR}"/db/history
			chown news:news "${NEWSSPOOL_DIR}"/db/history
			chmod 644 "${NEWSSPOOL_DIR}"/db/history

			einfo "Running makedbz -i ..."
			su - news -c "/usr/$(get_libdir)/news/bin/makedbz -i"

			einfo "Moving files into place ..."
			[[ -f ${NEWSSPOOL_DIR}/db/history.n.dir ]] && \
				mv -vf "${NEWSSPOOL_DIR}"/db/history.n.dir \
				"${NEWSSPOOL_DIR}"/db/history.dir
			[[ -f ${NEWSSPOOL_DIR}/db/history.n.pag ]] && \
				mv -vf "${NEWSSPOOL_DIR}"/db/history.n.pag \
				"${NEWSSPOOL_DIR}"/db/history.pag
			[[ -f ${NEWSSPOOL_DIR}/db/history.n.hash ]] && \
				mv -vf "${NEWSSPOOL_DIR}"/db/history.n.hash \
				"${NEWSSPOOL_DIR}"/db/history.hash
			[[ -f ${NEWSSPOOL_DIR}/db/history.n.index ]] && \
				mv -vf "${NEWSSPOOL_DIR}"/db/history.n.index \
				"${NEWSSPOOL_DIR}"/db/history.index

			einfo "Running makehistory ..."
			su - news -c /usr/$(get_libdir)/news/bin/makehistory
		else
			NEWS_ERRFLAG="1"
			eerror "Your installation seems to be screwed up."
			eerror "${NEWSSPOOL_DIR}/db/history does not exist, but there's"
			eerror "one of the files history.dir, history.hash or history.index"
			eerror "within ${NEWSSPOOL_DIR}/db."
			eerror "Use your backup to restore the history database."
		fi
	else
		einfo "${NEWSSPOOL_DIR}/db/history found."
		einfo "Leaving history database as it is."
	fi

	INNCFG_INODES=$(
		sed /etc/news/inn.conf \
			-e '/innwatchspoolnodes/ ! d; s:[^ ]*[ ]*\([^ ]*\):\1:'
	)
	INNSPOOL_INODES=$(
		df -Pi ${NEWSSPOOL_DIR} | \
			sed -e 's:[^ ]*[ ]*\([^ ]*\).*:\1:; 1 d'
	)
	if [[ ${INNCFG_INODES} -gt ${INNSPOOL_INODES} ]]; then
		ewarn "Setting innwatchspoolinodes to zero, because the filesystem behind"
		ewarn "$NEWSSPOOL_DIR works without inodes."
		ewarn
		cp /etc/news/inn.conf /etc/news/inn.conf.OLD
		einfo "A copy of your old inn.conf has been saved to /etc/news/inn.conf.OLD."
		sed -i /etc/news/inn.conf \
			-e '/innwatchspoolnodes/ s:\([^ ]*\)\([ ]*\).*:\1\20:'
		chown news:news /etc/news/inn.conf
		chmod 644 /etc/news/inn.conf
	fi

	INNCHECK_LINES=$(
		su - news -c "/usr/$(get_libdir)/news/bin/inncheck | wc -l"
	)
	if [[ ${INNCHECK_LINES} -gt 0 ]]; then
		NEWS_ERRFLAG="1"
		ewarn "inncheck most certainly found an error."
		ewarn "Please check its output:"
		eerror "`su - news -c /usr/$(get_libdir)/news/bin/inncheck`"
	fi

	if [[ ${NEWS_ERRFLAG} -gt 0 ]]; then
		eerror "There were one or more errors/warnings checking your"
		eerror "configuration. Please read inn's documentation and"
		eerror "fix them accordingly."
	else
		einfo "INN configuration tests passed successfully."
		ewarn "Please ensure you have configured inn properly."
	fi
}