The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

no warnings;
################################################################################
sub offline_script_log_signature () {
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime (time);
$year += 1900;
$mon ++;
return sprintf "[%04d-%02d-%02d %02d:%02d:%02d $$ $0] ", $year, $mon, $mday, $hour, $min, $sec;
}
################################################################################
sub lock_file_name () {
my $fn = File::Spec -> rel2abs ($0);
$fn = readlink $fn while -l $fn;
$fn =~ y{\\/.\: }{___};
return $^O eq 'MSWin32' ? "C:/$fn.lock" : "/var/run/$fn.lock";
}
################################################################################
sub initialize_offline_script_execution () {
warn offline_script_log_signature . " starting...\n";
eval 'require LockFile::Simple';
if ($LockFile::Simple::VERSION) {
our $LOCK_MANAGER = LockFile::Simple -> make (
-autoclean => 1,
-stale => 1,
);
my $fn = lock_file_name;
unless ($LOCK_MANAGER -> trylock ($fn)) {
warn offline_script_log_signature . "Can't acquire a lock $fn. Quit.\n";
exit;
}
}
}
################################################################################
sub finalize_offline_script_execution () {
if ($LOCK_MANAGER) {
$LOCK_MANAGER -> unlock (lock_file_name);
}
warn offline_script_log_signature . " finished.\n";
}
################################################################################
sub config_file () {
my $fn = File::Spec -> rel2abs ($0);
$fn = readlink $fn while -l $fn;
$fn =~ y{\\}{/};
$fn =~ s{/lib/.*}{/conf/httpd.conf};
return $fn;
}
################################################################################
sub perl_section_from ($) {
my ($fn) = @_;
my $code = '';
my $flag = 0;
open (CONF, $fn) or die ("Can't open $fn:$!\n");
while (<CONF>) {
if (/<[Pp]erl\s*>/) { $flag = 1 }
elsif (/<\/[Pp]erl\s*>/) { $flag = 0 }
elsif ($flag) { $code .= $_ }
}
close (CONF);
return $code;
}
################################################################################
sub the_rest_of_the_script () {
my @code = ();
my $flag = 0;
open (SCRIPT, $0);
while (<SCRIPT>) {
if (/use\s+Eludia::Offline/) { $flag = 1 }
else { $code [$flag] .= $_ }
}
close (SCRIPT);
return $code [1] || $code [0];
}
################################################################################
BEGIN {
$| = 1;
initialize_offline_script_execution;
eval perl_section_from config_file;
my $package = __PACKAGE__;
$package = $Eludia::last_loaded_package if $package eq 'main';
my $code = qq {
package $package;
\$_REQUEST {__skin} = 'STDERR';
sql_reconnect ();
require_model ();
no warnings;
} . the_rest_of_the_script;
eval $code; die $@ if $@;
finalize_offline_script_execution;
exit;
}
1;