From: Moritz Bunkus Date: Tue, 15 Dec 2015 13:18:48 +0000 (+0100) Subject: Task-Server: Mandantenfähigkeit X-Git-Tag: release-3.4.1~511 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=c6dd542b51ae9549ad42a54f9023b905412bbab9;p=kivitendo-erp.git Task-Server: Mandantenfähigkeit --- diff --git a/SL/Controller/Admin.pm b/SL/Controller/Admin.pm index d0082b1e3..1c0f25e0c 100644 --- a/SL/Controller/Admin.pm +++ b/SL/Controller/Admin.pm @@ -6,6 +6,7 @@ use parent qw(SL::Controller::Base); use IO::Dir; use List::Util qw(first); +use List::UtilsBy qw(sort_by); use SL::Common (); use SL::DB::AuthUser; @@ -672,4 +673,12 @@ sub authenticate_root { return undef; } +sub is_user_used_for_task_server { + my ($self, $user) = @_; + + return undef if !$user; + return join ', ', sort_by { lc } map { $_->name } @{ SL::DB::Manager::AuthClient->get_all(where => [ task_server_user_id => $user->id ]) }; +} + + 1; diff --git a/SL/DB/MetaSetup/AuthClient.pm b/SL/DB/MetaSetup/AuthClient.pm index 5e9d59e04..4d88887e0 100644 --- a/SL/DB/MetaSetup/AuthClient.pm +++ b/SL/DB/MetaSetup/AuthClient.pm @@ -10,14 +10,15 @@ __PACKAGE__->meta->table('clients'); __PACKAGE__->meta->schema('auth'); __PACKAGE__->meta->columns( - dbhost => { type => 'text', not_null => 1 }, - dbname => { type => 'text', not_null => 1 }, - dbpasswd => { type => 'text', not_null => 1 }, - dbport => { type => 'integer', default => 5432, not_null => 1 }, - dbuser => { type => 'text', not_null => 1 }, - id => { type => 'serial', not_null => 1 }, - is_default => { type => 'boolean', default => 'false', not_null => 1 }, - name => { type => 'text', not_null => 1 }, + dbhost => { type => 'text', not_null => 1 }, + dbname => { type => 'text', not_null => 1 }, + dbpasswd => { type => 'text', not_null => 1 }, + dbport => { type => 'integer', default => 5432, not_null => 1 }, + dbuser => { type => 'text', not_null => 1 }, + id => { type => 'serial', not_null => 1 }, + is_default => { type => 'boolean', default => 'false', not_null => 1 }, + name => { type => 'text', not_null => 1 }, + task_server_user_id => { type => 'integer' }, ); __PACKAGE__->meta->primary_key_columns([ 'id' ]); @@ -27,5 +28,12 @@ __PACKAGE__->meta->unique_keys( [ 'name' ], ); +__PACKAGE__->meta->foreign_keys( + task_server_user => { + class => 'SL::DB::AuthUser', + key_columns => { task_server_user_id => 'id' }, + }, +); + 1; ; diff --git a/SL/DBConnect/Cache.pm b/SL/DBConnect/Cache.pm index 7e4633b69..c133e8a3d 100644 --- a/SL/DBConnect/Cache.pm +++ b/SL/DBConnect/Cache.pm @@ -43,6 +43,11 @@ sub clear { %cache = (); } +sub disconnect_all_and_clear { + $_->disconnect for values %cache; + %cache = (); +} + sub _args2str { my (@args) = @_; diff --git a/config/kivitendo.conf.default b/config/kivitendo.conf.default index 0ff2aa176..4242d65b1 100644 --- a/config/kivitendo.conf.default +++ b/config/kivitendo.conf.default @@ -146,12 +146,6 @@ openofficeorg_daemon = 1 openofficeorg_daemon_port = 2002 [task_server] -# kivitendo client (either its name or its database ID) for database -# access (both 'client' and 'login' are required) -client = -# kivitendo user (login) name to use for certain jobs (both 'client' -# and 'login' are required) -login = # Set to 1 for debug messages in /tmp/kivitendo-debug.log debug = 0 # Chose a system user the daemon should run under when started as root. diff --git a/doc/UPGRADE b/doc/UPGRADE index 29b436fc2..0a6310d34 100644 --- a/doc/UPGRADE +++ b/doc/UPGRADE @@ -14,6 +14,19 @@ Upgrade auf v????? aktualisiert. Für Benutzer der empfohlenen FastCGI Anbindung ändert sich nichts. +* Der Task-Server ist nun mandantenfähig. Für jeden Mandanten, für den + der Task-Server laufen soll, muss in der Administrationsoberfläche + in der Konfiguration des Mandanten hinterlegt werden, welchen + kivitendo-Benutzer der Task-Server nutzen soll. Ist bei einem + Mandanten kein Benutzer hinterlegt, so ignoriert der Task-Server + diesen Mandanten. + + Im Gegenzug wurden die beiden Konfigurations-Einstellungen »client« + und »login« aus dem Abschnitt [task_server] entfernt. Der + Task-Server prüft beim Starten allerdings, ob diese Einstellungen + noch existieren und verweigert den Start mit einer hilfreichen + Fehlermeldung, solange sie noch vorhanden sind. + Upgrade auf v3.3.0 ================== diff --git a/doc/dokumentation.xml b/doc/dokumentation.xml index 2570e8ee6..976d0b1e3 100644 --- a/doc/dokumentation.xml +++ b/doc/dokumentation.xml @@ -419,10 +419,8 @@ password = kivitendo bringt eine eigene Komponente zur zeitgesteuerten Ausführung bestimmter Aufgaben mit, den Taskserver. Er wird u.a. für Features wie die wiederkehrenden Rechnungen benötigt, erledigt aber auch andere erforderliche Aufgaben - und muss daher in Betrieb genommen werden. Der Taskserver benötigt zwei Konfigurationseinstellungen, die unter - [task_server] anzugeben sind: ein Mandant (entweder der Mandantenname oder eine Datenbank-ID, Variable - client), aus dem die Datenbankkonfiguration entnommen wird, sowie ein Login (Variable login) - eines Benutzers, der für gewisse Dinge wie die Rechnungserstellung als Verkäufer eingetragen wird. + und muss daher in Betrieb genommen werden. Seine Einrichtung wird im Abschnitt Task-Server + genauer beschrieben. Für Entwickler finden sich unter [debug] wichtige Funktionen, um die Fehlersuche zu erleichtern. @@ -789,6 +787,12 @@ Alias /url/for/kivitendo-erp-fcgid/ /path/to/kivitendo-erp/ + Der Task-Server muss einmalig global in der Konfigurationsdatei konfiguriert werden. Danach wird er für jeden Mandanten, für den + er laufen soll, in der Adminsitrationsmaske eingeschaltet. + + Beachten Sie, dass der Task-Server in den Boot-Vorgang Ihres Servers integriert werden muss, damit er automatisch gestartet + wird. Dies kann kivitendo nicht für Sie erledigen. + Verfügbare und notwendige Konfigurationsoptionen @@ -798,28 +802,6 @@ Alias /url/for/kivitendo-erp-fcgid/ /path/to/kivitendo-erp/ - - client - - - Name oder Datenbank-ID eines vorhandenen kivitendo-Mandanten, der benutzt wird, um die zu verwendende - Datenbankverbindung auszulesen. Der Mandant muss in der Administration angelegt werden. Diese Option muss angegeben - werden. - - Diese Option kam mit Release v3.x.0 hinzu und muss daher in Konfigurationen, die von älteren Versionen aktualisiert - wurden, ergänzt werden. - - - - - login - - - gültiger kivitendo-Benutzername, der z.B. als Verkäufer beim Erzeugen wiederkehrender Rechnungen benötigt wird. Der - Benutzer muss in der Administration angelegt werden. Diese Option muss angegeben werden. - - - run_as @@ -830,7 +812,7 @@ Alias /url/for/kivitendo-erp-fcgid/ /path/to/kivitendo-erp/). Daher - ist es sinnvoll, hier denselben Systembenutzer einzutragen, + ist es erforderlich, hier denselben Systembenutzer einzutragen, unter dem auch der Webserver läuft. @@ -845,6 +827,17 @@ Alias /url/for/kivitendo-erp-fcgid/ /path/to/kivitendo-erp/ + + Konfiguration der Mandanten für den Task-Server + + Ist der Task-Server grundlegend konfiguriert, so muss anschließend jeder Mandant, für den der Task-Server laufen soll, + einmalig konfiguriert werden. Dazu kann in der Maske zum Bearbeiten von Mandanten im Administrationsbereich eine + kivitendo-Benutzerkennung ausgewählt werden, unter der der Task-Server seine Arbeit verrichtet. + + Ist in dieser Einstellung keine Benutzerkennung ausgewählt, so wird der Task-Server für diesen Mandanten keine Aufgaben + ausführen. + + Automatisches Starten des Task-Servers beim Booten diff --git a/doc/html/ch01.html b/doc/html/ch01.html index 60cd5ddb8..270dd8a69 100644 --- a/doc/html/ch01.html +++ b/doc/html/ch01.html @@ -1,6 +1,6 @@ - Kapitel 1. Aktuelle Hinweise

Kapitel 1. Aktuelle Hinweise

Aktuelle Installations- und Konfigurationshinweise gibt es:

  • im Community-Forum: https://forum.kivitendo.org:32443 + Kapitel 1. Aktuelle Hinweise

    Kapitel 1. Aktuelle Hinweise

    Aktuelle Installations- und Konfigurationshinweise gibt es:

    \ No newline at end of file diff --git a/doc/html/ch02s04.html b/doc/html/ch02s04.html index 119870fe1..6487b02bd 100644 --- a/doc/html/ch02s04.html +++ b/doc/html/ch02s04.html @@ -61,10 +61,8 @@ password =

    Nutzt man wiederkehrende Rechnungen, kann man unter [periodic_invoices] den Login eines Benutzers angeben, der nach Erstellung der Rechnungen eine entsprechende E-Mail mit Informationen über die erstellten Rechnungen bekommt.

    kivitendo bringt eine eigene Komponente zur zeitgesteuerten Ausführung bestimmter Aufgaben mit, den Taskserver. Er wird u.a. für Features wie die wiederkehrenden Rechnungen benötigt, erledigt aber auch andere erforderliche Aufgaben - und muss daher in Betrieb genommen werden. Der Taskserver benötigt zwei Konfigurationseinstellungen, die unter - [task_server] anzugeben sind: ein Mandant (entweder der Mandantenname oder eine Datenbank-ID, Variable - client), aus dem die Datenbankkonfiguration entnommen wird, sowie ein Login (Variable login) - eines Benutzers, der für gewisse Dinge wie die Rechnungserstellung als Verkäufer eingetragen wird.

    Für Entwickler finden sich unter [debug] + und muss daher in Betrieb genommen werden. Seine Einrichtung wird im Abschnitt Task-Server + genauer beschrieben.

    Für Entwickler finden sich unter [debug] wichtige Funktionen, um die Fehlersuche zu erleichtern.

2.4.3. Versionen vor 2.6.3

In älteren kivitendo Versionen gab es im Verzeichnis config die Dateien authentication.pl und diff --git a/doc/html/ch02s06.html b/doc/html/ch02s06.html index 5f3334d71..47f29d80b 100644 --- a/doc/html/ch02s06.html +++ b/doc/html/ch02s06.html @@ -1,6 +1,6 @@ - 2.6. Webserver-Konfiguration

2.6. Webserver-Konfiguration

2.6.1. Grundkonfiguration mittels CGI

[Anmerkung]Anmerkung

Für einen deutlichen Performanceschub sorgt die Ausführung + 2.6. Webserver-Konfiguration

2.6. Webserver-Konfiguration

2.6.1. Grundkonfiguration mittels CGI

[Anmerkung]Anmerkung

Für einen deutlichen Performanceschub sorgt die Ausführung mittels FastCGI/FCGI. Die Einrichtung wird ausführlich im Abschnitt Konfiguration für FastCGI/FCGI beschrieben.

Der Zugriff auf das Programmverzeichnis muss in der Apache Webserverkonfigurationsdatei httpd.conf eingestellt @@ -105,7 +105,7 @@ AliasMatch ^/url/for/kivitendo-erp-fcgid/[^/]+\.pl /path/to/kivitendo-erp/dispat Alias /url/for/kivitendo-erp-fcgid/ /path/to/kivitendo-erp/

Dann ist unter /url/for/kivitendo-erp/ die normale Version erreichbar, und unter /url/for/kivitendo-erp-fcgid/ die - FastCGI-Version.

2.6.3. Weitergehende Konfiguration

Für einen deutlichen Sicherheitsmehrwert sorgt die Ausführung von kivitendo + FastCGI-Version.

2.6.3. Weitergehende Konfiguration

Für einen deutlichen Sicherheitsmehrwert sorgt die Ausführung von kivitendo nur über https-verschlüsselten Verbindungen, sowie weiteren Zusatzmassnahmen, wie beispielsweise Basic Authenticate. Die Konfigurationsmöglichkeiten sprengen allerdings den Rahmen dieser Anleitung, hier ein diff --git a/doc/html/ch02s07.html b/doc/html/ch02s07.html index 35a8228cd..d3c8e1266 100644 --- a/doc/html/ch02s07.html +++ b/doc/html/ch02s07.html @@ -2,34 +2,31 @@ 2.7. Der Task-Server

2.7. Der Task-Server

Der Task-Server ist ein Prozess, der im Hintergrund läuft, in regelmäßigen Abständen nach abzuarbeitenden Aufgaben sucht und diese zu festgelegten Zeitpunkten abarbeitet (ähnlich wie Cron). Dieser Prozess wird u.a. für die Erzeugung der wiederkehrenden - Rechnungen und weitere essenzielle Aufgaben benutzt.

2.7.1. Verfügbare und notwendige Konfigurationsoptionen

Die Konfiguration erfolgt über den Abschnitt + Rechnungen und weitere essenzielle Aufgaben benutzt.

Der Task-Server muss einmalig global in der Konfigurationsdatei konfiguriert werden. Danach wird er für jeden Mandanten, für den + er laufen soll, in der Adminsitrationsmaske eingeschaltet.

Beachten Sie, dass der Task-Server in den Boot-Vorgang Ihres Servers integriert werden muss, damit er automatisch gestartet + wird. Dies kann kivitendo nicht für Sie erledigen.

2.7.1. Verfügbare und notwendige Konfigurationsoptionen

Die Konfiguration erfolgt über den Abschnitt [task_server] in der Datei config/kivitendo.conf. Die dort verfügbaren Optionen sind:

- client -

Name oder Datenbank-ID eines vorhandenen kivitendo-Mandanten, der benutzt wird, um die zu verwendende - Datenbankverbindung auszulesen. Der Mandant muss in der Administration angelegt werden. Diese Option muss angegeben - werden.

Diese Option kam mit Release v3.x.0 hinzu und muss daher in Konfigurationen, die von älteren Versionen aktualisiert - wurden, ergänzt werden.

- login -

gültiger kivitendo-Benutzername, der z.B. als Verkäufer beim Erzeugen wiederkehrender Rechnungen benötigt wird. Der - Benutzer muss in der Administration angelegt werden. Diese Option muss angegeben werden.

run_as

Wird der Server vom Systembenutzer root gestartet, so wechselt er auf den mit run_as angegebenen Systembenutzer. Der Systembenutzer muss dieselben Lese- und Schreibrechte haben, wie auch der Webserverbenutzer (siehe see Manuelle Installation des Programmpaketes). Daher - ist es sinnvoll, hier denselben Systembenutzer einzutragen, + ist es erforderlich, hier denselben Systembenutzer einzutragen, unter dem auch der Webserver läuft.

debug -

Schaltet Debug-Informationen an und aus.

2.7.2. Automatisches Starten des Task-Servers beim Booten

Der Task-Server verhält sich von seinen Optionen her wie ein +

Schaltet Debug-Informationen an und aus.

2.7.2. Konfiguration der Mandanten für den Task-Server

Ist der Task-Server grundlegend konfiguriert, so muss anschließend jeder Mandant, für den der Task-Server laufen soll, + einmalig konfiguriert werden. Dazu kann in der Maske zum Bearbeiten von Mandanten im Administrationsbereich eine + kivitendo-Benutzerkennung ausgewählt werden, unter der der Task-Server seine Arbeit verrichtet.

Ist in dieser Einstellung keine Benutzerkennung ausgewählt, so wird der Task-Server für diesen Mandanten keine Aufgaben + ausführen.

2.7.3. Automatisches Starten des Task-Servers beim Booten

Der Task-Server verhält sich von seinen Optionen her wie ein reguläres SystemV-kompatibles Boot-Script. Außerdem wechselt er beim Starten automatisch in das kivitendo-Installationsverzeichnis.

Deshalb ist es möglich, ihn durch Setzen eines symbolischen Links aus einem der Runlevel-Verzeichnisse heraus in den Boot-Prozess einzubinden. Da das bei neueren Linux-Distributionen aber nicht zwangsläufig funktioniert, werden auch Start-Scripte mitgeliefert, die - anstelle eines symbolischen Links verwendet werden können.

2.7.2.1. SystemV-basierende Systeme (z.B. Debian, ältere OpenSUSE, ältere Fedora Core)

Kopieren Sie die Datei + anstelle eines symbolischen Links verwendet werden können.

2.7.3.1. SystemV-basierende Systeme (z.B. Debian, ältere OpenSUSE, ältere Fedora Core)

Kopieren Sie die Datei scripts/boot/system-v/kivitendo-task-server nach /etc/init.d/kivitendo-task-server. Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile @@ -37,17 +34,17 @@ Boot-Prozess ein. Dies ist distributionsabhängig:

  • Debian-basierende Systeme:

    update-rc.d kivitendo-task-server defaults
     # Nur bei Debian Squeeze und neuer:
     insserv kivitendo-task-server
  • Ältere OpenSUSE und ältere Fedora Core:

    chkconfig --add kivitendo-task-server

Danach kann der Task-Server mit dem folgenden Befehl gestartet - werden:

/etc/init.d/kivitendo-task-server start

2.7.2.2. Upstart-basierende Systeme (z.B. Ubuntu)

Kopieren Sie die Datei + werden:

/etc/init.d/kivitendo-task-server start

2.7.3.2. Upstart-basierende Systeme (z.B. Ubuntu)

Kopieren Sie die Datei scripts/boot/upstart/kivitendo-task-server.conf nach /etc/init/kivitendo-task-server.conf. Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile exec ....).

