File:  [LON-CAPA] / loncom / debugging_tools / modify_config_files.pl
Revision 1.5: download - view: text, annotated - select for diffs
Fri Nov 19 20:46:07 2004 UTC (19 years, 6 months ago) by matthew
Branches: MAIN
CVS tags: version_2_3_X, version_2_3_2, version_2_3_1, version_2_3_0, version_2_2_X, version_2_2_99_1, version_2_2_99_0, version_2_2_2, version_2_2_1, version_2_2_0, version_2_1_X, version_2_1_99_3, version_2_1_99_2, version_2_1_99_1, version_2_1_99_0, version_2_1_3, version_2_1_2, version_2_1_1, version_2_1_0, version_2_0_X, version_2_0_99_1, version_2_0_2, version_2_0_1, version_2_0_0, version_1_99_3, version_1_99_2, version_1_99_1_tmcc, version_1_99_1, version_1_99_0_tmcc, version_1_99_0, version_1_3_X, version_1_3_3, version_1_3_2, version_1_3_1, version_1_3_0, version_1_2_99_1, version_1_2_99_0, HEAD
Added gpgcheck=0 to the configuration for the LON-CAPA repositories.

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

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