Skip to content

Instantly share code, notes, and snippets.

@ilyaevseev
Created November 30, 2013 19:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ilyaevseev/7723128 to your computer and use it in GitHub Desktop.
Save ilyaevseev/7723128 to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
#
# rpmuncovered
#
# Display all files not owned by any package or changed after installation.
# Works on any RPM-based OS (RHEL, CentOS, SL, Fedora, SuSE, Mdk, ALTLinux, ...).
#
# Written by ilya.evseev@gmail at Nov-2013
# Distributed as public domain.
#_______________________________________________________________
#
# Step 1: find / /boot ... -xdev > all_files0.lst
# Step 2: cat allfiles0.lst |
# grep -v '^/var/cache/' |
# grep -v '^/var/log/' |
# grep -v '^/var/lib/yum/' |
# grep -v '^/var/lib/nginx/tmp/' |
# grep -v '^/var/spool/postfix/' |
# grep -v '^/tmp/' > allfiles.lst
# Step 3: rpm -Va > rpm_Va.lst
# Step 4: mkdir rpm_ql; rpm -qa | while read p; do rpm -ql $p > rpm_ql/$p.lst; done
# Step 5: /path/to/rpmuncovered > rpmuncovered.lst
#_______________________________________________________________
#
use strict;
use warnings;
my $ALL_FILES = './allfiles.lst';
my $RPM_CHANGED = './rpm_Va.lst';
my $RPM_LISTDIR = './rpm_ql';
my %rpm_allfiles;
my %rpm_changed;
my $total = 0;
my $uncovered = 0;
my $unchanged = 0;
opendir D, $RPM_LISTDIR or die "Cannot open directory $RPM_LISTDIR: $!\n";
while(readdir D) {
/\.lst$/ or next;
open F, "$RPM_LISTDIR/$_" or die "Cannot open $RPM_LISTDIR/$_: $!\n";
while(<F>) {
chomp;
$rpm_allfiles{$_} = 1;
}
close F;
}
close D;
open F, $RPM_CHANGED or die "Cannot open $RPM_CHANGED: $!\n";
while(<F>) {
chomp;
my @a;
push @a, 'size' if /^S/;
push @a, 'md5' if /^..5/;
next unless @a;
my @w = split;
$rpm_changed{$w[$#w]} = join(',',@a);
}
close F;
open F, $ALL_FILES or die "Cannot open $ALL_FILES: $!\n";
while(<F>) {
chomp;
$total++;
unless ($rpm_allfiles{$_}) {
printf "%12s\t%s\n", 'uncovered', $_;
$uncovered++;
} elsif (my $status = $rpm_changed{$_}) {
printf "%12s\t%s\n", $status, $_;
$unchanged++;
}
}
close F;
printf STDERR "Done. Total %d files, %d in RPM database (%d changed), %d uncovered, %d unchanged.\n",
$total, scalar keys %rpm_allfiles, scalar keys %rpm_changed, $uncovered, $unchanged;
## END ##
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment