File:  [LON-CAPA] / loncom / debugging_tools / modify_config_files.pl
Revision 1.4: download - view: text, annotated - select for diffs
Mon Aug 23 19:47:39 2004 UTC (19 years, 9 months ago) by matthew
Branches: MAIN
CVS tags: version_1_2_X, version_1_2_1, version_1_2_0, HEAD
Modified &modify_config_file to return a 1 or 0 if it modified or did
not modify the configuration file.  Modified &update_file to return a
1 or 0 if &modify_config_file indicated any change in the file (and we
skip writing the config file if there were no changes made).  Modified
the routine to return 0 or 1, where 1 indicates the global MySQL file
was modified.

    1: #!/usr/bin/perl -w
    2: #
    3: # The LearningOnline Network
    4: #
    5: # $Id: modify_config_files.pl,v 1.4 2004/08/23 19:47:39 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: use lib '/home/httpd/lib/perl/';
   53: use LONCAPA::Configuration;
   54: my $loncapa_config=LONCAPA::Configuration::read_conf('loncapa.conf');
   55: 
   56: my $yum_status = 
   57:     &update_file('/etc/yum.conf',
   58:              [{section => 'loncapa-updates-i386',
   59:                key     => 'name=',
   60:                value   => 'Fedora Core $releasever LON-CAPA i386 Updates',
   61:            }, {section => 'loncapa-updates-i386',
   62:                key     => 'baseurl=',
   63:                value   => 'http://install.loncapa.org/fedora/linux/loncapa/'.
   64:                    '$releasever/i386',
   65:            }, {section => 'loncapa-updates-noarch',
   66:                key     => 'name=',
   67:                value   => 'Fedora Core $releasever LON-CAPA noarch Updates',
   68:            }, {section => 'loncapa-updates-noarch',
   69:                key     => 'baseurl=',
   70:                value   => 'http://install.loncapa.org/fedora/linux/loncapa/'.
   71:                    '$releasever/noarch',
   72:            }]);
   73: 
   74: my $mysql_global_status =
   75:     &update_file('/etc/my.cnf',
   76:              [{section =>'mysqld',
   77:                key     =>'set-variable=wait_timeout=',
   78:                value   =>'31536000', }]);
   79: 
   80: my $local_my_cnf = '/home/www/.my.cnf';
   81: if (! -e $local_my_cnf) {
   82:     # Create a file so we can do something with it...
   83:     system("touch $local_my_cnf");
   84: }
   85: my $mysql_www_status =
   86:     &update_file($local_my_cnf,
   87:              [{section =>'client',
   88:                key     =>'user=',
   89:                value   =>'www',},
   90:               {section =>'client',
   91:                key     =>'password=',
   92:                value   =>$loncapa_config->{'lonSqlAccess'}},]);
   93: 
   94: my $exitvalue = 0;
   95: 
   96: if ($mysql_global_status) { $exitvalue = 1; }
   97: 
   98: exit $exitvalue;
   99: 
  100: 
  101: 
  102: #################################################################
  103: #################################################################
  104: 
  105: =pod
  106: 
  107: =over 4
  108: 
  109: =cut
  110: 
  111: #################################################################
  112: #################################################################
  113: sub update_file {
  114:     my ($file,$newdata) = @_;
  115:     return 1 if (! -e $file);
  116:     my $backup = $file.'.backup';
  117:     if (! copy($file,$backup)) {
  118:         warn "**** Error: Unable to make backup of $file";
  119:         return 0;
  120:     }
  121:     my ($filedata) = &parse_config_file($file);
  122:     if (! ref($filedata)) { warn "**** Error: $filedata"; return 0;}
  123:     my $modified = 0;
  124:     foreach my $data (@$newdata) {
  125:         my $section = $data->{'section'};
  126:         my $key = $data->{'key'};
  127:         my $value = $data->{'value'};
  128:         my $result = &modify_config_file($filedata,$section,$key,$value);
  129:         if ($result) { $modified = 1; }
  130:     }
  131:     if ($modified) {
  132:         my $result = &write_config_file($file,$filedata);
  133:         if (defined($result)) { warn 'Error:'.$result; return 0; }
  134:     }
  135:     return $modified;
  136: }
  137: 
  138: #################################################################
  139: #################################################################
  140: 
  141: =pod
  142: 
  143: =item &parse_config_file
  144: 
  145: Read a configuration file in and parse it into an internal data structure.
  146: 
  147: Input: filename
  148: 
  149: Output: array ref $filedata  OR  scalar error message
  150: 
  151: =cut
  152: 
  153: #################################################################
  154: #################################################################
  155: sub parse_config_file {
  156:     my ($file) = @_;
  157:     open(INFILE,$file) || return ('Unable to open '.$file.' for reading');
  158:     my @Input = <INFILE>;
  159:     close(INFILE);
  160:     my @Structure;
  161:     my %Sections;
  162:     while (my $line = shift(@Input)) {
  163:         chomp($line);
  164:         if ($line =~ /^\[([^\]]*)\]/) {
  165:             my $section_id = $1;
  166:             push(@Structure,'__section__'.$section_id);
  167:             while ($line = shift(@Input)) {
  168:                 chomp($line);
  169:                 if ($line =~ /^\[([^\]]*)\]/) {
  170:                     unshift(@Input,$line);
  171:                     last;
  172:                 } else {
  173:                     push(@{$Sections{$section_id}},$line);
  174:                 }
  175:             }
  176:         } else {
  177:             push(@Structure,$line);
  178:         }
  179:     }
  180:     my $filedata = [\@Structure,\%Sections];
  181:     return $filedata;
  182: }
  183: 
  184: #################################################################
  185: #################################################################
  186: 
  187: =pod
  188: 
  189: =item
  190: 
  191: Write a configuration file out based on the internal data structure returned
  192: by &parse_config_file
  193: 
  194: Inputs: filename, $filedata (the return value of &parse_config_file
  195: 
  196: Returns: undef on success, scalar error message on failure.
  197: 
  198: =cut
  199: 
  200: #################################################################
  201: #################################################################
  202: sub write_config_file {
  203:     my ($file,$filedata) = @_;
  204:     my ($structure,$sections) = @$filedata;
  205:     if (! defined($structure) || ! ref($structure)) {
  206:         return 'Bad subroutine inputs';
  207:     }
  208:     open(OUTPUT,'>'.$file) || return('Unable to open '.$file.' for writing');
  209:     for (my $i=0;$i<scalar(@$structure);$i++) {
  210:         my $line = $structure->[$i];
  211:         chomp($line);
  212:         if ($line =~ /^__section__(.*)$/) {
  213:             my $section_id = $1;
  214:             print OUTPUT ('['.$section_id.']'.$/);
  215:             foreach my $section_line (@{$sections->{$section_id}}) {
  216:                 chomp($section_line);
  217:                 print OUTPUT $section_line.$/;
  218:             }
  219:             # Deal with blank lines
  220:             if ($sections->{$section_id}->[-1] =~ /^\s*$/) {
  221:                 # No need to output a blank line at the end if there is one 
  222:                 # already
  223:             } else {
  224:                 print OUTPUT $/;
  225:             }
  226:         } else {
  227:             print OUTPUT $line.$/;
  228:         }
  229:     }
  230:     close OUTPUT;
  231:     return undef;
  232: }
  233: 
  234: #################################################################
  235: #################################################################
  236: 
  237: =pod
  238: 
  239: =item &modify_config_file
  240: 
  241: Modifies the internal data structure of a configuration file to include new
  242: sections and/or new configuration directives.
  243: 
  244: Inputs: $filedata (see &parse_config_file
  245: $section, the [section] the new entry is to reside in.  A value of undef will
  246: cause the "outer" section (as in yum.conf) to be updated (or have the new
  247: value prepended).
  248: $newkey: A line which matches this will be replaced with $newkey.$newvalue
  249: $newvalue: The new value to be placed with the new key.
  250: 
  251: Returns: 0 or 1, indicating if the file was modified(1) or not(0).
  252: 
  253: 
  254: =cut
  255: 
  256: #################################################################
  257: #################################################################
  258: sub modify_config_file {
  259:     my ($filedata,$section,$newkey,$newvalue)=@_;
  260:     my $modified = 0;    # returned value - set to true if the file is modified
  261:     my ($structure,$sections) = @$filedata;
  262:     if (! defined($newvalue)) {
  263:         $newvalue = '';
  264:     }
  265:     my $newline = $newkey.$newvalue;
  266:     #
  267:     # Determine which array ref gets the item
  268:     my $target;
  269:     if (defined($section)) {
  270:         if (! exists($sections->{$section})) {
  271:             push(@$structure,'__section__'.$section);
  272:             $sections->{$section}=[];
  273:         }
  274:         $target = $sections->{$section};
  275:     } else {
  276:         $target = $structure;
  277:     }
  278:     #
  279:     # Put the item in or update it.
  280:     my $key_is_new = 1;
  281:     for (my $i=0;$i<scalar(@$target);$i++) {
  282:         if ($target->[$i] =~/^$newkey/) {
  283:             if ($target->[$i] ne $newline) {
  284:                 $target->[$i]=$newline;
  285:                 $modified = 1;
  286:             }
  287:             $key_is_new = 0;
  288:             last;
  289:         }
  290:     }
  291:     if ($key_is_new) {
  292:         if (! defined($section)) {
  293:             unshift(@$target,$newline);
  294:         } else {
  295:             # No need to put things after a blank line.
  296:             if (defined($target->[-1]) && $target->[-1] =~ /^\s*$/) {
  297:                 $target->[-1] = $newline;
  298:                 $modified = 1;
  299:             } else {
  300:                 push(@$target,$newline);
  301:                 $modified = 1;
  302:             }
  303:         }
  304:     }
  305:     return $modified;
  306: }
  307: 
  308: 
  309: #################################################################
  310: #################################################################
  311: 
  312: =pod
  313: 
  314: =back
  315: 
  316: =cut
  317: 
  318: #################################################################
  319: #################################################################

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