Annotation of loncom/debugging_tools/modify_config_files.pl, revision 1.2

1.1       matthew     1: #!/usr/bin/perl -w
                      2: #
                      3: # The LearningOnline Network
                      4: #
1.2     ! matthew     5: # $Id: modify_config_files.pl,v 1.1 2004/08/09 21:05:40 matthew Exp $
1.1       matthew     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.
1.2     ! matthew   262:             if (defined($target->[-1]) && $target->[-1] =~ /^\s*$/) {
1.1       matthew   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>