FEL/services/findPVs
author Heinz Junkes <junkes@fhi-berlin.mpg.de>
Fri, 19 Jan 2018 16:05:31 +0100
changeset 10 f7c1eb1e5733
permissions -rwxr-xr-x
Add services docu

#!/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");