#!/usr/bin/perl -w
#  $Id$
# -----------------------------------------------------------------------------
#  The part of 'IP cameras retrival' project
#  check if camera is accessible over network
#  has to be run by application owner
# -----------------------------------------------------------------------------
#  Author: teetov,
#  Edited by:
#  QA by:
#  Copyright: videoNEXT LLC
# -----------------------------------------------------------------------------
#  purpose:
#     check if any of broken cameras are accessible over network. 
#     plase the message (SUCCESS OR FAIL) in conf/OBJID/stat.network 
#  note: 
#     only BROKEN cameras are checked
#     logger cannot be used since conflict with sm::logger
#
#  usage:
#     chould not be used manually
#

use strict;
use Net::Ping;
use lib "$ENV{APL}/sm/lib";
use SM::Config qw(SM_Devices);  # cannot use logger it will conflict with sm::logger
#use Data::Dumper;

my $DEVCONF="$ENV{APL}/var/conf";
my $SLEEP=30;
my $TIMEOUT=2;

sub status_network {
    my ($dev,$port,$result)=@_;
    #$log->info("check network conectivity for BROKEN camera\[DEVID=$dev->{DEVID}\]: $result (http://$dev->{DEVIP}:$port)"); 
    open RESULT,">$DEVCONF/$dev->{DEVID}/stat.network\n";
    print RESULT  "PING=$result #". scalar(gmtime) . " http://$dev->{DEVIP}:$port\n";
    close RESULT;
}

# MAIN ===========================================================================
#$log->info("Starting ..."); #loger cannot be used
for(;;){
  my $conf=SM_Devices();        # conf has status info
  my $p = Net::Ping->new("tcp",$TIMEOUT);
  foreach my $dev ( sort grep { $$conf{$_}->{DEVICETYPE} eq 'CAMERA'} keys %$conf) {
    my $cfg=$conf->{$dev};     # device configuration
    next if not defined $cfg->{_status};
    next if $cfg->{_status} ne 'BROKEN';
    next if $cfg->{CAMERAMODEL}=~/^(DEMO|URL)$/; # do not ping URL/DEMO cameras
    my $port=80; # default value
    $port=$cfg->{HTTP_PORT} if defined $cfg->{HTTP_PORT} and $cfg->{HTTP_PORT};
    $p->port_number($port);
    if($p->ping( $cfg->{DEVIP})) {
      status_network($cfg,$port,'SUCCESS');
    }else{
      status_network($cfg,$port,'FAIL');
    }
  }
  sleep $SLEEP;
}
