#!/usr/bin/perl
use lib '/home/channel/EPICS/base/lib/perl/';
use MongoDB;
use MongoDB::Timestamp;
use CA;
my $hostname = "localhost";
my $port = 27017;
my $conn = MongoDB::Connection->new( "host" => "$hostname",
"port" => $port );
my $db = $conn->get_database( 'channelfinder' );
my $ioc_stats = $db->get_collection( 'ioc_stats' );
my $pv_stats = $db->get_collection( 'pv_stats' );
$path="/srv/ioc/log/Database";
@hosts = qw(ioc160 ioc161 ioc162 ioc163 ioc164 ioc165 ioc167 ioc168 agrajag zoot bacnet-gw resume fel03 mprot fel04);
my $dt = DateTime->now; # Stores current date and time as datetime object
my $date = $dt->ymd; # Retrieves date as a string in 'yyyy-mm-dd' format
my $time = $dt->hms; # Retrieves time as a string in 'hh:mm:ss' format
my $dtString = $date ." ".$time;
%iocs = ();
foreach $host(@hosts) {
open (SSH,"/usr/bin/ssh epics\@$host ls $path/* |") or die "$!\n";
while (<SSH>) {
$name = $_;
$name =~ s{.*/}{};
$name =~ s{\.[^.]+$}{};
$iocs{ $name } = $host;
}
close SSH;
}
while ( my ($name, $host) = each(%iocs) ) {
$ioc_stats->remove({name => $name});
$ioc_stats->insert({name => $name,
host => $host,
type => 'ioc',
dt => $dtString });
}
$cnt = $ioc_stats->count();
printf("Info: $cnt iocs\n");
sub readDesc ()
{
my ($chan, $status, $data) = @_;
$desc = $data;
#print "Desc in callback : $desc\n";
}
sub readVal ()
{
my ($chan, $status, $data) = @_;
$val = $data;
#print "Val in callback : $val\n";
}
sub readDisa ()
{
my ($chan, $status, $data) = @_;
$disa = $data;
#print "DISA in callback : $disa\n";
}
while ( my ($ioc, $host) = each(%iocs) ) {
print " ............ $ioc on $host ..................\n";
open (SSH,"/usr/bin/ssh epics\@$host cat $path/$ioc.dbl |") or die "$!\n";
while (<SSH>) {
$pv=$_;
chomp($pv);
print "PV: $pv ... ";
$pv_stats->remove({name => $pv});
my $pv_desc = $pv . ".DESC";
my $pv_disa = $pv . ".DISA";
$pv_chan = CA->new($pv_desc);
eval { CA->pend_io(1); };
if ($@) {
if ($@ =~ m/^ECA_TIMEOUT/) {
print "Channel $pv_chan->name connect timed out.\n";
} else {
die $@;
}
} else {
printf " Host: %s\n", $pv_chan->host_name;
$host = $pv_chan->host_name;
}
if($pv_chan->is_connected) {
$pv_chan->get_callback (\&readDesc,1);
eval { CA->pend_io(2); };
if ($@) {
if ($@ =~ m/^ECA_TIMEOUT/) {
print "Channel $pv_chan->name connect timed out.\n";
} else {
die $@;
}
}
print " DESC : $desc ... ";
$pv_chan = CA->new($pv);
eval { CA->pend_io(2); };
if ($@) {
if ($@ =~ m/^ECA_TIMEOUT/) {
print "Channel $pv_chan->name connect timed out.\n";
} else {
die $@;
}
}
$pv_chan->get_callback (\&readVal,1);
eval { CA->pend_io(2); };
if ($@) {
if ($@ =~ m/^ECA_TIMEOUT/) {
print "Channel $pv_chan->name connect timed out.\n";
} else {
die $@;
}
}
print " VAL : $val ... ";
$pv_chan = CA->new($pv_disa);
eval { CA->pend_io(2); };
if ($@) {
if ($@ =~ m/^ECA_TIMEOUT/) {
print "Channel $pv_chan->name connect timed out.\n";
} else {
die $@;
}
}
$pv_chan->get_callback (\&readDisa,1);
eval { CA->pend_io(2); };
if ($@) {
if ($@ =~ m/^ECA_TIMEOUT/) {
print "Channel $pv_chan->name connect timed out.\n";
} else {
die $@;
}
}
print " DISA : $disa ...\n";
$pv_stats->insert({ name => $pv,
ioc => $ioc,
host => $host,
desc => $desc,
val => $val,
disa => $disa,
type => "toBeDef",
dt => $dtString });
}
}
close SSH;
}
$cnt = $pv_stats->count();
print ("Info: $cnt PVs \n");