home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / sbin / module_upgrade < prev    next >
Text File  |  2006-11-29  |  3KB  |  146 lines

  1. #! /usr/bin/perl -w
  2.  
  3. #  module_upgrade
  4. #
  5. #  Scan all system configuration files that refer to kernel modules and
  6. #  replace occurrences of old module names with their new name.
  7. #
  8. #  This script is free software; you can redistribute it and/or modify
  9. #  it under the terms of the GNU General Public License version 2 as
  10. #  published by the Free Software Foundation.
  11. #
  12. #  Copyright by Andreas Gruenbacher <agruen@suse.de>, December 2004
  13.  
  14. use Getopt::Long;
  15. use FileHandle;
  16. use strict;
  17.  
  18. my $verbose = 0;  # Verbose output?
  19. my $rename = {};  # The list of modules that are renamed
  20.  
  21. if (!GetOptions("rename=s%" => $rename,
  22.         "verbose" => \$verbose)) {
  23.     die "SYNOPSIS: $0 {--rename old=new} ...\n";
  24. }
  25.  
  26. # Apply FUNC to each line of file FILENAME. If FUNC modifies any of the
  27. # lines, write back the result into FILE.
  28. #
  29. sub update_file($$) {
  30.     my ($func, $filename) = @_;
  31.     print "Checking file $filename...\n"
  32.     if $verbose;
  33.     my $fh = new FileHandle("< $filename")
  34.     or die "$filename: $!\n";
  35.  
  36.     local $/ = undef;
  37.     my @before = split /\n/, <$fh>;
  38.     my @after = @before;
  39.  
  40.     map { &$func($_) } @after;
  41.  
  42.     if ((join "\n", @before) ne (join "\n", @after)) {
  43.     print "Updating file $filename...\n"
  44.         if $verbose;
  45.     my $fh = new FileHandle("> $filename")
  46.         or die "Writing to $filename: $!\n";
  47.     print $fh join "\n", @after;
  48.     }
  49. }
  50.  
  51. # A line in a Shell-style script. The followng forms are recognized:
  52. #   variable="value", variable='value', variable=value
  53. #
  54. sub script($$$) {
  55.     my ($subst, $variables);
  56.     ($subst, $variables, $_) = @_;
  57.  
  58.     if (
  59.     /^\s*([^=\s]+)\s*=\s*(")((?:[^"]|\\.)*)"/ ||
  60.     /^\s*([^=\s]+)\s*=\s*(')([^']*)'/ ||
  61.     /^\s*([^=\s]+)\s*=\s*()(\S+)/
  62.     ) {
  63.     foreach my $v (@$variables) {
  64.         if ($1 eq $v) {
  65.         $_ = "$v=$2" . (join " ", map {
  66.             exists $subst->{$_} ? $subst->{$_} : $_
  67.             } split /\s+/, $3 ) . "$2";
  68.         }
  69.     }
  70.     }
  71. }
  72.  
  73. # The /etc/sysconfig/kernel script, basically
  74. #
  75. sub linuxrc_script($) {
  76.     return script $rename, ['INITRD_MODULES', 'MODULES_LOADED_ON_BOOT'], $_;
  77. }
  78.  
  79. # An interface config file below /etc/sysconfig/network/
  80. #
  81. sub ifcfg_script($) {
  82.     return script $rename, ['MODULE'], $_;
  83. }
  84.  
  85. # A file sourced by modprobe (/etc/modprobe.conf and friends).
  86. sub modprobe_conf($) {
  87.     if (/^(\s*alias\s+\S+\s+)(\S+)(.*)/
  88.     && exists $rename->{$2}) {
  89.     $_ = "$1$rename->{$2}$3";
  90.     } elsif (/^(\s*(?:options|install|remove)\s+)(\S+)(.*)/
  91.          && exists $rename->{$2}) {
  92.     $_ = "$1$rename->{$2}$3";
  93.     }
  94. }
  95.  
  96. my $errors = 0;
  97.  
  98. # Update all modprobe.conf files
  99. eval {
  100.     update_file \&modprobe_conf, '/etc/modprobe.conf';
  101. };
  102. if ($@) {
  103.     warn $@;
  104.     $errors++;
  105. }
  106.  
  107. eval {
  108.     update_file \&modprobe_conf, '/etc/modprobe.conf.local';
  109. };
  110. if ($@) {
  111.     warn $@;
  112.     $errors++;
  113. }
  114.  
  115. for my $conf (</etc/modprobe.d/*>) {
  116.     eval {
  117.     update_file \&modprobe_conf, $conf;
  118.     };
  119.     if ($@) {
  120.     warn $@;
  121.     $errors++;
  122.     }
  123. }
  124.  
  125. # Update sysconfig
  126. eval {
  127.     update_file \&linuxrc_script, '/etc/sysconfig/kernel';
  128. };
  129. if ($@) {
  130.     warn $@;
  131.     $errors++;
  132. }
  133.  
  134. # Update all ifcfg files
  135. for my $ifcfg (</etc/sysconfig/network/ifcfg-*>) {
  136.     eval {
  137.     update_file \&ifcfg_script, $ifcfg;
  138.     };
  139.     if ($@) {
  140.     warn $@;
  141.     $errors++;
  142.     }
  143. }
  144.  
  145. exit $errors ? 1 : 0;
  146.