Diff for /loncom/debugging_tools/modify_config_files.pl between versions 1.3 and 1.9

version 1.3, 2004/08/11 17:32:53 version 1.9, 2009/07/14 03:05:59
Line 36  B<modify_config_files.pl> Line 36  B<modify_config_files.pl>
   
 =head1 SYNOPSIS  =head1 SYNOPSIS
   
 This script modifies /etc/yum.conf and /etc/my.cnf.  This script modifies /etc/my.cnf and one of: /etc/yum.conf 
   (for Fedora/CentOS/Scientific Linux/RHEL5), /etc/apt/sources.list
   (for Debian/Ubuntu) and /etc/sysconfig/rhn/sources (for RHEL4). 
   
 =head1 DESCRIPTION  =head1 DESCRIPTION
   
 This script modifies /etc/yum.conf and /etc/my.cnf to ensure certain parameters  This script modifies /etc/my.cnf and /etc/yum.conf or /etc/apt/sources
 are set properly.  The LON-CAPA yum repositories are added to /etc/yum.conf.  or /etc/sysconfig/rhn/sources to ensure certain parameters are set
   properly.  The LON-CAPA yum repositories are added to /etc/yum.conf or
   /etc/sysconfig/rhn/sources and the LON-CAPA apt repositories are added to 
   /etc/apt/sources.list.
   
 The /etc/my.cnf file is modified to set the wait_timeout to 1 year.  Backup  The /etc/my.cnf file is modified to set the wait_timeout to 1 year.  Backup
 copies of each file are made in /etc.  copies of each file are made in /etc, /etc/apt, and /etc/sysconfig/rhn, as 
   appropriate.
   
 =cut  =cut
   
