Created
November 30, 2013 19:03
-
-
Save ilyaevseev/7723128 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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