Danach kann der Task-Server mit dem folgenden Befehl gestartet - werden:

service kivitendo-task-server start

2.7.2.3. systemd-basierende Systeme (z.B. neure OpenSUSE, neuere Fedora Core)

Verlinken Sie die Datei scripts/boot/systemd/kivitendo-task-server.service nach + werden:

service kivitendo-task-server start

2.7.3.3. systemd-basierende Systeme (z.B. neure OpenSUSE, neuere Fedora Core)

Verlinken Sie die Datei scripts/boot/systemd/kivitendo-task-server.service nach /etc/systemd/system/. Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile ExecStart=.... und ExecStop=...). Binden Sie das Script in den Boot-Prozess ein.

Alle hierzu benötigten Befehle sehen so aus:

cd /var/www/kivitendo-erp/scripts/boot/systemd
 ln -s $(pwd)/kivitendo-task-server.service /etc/systemd/system/

Danach kann der Task-Server mit dem folgenden Befehl gestartet - werden:

systemctl start kivitendo-task-server.service

2.7.3. Wie der Task-Server gestartet und beendet wird

Der Task-Server wird wie folgt kontrolliert:

./scripts/task_server.pl Befehl

+ werden:

systemctl start kivitendo-task-server.service

2.7.4. Wie der Task-Server gestartet und beendet wird

Der Task-Server wird wie folgt kontrolliert:

./scripts/task_server.pl Befehl

Befehl ist dabei eine der folgenden Optionen:

  • start startet eine neue Instanz des @@ -60,7 +57,7 @@ ln -s $(pwd)/kivitendo-task-server.service /etc/systemd/system/

    Danach k status berichtet, ob der Task-Server läuft.

Der Task-Server wechselt beim Starten automatisch in das kivitendo-Installationsverzeichnis.

Dieselben Optionen können auch für die SystemV-basierenden - Runlevel-Scripte benutzt werden (siehe oben).

2.7.4. Task-Server mit mehreren Mandanten

Beim Task-Server werden der zu verwendende Mandant und Login-Name des Benutzers, unter dem der Task-Server laufen soll, in die + Runlevel-Scripte benutzt werden (siehe oben).

2.7.5. Task-Server mit mehreren Mandanten

Beim Task-Server werden der zu verwendende Mandant und Login-Name des Benutzers, unter dem der Task-Server laufen soll, in die Konfigurationsdatei geschrieben. Hat man mehrere Mandanten, muss man auch mehrere Konfigurationsdateien anlegen.

Die Konfigurationsdatei ist eine Kopie der Datei kivitendo.conf, wo in der Kategorie [task_server] die gewünschten Werte für client und login eingetragen werden.

