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/);
81 usage => sub { pod2usage },
82 help => sub { pod2usage(-verbose => 2)},
83 verbose => sub { set_verbose },
84 debug => sub { set_debug },
86 tmp => File::Spec->tmpdir(),
87 conf => "$FindBin::Bin/../etc/$script.conf",
88 logpath => '/var/local/log',
95 open my $patterns, '<', $opts{conf}
96 or $log->err("Unable to open $opts{conf} - $!", 1);
99 next if /^\s*#/; # Skip comments
112 my ($name, $event, $change) = @_;
114 opendir my $dir, $opts{tmp}
115 or $log->err("Unable to open $opts{tmp} - $!", 1);
117 while (my $createdFile = readdir $dir) {
118 next if $createdFile =~ /^\./; # Skip all hidden files
120 for my $pattern (loadConfig) {
121 debug "Processing pattern $pattern";
123 if ($createdFile =~ /$pattern/) {
124 debug "Matched $createdFile to $pattern";
126 if (-d "$opts{tmp}/$createdFile") {
127 remove_tree ("$opts{tmp}/$createdFile", {error => \my $err});
130 for my $diag (@$err) {
131 my ($file, $message) = %$diag;
134 $log->err("General error: $message");
136 $log->err("Unable to delete $file: $message");
140 $log->msg("$opts{tmp}/$createdFile removed");
143 unless (unlink "$opts{tmp}/$createdFile") {
144 $log->err("Unable to remove $opts{tmp}/$createdFile - $!");
146 $log->msg("$opts{tmp}/$createdFile removed");
158 $SIG{USR1} = \&FileCreated;
176 path => $opts{logpath},
178 append => $opts{append},
181 $log->msg("Starting $FindBin::Script");
183 # First run through whatever junk is in /tmp
184 for (glob "$opts{tmp}/*") {
188 my $monitor = File::Monitor->new;
193 callback => {files_created => \&FileCreated}
196 set_debug if $DB::OUT;
199 # Perl complains if we reference $DB::OUT only once
201 EnterDaemonMode unless defined $DB::OUT or get_debug;