| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 | 
							- #!/usr/bin/perl
 
- # Copyright (C) 2011, Christoph Biedl, <debian.axhn@manchmal.in-ulm.de>
 
- #%# license-gplv2+
 
- =head1 NAME
 
- ngircd-conf-convert - convert ngircd.conf from pre18 version
 
- =head1 VERSION
 
- Version 2011.10.30
 
- =cut
 
- our $VERSION = '2011.10.30';
 
- =head1 SYNOPSIS
 
- convert ngircd.conf from pre18 version
 
- Usage:
 
-     ngircd-conf-convert [options] <old ngircd.conf> <new ngircd.conf>
 
- =cut
 
- use 5.010;
 
- use strict;
 
- use warnings;
 
- use Getopt::Long;
 
- use Pod::Usage;
 
- my $ignorecomments;
 
- =head1 OPTIONS
 
- =over
 
- =cut
 
- {
 
-     my $help;
 
-     my $man;
 
-     my %GetOptions = (
 
- 	'help|?' =>	\$help,
 
- 	'man' =>	\$man
 
-     );
 
- =item B<--ignorecomments>
 
- By default, this program will rewrite configuration variables even if
 
- they are commented out, e.g.
 
-     ;NoDNS = no
 
- to
 
-     ;DNS = yes
 
- Use this option to disable that feature.
 
- =cut
 
-     $GetOptions{'ignorecomments'} = \$ignorecomments;
 
- =item F<old-ngircd.conf> F<new-ngircd.conf>
 
- The old configuration file, and where to write the converted one to.
 
- The first one must exist, the content of the latter will be
 
- overwritten. If C<-> is given, content is read from stdin or written
 
- to stdout, respectively.
 
- =back
 
- =head1 DESCRIPTION
 
- The C<ngircd-conf-convert> converts ngIRCd configuration files according
 
- to the new section and variable names introduced in version 18.
 
- The changes done are small: Just renamings and adding the appropriate
 
- section name. No blocks are moved around, you might want to do that
 
- manually.
 
- Suggested workflow:
 
-     ngircd-conf-convert ngircd.conf ngircd.conf.new
 
-     # compare dumps created by --configtest
 
-     </dev/null ngircd --configtest --config ngircd.conf |
 
- 	sed -n '/GLOBAL/,$p' >dump.old
 
-     </dev/null ngircd --configtest --config ngircd.conf.new |
 
- 	sed -n '/GLOBAL/,$p' >dump.new
 
-     cmp -s dump.old dump.new || echo "ALERT: configuration was changed!"
 
- Remember: Your C<ngircd.conf> may contain sensitive data, so don't
 
- do that in a world-readable directory.
 
- =cut
 
-     GetOptions (%GetOptions) or pod2usage (2);
 
-     pod2usage (1) if ($help);
 
-     pod2usage (-exitstatus => 0, -ignorecomments => 2) if ($man);
 
-     (scalar (@ARGV) == 2) or
 
- 	die ("Need two file parameters.\n");
 
- }
 
- my %convert_logic = (
 
-     # variable name => [ <new section>, <new name>, <invert> ]
 
-     'allowremoteoper'    => [ 'Options' ],
 
-     'chrootdir'          => [ 'Options' ],
 
-     'connectipv4'        => [ 'Options' ],
 
-     'connectipv6'        => [ 'Options' ],
 
-     'connectretry'       => [ 'Limits' ],
 
-     'maxconnections'     => [ 'Limits' ],
 
-     'maxconnectionsip'   => [ 'Limits' ],
 
-     'maxjoins'           => [ 'Limits' ],
 
-     'maxnicklength'      => [ 'Limits' ],
 
-     'nodns'              => [ 'Options', 'DNS', 1 ],
 
-     'noident'            => [ 'Options', 'Ident', 1 ],
 
-     'nopam'              => [ 'Options', 'PAM', 1 ],
 
-     'opercanusemode'     => [ 'Options' ],
 
-     'operservermode'     => [ 'Options' ],
 
-     'pingtimeout'        => [ 'Limits' ],
 
-     'pongtimeout'        => [ 'Limits' ],
 
-     'predefchannelsonly' => [ 'Options' ],
 
-     'sslcertfile'        => [ 'SSL', 'CertFile' ],
 
-     'ssldhfile'          => [ 'SSL', 'DHFile' ],
 
-     'sslkeyfile'         => [ 'SSL', 'KeyFile' ],
 
-     'sslkeyfilepassword' => [ 'SSL', 'KeyFilePassword' ],
 
-     'sslports'           => [ 'SSL', 'Ports' ],
 
-     'syslogfacility'     => [ 'Options' ],
 
-     'webircpassword'     => [ 'Options' ],
 
- );
 