Der alternative Task-Server wird dann mit folgendem Befehl gestartet:

./scripts/task_server.pl -c config/DATEINAME.conf
\ No newline at end of file diff --git a/doc/html/ch02s08.html b/doc/html/ch02s08.html index e62e24de3..a797c78b6 100644 --- a/doc/html/ch02s08.html +++ b/doc/html/ch02s08.html @@ -43,7 +43,7 @@ [authentication].

Sollen die Benutzerpasswörter in der Authentifizierungsdatenbank gespeichert werden, so muss der Parameter module den Wert DB enthalten. In diesem Fall können sowohl - der Administrator als auch die Benutzer selber ihre Psaswörter in + der Administrator als auch die Benutzer selber ihre Passwörter in kivitendo ändern.

Soll hingegen ein externer LDAP- oder Active-Directory-Server benutzt werden, so muss der Parameter module auf LDAP gesetzt werden. In diesem Fall müssen diff --git a/doc/html/ch03s03.html b/doc/html/ch03s03.html index d1274f478..356eded7a 100644 --- a/doc/html/ch03s03.html +++ b/doc/html/ch03s03.html @@ -121,7 +121,7 @@ template_meta.language.description

Beschreibung der verwendeten Sprache

template_meta.language.template_code -

Vorlagenürzel der verwendeten Sprache, identisch mit dem +

Vorlagenkürzel der verwendeten Sprache, identisch mit dem Kürzel das im Dateinamen verwendetet wird.

template_meta.language.output_numberformat

Zahlenformat der verwendeten Sprache in der Form @@ -574,7 +574,7 @@ invdate

Rechnungsdatum

invnumber -

Rechnungsnummer

3.3.10. Variablen in anderen Vorlagen

3.3.10.1. Einführung

Die Variablen in anderen Vorlagen sind ähnlich wie in der +

Rechnungsnummer

3.3.10. Variablen in anderen Vorlagen

3.3.10.1. Einführung

Die Variablen in anderen Vorlagen sind ähnlich wie in der Rechnung. Allerdings heißen die Variablen, die mit inv beginnen, jetzt anders. Bei den Angeboten fangen sie mit quo für "quotation" an: diff --git a/doc/html/ch04.html b/doc/html/ch04.html index 6df5000c2..5dbb3ffb4 100644 --- a/doc/html/ch04.html +++ b/doc/html/ch04.html @@ -1,6 +1,6 @@ - Kapitel 4. Entwicklerdokumentation

Kapitel 4. Entwicklerdokumentation

4.1. Globale Variablen

4.1.1. Wie sehen globale Variablen in Perl aus?

Globale Variablen liegen in einem speziellen namespace namens + Kapitel 4. Entwicklerdokumentation

Kapitel 4. Entwicklerdokumentation

4.1. Globale Variablen

4.1.1. Wie sehen globale Variablen in Perl aus?

Globale Variablen liegen in einem speziellen namespace namens "main", der von überall erreichbar ist. Darüber hinaus sind bareword globs global und die meisten speziellen Variablen sind... speziell.

Daraus ergeben sich folgende Formen:

@@ -25,7 +25,7 @@ $PACKAGE::form.

local $form

Alle Änderungen an $form werden am Ende - des scopes zurückgesetzt

4.1.2. Warum sind globale Variablen ein Problem?

Das erste Problem ist FCGI™.

+ des scopes zurückgesetzt

4.1.2. Warum sind globale Variablen ein Problem?

Das erste Problem ist FCGI™.

SQL-Ledger™ hat fast alles im globalen namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist. Unter FCGI™ müssen diese Sachen aber wieder @@ -39,7 +39,7 @@ dies hat, seit der Einführung, u.a. schon so manche langwierige Bug-Suche verkürzt. Da globale Variablen aber implizit mit Package angegeben werden, werden die nicht geprüft, und somit kann sich - schnell ein Tippfehler einschleichen.

4.1.3. Kanonische globale Variablen

Um dieses Problem im Griff zu halten gibt es einige wenige + schnell ein Tippfehler einschleichen.

4.1.3. Kanonische globale Variablen

Um dieses Problem im Griff zu halten gibt es einige wenige globale Variablen, die kanonisch sind, d.h. sie haben bestimmte vorgegebenen Eigenschaften, und alles andere sollte anderweitig umhergereicht werden.

Diese Variablen sind im Moment die folgenden neun:

  • @@ -62,7 +62,7 @@ $::request

Damit diese nicht erneut als Müllhalde missbraucht werden, im Folgenden eine kurze Erläuterung der bestimmten vorgegebenen - Eigenschaften (Konventionen):

