From: Moritz Bunkus Date: Mon, 1 Nov 2010 10:49:02 +0000 (+0100) Subject: Daemon für Hintergrundjobs X-Git-Tag: release-2.6.3~61^2~7^2~1^2~2^2~112 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=149d2f33643bdc63bfd5577b36042dba43378adb;p=kivitendo-erp.git Daemon für Hintergrundjobs --- diff --git a/.gitignore b/.gitignore index 25b8d194c..dab9b1dad 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ tags crm /users/datev-export* /users/templates-cache/ +/users/pid/ +/config/task_server.conf diff --git a/SL/BackgroundJob/ALL.pm b/SL/BackgroundJob/ALL.pm new file mode 100644 index 000000000..acd6d6e5d --- /dev/null +++ b/SL/BackgroundJob/ALL.pm @@ -0,0 +1,7 @@ +package SL::BackgroundJob::ALL; + +use SL::BackgroundJob::Base; +use SL::BackgroundJob::CleanBackgroundJobHistory; + +1; + diff --git a/config/task_server.conf.default b/config/task_server.conf.default new file mode 100644 index 000000000..688b70221 --- /dev/null +++ b/config/task_server.conf.default @@ -0,0 +1,5 @@ +[task_server] +# User name to use for database access +login = +# Set to 1 for debug messages in /tmp/lx-office-debug.log +debug = 0 diff --git a/scripts/task_server.pl b/scripts/task_server.pl new file mode 100755 index 000000000..2519f2d81 --- /dev/null +++ b/scripts/task_server.pl @@ -0,0 +1,108 @@ +#!/usr/bin/perl + +use strict; + +BEGIN { + unshift @INC, "modules/override"; # Use our own versions of various modules (e.g. YAML). + push @INC, "modules/fallback"; # Only use our own versions of modules if there's no system version. +} + +use CGI qw( -no_xhtml); +use Config::Std; +use Cwd; +use Daemon::Generic; +use Data::Dumper; +use DateTime; +use English qw(-no_match_vars); +use SL::Auth; +use SL::DB::BackgroundJob; +use SL::BackgroundJob::ALL; +use SL::Form; +use SL::Helper::DateTime; +use SL::LXDebug; +use SL::Locale; + +my %config; + +# this is a cleaned up version of am.pl +# it lacks redirection, some html setup and most of the authentication process. +# it is assumed that anyone with physical access and execution rights on this script +# won't be hindered by authentication anyway. +sub lxinit { + my $login = $config{task_server}->{login}; + + package main; + + { no warnings 'once'; + $::userspath = "users"; + $::templates = "templates"; + $::sendmail = "| /usr/sbin/sendmail -t"; + } + + eval { require "config/lx-erp.conf"; 1; } or die $EVAL_ERROR; + eval { require "config/lx-erp-local.conf"; 1; } or die $EVAL_ERROR if -f "config/lx-erp-local.conf"; + + $::lxdebug = LXDebug->new; + $::locale = Locale->new($::language); + $::cgi = CGI->new qw(); + $::form = Form->new; + $::auth = SL::Auth->new; + + die 'cannot reach auth db' unless $::auth->session_tables_present; + + $::auth->restore_session; + + require "bin/mozilla/common.pl"; + + die "cannot find user $login" unless %::myconfig = $::auth->read_user($login); + die "cannot find locale for user $login" unless $::locale = Locale->new('de'); +} + +sub gd_preconfig { + my $self = shift; + + read_config $self->{configfile} => %config; + + die "Missing section [task_server] in config file" unless $config{task_server}; + die "Missing key 'login' in section [task_server] in config file" unless $config{task_server}->{login}; + + lxinit(); + + return (); +} + +sub gd_run { + while (1) { + my $ok = eval { + $::lxdebug->message(0, "Retrieving jobs") if $config{task_server}->{debug}; + + my $jobs = SL::DB::Manager::BackgroundJob->get_all_need_to_run; + + $::lxdebug->message(0, " Found: " . join(' ', map { $_->package_name } @{ $jobs })) if $config{task_server}->{debug} && @{ $jobs }; + + $_->run for @{ $jobs }; + + 1; + }; + + if ($config{task_server}->{debug}) { + $::lxdebug->message(0, "Exception during execution: ${EVAL_ERROR}") if !$ok; + $::lxdebug->message(0, "Sleeping"); + } + + my $seconds = 60 - (localtime)[0]; + sleep($seconds < 30 ? $seconds + 60 : $seconds); + } +} + +my $cwd = getcwd(); +my $pidbase = "${cwd}/users/pid"; + +mkdir($pidbase) if !-d $pidbase; + +newdaemon(configfile => "${cwd}/config/task_server.conf", + progname => 'lx-office-task-server', + pidbase => "${pidbase}/", + ); + +1;