- my $oldvars = join ('|', keys %convert_logic);
 
- my ($old_file, $new_file) = @ARGV;
 
- my ($old_fh, $new_fh);
 
- if ($old_file eq '-') {
 
-     $old_fh = *STDIN;
 
- } else {
 
-     (-f $old_file) or
 
- 	die ("Not a file: '$old_file'.\n");
 
-     open ($old_fh, '<', $old_file) or
 
- 	die ("Canno read '$old_file': $!.\n");
 
- }
 
- my $section = '';
 
- # last section read from input
 
- my $set_section = '';
 
- # section we're currently in
 
- # slurp content
 
- my @content = <$old_fh>;
 
- ($old_file eq '-') or close ($old_fh);
 
- sub insert_line ($$) {
 
-     # insert content before the given line. If this is a comment, seek
 
-     # further backwards.
 
-     my ($before, $content) = @_;
 
-     while ($before > 0 && $content[--$before] =~ /^\s*#/) {
 
-     }
 
-     splice @content, $before+1, 0, $content;
 
- }
 
- for (my $i = 0; $i < scalar (@content); $i++) {
 
-     my $line = $content[$i];
 
-     if ($line =~ /^\s*\[([a-z]+)\]/i) {
 
- 	$set_section = $section = lc $1;
 
-     } elsif ($line =~ /^\s*(,|#|$)/) {
 
- 	# nothing to do
 
-     } elsif (
 
- 	$section eq 'global' &&
 
- 	$line =~ /^(\s*)(;\s*)?($oldvars)(\s*=\s*)(.*?)$/i
 
-     ) {
 
- 	my ($left, $comment, $var, $middle, $value) =
 
- 	    ($1 // '', $2 // '', $3, $4, $5 // '');
 
- 	my ($new_section, $new_var, $invert) = @{$convert_logic{lc $var}};
 
- 	$new_var //= $var;
 
- 	($comment && $ignorecomments) and
 
- 	    next;
 
- 	if ($set_section ne $new_section) {
 
- 	    # switch section
 
- 	    insert_line ($i, "[$new_section]\n");	$i++;
 
- 	    $set_section = $new_section;
 
- 	}
 
- 	$invert and
 
- 	    ($value = ($value =~ /^(yes|true|[1-9]\d*)\s*$/) ? 'no' : 'yes');
 
- 	$content[$i] = "$left$comment$new_var$middle$value\n";
 
-     } elsif ($set_section ne $section) {
 
- 	# other content, switch back to global if necessary
 
- 	die if ($section ne 'global');
 
- 	insert_line ($i, "[Global]\n");	$i++;
 
- 	$set_section = $section;
 
-     }
 
- }
 
- if ($new_file eq '-') {
 
-     $new_fh = *STDOUT;
 
- } else {
 
-     open ($new_fh, '>', $new_file) or
 
- 	die ("Canno write '$new_file': $!.\n");
 
-     print $new_fh @content;
 
- }
 
- ($new_file eq '-') or close ($new_fh);
 
- exit 0;
 
- __END__
 
- =head1 AUTHOR
 
- Christoph Biedl, C<E<lt>debian.axhn@manchmal.in-ulm.deE<gt>>
 
- =head1 COPYRIGHT & LICENSE
 
-     #%# license-gplv2+
 
- =cut
 
- # -- ETYKACLGPAK
 
 
  |