X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dh_installinit;h=9c8c1550997ffac3c41c87ba22aa224a8b536b2b;hb=18a0da8092ea9f3dc48bca92b36f592af25a608d;hp=2ea3440f3d680961134155777e9131a07162c4de;hpb=1e6dea44772a0c1f57e7cd50ff12e35a1cff0b96;p=debhelper.git diff --git a/dh_installinit b/dh_installinit index 2ea3440..9c8c155 100755 --- a/dh_installinit +++ b/dh_installinit @@ -1,58 +1,268 @@ -#!/bin/sh -e -# -# Install debian/init[.d], and set up the postinst and postrm for init -# scripts. - -PATH=debian:$PATH:/usr/lib/debhelper -. dh_lib - -for PACKAGE in $DH_DOPACKAGES; do - TMP=`tmpdir $PACKAGE` - EXT=`pkgext $PACKAGE` - - if [ -e debian/${EXT}init ]; then - if [ ! -d $TMP/etc/init.d ]; then - doit "install -d $TMP/etc/init.d" - fi - - # Figure out what filename to install it as. - if [ "$DH_D_FLAG" ]; then - # -d on the command line sets DH_D_FLAG. We will - # remove a trailing 'd' from the package name and - # use that as the name. - script=`expr $PACKAGE : '\(.*\)d$'` || true - if [ ! "$script" ]; then - echo `basename $0`" warning: \"$PACKAGE\" has no final -d, but -d was specified." - script=$PACKAGE - fi - else - script=$PACKAGE - fi - doit "install -p -m755 debian/${EXT}init $TMP/etc/init.d/$script" +#!/usr/bin/perl -w +=head1 NAME + +dh_installinit - install init scripts and/or upstart jobs into package build directories + +=cut + +use strict; +use Debian::Debhelper::Dh_Lib; + +=head1 SYNOPSIS + +B [S>] [B<--name=>I] [B<-n>] [B<-R>] [B<-r>] [B<-d>] [S I>] + +=head1 DESCRIPTION + +B is a debhelper program that is responsible for installing +init scripts with associated defaults files, as well as upstart job files +into package build directories. + +It also automatically generates the F and F and F +commands needed to set up the symlinks in F to start and stop +the init scripts. + +=head1 FILES + +=over 4 + +=item debian/I.init + +If this exists, it is installed into etc/init.d/I in the package +build directory. + +=item debian/I.default + +If this exists, it is installed into etc/default/I in the package +build directory. + +=item debian/I.upstart + +If this exists, it is installed into etc/init/I.conf in the package +build directory. + +=back + +=head1 OPTIONS + +=over 4 + +=item B<-n>, B<--noscripts> + +Do not modify F/F/F scripts. + +=item B<-o>, B<--onlyscripts> + +Only modify F/F/F scripts, do not actually install any init +script, default files, or upstart job. May be useful if the init script or +upstart job is shipped and/or installed by upstream in a way that doesn't +make it easy to let B find it. + +=item B<-R>, B<--restart-after-upgrade> + +Do not stop the init script until after the package upgrade has been +completed. This is different than the default behavior, which stops the +script in the F, and starts it again in the F. + +This can be useful for daemons that should not have a possibly long +downtime during upgrade. But you should make sure that the daemon will not +get confused by the package being upgraded while it's running before using +this option. + +=item B<-r>, B<--no-restart-on-upgrade> + +Do not stop init script on upgrade. + +=item B<--no-start> + +Do not start the init script on install or upgrade, or stop it on removal. +Only call B. Useful for rcS scripts. + +=item B<-d>, B<--remove-d> + +Remove trailing B from the name of the package, and use the result for the +filename the upstart job file is installed as in F , and for the +filename the init script is installed as in etc/init.d and the default file +is installed as in F . This may be useful for daemons with names +ending in B. (Note: this takes precedence over the B<--init-script> parameter +described below.) + +=item B<-u>I B<--update-rcd-params=>I + +=item B<--> I + +Pass I to L. If not specified, B will be +passed to L. + +=item B<--name=>I + +Install the init script (and default file) as well as upstart job file +using the filename I instead of the default filename, which is +the package name. When this parameter is used, B looks +for and installs files named F, +F and F +instead of the usual F, F and +F. + +=item B<--init-script=>I + +Use I as the filename the init script is installed as in +F (and also use it as the filename for the defaults file, if it +is installed). If you use this parameter, B will look to see +if a file in the F directory exists that looks like +F and if so will install it as the init script in +preference to the files it normally installs. + +This parameter is deprecated, use the B<--name> parameter instead. This +parameter is incompatible with the use of upstart jobs. + +=item B<--error-handler=>I + +Call the named shell I if running the init script fails. The +function should be provided in the F and F scripts, before the +B<#DEBHELPER#> token. + +=back + +=head1 NOTES + +Note that this command is not idempotent. L should be called +between invocations of this command. Otherwise, it may cause multiple +instances of the same text to be added to maintainer scripts. + +=cut + +init(options => { + "r" => \$dh{R_FLAG}, + "no-restart-on-upgrade" => \$dh{R_FLAG}, + "no-start" => \$dh{NO_START}, + "R|restart-after-upgrade" => \$dh{RESTART_AFTER_UPGRADE}, + "init-script=s" => \$dh{INIT_SCRIPT}, + "update-rcd-params=s", => \$dh{U_PARAMS}, + "remove-d" => \$dh{D_FLAG}, +}); + +foreach my $package (@{$dh{DOPACKAGES}}) { + my $tmp=tmpdir($package); + + # Figure out what filename to install it as. + my $script; + my $jobfile=$package; + if (defined $dh{NAME}) { + $jobfile=$script=$dh{NAME}; + } + elsif ($dh{D_FLAG}) { + # -d on the command line sets D_FLAG. We will + # remove a trailing 'd' from the package name and + # use that as the name. + $script=$package; + if ($script=~m/(.*)d$/) { + $jobfile=$script=$1; + } + else { + warning("\"$package\" has no final d' in its name, but -d was specified."); + } + } + elsif ($dh{INIT_SCRIPT}) { + $script=$dh{INIT_SCRIPT}; + } + else { + $script=$package; + } + + my $job=pkgfile($package,"upstart"); + + if ($job ne '' && ! $dh{ONLYSCRIPTS}) { + if (! -d "$tmp/etc/init") { + doit("install","-d","$tmp/etc/init"); + } + + doit("install","-p","-m644",$job,"$tmp/etc/init/$jobfile.conf"); + } + + my $default=pkgfile($package,'default'); + if ($default ne '' && ! $dh{ONLYSCRIPTS}) { + if (! -d "$tmp/etc/default") { + doit("install","-d","$tmp/etc/default"); + } + doit("install","-p","-m644",$default,"$tmp/etc/default/$script"); + } + + my $init=pkgfile($package,$script) || pkgfile($package,"init") || + pkgfile($package,"init.d"); + if ($init ne '' && ! $dh{ONLYSCRIPTS}) { + if (! -d "$tmp/etc/init.d") { + doit("install","-d","$tmp/etc/init.d"); + } + + doit("install","-p","-m755",$init,"$tmp/etc/init.d/$script"); + } + + if ($dh{INIT_SCRIPT} && $job ne '' && $init ne '') { + error("Can't use --init-script with an upstart job"); + } + + if ($job ne '' || $init ne '' || $dh{ONLYSCRIPTS}) { # This is set by the -u "foo" command line switch, it's - # the parameters to pass to update-rc.d. If not set, + # the parameters to pass to update-rc.d. If not set, # we have to say "defaults". - if [ "$DH_U_PARAMS" = "" ]; then - DH_U_PARAMS="defaults" - fi - - # -r on the command line sets DH_R_FLAG. If it's set, there - # is no restart on upgrade. - if [ ! "$DH_NOSCRIPTS" ]; then - if [ "$DH_R_FLAG" ]; then - autoscript "postinst" "postinst-init-norestart" \ - "s/#SCRIPT#/$script/;s/#INITPARMS#/$DH_U_PARAMS/" - autoscript "postrm" "postrm-init" \ - "s/#SCRIPT#/$script/;s/#INITPARMS#/$DH_U_PARAMS/" - else - autoscript "postinst" "postinst-init" \ - "s/#SCRIPT#/$script/;s/#INITPARMS#/$DH_U_PARAMS/" - autoscript "postrm" "postrm-init" \ - "s/#SCRIPT#/$script/;s/#INITPARMS#/$DH_U_PARAMS/" - autoscript "prerm" "prerm-init" \ - "s/#SCRIPT#/$script/;s/#INITPARMS#/$DH_U_PARAMS/" - fi - fi - fi -done + my $params=''; + if (defined($dh{U_PARAMS})) { + $params=join(' ',@{$dh{U_PARAMS}}); + } + if ($params eq '') { + $params="defaults"; + } + + if (! $dh{NOSCRIPTS}) { + if (! $dh{NO_START}) { + if ($dh{RESTART_AFTER_UPGRADE}) { + # update-rc.d, and restart (or + # start if new install) script + autoscript($package,"postinst", "postinst-init-restart", + "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/"); + } + else { + # update-rc.d, and start script + autoscript($package,"postinst", "postinst-init", + "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/"); + } + + if ($dh{R_FLAG} || $dh{RESTART_AFTER_UPGRADE}) { + # stops script only on remove + autoscript($package,"prerm","prerm-init-norestart", + "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/"); + } + else { + # always stops script + autoscript($package,"prerm","prerm-init", + "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/"); + } + } + else { + # just update-rc.d + autoscript($package,"postinst", "postinst-init-nostart", + "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/"); + } + + # removes rc.d links + autoscript($package,"postrm","postrm-init", + "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/"); + } + } +} + +=head1 SEE ALSO + +L + +This program is a part of debhelper. + +=head1 AUTHORS + +Joey Hess + +Steve Langasek + +=cut