Line 53  use lib '/home/httpd/lib/perl/'; Line 60  use lib '/home/httpd/lib/perl/';
 use LONCAPA::Configuration;  use LONCAPA::Configuration;
 my $loncapa_config=LONCAPA::Configuration::read_conf('loncapa.conf');  my $loncapa_config=LONCAPA::Configuration::read_conf('loncapa.conf');
   
 &update_file('/etc/yum.conf',  open(DSH,"$$loncapa_config{'lonDaemons'}/distprobe |");
              [{section => 'loncapa-updates-i386',  my $dist = <DSH>;
   chomp($dist);
   close(DSH);
   
   my $yum_status;
   my $loninst = 'http://install.loncapa.org';
   my $loninst_re = 'http://install\.loncapa\.org';
   if ($dist =~ /^fedora(\d+)$/) {
       my $ver = $1;
       my $gpgchk = 0;
       my $gpg = "$loninst/versions/fedora/RPM-GPG-KEY-loncapa"; 
       if ($ver > 6) {
           $gpgchk = 1;
       }
       $yum_status =  
           &update_file('/etc/yum.conf',
                [{section => 'loncapa-updates-$basearch',
                key     => 'name=',                 key     => 'name=',
                value   => 'Fedora Core $releasever LON-CAPA i386 Updates',                 value   => 'Fedora Core $releasever LON-CAPA $basearch Updates',
            }, {section => 'loncapa-updates-i386',             }, {section => 'loncapa-updates-$basearch',
                key     => 'baseurl=',                 key     => 'baseurl=',
                value   => 'http://install.loncapa.org/fedora/linux/loncapa/'.                 value   => $loninst.'/fedora/linux/loncapa/$releasever/$basearch',
                    '$releasever/i386',             }, {section => 'loncapa-updates-$basearch',
                  key     => 'gpgcheck=',
                  value   =>  $gpgchk,
              }, {section => 'loncapa-updates-$basearch',
                  key     => 'gpg=',
                  value   => $gpg,
            }, {section => 'loncapa-updates-noarch',             }, {section => 'loncapa-updates-noarch',
                key     => 'name=',                 key     => 'name=',
                value   => 'Fedora Core $releasever LON-CAPA noarch Updates',                 value   => 'Fedora Core $releasever LON-CAPA noarch Updates',
            }, {section => 'loncapa-updates-noarch',             }, {section => 'loncapa-updates-noarch',
                key     => 'baseurl=',                 key     => 'baseurl=',
                value   => 'http://install.loncapa.org/fedora/linux/loncapa/'.                 value   => $loninst.'/fedora/linux/loncapa/$releasever/noarch',
                    '$releasever/noarch',             }, {section => 'loncapa-updates-noarch',
                  key     => 'gpgcheck=',
                  value   => $gpgchk,
              }, {section => 'loncapa-updates-noarch',
                  key     => 'gpg=',
                  value   => $gpg,
            }]);             }]);
   } elsif ($dist =~ /^(rhes|centos|scientific)(\d+)$/) {
       my $type = $1;
       my $ver = $2;
       my $longver = $ver;
       if ($type eq 'rhes') {
           if ($ver == 4) {
               $longver = '4ES';
           } elsif ($ver == 5) {
               $longver = '5Server';
           }
       }
       my %info = (
                    rhes => {
                              title => 'RHEL',
                              path => 'redhat/linux/enterprise/loncapa',
                              gpg => 'versions/redhat/RPM-GPG-KEY-loncapa',
                              gpgchk => 1,
                            },
                    centos => {
                                title => 'CentOS',
                                path => 'centos/loncapa',
                                gpg => 'versions/centos/RPM-GPG-KEY-loncapa',
                                gpgchk => 1,
                              },
                    scientific => {
                                    title => 'Scientific Linux',
                                    path => 'scientific/loncapa',
                                    gpg => 'versions/scientific/RPM-GPG-KEY-loncapa',
                                    gpgchk => 1,
                                  },
                  );
       if (ref($info{$type}) eq 'HASH') {
           if ($ver > 4) {
               $yum_status =
                   &update_file('/etc/yum.conf',
                        [{section => 'loncapa-updates-basearch',
                          key     => 'name=',
                          value   => $info{$type}{title}.' $releasever LON-CAPA $basearch Updates',
                         }, {section => "loncapa-updates-basearch",
                             key     => 'baseurl=',
                             value   => "$loninst/$info{$type}{path}/".'$releasever/$basearch',
                         }, {section => 'loncapa-updates-basearch',
                             key     => 'gpgcheck=',
                             value   => $info{$type}{gpchk},
                         }, {section => 'loncapa-updates-$basearch',
                             key     => 'gpgkey=',
                             value   => "$loninst/$info{$type}{gpg}",
                         }, {section => 'loncapa-updates-noarch',
                             key     => 'name=',
                             value   => $info{$type}{title}.' $releasever LON-CAPA noarch Updates',
                         }, {section => 'loncapa-updates-noarch',
                             key     => 'baseurl=',
                             value   => "$loninst/$info{$type}{path}/".'$releasever/noarch',
                         }, {section => 'loncapa-updates-noarch',
                             key     => 'gpgcheck=',
                             value   => $info{$type}{gpchk},
                         }, {section => 'loncapa-updates-noarch',
                             key     => 'gpgkey=',
                             value   => "$loninst/$info{$type}{gpg}",
                         }]);
           } elsif (($type eq 'rhes') && ($ver == 4)) {
               my %rhn = (
                           basearch => { 
                               regexp => '\s*yum\s+loncapa\-updates\-basearch\s+'.$loninst_re.'/'.$info{$type}{path}.'/'.$longver.'/\$ARCH',
                               text => "yum loncapa-updates-basearch $loninst/$info{$type}{path}/$longver/".'$ARCH',
                                       },
                           noarch =>  {
                               regexp => '\s*yum\s+loncapa\-updates\-noarch\s+'.$loninst_re.'/'.$info{$type}{path}.'/'.$longver.'/noarch',
                               text => "yum loncapa-updates-noarch $loninst/$info{$type}{path}/$longver/noarch",
                                      },
                         );
               $yum_status = &update_rhn_source(\%rhn); 
           }
       }
   } elsif ($dist =~ /^(debian|ubuntu)\d+$/) {
       my %apt_get_source = (
                              debian5 => {
                                           regexp => '\s*deb\s+'.$loninst_re.'/debian/\s+lenny\s+main',
                                           text   => "deb $loninst/debian/ lenny main",
                                         },
                              ubuntu6 => {
                                           regexp => '\s*deb\s+'.$loninst_re.'/ubuntu/\s+dapper\s+main',
                                           text   => "deb $loninst/ubuntu/ dapper main",
                                         },
                              ubuntu8 => {
                                           regexp => '\s*deb\s+'.$loninst_re.'/ubuntu/\s+hardy\s+main',
                                           text   => "deb $loninst/ubuntu/ hardy main",
                                         },
                            );
       my $apt_status;
       if (defined($apt_get_source{$dist})) {
           $apt_status = &update_apt_source($apt_get_source{$dist},);
       }
   }
   
 &update_file('/etc/my.cnf',  my $mysql_global_status =
       &update_file('/etc/my.cnf',
              [{section =>'mysqld',               [{section =>'mysqld',
                key     =>'set-variable=wait_timeout=',                 key     =>'set-variable=wait_timeout=',
                value   =>'31536000', }]);                 value   =>'31536000', }]);
   
   
 my $local_my_cnf = '/home/www/.my.cnf';  my $local_my_cnf = '/home/www/.my.cnf';
 if (! -e $local_my_cnf) {  if (! -e $local_my_cnf) {
 #    # Create a file so we can do something with it...      # Create a file so we can do something with it...
     system("touch $local_my_cnf");      system("touch $local_my_cnf");
 }  }
 &update_file($local_my_cnf,  my $mysql_www_status =
       &update_file($local_my_cnf,
              [{section =>'client',               [{section =>'client',
                key     =>'user=',                 key     =>'user=',
                value   =>'www',},                 value   =>'www',},
Line 89  if (! -e $local_my_cnf) { Line 217  if (! -e $local_my_cnf) {
                key     =>'password=',                 key     =>'password=',
                value   =>$loncapa_config->{'lonSqlAccess'}},]);                 value   =>$loncapa_config->{'lonSqlAccess'}},]);
   
 exit;  my $exitvalue = 0;
   
   if ($mysql_global_status) { $exitvalue = 1; }
   
   exit $exitvalue;
   
 #################################################################  
 #################################################################  
   
 =pod  
   
 =over 4  
   
 =cut  
   
 #################################################################  
 #################################################################  
 sub update_file {  sub update_file {
     my ($file,$newdata) = @_;      my ($file,$newdata) = @_;
     return 1 if (! -e $file);      return 1 if (! -e $file);
     my $backup = $file.'.backup';      my $backup = $file.'.backup';
     if (! copy($file,$backup)) {      if (! copy($file,$backup)) {
         warn "Error: Unable to make backup of $file";          warn "**** Error: Unable to make backup of $file";
         return 0;          return 0;
     }      }
     my ($filedata) = &parse_config_file($file);      my ($filedata) = &parse_config_file($file);
     if (! ref($filedata)) { warn "Error: $filedata"; return 0;}      if (! ref($filedata)) { warn "**** Error: $filedata"; return 0;}
       my $modified = 0;
     foreach my $data (@$newdata) {      foreach my $data (@$newdata) {
         my $section = $data->{'section'};          my $section = $data->{'section'};
         my $key = $data->{'key'};          my $key = $data->{'key'};
         my $value = $data->{'value'};          my $value = $data->{'value'};
         &modify_config_file($filedata,$section,$key,$value)          my $result = &modify_config_file($filedata,$section,$key,$value);
           if ($result) { $modified = 1; }
     }      }
     my $result = &write_config_file($file,$filedata);      if ($modified) {
     if (defined($result)) { warn 'Error:'.$result; return 0; }          my $result = &write_config_file($file,$filedata);
     return 1;          if (defined($result)) { warn 'Error:'.$result; return 0; }
       }
       return $modified;
 }  }
   
 #################################################################  #################################################################
