app-backup/backupninja: bump to 1.1.0
[gentoo.git] / app-backup / amanda / amanda-3.4.1.ebuild
1 # Copyright 1999-2020 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
3
4 EAPI=6
5 inherit autotools perl-module user systemd toolchain-funcs
6
7 DESCRIPTION="The Advanced Maryland Automatic Network Disk Archiver"
8 HOMEPAGE="http://www.amanda.org/"
9 SRC_URI="mirror://sourceforge/amanda/${P}.tar.gz"
10
11 LICENSE="HPND BSD BSD-2 GPL-2+ GPL-3+"
12 SLOT="0"
13 IUSE="curl gnuplot ipv6 kerberos minimal nls readline s3 samba systemd xfs"
14
15 KEYWORDS="~amd64 ~ppc ~ppc64 ~sparc ~x86"
16 RDEPEND="sys-libs/readline:=
17         virtual/awk
18         app-arch/tar
19         dev-lang/perl:=
20         app-arch/dump
21         net-misc/openssh
22         >=dev-libs/glib-2.26.0
23         dev-perl/JSON
24         dev-perl/Encode-Locale
25         nls? ( virtual/libintl )
26         s3? ( >=net-misc/curl-7.10.0 )
27         !s3? ( curl? ( >=net-misc/curl-7.10.0 ) )
28         samba? ( net-fs/samba:= )
29         kerberos? ( app-crypt/mit-krb5 )
30         xfs? ( sys-fs/xfsdump )
31         !minimal? (
32                 dev-perl/XML-Simple
33                 virtual/mailx
34                 app-arch/mt-st:=
35                 sys-block/mtx
36                 gnuplot? ( sci-visualization/gnuplot )
37                 app-crypt/aespipe
38                 app-crypt/gnupg
39         )"
40
41 DEPEND="${RDEPEND}
42         virtual/pkgconfig
43         nls? ( sys-devel/gettext )
44         >=app-text/docbook-xsl-stylesheets-1.72.0
45         app-text/docbook-xml-dtd
46         dev-libs/libxslt
47         dev-lang/swig
48         "
49
50 MYFILESDIR="${T}/files"
51 ENVDIR="/etc/env.d"
52 ENVDFILE="97amanda"
53 TMPENVFILE="${T}/${ENVDFILE}"
54
55 # This is a complete list of Amanda settings that the ebuild takes from the
56 # build environment. This allows users to alter the behavior of the package as
57 # upstream intended, but keeping with Gentoo style. We store a copy of them in
58 # /etc/env.d/97amanda during the install, so that they are preserved for future
59 # installed. This variable name must not start with AMANDA_, as we do not want
60 # it captured into the env file.
61 ENV_SETTINGS_AMANDA="
62 AMANDA_GROUP_GID AMANDA_GROUP_NAME
63 AMANDA_USER_NAME AMANDA_USER_UID AMANDA_USER_SH AMANDA_USER_HOMEDIR AMANDA_USER_GROUPS
64 AMANDA_SERVER AMANDA_SERVER_TAPE AMANDA_SERVER_TAPE_DEVICE AMANDA_SERVER_INDEX
65 AMANDA_TAR_LISTDIR AMANDA_TAR
66 AMANDA_PORTS_UDP AMANDA_PORTS_TCP AMANDA_PORTS_BOTH AMANDA_PORTS
67 AMANDA_CONFIG_NAME AMANDA_TMPDIR"
68
69 amanda_variable_setup() {
70
71         # Setting vars
72         local currentamanda
73
74         # Grab the current settings
75         currentamanda="$(set | egrep "^AMANDA_" | grep -v '^AMANDA_ENV_SETTINGS' | xargs)"
76
77         # First we set the defaults
78         [[ -z "${AMANDA_GROUP_GID}" ]] && AMANDA_GROUP_GID=87
79         [[ -z "${AMANDA_GROUP_NAME}" ]] && AMANDA_GROUP_NAME=amanda
80         [[ -z "${AMANDA_USER_NAME}" ]] && AMANDA_USER_NAME=amanda
81         [[ -z "${AMANDA_USER_UID}" ]] && AMANDA_USER_UID=87
82         [[ -z "${AMANDA_USER_SH}" ]] && AMANDA_USER_SH=/bin/bash
83         [[ -z "${AMANDA_USER_HOMEDIR}" ]] && AMANDA_USER_HOMEDIR=/var/spool/amanda
84         [[ -z "${AMANDA_USER_GROUPS}" ]] && AMANDA_USER_GROUPS="${AMANDA_GROUP_NAME}"
85
86         # This installs Amanda, with the server. However, it could be a client,
87         # just specify an alternate server name in AMANDA_SERVER.
88         [[ -z "${AMANDA_SERVER}" ]] && AMANDA_SERVER="${HOSTNAME}"
89         [[ -z "${AMANDA_SERVER_TAPE}" ]] && AMANDA_SERVER_TAPE="${AMANDA_SERVER}"
90         [[ -z "${AMANDA_SERVER_TAPE_DEVICE}" ]] && AMANDA_SERVER_TAPE_DEVICE="/dev/nst0"
91         [[ -z "${AMANDA_SERVER_INDEX}" ]] && AMANDA_SERVER_INDEX="${AMANDA_SERVER}"
92         [[ -z "${AMANDA_TAR_LISTDIR}" ]] && AMANDA_TAR_LISTDIR=${AMANDA_USER_HOMEDIR}/tar-lists
93         [[ -z "${AMANDA_CONFIG_NAME}" ]] && AMANDA_CONFIG_NAME=DailySet1
94         [[ -z "${AMANDA_TMPDIR}" ]] && AMANDA_TMPDIR=/var/tmp/amanda
95         [[ -z "${AMANDA_DBGDIR}" ]] && AMANDA_DBGDIR="$AMANDA_TMPDIR"
96         # These are left empty by default
97         [[ -z "${AMANDA_PORTS_UDP}" ]] && AMANDA_PORTS_UDP=
98         [[ -z "${AMANDA_PORTS_TCP}" ]] && AMANDA_PORTS_TCP=
99         [[ -z "${AMANDA_PORTS_BOTH}" ]] && AMANDA_PORTS_BOTH=
100         [[ -z "${AMANDA_PORTS}" ]] && AMANDA_PORTS=
101
102         # What tar to use
103         [[ -z "${AMANDA_TAR}" ]] && AMANDA_TAR=/bin/tar
104
105         # Now pull in the old stuff
106         if [[ -f "${EROOT}${ENVDIR}/${ENVDFILE}" ]]; then
107                 # We don't just source it as we don't want everything in there.
108                 eval $(egrep "^AMANDA_" "${EROOT}${ENVDIR}/${ENVDFILE}" | grep -v '^AMANDA_ENV_SETTINGS')
109         fi
110
111         # Re-apply the new settings if any
112         [ -n "${currentamanda}" ] && eval $(echo "${currentamanda}")
113
114 }
115
116 pkg_setup() {
117         amanda_variable_setup
118
119         # If USE=minimal, give out a warning, if AMANDA_SERVER is not set to
120         # another host than HOSTNAME.
121         if use minimal && [ "${AMANDA_SERVER}" = "${HOSTNAME}" ] ; then
122                 elog "You are installing a client-only version of Amanda."
123                 elog "You should set the variable \$AMANDA_SERVER to point at your"
124                 elog "Amanda-tape-server, otherwise you will have to specify its name"
125                 elog "when using amrecover on the client."
126                 elog "For example: Use something like"
127                 elog "AMANDA_SERVER=\"myserver\" emerge amanda"
128                 elog
129         fi
130
131         enewgroup "${AMANDA_GROUP_NAME}" "${AMANDA_GROUP_GID}"
132         enewuser "${AMANDA_USER_NAME}" "${AMANDA_USER_UID}" "${AMANDA_USER_SH}" "${AMANDA_USER_HOMEDIR}" "${AMANDA_USER_GROUPS}"
133 }
134
135 src_unpack() {
136         # we do not want the perl src_unpack
137         default_src_unpack
138 }
139
140 src_prepare() {
141         # gentoo bug #331111
142         sed -i '/^check-local: check-perl$/d' "${S}"/config/automake/scripts.am || die
143         sed -i '/^check-local:/s,syntax-check,,g' "${S}"/perl/Makefile.am || die
144
145         # bug with glibc-2.16.0
146         sed -i -e '/gets is a security/d' "${S}"/gnulib/stdio.in.h || die
147
148         eautoreconf
149
150         # places for us to work in
151         mkdir -p "${MYFILESDIR}" || die
152         # Now we store the settings we just created
153         set | egrep "^AMANDA_" | grep -v '^AMANDA_ENV_SETTINGS' > "${TMPENVFILE}" || die
154
155         # Prepare our custom files
156         einfo "Building custom configuration files"
157         local i # our iterator
158         local sedexpr # var for sed expr
159         sedexpr=''
160         for i in ${ENV_SETTINGS_AMANDA} ; do
161                 local val
162                 eval "val=\"\${${i}}\""
163                 sedexpr="${sedexpr}s|__${i}__|${val}|g;"
164         done
165
166         # now apply the sed expr
167         for i in "${FILESDIR}"/amanda-* ; do
168                 sed -re "${sedexpr}" <"${i}" >"${MYFILESDIR}/`basename ${i}`" || die
169         done
170
171         if use minimal; then
172                 cat "${MYFILESDIR}"/amanda-amandahosts-server.5.1_p3-r1 > "${T}"/amandahosts || die
173         else
174                 sed -i -e 's:^\(my $amandahomedir\)=.*:\1 = $localstatedir;:' \
175                         server-src/am{addclient,serverconfig}.pl || die
176                 cat "${MYFILESDIR}"/amanda-amandahosts-client-2.5.1_p3-r1 > "${T}"/amandahosts || die
177         fi
178
179         eapply "${FILESDIR}"/${P}-slots.patch || die
180         eapply "${FILESDIR}"/${P}-labelstr.patch || die
181
182         eapply_user
183 }
184
185 src_configure() {
186         # fix bug #36316
187         addpredict /var/cache/samba/gencache.tdb
188         # fix bug #376169
189         addpredict /run/blkid
190         addpredict /etc/blkid.tab
191
192         [ ! -f "${TMPENVFILE}" ] && die "Variable setting file (${TMPENVFILE}) should exist!"
193         source "${TMPENVFILE}"
194         local myconf
195
196         einfo "Using ${AMANDA_SERVER_TAPE} for tape server."
197         myconf="${myconf} --with-tape-server=${AMANDA_SERVER_TAPE}"
198         einfo "Using ${AMANDA_SERVER_TAPE_DEVICE} for tape server."
199         myconf="${myconf} --with-tape-device=${AMANDA_SERVER_TAPE_DEVICE}"
200         einfo "Using ${AMANDA_SERVER_INDEX} for index server."
201         myconf="${myconf} --with-index-server=${AMANDA_SERVER_INDEX}"
202         einfo "Using ${AMANDA_USER_NAME} for amanda user."
203         myconf="${myconf} --with-user=${AMANDA_USER_NAME}"
204         einfo "Using ${AMANDA_GROUP_NAME} for amanda group."
205         myconf="${myconf} --with-group=${AMANDA_GROUP_NAME}"
206         einfo "Using ${AMANDA_TAR} as Tar implementation."
207         myconf="${myconf} --with-gnutar=${AMANDA_TAR}"
208         einfo "Using ${AMANDA_TAR_LISTDIR} as tar listdir."
209         myconf="${myconf} --with-gnutar-listdir=${AMANDA_TAR_LISTDIR}"
210         einfo "Using ${AMANDA_CONFIG_NAME} as default config name."
211         myconf="${myconf} --with-config=${AMANDA_CONFIG_NAME}"
212         einfo "Using ${AMANDA_TMPDIR} as Amanda temporary directory."
213         myconf="${myconf} --with-tmpdir=${AMANDA_TMPDIR}"
214
215         if [ -n "${AMANDA_PORTS_UDP}" ] && [ -n "${AMANDA_PORTS_TCP}" ] && [ -z "${AMANDA_PORTS_BOTH}" ] ; then
216                 eerror "If you want _both_ UDP and TCP ports, please use only the"
217                 eerror "AMANDA_PORTS environment variable for identical ports, or set"
218                 eerror "AMANDA_PORTS_BOTH."
219                 die "Bad port setup!"
220         fi
221         if [ -n "${AMANDA_PORTS_UDP}" ]; then
222                 einfo "Using UDP ports ${AMANDA_PORTS_UDP/,/-}"
223                 myconf="${myconf} --with-udpportrange=${AMANDA_PORTS_UDP}"
224         fi
225         if [ -n "${AMANDA_PORTS_TCP}" ]; then
226                 einfo "Using TCP ports ${AMANDA_PORTS_TCP/,/-}"
227                 myconf="${myconf} --with-tcpportrange=${AMANDA_PORTS_TCP}"
228         fi
229         if [ -n "${AMANDA_PORTS}" ]; then
230                 einfo "Using ports ${AMANDA_PORTS/,/-}"
231                 myconf="${myconf} --with-portrange=${AMANDA_PORTS}"
232         fi
233
234         # Extras
235         # Speed option
236         myconf="${myconf} --with-buffered-dump"
237         # "debugging" in the configuration is NOT debug in the conventional sense.
238         # It is actually just useful output in the application, and should remain
239         # enabled. There are some cases of breakage with MTX tape changers as of
240         # 2.5.1p2 that it exposes when turned off as well.
241         myconf="${myconf} --with-debugging"
242         # Where to put our files
243         myconf="${myconf} --localstatedir=${AMANDA_USER_HOMEDIR}"
244
245         # Samba support
246         myconf="${myconf} $(use_with samba smbclient /usr/bin/smbclient)"
247
248         # Support for BSD, SSH, BSDUDP, BSDTCP security methods all compiled in by
249         # default
250         myconf="${myconf} --with-bsd-security"
251         myconf="${myconf} --with-ssh-security"
252         myconf="${myconf} --with-bsdudp-security"
253         myconf="${myconf} --with-bsdtcp-security"
254
255         # kerberos-security mechanism version 5
256         myconf="${myconf} $(use_with kerberos krb5-security)"
257
258         # Amazon S3 support
259         myconf="${myconf} `use_enable s3 s3-device`"
260
261         # libcurl is required for S3 but otherwise optional
262         if ! use s3; then
263                 myconf="${myconf} $(use_with curl libcurl)"
264         fi
265
266         # Client only, as requested in bug #127725
267         if use minimal ; then
268                 myconf="${myconf} --without-server"
269         else
270                 # amplot
271                 myconf="${myconf} $(use_with gnuplot)"
272         fi
273
274         # IPv6 fun.
275         myconf="${myconf} `use_with ipv6`"
276         # This is to prevent the IPv6-is-working test
277         # As the test fails on binpkg build hosts with no IPv6.
278         use ipv6 && export amanda_cv_working_ipv6=yes
279
280         # I18N
281         myconf="${myconf} `use_enable nls`"
282
283         # Bug #296634: Perl location
284         perl_set_version
285         myconf="${myconf} --with-amperldir=${VENDOR_LIB}"
286
287         # Bug 296633: --disable-syntax-checks
288         # Some tests are not safe for production systems
289         myconf="${myconf} --disable-syntax-checks"
290
291         # build manpages
292         myconf="${myconf} --enable-manpage-build"
293
294         # bug #483120
295         tc-export AR
296
297         econf \
298                 $(use_with readline) \
299                 ${myconf}
300 }
301
302 src_compile() {
303         # Again, do not want the perl-module src_compile
304         default_src_compile
305 }
306
307 src_install() {
308         [ ! -f "${TMPENVFILE}" ] && die "Variable setting file (${TMPENVFILE}) should exist!"
309         source ${TMPENVFILE}
310
311         einfo "Doing stock install"
312         emake DESTDIR="${D}" install
313
314         # Build the envdir file
315         # Don't forget this..
316         einfo "Building environment file"
317         (
318                 echo "# These settings are what was present in the environment when this"
319                 echo "# Amanda was compiled.  Changing anything below this comment will"
320                 echo "# have no effect on your application, but it merely exists to"
321                 echo "# preserve them for your next emerge of Amanda"
322                 cat "${TMPENVFILE}" | sed "s,=\$,='',g"
323         ) >> "${MYFILESDIR}/${ENVDFILE}"
324
325         # Env.d
326         einfo "Installing environment config file"
327         doenvd "${MYFILESDIR}/${ENVDFILE}"
328
329         # Lock down next section (up until docs).
330         insopts -m0640
331         # Installing Amanda Xinetd Services Definition
332         einfo "Installing xinetd service file"
333         insinto /etc/xinetd.d
334         if use minimal ; then
335                 newins "${MYFILESDIR}"/amanda-xinetd-2.6.1_p1-client amanda
336         else
337                 newins "${MYFILESDIR}"/amanda-xinetd-2.6.1_p1-server amanda
338         fi
339
340         if ! use minimal; then
341                 einfo "Installing Sample Daily Cron Job for Amanda"
342                 insinto /etc/cron.daily
343                 newins "${MYFILESDIR}/amanda-cron" amanda
344         fi
345
346         einfo "Installing systemd service and socket files for Amanda"
347         systemd_dounit "${FILESDIR}"/amanda.socket || die
348         systemd_newunit "${FILESDIR}"/amanda.service 'amanda@.service' || die
349
350         insinto /etc/amanda
351         einfo "Installing .amandahosts File for ${AMANDA_USER_NAME} user"
352         doins "${T}/amandahosts"
353         fperms 600 /etc/amanda/amandahosts
354
355         dosym /etc/amanda/amandahosts "${AMANDA_USER_HOMEDIR}/.amandahosts"
356         insinto "${AMANDA_USER_HOMEDIR}"
357         einfo "Installing .profile for ${AMANDA_USER_NAME} user"
358         newins "${MYFILESDIR}/amanda-profile" .profile
359
360         insinto /etc/amanda
361         doins "${S}/example/amanda-client.conf"
362         if ! use minimal ; then
363                 insinto "/etc/amanda/${AMANDA_CONFIG_NAME}"
364                 doins "${S}/example/amanda.conf"
365                 doins "${S}/example/disklist"
366                 keepdir "${AMANDA_USER_HOMEDIR}/${AMANDA_CONFIG_NAME}/index"
367         fi
368
369         keepdir "${AMANDA_TAR_LISTDIR}"
370         keepdir "${AMANDA_USER_HOMEDIR}/amanda"
371         keepdir "${AMANDA_TMPDIR}/dumps"
372         # Just make sure it exists for XFS to work...
373         use xfs && keepdir /var/xfsdump/inventory
374
375         local i
376         for i in "${AMANDA_USER_HOMEDIR}" "${AMANDA_TAR_LISTDIR}" \
377                 "${AMANDA_TMPDIR}" /etc/amanda; do
378                 einfo "Securing directory (${i})"
379                 fowners -R ${AMANDA_USER_NAME}:${AMANDA_GROUP_NAME} ${i}
380         done
381         # Do NOT use -R
382         fperms 0700 \
383                 "${AMANDA_USER_HOMEDIR}" "${AMANDA_TAR_LISTDIR}" \
384                 "${AMANDA_TMPDIR}" "${AMANDA_TMPDIR}/dumps" \
385                  "${AMANDA_USER_HOMEDIR}/amanda" \
386                  /etc/amanda
387
388         if ! use minimal ; then
389                 fperms 0700 \
390                          "${AMANDA_USER_HOMEDIR}/${AMANDA_CONFIG_NAME}" \
391                  /etc/amanda/${AMANDA_CONFIG_NAME}
392         fi
393
394         einfo "Setting setuid permissions"
395         amanda_permissions_fix "${D}"
396
397         # Relax permissions again
398         insopts -m0644
399
400         # docs
401         einfo "Installing documentation"
402         dodoc AUTHORS ChangeLog DEVELOPING NEWS README ReleaseNotes UPGRADING
403         # our inetd sample
404         einfo "Installing standard inetd sample"
405         newdoc "${MYFILESDIR}/amanda-inetd.amanda.sample-2.6.0_p2-r2" amanda-inetd.amanda.sample
406         # Amanda example configs
407         einfo "Installing example configurations"
408         rm "${D}"/usr/share/amanda/{COPYRIGHT,ChangeLog,NEWS,ReleaseNotes}
409         mv "${D}/usr/share/amanda/example" "${D}/usr/share/doc/${PF}/"
410         docinto example1
411         newdoc "${FILESDIR}/example_amanda.conf" amanda.conf
412         newdoc "${FILESDIR}/example_disklist-2.5.1_p3-r1" disklist
413         newdoc "${FILESDIR}/example_global.conf" global.conf
414
415         einfo "Cleaning up dud .la files"
416         perl_set_version
417         find "${D}"/"${VENDOR_LIB}" -name '*.la' -print0 |xargs -0 rm -f
418 }
419
420 pkg_postinst() {
421         [ ! -f "${TMPENVFILE}" -a "$MERGE_TYPE" == "binary" ] && \
422                 TMPENVFILE="${ROOT}${ENVDIR}/${ENVDFILE}"
423         [ ! -f "${TMPENVFILE}" ] && die "Variable setting file (${TMPENVFILE}) should exist!"
424         source "${TMPENVFILE}"
425
426         # Migration of amandates from /etc to $localstatedir/amanda
427         if [ -f "${ROOT}/etc/amandates" -a \
428                 ! -f "${ROOT}/${AMANDA_USER_HOMEDIR}/amanda/amandates" ]; then
429                 einfo "Migrating amandates from /etc/ to ${AMANDA_USER_HOMEDIR}/amanda"
430                 einfo "A backup is also placed at /etc/amandates.orig"
431                 cp -dp "${ROOT}/etc/amandates" "${ROOT}/etc/amandates.orig"
432                 mkdir -p "${ROOT}/${AMANDA_USER_HOMEDIR}/amanda/"
433                 cp -dp "${ROOT}/etc/amandates" "${ROOT}/${AMANDA_USER_HOMEDIR}/amanda/amandates"
434         fi
435         if [ -f "${ROOT}/etc/amandates" ]; then
436                 einfo "If you have migrated safely, please delete /etc/amandates"
437         fi
438
439         einfo "Checking setuid permissions"
440         amanda_permissions_fix "${ROOT}"
441
442         elog "You should configure Amanda in /etc/amanda now."
443         elog
444         elog "If you use xinetd, Don't forget to check /etc/xinetd.d/amanda"
445         elog "and restart xinetd afterwards!"
446         elog
447         elog "Otherwise, please look at /usr/share/doc/${PF}/inetd.amanda.sample"
448         elog "as an example of how to configure your inetd."
449         elog
450         elog "systemd-users: enable and start amanda.socket or the relevant services"
451         elog "regarding what auth method you use."
452         elog
453         elog "NOTICE: If you need raw access to partitions you need to add the"
454         elog "amanda user to the 'disk' group."
455         elog
456         elog "NOTICE: If you have a tape changer, you need to add the amanda user"
457         elog "to the 'tape' group."
458         elog
459         elog "If you use localhost in your disklist your restores may break."
460         elog "You should replace it with the actual hostname!"
461         elog "Please also see the syntax changes to amandahosts."
462         elog "The only exception is when you use the authentication method 'local'."
463         elog
464         elog "Please note that this package no longer explicitly depends on"
465         elog "virtual/inetd, as it supports modes where an inetd is not needed"
466         elog "(see bug #506028 for details)."
467 }
468
469 # We have had reports of amanda file permissions getting screwed up.
470 # Losing setuid, becoming too lax etc.
471 # ONLY root and users in the amanda group should be able to run these binaries!
472 amanda_permissions_fix() {
473         local root="$1"
474         [ -z "${root}" ] && die "Failed to pass root argument to amanda_permissions_fix!"
475         local le="/usr/libexec/amanda"
476         for i in /usr/sbin/amcheck "${le}"/calcsize "${le}"/killpgrp \
477                 "${le}"/rundump "${le}"/runtar "${le}"/dumper \
478                 "${le}"/planner ; do
479                 chown root:${AMANDA_GROUP_NAME} "${root}"/${i}
480                 chmod u=srwx,g=rx,o= "${root}"/${i}
481         done
482 }
483
484 # We do not want the perl-module tests.
485 src_test() {
486         default_src_test
487 }