#!/usr/bin/perl -w package Chkworld; use sort "_quicksort"; use warnings; no warnings qw( uninitialized ); use File::Find; use IO::File; use Data::Dumper; sub contents { my $sfh = IO::File->new( "< $_" ); local $/ = undef; my $cont = $sfh->getline; $sfh->close; return $cont; } sub getpids{ my @pids = @_; my @allpids; for my $pid (@pids){ my @childs = qx/pgrep -P $pid/; chomp @childs; push @allpids, $pid, getpids(@childs); } @allpids; } sub timeout{ #time, command my ($time, $comm) = @_; my $output; my $pid; eval{ local $SIG{ALRM} = sub {die "alarm\n" }; alarm $time; $pid = open(COMM, "$comm|"); $output = scalar ; close COMM; }; if ($@) { do{ my @chldpids = getpids($pid); for my $chldpid (@chldpids) { kill TERM => $chldpid; } return 'TIMEOUTED'; } if $@ eq "alarm\n"; # die $@ unless $@ && $@ eq "alarm\n"; } return $output; } #IN: dirs*, time*, devel* sort* output preoutput postoutput #OUT:# sub init_chk { #generate the iterator my %input = @_; $input{dirs} = (@{$input{dirs}}) ? $input{dirs} : ['.',]; $input{time} = $input{time} || 30; $input{output} = $input{output} || sub {print "@_\n";}; $input{preoutput} = $input{preoutput} || sub {}; $input{postoutput} = $input{postoutput} || sub {}; my @blacklist = @{$input{blacklist}}; my %m8rs; my $dev = $input{devel}; my ($m8r,$pkgname,$pkgver,$group,$up2date,$signal); my $prog; if ($input{sort}){ find sub{ if (/^FrugalBuild\z/) { do {next if $File::Find::dir =~ /$blacklist[$_]/} for 0..scalar @blacklist-1; my $buildscript = contents $_; my ($m8r) = $buildscript =~ /^# Maintainer: (.*?) (); for $dev (sort m8r_sort keys(%m8rs)){ find sub{ if (/^FrugalBuild\z/){ do {goto OUT if $File::Find::dir =~ /$blacklist[$_]/} for 0..scalar @blacklist-1; my $buildscript = contents $_; ($m8r) = $buildscript =~ /^# Maintainer: (.*?) ($m8r,$pkgname,$pkgver,$up2date,$group,$signal); OUT: next; } }, @{$input{dirs}}; } $input{postoutput}->(); } } sub m8r_sort { return lc($a) cmp lc($b); } package main; use strict; use Data::Dumper; use Getopt::Long; use Pod::Usage; our $VERSION = "0.9"; #my %opts; #getopts('svcmhet:d:b:', \%opts); my ($sort,$devel,$html,$time,$error,$verbose,$color,$help,@bl,@dirs); GetOptions( 's|sort' => \$sort, 'd|devel:s' => \$devel, 'm|html' => \$html, 't|time:i' => \$time, 'b|blacklist:s{,}' => \@bl, 'e|error' => \$error, 'v|verbose' => \$verbose, 'c|color' => \$color, 'h|help' => \$help, 'r|dirs:s{,}' => \@dirs, ) || pod2usage(0); sub HELP_MESSAGE(){ pod2usage(1); } HELP_MESSAGE && exit if $help; # better be in a module!!!!!!!!!!!!!! my $count = 0; my $needupdate = 0; my $maybebroken = 0; my $timeouted = 0; my $passed = 0; my ($preout, $out, $postout); sub std_preout {open STDERR, "/dev/null" unless $error; } sub std_out { my ($m8r,$pkgname,$pkgver,$up2date,$group,$signal) = @_; $count++; my $info = "Checking for $group/$pkgname-$pkgver... "; print $info if $verbose; if ($signal == -1) { $timeouted++; #$noout = 0; print $info unless $verbose; if ($color){ print "\033[1;33mTimed out!\033[1;0m $m8r\n"; } else { print "Timed out! $m8r\n"; } } elsif ($signal == 0){ # $noout = 0; print $info unless $verbose; if ($color){ print ($up2date ? ("!= \033[1;31m" . substr($up2date, 0, 12)."\033[1;0m" ) : "\033[1;33mThere was no output!\033[1;0m"); } else { print ($up2date ? ("!= " . substr($up2date, 0, 12)) : "There was no output!"); } ($up2date ? ($needupdate++) : ($maybebroken++)); print " $m8r\n"; } else { $passed++; print "Passed $m8r\n" if $verbose && !$color; print "\033[1;32mPassed\033[1;0m\n" if $verbose && $color; } } sub std_postout { print "\nTotal packages checked: $count\n"; print "Passed : $passed\n"; print "Need to update : $needupdate\n"; print "Timed out : $timeouted\n"; print "Maybe broken up2date : $maybebroken\n"; } sub htmlinfo{ #info my ($info) = @_; return "\t\t\t\n\t\t\t\t\n\t\t\t\t\t$info\n\t\t\t\t\n"; } sub htmlres{ #status, res my ($status, $res) = @_; if($status) { return "\t\t\t\t\n\t\t\t\t\t$res\n\t\t\t\t\n\t\t\t\n"; } else { return "\t\t\t\t\n\t\t\t\t\t$res\n\t\t\t\t\n\t\t\t\n"; } } sub html_preout { open STDERR, "/dev/null" unless $error; print "\n\t\n\t\t\n\t\t\tChkworld status\n\t\t\n\t\n\t\n"; print "\t\tLast updated: " . localtime() . "\n"; print "\t\t\n"; } sub html_out{ my ($m8r,$pkgname,$pkgver,$up2date,$group,$signal) = @_; $count++; my $info = "Checking for $group/$pkgname-$pkgver... "; print htmlinfo $info if $verbose; if ($signal == -1) { $timeouted++; #$noout = 0; print htmlinfo $info unless $verbose; print htmlres(0, "Timed out! $m8r"); } elsif ($signal == 0){ # $noout = 0; print htmlinfo $info unless $verbose; print (htmlres(0, $up2date ? ("!= " . substr($up2date, 0, 12)) . " $m8r": "There was no output! $m8r")); ($up2date ? ($needupdate++) : ($maybebroken++)); } else { $passed++; print htmlres(1, "Passed $m8r") if $verbose; } } sub html_postout{ print "\t\t
\n"; print "\t\t\n"; print "\t\t\t\n\t\t\t\t\n"; print "\t\t\t\t\n\t\t\t\n"; print "\t\t\t\n\t\t\t\t\n"; print "\t\t\t\t\n\t\t\t\n"; print "\t\t\t\n\t\t\t\t\n"; print "\t\t\t\t\n\t\t\t\n"; print "\t\t\t\n\t\t\t\t\n"; print "\t\t\t\t\n\t\t\t\n"; print "\t\t\t\n\t\t\t\t\n"; print "\t\t\t\t\n\t\t\t\n"; print "\t\t
\n\t\t\t\t\tTotal packages checked:\n\t\t\t\t\n\t\t\t\t\t$count\n\t\t\t\t
\n\t\t\t\t\tPassed\n\t\t\t\t\n\t\t\t\t\t$passed\n\t\t\t\t
\n\t\t\t\t\tNeed to update:\n\t\t\t\t\n\t\t\t\t\t$needupdate\n\t\t\t\t
\n\t\t\t\t\tTimed out:\n\t\t\t\t\n\t\t\t\t\t$timeouted\n\t\t\t\t
\n\t\t\t\t\tMaybe broken up2date:\n\t\t\t\t\n\t\t\t\t\t$maybebroken\n\t\t\t\t
\n"; print "\t\n\n"; } $preout = $html ? \&html_preout : \&std_preout; $out = $html ? \&html_out : \&std_out; $postout = $html ? \&html_postout : \&std_postout; my $chkw = Chkworld::init_chk( dirs => \@dirs, time => $time, devel => $devel, sort => $sort, blacklist => \@bl, preoutput => $preout, output => $out, postoutput => $postout, ); $chkw->();