home *** CD-ROM | disk | FTP | other *** search
/ CD Actual Thematic 7: Programming / CDAT7.iso / Share / Editores / Perl5 / perl / lib / site / Win32 / EventLog.pm < prev    next >
Encoding:
Perl POD Document  |  1997-08-10  |  6.1 KB  |  265 lines

  1. package Win32::EventLog;
  2.  
  3. #EventLog.pm
  4. #Creates an object oriented interface to the Windows NT Evenlog 
  5. #Written by Jesse Dougherty
  6. #
  7.  
  8. $VERSION = '0.01';
  9.  
  10. require Exporter;
  11. require DynaLoader;
  12. #use Win32;
  13.  
  14. die "The Win32::Eventlog module works only on Windows NT" if(!Win32::IsWinNT() );
  15.  
  16. @ISA= qw( Exporter DynaLoader );
  17. # Items to export into callers namespace by default. Note: do not export
  18. # names by default without a very good reason. Use EXPORT_OK instead.
  19. # Do not simply export all your public functions/methods/constants.
  20. @EXPORT = qw(
  21.     EVENTLOG_AUDIT_FAILURE
  22.     EVENTLOG_AUDIT_SUCCESS
  23.     EVENTLOG_BACKWARDS_READ
  24.     EVENTLOG_END_ALL_PAIRED_EVENTS
  25.     EVENTLOG_END_PAIRED_EVENT
  26.     EVENTLOG_ERROR_TYPE
  27.     EVENTLOG_FORWARDS_READ
  28.     EVENTLOG_INFORMATION_TYPE
  29.     EVENTLOG_PAIRED_EVENT_ACTIVE
  30.     EVENTLOG_PAIRED_EVENT_INACTIVE
  31.     EVENTLOG_SEEK_READ
  32.     EVENTLOG_SEQUENTIAL_READ
  33.     EVENTLOG_START_PAIRED_EVENT
  34.     EVENTLOG_SUCCESS
  35.     EVENTLOG_WARNING_TYPE
  36. );
  37.  
  38. sub AUTOLOAD {
  39.     # This AUTOLOAD is used to 'autoload' constants from the constant()
  40.     # XS function.  If a constant is not found then control is passed
  41.     # to the AUTOLOAD in AutoLoader.
  42.  
  43.     my($constname);
  44.     ($constname = $AUTOLOAD) =~ s/.*:://;
  45.     #reset $! to zero to reset any current errors.
  46.     $!=0;
  47.     my $val = constant($constname, @_ ? $_[0] : 0);
  48.     if ($! != 0) {
  49.     if ($! =~ /Invalid/) {
  50.         $AutoLoader::AUTOLOAD = $AUTOLOAD;
  51.         goto &AutoLoader::AUTOLOAD;
  52.     }
  53.     else {
  54.         ($pack,$file,$line) = caller;
  55.         die "Your vendor has not defined Win32::EventLog macro $constname, used at $file line $line.";
  56.     }
  57.     }
  58.     eval "sub $AUTOLOAD { $val }";
  59.     goto &$AUTOLOAD;
  60. }
  61.  
  62.  
  63. #Open
  64. #this method serves as a class constructor for the EventLog class.
  65. #Note:
  66. #
  67. #
  68. #               Win32::EventLog::Open($this, "source name", "ServerName");
  69. #
  70. sub Open
  71. {
  72.     if($#_ < 1){
  73.         die "usage: Open(\$this, \$sourcename[, \$servername])\n";
  74.     }
  75.  
  76.     my ($SourceName, $ServerName)=($_[1],$_[2]);
  77.     my ($handle);
  78.  
  79.     #Set the handle for this object.
  80.  
  81.  
  82.     OpenEventLog($handle, $ServerName, $SourceName);
  83.     $_[0] = {'handle' => $handle,
  84.         'Source' => $SourceName,
  85.         'Computer' => $ServerName };
  86.  
  87.     bless $_[0];
  88. }
  89.  
  90. sub Backup
  91. {
  92.     $self = shift;
  93.     if($#_ != 0){
  94.         die " usage: Backup(Filename)\n";
  95.     }
  96.     local( $FileName )= @_;
  97.     local ($Result);
  98.  
  99.     $Result = BackupEventLog($self->{'handle'},$FileName);
  100.     if(!$Result){
  101.         $!=Win32::GetLastError();
  102.     }
  103.  
  104.     return($Result);
  105.  
  106. }
  107.  
  108. #Read
  109. # Note: the EventInfo arguement requires a hash reference.
  110. sub Read
  111. {
  112.     $self = shift;
  113.     if($#_ != 2){
  114.         die "usage: Read(flags, RecordOffSet, hashref)\n";
  115.     }
  116.     local( $ReadFlags,$RecordOffSet)=@_;
  117.     local ($Result);
  118.     local ($datalength, $dataoffset, $sid);
  119.     local ($length, $reserved, $recordnumber, $timegenerated, $timewritten, $eventid);
  120.     local ($eventtype, $numstrings, $eventcategory, $reservedflags);
  121.     local ($closingrecordnumber, $stringoffset, $usersidlength, $usersidoffset);
  122.  
  123. #The following is stolen shamelessly from Wyt's tests for the registry. 
  124.  
  125.     $Result = ReadEventLog( $self->{'handle'}, $ReadFlags,
  126.     $RecordOffSet, $header, $source, $computer, $sid, $data, $strings );
  127.  
  128.     ( $length, $reserved, $recordnumber, $timegenerated, $timewritten, $eventid,
  129.           $eventtype, $numstrings, $eventcategory, $reservedflags,
  130.           $closingrecordnumber, $stringoffset, $usersidlength, $usersidoffset,
  131.           $datalength, $dataoffset ) = unpack( 'l6s4l6', $header );
  132.  
  133. #make a hash out of the values returned from ReadEventLog.
  134.  
  135.     $_[2]={         'Source'    =>          $source,
  136.                 'Computer'  =>          $computer,
  137.                 'Length'        =>              $datalength,
  138.                 'Category' =>   $eventcategory,
  139.                 'RecordNumber' =>       $recordnumber,
  140.                 'TimeGenerated' =>      $timegenerated,
  141.                 'Timewritten' =>        $timewritten,
  142.                 'EventID' =>            $eventid,
  143.                 'EventType' =>          $eventtype,
  144.                 'ClosingRecordNumber' => $closingrecordnumber,
  145.                 'Strings' =>            $strings,
  146.                 'Data'  =>                      $data,
  147.             };
  148.  
  149.     if(!$Result){
  150.         $!=Win32::GetLastError();
  151.     }
  152.  
  153.     return($Result);
  154.  
  155. }
  156.  
  157. sub Report
  158. {
  159.     my $self = shift;
  160.     
  161.     if($#_ != 0){
  162.         die "usage: Report( %Event )\n";
  163.     }
  164.  
  165.     local( $EventInfo )= @_;
  166.     local ($Result);
  167.  
  168.     if( ref( $EventInfo)  eq "HASH" ){
  169.  
  170.         local ($length, $reserved, $recordnumber, $timegenerated, $timewritten, $eventid);
  171.         local ($eventtype, $numstrings, $eventcategory, $reservedflags);
  172.         local ($closingrecordnumber, $stringoffset, $usersidlength, $usersidoffset);
  173.         local ($source, $reserved, $data, $strings);
  174.     
  175.         $eventcategory = $EventInfo->{'Category'};
  176.         $source=$self->{'Source'};
  177.         $computer=$self->{'Computer'};
  178.         $length=$EventInfo->{'Length'};
  179.         $recordnumber=$EventInfo->{'RecordNumber'};
  180.         $timegenerated=$EventInfo->{'TimeGenerated'};
  181.         $timewritten=$EventInfo->{'Timewritten'};
  182.         $eventid =$EventInfo->{'EventID'};
  183.         $eventtype=$EventInfo->{'EventType'};
  184.         $closingrecordnumber=$EventInfo->{'ClosingRecordNumber'};
  185.         $strings=$EventInfo->{'Strings'};
  186.         $data=$EventInfo->{'Data'};
  187.  
  188.         $Result = WriteEventLog( $computer,$source, $eventtype, $eventcategory, $eventid, $reserved, $data, $strings);
  189.  
  190.         } 
  191.         else{
  192.             die "Win32::EventLog::Report requires a hash reference as arg 3\n";
  193.         }
  194.  
  195.     if(!$Result){
  196.         $!=Win32::GetLastError();
  197.     }
  198.  
  199.     return($Result);
  200.  
  201.  
  202. }
  203.  
  204. sub GetOldest
  205. {
  206.     my $self=shift;
  207.     local ($Result);
  208.         
  209.     if($#_ != 0){
  210.         die "usage: GetOldest( $scalaref )\n";
  211.     }
  212.  
  213.     $Result = GetOldestEventLogRecord( $self->{'handle'},$_[0]);
  214.     if(!$Result){
  215.         $!=Win32::GetLastError();
  216.     }
  217.  
  218.     return($Result);
  219.  
  220. }
  221.  
  222. sub GetNumber
  223. {
  224.     my $self=shift;
  225.     local ($Result);
  226.  
  227.     if($#_ != 0){
  228.         die "usage: GetNumber( $scalaref )\n";
  229.     }
  230.  
  231.     $Result = GetNumberOfEventLogRecords($self->{'handle'}, $_[0]);
  232.  
  233.     if(!$Result){
  234.         $!=Win32::GetLastError();
  235.     }
  236.  
  237.     return($Result);
  238.  
  239.     
  240. }
  241. sub Clear
  242. {
  243.     my $self=shift;
  244.     local ($Result);
  245.     if($#_ != 0){
  246.         die "usage: Clear( $FileName )\n";
  247.     }
  248.     local( $filename) = @_;
  249.  
  250.     $Result = ClearEventLog($self->{'handle'}, $filename);
  251.  
  252.     if(!$Result){
  253.         $!=Win32::GetLastError();
  254.     }
  255.  
  256.     return($Result);
  257.  
  258. }
  259.  
  260. bootstrap Win32::EventLog;
  261.  
  262.  
  263. 1;
  264. __END__
  265.