develooper Front page | perl.vmsperl | Postings from September 2002

FollowTail.pm file::spec

Thread Next
From:
bob.safran
Date:
September 26, 2002 11:46
Subject:
FollowTail.pm file::spec
Message ID:
OF2E92FE63.7FA265B0-ON88256C40.00662826-88256C40.006707B7@esca.com
All,

I'm trying to get a simple log monitor to work on Perl 5.8.0 with the
latest POE. The code was based off the
sample log watcher written for FreeBSD.

/* Code Start
#!/usr/bin/perl
# $Id$

use warnings;
use strict;
use POE;
use POE::Wheel::FollowTail;

my $device = "dka100";
my $dir = "[rsa.agent.bin]";
my $file = "check-logs.txt";
my $msg_file = File::Spec::VMS->catpath( $device, $dir, $file );

my %logs_to_watch =
  ( msg => $msg_file );
print %logs_to_watch;
print %logs_to_watch;
POE::Session->create
  ( inline_states =>
      { _start => \&begin_watchers,

        msg_record => \&msg_got_record,

        # Handle log resets and errors the same way for each file.
        log_reset => \&generic_log_reset,
        log_error => \&generic_log_error,
      }
  );


sub begin_watchers {
    my $heap = $_[HEAP];

    while ( my ( $service, $log_file ) = each %logs_to_watch ) {
        my $log_watcher = POE::Wheel::FollowTail->new
          ( Filename => $log_file,
            InputEvent => $service . "_record",
            ResetEvent => "log_reset",
            ErrorEvent => "log_error",
          );

        $heap->{services}->{ $log_watcher->ID } = $service;
        $heap->{watchers}->{ $log_watcher->ID } = $log_watcher;
    }
}

sub msg_got_record {
  my $log_record = $_[ARG0];
  print $log_record, "\n";
}

# Handle log resets the same way for each file.  Simply recognize that
# the log file was reset.

sub generic_log_reset {
    my ( $heap, $wheel_id ) = @_[ HEAP, ARG0 ];

    my $service = $heap->{services}->{$wheel_id};
    print "--- $service log reset at ", scalar(gmtime), " GMT\n";
}

# Handle log errors the same way for each file.  Recognize that an
# error occurred while watching the file, and shut the watcher down.
# If this were a real log watcher, it would periodically try to resume
# watching the log file.

sub generic_log_error {
    my ( $heap, $operation, $errno, $error_string, $wheel_id ) =
      @_[ HEAP, ARG0, ARG1, ARG2, ARG3 ];

    my $service = $heap->{services}->{$wheel_id};
    print "--- $service log $operation error $errno: $error_string\n";
    print "--- Shutting down $service log watcher.\n";

    delete $heap->{services}->{$wheel_id};
    delete $heap->{watchers}->{$wheel_id};
}
*/ Code End


Error message is:

kite_hab15$ perl simple_log.pl
msgdka100:[rsa.agent.bin]check-logs.txthandle= GLOB(0x814c2c)
filename= dka100:[rsa.agent.bin]check-logs.txt
fcntl(GLOB(0x814c2c), F_GETFL, etc.) fails: invalid argument
 at /perl_root/lib/site_perl/POE/Wheel/FollowTail.pm line 136
POE::Kernel's run() method was never called.
%SYSTEM-F-ABORT, abort

TIA,
Bob Safran
425.739.3228
ALSTOM's T&D Energy Automation & Information Business

CONFIDENTIALITY:  This e-mail and any attachments are confidential and may
be privileged. If  you are not a named recipient, please notify the sender
immediately and do not disclose the contents to another person,  use it for
any purpose or store or copy the information in any medium.



Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About