]> git.donarmstrong.com Git - debhelper.git/blob - dh_installinit
Add FILES sections to man pages. Closes: #545041
[debhelper.git] / dh_installinit
1 #!/usr/bin/perl -w
2
3 =head1 NAME
4
5 dh_installinit - install upstart jobs or init scripts into package build directories
6
7 =cut
8
9 use strict;
10 use Debian::Debhelper::Dh_Lib;
11
12 =head1 SYNOPSIS
13
14 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>>]
15
16 =head1 DESCRIPTION
17
18 dh_installinit is a debhelper program that is responsible for installing
19 upstart job files or init scripts with associated defaults files into package
20 build directories, and in the former case providing compatibility handling
21 for non-upstart systems.
22
23 It also automatically generates the postinst and postrm and prerm commands
24 needed to set up the symlinks in /etc/rc*.d/ and to start and stop the init
25 scripts.
26
27 =head1 FILES
28
29 =over 4
30
31 =item debian/I<package>.upstart
32
33 If this exists, it is installed into etc/init/I<package>.conf in the package
34 build directory.
35
36 =item debian/I<package>.init
37
38 Otherwise, if this exists, it is installed
39 into etc/init.d/I<package> in the package build directory.
40
41 =item debian/I<package>.default
42
43 If this exists, it is installed into etc/default/I<package> in the package
44 build directory.
45
46 =back
47
48 =head1 OPTIONS
49
50 =over 4
51
52 =item B<-n>, B<--noscripts>
53
54 Do not modify postinst/postrm/prerm scripts.
55
56 =item B<-o>, B<--onlyscripts>
57
58 Only modify postinst/postrm/prerm scripts, do not actually install any init
59 script, default files, or upstart job.  May be useful if the init script or
60 upstart job is shipped and/or installed by upstream in a way that doesn't
61 make it easy to let dh_installinit find it.
62
63 If no upstart job file is installed in the target directory when
64 dh_installinit --onlyscripts is called, this program will assume that an
65 init script is being installed and not provide the compatibility symlinks
66 or upstart dependencies.
67
68 =item B<-R>, B<--restart-after-upgrade>
69
70 Do not stop the init script until after the package upgrade has been
71 completed. This is different than the default behavior, which stops the
72 script in the prerm, and starts it again in the postinst.
73
74 This can be useful for daemons that should not have a possibly long
75 downtime during upgrade. But you should make sure that the daemon will not
76 get confused by the package being upgraded while it's running before using
77 this option.
78
79 =item B<-r>, B<--no-restart-on-upgrade>
80
81 Do not stop init script on upgrade.
82
83 =item B<--no-start>
84
85 Do not start the init script on install or upgrade, or stop it on removal.
86 Only call update-rc.d. Useful for rcS scripts.
87
88 =item B<-d>, B<--remove-d>
89
90 Remove trailing "d" from the name of the package, and use the result for the
91 filename the upstart job file is installed as in etc/init/ , or for the
92 filename the init script is installed as in etc/init.d and the default file
93 is installed as in etc/default/ . This may be useful for daemons with names
94 ending in "d". (Note: this takes precedence over the --init-script parameter
95 described below.)
96
97 =item B<-u>I<params> B<--update-rcd-params=>I<params>
98
99 =item B<--> I<params>
100
101 Pass "params" to L<update-rc.d(8)>. If not specified, "defaults" will be
102 passed to L<update-rc.d(8)>.
103
104 =item B<--name=>I<name>
105
106 Install the upstart job file or the init script (and default file) using the
107 filename I<name> instead of the default filename, which is the package name.
108 When this parameter is used, dh_installinit looks for and installs files
109 named debian/package.name.upstart, debian/package.name.init and
110 debian/package.name.default, instead of the usual debian/package.upstart,
111 debian/package.init and debian/package.default.
112
113 =item B<--init-script=>I<scriptname>
114
115 Use "scriptname" as the filename the init script is installed as in
116 etc/init.d/ (and also use it as the filename for the defaults file, if it
117 is installed). If you use this parameter, dh_installinit will look to see
118 if a file in the debian/ directory exists that looks like
119 "package.scriptname" and if so will install it as the init script in
120 preference to the files it normally installs.
121
122 This parameter is deprecated, use the --name parameter instead.  This
123 parameter will be ignored completely for upstart jobs.
124
125 =item B<--error-handler=>I<function>
126
127 Call the named shell function if running the init script fails. The
128 function should be provided in the prerm and postinst scripts, before the
129 #DEBHELPER# token.
130
131 =back
132
133 =head1 NOTES
134
135 Note that this command is not idempotent. L<dh_prep(1)> should be called
136 between invocations of this command. Otherwise, it may cause multiple
137 instances of the same text to be added to maintainer scripts.
138
139 =cut
140
141 init(options => {
142         "r" => \$dh{R_FLAG},
143         "no-restart-on-upgrade" => \$dh{R_FLAG},
144         "no-start" => \$dh{NO_START},
145         "R|restart-after-upgrade" => \$dh{RESTART_AFTER_UPGRADE},
146         "init-script=s" => \$dh{INIT_SCRIPT},
147         "update-rcd-params=s", => \$dh{U_PARAMS},
148         "remove-d" => \$dh{D_FLAG},
149 });
150
151 foreach my $package (@{$dh{DOPACKAGES}}) {
152         my $tmp=tmpdir($package);
153
154         # Figure out what filename to install it as.
155         my $script;
156         my $jobfile=$package;
157         if (defined $dh{NAME}) {
158                 $jobfile=$script=$dh{NAME};
159         }
160         elsif ($dh{D_FLAG}) {
161                 # -d on the command line sets D_FLAG. We will 
162                 # remove a trailing 'd' from the package name and 
163                 # use that as the name.
164                 $script=$package;
165                 if ($script=~m/(.*)d$/) {
166                         $jobfile=$script=$1;
167                 }
168                 else {
169                         warning("\"$package\" has no final d' in its name, but -d was specified.");
170                 }
171         }       
172         elsif ($dh{INIT_SCRIPT}) {
173                 $script=$dh{INIT_SCRIPT};
174         }
175         else {
176                 $script=$package;
177         }       
178         
179         my $job=pkgfile($package,"upstart");
180         my ($init,$default) = ('','');
181
182         if ($job ne '' || ($dh{ONLYSCRIPTS} && -e "$tmp/etc/init/$jobfile.conf")) {
183                 if (! $dh{ONLYSCRIPTS}) {
184                         if (! -d "$tmp/etc/init") {
185                                 doit("install","-d","$tmp/etc/init");
186                         }
187                 
188                         doit("install","-p","-m644",$job,"$tmp/etc/init/$jobfile.conf");
189                 }
190                 
191                 # ensures that our /etc/init.d/ symlink points to a valid
192                 # implementation
193                 addsubstvar($package, "misc:Depends", "upstart-job");
194
195                 if (! -d "$tmp/etc/init.d") {
196                         doit("install","-d","$tmp/etc/init.d");
197                 }
198                 doit("ln","-sf","/lib/init/upstart-job","$tmp/etc/init.d/$jobfile");
199         }
200         else {
201                 $init=pkgfile($package,$script) || pkgfile($package,"init") ||
202                         pkgfile($package,"init.d");
203                 $default=pkgfile($package,'default');
204         }
205
206         if ($default ne '' && ! $dh{ONLYSCRIPTS}) {
207                 if (! -d "$tmp/etc/default") {
208                         doit("install","-d","$tmp/etc/default");
209                 }
210                 doit("install","-p","-m644",$default,"$tmp/etc/default/$script");
211         }
212
213         if ($init ne '' && ! $dh{ONLYSCRIPTS}) {
214                 if (! -d "$tmp/etc/init.d") {
215                         doit("install","-d","$tmp/etc/init.d");
216                 }
217                 
218                 doit("install","-p","-m755",$init,"$tmp/etc/init.d/$script");
219         }
220
221         if ($job ne '' || $init ne '' || $dh{ONLYSCRIPTS})
222         {
223                 if (-e "$tmp/etc/init/$jobfile.conf") {
224                         $script=$jobfile;
225                 }
226
227                 # This is set by the -u "foo" command line switch, it's
228                 # the parameters to pass to update-rc.d. If not set,
229                 # we have to say "defaults".
230                 my $params='';
231                 if (defined($dh{U_PARAMS})) {
232                         $params=join(' ',@{$dh{U_PARAMS}});
233                 }       
234                 if ($params eq '') {
235                         $params="defaults";
236                 }
237                 
238                 if (! $dh{NOSCRIPTS}) {
239                         if (! $dh{NO_START}) {
240                                 if ($dh{RESTART_AFTER_UPGRADE}) {
241                                         # update-rc.d, and restart (or
242                                         # start if new install) script
243                                         autoscript($package,"postinst", "postinst-init-restart",
244                                                 "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/");
245                                 }
246                                 else {
247                                         # update-rc.d, and start script
248                                         autoscript($package,"postinst", "postinst-init",
249                                                 "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/");
250                                 }
251                         
252                                 if ($dh{R_FLAG} || $dh{RESTART_AFTER_UPGRADE}) {
253                                         # stops script only on remove
254                                         autoscript($package,"prerm","prerm-init-norestart",
255                                                 "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/");
256                                 }
257                                 else {
258                                         # always stops script
259                                         autoscript($package,"prerm","prerm-init",
260                                                 "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/");
261                                 }
262                         }
263                         else {
264                                 # just update-rc.d
265                                 autoscript($package,"postinst", "postinst-init-nostart",
266                                         "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/");
267                         }
268
269                         # removes rc.d links
270                         autoscript($package,"postrm","postrm-init",
271                                 "s/#SCRIPT#/$script/;s/#INITPARMS#/$params/;s/#ERROR_HANDLER#/$dh{ERROR_HANDLER}/");
272                 }
273         }
274 }
275
276 =head1 SEE ALSO
277
278 L<debhelper(7)>
279
280 This program is a part of debhelper.
281
282 =head1 AUTHORS
283
284 Joey Hess <joeyh@debian.org>
285
286 Steve Langasek <steve.langasek@canonical.com>
287
288 =cut