OpenSolaris_b135/cmd/auditrecord/mkmsg.pl

#!/usr/perl5/bin/perl -w
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#

# mkmsg.pl -- generate message file content for strings that
# originate in audit_record_attr and audit_event
#
# mkmsg.pl domain po_file_name

require 5.005;
use strict;

use vars qw(
    $parse %translateText
    $debug
    %attr %event %class %skipClass %token %noteAlias);

use locale;
use POSIX qw(locale_h);
use Sun::Solaris::Utils qw(gettext textdomain);
use Sun::Solaris::BSM::_BSMparse;

unless ($#ARGV == 1) {
	print STDERR "usage: $0 domain_name file_name\n";
	exit (1);
}
my $textDomain = $ARGV[0];
my $poFile = $ARGV[1];

# Set message locale
setlocale(LC_ALL, "");
textdomain($textDomain);

my %options;
$options{'classFilter'} = '';		# don''t filter
$debug			= 0;		# debug mode on
$options{'eventFilter'} = '';   	# don''t filter
$options{'idFilter'}	= '';		# don''t filter

$parse = new Sun::Solaris::BSM::_BSMparse($debug, \%options, './',
    '../../lib/libbsm', '.txt');

my ($attr, $token, $skipClass, $noteAlias) = $parse->readAttr();
%class = %{$parse->readClass()};
%event = %{$parse->readEvent()};

%attr  = %$attr;
%token = %$token;
%noteAlias = %$noteAlias;
%skipClass = %$skipClass;

my $label;

my $errString;

foreach $label (sort keys %event) {

	my ($id, $class, $eventDescription) = ('', '', '');
	if (defined($event{$label})) {
		($id, $class, $eventDescription) = @{$event{$label}};
		$eventDescription =~ s/\(\w+\)//;
	}

	my ($name, $description, $title, $skip, @case) = ('', '', '', '', ());
	if (defined($attr{$label})) {
		($name, $description, $title, $skip, @case) = @{$attr{$label}};
		$description = '' if ($description eq 'none');
		$name = '' if ($name eq 'none');
		$title = $name if (($title eq 'none') || (!defined($title)));
	}

# in auditrecord.pl, _either_ $description _or_ $eventDescription
# is used.  Both are put into the message file so that this script
# doesn't have logic dependent on auditrecord.pl

	addToMsgFile($title);
	addToMsgFile($eventDescription);
	addToMsgFile($description);

	my $case;

	foreach $case (@case) {
		addToMsgFile(${$case}[0]);	# description
		#		[1]		# token id (a name list)
		my @comment = split(/\s*:\s*/, ${$case}[2]);
		my $note = ${$case}[3];

		my $comment;
		foreach $comment (@comment) {
			addToMsgFile($comment);
		}
		if ($noteAlias{$note}) {
			addToMsgFile($noteAlias{$note});
		} else {
			addToMsgFile($note);
		}
	}
	
}
writeMsgFile($textDomain, $poFile);

exit (0);

sub addToMsgFile {
	my @text = @_;

	my $text;
	foreach $text (@text) {
		next if ($text =~ /^$/);
		$text =~ s/:/:/g;
		$translateText{$text} = 1;
	}
}

# ids in the .po file must be quoted; since the messages themselves
# contain quotes, quotes must be escaped

sub writeMsgFile {
	my $domain = shift;
	my $file = shift;

	my $text;

	open(Message, ">$file") or
		die "Failed to open $file: $!\n";

	print Message "# File:audit_record_attr: textdomain(\"$domain\")\n";
	foreach $text (sort keys %translateText) {
		$text =~ s/"/\\"/g;
		print Message "msgid \"$text\"\nmsgstr\n";
	}
	close Message;
}