8 =head1 NAME $RCSfile: cleantmp.pl,v $
10 Keep /tmp clean based on filesets
18 Andrew DeFaria <Andrew@DeFaria.com>
26 Wed Feb 21 20:43:58 PST 2018
36 Usage: cleantmp.pl [-u|sage] [-h|elp] [-v|erbose] [-d|ebug]
37 [-t|mp <dir>] [-c|onf <file>] [-l|ogpath <path>]
41 -u|sage Print this usage
43 -v|erbose: Verbose mode
44 -d|ebug: Print debug messages
45 -t|mp <dir>: Tmp directory to monitor (Default: /tmp)
46 -c|onf <file>: Config file holding patterns to match (Default:
47 .../etc/cleantmp.conf)
48 -l|ogpath <path>: Path to logfile (Default: /var/log)
49 -a|ppend: Append to logfile (Default: Noappend)
50 -da|emon Run in daemon mode (Default: -daemon)
51 -s|leep <secs>: How many seconds to sleep between polls (Default: 60)
55 This script will run in the background and keep /tmp clean. It will read in a
56 list of Perl regexs from the config file. When new files are created in tmp they
57 will be compared against the list of regexs and if there's a match the file or
58 directory will be removed.
60 The sleep parameter tells us how long to wait before polling for changes again
69 use File::Path qw/remove_tree/;
71 use lib "$FindBin::Bin/../lib";
77 my ($script) = ($FindBin::Script =~ /^(.*)\.pl/);
83 usage => sub { pod2usage },
84 help => sub { pod2usage(-verbose => 2)},
85 verbose => sub { set_verbose },
86 debug => sub { set_debug },
88 tmp => File::Spec->tmpdir(),
89 conf => "$FindBin::Bin/../etc/$script.conf",
90 logpath => '/var/local/log',
97 open my $patterns, '<', $opts{conf}
98 or $log->err("Unable to open $opts{conf} - $!", 1);
100 while (<$patterns>) {
101 next if /^\s*#/; # Skip comments
114 my ($name, $event, $change) = @_;
116 opendir my $dir, $opts{tmp}
117 or $log->err("Unable to open $opts{tmp} - $!", 1);
119 while (my $createdFile = readdir $dir) {
120 next if $createdFile =~ /^\./; # Skip all hidden files
122 for my $pattern (loadConfig) {
123 debug "Processing pattern $pattern";
125 if ($createdFile =~ /$pattern/) {
126 debug "Matched $createdFile to $pattern";
128 if (-d "$opts{tmp}/$createdFile") {
129 remove_tree ("$opts{tmp}/$createdFile", {error => \my $err});
132 for my $diag (@$err) {
133 my ($file, $message) = %$diag;
136 $log->err("General error: $message");
138 $log->err("Unable to delete $file: $message");
142 $log->msg("$opts{tmp}/$createdFile removed");
145 unless (unlink "$opts{tmp}/$createdFile") {
146 $log->err("Unable to remove $opts{tmp}/$createdFile - $!");
148 $log->msg("$opts{tmp}/$createdFile removed");
160 $SIG{USR1} = \&FileCreated;
178 path => $opts{logpath},
180 append => $opts{append},
183 $log->msg("Starting $FindBin::Script");
185 # First run through whatever junk is in /tmp
186 for (glob "$opts{tmp}/*") {
190 my $monitor = File::Monitor->new;
195 callback => {files_created => \&FileCreated}
198 set_debug if $DB::OUT;
201 # Perl complains if we reference $DB::OUT only once
203 EnterDaemonMode unless defined $DB::OUT or get_debug;