X-Git-Url: https://defaria.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=clients%2FLynuxWorks%2Flib%2Fecrc.pm;fp=clients%2FLynuxWorks%2Flib%2Fecrc.pm;h=456edc3dfd46e6947cf5e64fb4e9ae10de85cd08;hb=a8c84d2892f07a6863b68a11eb0a4a79ffd71fb5;hp=0000000000000000000000000000000000000000;hpb=95384f94f88aceeb5eef2d322210ba4a438b6512;p=clearscm.git diff --git a/clients/LynuxWorks/lib/ecrc.pm b/clients/LynuxWorks/lib/ecrc.pm new file mode 100644 index 0000000..456edc3 --- /dev/null +++ b/clients/LynuxWorks/lib/ecrc.pm @@ -0,0 +1,220 @@ +#!/usr/bin/perl +################################################################################ +# +# File: ecrd.pm: ECR Daemon Client Library +# Description: Perl Module interface to ecrd (ECR Daemon). This is used +# by ecrc and cgi scripts to talk to ECR Daemon +# Author: Andrew@DeFaria.com +# Created: Tue Feb 15 09:40:57 PST 2005 +# Modified: +# Language: Perl +# +# (c) Copyright 2005, LynuxWorks, all rights reserved. +# +################################################################################ +use strict; +use warnings; + +use IO::Socket; + +package ecrc; + require Exporter; + @main::ISA = qw (Exporter); + + @main::EXPORT = qw (Connect GetECRRecord Disconnect); + + my $default_server = (!defined $ENV {ECRDSERVER}) ? "lynx12" : $ENV {ECRDSERVER}; + my $default_port = (!defined $ENV {ECRDPORT}) ? 1500 : $ENV {ECRDPORT}; + my $verbose = 0; + my $debug = 0; + my $command; + my $ecrserver; + + # Forwards + sub ConnectToServer; + sub GetServerAck; + sub GetServerList; + sub GetServerResponse; + sub SendServerAck; + sub SendServerCmd; + + BEGIN { + my $ecrcversion = "1.1"; + + # Reopen STDOUT to make sure it's clear + open STDOUT, ">-" or die "Unable to reopen STDOUT\n"; + + # Set unbuffered output + $| = 1; + } # BEGIN + + sub set_verbose { + $verbose = 1; + } # set_verbose + + sub set_debug { + $debug = 1; + } # set_debug + + sub verbose { + print "@_\n" if $verbose; + } # verbose + + sub debug { + print "DEBUG: @_\n" if $debug; + } # debug + + sub Connect { + my $host = shift; + my $port = shift; + + my $result; + + $host = $default_server if !defined $host; + $port = $default_port if !defined $port; + + $ecrserver = ConnectToServer $host, $port; + + if ($ecrserver) { + verbose "Connected to $host"; + SendServerAck $ecrserver; + } # if + + return $ecrserver; + } # Connect + + sub Disconnect { + my $msg; + + if ($ecrserver) { + if ($command eq "shutdown") { + $msg = "Disconnected from server - shutdown server"; + } else { + $command = "quit"; + $msg = "Disconnected from server"; + } # if + SendServerCmd $ecrserver, $command; + GetServerAck $ecrserver; + verbose "$msg"; + close $ecrserver; + undef $ecrserver; + } # if + } # Disconnect + + sub GetECRRecord { + my $ecr = shift; + + my %fields; + my @ecrs; + + if (!$ecrserver) { + verbose "Not connected to server yet!"; + verbose "Attempting connection to $default_server..."; + if (!Connect $default_server, $default_port) { + print "Unable to connect to server $default_server\n"; + exit 1; + } # if + } # if + + SendServerCmd $ecrserver, $ecr; + GetServerAck $ecrserver; + + if ($ecr eq "\*") { + @ecrs = GetServerList $ecrserver; + } else { + %fields = GetServerResponse $ecrserver; + } # if + + SendServerAck $ecrserver; + + return $ecr eq "\*" ? @ecrs : %fields; + } # GetECRRecord + + END { + verbose "Sending disconnect command to server"; + $command = "quit"; + Disconnect; + } # END + + sub ConnectToServer { + my $host = shift; + my $port = shift; + + # create a tcp connection to the specified host and port + return IO::Socket::INET->new(Proto => "tcp", + PeerAddr => $host, + PeerPort => $port); + } # ConnectToServer + + sub SendServerAck { + my $server = shift; + + print $server "ACK\n"; + } # SendServerAck + + sub GetServerAck { + my $server = shift; + my $srvresp; + + while (defined ($srvresp = <$server>)) { + chomp $srvresp; + if ($srvresp eq "ACK") { + return; + } # if + print "Received $srvresp from server - expected ACK\n"; + } # while + } # GetServerAck + + sub GetServerList { + my $server = shift; + + my @ecrs; + my $srvresp; + + while (defined ($srvresp = <$server>)) { + chomp $srvresp; + last if $srvresp eq "ACK"; + if ($srvresp =~ m/ECR.*was not found/) { + return (); + } else { + push @ecrs, $srvresp; + } # if + } # while + + return @ecrs; + } # GetServerList + + sub GetServerResponse { + my $server = shift; + + my %fields; + my $srvresp; + + while (defined ($srvresp = <$server>)) { + chomp $srvresp; + last if $srvresp eq "ACK"; + if ($srvresp =~ m/ECR.*was not found/) { + return (); + } else { + $srvresp =~ /(^\w+):\s+(.*)/s; + my $value = $2; + if (defined $value) { + $value =~ s/\\n/\n/g; + } else { + $value = ""; + } # if + $fields {$1} = $value; + } # if + } # while + + return %fields; + } # GetServerResponse + + sub SendServerCmd { + my $server = shift; + my $command = shift; + + print $server "$command\n"; + } # SendServerCmd + +1;