| 1 | package Gruntmaster::Daemon::Base; |
| 2 | |
| 3 | use 5.014000; |
| 4 | use strict; |
| 5 | use warnings; |
| 6 | use parent qw/Exporter/; |
| 7 | our @EXPORT_OK = qw/watch/; |
| 8 | our $VERSION = '0.001'; |
| 9 | |
| 10 | use Fcntl qw/:flock/; |
| 11 | use Linux::Inotify2; |
| 12 | use Log::Log4perl qw/get_logger/; |
| 13 | |
| 14 | ################################################## |
| 15 | |
| 16 | sub process{ |
| 17 | my ($name, $dir, $cb) = @_; |
| 18 | my $logger = get_logger; |
| 19 | $logger->debug("Taking job $name..."); |
| 20 | open my $file, ">>$dir/$name/meta.yml"; |
| 21 | if (flock my $file, LOCK_EX|LOCK_NB){ |
| 22 | $logger->debug("Successfully taken job $name, executing callback"); |
| 23 | $cb->("$dir/$name"); |
| 24 | } else { |
| 25 | $logger->debug("Job $name already taken"); |
| 26 | } |
| 27 | close $file; |
| 28 | } |
| 29 | |
| 30 | sub watch{ |
| 31 | my ($dir, $cb) = @_; |
| 32 | for (<$dir/*>) { |
| 33 | s,$dir/,,; |
| 34 | process $_, $dir, $cb; |
| 35 | } |
| 36 | |
| 37 | my $logger = Log::Log4perl->get_logger(__PACKAGE__); |
| 38 | my $inotify = Linux::Inotify2->new or $logger->logdie("Unable to create Linux::Inotify2 object: $!"); |
| 39 | $inotify->watch($dir, IN_MOVED_TO, sub { process $_[0]->name, $dir, $cb }) or $logger->logdie("Error watching $dir: $!"); |
| 40 | 1 while $inotify->poll; |
| 41 | $logger->logdie("Inotify polling stopped: $!"); |
| 42 | } |
| 43 | |
| 44 | 1 |