#!/usr/bin/perl -w =head1 NAME dh_installtmpfiles - install tmpfiles.d configuration files =cut use strict; use warnings; use Debian::Debhelper::Dh_Lib; use File::Find; our $VERSION = DH_BUILTIN_VERSION; =head1 SYNOPSIS B [S>][B<--name=>I] =head1 DESCRIPTION B is a debhelper program that is responsible for installing package maintainer supplied tmpfiles.d configuration files (e.g. for systemd-tmpfiles). It also finds the tmpfiles.d configuration files installed by a package and generates F code blocks for activating the tmpfiles.d configuration when the package is installed. These snippets are added to the maintainer scripts by L. =head1 OPTIONS =over 4 =item B<--name=>I This option controls both a prefix used for lookng up maintainer provided tmpfiles.d configuration files (those mentioned in the L section) and also the base name used for the installed version of the file. =back =head1 FILES =over 4 =item debian/I.tmpfiles If this exists, it is installed into F in the package build directory. Note that the C mechanism is currently only used by systemd. =item debian/I.tmpfile Deprecated name for debian/I.tmpfiles. =back =head1 NOTES This command is not idempotent. L should be called between invocations of this command (with the same arguments). Otherwise, it may cause multiple instances of the same text to be added to maintainer scripts. =cut init(); sub uniq { my %seen; return grep { !$seen{$_}++ } @_; } # PROMISE: DH NOOP WITHOUT tmp(usr/lib/tmpfiles.d) tmp(etc/tmpfiles.d) pkgfile(tmpfiles) pkgfile(tmpfile) cli-options() # Install package maintainer supplied tmpfiles files foreach my $package (@{$dh{DOPACKAGES}}) { my $tmpdir = tmpdir($package); my $tmpfile = pkgfile($package, 'tmpfiles'); my $name = $dh{NAME} // $package; my $old_tmpfile = pkgfile($package, 'tmpfile'); my $dir; if (not $tmpfile) { my $new_name; next if not $old_tmpfile; $tmpfile = $old_tmpfile; $new_name = $old_tmpfile; $new_name =~ s{^(.+[./])tmpfile(\..+|)$}{$1tmpfiles$2}; warning("The name $tmpfile is deprecated; please use $new_name instead"); warning(qq{Possible fix: mv -f "${tmpfile}" "${new_name}"}); } elsif ($old_tmpfile) { warning("There is both a $tmpfile and a $old_tmpfile that is relevant for this package!?"); warning(qq{Possible fix: rm -f "${old_tmpfile}"}); error("Aborting; Please resolve the ambiguity between ${tmpfile} and ${old_tmpfile}."); } $dir = "$tmpdir/usr/lib/tmpfiles.d"; install_dir($dir); install_file($tmpfile, "${dir}/${name}.conf"); } # Add postinst code blocks to handle tmpfiles foreach my $package (@{$dh{DOPACKAGES}}) { my $tmpdir = tmpdir($package); my @tmpfiles; my @dirs = grep { -d } map { "${tmpdir}/$_" } qw(usr/lib/tmpfiles.d etc/tmpfiles.d); find({ wanted => sub { my $name = $File::Find::name; return if not -f $name or not $name =~ m{[.]conf$}; push(@tmpfiles, basename($name)); }, no_chdir => 1, }, @dirs) if @dirs; if (@tmpfiles) { autoscript($package, 'postinst', 'postinst-init-tmpfiles', { 'TMPFILES' => join(' ', uniq(sort(@tmpfiles))) }); } } =head1 SEE ALSO L =cut