PERL   79

rpmcompare5

Guest on 1st July 2022 06:07:14 AM

  1. #!/usr/bin/perl -w
  2.  
  3. #use strict;
  4.  
  5. #Point these to a directory of RH and rebuilt (aka WB) RPMS
  6. #$WB_RPMS = "/home/test/b8";
  7. #$RH_RPMS = "/home/test/new";
  8.  
  9. my $WB_RPMS = "/centos-3/build8/i386/RedHat/RPMS";
  10. my $RH_RPMS = "/centos-3/build6/i386/RedHat/RPMS";
  11.  
  12. # Size difference to trigger error, .1 = plus/minus 10%
  13. my $SizeError=.10;
  14.  
  15. # Working directories
  16. # Careful where these point, they get a "rm -rf" cleaning!
  17. my $RHTMP="/tmp/RH-$$";
  18. my $WBTMP="/tmp/WB-$$";
  19. my $rpm;
  20.  
  21. opendir(DIR,$RH_RPMS);
  22. my @allrpms= grep (/rpm$/, readdir(DIR) );
  23. closedir(DIR);
  24.  
  25. foreach $rpm (sort @allrpms){
  26. my  $rpmwb=$rpm;
  27. my $rpmwbf=$rpm;
  28.  
  29.     if (! (-e "$WB_RPMS/$rpm") ) {
  30.         print "\nNo equivalent original for $rpm \t trying glob\n";
  31.  
  32.         my $fname= $rpm;
  33.         $fname =~ s/(.*)-.*-.*/$1-/;
  34. #       print "fname is $fname\n";
  35.         my $found = 0;
  36.  
  37. #print "trying $WB_RPMS/$fname*\n";
  38.  
  39.                  my @globmatch = glob("$WB_RPMS/$fname*");
  40.                 while ($rpmwb = shift @globmatch) {
  41.         #while($rpmwb = glob("$WB_RPMS/$fname*")){
  42.                 my $try = $rpmwb;
  43. #               print "\nglob got $try\n ";
  44.                 $try =~ s/.*\///;
  45.                 $try =~ s/(.*)-.*-.*/$1-/;
  46.                
  47.                 if($try eq $fname)
  48.                         {
  49.                         #this is the one
  50.                         $rpmwbf = $rpmwb;              
  51.                         $rpmwbf =~ s/.*\///;
  52.                         $found = 1;
  53.  
  54.                         while($rpmwb = glob("$WB_RPMS/$fname*")){};
  55.  
  56.                         last;
  57.                         }
  58.                 }
  59.        
  60.         if(!$found)
  61.                 {
  62.                 next;
  63.                 }
  64.     }
  65.  
  66.     if($rpm =~ /^kernel/)
  67.         {
  68.         next;
  69.         }      
  70.  
  71.     if($rpm eq $rpmwbf)
  72.         {
  73.         # only doing difficult ones
  74. #       next;
  75.         }
  76.     else
  77.         {
  78.         print "$rpm >> $rpmwbf\n";
  79.         }
  80.  
  81.     # Initialize
  82.     %allfiles=(); %RHhash=(); %WBhash=();
  83.     $fileproblems=0; $libproblems=0;
  84.     system("rm -rf $RHTMP;mkdir $RHTMP");
  85.     system("rm -rf $WBTMP;mkdir $WBTMP");
  86.     # Extract RPMS
  87.     system("cd $RHTMP/; rpm2cpio $RH_RPMS/$rpm | cpio -id --no-absolute-filenames --quiet");
  88.     system("cd $WBTMP/; rpm2cpio $WB_RPMS/$rpmwbf | cpio -id --no-absolute-filenames --quiet");
  89.  
  90.     # Parse name/size info
  91.     @RHnamesize=`cd $RHTMP/; find ./ -printf "%p:_:%s:_:%U:_:%G:_:%04m:_:\n"`;
  92.     @WBnamesize=`cd $WBTMP/; find ./ -printf "%p:_:%s:_:%U:_:%G:_:%04m:_:\n"`;
  93.     for ($i=0;$i<@RHnamesize;$i++){
  94.         ($file,$size,$uid,$gid,$perms)=split(/:_:/,$RHnamesize[$i]);
  95.         $RHhash{"$file"}=$size;
  96.         $RHuid{"$file"}=$uid;
  97.         $RHgid{"$file"}=$gid;
  98.         $RHperms{"$file"}=$perms;
  99.         $allfiles{"$file"}=1;
  100.     }
  101.     for ($i=0;$i<@WBnamesize;$i++){
  102.         ($file,$size,$uid,$gid,$perms)=split(/:_:/,$WBnamesize[$i]);
  103.         $WBhash{"$file"}=$size;
  104.         $WBuid{"$file"}=$uid;
  105.         $WBgid{"$file"}=$gid;
  106.         $WBperms{"$file"}=$perms;
  107.         $allfiles{"$file"}=1;
  108.     }
  109.  
  110.    
  111.     # Print and tag file errors if appropraite
  112.     printf ("%-50s\t", $rpm);
  113.     foreach $file (keys %allfiles){
  114.         if (!(exists $RHhash{"$file"})){
  115.             print "\n\tPackage contains extra file:  $file";
  116.             $fileproblems=1;
  117.         }
  118.         elsif (!(exists $WBhash{"$file"})){
  119.             print "\n\tPackage is missing file: $file";
  120.             $fileproblems=1;
  121.         }
  122.         else {
  123.             if ($RHhash{"$file"}>0){
  124.                 $ratio=($WBhash{"$file"})/($RHhash{"$file"})}
  125.             else{
  126.                 $ratio=1-$WBhash{"$file"};  # Negative ratios indicate filesize vs. zero in RedHat
  127.                 }
  128.             if (($ratio-1)*($ratio-1)>($SizeError*$SizeError)) {
  129.                 printf("\n\tSize Ratio: %3.2f on file:%s",$ratio,$file);
  130.                 $fileproblems=1;
  131.                 };
  132.  
  133.             if ($RHuid{"$file"} ne $WBuid{"$file"}) {
  134.                 printf("\n\tUid Diff $RHuid{\"$file\"} : $WBuid{\"$file\"} on $file");
  135.                 $fileproblems=1;
  136.                 }
  137.             if ($RHgid{"$file"} ne $WBgid{"$file"}) {
  138.                 printf("\n\tGid Diff $RHgid{\"$file\"} : $WBgid{\"$file\"} on $file");
  139.                 $fileproblems=1;
  140.                 }
  141.             if ($RHperms{"$file"} ne $WBperms{"$file"}) {
  142.                 printf("\n\tPerms Diff $RHperms{\"$file\"} : $WBperms{\"$file\"} on $file");
  143.                 $fileproblems=1;
  144.                 }
  145.            }
  146.     }
  147.  
  148.    
  149.     # Select executable files
  150.     @RHexec=`cd $RHTMP/; find ./ -perm +111 -type f -print`;
  151.  
  152.     # Check library dependencies
  153.     foreach $executable (@RHexec) {
  154.         chop $executable;
  155.  
  156.         #  Move on if no equivalent binary exists in rebuild
  157.         if (! (-e "$WBTMP/$executable") ) {next;}
  158.  
  159.         # Get shared libs
  160.         @RHlibs=`ldd $RHTMP/$executable`;
  161.         @WBlibs=`ldd $WBTMP/$executable`;
  162.  
  163.         # Clean up ldd output
  164.         $RHlibline=join('',(sort @RHlibs));
  165.         $WBlibline=join('',(sort @WBlibs));
  166.         $RHlibline=~ s/=>(.*)(\n)/\n/g; $RHlibline=~ s/(\s+)/ /g;
  167.         $WBlibline=~ s/=>(.*)(\n)/\n/g; $WBlibline=~ s/(\s+)/ /g;
  168.         @RHlibs=split(/ /,$RHlibline);
  169.         @WBlibs=split(/ /,$WBlibline);
  170.  
  171.         # Print and tag library errors
  172.         foreach $lib (@RHlibs){
  173.             $searchpat=$lib;
  174.             $searchpat =~ s/\+/\\\+/g;
  175.             $searchpat =~ s/\./\\\./g;
  176.             unless ($WBlibline =~ (/$searchpat/)){
  177.                 print "\n\tMissing link in $executable:\t$lib";$libproblems=1;
  178.             }
  179.         }
  180.            
  181.         foreach $lib (@WBlibs){
  182.             $searchpat=$lib;
  183.             $searchpat =~ s/\+/\\\+/g;
  184.             $searchpat =~ s/\./\\\./g;
  185.             unless ($RHlibline =~ (/$searchpat/)){
  186.                 print "\n\tExtra link in $executable:\t$lib";$libproblems=1;
  187.             }
  188.         }
  189.     }
  190.  
  191.     # sort out provides and requires
  192.  
  193.    @RHrequires = `rpm -qp --requires $RH_RPMS/$rpm`;
  194.    @WBrequires = `rpm -qp --requires $WB_RPMS/$rpmwbf`;
  195.  
  196.    while ($rhrequire = shift(@RHrequires))
  197.         {
  198.         if($wbrequire = shift(@WBrequires))
  199.                 {
  200.                 chomp($rhrequire);
  201.                 chomp($wbrequire);
  202.  
  203. #               print "$rhrequire : $wbrequire\n";
  204.  
  205.                 if ($rhrequire gt $wbrequire)
  206.                         {
  207.                         # extra one in wbrequire
  208.                         print "\n\tExtra require $wbrequire";$fileproblems=1;
  209.                         unshift(@RHrequires,$rhrequire);
  210.                         }
  211.                 elsif($rhrequire lt $wbrequire)
  212.                         {
  213.                         # one missing in wbrequire
  214.                         print "\n\tMissing require $rhrequire";$fileproblems=1;
  215.                         unshift(@WBrequires,$wbrequire);
  216.                         }
  217.  
  218.                 }
  219.         else
  220.                 {
  221.                 # end of wb array
  222.                 print "\n\tMissing require $rhrequire";$fileproblems=1;
  223.                 }
  224.  
  225.         }
  226.  
  227.   if(shift(@WBrequires)){
  228.         # extra in the wb array
  229.         print "\n\tExtra require $wbrequire";$fileproblems=1;
  230.         }
  231.  
  232.  
  233.    @RHprovides = `rpm -qp --provides $RH_RPMS/$rpm`;
  234.    @WBprovides = `rpm -qp --provides $WB_RPMS/$rpmwbf`;
  235.  
  236.    while ($rhprovide = shift(@RHprovides))
  237.         {
  238.         if($wbprovide = shift(@WBprovides))
  239.                 {
  240.                 chomp($rhprovide);
  241.                 chomp($wbprovide);
  242.  
  243. #               print "$rhprovide : $wbprovide\n";
  244.  
  245.                 if ($rhprovide gt $wbprovide)
  246.                         {
  247.                         # extra one in wbprovide
  248.                         print "\n\tExtra provide $wbprovide";$fileproblems=1;
  249.                         unshift(@RHprovides,$rhprovide);
  250.                         }
  251.                 elsif($rhprovide lt $wbprovide)
  252.                         {
  253.                         # one missing in wbprovide
  254.                         print "\n\tMissing provide $rhprovide";$fileproblems=1;
  255.                         unshift(@WBprovides,$wbprovide);
  256.                         }
  257.  
  258.                 }
  259.         else
  260.                 {
  261.                 # end of wb array
  262.                 print "\n\tMissing provide $rhprovide";$fileproblems=1;
  263.                 }
  264.  
  265.         }
  266.  
  267.   if(shift(@WBprovides)){
  268.         # extra in the wb array
  269.         print "\n\tExtra provide $wbprovide";$fileproblems=1;
  270.         }
  271.  
  272.  
  273.     if ($fileproblems || $libproblems) { print "\n\n";} else {print "MATCH\n";}
  274. }

Raw Paste


Login or Register to edit or fork this paste. It's free.