#!/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;
}