Line 130  sub update_file { Line 254  sub update_file {
   
 =pod  =pod
   
 =item &parse_config_file  =over 4
   
   =item &parse_config_file()
   
 Read a configuration file in and parse it into an internal data structure.  Read a configuration file in and parse it into an internal data structure.
   
Line 138  Input: filename Line 264  Input: filename
   
 Output: array ref $filedata  OR  scalar error message  Output: array ref $filedata  OR  scalar error message
   
   =back 
   
 =cut  =cut
   
 #################################################################  #################################################################
Line 155  sub parse_config_file { Line 283  sub parse_config_file {
             my $section_id = $1;              my $section_id = $1;
             push(@Structure,'__section__'.$section_id);              push(@Structure,'__section__'.$section_id);
             while ($line = shift(@Input)) {              while ($line = shift(@Input)) {
                   chomp($line);
                 if ($line =~ /^\[([^\]]*)\]/) {                  if ($line =~ /^\[([^\]]*)\]/) {
                     unshift(@Input,$line);                      unshift(@Input,$line);
                     last;                      last;
Line 175  sub parse_config_file { Line 304  sub parse_config_file {
   
 =pod  =pod
   
   =over 4
   
 =item  =item
   
 Write a configuration file out based on the internal data structure returned  Write a configuration file out based on the internal data structure returned
Line 184  Inputs: filename, $filedata (the return Line 315  Inputs: filename, $filedata (the return
   
 Returns: undef on success, scalar error message on failure.  Returns: undef on success, scalar error message on failure.
   
   =back
   
 =cut  =cut
   
 #################################################################  #################################################################
Line 225  sub write_config_file { Line 358  sub write_config_file {
   
 =pod  =pod
   
 =item &modify_config_file  =over 4
   
   =item &modify_config_file()
   
 Modifies the internal data structure of a configuration file to include new  Modifies the internal data structure of a configuration file to include new
 sections and/or new configuration directives.  sections and/or new configuration directives.
Line 237  value prepended). Line 372  value prepended).
 $newkey: A line which matches this will be replaced with $newkey.$newvalue  $newkey: A line which matches this will be replaced with $newkey.$newvalue
 $newvalue: The new value to be placed with the new key.  $newvalue: The new value to be placed with the new key.
   
   Returns: 0 or 1, indicating if the file was modified(1) or not(0).
   
   =back 
   
 =cut  =cut
   
 #################################################################  #################################################################
 #################################################################  #################################################################
 sub modify_config_file {  sub modify_config_file {
     my ($filedata,$section,$newkey,$newvalue)=@_;      my ($filedata,$section,$newkey,$newvalue)=@_;
       my $modified = 0;    # returned value - set to true if the file is modified
     my ($structure,$sections) = @$filedata;      my ($structure,$sections) = @$filedata;
     if (! defined($newvalue)) {      if (! defined($newvalue)) {
         $newvalue = '';          $newvalue = '';
Line 264  sub modify_config_file { Line 404  sub modify_config_file {
     # Put the item in or update it.      # Put the item in or update it.
     my $key_is_new = 1;      my $key_is_new = 1;
     for (my $i=0;$i<scalar(@$target);$i++) {      for (my $i=0;$i<scalar(@$target);$i++) {
           
         if ($target->[$i] =~/^$newkey/) {          if ($target->[$i] =~/^$newkey/) {
             $target->[$i]=$newline;              if ($target->[$i] ne $newline) {
                   $target->[$i]=$newline;
                   $modified = 1;
               }
             $key_is_new = 0;              $key_is_new = 0;
             last;              last;
         }          }
Line 278  sub modify_config_file { Line 420  sub modify_config_file {
             # No need to put things after a blank line.              # No need to put things after a blank line.
             if (defined($target->[-1]) && $target->[-1] =~ /^\s*$/) {              if (defined($target->[-1]) && $target->[-1] =~ /^\s*$/) {
                 $target->[-1] = $newline;                  $target->[-1] = $newline;
                   $modified = 1;
             } else {              } else {
                 push(@$target,$newline);                  push(@$target,$newline);
                   $modified = 1;
             }              }
         }          }
     }      }
     return ($filedata);      return $modified;
 }  }
   
   #################################################################
   #################################################################
   
   =pod
   
   =over 4
   
   =item &update_rhn_source()
   
   Modifies the Red Hat 4 sources file which includes repositories used by up2date 
   
   Inputs: 
   $rhn_items - a reference to hash of a hash containing the regular expression
   to test for, and the text string to append to the file, if an entry for the 
   LON-CAPA RHEL repository is missing for two cases:
   
   (a) basearch
   (b) noarch 
   
   Returns: 0 or 1, indicating if the file was modified(1) or not(0).
   
   =back
   
   =cut
   
   #################################################################
   #################################################################
   sub update_rhn_source {
       my ($rhn_items) = @_;
       return 0 if (ref($rhn_items) ne 'HASH');
       return 0 if ((ref($rhn_items->{basearch}) ne 'HASH') || (ref($rhn_items->{noarch}) ne 'HASH'));
       my $file = '/etc/sysconfig/rhn/sources';
       return 0 if (! -e $file);
       my $backup = $file.'.backup';
       if (! copy($file,$backup)) {
           warn "**** Error: Unable to make backup of $file";
           return 0;
       }
       my $result = 0;
       my $fh;
       if (open($fh,"<$file")) {
           my $total = 0;
           my %found;
           foreach my $item (keys(%{$rhn_items})) {
               $found{$item} = 0;
           }
           while(<$fh>) {
               foreach my $item (keys(%{$rhn_items})) {
                   if (ref($rhn_items->{$item}) eq 'HASH') {
                       my $pattern = $rhn_items->{$item}->{regexp};
                       if ($pattern ne '') { 
                           if (m{^$pattern}) {
                               $found{$item} = 1;
                               $total ++;
                           }
                       }
                   }
               }
               last if $total == 2;
           }
           close($fh);
           if ($total < 2) {
               if (open($fh,">>$file")) {
                   foreach my $item (keys(%{$rhn_items})) {
                       unless ($found{$item}) {
                           if (ref($rhn_items->{$item}) eq 'HASH') {
                               if ($rhn_items->{$item}->{text} ne '') {
                                   print $fh "\n".$rhn_items->{$item}->{text}."\n";
                                   $result = 1;
                               }
                           }
                       }
                   }
                   close($fh);
               }
           }
       }
       return $result;
   }
   
 #################################################################  #################################################################
 #################################################################  #################################################################
   
 =pod  =pod
   
   =over 4
   
   =item &update_apt_source()
   
   Modifies the source.list file which includes repositories used by apt-get
   
   Inputs:
   $deb_row - a reference to containing the regular expression
   to test for, and the text string to append to the file, if an entry for the
   LON-CAPA Debian/ or Ubuntu repository is missing.
   
   Returns: 0 or 1, indicating if the file was modified(1) or not(0).
   
 =back  =back
   
 =cut  =cut
   
 #################################################################  #################################################################
 #################################################################  #################################################################
   sub update_apt_source {
       my ($deb_row) = @_;
       return 0 if (ref($deb_row) ne 'HASH');
       return 0 if (($deb_row->{regexp} eq '') || ($deb_row->{text} eq ''));
       my $file = '/etc/apt/sources.list';
       return 0 if (! -e $file);
       my $backup = $file.'.backup';
       if (! copy($file,$backup)) {
           warn "**** Error: Unable to make backup of $file";
           return 0;
       }
       my $result = 0;
       my $fh;
       if (open($fh,"<$file")) {
           my $found = 0;
           my $pattern = $deb_row->{regexp};
           while(<$fh>) {
               if (m{^$pattern}) {
                   $found = 1;
                   last;
               }
           }
           close($fh);
           if (!$found) {
               if (open($fh,">>$file")) {
                   print $fh "\n".$deb_row->{text}."\n";
                   close($fh);
                   $result = 1;
               }
           }
       }
       return $result;
   }
   

Removed from v.1.3  
changed lines
  Added in v.1.9


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.