Codebase list fusioninventory-agent / debian/2.1.9901-1 fusioninventory-win32-service
debian/2.1.9901-1

Tree @debian/2.1.9901-1 (Download .tar.gz)

fusioninventory-win32-service @debian/2.1.9901-1raw · history · blame

#!/usr/bin/perl
BEGIN {
    use File::Spec;
    use File::Basename;
    chdir(dirname(File::Spec->rel2abs( __FILE__ ))."/../..");
}

use strict;
use warnings;
use lib './lib';
use threads;
use threads::shared;

use English qw(-no_match_vars);
use Win32;
use Win32::Daemon;

use FusionInventory::Agent;

delete($ENV{PERL5LIB});
delete($ENV{PERLLIB});

my $win32service = 1;
Win32::Daemon::StartService();
my $SERVICE_SLEEP_TIME = 2000; # 20 milliseconds
my $PrevState = SERVICE_START_PENDING;

my $thr;

sub startAgent {
    return if $thr;
    $thr = threads->create(sub {
        my $agent = new FusionInventory::Agent(
            confdir => './etc/fusioninventory',
            datadir => './share',
            vardir  => './var',
            options => {
                service => 1
            }
        );
        $agent->run();
    });
}

sub killAgent {
    $thr->kill('KILL');
    $thr = undef;
}

my $State;
while (SERVICE_STOPPED != ($State = Win32::Daemon::State())){ 
    if (SERVICE_START_PENDING == $State) {
        # Initialization code
        startAgent();
        Win32::Daemon::State(SERVICE_RUNNING);
        $PrevState = SERVICE_RUNNING;
    } elsif (SERVICE_STOP_PENDING == $State) {
        killAgent();
        Win32::Daemon::State(SERVICE_STOPPED);
    } elsif (SERVICE_PAUSE_PENDING == $State) {
        # "Pausing...";
        killAgent();
        Win32::Daemon::State(SERVICE_PAUSED);
        $PrevState = SERVICE_PAUSED;
        killAgent();
        next;
    } elsif (SERVICE_CONTINUE_PENDING == $State) {
        # "Resuming...";
        startAgent();
        Win32::Daemon::State(SERVICE_RUNNING);
        $PrevState = SERVICE_RUNNING;
        next;
    } elsif (SERVICE_STOP_PENDING == $State) {
        # "Stopping...";
        killAgent();
        Win32::Daemon::State(SERVICE_STOPPED);
        $PrevState = SERVICE_STOPPED;
        next;
    } elsif (SERVICE_RUNNING == $State) {
        # The service is running as normal...
        # ...add the main code here...
        startAgent();
    } else {
        # Got an unhandled control message. Set the state to
        # whatever the previous state was.
        Win32::Daemon::State($PrevState);
    }

    # Check for any outstanding commands. Pass in a non zero value
    # and it resets the Last Message to SERVICE_CONTROL_NONE.
    if (SERVICE_CONTROL_NONE != (my $Message = 
            Win32::Daemon::LastControlMessage(1))) {
        if (SERVICE_CONTROL_INTERROGATE == $Message) {
            # Got here if the Service Control Manager is requesting
            # the current state of the service. This can happen for
            # a variety of reasons. Report the last state we set.
            Win32::Daemon::State( $PrevState );
        } elsif (SERVICE_CONTROL_SHUTDOWN == $Message) {
            # Yikes! The system is shutting down. We had better clean up
            # and stop.
            # Tell the SCM that we are preparing to shutdown and that we expect
            # it to take 25 seconds, so don't terminate us for at least
            # 25 seconds...
            Win32::Daemon::State(SERVICE_STOP_PENDING, 25000);
        }
    }
    # Snoose for awhile so we don't suck up cpu time...
    Win32::Sleep($SERVICE_SLEEP_TIME);
}

__END__

=head1 NAME

fusioninventory-win32-service - FusionInventory Agent service for Windows