feat: add full Zonemaster stack with Docker and Spanish UI
- Clone all 5 Zonemaster component repos (LDNS, Engine, CLI, Backend, GUI) - Dockerfile.backend: 8-stage multi-stage build LDNS→Engine→CLI→Backend - Dockerfile.gui: Astro static build served via nginx - docker-compose.yml: backend (internal) + frontend (port 5353) - nginx.conf: root redirects to /es/, /api/ proxied to backend - zonemaster-gui/config.ts: defaultLanguage set to 'es' (Spanish) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
181
zonemaster/utils/updateTestPlanReadme.pl
Executable file
181
zonemaster/utils/updateTestPlanReadme.pl
Executable file
@@ -0,0 +1,181 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Pod::Usage;
|
||||
use Getopt::Long;
|
||||
use File::Basename;
|
||||
|
||||
# command line options
|
||||
my $dirloc = '.'; # directory for searching test cases
|
||||
my $help;
|
||||
my $DEBUG = 0;
|
||||
|
||||
sub main {
|
||||
my $tcCounter = 0;
|
||||
|
||||
GetOptions(
|
||||
'help|?' => \$help,
|
||||
'dir|d=s' => \$dirloc,
|
||||
'debug' => \$DEBUG,
|
||||
) or pod2usage(2);
|
||||
|
||||
if ($help) {
|
||||
pod2usage(1);
|
||||
exit;
|
||||
}
|
||||
opendir(my $dir, $dirloc) || die "cannot open directory $dirloc";
|
||||
|
||||
my @directories;
|
||||
|
||||
for my $f (readdir $dir) {
|
||||
my $d = "$dirloc/$f";
|
||||
|
||||
if (! -d $d) {
|
||||
say STDERR qq{Skipping non-directory: $d} if $DEBUG;
|
||||
next;
|
||||
}
|
||||
|
||||
if ($f =~ /^\./) {
|
||||
say STDERR qq{Skipping hidden directory: $d} if $DEBUG;
|
||||
next;
|
||||
}
|
||||
|
||||
if ($f !~ /-TP$/) {
|
||||
say STDERR qq{Skipping directory not ending in "-TP": $d} if $DEBUG;
|
||||
next;
|
||||
}
|
||||
|
||||
push @directories, $d;
|
||||
}
|
||||
|
||||
close $dir;
|
||||
|
||||
@directories = sort { $a cmp $b } @directories;
|
||||
|
||||
foreach my $d (@directories) {
|
||||
say STDERR "Processing directory $d" if $DEBUG;
|
||||
$tcCounter += tcList($d);
|
||||
}
|
||||
|
||||
if ($tcCounter == 0) {
|
||||
say STDERR qq{No test cases found};
|
||||
say STDERR qq{Use -d to specify directory where all test plans (i.e. directories ending in "-TP") reside};
|
||||
exit 1;
|
||||
}
|
||||
}
|
||||
|
||||
sub tcList
|
||||
{
|
||||
my $tcDir = shift;
|
||||
|
||||
my $tcCount = 0;
|
||||
my $script_name = basename($0);
|
||||
|
||||
my $output = <<"HEADER";
|
||||
<!-- Content until EOF generated by script $script_name from Zonemaster/Zonemaster utils directory -->
|
||||
|
||||
## Test cases list
|
||||
|
||||
|Test Case |Test Case Description|
|
||||
|:---------|:--------------------|
|
||||
HEADER
|
||||
|
||||
opendir(my $dir, $tcDir);
|
||||
my @files = grep { ! /^\./ } readdir $dir;
|
||||
close $dir;
|
||||
|
||||
@files = sort {$a cmp $b} @files;
|
||||
|
||||
foreach my $f (@files) {
|
||||
next if $f eq "README.md";
|
||||
unless ($f =~ /^[a-z]+[0-9]+\.md$/) {
|
||||
warn "Skip file with unknown file name pattern: $f\n";
|
||||
next;
|
||||
}
|
||||
$output .= tcName("$tcDir/$f");
|
||||
$tcCount++;
|
||||
}
|
||||
|
||||
if ( ! grep( /^README\.md$/, @files ) ) {
|
||||
warn "No README.md file in folder $tcDir\n";
|
||||
}
|
||||
else {
|
||||
writeReadme( "$tcDir/README.md", $output );
|
||||
}
|
||||
|
||||
return $tcCount;
|
||||
}
|
||||
|
||||
sub writeReadme
|
||||
{
|
||||
my ( $tcPath, $tcTable ) = @_;
|
||||
|
||||
# slurp README content until pattern
|
||||
my $content = "";
|
||||
open( my $in, '<', $tcPath ) or die "Cannot open file $tcPath: $!";
|
||||
while( <$in> ) {
|
||||
last if /^## Test cases list$/;
|
||||
last if /^<!-- Content until EOF generated by script .* -->$/;
|
||||
$content .= $_;
|
||||
}
|
||||
close $in;
|
||||
|
||||
$content .= $tcTable;
|
||||
|
||||
open( my $file, '>', $tcPath ) or die "Cannot open file $tcPath: $!";
|
||||
print $file $content;
|
||||
close $file;
|
||||
}
|
||||
|
||||
sub tcName
|
||||
{
|
||||
my $tcPath = shift;
|
||||
my $basename = basename($tcPath);
|
||||
my $testcase = uc (basename($tcPath, ".md"));
|
||||
|
||||
my $output = "";
|
||||
|
||||
open my $file, $tcPath or die "Cannot open file $tcPath: $!";
|
||||
my $header = <$file>;
|
||||
if (defined $header) {
|
||||
if ($header =~ /^#+ +([A-Z]+[0-9]+): +(.*)/) {
|
||||
|
||||
# For each test case
|
||||
$output .= "|[$testcase]($basename)|$2|\n";
|
||||
|
||||
warn "$tcPath: Test case ID does not match on first line\n" unless $1 eq $testcase;
|
||||
} else {
|
||||
warn "$tcPath: mismatch on first line\n";
|
||||
};
|
||||
} else {
|
||||
warn "$tcPath: empty file or empty first line\n";
|
||||
}
|
||||
close $file;
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
main();
|
||||
|
||||
=head1 NAME
|
||||
|
||||
updateTestPlanReadme
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This tools updates all TestPlans README files with the TestPlan's test cases.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
From the root of the project:
|
||||
|
||||
./utils/updateTestPlanReadme.pl -d docs/public/specifications/tests
|
||||
|
||||
Optional arguments:
|
||||
|
||||
--dir Directory path of the test case directory
|
||||
--help This help text
|
||||
|
||||
=cut
|
||||
Reference in New Issue
Block a user