X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dh_installinit;h=d08798a82b4da54a54be2dd873d3b071d878cbb9;hb=fb8f18f4a98669c3b85e1bd7920fbabfc00b886e;hp=360f378397176f34fe749c94b351ce8a41e2edc7;hpb=2bc0d0368dc148a3507d285bad9bc845f8bf382d;p=debhelper.git diff --git a/dh_installinit b/dh_installinit index 360f378..d08798a 100755 --- a/dh_installinit +++ b/dh_installinit @@ -2,7 +2,7 @@ =head1 NAME -dh_installinit - install init scripts into package build directories +dh_installinit - install upstart jobs or init scripts into package build directories =cut @@ -11,24 +11,39 @@ use Debian::Debhelper::Dh_Lib; =head1 SYNOPSIS -B [S>] [B<--name=>I] [B<-n>] [B<-r>] [B<-d>] [S I>] +B [S>] [B<--name=>I] [B<-n>] [B<-R>] [B<-r>] [B<-d>] [S I>] =head1 DESCRIPTION -dh_installinit is a debhelper program that is responsible for installing -init scripts and associated defaults files into package build directories. +B is a debhelper program that is responsible for installing +upstart job files or init scripts with associated defaults files into package +build directories, and in the former case providing compatibility handling +for non-upstart systems. -It also automatically generates the postinst and postrm and prerm commands -needed to set up the symlinks in /etc/rc*.d/ and to start and stop the init +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. -If a file named debian/package.init exists, then it is installed into -etc/init.d/package in the package build directory, with "package" replaced -by the package name. +=head1 FILES -If a file named debian/package.default exists, then it is installed into -etc/default/package in the package build directory, with "package" replaced -by the package name. +=over 4 + +=item debian/I.upstart + +If this exists, it is installed into etc/init/I.conf in the package +build directory. + +=item debian/I.init + +Otherwise, 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. + +=back =head1 OPTIONS @@ -36,70 +51,111 @@ by the package name. =item B<-n>, B<--noscripts> -Do not modify postinst/postrm/prerm scripts. +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. + +If no upstart job file is installed in the target directory when +B is called, this program will assume that an +init script is being installed and not provide the compatibility symlinks +or upstart dependencies. + +=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 restart init script 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 update-rc.d. Useful for rcS scripts. +Only call B. Useful for rcS scripts. =item B<-d>, B<--remove-d> -Remove trailing "d" from the name of the package, and use the result for the -filename the init script is installed as in etc/init.d/ , and the default file -is installed as in etc/default/ . This may be useful for daemons with names -ending in "d". (Note: this takes precedence over the --init-script parameter +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 , or 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 "params" to L. If not specified, "defaults" will be +Pass I to L. If not specified, B will be passed to L. =item B<--name=>I -Install the init script (and default file) using the filename I -instead of the default filename, which is the package name. When this -parameter is used, dh_installinit looks for and installs files named -debian/package.name.init and debian/package.name.default, instead of the -usual debian/package.init and debian/package.default. +Install the upstart job file or the init script (and default 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 "scriptname" as the filename the init script is installed as in -etc/init.d/ (and also use it as the filename for the defaults file, if it -is installed). If you use this parameter, dh_installinit will look to see -if a file in the debian/ directory exists that looks like -"package.scriptname" and if so will install it as the init script in +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 --name parameter instead. +This parameter is deprecated, use the B<--name> parameter instead. This +parameter will be ignored completely for 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. "dh_clean -k" should be called +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(); +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}) { - $script=$dh{NAME}; + $jobfile=$script=$dh{NAME}; } elsif ($dh{D_FLAG}) { # -d on the command line sets D_FLAG. We will @@ -107,7 +163,7 @@ foreach my $package (@{$dh{DOPACKAGES}}) { # use that as the name. $script=$package; if ($script=~m/(.*)d$/) { - $script=$1; + $jobfile=$script=$1; } else { warning("\"$package\" has no final d' in its name, but -d was specified."); @@ -120,23 +176,52 @@ foreach my $package (@{$dh{DOPACKAGES}}) { $script=$package; } - my $init=pkgfile($package,$script) || pkgfile($package,"init") || - pkgfile($package,"init.d"); - my $default=pkgfile($package,'default'); + my $job=pkgfile($package,"upstart"); + my $init=''; + + if ($job ne '' || ($dh{ONLYSCRIPTS} && -e "$tmp/etc/init/$jobfile.conf")) { + if (! $dh{ONLYSCRIPTS}) { + if (! -d "$tmp/etc/init") { + doit("install","-d","$tmp/etc/init"); + } + + doit("install","-p","-m644",$job,"$tmp/etc/init/$jobfile.conf"); + } + + # ensures that our /etc/init.d/ symlink points to a valid + # implementation + addsubstvar($package, "misc:Depends", "upstart-job"); + + if (! -d "$tmp/etc/init.d") { + doit("install","-d","$tmp/etc/init.d"); + } + doit("ln","-sf","/lib/init/upstart-job","$tmp/etc/init.d/$jobfile"); + } + else { + $init=pkgfile($package,$script) || pkgfile($package,"init") || + pkgfile($package,"init.d"); + } - if ($default ne '') { + 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"); } - if ($init ne '') { + 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 ($job ne '' || $init ne '' || $dh{ONLYSCRIPTS}) { + if (-e "$tmp/etc/init/$jobfile.conf") { + $script=$jobfile; + } # This is set by the -u "foo" command line switch, it's # the parameters to pass to update-rc.d. If not set, @@ -148,33 +233,41 @@ foreach my $package (@{$dh{DOPACKAGES}}) { if ($params eq '') { $params="defaults"; } - + if (! $dh{NOSCRIPTS}) { if (! $dh{NO_START}) { - # update-rc.d, and start script - autoscript($package,"postinst", "postinst-init", - "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/"); + 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}) { + 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/#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/#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/#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/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/"); } } } @@ -185,8 +278,10 @@ L This program is a part of debhelper. -=head1 AUTHOR +=head1 AUTHORS Joey Hess +Steve Langasek + =cut