xref: /illumos-gate/usr/src/cmd/auditrecord/mkmsg.pl (revision 4f364e7c95ee7fd9d5bbeddc1940e92405bb0e72)
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
32require 5.005;
33use strict;
34
35use vars qw(
36    $parse %translateText
37    $debug
38    %attr %event %class %skipClass %token %noteAlias);
39
40use locale;
41use POSIX qw(locale_h);
42use Sun::Solaris::Utils qw(gettext textdomain);
43use Sun::Solaris::BSM::_BSMparse;
44
45unless ($#ARGV == 1) {
46	print STDERR "usage: $0 domain_name file_name\n";
47	exit (1);
48}
49my $textDomain = $ARGV[0];
50my $poFile = $ARGV[1];
51
52# Set message locale
53setlocale(LC_ALL, "");
54textdomain($textDomain);
55
56my %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
65my ($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
74my $label;
75
76my $errString;
77
78foreach $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}
122writeMsgFile($textDomain, $poFile);
123
124exit (0);
125
126sub 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
140sub 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