The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Mojo::Command::Generate::InitScript::Debian;

use warnings;
use strict;
use File::Spec;

#use base 'Mojo::Command::Generate::InitScript::Base';
use base 'Mojo::Command';
use Getopt::Long 'GetOptions';
use File::Spec;
use IO::File;
use List::Util qw(first);

__PACKAGE__->attr(usage => <<"EOF");
Debian initscript related options:
    --should-start <applist>    defines facilities which, if present, 
                                should be available during startup of this service    
    --should-stop <applist>     facilities which should be available 
                                during shutdown of this service.
    --runlevels  <runlevels>    which run levels should by default run the init script
                                with a start (stop) argument to start (stop)
                                (Default: 2 3 4 5)
EOF

sub run
{
	my ( $self, $opt ) = @_;

	$opt->{'should-start'} = [];
	$opt->{'should-stop'}  = [];
	$opt->{'runlevels'}    = [2, 3, 4, 5];
	$opt->{'stoplevels'}   = [];

	GetOptions($opt,
		'should-start=s{,}', 'should-stop=s{,}', 'runlevels=i{,}',
	);

	for my $i (0..6)
	{
		if ( !first { $i == $_ } @{ $opt->{'runlevels'} } )
		{
			push @{ $opt->{'stoplevels'} }, $i;
		}
	}

	# init script
	my $file = $opt->{'deploy'}
				? '/etc/init.d/'. $opt->{'name'}
				: File::Spec->join($opt->{'output'}, $opt->{'name'});
	$self->render_to_file( 'initscript', $file, $opt );
	$self->chmod_file( $file, 0755 );

	# config file
	$file = $opt->{'deploy'}
				? '/etc/default/'. $opt->{'name'}
				: File::Spec->join($opt->{'output'}, 'etc_default_'.$opt->{'name'});
	$self->render_to_file( 'config', $file, $opt );
	$self->chmod_file( $file, 0644 );

	if ( $opt->{'deploy'} )
	{
		system('/usr/sbin/update-rc.d', $opt->{'name'},
			'start', '20', (@{ $opt->{'runlevels'} }), '.',
			'stop', '20', (@{ $opt->{'stoplevels'} }), '.'
		);
	}
}
1;
__DATA__
@@ initscript
% my $opt = shift;
% my $name = $opt->{'name'};
#! /bin/sh

### BEGIN INIT INFO
# Provides:          <%= $name %>
# Required-Start:    $remote_fs $local_fs $network $syslog $time
# Required-Stop:     $remote_fs $local_fs $network $syslog $time
% if ( @{ $opt->{'should-start'} } )
% {
# Should-Start:      <%= join(' ', @{ $opt->{'should-start'} } ) %>
% }
% if ( @{ $opt->{'should-stop'} } )
% {
# Should-Stop:       <%= join(' ', @{ $opt->{'should-stop'} } ) %>
% }
# Default-Start:     <%= join(' ', @{ $opt->{'runlevels'} } ) %>
# Default-Stop:      <%= join(' ', @{ $opt->{'stoplevels'} } ) %>
# Short-Description: starts <%= $name %> application
# Description:       starts <%= $name %> application
### END INIT INFO

set -e

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=<%= $opt->{'app_script'} %>
NAME=<%= $name %>
DESC=<%= $name %>

MODE="daemon_prefork"
PIDFILE="/var/run/<%= $name %>.pid"
EXTRA_ARGS=""
USER="nobody"

# Include nginx defaults if available
if [ -f /etc/default/<%= $name %> ] ; then
        . /etc/default/<%= $name %>
fi

DAEMON_ARGS="$MODE --daemonize --pid $PIDFILE --user $USER $EXTRA_ARGS"

. /lib/lsb/init-functions

do_start() {
		start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS
}

do_stop() {
		start-stop-daemon --stop --quiet --pidfile $PIDFILE
}

case "$1" in
	start)
		log_daemon_msg "Starting $DESC" "$NAME"
		do_start
		log_end_msg $?
		;;
	stop)
		log_daemon_msg "Stopping $DESC" "$NAME"
		do_stop
		log_end_msg $?
		;;
	restart|force-reload)
		log_daemon_msg "Restarting $DESC" "$NAME"
		do_stop
		do_start
		log_end_msg $?
		;;
	status)
		status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $?
		;;
	*)
		echo "Usage: $NAME {start|stop|restart|force-reload|status}" >&2
		exit 1
		;;

esac

exit 0

@@ config
% my $opt = shift;
% my $name = $opt->{'name'};

MODE="daemon_prefork"
PIDFILE="/var/run/<%= $name %>.pid"
EXTRA_ARGS=""
USER="nobody"

__END__

=head1 NAME

Mojo::Command::Generate::InitScript::Debian - Initscript generator for Linux Debian

=head1 SYNOPSYS

	$ ./mojo_app.pl generate help init_script debian
	usage: ./mojo_app.pl generate init_script target_os [OPTIONS]

	These options are available:
		--output <folder>   Set folder to output initscripts
		--deploy            Deploy initscripts into OS
							Either --deploy or --output=dist should be specified

		--name <name>       Ovewrite name which is used for initscript filename(s)

	Debian initscript related options:
		--should-start <applist>    defines facilities which, if present,
									should be available during startup of this service
		--should-stop <applist>     facilities which should be available
									during shutdown of this service.
		--runlevels  <runlevels>    which run levels should by default run the init script
									with a start (stop) argument to start (stop)
									(Default: 2 3 4 5)

=cut