App-MultiModule
view release on metacpan or search on metacpan
lib/App/MultiModule/API.pm view on Meta::CPAN
package App::MultiModule::API;
$App::MultiModule::API::VERSION = '1.171870';
use strict;use warnings;
use Data::Dumper;
use Sereal::Encoder qw(encode_sereal);
use Sereal::Decoder qw(looks_like_sereal decode_sereal);
=head2 new
Constructor
=over 4
=item state
Directory path where various run-time files are kept. Defaults to state/.
=back
=cut
sub new {
my $class = shift;
my %args = @_;
my $debug = $args{debug};
$debug = 5 unless defined $debug;
$args{state_dir} = 'state' unless $args{state_dir};
my $self = {
state_dir => $args{state_dir},
};
bless ($self, $class);
return $self;
}
=head1 METHODS
=cut
sub _read_file {
my $self = shift;
my $filename = shift;
my %args = @_;
return undef unless my $state_dir = $self->{state_dir};
mkdir $state_dir unless -e $state_dir;
return undef unless -r "$state_dir/$filename";
my $ret;
eval {
my $f;
die "passed state_dir $state_dir not writable"
unless -w $state_dir;
die "passed state_dir $state_dir not a directory"
unless -d $state_dir;
my $file_path = "$state_dir/$filename";
open my $fh, '<', $file_path or die "failed to open $file_path for reading: $!";
while(<$fh>) {
$f .= $_;
}
close $fh or die "failed to close $file_path: $!";
if(looks_like_sereal($f)) {
$ret = decode_sereal $f or die 'returned false';
} else {
$ret = do $file_path or die "failed to deserialize $file_path: $@";
}
};
die "App::MultiModule::API::_read_file failed: $@\n" if $@;
return $ret;
}
sub _write_file {
my $self = shift;
my $filename = shift;
my $contents = shift;
my %args = @_;
eval {
mkdir $self->{state_dir} unless -e $self->{state_dir};
open my $fh, '>', "$self->{state_dir}/$filename.tmp"
or die "open failed: $!\n";
# print $fh Data::Dumper::Dumper $contents or die "print failed: $!\n";
print $fh encode_sereal $contents or die "print failed: $!\n";
close $fh or die "close failed: $!\n";
rename "$self->{state_dir}/$filename.tmp","$self->{state_dir}/$filename" or die "rename failed: $!\n";
};
die "App::MultiModule::API::_write_file failed: $@\n" if $@;
}
sub _my_read_file {
my $path = shift;
open my $fh, '<', $path or die "failed to open $path: $!\n";
read $fh, my $ret, 1024000
or die "failed to read from $path: $!\n";
close $fh or die "failed to close $path: $!\n";
return $ret;
}
=head2 get_task_status($task_name)
Returns the saved status
Example:
status => {
'is_my_pid' => 0,
'is_running' => 1,
'save_ts' => 1370987265,
'task_count' => 1,
'fd_count' => 5,
'cmdline' => '/usr/bin/perlbin/MultiModule-qtqueue-pMultiModuleTest::-oalert:test_alert_queue,this:that-mOtherExternalModule',
'stat' => '3577 (MultiModule) S 1 13564 19489 34848 13564 4202496 3202 0 0 0 16 3 0 0 20 0 1 0 36033429 71139328 2949 18446744073709551615 4194304 4198756 140735555873936 140735555873176 139685157236755 0 0 4096 16384 18446744071580469929 0...
',
'pid' => 3577,
'statm' => '17368 2949 624 2 0 5133 0
},
=cut
sub get_task_status {
my $self = shift;
my $task_name = shift;
my %args = @_;
( run in 1.330 second using v1.01-cache-2.11-cpan-98e64b0badf )