Home | History | Annotate | Download | only in auditrecord
      1 #!/usr/perl5/bin/perl -w
      2 #
      3 # CDDL HEADER START
      4 #
      5 # The contents of this file are subject to the terms of the
      6 # Common Development and Distribution License (the "License").
      7 # You may not use this file except in compliance with the License.
      8 #
      9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10 # or http://www.opensolaris.org/os/licensing.
     11 # See the License for the specific language governing permissions
     12 # and limitations under the License.
     13 #
     14 # When distributing Covered Code, include this CDDL HEADER in each
     15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16 # If applicable, add the following below this CDDL HEADER, with the
     17 # fields enclosed by brackets "[]" replaced with your own identifying
     18 # information: Portions Copyright [yyyy] [name of copyright owner]
     19 #
     20 # CDDL HEADER END
     21 #
     22 #
     23 # Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24 # Use is subject to license terms.
     25 #
     26 
     27 # mkmsg.pl -- generate message file content for strings that
     28 # originate in audit_record_attr and audit_event
     29 #
     30 # mkmsg.pl domain po_file_name
     31 
     32 require 5.005;
     33 use strict;
     34 
     35 use vars qw(
     36     $parse %translateText
     37     $debug
     38     %attr %event %class %skipClass %token %noteAlias);
     39 
     40 use locale;
     41 use POSIX qw(locale_h);
     42 use Sun::Solaris::Utils qw(gettext textdomain);
     43 use Sun::Solaris::BSM::_BSMparse;
     44 
     45 unless ($#ARGV == 1) {
     46 	print STDERR "usage: $0 domain_name file_name\n";
     47 	exit (1);
     48 }
     49 my $textDomain = $ARGV[0];
     50 my $poFile = $ARGV[1];
     51 
     52 # Set message locale
     53 setlocale(LC_ALL, "");
     54 textdomain($textDomain);
     55 
     56 my %options;
     57 $options{'classFilter'} = '';		# don''t filter
     58 $debug			= 0;		# debug mode on
     59 $options{'eventFilter'} = '';   	# don''t filter
     60 $options{'idFilter'}	= '';		# don''t filter
     61 
     62 $parse = new Sun::Solaris::BSM::_BSMparse($debug, \%options, './',
     63     '../../lib/libbsm', '.txt');
     64 
     65 my ($attr, $token, $skipClass, $noteAlias) = $parse->readAttr();
     66 %class = %{$parse->readClass()};
     67 %event = %{$parse->readEvent()};
     68 
     69 %attr  = %$attr;
     70 %token = %$token;
     71 %noteAlias = %$noteAlias;
     72 %skipClass = %$skipClass;
     73 
     74 my $label;
     75 
     76 my $errString;
     77 
     78 foreach $label (sort keys %event) {
     79 
     80 	my ($id, $class, $eventDescription) = ('', '', '');
     81 	if (defined($event{$label})) {
     82 		($id, $class, $eventDescription) = @{$event{$label}};
     83 		$eventDescription =~ s/\(\w+\)//;
     84 	}
     85 
     86 	my ($name, $description, $title, $skip, @case) = ('', '', '', '', ());
     87 	if (defined($attr{$label})) {
     88 		($name, $description, $title, $skip, @case) = @{$attr{$label}};
     89 		$description = '' if ($description eq 'none');
     90 		$name = '' if ($name eq 'none');
     91 		$title = $name if (($title eq 'none') || (!defined($title)));
     92 	}
     93 
     94 # in auditrecord.pl, _either_ $description _or_ $eventDescription
     95 # is used.  Both are put into the message file so that this script
     96 # doesn't have logic dependent on auditrecord.pl
     97 
     98 	addToMsgFile($title);
     99 	addToMsgFile($eventDescription);
    100 	addToMsgFile($description);
    101 
    102 	my $case;
    103 
    104 	foreach $case (@case) {
    105 		addToMsgFile(${$case}[0]);	# description
    106 		#		[1]		# token id (a name list)
    107 		my @comment = split(/\s*:\s*/, ${$case}[2]);
    108 		my $note = ${$case}[3];
    109 
    110 		my $comment;
    111 		foreach $comment (@comment) {
    112 			addToMsgFile($comment);
    113 		}
    114 		if ($noteAlias{$note}) {
    115 			addToMsgFile($noteAlias{$note});
    116 		} else {
    117 			addToMsgFile($note);
    118 		}
    119 	}
    120 	
    121 }
    122 writeMsgFile($textDomain, $poFile);
    123 
    124 exit (0);
    125 
    126 sub addToMsgFile {
    127 	my @text = @_;
    128 
    129 	my $text;
    130 	foreach $text (@text) {
    131 		next if ($text =~ /^$/);
    132 		$text =~ s/:/:/g;
    133 		$translateText{$text} = 1;
    134 	}
    135 }
    136 
    137 # ids in the .po file must be quoted; since the messages themselves
    138 # contain quotes, quotes must be escaped
    139 
    140 sub writeMsgFile {
    141 	my $domain = shift;
    142 	my $file = shift;
    143 
    144 	my $text;
    145 
    146 	open(Message, ">$file") or
    147 		die "Failed to open $file: $!\n";
    148 
    149 	print Message "# File:audit_record_attr: textdomain(\"$domain\")\n";
    150 	foreach $text (sort keys %translateText) {
    151 		$text =~ s/"/\\"/g;
    152 		print Message "msgid \"$text\"\nmsgstr\n";
    153 	}
    154 	close Message;
    155 }
    156