Hi Felix,
TMTOWTDI. For standalone scripts I don't care very much about style.
Let's see below ...
On 08.05.2011 13:17, Felix Schumacher wrote:
Hi Rainer,
Am Dienstag, den 03.05.2011, 12:12 +0000 schrieb rj...@apache.org:
Author: rjung
Date: Tue May 3 12:12:35 2011
New Revision: 1099032
URL: http://svn.apache.org/viewvc?rev=1099032&view=rev
Log:
Add a script to check web.xml and httpd mime.types
for differences.
Added:
tomcat/trunk/res/scripts/
tomcat/trunk/res/scripts/check-mime.pl (with props)
Added: tomcat/trunk/res/scripts/check-mime.pl
URL:
http://svn.apache.org/viewvc/tomcat/trunk/res/scripts/check-mime.pl?rev=1099032&view=auto
==============================================================================
--- tomcat/trunk/res/scripts/check-mime.pl (added)
+++ tomcat/trunk/res/scripts/check-mime.pl Tue May 3 12:12:35 2011
@@ -0,0 +1,410 @@
+#!/usr/bin/perl
+
...
+# Script version, printed via getopts with "--version"
+$main::VERSION = '1.0';
Any reason for not using 'our' like
our $VERSION = '1.0'; ?
Done.
+
...
+
+# Parse arguments:
+# -m: mime.types file (httpd) to use
+# -i: input web.xml file to check
+# -o: output web.xml file (gets generated and overwritten)
+
+$Getopt::Std::STANDARD_HELP_VERSION = 1;
+our($opt_m, $opt_i, $opt_o);
Why should those options be visible by everyone outside this package?
'my' should be enough:
my ($opt_m, $opt_i, $opt_o);
Doesn't work. Seems getopts needs "our".
+getopts('m:i:o:');
+
+
+# Check whether mandatory arguments are given
+if ($opt_m eq '' || $opt_i eq '' || $opt_o eq '') {
+ HELP_MESSAGE(*STDOUT);
+ exit 1;
+}
+
+
+# Switch locale for alphabetical ordering
+setlocale(LC_COLLATE, $LOCALE);
+
+# Read and parse httpd mime.types, build up hash extension->mime-type
+open(MIMETYPES, "<$opt_m") or die "Could not open file '$opt_m' for read -
Aborting!";
You could use three param open and use lexical filehandles like
open my $mimetpyes_fh, '<', $opt_m or die "...";
DONE
+while (<MIMETYPES>) {
+ chomp($_);
+ $line = $_;
while (my $line =<$mimetypes_fh>) {
chomp($line);
Keep as is, because I used the original line in the below WARN message.
+ $line =~ s/#.*//;
+ $line =~ s/^\s+//;
+ if ($line ne '') {
+ @cols = split(/\s+/, $line);
+ if ($#cols> 0) {
+ for ($i=1; $i<= $#cols; $i++) {
+ $httpd{$cols[$i]} = $cols[0];
+ }
+ } else {
+ print STDERR "WARN mime.types line ignored: $_\n";
+ }
+ }
+}
+close(MIMETYPES);
($mimetype, @endings) = split(/\s+/, $line);
if (@endings> 0) {
for my $ending (@endings) {
$httpd{$ending} = $mimetype;
}
} else {
print STDERR "WARN mime.types line ignored: $_\n";
}
close $mimetypes_fh;
would be possible also.
DONE
+
+# Read and parse web.xml, build up hash extension->mime-type
+# and store the file parts form before and after mime mappings.
+open(WEBXML, "<$opt_i") or die "Could not open file '$opt_i' for read -
Aborting!";
three-params open could be used again.
+
+# Skip and record all lines before the first mime type definition.
+# Because of comment handling we need to read one line ahead.
+$line = '';
+while (<WEBXML>) {
+ if ($_ !~ /<mime-mapping>/) {
+ $tomcat_pre .= $line;
+ } else {
+ last;
+ }
+ $line = $_;
+}
+
+$commented = 0;
+# If the previous line was start of a comment
+# set marker, else add it to pre.
+if ($line =~ /^\s*<!--[^>]*$/) {
+ $commented = 1;
+} else {
+ $tomcat_pre .= $line;
+}
+
+# Now we parse blocks of the form:
+#<mime-mapping>
+#<extension>abs</extension>
+#<mime-type>audio/x-mpeg</mime-type>
+#</mime-mapping>
+# Optional single comment lines directly after "<mime-mapping>"
+# are allowed. The whole block is also allowed to be commented out.
+
+while ($_ =~ /^\s*<mime-mapping>\s*$/) {
+ $_ =<WEBXML>;
+ chomp($_);
+ $comment = '';
+ if ($_ =~ /^\s*<!--([^>]*)-->\s*$/) {
+ $comment = $1;
+ $_ =<WEBXML>;
+ chomp($_);
+ }
+ if ($_ =~ /^\s*<extension>([^<]*)<\/extension>\s*$/ ) {
+ $extension = $1;
+ $extension =~ s/^\s+//;
+ $extension =~ s/\s+$//;
+ } else {
+ print STDERR "ERROR Parse error in Tomcat mime-mapping line $.\n";
+ print STDERR "ERROR Expected<extension>...</extension>', got '$_' -
Aborting!\n";
+ close(WEBXML);
+ exit 2;
+ }
+ $_ =<WEBXML>;
+ chomp($_);
+ if ($_ =~ /^\s*<mime-type>([^<]*)<\/mime-type>\s*$/ ) {
+ $type = $1;
+ $type =~ s/^\s+//;
+ $type =~ s/\s+$//;
+ if (exists($tomcat{$extension})&& $tomcat{$extension} ne $type) {
+ print STDERR "WARN MIME mapping redefinition detected!\n";
+ print STDERR "WARN Kept '$extension' -> '$tomcat{$extension}'\n";
+ print STDERR "WARN Ignored '$extension' -> '$type'\n";
+ } else {
+ $tomcat{$extension} = $type;
+ if ($comment ne '') {
+ $tomcat_comments{$extension} = $comment;
+ }
+ if ($commented) {
+ $tomcat_commented{$extension} = 1;
+ }
+ push(@tomcat_extensions, $extension);
+ }
+ } else {
+ print STDERR "ERROR Parse error in Tomcat mime-mapping line $.\n";
+ print STDERR "ERROR Expected<mime-type>...</mime-type>', got '$_' -
Aborting!\n";
+ close(WEBXML);
+ exit 3;
+ }
+ $_ =<WEBXML>;
+ chomp($_);
+ if ($_ !~ /^\s*<\/mime-mapping>\s*$/) {
+ print STDERR "ERROR Parse error in Tomcat mime-mapping line $.\n";
+ print STDERR "ERROR Expected '</mime-mapping>', got '$_' -
Aborting!\n";
+ close(WEBXML);
+ exit 4;
+ }
+ $_ =<WEBXML>;
+ # Check for comment closure
+ if ($commented&& $_ =~ /^[^<]*-->\s*$/) {
+ $commented = 0;
+ $_ =<WEBXML>;
+ }
+ # Check for comment opening
+ if ($_ =~ /^\s*<!--[^>]*$/) {
+ $commented = 1;
+ $line = $_;
+ $_ =<WEBXML>;
+ }
+}
+
+# Add back the last comment line already digested
+if ($commented) {
+ $tomcat_post = $line;
+}
+
+# Read and record the remaining lines
+$tomcat_post .= $_;
+while (<WEBXML>) {
+ if ($_ =~ /<mime-mapping>/) {
+ print STDERR "ERROR mime-mapping blocks are not consecutive\n";
+ print STDERR "ERROR See line $. in $opt_i - Aborting!\n";
+ close(WEBXML);
+ exit 5;
+ }
+ $tomcat_post .= $_;
+}
+
+close(WEBXML);
+
+
+# Look for extensions existing for Tomcat but not for httpd.
+# Log them if they are not in TOMCAT_ONLY
+for $extension (@tomcat_extensions) {
+ if (!exists($httpd{$extension})) {
+ if (!exists($TOMCAT_ONLY{$extension})) {
+ print STDERR "WARN Extension '$extension' found in web.xml but not in
mime.types is missing from TOMCAT_ONLY list.\n";
+ print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}'
will be removed from generated web.xml.\n";
+ } elsif ($tomcat{$extension} ne $TOMCAT_ONLY{$extension}) {
+ print STDERR "WARN Additional extension '$extension' allowed by
TOMCAT_ONLY list, but has new definition.\n";
+ print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}'
will be replaced" .
+ " by '$extension' -> '$TOMCAT_ONLY{$extension}' in
generated web.xml.\n";
+ }
+ }
+}
+
+
+# Look for extensions with inconsistent mime types for Tomcat and httpd.
+# Log them if they are not in TOMCAT_KEEP
+for $extension (@tomcat_extensions) {
+ if (exists($httpd{$extension})&& $tomcat{$extension} ne
$httpd{$extension}) {
+ if (!exists($TOMCAT_KEEP{$extension})) {
+ print STDERR "WARN Mapping '$extension' inconsistency is missing from
TOMCAT_KEEP list.\n";
+ print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}'
will be replaced" .
+ " by '$extension' -> '$httpd{$extension}' in generated
web.xml.\n";
+ } elsif ($tomcat{$extension} ne $TOMCAT_KEEP{$extension}) {
+ print STDERR "WARN Extension '$extension' inconsistency allowed by
TOMCAT_KEEP list, but has new definition.\n";
+ print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}'
will be replaced" .
+ " by '$extension' -> '$TOMCAT_KEEP{$extension}' in
generated web.xml.\n";
+ }
+ }
+}
+
+
+# Log if extensions in web.xml are not sorted alphabetically.
+$check = 0;
+$msg = '';
+for ($i=1; $i<= $#tomcat_extensions; $i++) {
+ if ($tomcat_extensions[$i - 1] ge $tomcat_extensions[$i]) {
+ $check = 1;
+ $msg .= "WARN Extension '" . $tomcat_extensions[$i - 1] . "' defined before '" .
$tomcat_extensions[$i] . "'\n";
+ }
+}
my $last_line = $tomcat_extensions[0];
for my $current_line (@tomcat_extensions) {
if ($last_line ge $current_line) {
$check = 1;
$msg .= "WARN Extension '$last_line' defined before
'$current_line'\n";
}
$last_line = $current_line;
}
DONE
Not really shorter, but we don't have to look up array elements.
+if ($check) {
We could check for $msg and get rid of $check.
DONE
+ print STDERR "WARN MIME type definitions in web.xml were not sorted
alphabetically by extension\n";
+ print STDERR $msg;
+ print STDERR "WARN This will be fixed in the new generated web.xml file
'$opt_o'.\n";
+}
+
+
+# Log all extensions defined for httpd but not for Tomcat
+for $extension (sort keys %httpd) {
+ if (!exists($tomcat{$extension})) {
+ print STDERR "INFO Extension '$extension' found for httpd, but not for
Tomcat.\n";
+ print STDERR "INFO Definition '$extension' -> '$httpd{$extension}' will be
added" .
+ " to the generated web.xml.\n";
+ }
+}
+
+
+# Generate new web.xml:
+# - Use definitions from httpd
+# - Add TOMCAT_ONLY
+# - Fix TOMCAT_KEEP
+# - output tomcat_pre, sorted mime-mappings, tomcat_post.
+for $extension (keys %TOMCAT_ONLY) {
+ $httpd{$extension} = $TOMCAT_ONLY{$extension};
+}
while (my ($mimetype, $file_extension) = each %TOMCAT_ONLY) {
$httpd{file_extension) = $mimetype;
}
We don't have to lookup the file extension ourself.
DONE with a bit of syntax fixing :)
+for $extension (keys %TOMCAT_KEEP) {
+ $httpd{$extension} = $TOMCAT_KEEP{$extension};
+}
see above
DONE
+open (NEW, ">$opt_o") or die "Could not open file '$opt_o' for write -
Aborting!";
three params open and lexical filehandle?
DONE
+print NEW $tomcat_pre;
+for $extension (sort keys %httpd) {
while combined whith each %httpd to omit hash lookup a little bit later
while (my ($mimetype, $file_extension) = each %httpd) {
...
Not here, because I want keys sorted.
Regards
Felix
Thanks!
Committed in r1100724.
Rainer
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org