make config handel the markers
This commit is contained in:
148
readconfig.pl
148
readconfig.pl
@@ -4,22 +4,7 @@
|
|||||||
#
|
#
|
||||||
# Copyright 2001 Wilmer van der Gaast (lintux@lintux.cx)
|
# Copyright 2001 Wilmer van der Gaast (lintux@lintux.cx)
|
||||||
#
|
#
|
||||||
#
|
# Updated for marker-aware config writing.
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
#
|
|
||||||
#
|
|
||||||
|
|
||||||
my( @info, @conf, @rawconf, $l );
|
my( @info, @conf, @rawconf, $l );
|
||||||
|
|
||||||
@@ -52,6 +37,7 @@ $info[47] = 'Trustee files';
|
|||||||
$info[50] = 'Conversion tables';
|
$info[50] = 'Conversion tables';
|
||||||
$info[60] = 'MAX_CONNECTIONS';
|
$info[60] = 'MAX_CONNECTIONS';
|
||||||
$info[61] = 'MAX_NW_VOLS';
|
$info[61] = 'MAX_NW_VOLS';
|
||||||
|
$info[62] = 'Reserved';
|
||||||
$info[63] = 'MAX_DIR_BASE_ENTRIES';
|
$info[63] = 'MAX_DIR_BASE_ENTRIES';
|
||||||
$info[68] = 'USE_MMAP';
|
$info[68] = 'USE_MMAP';
|
||||||
$info[69] = 'HANDLE_ALL_SAP_TYPS';
|
$info[69] = 'HANDLE_ALL_SAP_TYPS';
|
||||||
@@ -161,6 +147,42 @@ sub section_of_line( $ )
|
|||||||
return( '' );
|
return( '' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub grouped_section_key( $ )
|
||||||
|
{
|
||||||
|
my $sec = $_[0];
|
||||||
|
|
||||||
|
if( $sec >= 100 && $sec <= 106 ) { return '100-106'; }
|
||||||
|
if( $sec >= 200 && $sec <= 202 ) { return '200-202'; }
|
||||||
|
if( $sec >= 210 && $sec <= 211 ) { return '210-211'; }
|
||||||
|
if( $sec >= 300 && $sec <= 302 ) { return '300-302'; }
|
||||||
|
|
||||||
|
return $sec;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub build_marker_map()
|
||||||
|
{
|
||||||
|
my( %map, $line, $sec, $key );
|
||||||
|
|
||||||
|
foreach $line ( @conf )
|
||||||
|
{
|
||||||
|
$sec = section_of_line( $line );
|
||||||
|
next if $sec eq '';
|
||||||
|
|
||||||
|
$key = grouped_section_key( $sec );
|
||||||
|
push( @{ $map{$key} }, $line );
|
||||||
|
}
|
||||||
|
|
||||||
|
# Keep SYS as first entry in section 1
|
||||||
|
if( defined( $map{'1'} ) )
|
||||||
|
{
|
||||||
|
my @sys = grep( /^1 SYS /, @{ $map{'1'} } );
|
||||||
|
my @rest = grep( !/^1 SYS /, @{ $map{'1'} } );
|
||||||
|
$map{'1'} = [ @sys, @rest ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return %map;
|
||||||
|
}
|
||||||
|
|
||||||
sub writeconfig_compact()
|
sub writeconfig_compact()
|
||||||
{
|
{
|
||||||
my( $i, $l );
|
my( $i, $l );
|
||||||
@@ -183,13 +205,63 @@ sub writeconfig_compact()
|
|||||||
close( CONF );
|
close( CONF );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub writeconfig_markers()
|
||||||
|
{
|
||||||
|
my( %secmap, %emitted );
|
||||||
|
my( $line, $active_key, $inside_active );
|
||||||
|
|
||||||
|
%secmap = build_marker_map();
|
||||||
|
$inside_active = '';
|
||||||
|
|
||||||
|
open( CONF, '>' . $mars_config ) or die "Could not write $mars_config: $!";
|
||||||
|
|
||||||
|
foreach $line ( @rawconf )
|
||||||
|
{
|
||||||
|
if( $line =~ /^\s*#\s*>>>\s*SMARTHOOK\s+SECTION\s+([0-9]+(?:-[0-9]+)?)\s+ACTIVE\s+BEGIN/i )
|
||||||
|
{
|
||||||
|
$active_key = $1;
|
||||||
|
$inside_active = $active_key;
|
||||||
|
|
||||||
|
print CONF $line;
|
||||||
|
|
||||||
|
if( defined( $secmap{$active_key} ) )
|
||||||
|
{
|
||||||
|
foreach my $entry ( @{ $secmap{$active_key} } )
|
||||||
|
{
|
||||||
|
print CONF $entry . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$emitted{$active_key} = 1;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( $line =~ /^\s*#\s*<<<\s*SMARTHOOK\s+SECTION\s+([0-9]+(?:-[0-9]+)?)\s+ACTIVE\s+END/i )
|
||||||
|
{
|
||||||
|
$inside_active = '';
|
||||||
|
print CONF $line;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( $inside_active ne '' )
|
||||||
|
{
|
||||||
|
# Skip old content inside ACTIVE blocks completely.
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
print CONF $line;
|
||||||
|
}
|
||||||
|
|
||||||
|
close( CONF );
|
||||||
|
}
|
||||||
|
|
||||||
sub writeconfig_preserve_layout()
|
sub writeconfig_preserve_layout()
|
||||||
{
|
{
|
||||||
my( %secmap, %written, @sections, $sec, $line, $sysline );
|
my( %secmap, %written, @sections, $sec, $line, $sysline );
|
||||||
|
my( $heading_sec );
|
||||||
|
|
||||||
sortconfig();
|
sortconfig();
|
||||||
|
|
||||||
# Keep SYS as the first entry in section 1.
|
|
||||||
$sysline = ( grep( /^1 SYS /, @conf ) )[0];
|
$sysline = ( grep( /^1 SYS /, @conf ) )[0];
|
||||||
if( defined( $sysline ) )
|
if( defined( $sysline ) )
|
||||||
{
|
{
|
||||||
@@ -210,16 +282,34 @@ sub writeconfig_preserve_layout()
|
|||||||
|
|
||||||
foreach $line ( @rawconf )
|
foreach $line ( @rawconf )
|
||||||
{
|
{
|
||||||
|
if( $line =~ /^\s*#.*Section\s+([0-9]+)\b/i )
|
||||||
|
{
|
||||||
|
$heading_sec = $1;
|
||||||
|
|
||||||
|
foreach $sec ( sort { $a <=> $b } keys( %secmap ) )
|
||||||
|
{
|
||||||
|
next if $written{$sec};
|
||||||
|
next if $sec > $heading_sec;
|
||||||
|
|
||||||
|
if( defined( $secmap{$sec} ) )
|
||||||
|
{
|
||||||
|
foreach my $entry ( @{ $secmap{$sec} } )
|
||||||
|
{
|
||||||
|
print CONF $entry . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$written{$sec} = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$sec = section_of_line( $line );
|
$sec = section_of_line( $line );
|
||||||
|
|
||||||
# Preserve comments and blank lines exactly as they were.
|
|
||||||
if( $sec eq '' )
|
if( $sec eq '' )
|
||||||
{
|
{
|
||||||
print CONF $line;
|
print CONF $line;
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Replace each section only once, at its first occurrence.
|
|
||||||
if( ! $written{$sec} )
|
if( ! $written{$sec} )
|
||||||
{
|
{
|
||||||
if( defined( $secmap{$sec} ) )
|
if( defined( $secmap{$sec} ) )
|
||||||
@@ -231,12 +321,8 @@ sub writeconfig_preserve_layout()
|
|||||||
}
|
}
|
||||||
$written{$sec} = 1;
|
$written{$sec} = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Skip the original config line because the updated section
|
|
||||||
# has already been emitted.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Append sections that did not exist in the original file.
|
|
||||||
@sections = sort { $a <=> $b } keys( %secmap );
|
@sections = sort { $a <=> $b } keys( %secmap );
|
||||||
foreach $sec ( @sections )
|
foreach $sec ( @sections )
|
||||||
{
|
{
|
||||||
@@ -253,12 +339,28 @@ sub writeconfig_preserve_layout()
|
|||||||
close( CONF );
|
close( CONF );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub config_has_smart_markers()
|
||||||
|
{
|
||||||
|
foreach my $line ( @rawconf )
|
||||||
|
{
|
||||||
|
if( $line =~ /SMARTHOOK\s+SECTION/i )
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
sub writeconfig()
|
sub writeconfig()
|
||||||
{
|
{
|
||||||
if( defined( $smart_compact_nwservconf ) && $smart_compact_nwservconf )
|
if( defined( $smart_compact_nwservconf ) && $smart_compact_nwservconf )
|
||||||
{
|
{
|
||||||
writeconfig_compact();
|
writeconfig_compact();
|
||||||
}
|
}
|
||||||
|
elsif( config_has_smart_markers() )
|
||||||
|
{
|
||||||
|
writeconfig_markers();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
writeconfig_preserve_layout();
|
writeconfig_preserve_layout();
|
||||||
|
|||||||
Reference in New Issue
Block a user