4.1.3.1. $::form

  • Ist ein Objekt der Klasse + Eigenschaften (Konventionen):

    4.1.3.1. $::form

    • Ist ein Objekt der Klasse "Form"

    • Wird nach jedem Request gelöscht

    • Muss auch in Tests und Konsolenscripts vorhanden sein.

    • Enthält am Anfang eines Requests die Requestparameter vom User

    • Kann zwar intern über Requestgrenzen ein Datenbankhandle @@ -110,7 +110,7 @@ push @{ $form->{TEMPLATE_ARRAYS}{number} }, $form->{"partnumber_$i"}; push @{ $form->{TEMPLATE_ARRAYS}{description} }, $form->{"description_$i"}; # ... -}

    4.1.3.2. %::myconfig

    • Das einzige Hash unter den globalen Variablen

    • Wird spätestens benötigt wenn auf die Datenbank +}

    4.1.3.2. %::myconfig

    • Das einzige Hash unter den globalen Variablen

    • Wird spätestens benötigt wenn auf die Datenbank zugegriffen wird

    • Wird bei jedem Request neu erstellt.

    • Enthält die Userdaten des aktuellen Logins

    • Sollte nicht ohne Filterung irgendwo gedumpt werden oder extern serialisiert werden, weil da auch der Datenbankzugriff für diesen user drinsteht.

    • Enthält unter anderem Listenbegrenzung vclimit, @@ -122,10 +122,10 @@ überwiegend die Daten, die sich unter Programm -> Einstellungen befinden, bzw. die Informationen über den Benutzer die über die - Administrator-Schnittstelle eingegeben wurden.

    4.1.3.3. $::locale

    • Objekt der Klasse "Locale"

    • Wird pro Request erstellt

    • Muss auch für Tests und Scripte immer verfügbar + Administrator-Schnittstelle eingegeben wurden.

    4.1.3.3. $::locale

    • Objekt der Klasse "Locale"

    • Wird pro Request erstellt

    • Muss auch für Tests und Scripte immer verfügbar sein.

    • Cached intern über Requestgrenzen hinweg benutzte Locales

    Lokalisierung für den aktuellen User. Alle Übersetzungen, - Zahlen- und Datumsformatierungen laufen über dieses Objekt.

    4.1.3.4. $::lxdebug

    • Objekt der Klasse "LXDebug"

    • Wird global gecached

    • Muss immer verfügbar sein, in nahezu allen + Zahlen- und Datumsformatierungen laufen über dieses Objekt.

    4.1.3.4. $::lxdebug

    • Objekt der Klasse "LXDebug"

    • Wird global gecached

    • Muss immer verfügbar sein, in nahezu allen Funktionen

    $::lxdebug stellt Debuggingfunktionen bereit, wie "enter_sub" und @@ -135,14 +135,14 @@ "message" und "dump" mit denen man flott Informationen ins Log (tmp/kivitendo-debug.log) packen kann.

    Beispielsweise so:

    $main::lxdebug->message(0, 'Meine Konfig:' . Dumper (%::myconfig));
    -$main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{vc});

    4.1.3.5. $::auth

    • Objekt der Klasse "SL::Auth"

    • Wird global gecached

    • Hat eine permanente DB Verbindung zur Authdatenbank

    • Wird nach jedem Request resettet.

    +$main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{vc});

    4.1.3.5. $::auth

    • Objekt der Klasse "SL::Auth"

    • Wird global gecached

    • Hat eine permanente DB Verbindung zur Authdatenbank

    • Wird nach jedem Request resettet.

    $::auth stellt Funktionen bereit um die Rechte des aktuellen Users abzufragen. Obwohl diese Informationen vom aktuellen User abhängen wird das Objekt aus Geschwindigkeitsgründen nur einmal angelegt und dann nach jedem Request kurz resettet.

    Dieses Objekt kapselt auch den gerade aktiven Mandanten. Dessen Einstellungen können über $::auth->client abgefragt werden; Rückgabewert ist ein Hash mit den Werten aus der Tabelle - auth.clients.

    4.1.3.6. $::lx_office_conf

    • Objekt der Klasse + auth.clients.

    4.1.3.6. $::lx_office_conf

    • Objekt der Klasse "SL::LxOfficeConf"

    • Global gecached

    • Repräsentation der config/kivitendo.conf[.default]-Dateien

    Globale Konfiguration. Configdateien werden zum Start gelesen und danach nicht mehr angefasst. Es ist derzeit nicht geplant, dass @@ -152,16 +152,16 @@ $main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{ file_name = /tmp/kivitendo-debug.log

    ist der Key file im Programm als $::lx_office_conf->{debug}{file} erreichbar.

    [Warnung]Warnung

    Zugriff auf die Konfiguration erfolgt im Moment über - Hashkeys, sind also nicht gegen Tippfehler abgesichert.

    4.1.3.7. $::instance_conf

    • Objekt der Klasse + Hashkeys, sind also nicht gegen Tippfehler abgesichert.

4.1.3.7. $::instance_conf

  • Objekt der Klasse "SL::InstanceConfiguration"

  • wird pro Request neu erstellt

Funktioniert wie $::lx_office_conf, speichert aber Daten die von der Instanz abhängig sind. Eine Instanz ist hier eine Mandantendatenbank. Beispielsweise überprüft

$::instance_conf->get_inventory_system eq 'perpetual'

- ob die berüchtigte Bestandsmethode zur Anwendung kommt.

4.1.3.8. $::dispatcher

  • Objekt der Klasse + ob die berüchtigte Bestandsmethode zur Anwendung kommt.

4.1.3.8. $::dispatcher

  • Objekt der Klasse "SL::Dispatcher"

  • wird pro Serverprozess erstellt.

  • enthält Informationen über die technische Verbindung zum Server

Der dritte Punkt ist auch der einzige Grund warum das Objekt global gespeichert wird. Wird vermutlich irgendwann in einem anderen - Objekt untergebracht.

4.1.3.9. $::request

  • Hashref (evtl später Objekt)

  • Wird pro Request neu initialisiert.

  • Keine Unterstruktur garantiert.

+ Objekt untergebracht.

4.1.3.9. $::request

  • Hashref (evtl später Objekt)

  • Wird pro Request neu initialisiert.

  • Keine Unterstruktur garantiert.

$::request ist ein generischer Platz um Daten "für den aktuellen Request" abzulegen. Sollte nicht für action at a distance benutzt werden, sondern um lokales memoizing zu @@ -174,20 +174,20 @@ file_name = /tmp/kivitendo-debug.log

ist der Key f $::request

  • Muss ich von anderen Teilen des Programms lesend drauf zugreifen? Dann $::request, aber Zugriff über - Wrappermethode

  • 4.1.4. Ehemalige globale Variablen

    Die folgenden Variablen waren einmal im Programm, und wurden - entfernt.

    4.1.4.1. $::cgi

    • war nötig, weil cookie Methoden nicht als + Wrappermethode

    4.1.4. Ehemalige globale Variablen

    Die folgenden Variablen waren einmal im Programm, und wurden + entfernt.

    4.1.4.1. $::cgi

    • war nötig, weil cookie Methoden nicht als Klassenfunktionen funktionieren

    • Aufruf als Klasse erzeugt Dummyobjekt was im Klassennamespace gehalten wird und über Requestgrenzen leaked

    • liegt jetzt unter $::request->{cgi} -

    4.1.4.2. $::all_units

    • war nötig, weil einige Funktionen in Schleifen zum Teil +

    4.1.4.2. $::all_units

    • war nötig, weil einige Funktionen in Schleifen zum Teil ein paar hundert mal pro Request eine Liste der Einheiten brauchen, und de als Parameter durch einen Riesenstack von Funktionen geschleift werden müssten.

    • Liegt jetzt unter $::request->{cache}{all_units}

    • Wird nur in AM->retrieve_all_units() gesetzt oder - gelesen.

    4.1.4.3. %::called_subs

    • wurde benutzt um callsub deep recursions + gelesen.

    4.1.4.3. %::called_subs

    • wurde benutzt um callsub deep recursions abzufangen.

    • Wurde entfernt, weil callsub nur einen Bruchteil der möglichen Rekursioenen darstellt, und da nie welche auftreten.

    • komplette recursion protection wurde entfernt.

    \ No newline at end of file diff --git a/doc/html/index.html b/doc/html/index.html index b6d658d2b..b37a9d543 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -1,9 +1,9 @@ - kivitendo 3.3.0: Installation, Konfiguration, Entwicklung

    kivitendo 3.3.0: Installation, Konfiguration, Entwicklung


    Inhaltsverzeichnis

    1. Aktuelle Hinweise
    2. Installation und Grundkonfiguration
    2.1. Übersicht
    2.2. Benötigte Software und Pakete
    2.2.1. Betriebssystem
    2.2.2. Benötigte Perl-Pakete installieren
    2.3. Manuelle Installation des Programmpaketes
    2.4. kivitendo-Konfigurationsdatei
    2.4.1. Einführung
    2.4.2. Abschnitte und Parameter
    2.4.3. Versionen vor 2.6.3
    2.5. Anpassung der PostgreSQL-Konfiguration
    2.5.1. Zeichensätze/die Verwendung von Unicode/UTF-8
    2.5.2. Änderungen an Konfigurationsdateien
    2.5.3. Erweiterung für servergespeicherte Prozeduren
    2.5.4. Datenbankbenutzer anlegen
    2.6. Webserver-Konfiguration
    2.6.1. Grundkonfiguration mittels CGI
    2.6.2. Konfiguration für FastCGI/FCGI
    2.6.3. Weitergehende Konfiguration
    2.7. Der Task-Server
    2.7.1. Verfügbare und notwendige Konfigurationsoptionen
    2.7.2. Automatisches Starten des Task-Servers beim Booten
    2.7.3. Wie der Task-Server gestartet und beendet wird
    2.7.4. Task-Server mit mehreren Mandanten
    2.8. Benutzerauthentifizierung und Administratorpasswort
    2.8.1. Grundlagen zur Benutzerauthentifizierung
    2.8.2. Administratorpasswort
    2.8.3. Authentifizierungsdatenbank
    2.8.4. Passwortüberprüfung
    2.8.5. Name des Session-Cookies
    2.8.6. Anlegen der Authentifizierungsdatenbank
    2.9. Mandanten-, Benutzer- und Gruppenverwaltung
    2.9.1. Zusammenhänge
    2.9.2. Mandanten, Benutzer und Gruppen
    2.9.3. Datenbanken anlegen
    2.9.4. Gruppen anlegen
    2.9.5. Benutzer anlegen
    2.9.6. Mandanten anlegen
    2.10. Drucker- und Systemverwaltung
    2.10.1. Druckeradministration
    2.10.2. System sperren / entsperren
    2.11. E-Mail-Versand aus kivitendo heraus
    2.11.1. Versand über lokalen E-Mail-Server
    2.11.2. Versand über einen SMTP-Server
    2.12. Drucken mit kivitendo
    2.12.1. Vorlagenverzeichnis anlegen
    2.12.2. Der Druckvorlagensatz RB
    2.12.3. f-tex
    2.12.4. Der Druckvorlagensatz rev-odt
    2.12.5. Allgemeine Hinweise zu LaTeX Vorlagen
    2.13. OpenDocument-Vorlagen
    2.14. Konfiguration zur Einnahmenüberschussrechnung/Bilanzierung: + kivitendo 3.3.0: Installation, Konfiguration, Entwicklung

    kivitendo 3.3.0: Installation, Konfiguration, Entwicklung


    Inhaltsverzeichnis

    1. Aktuelle Hinweise
    2. Installation und Grundkonfiguration
    2.1. Übersicht
    2.2. Benötigte Software und Pakete
    2.2.1. Betriebssystem
    2.2.2. Benötigte Perl-Pakete installieren
    2.3. Manuelle Installation des Programmpaketes
    2.4. kivitendo-Konfigurationsdatei
    2.4.1. Einführung
    2.4.2. Abschnitte und Parameter
    2.4.3. Versionen vor 2.6.3
    2.5. Anpassung der PostgreSQL-Konfiguration
    2.5.1. Zeichensätze/die Verwendung von Unicode/UTF-8
    2.5.2. Änderungen an Konfigurationsdateien
    2.5.3. Erweiterung für servergespeicherte Prozeduren
    2.5.4. Datenbankbenutzer anlegen
    2.6. Webserver-Konfiguration
    2.6.1. Grundkonfiguration mittels CGI
    2.6.2. Konfiguration für FastCGI/FCGI
    2.6.3. Weitergehende Konfiguration
    2.7. Der Task-Server
    2.7.1. Verfügbare und notwendige Konfigurationsoptionen
    2.7.2. Konfiguration der Mandanten für den Task-Server
    2.7.3. Automatisches Starten des Task-Servers beim Booten
    2.7.4. Wie der Task-Server gestartet und beendet wird
    2.7.5. Task-Server mit mehreren Mandanten
    2.8. Benutzerauthentifizierung und Administratorpasswort
    2.8.1. Grundlagen zur Benutzerauthentifizierung
    2.8.2. Administratorpasswort
    2.8.3. Authentifizierungsdatenbank
    2.8.4. Passwortüberprüfung
    2.8.5. Name des Session-Cookies
    2.8.6. Anlegen der Authentifizierungsdatenbank
    2.9. Mandanten-, Benutzer- und Gruppenverwaltung
    2.9.1. Zusammenhänge
    2.9.2. Mandanten, Benutzer und Gruppen
    2.9.3. Datenbanken anlegen
    2.9.4. Gruppen anlegen
    2.9.5. Benutzer anlegen
    2.9.6. Mandanten anlegen
    2.10. Drucker- und Systemverwaltung
    2.10.1. Druckeradministration
    2.10.2. System sperren / entsperren
    2.11. E-Mail-Versand aus kivitendo heraus
    2.11.1. Versand über lokalen E-Mail-Server
    2.11.2. Versand über einen SMTP-Server
    2.12. Drucken mit kivitendo
    2.12.1. Vorlagenverzeichnis anlegen
    2.12.2. Der Druckvorlagensatz RB
    2.12.3. f-tex
    2.12.4. Der Druckvorlagensatz rev-odt
    2.12.5. Allgemeine Hinweise zu LaTeX Vorlagen
    2.13. OpenDocument-Vorlagen
    2.14. Konfiguration zur Einnahmenüberschussrechnung/Bilanzierung: EUR
    2.14.1. Einführung
    2.14.2. Konfigurationsparameter
    2.14.3. Festlegen der Parameter
    2.14.4. Bemerkungen zur Bestandsmethode
    2.14.5. Bekannte Probleme
    2.15. SKR04 19% Umstellung für innergemeinschaftlichen Erwerb
    2.15.1. Einführung
    2.15.2. Konto 3804 manuell anlegen
    2.16. Verhalten des Bilanzberichts
    2.17. Einstellungen pro Mandant
    2.18. kivitendo ERP verwenden
    3. Features und Funktionen
    3.1. Wiederkehrende Rechnungen
    3.1.1. Einführung
    3.1.2. Konfiguration
    3.1.3. Spezielle Variablen
    3.1.4. Auflisten
    3.1.5. Erzeugung der eigentlichen Rechnungen
    3.1.6. Erste Rechnung für aktuellen Monat erstellen
    3.2. Bankerweiterung
    3.2.1. Einführung
    3.3. Dokumentenvorlagen und verfügbare Variablen
    3.3.1. Einführung
    3.3.2. Variablen ausgeben
    3.3.3. Verwendung in Druckbefehlen
    3.3.4. Anfang und Ende der Tags verändern
    3.3.5. Zuordnung von den Dateinamen zu den Funktionen
    3.3.6. Sprache, Drucker und E-Mail
    3.3.7. Allgemeine Variablen, die in allen Vorlagen vorhanden sind
    3.3.8. Variablen in Rechnungen
    3.3.9. Variablen in Mahnungen und Rechnungen über Mahngebühren
    3.3.10. Variablen in anderen Vorlagen
    3.3.11. Blöcke, bedingte Anweisungen und Schleifen
    3.3.12. Markup-Code zur Textformatierung innerhalb von - Formularen
    3.4. Excel-Vorlagen
    3.4.1. Zusammenfassung
    3.4.2. Bedienung
    3.4.3. Variablensyntax
    3.4.4. Einschränkungen
    3.5. Mandantenkonfiguration Lager
    4. Entwicklerdokumentation
    4.1. Globale Variablen
    4.1.1. Wie sehen globale Variablen in Perl aus?
    4.1.2. Warum sind globale Variablen ein Problem?
    4.1.3. Kanonische globale Variablen
    4.1.4. Ehemalige globale Variablen
    4.2. Entwicklung unter FastCGI
    4.2.1. Allgemeines
    4.2.2. Programmende und Ausnahmen
    4.2.3. Globale Variablen
    4.2.4. Performance und Statistiken
    4.3. SQL-Upgradedateien
    4.3.1. Einführung
    4.3.2. Format der Kontrollinformationen
    4.3.3. Format von in Perl geschriebenen Datenbankupgradescripten
    4.3.4. Hilfsscript dbupgrade2_tool.pl
    4.4. Translations and languages
    4.4.1. Introduction
    4.4.2. Character set
    4.4.3. File structure
    4.5. Die kivitendo-Test-Suite
    4.5.1. Einführung
    4.5.2. Voraussetzungen
    4.5.3. + Formularen
    3.4. Excel-Vorlagen
    3.4.1. Zusammenfassung
    3.4.2. Bedienung
    3.4.3. Variablensyntax
    3.4.4. Einschränkungen
    3.5. Mandantenkonfiguration Lager
    4. Entwicklerdokumentation
    4.1. Globale Variablen
    4.1.1. Wie sehen globale Variablen in Perl aus?
    4.1.2. Warum sind globale Variablen ein Problem?
    4.1.3. Kanonische globale Variablen
    4.1.4. Ehemalige globale Variablen
    4.2. Entwicklung unter FastCGI
    4.2.1. Allgemeines
    4.2.2. Programmende und Ausnahmen
    4.2.3. Globale Variablen
    4.2.4. Performance und Statistiken
    4.3. SQL-Upgradedateien
    4.3.1. Einführung
    4.3.2. Format der Kontrollinformationen
    4.3.3. Format von in Perl geschriebenen Datenbankupgradescripten
    4.3.4. Hilfsscript dbupgrade2_tool.pl
    4.4. Translations and languages
    4.4.1. Introduction
    4.4.2. Character set
    4.4.3. File structure
    4.5. Die kivitendo-Test-Suite
    4.5.1. Einführung
    4.5.2. Voraussetzungen
    4.5.3. Existierende Tests ausführen
    4.5.4. Bedeutung der verschiedenen Test-Scripte diff --git a/doc/kivitendo-Dokumentation.pdf b/doc/kivitendo-Dokumentation.pdf index 17030387d..b88013335 100644 Binary files a/doc/kivitendo-Dokumentation.pdf and b/doc/kivitendo-Dokumentation.pdf differ diff --git a/locale/de/all b/locale/de/all index ec754596e..8d194e6f9 100755 --- a/locale/de/all +++ b/locale/de/all @@ -915,6 +915,7 @@ $self->{texts} = { 'Do not check for duplicates' => 'Nicht nach Dubletten suchen', 'Do not link to a project.' => 'Nicht mit einem Projekt verknüpfen.', 'Do not modify this position' => 'Diese Position nicht verändern', + 'Do not run the task server for this client' => 'Task-Server nicht für diesen Mandanten ausführen', 'Do not set default buchungsgruppe' => 'Nie Standardbuchungsgruppe setzen', 'Do not set this bin' => 'Diesen Lagerplatz nicht setzen', 'Do not set this comment' => 'Diesen Kommentar nicht setzen', @@ -2261,6 +2262,7 @@ $self->{texts} = { 'Rule for vendor must not be empty' => 'Eine Lieferantenbedingung darf nicht leer sein', 'Run JavaScript unit tests' => 'JavaScript-Unit-Tests ausführen', 'Run at' => 'Ausgeführt um', + 'Run task server for this client with the following user' => 'Task-Server für diesen Mandanten mit der folgenden BenutzerIn ausführen', 'Run tests' => 'Tests ausführen', 'SAVED' => 'Gespeichert', 'SAVED FOR DUNNING' => 'Gespeichert', @@ -2893,6 +2895,7 @@ $self->{texts} = { 'The unit in row %d has been used in the meantime and cannot be changed anymore.' => 'Die Einheit in Zeile %d wurde in der Zwischenzeit benutzt und kann nicht mehr geändert werden.', 'The units have been saved.' => 'Die Einheiten wurden gespeichert.', 'The user can chose which client to connect to during login.' => 'Bei der Anmeldung kann der Benutzer auswählen, welchen Mandanten er benutzen möchte.', + 'The user cannot be deleted as it is used in the following clients: #1' => 'Die BenutzerIn kann nicht gelöscht werden, da sie für die folgenden Mandanten benötigt wird: #1', 'The user could not be deleted.' => 'Der Benutzer konnte nicht gelöscht werden.', 'The user group could not be deleted.' => 'Die Benutzergurppe konnte nicht gelöscht werden.', 'The user group has been created.' => 'Die Benutzergruppe wurde erstellt.', diff --git a/scripts/task_server.pl b/scripts/task_server.pl index 661c19a76..1bcb719c9 100755 --- a/scripts/task_server.pl +++ b/scripts/task_server.pl @@ -32,6 +32,7 @@ use File::Spec; use List::Util qw(first); use POSIX qw(setuid setgid); use SL::Auth; +use SL::DB::AuthClient; use SL::DB::BackgroundJob; use SL::BackgroundJob::ALL; use SL::Form; @@ -48,14 +49,17 @@ our %lx_office_conf; sub debug { return if !$lx_office_conf{task_server}->{debug}; - $::lxdebug->message(0, @_); + $::lxdebug->message(LXDebug::DEBUG1(), join(' ', "task server:", @_)); +} + +sub enabled_clients { + return SL::DB::Manager::AuthClient->get_all(where => [ '!task_server_user_id' => undef ]); } sub initialize_kivitendo { - chdir $exe_dir; + my ($client) = @_; - my $login = $lx_office_conf{task_server}->{login}; - my $client = $lx_office_conf{task_server}->{client}; + chdir $exe_dir; package main; @@ -64,7 +68,13 @@ sub initialize_kivitendo { $::locale = Locale->new($::lx_office_conf{system}->{language}); $::form = Form->new; $::auth = SL::Auth->new; - die "No client configured or no client found with the name/ID '$client'" unless $::auth->set_client($client); + + return if !$client; + + $::auth->set_client($client->id); + + $::form->{__ERROR_HANDLER} = sub { die @_ }; + $::instance_conf = SL::InstanceConfiguration->new; $::request = SL::Request->new( cgi => CGI->new({}), @@ -76,10 +86,10 @@ sub initialize_kivitendo { $::auth->restore_session; $::auth->create_or_refresh_session; + my $login = $client->task_server_user->login; + die "cannot find user $login" unless %::myconfig = $::auth->read_user(login => $login); die "cannot find locale for user $login" unless $::locale = Locale->new($::myconfig{countrycode} || $::lx_office_conf{system}->{language}); - - $::form->{__ERROR_HANDLER} = sub { die @_ }; } sub cleanup_kivitendo { @@ -93,7 +103,13 @@ sub cleanup_kivitendo { $::form = undef; $::myconfig = (); $::request = undef; + $::auth = undef; +} + +sub clean_before_sleeping { Form::disconnect_standard_dbh; + SL::DBConnect::Cache->disconnect_all_and_clear; + SL::DB->db_cache->clear; } sub drop_privileges { @@ -155,17 +171,23 @@ sub notify_on_failure { $params{client} = $::auth->client; - my $body; - $template->process($cfg->{email_template}, \%params, \$body); - - Mailer->new( - from => $cfg->{email_from}, - to => $email_to, - subject => $cfg->{email_subject}, - content_type => 'text/plain', - charset => 'utf-8', - message => Encode::decode('utf-8', $body), - )->send; + eval { + my $body; + $template->process($cfg->{email_template}, \%params, \$body); + + Mailer->new( + from => $cfg->{email_from}, + to => $email_to, + subject => $cfg->{email_subject}, + content_type => 'text/plain', + charset => 'utf-8', + message => Encode::decode('utf-8', $body), + )->send; + + 1; + } or do { + debug("Sending a failure notification failed with an exception: $@"); + }; } sub gd_preconfig { @@ -173,31 +195,49 @@ sub gd_preconfig { SL::LxOfficeConf->read($self->{configfile}); - die "Missing section [task_server] in config file" unless $lx_office_conf{task_server}; - die "Missing key 'login' in section [task_server] in config file" unless $lx_office_conf{task_server}->{login}; - die "Missing key 'client' in section [task_server] in config file" unless $lx_office_conf{task_server}->{client}; + die "Missing section [task_server] in config file" unless $lx_office_conf{task_server}; + + if ($lx_office_conf{task_server}->{login} || $lx_office_conf{task_server}->{client}) { + print STDERR <id . " (" . $client->name . ")"); - debug("Retrieving jobs"); + my $ok = eval { + initialize_kivitendo($client); my $jobs = SL::DB::Manager::BackgroundJob->get_all_need_to_run; - debug(" Found: " . join(' ', map { $_->package_name } @{ $jobs })) if @{ $jobs }; + if (@{ $jobs }) { + debug(" Executing the following jobs: " . join(' ', map { $_->package_name } @{ $jobs })); + } else { + debug(" No jobs to execute found"); + } foreach my $job (@{ $jobs }) { # Provide fresh global variables in case legacy code modifies # them somehow. - initialize_kivitendo(); + initialize_kivitendo($client); my $history = $job->run; @@ -214,9 +254,17 @@ sub gd_run { } cleanup_kivitendo(); + } +} + +sub gd_run { + while (1) { + run_once_for_all_clients(); debug("Sleeping"); + clean_before_sleeping(); + my $seconds = 60 - (localtime)[0]; if (!eval { local $SIG{'ALRM'} = sub { diff --git a/sql/Pg-upgrade2-auth/client_task_server.sql b/sql/Pg-upgrade2-auth/client_task_server.sql new file mode 100644 index 000000000..e636dbf0a --- /dev/null +++ b/sql/Pg-upgrade2-auth/client_task_server.sql @@ -0,0 +1,5 @@ +-- @tag: client_task_server +-- @description: Einstellungen, um eine Task-Server-Instanz für mehrere Mandanten laufen zu lassen +-- @depends: release_3_3_0 +ALTER TABLE auth.clients ADD COLUMN task_server_user_id INTEGER; +ALTER TABLE auth.clients ADD FOREIGN KEY (task_server_user_id) REFERENCES auth.user (id); diff --git a/templates/webpages/admin/edit_client.html b/templates/webpages/admin/edit_client.html index 1fe42a1e9..01363b854 100644 --- a/templates/webpages/admin/edit_client.html +++ b/templates/webpages/admin/edit_client.html @@ -49,6 +49,13 @@ [% L.input_tag("client.dbpasswd", SELF.client.dbpasswd, class="contains_dbsettings", type="password") %] + + + [% LxERP.t8("Run task server for this client with the following user") %] + + [% L.select_tag("client.task_server_user_id", SELF.all_users, with_empty=1, empty_title=LxERP.t8("Do not run the task server for this client"), title_key="login", default=SELF.client.task_server_user_id) %] + +
    diff --git a/templates/webpages/admin/edit_user.html b/templates/webpages/admin/edit_user.html index 3a8f12959..8b3bde11e 100644 --- a/templates/webpages/admin/edit_user.html +++ b/templates/webpages/admin/edit_user.html @@ -1,5 +1,5 @@ [%- USE HTML %] -[%- USE L %][%- USE LxERP -%] +[%- USE L %][%- USE LxERP -%][%- USE JavaScript -%] [%- INCLUDE 'common/flash.html' %] @@ -157,7 +157,7 @@ [% L.button_tag("submit_with_action('save_user')", LxERP.t8("Save")) %] [% IF SELF.user.id %] [% L.button_tag("save_as_new()", LxERP.t8("Save as new")) %] - [% L.button_tag("submit_with_action('delete_user')", LxERP.t8("Delete"), confirm=LxERP.t8("Are you sure?")) %] + [% L.button_tag("submit_delete()", LxERP.t8("Delete"), confirm=LxERP.t8("Are you sure?")) %] [%- END %]

    @@ -170,6 +170,16 @@ $("#form").submit(); } + function submit_delete() { +[% SET used_for_task_server_in_clients = SELF.is_user_used_for_task_server(SELF.user) %] +[% IF used_for_task_server_in_clients %] + alert('[% LxERP.t8('The user cannot be deleted as it is used in the following clients: #1', used_for_task_server_in_clients) | js %]'); + return false; +[% ELSE %] + submit_with_action('delete_user'); +[% END %] + } + function save_as_new() { $("#user_id").val(""); submit_with_action("save_user");