home *** CD-ROM | disk | FTP | other *** search
/ Caldera Network Desktop 1.0 / caldera-network-desktop-1.0.bin / upgrade < prev   
Text File  |  1996-01-11  |  8KB  |  335 lines

  1. #!/usr/bin/perl
  2.  
  3. ## TODO: Filter out "directory ... could not be removed" (unless --verbose).
  4. ## TODO: Filter out "... conflicts with file from ..." (unless --verbose).
  5.  
  6. require "flush.pl";
  7.  
  8. $version = "1.0";
  9. $install = 1;
  10. $rpm_ok = 0;
  11.  
  12. # %shared_files;
  13.  
  14. @saved_configs = ();
  15. @saved_configs_names = ();
  16. @failed_packages = ();
  17.  
  18. print("Red Hat RPM system upgrader, version $version\n");
  19. print("Copyright (c) 1995 Red Hat Software\n");
  20. print("\n");
  21. print("NOTE: THIS SCRIPT IS FOR UPGRADING RED HAT 2.0 to 2.1 ONLY!\n");
  22. print("      It is not supported for upgrading CND Preview II to CND 1.0!\n");
  23.  
  24. sub install_package {
  25.     my ( $p, $n ) = @_;
  26.  
  27.     if ($install) {
  28. #    print("Executing: rpm -Uvh --force $p\n");
  29.     pipe(ERRIN, ERROUT);
  30.     $pid = fork();
  31.     if (! $pid) {
  32.         close(ERRIN);
  33.         close(STDERR);
  34.         open(STDERR, ">&ERROUT");
  35.         exec("rpm -Uvh --force $p");
  36.         print STDOUT "exec of rpm failed!\n";
  37.         exit(1);
  38.     }
  39.     close(ERROUT);
  40.     while (<ERRIN>) {
  41.         print(STDERR $_);
  42.         if (/saved as/) {
  43.         # This is a saved config file
  44.         chop;
  45.         split;
  46.         unshift (@saved_configs, $_[1]);
  47.         unshift (@saved_configs_names, $n);
  48.         }
  49.     }
  50.     wait;
  51.     if ($?) {
  52.         push(@failed_packages, $p);
  53.     }
  54.     } else {
  55.     print("Would run: rpm -Uvh --force $p\n");
  56.     }
  57. }
  58.  
  59. sub usage {
  60.     print(STDERR "upgrade [--test] [--rpm-ok] [package]* [packagedirs]*\n");
  61.     exit(1);
  62. }
  63.  
  64. #################################################################
  65. #
  66. # First find available packages, and install any version of rpm
  67. #
  68.  
  69. @NARGV = ();
  70.  
  71. foreach (@ARGV) {
  72.     /^--rpm-ok/ && do {
  73.     $rpm_ok = 1;
  74.     next;
  75.     };
  76.     /^--test/ && do {
  77.     $install = 0;
  78.     next;
  79.     };
  80.     /^-.*/ && do {
  81.     &usage;
  82.     };
  83.     push(@NARGV, $_);
  84. }
  85.  
  86. @trydirs = ("RedHat/RPMS",
  87.         "/mnt/cdrom/RedHat/RPMS",
  88.         "/mnt/rhscd/RedHat/RPMS");
  89.  
  90. if (! @NARGV) {
  91.     foreach (@trydirs) {
  92.     if (-d $_) {
  93.         push(@NARGV, $_);
  94.         last;
  95.     }
  96.     }
  97.  
  98.     if (! @NARGV) {
  99.     printf(STDERR "Could not find package directory:\n");
  100.     foreach (@trydirs) {
  101.         printf(STDERR "\t$_\n");
  102.     }
  103.     exit(1);
  104.     }
  105. }
  106.  
  107. print("\nFinding packages...\n\n");
  108.  
  109. foreach (@NARGV) {
  110.     if (-f $_) {
  111.     push(@prospective_packages, $_);
  112.     } elsif (-d $_) {
  113.     opendir(D, $_);
  114.     @files = readdir(D);
  115.     closedir(D);
  116.     foreach $f (@files) {
  117.         if ((-f "$_/$f") && ($f =~ /\.rpm/)) {
  118.         push(@prospective_packages, "$_/$f");
  119.         }
  120.     }
  121.     } else {
  122.     printf(STDERR "Ignoring: $_");
  123.     }
  124. }
  125.  
  126. if (! $rpm_ok) {
  127.     $rpm_package = "";
  128.     ($rpm_package) = grep(m|rpm-.*|, @prospective_packages);
  129.     if ($rpm_package) {
  130.     &install_package($rpm_package);
  131.     print("\n");
  132.     }
  133. }
  134.  
  135. ########################################################
  136. #
  137. # Query the system state and the available packages
  138. #
  139.  
  140. print("Taking stock of things...\n\n");
  141.  
  142. # First get list of packages already installed
  143. $x = 0;
  144. printf("Packages installed: %5d", $x);
  145. &flush(STDOUT);
  146. open(F, "rpmq -qa|");
  147. while (<F>) {
  148.     chop;
  149.     $installed_rpms{$_} = 1;
  150.     m|(.*)-([^-]*-[^-]*)|;
  151.     $installed_split{$1} = $2;
  152.     $x++;
  153.     printf("\b\b\b\b\b%5d", $x);
  154.     &flush(STDOUT);
  155. }
  156. printf("\b\b\b\b\b%5d\n", $x);
  157. close(F);
  158.  
  159. # Now get a list of all rpm-managed files
  160. $x = 0;
  161. printf("Files installed   : %5d", $x);
  162. &flush(STDOUT);
  163. open(F, "rpmq -qal|");
  164. while (<F>) {
  165.     chop;
  166.     push(@installed_files, $_);
  167.     $x++;
  168.     if (int($x / 41) eq ($x / 41)) {
  169.     printf("\b\b\b\b\b%5d", $x);
  170.     &flush(STDOUT);
  171.     }
  172. }
  173. printf("\b\b\b\b\b%5d\n", $x);
  174. close(F);
  175.  
  176. # Now generate a map from new_files -> new_rpms
  177. $x = 0;
  178. printf("Packages available: %5d", $x);
  179. &flush(STDOUT);
  180. foreach $rpm (@prospective_packages) {
  181.     open(F, "rpmq -qp $rpm|");
  182.     $_ = <F>;
  183.     close(F);
  184.     chop;
  185.     $rpmproper = $_;
  186.     $new_rpms{$_} = $rpm;
  187.     m|(.*)-([^-]*-[^-]*)|;
  188.     $available_split{$1} = $2;
  189.     
  190.     open(F, "rpmq -qlp $rpm|");
  191.     while (<F>) {
  192.     chop;
  193.     $shared_files{$_}++;
  194.     $new_files{$_} = $rpmproper;
  195.     s/\.so\..*/.so/;
  196.     $new_files_noso{$_} = $rpmproper;
  197.     }
  198.     close(F);
  199.     printf("\b\b\b\b\b%5d", $x);
  200.     &flush(STDOUT);
  201.     $x++;
  202. }
  203. printf("\b\b\b\b\b%5d\n", $x);
  204. close(F);
  205.  
  206. ###################################################################
  207. #
  208. # Determine rpms we need to install
  209. #
  210.  
  211. printf("\nDetermining packages to upgrade...\n\n");
  212.  
  213. # Find new packages by just examining versions
  214. $header = 0;
  215. foreach (sort keys %installed_split) {
  216.     if (defined($available_split{$_})) {
  217.     if ($available_split{$_} ne $installed_split{$_}) {
  218.         if (!$header) {
  219.         $header = 1;
  220.         printf("%-35s%-20s%-20s\n", "Package", "New Version", "Old Version");
  221.         printf("==================================================================\n");
  222.         }
  223.         printf("%-35s%-20s%-20s\n", $_, $available_split{$_}, $installed_split{$_});
  224.         $rpm = "$_-$available_split{$_}";
  225.         $rpms_to_install{$rpm} = 1;
  226.     }
  227.     }
  228. }
  229.  
  230. # Find new packages by looking up file names (files that moved)
  231. $header = 0;
  232. foreach (@installed_files) {
  233.     if (defined($new_files{$_})) {
  234.     if ($shared_files{$_} > 1) {
  235.         next;
  236.     }
  237.     $rpm = $new_files{$_};
  238.     if (defined($installed_rpms{$rpm})) {
  239.         # Not an upgrade -- already installed
  240.     } else {
  241.         # Upgrade
  242.         if (defined($rpms_to_install{$rpm}) &&
  243.         ($rpms_to_install{$rpm} == 1)) {
  244.         # Already got this one
  245.         } else {
  246.         if (!$header) {
  247.             $header = 1;
  248.             printf("\n%-35s%-20s\n", "Files moved to", "Version");
  249.             printf("==================================================================\n");
  250.         }
  251.         $rpm =~ m|(.*)-([^-]*-[^-]*)|;
  252.         printf("%-35s%-20s\n", $1, $2);
  253.         $rpms_to_install{$rpm} = 1;
  254.         }
  255.     }
  256.     }
  257. }
  258.  
  259. # And finally, find packages by looking up file names,
  260. # ignoring any .so.(.*) stuff, for stuff that moved
  261. # (shared libs that moved and changed version number)
  262.  
  263. $header = 0;
  264. @installed_sofiles = grep(/.*\.so\..*/, @installed_files);
  265. foreach (@installed_sofiles) {
  266.     s/\.so\..*/.so/;
  267.     if (defined($new_files_noso{$_})) {
  268.     $rpm = $new_files_noso{$_};
  269.     if (defined($installed_rpms{$rpm})) {
  270.         # Not an upgrade -- already installed
  271.     } else {
  272.         # Upgrade
  273.         if (defined($rpms_to_install{$rpm}) &&
  274.         ($rpms_to_install{$rpm} == 1)) {
  275.         # Already got this one
  276.         } else {
  277.         if (!$header) {
  278.             $header = 1;
  279.             printf("\n%-35s%-20s\n", "Shared libs moved to", "Version");
  280.             printf("==================================================================\n");
  281.         }
  282.         $rpm =~ m|(.*)-([^-]*-[^-]*)|;
  283.         printf("%-35s%-20s\n", $1, $2);
  284.         $rpms_to_install{$rpm} = 1;
  285.         }
  286.     }
  287.     }
  288. }
  289.  
  290. ######################################################################
  291. #
  292. # Do something with what we just learned
  293. #
  294.  
  295. $header = 0;
  296. foreach (sort grep(m|rpm-.*|, (keys %rpms_to_install))) {
  297.     if ($rpm_ok) {
  298.     # If rpm_ok, then we skipped installing any rpm package
  299.     # If !rpm_ok, then we already installed it at the beginning
  300.     $header = 1;
  301.     printf("\nUpgrading packages...\n\n");
  302.     &install_package($new_rpms{$_}, $_);
  303.     }
  304.     delete($rpms_to_install{$_});
  305. }
  306. foreach (sort keys %rpms_to_install) {
  307.     if (! $header) {
  308.     $header = 1;
  309.     printf("\nUpgrading packages...\n\n");
  310.     }
  311.     &install_package($new_rpms{$_}, $_);
  312.     delete($rpms_to_install{$_});
  313. }
  314.  
  315. if (@saved_configs) {
  316.     printf("\nThe following config files have been changed.\n");
  317.     printf("The originals are saved as <file>.orig\n");
  318.     printf("\n%-35s%s\n", "Package", "File");
  319.     printf("==================================================================\n");
  320.     while (@saved_configs_names) {
  321.     printf("%-35s%s\n",
  322.            shift(@saved_configs_names),
  323.            shift(@saved_configs));
  324.     }
  325. }
  326.  
  327. if (@failed_packages) {
  328.     printf("\nThe following packages failed to install!\n\n");
  329.     foreach (sort @failed_packages) {
  330.     print "$_\n";
  331.     }
  332. }
  333.  
  334. exit(0);
  335.