#!/usr/bin/perl -w

=head1 NAME

octopussy - Octopussy Main program

=head1 SYNOPSIS

octopussy {start|stop|restart}
octopussy dispatcher{-start|-stop|-restart|-reload}
octopussy parser{-start|-stop|-restart} <device>
octopussy scheduler{-start|-stop|-restart} 

=head1 DESCRIPTION

octopussy is the main program used by the Octopussy Project 
to launch all other Octopussy programs

=cut

use Octopussy;

my $PROG_NAME = "octopussy";
my $USER = "octopussy";
my $DISPATCHER = "octo_dispatcher"; 
my $PARSER = "octo_parser";
my $PUSHER = "octo_pusher";
my $SCHEDULER = "octo_scheduler";
my $NICE_PUSHER = "nice -n 10";
my $NICE_SCHEDULER = "nice -n 10";
my $LOGFILE = "/var/log/messages";
my $INITD_MYSQL = "/etc/init.d/mysql";
my $INITD_SYSLOG_NG = "/etc/init.d/syslog-ng";

my $base = Octopussy::Directory("programs");
my $pid_dir = Octopussy::Directory("running");

=head1 FUNCTIONS

=head2 Usage()

Prints usage for Octopussy program

=cut
sub Usage
{
	print "Usage: /etc/init.d/$PROG_NAME {start|stop|restart|dispatcher-start|dispatcher-stop|dispatcher-restart|dispatcher-reload|parser-start|parser-stop|parser-restart|scheduler-stop|scheduler-start|scheduler-restart} <device>\n";
}

=head2 Dispatcher_Start()

Starts syslog-ng that launchs octo_dispatcher

=cut
sub Dispatcher_Start
{
	`$INITD_SYSLOG_NG start`;
  print "$PROG_NAME Dispatcher started.\n";
}

=head2 Dispatcher_Stop()

Stops syslog-ng that stops octo_dispatcher

=cut
sub Dispatcher_Stop
{
	`$INITD_SYSLOG_NG stop`;
	print "$PROG_NAME Dispatcher stopped.\n";
}

=head2 Dispatcher_Reload()

Restarts syslog-ng and octo_dispatcher

=cut
sub Dispatcher_Reload
{
	`$INITD_SYSLOG_NG restart`;
  print "$PROG_NAME Dispatcher reloaded.\n";
}

=head2 Parser_Start($device)

Starts octo_parser for device '$device' (all devices if no device specified)

=cut
sub Parser_Start
{
	my $device = shift;

	if (defined $device)
	{
		if (Octopussy::Device::Parse_Status($device) >= 1) 
		{ # Device Status "Started/Paused"
			system("sudo -u $USER $base$PARSER $device &");
    	print "$PROG_NAME Parsing $device started.\n";
		}
		else
		{
			print "$PROG_NAME Parsing status of $device is 'Stopped', set status to 'Paused' or 'Started' first !\n";
		}
	}
	else
	{
		my @devices = Octopussy::Device::List();
  	foreach my $d (@devices)
  	{
			if (Octopussy::Device::Parse_Status($d) >= 1)     
			{ # Device Status "Started/Paused"
				system("sudo -u $USER $base$PARSER $d &");
    		print "$PROG_NAME Parsing $d started.\n";
			}
			else
			{
				print "$PROG_NAME Parsing status of $d is 'Stopped', set status to 'Paused' or 'Started' first !\n";	
			}
  	}
	}
}

=head2 Parser_Stop($device)

Stops octo_parser for device '$device' (all devices if no device specified)

