Revision ab18d1c0
Von Jan Büren vor fast 6 Jahren hinzugefügt
SL/InstallationCheck.pm | ||
---|---|---|
35 | 35 |
{ name => "Email::MIME", url => "http://search.cpan.org/~rjbs/", debian => 'libemail-mime-perl' }, |
36 | 36 |
{ name => "FCGI", version => '0.72', url => "http://search.cpan.org/~mstrout/", debian => 'libfcgi-perl' }, |
37 | 37 |
{ name => "File::Copy::Recursive", url => "http://search.cpan.org/~dmuey/", debian => 'libfile-copy-recursive-perl' }, |
38 |
{ name => "File::Flock", version => '2008.01', url => "http://search.cpan.org/~muir/", }, # fallback version 98
|
|
38 |
{ name => "File::Flock", version => '2008.01', url => "http://search.cpan.org/~muir/", debian => 'libfile-flock-perl' },
|
|
39 | 39 |
{ name => "File::MimeInfo", url => "http://search.cpan.org/~michielb/", debian => 'libfile-mimeinfo-perl' }, |
40 |
{ name => "File::Slurp", url => "https://metacpan.org/author/CAPOEIRAB", debian => 'libfile-slurp-perl' }, |
|
40 | 41 |
{ name => "GD", url => "http://search.cpan.org/~lds/", debian => 'libgd-gd2-perl', }, |
41 | 42 |
{ name => 'HTML::Parser', url => 'http://search.cpan.org/~gaas/', debian => 'libhtml-parser-perl', }, |
42 | 43 |
{ name => 'HTML::Restrict', url => 'http://search.cpan.org/~oalders/', debian => 'libhtml-restrict-perl'}, |
... | ... | |
54 | 55 |
{ name => "Rose::DB", url => "http://search.cpan.org/~jsiracusa/", debian => 'librose-db-perl' }, |
55 | 56 |
{ name => "Rose::DB::Object", version => 0.788, url => "http://search.cpan.org/~jsiracusa/", debian => 'librose-db-object-perl' }, |
56 | 57 |
{ name => "Set::Infinite", version => '0.63', url => "http://search.cpan.org/~fglock/", debian => 'libset-infinite-perl' }, |
57 |
{ name => "Set::Crontab", version => '1.03', url => "http://search.cpan.org/~ams/", }, |
|
58 |
{ name => "Set::Crontab", version => '1.03', url => "http://search.cpan.org/~ams/", debian => 'libset-crontab-perl' },
|
|
58 | 59 |
{ name => "String::ShellQuote", version => 1.01, url => "http://search.cpan.org/~rosch/", debian => 'libstring-shellquote-perl' }, |
59 | 60 |
{ name => "Sort::Naturally", url => "http://search.cpan.org/~sburke/", debian => 'libsort-naturally-perl' }, |
60 | 61 |
# Test::Harness is core, so no Debian packages. Test::Harness 3.00 was first packaged in 5.10.1 |
doc/UPGRADE | ||
---|---|---|
5 | 5 |
** BITTE FERTIGEN SIE VOR DEM UPGRADE EIN BACKUP IHRER DATENBANK(EN) AN! ** |
6 | 6 |
|
7 | 7 |
|
8 |
Upgrade auf v3.x.x
|
|
8 |
Upgrade auf v3.5.3
|
|
9 | 9 |
|
10 | 10 |
* Fallback-Module entfernt |
11 | 11 |
|
... | ... | |
13 | 13 |
dieser Version nicht mehr mit ausgeliefert. |
14 | 14 |
Bitte vor dem Anmelden an der Weboberfläche 'scripts/installation_check.pl -v' ausführen |
15 | 15 |
und die entsprechenden Module installieren. |
16 |
S.a. weitere Details in der aktuellen kivitendo-Dokumentation. |
|
16 | 17 |
|
17 | 18 |
|
18 | 19 |
Upgrade auf v3.5.1 |
doc/dokumentation.xml | ||
---|---|---|
338 | 338 |
<literal>Set::Infinite</literal>, |
339 | 339 |
<literal>List::UtilsBy</literal>, |
340 | 340 |
<literal>DateTime::Set</literal>, |
341 |
<literal>DateTime::Event::Cron</literal></para> |
|
341 |
<literal>DateTime::Event::Cron</literal> |
|
342 |
<literal>Daemon::Generic</literal> |
|
343 |
<literal>DateTime::Event::Cron</literal> |
|
344 |
<literal>File::Flock</literal> |
|
345 |
<literal>File::Slurp</literal> |
|
346 |
<literal>Set::Crontab</literal> |
|
347 |
<literal>Exception::Lite</literal> |
|
348 |
</para>Für die letzten beiden Module liefert kivitendo fallback-Module aus, da |
|
349 |
diese überhaupt nicht in debian oder in der benötigten Version zu Verfügung stehen (Stand Anfang 2019). |
|
342 | 350 |
|
343 | 351 |
<para>Seit Version größer v3.5.0 sind die folgenden Pakete |
344 | 352 |
hinzugekommen: <literal>Text::Unidecode</literal>, |
... | ... | |
400 | 408 |
libfile-copy-recursive-perl postgresql libalgorithm-checkdigits-perl \ |
401 | 409 |
libcrypt-pbkdf2-perl git libcgi-pm-perl libtext-unidecode-perl libwww-perl\ |
402 | 410 |
postgresql-contrib aqbanking-tools poppler-utils libhtml-restrict-perl\ |
403 |
libdatetime-event-cron-perl libdatetime-set-perl libset-infinite-perl liblist-utilsby-perl |
|
411 |
libdatetime-set-perl libset-infinite-perl liblist-utilsby-perl\ |
|
412 |
libdaemon-generic-perl libfile-flock-perl libfile-slurp-perl |
|
413 |
|
|
404 | 414 |
</programlisting> |
405 | 415 |
<para>Ab Ubuntu Version 18.04 LTS sind alle benötigten Pakete in der Distributions verfügbar.</para> |
406 | 416 |
<para>Für ältere Ubuntu/Debians müßen einige Pakete per CPAN installiert werden. |
doc/html/ch02s02.html | ||
---|---|---|
97 | 97 |
<code class="literal">List::UtilsBy</code>, |
98 | 98 |
<code class="literal">DateTime::Set</code>, |
99 | 99 |
<code class="literal">DateTime::Event::Cron</code> |
100 |
</p><p>Seit Version größer v3.5.0 sind die folgenden Pakete |
|
100 |
|
|
101 |
<code class="literal">Daemon::Generic</code> |
|
102 |
|
|
103 |
<code class="literal">DateTime::Event::Cron</code> |
|
104 |
|
|
105 |
<code class="literal">File::Flock</code> |
|
106 |
|
|
107 |
<code class="literal">File::Slurp</code> |
|
108 |
|
|
109 |
<code class="literal">Set::Crontab</code> |
|
110 |
|
|
111 |
<code class="literal">Exception::Lite</code> |
|
112 |
|
|
113 |
</p>Für die letzten beiden Module liefert kivitendo fallback-Module aus, da |
|
114 |
diese überhaupt nicht in debian oder in der benötigten Version zu Verfügung stehen (Stand Anfang 2019). |
|
115 |
|
|
116 |
<p>Seit Version größer v3.5.0 sind die folgenden Pakete |
|
101 | 117 |
hinzugekommen: <code class="literal">Text::Unidecode</code>, |
102 | 118 |
<code class="literal">LWP::Authen::Digest</code>, |
103 | 119 |
<code class="literal">LWP::UserAgent</code> |
... | ... | |
124 | 140 |
sind auch in 2.6.1 weiterhin mit ausgeliefert, wurden in einer |
125 | 141 |
zukünftigen Version aber aus dem Paket entfernt werden. Es wird |
126 | 142 |
empfohlen diese Module zusammen mit den anderen als Bibliotheken zu |
127 |
installieren.</p><div class="sect3" title="2.2.2.1. Debian und Ubuntu"><div class="titlepage"><div><div><h4 class="title"><a name="d0e486"></a>2.2.2.1. Debian und Ubuntu</h4></div></div></div><p>Für Debian und Ubuntu stehen die meisten der benötigten
|
|
143 |
installieren.</p><div class="sect3" title="2.2.2.1. Debian und Ubuntu"><div class="titlepage"><div><div><h4 class="title"><a name="d0e505"></a>2.2.2.1. Debian und Ubuntu</h4></div></div></div><p>Für Debian und Ubuntu stehen die meisten der benötigten
|
|
128 | 144 |
Pakete als Debian-Pakete zur Verfügung. Sie können mit |
129 | 145 |
folgendem Befehl installiert werden:</p><pre class="programlisting">apt install apache2 libarchive-zip-perl libclone-perl \ |
130 | 146 |
libconfig-std-perl libdatetime-perl libdbd-pg-perl libdbi-perl \ |
... | ... | |
138 | 154 |
libfile-copy-recursive-perl postgresql libalgorithm-checkdigits-perl \ |
139 | 155 |
libcrypt-pbkdf2-perl git libcgi-pm-perl libtext-unidecode-perl libwww-perl\ |
140 | 156 |
postgresql-contrib aqbanking-tools poppler-utils libhtml-restrict-perl\ |
141 |
libdatetime-event-cron-perl libdatetime-set-perl libset-infinite-perl liblist-utilsby-perl |
|
157 |
libdatetime-set-perl libset-infinite-perl liblist-utilsby-perl\ |
|
158 |
libdaemon-generic-perl libfile-flock-perl libfile-slurp-perl |
|
159 |
|
|
142 | 160 |
</pre><p>Ab Ubuntu Version 18.04 LTS sind alle benötigten Pakete in der Distributions verfügbar.</p><p>Für ältere Ubuntu/Debians müßen einige Pakete per CPAN installiert werden. |
143 | 161 |
Das geht bspw. für das benötige Paket HTML::Restrict mit:</p><pre class="programlisting">apt-get install build-essential |
144 |
cpan HTML::Restrict</pre></div><div class="sect3" title="2.2.2.2. Fedora"><div class="titlepage"><div><div><h4 class="title"><a name="d0e499"></a>2.2.2.2. Fedora</h4></div></div></div><p>Für Fedora stehen die meisten der benötigten Perl-Pakete als
|
|
162 |
cpan HTML::Restrict</pre></div><div class="sect3" title="2.2.2.2. Fedora"><div class="titlepage"><div><div><h4 class="title"><a name="d0e518"></a>2.2.2.2. Fedora</h4></div></div></div><p>Für Fedora stehen die meisten der benötigten Perl-Pakete als
|
|
145 | 163 |
RPM-Pakete zur Verfügung. Sie können mit folgendem Befehl |
146 | 164 |
installiert werden:</p><pre class="programlisting">dnf install httpd mod_fcgid perl-Archive-Zip perl-Clone perl-DBD-Pg \ |
147 | 165 |
perl-DBI perl-DateTime perl-Email-Address perl-Email-MIME perl-FCGI \ |
... | ... | |
151 | 169 |
perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI \ |
152 | 170 |
perl-XML-Writer perl-YAML perl-parent postgresql-server perl-CPAN \ |
153 | 171 |
perl-Algorithm-CheckDigits perl-GD perl-Class-XSAccessor perl-Text-Balanced perl-libwww-perl</pre><p>Zusätzlich müssen einige Pakete aus dem CPAN installiert |
154 |
werden. Dazu können Sie die folgenden Befehle nutzen:</p><pre class="programlisting">cpan Config::Std HTML::Restrict</pre></div><div class="sect3" title="2.2.2.3. openSUSE"><div class="titlepage"><div><div><h4 class="title"><a name="d0e510"></a>2.2.2.3. openSUSE</h4></div></div></div><p>Für openSUSE stehen die meisten der benötigten Perl-Pakete als
|
|
172 |
werden. Dazu können Sie die folgenden Befehle nutzen:</p><pre class="programlisting">cpan Config::Std HTML::Restrict</pre></div><div class="sect3" title="2.2.2.3. openSUSE"><div class="titlepage"><div><div><h4 class="title"><a name="d0e529"></a>2.2.2.3. openSUSE</h4></div></div></div><p>Für openSUSE stehen die meisten der benötigten Perl-Pakete als
|
|
155 | 173 |
RPM-Pakete zur Verfügung. Sie können mit folgendem Befehl |
156 | 174 |
installiert werden:</p><pre class="programlisting">zypper install apache2 apache2-mod_fcgid perl-Archive-Zip perl-Clone \ |
157 | 175 |
perl-Config-Std perl-DBD-Pg perl-DBI perl-DateTime perl-Email-Address \ |
... | ... | |
160 | 178 |
perl-Sort-Naturally perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv \ |
161 | 179 |
perl-URI perl-XML-Writer perl-YAML perl-CPAN \ |
162 | 180 |
perl-Algorithm-CheckDigits perl-GD perl-Class-XSAccessor postgresql-server perl-libwwww-perl</pre><p>Zusätzlich müssen einige Pakete aus dem CPAN installiert |
163 |
werden. Dazu können Sie die folgenden Befehle nutzen:</p><pre class="programlisting">cpan Rose::Db::Object</pre></div></div><div class="sect2" title="2.2.3. Andere Pakete installieren"><div class="titlepage"><div><div><h3 class="title"><a name="d0e521"></a>2.2.3. Andere Pakete installieren</h3></div></div></div><p>Seit Version v3.4.0 wird für den Bankimport optional das Paket
|
|
181 |
werden. Dazu können Sie die folgenden Befehle nutzen:</p><pre class="programlisting">cpan Rose::Db::Object</pre></div></div><div class="sect2" title="2.2.3. Andere Pakete installieren"><div class="titlepage"><div><div><h3 class="title"><a name="d0e540"></a>2.2.3. Andere Pakete installieren</h3></div></div></div><p>Seit Version v3.4.0 wird für den Bankimport optional das Paket
|
|
164 | 182 |
'aqbanking-tools' benötigt.</p><p>Debian und Ubuntu: </p><pre class="programlisting">apt install aqbanking-tools |
165 | 183 |
</pre><p> |
166 | 184 |
</p><p>Fedora: </p><pre class="programlisting">dnf install aqbanking</pre><p> |
doc/html/ch02s06.html | ||
---|---|---|
1 | 1 |
<html><head> |
2 | 2 |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
3 |
<title>2.6. Webserver-Konfiguration</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch02.html" title="Kapitel 2. Installation und Grundkonfiguration"><link rel="prev" href="ch02s05.html" title="2.5. Anpassung der PostgreSQL-Konfiguration"><link rel="next" href="ch02s07.html" title="2.7. Der Task-Server"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2.6. Webserver-Konfiguration</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s05.html">Zurück</a> </td><th width="60%" align="center">Kapitel 2. Installation und Grundkonfiguration</th><td width="20%" align="right"> <a accesskey="n" href="ch02s07.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="2.6. Webserver-Konfiguration"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Apache-Konfiguration"></a>2.6. Webserver-Konfiguration</h2></div></div></div><div class="sect2" title="2.6.1. Grundkonfiguration mittels CGI"><div class="titlepage"><div><div><h3 class="title"><a name="d0e977"></a>2.6.1. Grundkonfiguration mittels CGI</h3></div></div></div><div class="note" title="Anmerkung" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Anmerkung]" src="system/docbook-xsl/images/note.png"></td><th align="left">Anmerkung</th></tr><tr><td align="left" valign="top"><p>Für einen deutlichen Performanceschub sorgt die Ausführung
|
|
3 |
<title>2.6. Webserver-Konfiguration</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch02.html" title="Kapitel 2. Installation und Grundkonfiguration"><link rel="prev" href="ch02s05.html" title="2.5. Anpassung der PostgreSQL-Konfiguration"><link rel="next" href="ch02s07.html" title="2.7. Der Task-Server"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2.6. Webserver-Konfiguration</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s05.html">Zurück</a> </td><th width="60%" align="center">Kapitel 2. Installation und Grundkonfiguration</th><td width="20%" align="right"> <a accesskey="n" href="ch02s07.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="2.6. Webserver-Konfiguration"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Apache-Konfiguration"></a>2.6. Webserver-Konfiguration</h2></div></div></div><div class="sect2" title="2.6.1. Grundkonfiguration mittels CGI"><div class="titlepage"><div><div><h3 class="title"><a name="d0e996"></a>2.6.1. Grundkonfiguration mittels CGI</h3></div></div></div><div class="note" title="Anmerkung" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Anmerkung]" src="system/docbook-xsl/images/note.png"></td><th align="left">Anmerkung</th></tr><tr><td align="left" valign="top"><p>Für einen deutlichen Performanceschub sorgt die Ausführung
|
|
4 | 4 |
mittels FastCGI/FCGI. Die Einrichtung wird ausführlich im Abschnitt |
5 | 5 |
<a class="xref" href="ch02s06.html#Apache-Konfiguration.FCGI" title="2.6.2. Konfiguration für FastCGI/FCGI">Konfiguration für FastCGI/FCGI</a> beschrieben.</p></td></tr></table></div><p>Der Zugriff auf das Programmverzeichnis muss in der Apache |
6 | 6 |
Webserverkonfigurationsdatei <code class="literal">httpd.conf</code> eingestellt |
... | ... | |
106 | 106 |
Alias /url/for/kivitendo-erp-fcgid/ /path/to/kivitendo-erp/</pre><p>Dann ist unter <code class="filename">/url/for/kivitendo-erp/</code> |
107 | 107 |
die normale Version erreichbar, und unter |
108 | 108 |
<code class="constant">/url/for/kivitendo-erp-fcgid/</code> die |
109 |
FastCGI-Version.</p></div></div><div class="sect2" title="2.6.3. Weitergehende Konfiguration"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1128"></a>2.6.3. Weitergehende Konfiguration</h3></div></div></div><p>Für einen deutlichen Sicherheitsmehrwert sorgt die Ausführung
|
|
109 |
FastCGI-Version.</p></div></div><div class="sect2" title="2.6.3. Weitergehende Konfiguration"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1147"></a>2.6.3. Weitergehende Konfiguration</h3></div></div></div><p>Für einen deutlichen Sicherheitsmehrwert sorgt die Ausführung
|
|
110 | 110 |
von kivitendo nur über https-verschlüsselten Verbindungen, sowie |
111 | 111 |
weiteren Zusatzmassnahmen, wie beispielsweise Basic Authenticate. Die |
112 | 112 |
Konfigurationsmöglichkeiten sprengen allerdings den Rahmen dieser |
doc/html/ch02s07.html | ||
---|---|---|
39 | 39 |
Links aus einem der Runlevel-Verzeichnisse heraus in den Boot-Prozess |
40 | 40 |
einzubinden. Da das bei neueren Linux-Distributionen aber nicht |
41 | 41 |
zwangsläufig funktioniert, werden auch Start-Scripte mitgeliefert, die |
42 |
anstelle eines symbolischen Links verwendet werden können.</p><div class="sect3" title="2.7.3.1. SystemV-basierende Systeme (z.B. ältere Debian, ältere openSUSE, ältere Fedora)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1202"></a>2.7.3.1. SystemV-basierende Systeme (z.B. ältere Debian, ältere
|
|
42 |
anstelle eines symbolischen Links verwendet werden können.</p><div class="sect3" title="2.7.3.1. SystemV-basierende Systeme (z.B. ältere Debian, ältere openSUSE, ältere Fedora)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1221"></a>2.7.3.1. SystemV-basierende Systeme (z.B. ältere Debian, ältere
|
|
43 | 43 |
openSUSE, ältere Fedora)</h4></div></div></div><p>Kopieren Sie die Datei |
44 | 44 |
<code class="filename">scripts/boot/system-v/kivitendo-task-server</code> |
45 | 45 |
nach <code class="filename">/etc/init.d/kivitendo-task-server</code>. Passen |
... | ... | |
47 | 47 |
<code class="literal">DAEMON=....</code>). Binden Sie das Script in den |
48 | 48 |
Boot-Prozess ein. Dies ist distributionsabhängig:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Debian-basierende Systeme:</p><pre class="programlisting">update-rc.d kivitendo-task-server defaults |
49 | 49 |
insserv kivitendo-task-server</pre></li><li class="listitem"><p>Ältere openSUSE und ältere Fedora:</p><pre class="programlisting">chkconfig --add kivitendo-task-server</pre></li></ul></div><p>Danach kann der Task-Server mit dem folgenden Befehl gestartet |
50 |
werden:</p><pre class="programlisting">/etc/init.d/kivitendo-task-server start</pre></div><div class="sect3" title="2.7.3.2. Upstart-basierende Systeme (z.B. Ubuntu bis 14.04)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1231"></a>2.7.3.2. Upstart-basierende Systeme (z.B. Ubuntu bis 14.04)</h4></div></div></div><p>Kopieren Sie die Datei
|
|
50 |
werden:</p><pre class="programlisting">/etc/init.d/kivitendo-task-server start</pre></div><div class="sect3" title="2.7.3.2. Upstart-basierende Systeme (z.B. Ubuntu bis 14.04)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1250"></a>2.7.3.2. Upstart-basierende Systeme (z.B. Ubuntu bis 14.04)</h4></div></div></div><p>Kopieren Sie die Datei
|
|
51 | 51 |
<code class="filename">scripts/boot/upstart/kivitendo-task-server.conf</code> |
52 | 52 |
nach <code class="filename">/etc/init/kivitendo-task-server.conf</code>. |
53 | 53 |
Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile |
54 | 54 |
<code class="literal">exec ....</code>).</p><p>Danach kann der Task-Server mit dem folgenden Befehl gestartet |
55 |
werden:</p><pre class="programlisting">service kivitendo-task-server start</pre></div><div class="sect3" title="2.7.3.3. systemd-basierende Systeme (z.B. neure openSUSE, neuere Fedora, neuere Ubuntu und neuere Debians)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1249"></a>2.7.3.3. systemd-basierende Systeme (z.B. neure openSUSE, neuere
|
|
55 |
werden:</p><pre class="programlisting">service kivitendo-task-server start</pre></div><div class="sect3" title="2.7.3.3. systemd-basierende Systeme (z.B. neure openSUSE, neuere Fedora, neuere Ubuntu und neuere Debians)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1268"></a>2.7.3.3. systemd-basierende Systeme (z.B. neure openSUSE, neuere
|
|
56 | 56 |
Fedora, neuere Ubuntu und neuere Debians)</h4></div></div></div><p>Kopieren Sie die Datei |
57 | 57 |
<code class="filename">scripts/boot/systemd/kivitendo-task-server.service</code> |
58 | 58 |
nach <code class="filename">/etc/systemd/system/</code>. Passen Sie in der |
doc/html/ch02s13.html | ||
---|---|---|
63 | 63 |
Verzeichnis umbenannt werden.</p><p>Dieses Verzeichnis, wie auch das komplette |
64 | 64 |
<code class="literal">users</code>-Verzeichnis, muss vom Webserver beschreibbar |
65 | 65 |
sein. Dieses wurde bereits erledigt (siehe <a class="xref" href="ch02s03.html" title="2.3. Manuelle Installation des Programmpaketes">Manuelle Installation des Programmpaketes</a>), kann aber erneut |
66 |
überprüft werden, wenn die Konvertierung nach PDF fehlschlägt.</p><div class="sect2" title="2.13.1. OpenDocument (odt) Druckvorlagen mit Makros"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2293"></a>2.13.1. OpenDocument (odt) Druckvorlagen mit Makros</h3></div></div></div><p>OpenDocument Vorlagen können Makros enthalten, welche komplexere
|
|
66 |
überprüft werden, wenn die Konvertierung nach PDF fehlschlägt.</p><div class="sect2" title="2.13.1. OpenDocument (odt) Druckvorlagen mit Makros"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2312"></a>2.13.1. OpenDocument (odt) Druckvorlagen mit Makros</h3></div></div></div><p>OpenDocument Vorlagen können Makros enthalten, welche komplexere
|
|
67 | 67 |
Aufgaben erfüllen.</p><p>Der Vorlagensatz "rev-odt" enthält solche Vorlagen mit <span class="bold"><strong>Schweizer Bank-Einzahlungsscheinen (BESR)</strong></span>. |
68 | 68 |
Diese Makros haben die Aufgabe, die in den Einzahlungsscheinen |
69 | 69 |
benötigte Referenznummer und Kodierzeile zu erzeugen. Hier eine kurze |
70 | 70 |
Beschreibung, wie die Makros aufgebaut sind, und was bei ihrer Nutzung |
71 | 71 |
zu beachten ist (<span class="bold"><strong>in fett sind nötige einmalige |
72 |
Anpassungen aufgeführt</strong></span>):</p><div class="sect3" title="2.13.1.1. Bezeichnung der Vorlagen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2306"></a>2.13.1.1. Bezeichnung der Vorlagen</h4></div></div></div><p>Rechnung: invoice_besr.odt, Auftrag:
|
|
73 |
sales_order_besr.odt</p></div><div class="sect3" title="2.13.1.2. Vorbereitungen im Adminbereich"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2311"></a>2.13.1.2. Vorbereitungen im Adminbereich</h4></div></div></div><p>Damit beim Erstellen von Rechnungen und Aufträgen neben der
|
|
72 |
Anpassungen aufgeführt</strong></span>):</p><div class="sect3" title="2.13.1.1. Bezeichnung der Vorlagen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2325"></a>2.13.1.1. Bezeichnung der Vorlagen</h4></div></div></div><p>Rechnung: invoice_besr.odt, Auftrag:
|
|
73 |
sales_order_besr.odt</p></div><div class="sect3" title="2.13.1.2. Vorbereitungen im Adminbereich"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2330"></a>2.13.1.2. Vorbereitungen im Adminbereich</h4></div></div></div><p>Damit beim Erstellen von Rechnungen und Aufträgen neben der
|
|
74 | 74 |
Standardvorlage ohne Einzahlungsschein weitere Vorlagen (z.B. mit |
75 | 75 |
Einzahlungsschein) auswählbar sind, muss für jedes Vorlagen-Suffix |
76 | 76 |
ein Drucker eingerichtet werden:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Druckeradministration → Drucker hinzufügen</p></li><li class="listitem"><p>Mandant wählen</p></li><li class="listitem"><p>Druckerbeschreibung → aussagekräftiger Text: wird in der |
... | ... | |
79 | 79 |
Aufträgen oder Rechnungen als odt-Datei keine Bedeutung, darf |
80 | 80 |
aber nicht leer sein)</p></li><li class="listitem"><p>Vorlagenkürzel → besr bzw. selbst gewähltes Vorlagensuffix |
81 | 81 |
(muss genau der Zeichenfolge entsprechen, die zwischen |
82 |
"invoice_" bzw. "sales_order_" und ".odt" steht.)</p></li><li class="listitem"><p>speichern</p></li></ul></div></div><div class="sect3" title="2.13.1.3. Benutzereinstellungen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2335"></a>2.13.1.3. Benutzereinstellungen</h4></div></div></div><p>Wer den Ausdruck mit Einzahlungsschein als Standardeinstellung
|
|
82 |
"invoice_" bzw. "sales_order_" und ".odt" steht.)</p></li><li class="listitem"><p>speichern</p></li></ul></div></div><div class="sect3" title="2.13.1.3. Benutzereinstellungen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2354"></a>2.13.1.3. Benutzereinstellungen</h4></div></div></div><p>Wer den Ausdruck mit Einzahlungsschein als Standardeinstellung
|
|
83 | 83 |
im Rechnungs- bzw. Auftragsformular angezeigt haben möchte, kann |
84 | 84 |
dies persönlich für sich bei den Benutzereinstellungen |
85 | 85 |
konfigurieren:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Programm → Benutzereinstellungen → Druckoptionen</p></li><li class="listitem"><p>Standardvorlagenformat → OpenDocument/OASIS</p></li><li class="listitem"><p>Standardausgabekanal → Bildschirm</p></li><li class="listitem"><p>Standarddrucker → gewünschte Druckerbeschreibung auswählen |
86 |
(z.B. mit Einzahlungsschein Bank xy)</p></li><li class="listitem"><p>Anzahl Kopien → leer</p></li><li class="listitem"><p>speichern</p></li></ul></div></div><div class="sect3" title="2.13.1.4. Aufbau und nötige Anpassungen der Vorlagen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2359"></a>2.13.1.4. Aufbau und nötige Anpassungen der Vorlagen</h4></div></div></div><p>In der Vorlage sind als Modul "BESR" 4 Makros gespeichert, die
|
|
86 |
(z.B. mit Einzahlungsschein Bank xy)</p></li><li class="listitem"><p>Anzahl Kopien → leer</p></li><li class="listitem"><p>speichern</p></li></ul></div></div><div class="sect3" title="2.13.1.4. Aufbau und nötige Anpassungen der Vorlagen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2378"></a>2.13.1.4. Aufbau und nötige Anpassungen der Vorlagen</h4></div></div></div><p>In der Vorlage sind als Modul "BESR" 4 Makros gespeichert, die
|
|
87 | 87 |
aus dem von kivitendo erzeugten odt-Dokument die korrekte |
88 | 88 |
Referenznummer inklusive Prüfziffer sowie die Kodierzeile in |
89 | 89 |
OCRB-Schrift erzeugen und am richtigen Ort ins Dokument |
... | ... | |
112 | 112 |
angepasst werden.</strong></span> Dabei ist darauf zu achten, dass |
113 | 113 |
sich die Positionen der Postkonto-Nummern der Bank, sowie der |
114 | 114 |
Zeichenfolgen dddfr, DDDREF1, DDDREF2, 609, DDDKODIERZEILE nicht |
115 |
verschieben.</p></li></ul></div><div class="screenshot"><div class="mediaobject"><img src="images/Einzahlungsschein_Makro.png"></div></div></div><div class="sect3" title="2.13.1.5. Auswahl der Druckvorlage in kivitendo beim Erzeugen einer odt-Rechnung (analog bei Auftrag)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2423"></a>2.13.1.5. Auswahl der Druckvorlage in kivitendo beim Erzeugen einer
|
|
115 |
verschieben.</p></li></ul></div><div class="screenshot"><div class="mediaobject"><img src="images/Einzahlungsschein_Makro.png"></div></div></div><div class="sect3" title="2.13.1.5. Auswahl der Druckvorlage in kivitendo beim Erzeugen einer odt-Rechnung (analog bei Auftrag)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2442"></a>2.13.1.5. Auswahl der Druckvorlage in kivitendo beim Erzeugen einer
|
|
116 | 116 |
odt-Rechnung (analog bei Auftrag)</h4></div></div></div><p>Im Fussbereich der Rechnungsmaske muss neben Rechnung, |
117 | 117 |
OpenDocument/OASIS und Bildschirm die im Adminbereich erstellte |
118 | 118 |
Druckerbeschreibung ausgewählt werden, falls diese nicht bereits bei |
119 | 119 |
den Benutzereinstellungen als persönlicher Standard gewählt |
120 |
wurde.</p></div><div class="sect3" title="2.13.1.6. Makroeinstellungen in LibreOffice anpassen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2428"></a>2.13.1.6. Makroeinstellungen in LibreOffice anpassen</h4></div></div></div><p>Falls beim Öffnen einer von kivitendo erzeugten odt-Rechnung
|
|
120 |
wurde.</p></div><div class="sect3" title="2.13.1.6. Makroeinstellungen in LibreOffice anpassen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2447"></a>2.13.1.6. Makroeinstellungen in LibreOffice anpassen</h4></div></div></div><p>Falls beim Öffnen einer von kivitendo erzeugten odt-Rechnung
|
|
121 | 121 |
die Meldung kommt, dass Makros aus Sicherheitsgründen nicht |
122 | 122 |
ausgeführt werden, so müssen folgende Einstellungen in LibreOffice |
123 | 123 |
angepasst werden:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Extras → Optionen → Sicherheit → Makrosicherheit</p></li><li class="listitem"><p>Sicherheitslevel auf "Mittel" einstellen (Diese |
doc/html/ch03s03.html | ||
---|---|---|
613 | 613 |
<code class="varname">invdate</code> |
614 | 614 |
</span></dt><dd><p>Rechnungsdatum</p></dd><dt><span class="term"> |
615 | 615 |
<code class="varname">invnumber</code> |
616 |
</span></dt><dd><p>Rechnungsnummer</p></dd></dl></div></div></div><div class="sect2" title="3.3.10. Variablen in anderen Vorlagen"><div class="titlepage"><div><div><h3 class="title"><a name="dokumentenvorlagen-und-variablen.andere-vorlagen"></a>3.3.10. Variablen in anderen Vorlagen</h3></div></div></div><div class="sect3" title="3.3.10.1. Einführung"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5695"></a>3.3.10.1. Einführung</h4></div></div></div><p>Die Variablen in anderen Vorlagen sind ähnlich wie in der
|
|
616 |
</span></dt><dd><p>Rechnungsnummer</p></dd></dl></div></div></div><div class="sect2" title="3.3.10. Variablen in anderen Vorlagen"><div class="titlepage"><div><div><h3 class="title"><a name="dokumentenvorlagen-und-variablen.andere-vorlagen"></a>3.3.10. Variablen in anderen Vorlagen</h3></div></div></div><div class="sect3" title="3.3.10.1. Einführung"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5714"></a>3.3.10.1. Einführung</h4></div></div></div><p>Die Variablen in anderen Vorlagen sind ähnlich wie in der
|
|
617 | 617 |
Rechnung. Allerdings heißen die Variablen, die mit |
618 | 618 |
<code class="varname">inv</code> beginnen, jetzt anders. Bei den Angeboten |
619 | 619 |
fangen sie mit <code class="varname">quo</code> für "quotation" an: |
doc/html/ch03s07.html | ||
---|---|---|
1 | 1 |
<html><head> |
2 | 2 |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
3 |
<title>3.7. Artikelklassifizierung</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch03.html" title="Kapitel 3. Features und Funktionen"><link rel="prev" href="ch03s06.html" title="3.6. Schweizer Kontenpläne"><link rel="next" href="ch03s08.html" title="3.8. Dateiverwaltung (Mini-DMS)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.7. Artikelklassifizierung</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s06.html">Zurück</a> </td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right"> <a accesskey="n" href="ch03s08.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="3.7. Artikelklassifizierung"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="features.part_classification"></a>3.7. Artikelklassifizierung</h2></div></div></div><div class="sect2" title="3.7.1. Übersicht"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6363"></a>3.7.1. Übersicht</h3></div></div></div><p>Die Klassifizierung von Artikeln dient einer weiteren
|
|
3 |
<title>3.7. Artikelklassifizierung</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch03.html" title="Kapitel 3. Features und Funktionen"><link rel="prev" href="ch03s06.html" title="3.6. Schweizer Kontenpläne"><link rel="next" href="ch03s08.html" title="3.8. Dateiverwaltung (Mini-DMS)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.7. Artikelklassifizierung</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s06.html">Zurück</a> </td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right"> <a accesskey="n" href="ch03s08.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="3.7. Artikelklassifizierung"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="features.part_classification"></a>3.7. Artikelklassifizierung</h2></div></div></div><div class="sect2" title="3.7.1. Übersicht"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6382"></a>3.7.1. Übersicht</h3></div></div></div><p>Die Klassifizierung von Artikeln dient einer weiteren
|
|
4 | 4 |
Gliederung, um zum Beispiel den Einkauf vom Verkauf zu trennen, |
5 | 5 |
gekennzeichnet durch eine Beschreibung (z.B. "Einkauf") und ein Kürzel |
6 | 6 |
(z.B. "E"). Für jede Klassifizierung besteht eine Beschreibung und |
7 | 7 |
eine Abkürzung die normalerweise aus einem Zeichen besteht, kann aber |
8 | 8 |
auf mehrere Zeichen erweitert werden, falls zur Unterscheidung |
9 |
notwendig. Sinnvoll sind jedoch nur maximal 2 Zeichen.</p></div><div class="sect2" title="3.7.2. Basisklassifizierung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6368"></a>3.7.2. Basisklassifizierung</h3></div></div></div><p>Als Basisklassifizierungen gibt es</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Einkauf</p></li><li class="listitem"><p>Verkauf</p></li><li class="listitem"><p>Handelsware</p></li><li class="listitem"><p>Produktion</p></li><li class="listitem"><p>- keine - (diese wird bei einer Aktualisierung für alle
|
|
9 |
notwendig. Sinnvoll sind jedoch nur maximal 2 Zeichen.</p></div><div class="sect2" title="3.7.2. Basisklassifizierung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6387"></a>3.7.2. Basisklassifizierung</h3></div></div></div><p>Als Basisklassifizierungen gibt es</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Einkauf</p></li><li class="listitem"><p>Verkauf</p></li><li class="listitem"><p>Handelsware</p></li><li class="listitem"><p>Produktion</p></li><li class="listitem"><p>- keine - (diese wird bei einer Aktualisierung für alle
|
|
10 | 10 |
existierenden Artikel verwendet und ist gültig für Verkauf und |
11 | 11 |
Einkauf)</p></li></ul></div><p>Es können weitere Klassifizierungen angelegt werden. So kann es |
12 |
z.B. für separat auszuweisende Artikel folgende Klassen geben:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Lieferung (Logistik, Transport) mit Kürzel L</p></li><li class="listitem"><p>Material (Verpackungsmaterial) mit Kürzel M</p></li></ul></div></div><div class="sect2" title="3.7.3. Attribute"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6398"></a>3.7.3. Attribute</h3></div></div></div><p>Bisher haben die Klassifizierungen folgende Attribute, die auch
|
|
12 |
z.B. für separat auszuweisende Artikel folgende Klassen geben:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Lieferung (Logistik, Transport) mit Kürzel L</p></li><li class="listitem"><p>Material (Verpackungsmaterial) mit Kürzel M</p></li></ul></div></div><div class="sect2" title="3.7.3. Attribute"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6417"></a>3.7.3. Attribute</h3></div></div></div><p>Bisher haben die Klassifizierungen folgende Attribute, die auch
|
|
13 | 13 |
alle gleichzeitg gültig sein können</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>gültig für Verkauf - dieser Artikel kann im Verkauf genutzt |
14 | 14 |
werden</p></li><li class="listitem"><p>gültig für Einkauf - dieser Artikel kann im Einkauf genutzt |
15 | 15 |
werden</p></li><li class="listitem"><p>separat ausweisen - hierzu gibt es zur Dokumentengenerierung |
... | ... | |
19 | 19 |
pro separat auszuweisenden Klassifizierungen die Variable<span class="bold"><strong>< %separate_X_subtotal%></strong></span>, wobei X das |
20 | 20 |
Kürzel der Klassifizierung ist.</p><p>Im obigen Beispiel wäre das für Lieferkosten <span class="bold"><strong><%separate_L_subtotal%></strong></span> und für |
21 | 21 |
Verpackungsmaterial <span class="bold"><strong> |
22 |
<%separate_M_subtotal%></strong></span>.</p></div><div class="sect2" title="3.7.4. Zwei-Zeichen Abkürzung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6429"></a>3.7.4. Zwei-Zeichen Abkürzung</h3></div></div></div><p>Der Typ des Artikels und die Klassifizierung werden durch zwei
|
|
22 |
<%separate_M_subtotal%></strong></span>.</p></div><div class="sect2" title="3.7.4. Zwei-Zeichen Abkürzung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6448"></a>3.7.4. Zwei-Zeichen Abkürzung</h3></div></div></div><p>Der Typ des Artikels und die Klassifizierung werden durch zwei
|
|
23 | 23 |
Buchstaben dargestellt. Der erste Buchstabe ist eine Lokalisierung des |
24 | 24 |
Artikel-Typs ('P','A','S'), deutsch 'W', 'E', und 'D' für Ware |
25 | 25 |
Erzeugnis oder Dienstleistung und ggf. weiterer Typen.</p><p>Der zweite Buchstabe (und ggf. auch ein dritter, falls nötig) |
doc/html/ch03s08.html | ||
---|---|---|
1 | 1 |
<html><head> |
2 | 2 |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
3 |
<title>3.8. Dateiverwaltung (Mini-DMS)</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch03.html" title="Kapitel 3. Features und Funktionen"><link rel="prev" href="ch03s07.html" title="3.7. Artikelklassifizierung"><link rel="next" href="ch03s09.html" title="3.9. Webshop-Api"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.8. Dateiverwaltung (Mini-DMS)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s07.html">Zurück</a> </td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right"> <a accesskey="n" href="ch03s09.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="3.8. Dateiverwaltung (Mini-DMS)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="features.file_managment"></a>3.8. Dateiverwaltung (Mini-DMS)</h2></div></div></div><div class="sect2" title="3.8.1. Übersicht"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6441"></a>3.8.1. Übersicht</h3></div></div></div><p>Parallel zum alten WebDAV gibt es ein Datei-Management-System,
|
|
3 |
<title>3.8. Dateiverwaltung (Mini-DMS)</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch03.html" title="Kapitel 3. Features und Funktionen"><link rel="prev" href="ch03s07.html" title="3.7. Artikelklassifizierung"><link rel="next" href="ch03s09.html" title="3.9. Webshop-Api"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.8. Dateiverwaltung (Mini-DMS)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s07.html">Zurück</a> </td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right"> <a accesskey="n" href="ch03s09.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="3.8. Dateiverwaltung (Mini-DMS)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="features.file_managment"></a>3.8. Dateiverwaltung (Mini-DMS)</h2></div></div></div><div class="sect2" title="3.8.1. Übersicht"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6460"></a>3.8.1. Übersicht</h3></div></div></div><p>Parallel zum alten WebDAV gibt es ein Datei-Management-System,
|
|
4 | 4 |
das Dateien verschiedenen Typs verwaltet. Dies können</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>aus ERP-Daten per LaTeX Template erzeugte |
5 | 5 |
PDF-Dokumente,</p></li><li class="listitem"><p>zu bestimmten ERP-Daten gehörende Anhangdateien |
6 | 6 |
unterschiedlichen Formats,</p></li><li class="listitem"><p>per Scanner eingelesene PDF-Dateien,</p></li><li class="listitem"><p>per E-Mail empfangene Dateianhänge unterschiedlichen |
7 |
Formats,</p></li><li class="listitem"><p>sowie speziel für Artikel hochgeladene Bilder sein.</p></li></ol></div><div class="screenshot"><div class="mediaobject"><img src="images/DMS-Overview.png"></div></div></div><div class="sect2" title="3.8.2. Struktur"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6468"></a>3.8.2. Struktur</h3></div></div></div><p>Über eine vom Speichermedium unabhängige Zwischenschicht werden
|
|
7 |
Formats,</p></li><li class="listitem"><p>sowie speziel für Artikel hochgeladene Bilder sein.</p></li></ol></div><div class="screenshot"><div class="mediaobject"><img src="images/DMS-Overview.png"></div></div></div><div class="sect2" title="3.8.2. Struktur"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6487"></a>3.8.2. Struktur</h3></div></div></div><p>Über eine vom Speichermedium unabhängige Zwischenschicht werden
|
|
8 | 8 |
die Dateien und ihre Versionen in der Datenbank verwaltet. Darunter |
9 | 9 |
können verschiedene Implementierungen (Backends) gleichzeitig |
10 | 10 |
existieren:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Dateisystem</p></li><li class="listitem"><p>WebDAV</p></li><li class="listitem"><p>Schnittstelle zu externen |
... | ... | |
23 | 23 |
für "attachment" und "image" nur die Quelle "uploaded". Für "document" |
24 | 24 |
gibt es auf jeden Fall die Quelle "created". Die Quellen "scanner" und |
25 | 25 |
"email" müssen derzeit in der Datenbank konfiguriert werden (siehe |
26 |
<a class="xref" href="ch03s08.html#file_management.dbconfig" title="3.8.4.2. Datenbank-Konfigurierung">Datenbank-Konfigurierung</a>).</p></div><div class="sect2" title="3.8.3. Anwendung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6520"></a>3.8.3. Anwendung</h3></div></div></div><p>Die Daten werden bei den ERP-Objekten als extra Reiter
|
|
26 |
<a class="xref" href="ch03s08.html#file_management.dbconfig" title="3.8.4.2. Datenbank-Konfigurierung">Datenbank-Konfigurierung</a>).</p></div><div class="sect2" title="3.8.3. Anwendung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6539"></a>3.8.3. Anwendung</h3></div></div></div><p>Die Daten werden bei den ERP-Objekten als extra Reiter
|
|
27 | 27 |
dargestellt. Eine Verkaufsrechnung z.B. hat die Reiter "Dokumente" und |
28 | 28 |
"Dateianhänge".</p><div class="screenshot"><div class="mediaobject"><img src="images/DMS-Anhaenge.png"></div></div><p>Bei den Dateianhängen wird immer nur die aktuelle Version einer |
29 | 29 |
Datei angezeigt. Wird eine Datei mit gleichem Namen hochgeladen, so |
... | ... | |
39 | 39 |
so sind diese z.B. bei Einkaufsrechnungen sichtbar:</p><div class="screenshot"><div class="mediaobject"><img src="images/DMS-Dokumente-Scanner.png"></div></div><p>Statt des Löschens wird hier die Datei zurück zur Quelle |
40 | 40 |
verschoben. Somit kann die Datei anschließend an ein anderes |
41 | 41 |
ERP-Objekt angehängt werden.</p><p>Derzeit sind "Titel" und "Beschreibung" noch nicht genutzt. Sie |
42 |
sind bisher nur bei Bildern relevant.</p></div><div class="sect2" title="3.8.4. Konfigurierung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6563"></a>3.8.4. Konfigurierung</h3></div></div></div><div class="sect3" title="3.8.4.1. Mandantenkonfiguration"><div class="titlepage"><div><div><h4 class="title"><a name="file_management.clientconfig"></a>3.8.4.1. Mandantenkonfiguration</h4></div></div></div><div class="sect4" title="3.8.4.1.1. Reiter "Features""><div class="titlepage"><div><div><h5 class="title"><a name="d0e6569"></a>3.8.4.1.1. Reiter "Features"</h5></div></div></div><p>Unter dem Reiter <span class="bold"><strong>Features</strong></span>
|
|
42 |
sind bisher nur bei Bildern relevant.</p></div><div class="sect2" title="3.8.4. Konfigurierung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6582"></a>3.8.4. Konfigurierung</h3></div></div></div><div class="sect3" title="3.8.4.1. Mandantenkonfiguration"><div class="titlepage"><div><div><h4 class="title"><a name="file_management.clientconfig"></a>3.8.4.1. Mandantenkonfiguration</h4></div></div></div><div class="sect4" title="3.8.4.1.1. Reiter "Features""><div class="titlepage"><div><div><h5 class="title"><a name="d0e6588"></a>3.8.4.1.1. Reiter "Features"</h5></div></div></div><p>Unter dem Reiter <span class="bold"><strong>Features</strong></span>
|
|
43 | 43 |
im Abschnitt Dateimanagement ist neben dem "alten" WebDAV das |
44 | 44 |
Dateimangement generell zu- und abschaltbar, sowie die Zuordnung |
45 | 45 |
der Dateitypen zu Backends. Die Löschbarkeit von Dateien, sowie |
46 | 46 |
die maximale Uploadgröße sind Backend-unabhängig</p><div class="screenshot"><div class="mediaobject"><img src="images/DMS-ClientConfig.png"></div></div><p>Die einzelnen Backends sind einzeln einschaltbar. |
47 | 47 |
Spezifische Backend-Konfigurierungen sind hier noch |
48 |
ergänzbar.</p></div><div class="sect4" title="3.8.4.1.2. Reiter "Allgemeine Dokumentenanhänge""><div class="titlepage"><div><div><h5 class="title"><a name="d0e6585"></a>3.8.4.1.2. Reiter "Allgemeine Dokumentenanhänge"</h5></div></div></div><p>Unter dem Reiter <span class="bold"><strong>Allgemeine
|
|
48 |
ergänzbar.</p></div><div class="sect4" title="3.8.4.1.2. Reiter "Allgemeine Dokumentenanhänge""><div class="titlepage"><div><div><h5 class="title"><a name="d0e6604"></a>3.8.4.1.2. Reiter "Allgemeine Dokumentenanhänge"</h5></div></div></div><p>Unter dem Reiter <span class="bold"><strong>Allgemeine
|
|
49 | 49 |
Dokumentenanhänge</strong></span> kann für alle ERP-Dokumente ( |
50 | 50 |
Angebote, Aufträge, Lieferscheine, Rechnungen im Verkauf und |
51 | 51 |
Einkauf ) allgemeingültige Anhänge hochgeladen werden.</p><div class="screenshot"><div class="mediaobject"><img src="images/DMS-Allgemeine-Dokumentenanhaenge.png"></div></div><p>Diese Anhänge werden beim Generieren von PDF-Dateien an die |
doc/html/ch03s09.html | ||
---|---|---|
1 | 1 |
<html><head> |
2 | 2 |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
3 |
<title>3.9. Webshop-Api</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch03.html" title="Kapitel 3. Features und Funktionen"><link rel="prev" href="ch03s08.html" title="3.8. Dateiverwaltung (Mini-DMS)"><link rel="next" href="ch04.html" title="Kapitel 4. Entwicklerdokumentation"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.9. Webshop-Api</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s08.html">Zurück</a> </td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right"> <a accesskey="n" href="ch04.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="3.9. Webshop-Api"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e6619"></a>3.9. Webshop-Api</h2></div></div></div><p>Das Shopmodul bietet die Möglichkeit Onlineshopartikel und
|
|
3 |
<title>3.9. Webshop-Api</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch03.html" title="Kapitel 3. Features und Funktionen"><link rel="prev" href="ch03s08.html" title="3.8. Dateiverwaltung (Mini-DMS)"><link rel="next" href="ch04.html" title="Kapitel 4. Entwicklerdokumentation"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.9. Webshop-Api</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s08.html">Zurück</a> </td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right"> <a accesskey="n" href="ch04.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="3.9. Webshop-Api"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e6638"></a>3.9. Webshop-Api</h2></div></div></div><p>Das Shopmodul bietet die Möglichkeit Onlineshopartikel und
|
|
4 | 4 |
Onlineshopbestellungen zu verwalten und zu bearbeiten.</p><p>Es ist Multishopfähig, d.h. Artikel können mehreren oder |
5 | 5 |
unterschiedlichen Shops zugeordnet werden. Bestellungen können aus |
6 | 6 |
mehreren Shops geholt werden.</p><p>Zur Zeit bietet das Modul nur einen Connector zur REST-Api von |
7 | 7 |
Shopware. Weitere Connectoren können dazu programmiert und eingerichtet |
8 |
werden.</p><div class="sect2" title="3.9.1. Rechte für die Webshopapi"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6628"></a>3.9.1. Rechte für die Webshopapi</h3></div></div></div><p>In der Administration können folgende Rechte vergeben
|
|
9 |
werden</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Webshopartikel anlegen und bearbeiten</p></li><li class="listitem"><p>Shopbestellungen holen und bearbeiten</p></li><li class="listitem"><p>Shop anlegen und bearbeiten</p></li></ul></div></div><div class="sect2" title="3.9.2. Konfiguration"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6643"></a>3.9.2. Konfiguration</h3></div></div></div><p>Unter System->Webshops können Shops angelegt und konfiguriert
|
|
10 |
werden</p><div class="mediaobject"><img src="images/Shop_Listing.png"></div></div><div class="sect2" title="3.9.3. Webshopartikel"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6651"></a>3.9.3. Webshopartikel</h3></div></div></div><div class="sect3" title="3.9.3.1. Shopvariablenreiter in Artikelstammdaten"><div class="titlepage"><div><div><h4 class="title"><a name="d0e6654"></a>3.9.3.1. Shopvariablenreiter in Artikelstammdaten</h4></div></div></div><p>Mit dem Recht "Shopartikel anlegen und bearbeiten" und des
|
|
8 |
werden.</p><div class="sect2" title="3.9.1. Rechte für die Webshopapi"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6647"></a>3.9.1. Rechte für die Webshopapi</h3></div></div></div><p>In der Administration können folgende Rechte vergeben
|
|
9 |
werden</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Webshopartikel anlegen und bearbeiten</p></li><li class="listitem"><p>Shopbestellungen holen und bearbeiten</p></li><li class="listitem"><p>Shop anlegen und bearbeiten</p></li></ul></div></div><div class="sect2" title="3.9.2. Konfiguration"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6662"></a>3.9.2. Konfiguration</h3></div></div></div><p>Unter System->Webshops können Shops angelegt und konfiguriert
|
|
10 |
werden</p><div class="mediaobject"><img src="images/Shop_Listing.png"></div></div><div class="sect2" title="3.9.3. Webshopartikel"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6670"></a>3.9.3. Webshopartikel</h3></div></div></div><div class="sect3" title="3.9.3.1. Shopvariablenreiter in Artikelstammdaten"><div class="titlepage"><div><div><h4 class="title"><a name="d0e6673"></a>3.9.3.1. Shopvariablenreiter in Artikelstammdaten</h4></div></div></div><p>Mit dem Recht "Shopartikel anlegen und bearbeiten" und des
|
|
11 | 11 |
Markers <span class="bold"><strong>"Shopartikel" in den Basisdaten |
12 | 12 |
</strong></span>zeigt sich der Reiter "Shopvariablen" in den |
13 | 13 |
Artikelstammdaten. Hier können jetzt die Artikel mit |
... | ... | |
16 | 16 |
Stelle können auch beliebig viele Bilder dem Shopartikel zugeordnet |
17 | 17 |
werden. Artikelbilder gelten für alle Shops.</p><div class="mediaobject"><img src="images/Shop_Artikel.png"></div><p>Die Artikelgruppen werden direkt vom Shopsystem geholt somit |
18 | 18 |
ist es möglich einen Artikel auch mehreren Gruppen |
19 |
zuzuordenen</p></div><div class="sect3" title="3.9.3.2. Shopartikelliste"><div class="titlepage"><div><div><h4 class="title"><a name="d0e6667"></a>3.9.3.2. Shopartikelliste</h4></div></div></div><p>Unter dem Menu Webshop->Webshop Artikel hat man nochmal
|
|
19 |
zuzuordenen</p></div><div class="sect3" title="3.9.3.2. Shopartikelliste"><div class="titlepage"><div><div><h4 class="title"><a name="d0e6686"></a>3.9.3.2. Shopartikelliste</h4></div></div></div><p>Unter dem Menu Webshop->Webshop Artikel hat man nochmal
|
|
20 | 20 |
eine Gesamtübersicht. Von hier aus ist es möglich Artikel im Stapel |
21 | 21 |
unter verschiedenen Kriterien <alles><nur Preis><nur |
22 | 22 |
Bestand><Preis und Bestand> an die jeweiligen Shops |
23 |
hochzuladen.</p><div class="mediaobject"><img src="images/Shop_Artikel_Listing.png"></div></div></div><div class="sect2" title="3.9.4. Bestellimport"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6675"></a>3.9.4. Bestellimport</h3></div></div></div><p>Unter dem Menupunkt Webshop->Webshop Import öffnet sich die
|
|
23 |
hochzuladen.</p><div class="mediaobject"><img src="images/Shop_Artikel_Listing.png"></div></div></div><div class="sect2" title="3.9.4. Bestellimport"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6694"></a>3.9.4. Bestellimport</h3></div></div></div><p>Unter dem Menupunkt Webshop->Webshop Import öffnet sich die
|
|
24 | 24 |
Bestellimportsliste. Hier ist sind Möglichkeiten gegeben Neue |
25 | 25 |
Bestellungen vom Shop abzuholen, geholte Bestellungen im Stapel oder |
26 | 26 |
einzeln als Auftrag zu transferieren. Die Liste kann nach |
... | ... | |
52 | 52 |
auch der Grund für die Auftragssperre sein.</p></li><li class="listitem"><p>Die Buttons "Auftrag erstellen" und "Kunde mit |
53 | 53 |
Rechnungsadresse überschreiben" zeigen sich erst, wenn ein Kunde |
54 | 54 |
aus dem Listing ausgewählt ist.</p></li><li class="listitem"><p>Es ist aber möglich die Shopbestellung zu löschen.</p></li><li class="listitem"><p>Ist eine Bestellung schon übernommen, zeigen sich an dieser |
55 |
Stelle, die dazugehörigen Belegverknüpfungen.</p></li></ul></div></div><div class="sect2" title="3.9.5. Mapping der Daten"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6728"></a>3.9.5. Mapping der Daten</h3></div></div></div><p>Das Mapping der kivitendo Daten mit den Shopdaten geschieht in
|
|
55 |
Stelle, die dazugehörigen Belegverknüpfungen.</p></li></ul></div></div><div class="sect2" title="3.9.5. Mapping der Daten"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6747"></a>3.9.5. Mapping der Daten</h3></div></div></div><p>Das Mapping der kivitendo Daten mit den Shopdaten geschieht in
|
|
56 | 56 |
der Datei SL/ShopConnector/<SHOPCONNECTORNAME>.pm |
57 | 57 |
z.B.:SL/ShopConnector/Shopware.pm</p><p>In dieser Datei gibt es einen Bereich wo die Bestellpostionen, |
58 | 58 |
die Bestellkopfdaten und die Artikeldaten gemapt werden. In dieser |
doc/html/ch04.html | ||
---|---|---|
1 | 1 |
<html><head> |
2 | 2 |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
3 |
<title>Kapitel 4. Entwicklerdokumentation</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="prev" href="ch03s09.html" title="3.9. Webshop-Api"><link rel="next" href="ch04s02.html" title="4.2. Entwicklung unter FastCGI"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Kapitel 4. Entwicklerdokumentation</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s09.html">Zurück</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch04s02.html">Weiter</a></td></tr></table><hr></div><div class="chapter" title="Kapitel 4. Entwicklerdokumentation"><div class="titlepage"><div><div><h2 class="title"><a name="d0e6738"></a>Kapitel 4. Entwicklerdokumentation</h2></div></div></div><div class="sect1" title="4.1. Globale Variablen"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="devel.globals"></a>4.1. Globale Variablen</h2></div></div></div><div class="sect2" title="4.1.1. Wie sehen globale Variablen in Perl aus?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6744"></a>4.1.1. Wie sehen globale Variablen in Perl aus?</h3></div></div></div><p>Globale Variablen liegen in einem speziellen namespace namens
|
|
3 |
<title>Kapitel 4. Entwicklerdokumentation</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="prev" href="ch03s09.html" title="3.9. Webshop-Api"><link rel="next" href="ch04s02.html" title="4.2. Entwicklung unter FastCGI"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Kapitel 4. Entwicklerdokumentation</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s09.html">Zurück</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch04s02.html">Weiter</a></td></tr></table><hr></div><div class="chapter" title="Kapitel 4. Entwicklerdokumentation"><div class="titlepage"><div><div><h2 class="title"><a name="d0e6757"></a>Kapitel 4. Entwicklerdokumentation</h2></div></div></div><div class="sect1" title="4.1. Globale Variablen"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="devel.globals"></a>4.1. Globale Variablen</h2></div></div></div><div class="sect2" title="4.1.1. Wie sehen globale Variablen in Perl aus?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6763"></a>4.1.1. Wie sehen globale Variablen in Perl aus?</h3></div></div></div><p>Globale Variablen liegen in einem speziellen namespace namens
|
|
4 | 4 |
"main", der von überall erreichbar ist. Darüber hinaus sind bareword |
5 | 5 |
globs global und die meisten speziellen Variablen sind... |
6 | 6 |
speziell.</p><p>Daraus ergeben sich folgende Formen:</p><div class="variablelist"><dl><dt><span class="term"> |
... | ... | |
25 | 25 |
<code class="varname">$PACKAGE::form</code>.</p></dd><dt><span class="term"> |
26 | 26 |
<code class="literal">local $form</code> |
27 | 27 |
</span></dt><dd><p>Alle Änderungen an <code class="varname">$form</code> werden am Ende |
28 |
des scopes zurückgesetzt</p></dd></dl></div></div><div class="sect2" title="4.1.2. Warum sind globale Variablen ein Problem?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6845"></a>4.1.2. Warum sind globale Variablen ein Problem?</h3></div></div></div><p>Das erste Problem ist <span class="productname">FCGI</span>™.</p><p>
|
|
28 |
des scopes zurückgesetzt</p></dd></dl></div></div><div class="sect2" title="4.1.2. Warum sind globale Variablen ein Problem?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6864"></a>4.1.2. Warum sind globale Variablen ein Problem?</h3></div></div></div><p>Das erste Problem ist <span class="productname">FCGI</span>™.</p><p>
|
|
29 | 29 |
<span class="productname">SQL-Ledger</span>™ hat fast alles im globalen |
30 | 30 |
namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist. |
31 | 31 |
Unter <span class="productname">FCGI</span>™ müssen diese Sachen aber wieder |
... | ... | |
39 | 39 |
dies hat, seit der Einführung, u.a. schon so manche langwierige |
40 | 40 |
Bug-Suche verkürzt. Da globale Variablen aber implizit mit Package |
41 | 41 |
angegeben werden, werden die nicht geprüft, und somit kann sich |
42 |
schnell ein Tippfehler einschleichen.</p></div><div class="sect2" title="4.1.3. Kanonische globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6878"></a>4.1.3. Kanonische globale Variablen</h3></div></div></div><p>Um dieses Problem im Griff zu halten gibt es einige wenige
|
|
42 |
schnell ein Tippfehler einschleichen.</p></div><div class="sect2" title="4.1.3. Kanonische globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6897"></a>4.1.3. Kanonische globale Variablen</h3></div></div></div><p>Um dieses Problem im Griff zu halten gibt es einige wenige
|
|
43 | 43 |
globale Variablen, die kanonisch sind, d.h. sie haben bestimmte |
44 | 44 |
vorgegebenen Eigenschaften, und alles andere sollte anderweitig |
45 | 45 |
umhergereicht werden.</p><p>Diese Variablen sind im Moment die folgenden neun:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p> |
... | ... | |
62 | 62 |
<code class="varname">$::request</code> |
63 | 63 |
</p></li></ul></div><p>Damit diese nicht erneut als Müllhalde missbraucht werden, im |
64 | 64 |
Folgenden eine kurze Erläuterung der bestimmten vorgegebenen |
65 |
Eigenschaften (Konventionen):</p><div class="sect3" title="4.1.3.1. $::form"><div class="titlepage"><div><div><h4 class="title"><a name="d0e6942"></a>4.1.3.1. $::form</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Ist ein Objekt der Klasse
|
|
65 |
Eigenschaften (Konventionen):</p><div class="sect3" title="4.1.3.1. $::form"><div class="titlepage"><div><div><h4 class="title"><a name="d0e6961"></a>4.1.3.1. $::form</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Ist ein Objekt der Klasse
|
|
66 | 66 |
"<code class="classname">Form</code>"</p></li><li class="listitem"><p>Wird nach jedem Request gelöscht</p></li><li class="listitem"><p>Muss auch in Tests und Konsolenscripts vorhanden |
67 | 67 |
sein.</p></li><li class="listitem"><p>Enthält am Anfang eines Requests die Requestparameter vom |
68 | 68 |
User</p></li><li class="listitem"><p>Kann zwar intern über Requestgrenzen ein Datenbankhandle |
... | ... | |
110 | 110 |
push @{ $form->{TEMPLATE_ARRAYS}{number} }, $form->{"partnumber_$i"}; |
111 | 111 |
push @{ $form->{TEMPLATE_ARRAYS}{description} }, $form->{"description_$i"}; |
112 | 112 |
# ... |
113 |
}</pre></div><div class="sect3" title="4.1.3.2. %::myconfig"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7026"></a>4.1.3.2. %::myconfig</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Das einzige Hash unter den globalen Variablen</p></li><li class="listitem"><p>Wird spätestens benötigt wenn auf die Datenbank
|
|
113 |
}</pre></div><div class="sect3" title="4.1.3.2. %::myconfig"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7045"></a>4.1.3.2. %::myconfig</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Das einzige Hash unter den globalen Variablen</p></li><li class="listitem"><p>Wird spätestens benötigt wenn auf die Datenbank
|
|
114 | 114 |
zugegriffen wird</p></li><li class="listitem"><p>Wird bei jedem Request neu erstellt.</p></li><li class="listitem"><p>Enthält die Userdaten des aktuellen Logins</p></li><li class="listitem"><p>Sollte nicht ohne Filterung irgendwo gedumpt werden oder |
115 | 115 |
extern serialisiert werden, weil da auch der Datenbankzugriff |
116 | 116 |
für diesen user drinsteht.</p></li><li class="listitem"><p>Enthält unter anderem Datumsformat dateformat und |
... | ... | |
122 | 122 |
überwiegend die Daten, die sich unter <span class="guimenu">Programm</span> |
123 | 123 |
-> <span class="guimenuitem">Einstellungen</span> befinden, bzw. die |
124 | 124 |
Informationen über den Benutzer die über die |
125 |
Administrator-Schnittstelle eingegeben wurden.</p></div><div class="sect3" title="4.1.3.3. $::locale"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7065"></a>4.1.3.3. $::locale</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "Locale"</p></li><li class="listitem"><p>Wird pro Request erstellt</p></li><li class="listitem"><p>Muss auch für Tests und Scripte immer verfügbar
|
|
125 |
Administrator-Schnittstelle eingegeben wurden.</p></div><div class="sect3" title="4.1.3.3. $::locale"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7084"></a>4.1.3.3. $::locale</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "Locale"</p></li><li class="listitem"><p>Wird pro Request erstellt</p></li><li class="listitem"><p>Muss auch für Tests und Scripte immer verfügbar
|
|
126 | 126 |
sein.</p></li><li class="listitem"><p>Cached intern über Requestgrenzen hinweg benutzte |
127 | 127 |
Locales</p></li></ul></div><p>Lokalisierung für den aktuellen User. Alle Übersetzungen, |
128 |
Zahlen- und Datumsformatierungen laufen über dieses Objekt.</p></div><div class="sect3" title="4.1.3.4. $::lxdebug"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7083"></a>4.1.3.4. $::lxdebug</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "LXDebug"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Muss immer verfügbar sein, in nahezu allen
|
|
128 |
Zahlen- und Datumsformatierungen laufen über dieses Objekt.</p></div><div class="sect3" title="4.1.3.4. $::lxdebug"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7102"></a>4.1.3.4. $::lxdebug</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "LXDebug"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Muss immer verfügbar sein, in nahezu allen
|
|
129 | 129 |
Funktionen</p></li></ul></div><p> |
130 | 130 |
<code class="varname">$::lxdebug</code> stellt Debuggingfunktionen |
131 | 131 |
bereit, wie "<code class="function">enter_sub</code>" und |
... | ... | |
135 | 135 |
"<code class="function">message</code>" und "<code class="function">dump</code>" mit |
136 | 136 |
denen man flott Informationen ins Log (tmp/kivitendo-debug.log) |
137 | 137 |
packen kann.</p><p>Beispielsweise so:</p><pre class="programlisting">$main::lxdebug->message(0, 'Meine Konfig:' . Dumper (%::myconfig)); |
138 |
$main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{vc});</pre></div><div class="sect3" title="4.1.3.5. $::auth"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7120"></a>4.1.3.5. $::auth</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "SL::Auth"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Hat eine permanente DB Verbindung zur Authdatenbank</p></li><li class="listitem"><p>Wird nach jedem Request resettet.</p></li></ul></div><p>
|
|
138 |
$main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{vc});</pre></div><div class="sect3" title="4.1.3.5. $::auth"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7139"></a>4.1.3.5. $::auth</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "SL::Auth"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Hat eine permanente DB Verbindung zur Authdatenbank</p></li><li class="listitem"><p>Wird nach jedem Request resettet.</p></li></ul></div><p>
|
|
139 | 139 |
<code class="varname">$::auth</code> stellt Funktionen bereit um die |
140 | 140 |
Rechte des aktuellen Users abzufragen. Obwohl diese Informationen |
141 | 141 |
vom aktuellen User abhängen wird das Objekt aus |
... | ... | |
144 | 144 |
Dessen Einstellungen können über |
145 | 145 |
<code class="literal">$::auth->client</code> abgefragt werden; Rückgabewert |
146 | 146 |
ist ein Hash mit den Werten aus der Tabelle |
147 |
<code class="literal">auth.clients</code>.</p></div><div class="sect3" title="4.1.3.6. $::lx_office_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7149"></a>4.1.3.6. $::lx_office_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
147 |
<code class="literal">auth.clients</code>.</p></div><div class="sect3" title="4.1.3.6. $::lx_office_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7168"></a>4.1.3.6. $::lx_office_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
148 | 148 |
"<code class="classname">SL::LxOfficeConf</code>"</p></li><li class="listitem"><p>Global gecached</p></li><li class="listitem"><p>Repräsentation der |
149 | 149 |
<code class="filename">config/kivitendo.conf[.default]</code>-Dateien</p></li></ul></div><p>Globale Konfiguration. Configdateien werden zum Start gelesen |
150 | 150 |
und danach nicht mehr angefasst. Es ist derzeit nicht geplant, dass |
... | ... | |
154 | 154 |
file_name = /tmp/kivitendo-debug.log</pre><p>ist der Key <code class="varname">file</code> im Programm als |
155 | 155 |
<code class="varname">$::lx_office_conf->{debug}{file}</code> |
156 | 156 |
erreichbar.</p><div class="warning" title="Warnung" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Warning"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Warnung]" src="system/docbook-xsl/images/warning.png"></td><th align="left">Warnung</th></tr><tr><td align="left" valign="top"><p>Zugriff auf die Konfiguration erfolgt im Moment über |
157 |
Hashkeys, sind also nicht gegen Tippfehler abgesichert.</p></td></tr></table></div></div><div class="sect3" title="4.1.3.7. $::instance_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7185"></a>4.1.3.7. $::instance_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
157 |
Hashkeys, sind also nicht gegen Tippfehler abgesichert.</p></td></tr></table></div></div><div class="sect3" title="4.1.3.7. $::instance_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7204"></a>4.1.3.7. $::instance_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
158 | 158 |
"<code class="classname">SL::InstanceConfiguration</code>"</p></li><li class="listitem"><p>wird pro Request neu erstellt</p></li></ul></div><p>Funktioniert wie <code class="varname">$::lx_office_conf</code>, |
159 | 159 |
speichert aber Daten die von der Instanz abhängig sind. Eine Instanz |
160 | 160 |
ist hier eine Mandantendatenbank. Beispielsweise überprüft |
161 | 161 |
</p><pre class="programlisting">$::instance_conf->get_inventory_system eq 'perpetual'</pre><p> |
162 |
ob die berüchtigte Bestandsmethode zur Anwendung kommt.</p></div><div class="sect3" title="4.1.3.8. $::dispatcher"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7206"></a>4.1.3.8. $::dispatcher</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
162 |
ob die berüchtigte Bestandsmethode zur Anwendung kommt.</p></div><div class="sect3" title="4.1.3.8. $::dispatcher"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7225"></a>4.1.3.8. $::dispatcher</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
|
163 | 163 |
"<code class="varname">SL::Dispatcher</code>"</p></li><li class="listitem"><p>wird pro Serverprozess erstellt.</p></li><li class="listitem"><p>enthält Informationen über die technische Verbindung zum |
164 | 164 |
Server</p></li></ul></div><p>Der dritte Punkt ist auch der einzige Grund warum das Objekt |
165 | 165 |
global gespeichert wird. Wird vermutlich irgendwann in einem anderen |
166 |
Objekt untergebracht.</p></div><div class="sect3" title="4.1.3.9. $::request"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7224"></a>4.1.3.9. $::request</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Hashref (evtl später Objekt)</p></li><li class="listitem"><p>Wird pro Request neu initialisiert.</p></li><li class="listitem"><p>Keine Unterstruktur garantiert.</p></li></ul></div><p>
|
|
166 |
Objekt untergebracht.</p></div><div class="sect3" title="4.1.3.9. $::request"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7243"></a>4.1.3.9. $::request</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Hashref (evtl später Objekt)</p></li><li class="listitem"><p>Wird pro Request neu initialisiert.</p></li><li class="listitem"><p>Keine Unterstruktur garantiert.</p></li></ul></div><p>
|
|
167 | 167 |
<code class="varname">$::request</code> ist ein generischer Platz um |
168 | 168 |
Daten "für den aktuellen Request" abzulegen. Sollte nicht für action |
169 | 169 |
at a distance benutzt werden, sondern um lokales memoizing zu |
... | ... | |
176 | 176 |
<code class="varname">$::request</code> |
177 | 177 |
</p></li><li class="listitem"><p>Muss ich von anderen Teilen des Programms lesend drauf |
178 | 178 |
zugreifen? Dann <code class="varname">$::request</code>, aber Zugriff über |
179 |
Wrappermethode</p></li></ul></div></div></div><div class="sect2" title="4.1.4. Ehemalige globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e7266"></a>4.1.4. Ehemalige globale Variablen</h3></div></div></div><p>Die folgenden Variablen waren einmal im Programm, und wurden
|
|
180 |
entfernt.</p><div class="sect3" title="4.1.4.1. $::cgi"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7271"></a>4.1.4.1. $::cgi</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war nötig, weil cookie Methoden nicht als
|
|
179 |
Wrappermethode</p></li></ul></div></div></div><div class="sect2" title="4.1.4. Ehemalige globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e7285"></a>4.1.4. Ehemalige globale Variablen</h3></div></div></div><p>Die folgenden Variablen waren einmal im Programm, und wurden
|
|
180 |
entfernt.</p><div class="sect3" title="4.1.4.1. $::cgi"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7290"></a>4.1.4.1. $::cgi</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war nötig, weil cookie Methoden nicht als
|
|
181 | 181 |
Klassenfunktionen funktionieren</p></li><li class="listitem"><p>Aufruf als Klasse erzeugt Dummyobjekt was im |
182 | 182 |
Klassennamespace gehalten wird und über Requestgrenzen |
183 | 183 |
leaked</p></li><li class="listitem"><p>liegt jetzt unter |
184 | 184 |
<code class="varname">$::request->{cgi}</code> |
185 |
</p></li></ul></div></div><div class="sect3" title="4.1.4.2. $::all_units"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7287"></a>4.1.4.2. $::all_units</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war nötig, weil einige Funktionen in Schleifen zum Teil
|
|
185 |
</p></li></ul></div></div><div class="sect3" title="4.1.4.2. $::all_units"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7306"></a>4.1.4.2. $::all_units</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war nötig, weil einige Funktionen in Schleifen zum Teil
|
|
186 | 186 |
ein paar hundert mal pro Request eine Liste der Einheiten |
187 | 187 |
brauchen, und de als Parameter durch einen Riesenstack von |
188 | 188 |
Funktionen geschleift werden müssten.</p></li><li class="listitem"><p>Liegt jetzt unter |
189 | 189 |
<code class="varname">$::request->{cache}{all_units}</code> |
190 | 190 |
</p></li><li class="listitem"><p>Wird nur in |
191 | 191 |
<code class="function">AM->retrieve_all_units()</code> gesetzt oder |
192 |
gelesen.</p></li></ul></div></div><div class="sect3" title="4.1.4.3. %::called_subs"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7306"></a>4.1.4.3. %::called_subs</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>wurde benutzt um callsub deep recursions
|
|
192 |
gelesen.</p></li></ul></div></div><div class="sect3" title="4.1.4.3. %::called_subs"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7325"></a>4.1.4.3. %::called_subs</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>wurde benutzt um callsub deep recursions
|
|
193 | 193 |
abzufangen.</p></li><li class="listitem"><p>Wurde entfernt, weil callsub nur einen Bruchteil der |
194 | 194 |
möglichen Rekursioenen darstellt, und da nie welche |
195 | 195 |
auftreten.</p></li><li class="listitem"><p>komplette recursion protection wurde entfernt.</p></li></ul></div></div></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s09.html">Zurück</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch04s02.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top">3.9. Webshop-Api </td><td width="20%" align="center"><a accesskey="h" href="index.html">Zum Anfang</a></td><td width="40%" align="right" valign="top"> 4.2. Entwicklung unter FastCGI</td></tr></table></div></body></html> |
doc/html/index.html | ||
---|---|---|
2 | 2 |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
3 | 3 |
<title>kivitendo 3.5.1: Installation, Konfiguration, Entwicklung</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="next" href="ch01.html" title="Kapitel 1. Aktuelle Hinweise"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">kivitendo 3.5.1: Installation, Konfiguration, |
4 | 4 |
Entwicklung</th></tr><tr><td width="20%" align="left"> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch01.html">Weiter</a></td></tr></table><hr></div><div lang="de" class="book" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><div class="titlepage"><div><div><h1 class="title"><a name="kivitendo-documentation"></a>kivitendo 3.5.1: Installation, Konfiguration, |
5 |
Entwicklung</h1></div></div><hr></div><div class="toc"><p><b>Inhaltsverzeichnis</b></p><dl><dt><span class="chapter"><a href="ch01.html">1. Aktuelle Hinweise</a></span></dt><dt><span class="chapter"><a href="ch02.html">2. Installation und Grundkonfiguration</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch02.html#Installation-%C3%9Cbersicht">2.1. Übersicht</a></span></dt><dt><span class="sect1"><a href="ch02s02.html">2.2. Benötigte Software und Pakete</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s02.html#Betriebssystem">2.2.1. Betriebssystem</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#Pakete">2.2.2. Benötigte Perl-Pakete installieren</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e521">2.2.3. Andere Pakete installieren</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s03.html">2.3. Manuelle Installation des Programmpaketes</a></span></dt><dt><span class="sect1"><a href="ch02s04.html">2.4. kivitendo-Konfigurationsdatei</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s04.html#config.config-file.introduction">2.4.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch02s04.html#config.config-file.sections-parameters">2.4.2. Abschnitte und Parameter</a></span></dt><dt><span class="sect2"><a href="ch02s04.html#config.config-file.prior-versions">2.4.3. Versionen vor 2.6.3</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s05.html">2.5. Anpassung der PostgreSQL-Konfiguration</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s05.html#Zeichens%C3%A4tze-die-Verwendung-von-UTF-8">2.5.1. Zeichensätze/die Verwendung von Unicode/UTF-8</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#%C3%84nderungen-an-Konfigurationsdateien">2.5.2. Änderungen an Konfigurationsdateien</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Erweiterung-f%C3%BCr-servergespeicherte-Prozeduren">2.5.3. Erweiterung für servergespeicherte Prozeduren</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Erweiterung-f%C3%BCr-trigram">2.5.4. Erweiterung für Trigram Prozeduren</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Datenbankbenutzer-anlegen">2.5.5. Datenbankbenutzer anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s06.html">2.6. Webserver-Konfiguration</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s06.html#d0e977">2.6.1. Grundkonfiguration mittels CGI</a></span></dt><dt><span class="sect2"><a href="ch02s06.html#Apache-Konfiguration.FCGI">2.6.2. Konfiguration für FastCGI/FCGI</a></span></dt><dt><span class="sect2"><a href="ch02s06.html#d0e1128">2.6.3. Weitergehende Konfiguration</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s07.html">2.7. Der Task-Server</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s07.html#Konfiguration-des-Task-Servers">2.7.1. Verfügbare und notwendige Konfigurationsoptionen</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Konfiguration-der-Mandanten-fuer-den-Task-Servers">2.7.2. Konfiguration der Mandanten für den Task-Server</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Einbinden-in-den-Boot-Prozess">2.7.3. Automatisches Starten des Task-Servers beim Booten</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Prozesskontrolle">2.7.4. Wie der Task-Server gestartet und beendet wird</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s08.html">2.8. Benutzerauthentifizierung und Administratorpasswort</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s08.html#Grundlagen-zur-Benutzerauthentifizierung">2.8.1. Grundlagen zur Benutzerauthentifizierung</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Administratorpasswort">2.8.2. Administratorpasswort</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Authentifizierungsdatenbank">2.8.3. Authentifizierungsdatenbank</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Passwort%C3%BCberpr%C3%BCfung">2.8.4. Passwortüberprüfung</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Name-des-Session-Cookies">2.8.5. Name des Session-Cookies</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Anlegen-der-Authentifizierungsdatenbank">2.8.6. Anlegen der Authentifizierungsdatenbank</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s09.html">2.9. Mandanten-, Benutzer- und Gruppenverwaltung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s09.html#Zusammenh%C3%A4nge">2.9.1. Zusammenhänge</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Mandanten-Benutzer-Gruppen">2.9.2. Mandanten, Benutzer und Gruppen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Datenbanken-anlegen">2.9.3. Datenbanken anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Gruppen-anlegen">2.9.4. Gruppen anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Benutzer-anlegen">2.9.5. Benutzer anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Mandanten-anlegen">2.9.6. Mandanten anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s10.html">2.10. Drucker- und Systemverwaltung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s10.html#Druckeradministration">2.10.1. Druckeradministration</a></span></dt><dt><span class="sect2"><a href="ch02s10.html#System">2.10.2. System sperren / entsperren</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s11.html">2.11. E-Mail-Versand aus kivitendo heraus</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s11.html#config.sending-email.sendmail">2.11.1. Versand über lokalen E-Mail-Server</a></span></dt><dt><span class="sect2"><a href="ch02s11.html#config.sending-email.smtp">2.11.2. Versand über einen SMTP-Server</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s12.html">2.12. Drucken mit kivitendo</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s12.html#Vorlagenverzeichnis-anlegen">2.12.1. Vorlagenverzeichnis anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#Vorlagen-RB">2.12.2. Der Druckvorlagensatz RB</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#f-tex">2.12.3. f-tex</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#Vorlagen-rev-odt">2.12.4. Der Druckvorlagensatz rev-odt</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#allgemeine-hinweise-zu-latex">2.12.5. Allgemeine Hinweise zu LaTeX Vorlagen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s13.html">2.13. OpenDocument-Vorlagen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s13.html#d0e2293">2.13.1. OpenDocument (odt) Druckvorlagen mit Makros</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s14.html">2.14. Nomenklatur</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s14.html#booking.dates">2.14.1. Datum bei Buchungen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s15.html">2.15. Konfiguration zur Einnahmenüberschussrechnung/Bilanzierung:
|
|
5 |
Entwicklung</h1></div></div><hr></div><div class="toc"><p><b>Inhaltsverzeichnis</b></p><dl><dt><span class="chapter"><a href="ch01.html">1. Aktuelle Hinweise</a></span></dt><dt><span class="chapter"><a href="ch02.html">2. Installation und Grundkonfiguration</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch02.html#Installation-%C3%9Cbersicht">2.1. Übersicht</a></span></dt><dt><span class="sect1"><a href="ch02s02.html">2.2. Benötigte Software und Pakete</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s02.html#Betriebssystem">2.2.1. Betriebssystem</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#Pakete">2.2.2. Benötigte Perl-Pakete installieren</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e540">2.2.3. Andere Pakete installieren</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s03.html">2.3. Manuelle Installation des Programmpaketes</a></span></dt><dt><span class="sect1"><a href="ch02s04.html">2.4. kivitendo-Konfigurationsdatei</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s04.html#config.config-file.introduction">2.4.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch02s04.html#config.config-file.sections-parameters">2.4.2. Abschnitte und Parameter</a></span></dt><dt><span class="sect2"><a href="ch02s04.html#config.config-file.prior-versions">2.4.3. Versionen vor 2.6.3</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s05.html">2.5. Anpassung der PostgreSQL-Konfiguration</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s05.html#Zeichens%C3%A4tze-die-Verwendung-von-UTF-8">2.5.1. Zeichensätze/die Verwendung von Unicode/UTF-8</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#%C3%84nderungen-an-Konfigurationsdateien">2.5.2. Änderungen an Konfigurationsdateien</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Erweiterung-f%C3%BCr-servergespeicherte-Prozeduren">2.5.3. Erweiterung für servergespeicherte Prozeduren</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Erweiterung-f%C3%BCr-trigram">2.5.4. Erweiterung für Trigram Prozeduren</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Datenbankbenutzer-anlegen">2.5.5. Datenbankbenutzer anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s06.html">2.6. Webserver-Konfiguration</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s06.html#d0e996">2.6.1. Grundkonfiguration mittels CGI</a></span></dt><dt><span class="sect2"><a href="ch02s06.html#Apache-Konfiguration.FCGI">2.6.2. Konfiguration für FastCGI/FCGI</a></span></dt><dt><span class="sect2"><a href="ch02s06.html#d0e1147">2.6.3. Weitergehende Konfiguration</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s07.html">2.7. Der Task-Server</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s07.html#Konfiguration-des-Task-Servers">2.7.1. Verfügbare und notwendige Konfigurationsoptionen</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Konfiguration-der-Mandanten-fuer-den-Task-Servers">2.7.2. Konfiguration der Mandanten für den Task-Server</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Einbinden-in-den-Boot-Prozess">2.7.3. Automatisches Starten des Task-Servers beim Booten</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Prozesskontrolle">2.7.4. Wie der Task-Server gestartet und beendet wird</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s08.html">2.8. Benutzerauthentifizierung und Administratorpasswort</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s08.html#Grundlagen-zur-Benutzerauthentifizierung">2.8.1. Grundlagen zur Benutzerauthentifizierung</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Administratorpasswort">2.8.2. Administratorpasswort</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Authentifizierungsdatenbank">2.8.3. Authentifizierungsdatenbank</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Passwort%C3%BCberpr%C3%BCfung">2.8.4. Passwortüberprüfung</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Name-des-Session-Cookies">2.8.5. Name des Session-Cookies</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Anlegen-der-Authentifizierungsdatenbank">2.8.6. Anlegen der Authentifizierungsdatenbank</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s09.html">2.9. Mandanten-, Benutzer- und Gruppenverwaltung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s09.html#Zusammenh%C3%A4nge">2.9.1. Zusammenhänge</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Mandanten-Benutzer-Gruppen">2.9.2. Mandanten, Benutzer und Gruppen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Datenbanken-anlegen">2.9.3. Datenbanken anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Gruppen-anlegen">2.9.4. Gruppen anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Benutzer-anlegen">2.9.5. Benutzer anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Mandanten-anlegen">2.9.6. Mandanten anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s10.html">2.10. Drucker- und Systemverwaltung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s10.html#Druckeradministration">2.10.1. Druckeradministration</a></span></dt><dt><span class="sect2"><a href="ch02s10.html#System">2.10.2. System sperren / entsperren</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s11.html">2.11. E-Mail-Versand aus kivitendo heraus</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s11.html#config.sending-email.sendmail">2.11.1. Versand über lokalen E-Mail-Server</a></span></dt><dt><span class="sect2"><a href="ch02s11.html#config.sending-email.smtp">2.11.2. Versand über einen SMTP-Server</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s12.html">2.12. Drucken mit kivitendo</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s12.html#Vorlagenverzeichnis-anlegen">2.12.1. Vorlagenverzeichnis anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#Vorlagen-RB">2.12.2. Der Druckvorlagensatz RB</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#f-tex">2.12.3. f-tex</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#Vorlagen-rev-odt">2.12.4. Der Druckvorlagensatz rev-odt</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#allgemeine-hinweise-zu-latex">2.12.5. Allgemeine Hinweise zu LaTeX Vorlagen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s13.html">2.13. OpenDocument-Vorlagen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s13.html#d0e2312">2.13.1. OpenDocument (odt) Druckvorlagen mit Makros</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s14.html">2.14. Nomenklatur</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s14.html#booking.dates">2.14.1. Datum bei Buchungen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s15.html">2.15. Konfiguration zur Einnahmenüberschussrechnung/Bilanzierung:
|
|
6 | 6 |
EUR</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s15.html#config.eur.introduction">2.15.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch02s15.html#config.eur.parameters">2.15.2. Konfigurationsparameter</a></span></dt><dt><span class="sect2"><a href="ch02s15.html#config.eur.setting-parameters">2.15.3. Festlegen der Parameter</a></span></dt><dt><span class="sect2"><a href="ch02s15.html#config.eur.inventory-system-perpetual">2.15.4. Bemerkungen zur Bestandsmethode</a></span></dt><dt><span class="sect2"><a href="ch02s15.html#config.eur.knonw-issues">2.15.5. Bekannte Probleme</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s16.html">2.16. SKR04 19% Umstellung für innergemeinschaftlichen Erwerb</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s16.html#config.skr04-update-3804.introduction">2.16.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch02s16.html#config.skr04-update-3804.create-chart">2.16.2. Konto 3804 manuell anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s17.html">2.17. Verhalten des Bilanzberichts</a></span></dt><dt><span class="sect1"><a href="ch02s18.html">2.18. Erfolgsrechnung</a></span></dt><dt><span class="sect1"><a href="ch02s19.html">2.19. Rundung in Verkaufsbelegen</a></span></dt><dt><span class="sect1"><a href="ch02s20.html">2.20. Einstellungen pro Mandant</a></span></dt><dt><span class="sect1"><a href="ch02s21.html">2.21. kivitendo ERP verwenden</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch03.html">3. Features und Funktionen</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch03.html#features.periodic-invoices">3.1. Wiederkehrende Rechnungen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.introduction">3.1.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.configuration">3.1.2. Konfiguration</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.variables">3.1.3. Spezielle Variablen</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.reports">3.1.4. Auflisten</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.task-server">3.1.5. Erzeugung der eigentlichen Rechnungen</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.create-for-current-month">3.1.6. Erste Rechnung für aktuellen Monat erstellen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s02.html">3.2. Bankerweiterung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s02.html#features.bank.introduction">3.2.1. Einführung</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s03.html">3.3. Dokumentenvorlagen und verfügbare Variablen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.einf%C3%BChrung">3.3.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.variablen-ausgeben">3.3.2. Variablen ausgeben</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.verwendung-in-druckbefehlen">3.3.3. Verwendung in Druckbefehlen</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.tag-style">3.3.4. Anfang und Ende der Tags verändern</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.zuordnung-dateinamen">3.3.5. Zuordnung von den Dateinamen zu den Funktionen</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.dateinamen-erweitert">3.3.6. Sprache, Drucker und E-Mail</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.allgemeine-variablen">3.3.7. Allgemeine Variablen, die in allen Vorlagen vorhanden |
7 | 7 |
sind</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.invoice">3.3.8. Variablen in Rechnungen</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.dunning">3.3.9. Variablen in Mahnungen und Rechnungen über Mahngebühren</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.andere-vorlagen">3.3.10. Variablen in anderen Vorlagen</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.bloecke">3.3.11. Blöcke, bedingte Anweisungen und Schleifen</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.markup">3.3.12. Markup-Code zur Textformatierung innerhalb von |
8 |
Formularen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s04.html">3.4. Excel-Vorlagen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s04.html#excel-templates.summary">3.4.1. Zusammenfassung</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#excel-templates.usage">3.4.2. Bedienung</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#excel-templates.syntax">3.4.3. Variablensyntax</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#excel-templates.limitations">3.4.4. Einschränkungen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s05.html">3.5. Mandantenkonfiguration Lager</a></span></dt><dt><span class="sect1"><a href="ch03s06.html">3.6. Schweizer Kontenpläne</a></span></dt><dt><span class="sect1"><a href="ch03s07.html">3.7. Artikelklassifizierung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s07.html#d0e6363">3.7.1. Übersicht</a></span></dt><dt><span class="sect2"><a href="ch03s07.html#d0e6368">3.7.2. Basisklassifizierung</a></span></dt><dt><span class="sect2"><a href="ch03s07.html#d0e6398">3.7.3. Attribute</a></span></dt><dt><span class="sect2"><a href="ch03s07.html#d0e6429">3.7.4. Zwei-Zeichen Abkürzung</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s08.html">3.8. Dateiverwaltung (Mini-DMS)</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s08.html#d0e6441">3.8.1. Übersicht</a></span></dt><dt><span class="sect2"><a href="ch03s08.html#d0e6468">3.8.2. Struktur</a></span></dt><dt><span class="sect2"><a href="ch03s08.html#d0e6520">3.8.3. Anwendung</a></span></dt><dt><span class="sect2"><a href="ch03s08.html#d0e6563">3.8.4. Konfigurierung</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s09.html">3.9. Webshop-Api</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s09.html#d0e6628">3.9.1. Rechte für die Webshopapi</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6643">3.9.2. Konfiguration</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6651">3.9.3. Webshopartikel</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6675">3.9.4. Bestellimport</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6728">3.9.5. Mapping der Daten</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="ch04.html">4. Entwicklerdokumentation</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch04.html#devel.globals">4.1. Globale Variablen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04.html#d0e6744">4.1.1. Wie sehen globale Variablen in Perl aus?</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e6845">4.1.2. Warum sind globale Variablen ein Problem?</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e6878">4.1.3. Kanonische globale Variablen</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e7266">4.1.4. Ehemalige globale Variablen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s02.html">4.2. Entwicklung unter FastCGI</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.general">4.2.1. Allgemeines</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.exiting">4.2.2. Programmende und Ausnahmen</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.globals">4.2.3. Globale Variablen</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.performance">4.2.4. Performance und Statistiken</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s03.html">4.3. SQL-Upgradedateien</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.introduction">4.3.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.format">4.3.2. Format der Kontrollinformationen</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.format-perl-files">4.3.3. Format von in Perl geschriebenen
|
|
8 |
Formularen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s04.html">3.4. Excel-Vorlagen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s04.html#excel-templates.summary">3.4.1. Zusammenfassung</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#excel-templates.usage">3.4.2. Bedienung</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#excel-templates.syntax">3.4.3. Variablensyntax</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#excel-templates.limitations">3.4.4. Einschränkungen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s05.html">3.5. Mandantenkonfiguration Lager</a></span></dt><dt><span class="sect1"><a href="ch03s06.html">3.6. Schweizer Kontenpläne</a></span></dt><dt><span class="sect1"><a href="ch03s07.html">3.7. Artikelklassifizierung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s07.html#d0e6382">3.7.1. Übersicht</a></span></dt><dt><span class="sect2"><a href="ch03s07.html#d0e6387">3.7.2. Basisklassifizierung</a></span></dt><dt><span class="sect2"><a href="ch03s07.html#d0e6417">3.7.3. Attribute</a></span></dt><dt><span class="sect2"><a href="ch03s07.html#d0e6448">3.7.4. Zwei-Zeichen Abkürzung</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s08.html">3.8. Dateiverwaltung (Mini-DMS)</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s08.html#d0e6460">3.8.1. Übersicht</a></span></dt><dt><span class="sect2"><a href="ch03s08.html#d0e6487">3.8.2. Struktur</a></span></dt><dt><span class="sect2"><a href="ch03s08.html#d0e6539">3.8.3. Anwendung</a></span></dt><dt><span class="sect2"><a href="ch03s08.html#d0e6582">3.8.4. Konfigurierung</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s09.html">3.9. Webshop-Api</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s09.html#d0e6647">3.9.1. Rechte für die Webshopapi</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6662">3.9.2. Konfiguration</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6670">3.9.3. Webshopartikel</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6694">3.9.4. Bestellimport</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6747">3.9.5. Mapping der Daten</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="ch04.html">4. Entwicklerdokumentation</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch04.html#devel.globals">4.1. Globale Variablen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04.html#d0e6763">4.1.1. Wie sehen globale Variablen in Perl aus?</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e6864">4.1.2. Warum sind globale Variablen ein Problem?</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e6897">4.1.3. Kanonische globale Variablen</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e7285">4.1.4. Ehemalige globale Variablen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s02.html">4.2. Entwicklung unter FastCGI</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.general">4.2.1. Allgemeines</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.exiting">4.2.2. Programmende und Ausnahmen</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.globals">4.2.3. Globale Variablen</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.performance">4.2.4. Performance und Statistiken</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s03.html">4.3. SQL-Upgradedateien</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.introduction">4.3.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.format">4.3.2. Format der Kontrollinformationen</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.format-perl-files">4.3.3. Format von in Perl geschriebenen
|
|
9 | 9 |
Datenbankupgradescripten</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.dbupgrade-tool">4.3.4. Hilfsscript dbupgrade2_tool.pl</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s04.html">4.4. Translations and languages</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s04.html#translations-languages.introduction">4.4.1. Introduction</a></span></dt><dt><span class="sect2"><a href="ch04s04.html#translations-languages.character-set">4.4.2. Character set</a></span></dt><dt><span class="sect2"><a href="ch04s04.html#translations-languages.file-structure">4.4.3. File structure</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s05.html">4.5. Die kivitendo-Test-Suite</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.intro">4.5.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.prerequisites">4.5.2. Voraussetzungen</a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.execution">4.5.3. Existierende Tests ausführen</a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.meaning_of_scripts">4.5.4. Bedeutung der verschiedenen Test-Scripte</a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.create_new">4.5.5. Neue Test-Scripte erstellen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s06.html">4.6. Stil-Richtlinien</a></span></dt><dt><span class="sect1"><a href="ch04s07.html">4.7. Dokumentation erstellen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s07.html#devel.build-doc.introduction">4.7.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch04s07.html#devel.build-doc.required-software">4.7.2. Benötigte Software</a></span></dt><dt><span class="sect2"><a href="ch04s07.html#devel.build-doc.build">4.7.3. PDFs und HTML-Seiten erstellen</a></span></dt><dt><span class="sect2"><a href="ch04s07.html#devel.build-doc.repository">4.7.4. Einchecken in das Git-Repository</a></span></dt></dl></dd></dl></dd></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch01.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"> </td><td width="40%" align="right" valign="top"> Kapitel 1. Aktuelle Hinweise</td></tr></table></div></body></html> |
modules/fallback/Daemon/Generic.pm | ||
---|---|---|
1 |
|
|
2 |
# Copyright (C) 2006, David Muir Sharnoff <perl@dave.sharnoff.org> |
|
3 |
|
|
4 |
package Daemon::Generic; |
|
5 |
|
|
6 |
use strict; |
|
7 |
use warnings; |
|
8 |
require Exporter; |
|
9 |
require POSIX; |
|
10 |
use Getopt::Long; |
|
11 |
use File::Slurp; |
|
12 |
use File::Flock; |
|
13 |
our @ISA = qw(Exporter); |
|
14 |
our @EXPORT = qw(newdaemon); |
|
15 |
|
|
16 |
our $VERSION = 0.71; |
|
17 |
|
|
18 |
our $force_quit_delay = 15; |
|
19 |
our $package = __PACKAGE__; |
|
20 |
our $caller; |
|
21 |
|
|
22 |
sub newdaemon |
|
23 |
{ |
|
24 |
my (%args) = @_; |
|
25 |
my $pkg = $caller || caller() || 'main'; |
|
26 |
|
|
27 |
my $foo = bless {}, $pkg; |
|
28 |
|
|
29 |
unless ($foo->isa($package)) { |
|
30 |
no strict qw(refs); |
|
31 |
my $isa = \@{"${pkg}::ISA"}; |
|
32 |
unshift(@$isa, $package); |
|
33 |
} |
|
34 |
|
|
35 |
bless $foo, 'This::Package::Does::Not::Exist'; |
|
36 |
undef $foo; |
|
37 |
|
|
38 |
new($pkg, %args); |
|
39 |
} |
|
40 |
|
|
41 |
sub new |
|
42 |
{ |
|
43 |
my ($pkg, %args) = @_; |
|
44 |
|
|
45 |
if ($pkg eq __PACKAGE__) { |
|
46 |
$pkg = caller() || 'main'; |
|
47 |
} |
|
48 |
|
|
49 |
srand(time ^ ($$ << 5)) |
|
50 |
unless $args{no_srand}; |
|
51 |
|
|
52 |
my $av0 = $0; |
|
53 |
$av0 =~ s!/!/.!g; |
|
54 |
|
|
55 |
my $self = { |
|
56 |
gd_args => \%args, |
|
57 |
gd_pidfile => $args{pidfile}, |
|
58 |
gd_logpriority => $args{logpriority}, |
|
59 |
gd_progname => $args{progname} |
|
60 |
? $args{progname} |
|
61 |
: $0, |
|
62 |
gd_pidbase => $args{pidbase} |
|
63 |
? $args{pidbase} |
|
64 |
: ($args{progname} |
|
65 |
? "/var/run/$args{progname}" |
|
66 |
: "/var/run/$av0"), |
|
67 |
gd_foreground => $args{foreground} || 0, |
|
68 |
configfile => $args{configfile} |
|
69 |
? $args{configfile} |
|
70 |
: ($args{progname} |
|
71 |
? "/etc/$args{progname}.conf" |
|
72 |
: "/etc/$av0"), |
|
73 |
debug => $args{debug} || 0, |
|
74 |
}; |
|
75 |
bless $self, $pkg; |
|
76 |
|
|
77 |
$self->gd_getopt; |
|
78 |
$self->gd_parse_argv; |
|
79 |
|
|
80 |
my $do = $self->{do} = $ARGV[0]; |
|
81 |
|
|
82 |
$self->gd_help if $do eq 'help'; |
|
83 |
$self->gd_version if $do eq 'version'; |
|
84 |
$self->gd_install if $do eq 'install'; |
|
85 |
$self->gd_uninstall if $do eq 'uninstall'; |
|
86 |
|
|
87 |
$self->gd_pidfile unless $self->{gd_pidfile}; |
|
88 |
|
|
89 |
my %newconfig = $self->gd_preconfig; |
|
90 |
|
|
91 |
$self->{gd_pidfile} = $newconfig{pidfile} if $newconfig{pidfile}; |
|
92 |
|
|
93 |
print "Configuration looks okay\n" if $do eq 'check'; |
|
94 |
|
|
95 |
my $pidfile = $self->{gd_pidfile}; |
|
96 |
my $killed = 0; |
|
97 |
my $locked = 0; |
|
98 |
if (-e $pidfile) { |
|
99 |
if ($locked = lock($pidfile, undef, 'nonblocking')) { |
|
100 |
# old process is dead |
|
101 |
if ($do eq 'status') { |
|
102 |
print "$0 dead\n"; |
|
103 |
exit 1; |
|
104 |
} |
|
105 |
} else { |
|
106 |
sleep(2) if -M $pidfile < 2/86400; |
|
107 |
my $oldpid = read_file($pidfile); |
|
108 |
chomp($oldpid); |
|
109 |
if ($oldpid) { |
|
110 |
if ($do eq 'stop' or $do eq 'restart') { |
|
111 |
$killed = $self->gd_kill($oldpid); |
|
112 |
$locked = lock($pidfile); |
|
113 |
if ($do eq 'stop') { |
|
114 |
unlink($pidfile); |
|
115 |
exit; |
|
116 |
} |
|
117 |
} elsif ($do eq 'reload') { |
|
118 |
if (kill(1,$oldpid)) { |
|
119 |
print "Requested reconfiguration\n"; |
|
120 |
exit; |
|
121 |
} else { |
|
122 |
print "Kill failed: $!\n"; |
|
123 |
} |
|
124 |
} elsif ($do eq 'status') { |
|
125 |
if (kill(0,$oldpid)) { |
|
126 |
print "$0 running - pid $oldpid\n"; |
|
127 |
$self->gd_check($pidfile, $oldpid); |
|
128 |
exit 0; |
|
129 |
} else { |
|
130 |
print "$0 dead\n"; |
|
131 |
exit 1; |
|
132 |
} |
|
133 |
} elsif ($do eq 'check') { |
|
134 |
if (kill(0,$oldpid)) { |
|
135 |
print "$0 running - pid $oldpid\n"; |
|
136 |
$self->gd_check($pidfile, $oldpid); |
|
137 |
exit; |
|
138 |
} |
|
139 |
} elsif ($do eq 'start') { |
|
140 |
print "\u$self->{gd_progname} is already running (pid $oldpid)\n"; |
|
141 |
exit; # according to LSB, this is no error |
|
142 |
} |
|
143 |
} else { |
|
144 |
$self->gd_error("Pid file $pidfile is invalid but locked, exiting\n"); |
|
145 |
} |
|
146 |
} |
|
147 |
} else { |
|
148 |
$locked = lock($pidfile, undef, 'nonblocking') |
|
149 |
or die "Could not lock pid file $pidfile: $!"; |
|
150 |
} |
|
151 |
|
|
152 |
if ($do eq 'reload' || $do eq 'stop' || $do eq 'check' || ($do eq 'restart' && ! $killed)) { |
|
153 |
print "No $0 running\n"; |
|
154 |
} |
|
155 |
|
|
156 |
if ($do eq 'stop') { |
|
157 |
unlink($pidfile); |
|
158 |
exit; |
|
159 |
} |
|
160 |
|
|
161 |
if ($do eq 'status') { |
|
162 |
print "Unused\n"; |
|
163 |
exit 3; |
|
164 |
} |
|
165 |
|
|
166 |
if ($do eq 'check') { |
|
167 |
$self->gd_check($pidfile); |
|
168 |
exit |
|
169 |
} |
|
170 |
|
|
171 |
unless ($do eq 'reload' || $do eq 'restart' || $do eq 'start') { |
|
172 |
$self->gd_other_cmd($do, $locked); |
|
173 |
} |
|
174 |
|
|
175 |
unless ($self->{gd_foreground}) { |
|
176 |
$self->gd_daemonize; |
|
177 |
} |
|
178 |
|
|
179 |
$locked or lock($pidfile, undef, 'nonblocking') |
|
180 |
or die "Could not lock PID file $pidfile: $!"; |
|
181 |
|
|
182 |
write_file($pidfile, "$$\n"); |
|
183 |
|
|
184 |
print STDERR "Starting up...\n"; |
|
185 |
|
|
186 |
$self->gd_postconfig(%newconfig); |
|
187 |
|
|
188 |
$self->gd_setup_signals; |
|
189 |
|
|
190 |
$self->gd_run; |
|
191 |
|
|
192 |
unlink($pidfile); |
|
193 |
exit(0); |
|
194 |
} |
|
195 |
|
|
196 |
sub gd_check {} |
|
197 |
|
|
198 |
sub gd_more_opt { return() } |
|
199 |
|
|
200 |
sub gd_getopt |
|
201 |
{ |
|
202 |
my $self = shift; |
|
203 |
Getopt::Long::Configure("auto_version"); |
|
204 |
GetOptions( |
|
205 |
'configfile=s' => \$self->{configfile}, |
|
206 |
'foreground!' => \$self->{gd_foreground}, |
|
207 |
'debug!' => \$self->{debug}, |
|
208 |
$self->{gd_args}{options} |
|
209 |
? %{$self->{gd_args}{options}} |
|
210 |
: (), |
|
211 |
$self->gd_more_opt(), |
|
212 |
) or exit($self->gd_usage()); |
|
213 |
|
|
214 |
if (@ARGV < ($self->{gd_args}{minimum_args} || 1)) { |
|
215 |
exit($self->gd_usage()); |
|
216 |
} |
|
217 |
if (@ARGV > ($self->{gd_args}{maximum_args} || 1)) { |
|
218 |
exit($self->gd_usage()); |
|
219 |
} |
|
220 |
} |
|
221 |
|
|
222 |
sub gd_parse_argv { } |
|
223 |
|
|
224 |
sub gd_help |
|
225 |
{ |
|
226 |
my $self = shift; |
|
227 |
exit($self->gd_usage($self->{gd_args})); |
|
228 |
} |
|
229 |
|
|
230 |
sub gd_version |
|
231 |
{ |
|
232 |
my $self = shift; |
|
233 |
no strict qw(refs); |
|
234 |
my $v = $self->{gd_args}{version} |
|
235 |
|| ${ref($self)."::VERSION"} |
|
236 |
|| $::VERSION |
|
237 |
|| $main::VERSION |
|
238 |
|| "?"; |
|
239 |
print "$self->{gd_progname} - version $v\n";; |
|
240 |
exit; |
|
241 |
} |
|
242 |
|
|
243 |
sub gd_pidfile |
|
244 |
{ |
|
245 |
my $self = shift; |
|
246 |
my $x = $self->{configfile}; |
|
247 |
$x =~ s!/!.!g; |
|
248 |
$self->{gd_pidfile} = "$self->{gd_pidbase}$x.pid"; |
|
249 |
} |
|
250 |
|
|
251 |
sub gd_other_cmd |
|
252 |
{ |
|
253 |
my $self = shift; |
|
254 |
$self->gd_usage; |
|
255 |
exit(1); |
|
256 |
} |
|
257 |
|
|
258 |
sub gd_redirect_output |
|
259 |
{ |
|
260 |
my $self = shift; |
|
261 |
return if $self->{gd_foreground}; |
|
262 |
my $logname = $self->gd_logname; |
|
263 |
my $p = $self->{gd_logpriority} ? "-p $self->{gd_logpriority}" : ""; |
|
264 |
open(STDERR, "|logger $p -t '$logname'") or (print "could not open stderr: $!" && exit(1)); |
|
265 |
close(STDOUT); |
|
266 |
open(STDOUT, ">&STDERR") or die "redirect STDOUT -> STDERR: $!"; |
|
267 |
close(STDIN); |
|
268 |
} |
|
269 |
|
|
270 |
sub gd_daemonize |
|
271 |
{ |
|
272 |
my $self = shift; |
|
273 |
print "Starting $self->{gd_progname} server\n"; |
|
274 |
$self->gd_redirect_output(); |
|
275 |
my $pid; |
|
276 |
POSIX::_exit(0) if $pid = fork; |
|
277 |
die "Could not fork: $!" unless defined $pid; |
|
278 |
POSIX::_exit(0) if $pid = fork; |
|
279 |
die "Could not fork: $!" unless defined $pid; |
|
280 |
|
|
281 |
POSIX::setsid(); |
|
282 |
select(STDERR); |
|
283 |
$| = 1; |
|
284 |
print "Sucessfully daemonized\n"; |
|
285 |
} |
|
286 |
|
|
287 |
sub gd_logname |
|
288 |
{ |
|
289 |
my $self = shift; |
|
290 |
return $self->{gd_progname}."[$$]"; |
|
291 |
} |
|
292 |
|
|
293 |
sub gd_reconfig_event |
|
294 |
{ |
|
295 |
my $self = shift; |
|
296 |
print STDERR "Reconfiguration requested\n"; |
|
297 |
$self->gd_postconfig($self->gd_preconfig()); |
|
298 |
} |
|
299 |
|
|
300 |
sub gd_quit_event |
|
301 |
{ |
|
302 |
my $self = shift; |
|
303 |
print STDERR "Quitting...\n"; |
|
304 |
exit(0); |
|
305 |
} |
|
306 |
|
|
307 |
sub gd_setup_signals |
|
308 |
{ |
|
309 |
my $self = shift; |
|
310 |
$SIG{INT} = sub { $self->gd_quit_event() }; |
|
311 |
$SIG{HUP} = sub { $self->gd_reconfig_event() }; |
|
312 |
} |
|
313 |
|
|
314 |
sub gd_run { die "must defined gd_run()" } |
|
315 |
|
|
316 |
sub gd_error |
|
317 |
{ |
|
318 |
my $self = shift; |
|
319 |
my $e = shift; |
|
320 |
my $do = $self->{do}; |
|
321 |
if ($do && $do eq 'stop') { |
|
322 |
warn $e; |
|
323 |
} else { |
|
324 |
die $e; |
|
325 |
} |
|
326 |
} |
|
327 |
|
|
328 |
sub gd_flags_more { return () } |
|
329 |
|
|
330 |
sub gd_flags |
|
331 |
{ |
|
332 |
my $self = shift; |
|
333 |
return ( |
|
334 |
'-c file' => "Specify configuration file (instead of $self->{configfile})", |
|
335 |
'-f' => "Run in the foreground (don't detach)", |
|
336 |
$self->gd_flags_more |
|
337 |
); |
|
338 |
} |
|
339 |
|
|
340 |
sub gd_commands_more { return () } |
|
341 |
|
|
342 |
sub gd_commands |
|
343 |
{ |
|
344 |
my $self = shift; |
|
345 |
return ( |
|
346 |
start => "Starts a new $self->{gd_progname} if there isn't one running already", |
|
347 |
stop => "Stops a running $self->{gd_progname}", |
|
348 |
reload => "Causes a running $self->{gd_progname} to reload it's config file. Starts a new one if none is running.", |
|
349 |
restart => "Stops a running $self->{gd_progname} if one is running. Starts a new one.", |
|
350 |
$self->gd_commands_more(), |
|
351 |
($self->gd_can_install() |
|
352 |
? ('install' => "Setup $self->{gd_progname} to run automatically after reboot") |
|
353 |
: ()), |
|
354 |
($self->gd_can_uninstall() |
|
355 |
? ('uninstall' => "Do not run $self->{gd_progname} after reboots") |
|
356 |
: ()), |
|
357 |
check => "Check the configuration file and report the daemon state", |
|
358 |
help => "Display this usage info", |
|
359 |
version => "Display the version of $self->{gd_progname}", |
|
360 |
) |
|
361 |
} |
|
362 |
|
|
363 |
sub gd_positional_more { return() } |
|
364 |
|
|
365 |
sub gd_alts |
|
366 |
{ |
|
367 |
my $offset = shift; |
|
368 |
my @results; |
|
369 |
for (my $i = $offset; $i <= $#_; $i += 2) { |
|
370 |
push(@results, $_[$i]); |
|
371 |
} |
|
372 |
return @results; |
|
373 |
} |
|
374 |
|
|
375 |
sub gd_usage |
|
376 |
{ |
|
377 |
my $self = shift; |
|
378 |
|
|
379 |
require Text::Wrap; |
|
380 |
import Text::Wrap; |
|
381 |
|
|
382 |
my $col = 15; |
|
383 |
|
|
384 |
my @flags = $self->gd_flags; |
|
385 |
my @commands = $self->gd_commands; |
|
386 |
my @positional = $self->gd_positional_more; |
|
387 |
|
|
388 |
my $summary = "Usage: $self->{gd_progname} "; |
|
389 |
my $details = ''; |
|
390 |
for my $i (gd_alts(0, @flags)) { |
|
391 |
$summary .= "[ $i ] "; |
|
392 |
} |
|
393 |
$summary .= "{ "; |
|
394 |
$summary .= join(" | ", gd_alts(0, @commands)); |
|
395 |
$summary .= " } "; |
|
396 |
$summary .= join(" ", gd_alts(0, @positional)); |
|
397 |
|
|
398 |
my (@all) = (@flags, @commands, @positional); |
|
399 |
while (@all) { |
|
400 |
my ($key, $desc) = splice(@all, 0, 2); |
|
401 |
local($Text::Wrap::columns) = 79; |
|
402 |
$details .= wrap( |
|
403 |
sprintf(" %-${col}s ", $key), |
|
404 |
" " x ($col + 2), |
|
405 |
$desc); |
|
406 |
$details .= "\n"; |
|
407 |
} |
|
408 |
|
|
409 |
print "$summary\n$details"; |
|
410 |
return 0; |
|
411 |
} |
|
412 |
|
|
413 |
sub gd_install_pre {} |
|
414 |
sub gd_install_post {} |
|
415 |
|
|
416 |
sub gd_can_install |
|
417 |
{ |
|
418 |
my $self = shift; |
|
419 |
require File::Basename; |
|
420 |
my $basename = File::Basename::basename($0); |
|
421 |
if ( |
|
422 |
-x "/usr/sbin/update-rc.d" |
|
423 |
&& |
|
424 |
-x $0 |
|
425 |
&& |
|
426 |
$0 !~ m{^(?:/usr|/var)?/tmp/} |
|
427 |
&& |
|
428 |
eval { symlink("",""); 1 } |
|
429 |
&& |
|
430 |
-d "/etc/init.d" |
|
431 |
&& |
|
432 |
! -e "/etc/init.d/$basename" |
|
433 |
) { |
|
434 |
return sub { |
|
435 |
$self->gd_install_pre("update-rc.d"); |
|
436 |
require Cwd; |
|
437 |
my $abs_path = Cwd::abs_path($0); |
|
438 |
symlink($abs_path, "/etc/init.d/$basename") |
|
439 |
or die "Install failed: symlink /etc/init.d/$basename -> $abs_path: $!\n"; |
|
440 |
print "+ /usr/sbin/update-rc.d $basename defaults\n"; |
|
441 |
system("/usr/sbin/update-rc.d", $basename, "defaults"); |
|
442 |
my $exit = $? >> 8; |
|
443 |
$self->gd_install_post("update-rc.d"); |
|
444 |
exit($exit) if $exit; |
|
445 |
}; |
|
446 |
} |
|
447 |
|
|
448 |
return 0; |
|
449 |
} |
|
450 |
|
|
451 |
sub gd_install |
|
452 |
{ |
|
453 |
my $self = shift; |
|
454 |
my $ifunc = $self->gd_can_install(); |
|
455 |
die "Install command not supported\n" unless $ifunc; |
|
456 |
&$ifunc($self); |
|
457 |
exit(0); |
|
458 |
} |
|
459 |
|
|
460 |
sub gd_uninstall_pre {} |
|
461 |
sub gd_uninstall_post {} |
|
462 |
|
|
463 |
sub gd_can_uninstall |
|
464 |
{ |
|
465 |
my $self = shift; |
|
466 |
require File::Basename; |
|
467 |
my $basename = File::Basename::basename($0); |
|
468 |
require Cwd; |
|
469 |
my $abs_path = Cwd::abs_path($0) || 'no abs path'; |
|
470 |
my $link = readlink("/etc/init.d/$basename") || 'no link'; |
|
471 |
if ( |
|
472 |
$link eq $abs_path |
|
473 |
&& |
|
474 |
-x "/usr/sbin/update-rc.d" |
|
475 |
) { |
|
476 |
return sub { |
|
477 |
$self->gd_uninstall_pre("update-rc.d"); |
|
478 |
unlink("/etc/init.d/$basename"); |
|
479 |
print "+ /usr/sbin/update-rc.d $basename remove\n"; |
|
480 |
system("/usr/sbin/update-rc.d", $basename, "remove"); |
|
481 |
my $exit = $? >> 8; |
|
482 |
$self->gd_uninstall_post("update-rc.d"); |
|
483 |
exit($exit) if $exit; |
|
484 |
} |
|
485 |
} |
|
486 |
return 0; |
|
487 |
} |
|
488 |
|
|
489 |
sub gd_uninstall |
|
490 |
{ |
|
491 |
my $self = shift; |
|
492 |
my $ufunc = $self->gd_can_uninstall(); |
|
493 |
die "Cannot uninstall\n" unless $ufunc; |
|
494 |
&$ufunc($self); |
|
495 |
exit(0); |
|
496 |
} |
|
497 |
|
|
498 |
sub gd_kill |
|
499 |
{ |
|
500 |
my ($self, $pid) = @_; |
|
501 |
|
|
502 |
my $talkmore = 0; |
|
503 |
my $killed = 0; |
|
504 |
if (kill(0, $pid)) { |
|
505 |
$killed = 1; |
|
506 |
kill(2,$pid); |
|
507 |
print "Killing $pid\n"; |
|
508 |
my $t = time; |
|
509 |
sleep(1) if kill(0, $pid); |
|
510 |
if ($force_quit_delay && kill(0, $pid)) { |
|
511 |
print "Waiting for $pid to die...\n"; |
|
512 |
$talkmore = 1; |
|
513 |
while(kill(0, $pid) && time - $t < $force_quit_delay) { |
|
514 |
sleep(1); |
|
515 |
} |
|
516 |
} |
|
517 |
if (kill(15, $pid)) { |
|
518 |
print "Killing $pid with -TERM...\n"; |
|
519 |
if ($force_quit_delay) { |
|
520 |
while(kill(0, $pid) && time - $t < $force_quit_delay * 2) { |
|
521 |
sleep(1); |
|
522 |
} |
|
523 |
} else { |
|
524 |
sleep(1) if kill(0, $pid); |
|
525 |
} |
|
526 |
} |
|
527 |
if (kill(9, $pid)) { |
|
528 |
print "Killing $pid with -KILL...\n"; |
|
529 |
my $k9 = time; |
|
530 |
my $max = $force_quit_delay * 4; |
|
531 |
$max = 60 if $max < 60; |
|
532 |
while(kill(0, $pid)) { |
|
533 |
if (time - $k9 > $max) { |
|
534 |
print "Giving up on $pid ever dying.\n"; |
|
535 |
exit(1); |
|
536 |
} |
|
537 |
print "Waiting for $pid to die...\n"; |
|
538 |
sleep(1); |
|
539 |
} |
|
540 |
} |
|
541 |
print "Process $pid is gone\n" if $talkmore; |
|
542 |
} else { |
|
543 |
print "Process $pid no longer running\n"; |
|
544 |
} |
|
545 |
return $killed; |
|
546 |
} |
|
547 |
|
|
548 |
sub gd_preconfig { die "gd_preconfig() must be redefined"; } |
|
549 |
|
|
550 |
sub gd_postconfig { } |
|
551 |
|
|
552 |
|
|
553 |
1; |
modules/fallback/Daemon/Generic/Event.pm | ||
---|---|---|
1 |
|
|
2 |
# Copyright (C) 2006, David Muir Sharnoff <muir@idiom.com> |
|
3 |
|
|
4 |
package Daemon::Generic::Event; |
|
5 |
|
|
6 |
use strict; |
|
7 |
use warnings; |
|
8 |
require Daemon::Generic; |
|
9 |
require Event; |
|
10 |
require Exporter; |
|
11 |
|
|
12 |
our @ISA = qw(Daemon::Generic Exporter); |
|
13 |
our @EXPORT = @Daemon::Generic::EXPORT; |
|
14 |
our $VERSION = 0.3; |
|
15 |
|
|
16 |
sub newdaemon |
|
17 |
{ |
|
18 |
local($Daemon::Generic::caller) = caller() || 'main'; |
|
19 |
local($Daemon::Generic::package) = __PACKAGE__; |
|
20 |
Daemon::Generic::newdaemon(@_); |
|
21 |
} |
|
22 |
|
|
23 |
sub gd_setup_signals |
|
24 |
{ |
|
25 |
my $self = shift; |
|
26 |
my $reload_event = Event->signal( |
|
27 |
signal => 'HUP', |
|
28 |
desc => 'reload on SIGHUP', |
|
29 |
prio => 6, |
|
30 |
cb => sub { |
|
31 |
$self->gd_reconfig_event; |
|
32 |
$self->{gd_timer}->cancel() |
|
33 |
if $self->{gd_timer}; |
|
34 |
$self->gd_setup_timer(); |
|
35 |
}, |
|
36 |
); |
|
37 |
my $quit_event = Event->signal( |
|
38 |
signal => 'INT', |
|
39 |
cb => sub { $self->gd_quit_event; }, |
|
40 |
); |
|
41 |
} |
|
42 |
|
|
43 |
sub gd_setup_timer |
|
44 |
{ |
|
45 |
my $self = shift; |
|
46 |
if ($self->can('gd_run_body')) { |
|
47 |
my $interval = ($self->can('gd_interval') && $self->gd_interval()) || 1; |
|
48 |
$self->{gd_timer} = Event->timer( |
|
49 |
cb => [ $self, 'gd_run_body' ], |
|
50 |
interval => $interval, |
|
51 |
hard => 0, |
|
52 |
); |
|
53 |
} |
|
54 |
} |
|
55 |
|
|
56 |
sub gd_run |
|
57 |
{ |
|
58 |
my $self = shift; |
|
59 |
$self->gd_setup_timer(); |
|
60 |
Event::loop(); |
|
61 |
} |
|
62 |
|
|
63 |
sub gd_quit_event |
|
64 |
{ |
|
65 |
my $self = shift; |
|
66 |
print STDERR "Quitting...\n"; |
|
67 |
Event::unloop_all(); |
|
68 |
} |
|
69 |
|
|
70 |
1; |
|
71 |
|
|
72 |
=head1 NAME |
|
73 |
|
|
74 |
Daemon::Generic::Event - Generic daemon framework with Event.pm |
|
75 |
|
|
76 |
=head1 SYNOPSIS |
|
77 |
|
|
78 |
use Daemon::Generic::Event; |
|
79 |
|
|
80 |
@ISA = qw(Daemon::Generic::Event); |
|
81 |
|
|
82 |
sub gd_preconfig { |
|
83 |
# stuff |
|
84 |
} |
|
85 |
|
|
86 |
=head1 DESCRIPTION |
|
87 |
|
|
88 |
Daemon::Generic::Event is a subclass of L<Daemon::Generic> that |
|
89 |
predefines some methods: |
|
90 |
|
|
91 |
=over 15 |
|
92 |
|
|
93 |
=item gd_run() |
|
94 |
|
|
95 |
Setup a periodic callback to C<gd_run_body()> if there is a C<gd_run_body()>. |
|
96 |
Call C<Event::loop()>. |
|
97 |
|
|
98 |
=item gd_setup_signals() |
|
99 |
|
|
100 |
Bind SIGHUP to call C<gd_reconfig_event()>. |
|
101 |
Bind SIGINT to call C<gd_quit_event()>. |
|
102 |
|
|
103 |
=back |
|
104 |
|
|
105 |
To use Daemon::Generic::Event, you have to provide a C<gd_preconfig()> |
|
106 |
method. It can be empty if you have a C<gd_run_body()>. |
|
107 |
|
|
108 |
Set up your own events in C<gd_preconfig()> and C<gd_postconfig()>. |
|
109 |
|
|
110 |
If you have a C<gd_run_body()> method, it will be called once per |
|
111 |
second or every C<gd_interval()> seconds if you have a C<gd_interval()> |
|
112 |
method. Unlike in L<Daemon::Generic::While1>, C<gd_run_body()> should |
|
113 |
not include a call to C<sleep()>. |
|
114 |
|
|
115 |
=head1 THANK THE AUTHOR |
|
116 |
|
|
117 |
If you need high-speed internet services (T1, T3, OC3 etc), please |
|
118 |
send me your request-for-quote. I have access to very good pricing: |
|
119 |
you'll save money and get a great service. |
|
120 |
|
|
121 |
=head1 LICENSE |
|
122 |
|
|
123 |
Copyright(C) 2006 David Muir Sharnoff <muir@idiom.com>. |
|
124 |
This module may be used and distributed on the same terms |
|
125 |
as Perl itself. |
|
126 |
|
modules/fallback/Daemon/Generic/While1.pm | ||
---|---|---|
1 |
# Copyright (C) 2006, David Muir Sharnoff <muir@idiom.com> |
|
2 |
|
|
3 |
package Daemon::Generic::While1; |
|
4 |
|
|
5 |
use strict; |
|
6 |
use warnings; |
|
7 |
use Carp; |
|
8 |
require Daemon::Generic; |
|
9 |
require POSIX; |
|
10 |
require Exporter; |
|
11 |
|
|
12 |
our @ISA = qw(Daemon::Generic Exporter); |
|
13 |
our @EXPORT = @Daemon::Generic::EXPORT; |
|
14 |
our $VERSION = 0.3; |
|
15 |
|
|
16 |
sub newdaemon |
|
17 |
{ |
|
18 |
local($Daemon::Generic::caller) = caller() || 'main'; |
|
19 |
local($Daemon::Generic::package) = __PACKAGE__; |
|
20 |
Daemon::Generic::newdaemon(@_); |
|
21 |
} |
|
22 |
|
|
23 |
sub gd_setup_signals |
|
24 |
{ |
|
25 |
my ($self) = @_; |
|
26 |
$SIG{HUP} = sub { |
|
27 |
$self->{gd_sighup} = time; |
|
28 |
}; |
|
29 |
my $child; |
|
30 |
$SIG{INT} = sub { |
|
31 |
$self->{gd_sigint} = time; |
|
32 |
# |
|
33 |
# We'll be getting a SIGTERM in a bit if we're not dead, so let's use it. |
|
34 |
# |
|
35 |
$SIG{TERM} = sub { |
|
36 |
$self->gd_quit_event(); |
|
37 |
kill(15, $child) if $child; # if we're still alive, let's stay that way |
|
38 |
}; |
|
39 |
}; |
|
40 |
} |
|
41 |
|
|
42 |
sub gd_sleep |
|
43 |
{ |
|
44 |
my ($self, $period) = @_; |
|
45 |
croak "Sleep period must be defined" unless defined $period; |
|
46 |
my $hires; |
|
47 |
if ($period*1000 != int($period*1000)) { |
|
48 |
$hires = 1; |
|
49 |
require Time::HiRes; |
|
50 |
import Time::HiRes qw(time sleep); |
|
51 |
} |
|
52 |
my $t = time; |
|
53 |
while (time - $t < $period) { |
|
54 |
return if $self->{gd_sigint}; |
|
55 |
return if $self->{gd_sighup}; |
|
56 |
if ($hires) { |
|
57 |
my $p = (time - $t < 1) |
|
58 |
? time - $t |
|
59 |
: 1; |
|
60 |
sleep($p); |
|
61 |
} else { |
|
62 |
sleep(1); |
|
63 |
} |
|
64 |
} |
|
65 |
} |
|
66 |
|
|
67 |
sub gd_run |
|
68 |
{ |
|
69 |
my ($self) = @_; |
|
70 |
while(1) { |
|
71 |
if ($self->{gd_sigint}) { |
|
72 |
$self->{gd_sigint} = 0; |
|
73 |
$self->gd_quit_event(); |
|
74 |
} |
|
75 |
|
|
76 |
if ($self->{gd_sighup}) { |
|
77 |
$self->{gd_sighup} = 0; |
|
78 |
$self->gd_reconfig_event(); |
|
79 |
} |
|
80 |
|
|
81 |
$self->gd_run_body(); |
|
82 |
} |
|
83 |
} |
|
84 |
|
|
85 |
sub gd_reconfig_event |
|
86 |
{ |
|
87 |
my $self = shift; |
|
88 |
print STDERR "Reconfiguration requested\n"; |
|
89 |
$self->gd_postconfig($self->gd_preconfig()); |
|
90 |
} |
|
91 |
|
|
92 |
sub gd_quit_event |
|
93 |
{ |
|
94 |
print STDERR "Quitting...\n"; |
|
95 |
exit(0); |
|
96 |
} |
|
97 |
|
|
98 |
|
|
99 |
sub gd_run_body { die "must override gd_run_body()" } |
|
100 |
|
|
101 |
1; |
|
102 |
|
|
103 |
=head1 NAME |
|
104 |
|
|
105 |
Daemon::Generic::While1 - Daemon framework with default while(1) loop |
|
106 |
|
|
107 |
=head1 SYNOPSIS |
|
108 |
|
|
109 |
@ISA = qw(Daemon::Generic::While1); |
|
110 |
|
|
111 |
sub gd_run_body { |
|
112 |
# stuff |
|
113 |
} |
|
114 |
|
|
115 |
=head1 DESCRIPTION |
|
116 |
|
|
117 |
This is a slight variation on L<Daemon::Generic>: a default |
|
118 |
C<gd_run()> provided. It has a while(1) loop that calls |
|
119 |
C<gd_run_body()> over and over. It checks for reconifg and |
|
120 |
and terminate events and only actions them between calls |
|
121 |
to C<gd_run_body()>. |
|
122 |
|
|
123 |
Terminate events will be forced through after |
|
124 |
C<$Daemon::Generic::force_quit_delay> seconds if |
|
125 |
C<gd_run_body()> doesn't return quickly enough. |
|
126 |
|
|
127 |
=head1 SUBCLASS METHODS REQUIRD |
|
128 |
|
|
129 |
The following method is required to be overridden to subclass |
|
130 |
Daemon::Generic::While1: |
|
131 |
|
|
132 |
=over 15 |
|
133 |
|
|
134 |
=item gd_run_body() |
|
135 |
|
|
136 |
This method will be called over and over. This method should |
|
137 |
include a call to C<sleep(1)> (or a bit more). Reconfig events |
|
138 |
will not interrupt it. Quit events will only interrupt it |
|
139 |
after 15 seconds. |
|
140 |
|
|
141 |
=back |
|
142 |
|
|
143 |
=head1 ADDITIONAL METHODS |
|
144 |
|
|
145 |
The following additional methods are available for your use |
|
146 |
(as compared to L<Daemon::Generic>): |
|
147 |
|
|
148 |
=over 15 |
|
149 |
|
|
150 |
=item gd_sleep($period) |
|
151 |
|
|
152 |
This will sleep for C<$period> seconds but in one-second |
|
153 |
intervals so that if a SIGINT or SIGHUP arrives the sleep |
|
154 |
period can end more quickly. |
|
155 |
|
|
156 |
Using this makes it safe for C<gd_run_body()> to sleep for |
|
157 |
longer than C<$Daemon::Generic::force_quit_delay> seconds |
|
158 |
at a time. |
|
159 |
|
|
160 |
=back |
|
161 |
|
|
162 |
=head1 ADDITIONAL MEMBER DATA |
|
163 |
|
|
164 |
The following additional bits of member data are defined: |
|
165 |
|
|
166 |
=over 15 |
|
167 |
|
|
168 |
=item gd_sigint |
|
169 |
|
|
170 |
The time at which an (unprocessed) SIGINT was recevied. |
|
171 |
|
|
172 |
=item gd_sighup |
|
173 |
|
|
174 |
The time at which an (unprocessed) SIGHUP was recevied. |
|
175 |
|
|
176 |
=back |
|
177 |
|
|
178 |
=head1 THANK THE AUTHOR |
|
179 |
|
|
180 |
If you need high-speed internet services (T1, T3, OC3 etc), please |
|
181 |
send me your request-for-quote. I have access to very good pricing: |
|
182 |
you'll save money and get a great service. |
|
183 |
|
|
184 |
=head1 LICENSE |
|
185 |
|
|
186 |
Copyright(C) 2006 David Muir Sharnoff <muir@idiom.com>. |
|
187 |
This module may be used and distributed on the same terms |
|
188 |
as Perl itself. |
|
189 |
|
modules/fallback/File/Flock.pm | ||
---|---|---|
1 |
# Copyright (C) 1996, 1998 David Muir Sharnoff |
|
2 |
|
|
3 |
package File::Flock; |
|
4 |
|
|
5 |
require Exporter; |
|
6 |
@ISA = qw(Exporter); |
|
7 |
@EXPORT = qw(lock unlock lock_rename); |
|
8 |
|
|
9 |
use Carp; |
|
10 |
use POSIX qw(EAGAIN EACCES EWOULDBLOCK ENOENT EEXIST O_EXCL O_CREAT O_RDWR); |
|
11 |
use Fcntl qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN); |
|
12 |
use IO::File; |
|
13 |
|
|
14 |
use vars qw($VERSION $debug $av0debug); |
|
15 |
|
|
16 |
BEGIN { |
|
17 |
$VERSION = 2008.01; |
|
18 |
$debug = 0; |
|
19 |
$av0debug = 0; |
|
20 |
} |
|
21 |
|
|
22 |
use strict; |
|
23 |
no strict qw(refs); |
|
24 |
|
|
25 |
my %locks; # did we create the file? |
|
26 |
my %lockHandle; |
|
27 |
my %shared; |
|
28 |
my %pid; |
|
29 |
my %rm; |
|
30 |
|
|
31 |
sub new |
|
32 |
{ |
|
33 |
my ($pkg, $file, $shared, $nonblocking) = @_; |
|
34 |
&lock($file, $shared, $nonblocking) or return undef; |
|
35 |
return bless \$file, $pkg; |
|
36 |
} |
|
37 |
|
|
38 |
sub DESTROY |
|
39 |
{ |
|
40 |
my ($this) = @_; |
|
41 |
unlock($$this); |
|
42 |
} |
|
43 |
|
|
44 |
sub lock |
|
45 |
{ |
|
46 |
my ($file, $shared, $nonblocking) = @_; |
|
47 |
|
|
48 |
my $f = new IO::File; |
|
49 |
|
|
50 |
my $created = 0; |
|
51 |
my $previous = exists $locks{$file}; |
|
52 |
|
|
53 |
# the file may be springing in and out of existance... |
|
54 |
OPEN: |
|
55 |
for(;;) { |
|
56 |
if (-e $file) { |
|
57 |
unless (sysopen($f, $file, O_RDWR)) { |
|
58 |
redo OPEN if $! == ENOENT; |
|
59 |
croak "open $file: $!"; |
|
60 |
} |
|
61 |
} else { |
|
62 |
unless (sysopen($f, $file, O_CREAT|O_EXCL|O_RDWR)) { |
|
63 |
redo OPEN if $! == EEXIST; |
|
64 |
croak "open >$file: $!"; |
|
65 |
} |
|
66 |
print STDERR " {$$ " if $debug; # } |
|
67 |
$created = 1; |
|
68 |
} |
|
69 |
last; |
|
70 |
} |
|
71 |
$locks{$file} = $created || $locks{$file} || 0; |
|
72 |
$shared{$file} = $shared; |
|
73 |
$pid{$file} = $$; |
|
74 |
|
|
75 |
$lockHandle{$file} = $f; |
|
76 |
|
|
77 |
my $flags; |
|
78 |
|
|
79 |
$flags = $shared ? LOCK_SH : LOCK_EX; |
Auch abrufbar als: Unified diff
Weitere Fallback-Module entfernt und Doku angepasst (s.a. #344)