Crypt-License
view release on metacpan or search on metacpan
Notice/Notice.pm view on Meta::CPAN
#!/usr/bin/perl
#
#use diagnostics;
package Crypt::License::Notice;
use vars qw($VERSION);
$VERSION = do { my @r = (q$Revision: 1.00 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
use strict;
######## DEFAULTS
my $sendmail_command = '/usr/lib/sendmail -t -oi';
my $tmp_dir = '/tmp';
my $intervals = '5d,30d,60d';
my $TO = 'license@bizsystems.com';
my %multx = (
'w' => 604800,
'd' => 86400,
'h' => 3600,
'm' => 60,
's' => 1,
);
##################
sub check($$\{}) {
my($self,$p) = @_;
return () unless
exists $p->{expires} && $p->{expires} &&
$p->{expires} !~ /[^\d]/ && $p->{expires} > 0 &&
exists $p->{path} && $p->{path} && (-r $p->{path});
$sendmail_command = $p->{ACTION} if exists $p->{ACTION};
$tmp_dir = $p->{TMPDIR} if exists $p->{TMPDIR};
$intervals = $p->{INTERVALS} if exists $p->{INTERVALS};
$TO = $p->{TO} if exists $p->{TO};
return () unless (-d $tmp_dir) && (-w $tmp_dir);
@_ = split(',',$intervals);
foreach(0..$#_) {
my $multx = 's';
$multx = chop $_[$_] if $_[$_] =~ /[wdhms]$/;
die "illegal character in interval $_[$_], " . __PACKAGE__
if $_[$_] =~ /[^\d]/;
$_[$_] *= $multx{$multx};
}
my $expiring;
my @intervals = sort {$b <=> $a;} @_;
foreach(@intervals) {
last if $_ < $p->{expires};
$expiring = $_;
}
if ( $expiring ) {
my $user = (getpwuid( (stat($p->{path}))[4] ))[0];
my $nf = "$tmp_dir/$user.bln"; # notice file
my $ctime = ( -e $nf ) ? (stat($nf))[10] : 0;
my $now = time;
if ( $ctime + $expiring < $now ) {
open(LIC,$p->{path}) or return (); # sorry, missing license
my $slurp = '';
while(<LIC>) {
next unless $slurp || $_ =~ /:\s*:/;
$slurp .= $_;
}
close LIC;
# now send the message
open ( MAIL, "|$sendmail_command" ) or return ();
select MAIL;
$| = 1;
select STDOUT;
print MAIL <<EOMxx12345;
From: $user
To: $TO
Subject: LICENSE EXPIRATION
$slurp
EOMxx12345
close MAIL;
open(N,">$nf.tmp") or return (); # should not get here
select N;
$| = 1;
select STDOUT;
print N "$p->{expires}\n";
close N;
rename "$nf.tmp", $nf;
}
}
return @intervals;
}
1;
__END__
=head1 NAME
Crypt::License::Notice -- perl extension for License
=head1 SYNOPSIS
require Crypt::License::Notice;
Crypt::License::Notice->check($input_hash)
=head1 DESCRIPTION
=over 4
=item Crypt::License::Notice->check($input_data_ptr)
$input_hash_ptr = { # optional parameters
'ACTION' => 'default /usr/lib/sendmail -t -oi',
'TMPDIR' => 'default /tmp',
'INTERVALS' => 'default 5d,30d,60d',
( run in 2.852 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )