File:  [LON-CAPA] / loncom / debugging_tools / modify_config_files.pl
Revision 1.3: download - view: text, annotated - select for diffs
Wed Aug 11 17:32:53 2004 UTC (19 years, 11 months ago) by matthew
Branches: MAIN
CVS tags: HEAD
Added code for /home/www/.my.cnf

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

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