=cut
sub Parser_Stop
{
	my $device = shift;

	if (defined $device)
	{
		if (Octopussy::Device::Parse_Status($device) >= 1)
		{
			Octopussy::Device::Parse_Pause($device);
			print "$PROG_NAME Parsing $device Paused.\n";
		}
		else
		{
			Octopussy::Device::Parse_Stop($device);
			 print "$PROG_NAME Parsing $device Stopped.\n";
		}
	}
	else
	{
		my @devices = Octopussy::Device::List();
		foreach my $d (@devices)
		{
			if (Octopussy::Device::Parse_Status($d) >= 1)
    	{
				Octopussy::Device::Parse_Pause($d);
				print "$PROG_NAME Parsing $d Paused.\n";
			}
			else
    	{
      	Octopussy::Device::Parse_Stop($d);
       	print "$PROG_NAME Parsing $d Stopped.\n";
    	}
		}
	}
}	

=head2 Pusher_Start

Starts octo_pusher

=cut
sub Pusher_Start
{
	system("sudo -u $USER $NICE_PUSHER $base$PUSHER &");
	print "$PROG_NAME Pusher Started.\n";
}

=head2 Pusher_Stop

Stops octo_pusher

=cut
sub Pusher_Stop
{
  `/usr/bin/killall $PUSHER`;
	print "$PROG_NAME Pusher Stopped.\n";
}

=head2 Scheduler_Start

Starts octo_scheduler

=cut
sub Scheduler_Start
{
	system("sudo -u $USER $NICE_SCHEDULER $base$SCHEDULER &");
	print "$PROG_NAME Scheduler Started.\n";
}

=head2 Scheduler_Stop

Stops octo_scheduler

=cut
sub Scheduler_Stop
{
	`/usr/bin/killall $SCHEDULER`;
	print "$PROG_NAME Scheduler Stopped.\n";
}

=head2 Start()

Starts all Octopussy programs (dispatcher, mysql, parsers, scheduler & pusher)

=cut
sub Start
{
	Dispatcher_Start();
	`$INITD_MYSQL restart`;	
	Parser_Start();
	Scheduler_Start();
	Pusher_Start();
}

=head2 Stop()

Stops all Octopussy programs (parsers, scheduler, pusher & dispatcher)

=cut
sub Stop
{
	Parser_Stop();
	Scheduler_Stop();
	Pusher_Stop();
	Dispatcher_Stop();
	`rm -f $pid_dir/*.{err,pid}`;
}

my $arg = $ARGV[0] || "";
my $device = $ARGV[1] || undef;

if ($arg eq "start")
	{ Start(); }
elsif ($arg eq "stop")
	{ Stop(); }
elsif ($arg eq "restart")
{
	Stop();
	Start();
}
elsif ($arg eq "dispatcher-start")
	{ Dispatcher_Start(); }
elsif ($arg eq "dispatcher-stop")
	{ Dispatcher_Stop(); }
elsif ($arg eq "dispatcher-restart")
{
  Dispatcher_Stop();
 	Dispatcher_Start();
}
elsif ($arg eq "dispatcher-reload")
	{ Dispatcher_Reload(); }
elsif ($arg eq "parser-start")
	{ Parser_Start($device); }
elsif ($arg eq "parser-stop")
	{ Parser_Stop($device); }
elsif ($arg eq "parser-restart")
{
  Parser_Stop($device);
  Parser_Start($device);
}
elsif ($arg eq "pusher-start")
	{ Pusher_Start(); }
elsif ($arg eq "pusher-stop")
	{ Pusher_Stop(); }
elsif ($arg eq "pusher-restart")
{
  Pusher_Stop();
  Pusher_Start();
}
elsif ($arg eq "scheduler-start")
	{ Scheduler_Start(); }
elsif ($arg eq "scheduler-stop")
	{ Scheduler_Stop(); }
elsif ($arg eq "scheduler-restart")
{
	Scheduler_Stop();
	Scheduler_Start();
}
else
	{ Usage(); }

exit(0);

=head1 AUTHOR

Sebastien Thebert <octo.devel@gmail.com>

=head1 SEE ALSO

octo_dispatcher, octo_extractor, octo_parser, octo_uparser, octo_reporter, octo_scheduler

=cut
