File:  [LON-CAPA] / loncom / debugging_tools / modify_config_files.pl
Revision 1.2: download - view: text, annotated - select for diffs
Tue Aug 10 20:26:02 2004 UTC (19 years, 9 months ago) by matthew
Branches: MAIN
CVS tags: version_1_1_99_5, version_1_1_99_4, HEAD
Fix bug where new sections would cause death.

    1: #!/usr/bin/perl -w
    2: #
    3: # The LearningOnline Network
    4: #
    5: # $Id: modify_config_files.pl,v 1.2 2004/08/10 20:26:02 matthew Exp $
    6: #
    7: # Copyright Michigan State University Board of Trustees
    8: #
    9: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   10: #
   11: # LON-CAPA is free software; you can redistribute it and/or modify
   12: # it under the terms of the GNU General Public License as published by
   13: # the Free Software Foundation; either version 2 of the License, or
   14: # (at your option) any later version.
   15: #
   16: # LON-CAPA is distributed in the hope that it will be useful,
   17: # but WITHOUT ANY WARRANTY; without even the implied warranty of
   18: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   19: # GNU General Public License for more details.
   20: #
   21: # You should have received a copy of the GNU General Public License
   22: # along with LON-CAPA; if not, write to the Free Software
   23: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   24: #
   25: # /home/httpd/html/adm/gpl.txt
   26: #
   27: # http://www.lon-capa.org/
   28: #
   29: ###
   30: 
   31: =pod
   32: 
   33: =head1 NAME
   34: 
   35: B<modify_config_files.pl>
   36: 
   37: =head1 SYNOPSIS
   38: 
   39: This script modifies /etc/yum.conf and /etc/my.cnf.
   40: 
   41: =head1 DESCRIPTION
   42: 
   43: This script modifies /etc/yum.conf and /etc/my.cnf to ensure certain parameters
   44: are set properly.  The LON-CAPA yum repositories are added to /etc/yum.conf.
   45: The /etc/my.cnf file is modified to set the wait_timeout to 1 year.  Backup
   46: copies of each file are made in /etc.
   47: 
   48: =cut
   49: 
   50: use strict;
   51: use File::Copy;
   52: 
   53: &update_file('/etc/yum.conf',
   54:              [{section => 'loncapa-updates-i386',
   55:                key     => 'name=',
   56:                value   => 'Fedora Core $releasever LON-CAPA i386 Updates',
   57:            }, {section => 'loncapa-updates-i386',
   58:                key     => 'baseurl=',
   59:                value   => 'http://install.loncapa.org/fedora/linux/loncapa/'.
   60:                    '$releasever/i386',
   61:            }, {section => 'loncapa-updates-noarch',
   62:                key     => 'name=',
   63:                value   => 'Fedora Core $releasever LON-CAPA noarch Updates',
   64:            }, {section => 'loncapa-updates-noarch',
   65:                key     => 'baseurl=',
   66:                value   => 'http://install.loncapa.org/fedora/linux/loncapa/'.
   67:                    '$releasever/noarch',
   68:            }]);
   69: 
   70: &update_file('/etc/my.cnf',
   71:              [{section =>'mysqld',
   72:                key     =>'set-variable=wait_timeout=',
   73:                value   =>'31536000', }]);
   74: 
   75: exit;
   76: 
   77: 
   78: 
   79: #################################################################
   80: #################################################################
   81: 
   82: =pod
   83: 
   84: =over 4
   85: 
   86: =cut
   87: 
   88: #################################################################
   89: #################################################################
   90: sub update_file {
   91:     my ($file,$newdata) = @_;
   92:     return 1 if (! -e $file);
   93:     my $backup = $file.'.backup';
   94:     if (! copy($file,$backup)) {
   95:         warn "Error: Unable to make backup of $file";
   96:         return 0;
   97:     }
   98:     my ($filedata) = &parse_config_file($file);
   99:     if (! ref($filedata)) { warn "Error: $filedata"; return 0;}
  100:     foreach my $data (@$newdata) {
  101:         my $section = $data->{'section'};
  102:         my $key = $data->{'key'};
  103:         my $value = $data->{'value'};
  104:         &modify_config_file($filedata,$section,$key,$value)
  105:     }
  106:     my $result = &write_config_file($file,$filedata);
  107:     if (defined($result)) { warn 'Error:'.$result; return 0; }
  108:     return 1;
  109: }
  110: 
  111: #################################################################
  112: #################################################################
  113: 
  114: =pod
  115: 
  116: =item &parse_config_file
  117: 
  118: Read a configuration file in and parse it into an internal data structure.
  119: 
  120: Input: filename
  121: 
  122: Output: array ref $filedata  OR  scalar error message
  123: 
  124: =cut
  125: 
  126: #################################################################
  127: #################################################################
  128: sub parse_config_file {
  129:     my ($file) = @_;
  130:     open(INFILE,$file) || return ('Unable to open '.$file.' for reading');
  131:     my @Input = <INFILE>;
  132:     close(INFILE);
  133:     my @Structure;
  134:     my %Sections;
  135:     while (my $line = shift(@Input)) {
  136:         chomp($line);
  137:         if ($line =~ /^\[([^\]]*)\]/) {
  138:             my $section_id = $1;
  139:             push(@Structure,'__section__'.$section_id);
  140:             while ($line = shift(@Input)) {
  141:                 if ($line =~ /^\[([^\]]*)\]/) {
  142:                     unshift(@Input,$line);
  143:                     last;
  144:                 } else {
  145:                     push(@{$Sections{$section_id}},$line);
  146:                 }
  147:             }
  148:         } else {
  149:             push(@Structure,$line);
  150:         }
  151:     }
  152:     my $filedata = [\@Structure,\%Sections];
  153:     return $filedata;
  154: }
  155: 
  156: #################################################################
  157: #################################################################
  158: 
  159: =pod
  160: 
  161: =item
  162: 
  163: Write a configuration file out based on the internal data structure returned
  164: by &parse_config_file
  165: 
  166: Inputs: filename, $filedata (the return value of &parse_config_file
  167: 
  168: Returns: undef on success, scalar error message on failure.
  169: 
  170: =cut
  171: 
  172: #################################################################
  173: #################################################################
  174: sub write_config_file {
  175:     my ($file,$filedata) = @_;
  176:     my ($structure,$sections) = @$filedata;
  177:     if (! defined($structure) || ! ref($structure)) {
  178:         return 'Bad subroutine inputs';
  179:     }
  180:     open(OUTPUT,'>'.$file) || return('Unable to open '.$file.' for writing');
  181:     for (my $i=0;$i<scalar(@$structure);$i++) {
  182:         my $line = $structure->[$i];
  183:         chomp($line);
  184:         if ($line =~ /^__section__(.*)$/) {
  185:             my $section_id = $1;
  186:             print OUTPUT ('['.$section_id.']'.$/);
  187:             foreach my $section_line (@{$sections->{$section_id}}) {
  188:                 chomp($section_line);
  189:                 print OUTPUT $section_line.$/;
  190:             }
  191:             # Deal with blank lines
  192:             if ($sections->{$section_id}->[-1] =~ /^\s*$/) {
  193:                 # No need to output a blank line at the end if there is one 
  194:                 # already
  195:             } else {
  196:                 print OUTPUT $/;
  197:             }
  198:         } else {
  199:             print OUTPUT $line.$/;
  200:         }
  201:     }
  202:     close OUTPUT;
  203:     return undef;
  204: }
  205: 
  206: #################################################################
  207: #################################################################
  208: 
  209: =pod
  210: 
  211: =item &modify_config_file
  212: 
  213: Modifies the internal data structure of a configuration file to include new
  214: sections and/or new configuration directives.
  215: 
  216: Inputs: $filedata (see &parse_config_file
  217: $section, the [section] the new entry is to reside in.  A value of undef will
  218: cause the "outer" section (as in yum.conf) to be updated (or have the new
  219: value prepended).
  220: $newkey: A line which matches this will be replaced with $newkey.$newvalue
  221: $newvalue: The new value to be placed with the new key.
  222: 
  223: =cut
  224: 
  225: #################################################################
  226: #################################################################
  227: sub modify_config_file {
  228:     my ($filedata,$section,$newkey,$newvalue)=@_;
  229:     my ($structure,$sections) = @$filedata;
  230:     if (! defined($newvalue)) {
  231:         $newvalue = '';
  232:     }
  233:     my $newline = $newkey.$newvalue;
  234:     #
  235:     # Determine which array ref gets the item
  236:     my $target;
  237:     if (defined($section)) {
  238:         if (! exists($sections->{$section})) {
  239:             push(@$structure,'__section__'.$section);
  240:             $sections->{$section}=[];
  241:         }
  242:         $target = $sections->{$section};
  243:     } else {
  244:         $target = $structure;
  245:     }
  246:     #
  247:     # Put the item in or update it.
  248:     my $key_is_new = 1;
  249:     for (my $i=0;$i<scalar(@$target);$i++) {
  250:         
  251:         if ($target->[$i] =~/^$newkey/) {
  252:             $target->[$i]=$newline;
  253:             $key_is_new = 0;
  254:             last;
  255:         }
  256:     }
  257:     if ($key_is_new) {
  258:         if (! defined($section)) {
  259:             unshift(@$target,$newline);
  260:         } else {
  261:             # No need to put things after a blank line.
  262:             if (defined($target->[-1]) && $target->[-1] =~ /^\s*$/) {
  263:                 $target->[-1] = $newline;
  264:             } else {
  265:                 push(@$target,$newline);
  266:             }
  267:         }
  268:     }
  269:     return ($filedata);
  270: }
  271: 
  272: 
  273: #################################################################
  274: #################################################################
  275: 
  276: =pod
  277: 
  278: =back
  279: 
  280: =cut
  281: 
  282: #################################################################
  283: #################################################################

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>