Hi Joey, On Thu, Jul 09, 2009 at 05:10:46AM -0700, Steve Langasek wrote: > On Tue, Jul 07, 2009 at 01:06:18PM -0400, Joey Hess wrote: > > Steve Langasek wrote: > > > There is currently work in progress to implement a compatibility layer > > > between upstart and sysv-rc, called 'upstart-job', permitting sysv-rc > > > systems to call upstart jobs as if they were standard sysv-rc init > > > scripts. > > > As part of this, I have implemented a dh_installupstart script, heavily > > > based on dh_installinit, to do as the name suggests - install an upstart > > > job > > > file and provide the sysv-rc compatibility hooks.
> > Did you think about including the functionality into dh_installinit? > Wouldn't the behavior changes here imply a compatibility break, and > therefore require waiting for debhelper 8? Beyond that I didn't really > think about it; I can rewrite this as a patch to dh_installinit if you > prefer, though they seem like logically discrete operations to me. Looking at this, one of the places that the dh_installupstart behavior is incompatible with dh_installinit is --onlyscripts. Since by design this option implies we're not looking in debian/ for either a .upstart or a .init file, it's ambiguous which set of maintainer script snippets to use. We can add another option to dh_installinit to do this - called what? --onlyscripts-upstart? And is that cleaner than creating a separate script? Anyway, below is the updated patch to merge this into dh_installinit. Tests out ok in a local test; and fixes a few misc bugs wrt the earlier implementation in the process. :) --- debian/changelog | 8 ++++ debian/copyright | 4 ++ dh_installinit | 98 ++++++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 85 insertions(+), 25 deletions(-) diff --git a/debian/changelog b/debian/changelog index ae3846c..6075420 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +debhelper (7.3.12) UNRELEASED; urgency=low + + * Patch dh_installinit to handle upstart job files in preference over init + scripts, and provide compatibility symlinks in /etc/init.d for sysv-rc + implementations. Closes: #536035. + + -- Steve Langasek <[email protected]> Thu, 06 Aug 2009 03:01:43 -0700 + debhelper (7.3.11) unstable; urgency=low * perl_build: Fix Build check to honor source directory setting. diff --git a/debian/copyright b/debian/copyright index 7b12336..18178a2 100644 --- a/debian/copyright +++ b/debian/copyright @@ -58,3 +58,7 @@ License: GPL-2+ Files: Debian/Debhelper/Buildsystem*, Debian/Debhelper/Dh_Buildsystems.pm Copyright: © 2008-2009 Modestas Vainius License: GPL-2+ + +Files: dh_installinit +Copyright: 1997-2008 Joey Hess <[email protected]>, 2009 Canonical Ltd. +License: GPL-3 diff --git a/dh_installinit b/dh_installinit index 2f32b46..15ff73d 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,21 +11,27 @@ use Debian::Debhelper::Dh_Lib; =head1 SYNOPSIS -B<dh_installinit> [S<I<debhelper options>>] [B<--name=>I<name>] [B<-n>] [B<-R>] [B<-r>] [B<-d>] [S<B<--> I<params>>] +B<dh_installinit> [S<I<debhelper options>>] [B<--name=>I<name>] [B<-n>] [B<-R>] [B<-r>] [B<-d>] [B<-O>] [S<B<--> I<params>>] =head1 DESCRIPTION dh_installinit is a debhelper program that is responsible for installing -init scripts and associated defaults files into package build directories. +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 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 +If a file named debian/package.upstart exists, then it is installed into +etc/init/package.conf in the package build directory, with "package" replaced by the package name. +Otherwise, 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. + 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. @@ -45,6 +51,13 @@ script or default files. May be useful if the init script is shipped and/or installed by upstream in a way that doesn't make it easy to let dh_installinit find it. +=item B<-O>, B<--onlyscripts-upstart> + +Only modify postinst/postrm/prerm scripts, do not actually install any +upstart job files. May be useful if the upstart job file is shipped and/or +installed by upstream in a way that doesn't make it easy to let +dh_installinit find it. + =item B<-R>, B<--restart-after-upgrade> Do not stop the init script until after the package upgrade has been @@ -68,7 +81,8 @@ Only call update-rc.d. 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 +filename the upstart job file is installed as in etc/init/ , or 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 described below.) @@ -82,11 +96,12 @@ passed to L<update-rc.d(8)>. =item B<--name=>I<name> -Install the init script (and default file) using the filename I<name> -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<name> 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.upstart, debian/package.name.init and +debian/package.name.default, instead of the usual debian/package.upstart, +debian/package.init and debian/package.default. =item B<--init-script=>I<scriptname> @@ -97,7 +112,8 @@ if a file in the debian/ directory exists that looks like "package.scriptname" 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 --name parameter instead. This +parameter will be ignored completely for upstart jobs. =item B<--error-handler=>I<function> @@ -123,6 +139,8 @@ init(options => { "init-script=s" => \$dh{INIT_SCRIPT}, "update-rcd-params=s", => \$dh{U_PARAMS}, "remove-d" => \$dh{D_FLAG}, + "O" => \$dh{ONLYSCRIPTS_UPSTART}, + "onlyscripts-upstart" => \$dh{ONLYSCRIPTS_UPSTART}, }); foreach my $package (@{$dh{DOPACKAGES}}) { @@ -130,8 +148,9 @@ foreach my $package (@{$dh{DOPACKAGES}}) { # 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 @@ -139,7 +158,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."); @@ -152,9 +171,31 @@ 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,$default) = ('',''); + + if ($job ne '' || $dh{ONLYSCRIPTS_UPSTART}) { + if (! $dh{ONLYSCRIPTS_UPSTART}) { + 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"); + $default=pkgfile($package,'default'); + } if ($default ne '' && ! $dh{ONLYSCRIPTS}) { if (! -d "$tmp/etc/default") { @@ -163,15 +204,21 @@ foreach my $package (@{$dh{DOPACKAGES}}) { doit("install","-p","-m644",$default,"$tmp/etc/default/$script"); } - if ($init ne '' || $dh{ONLYSCRIPTS}) { - if (! $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 ($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 '' || $dh{ONLYSCRIPTS_UPSTART} || $init ne '' + || $dh{ONLYSCRIPTS}) + { + if ($job ne '' || $dh{ONLYSCRIPTS_UPSTART}) { + $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, # we have to say "defaults". @@ -227,8 +274,9 @@ L<debhelper(7)> This program is a part of debhelper. -=head1 AUTHOR +=head1 AUTHORS Joey Hess <[email protected]> +Steve Langasek <[email protected]> =cut -- 1.6.3.1 Cheers, -- Steve Langasek Give me a lever long enough and a Free OS Debian Developer to set it on, and I can move the world. Ubuntu Developer http://www.debian.org/ [email protected] [email protected] -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected]

