Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision ab18d1c0

Von Jan Büren vor fast 6 Jahren hinzugefügt

  • ID ab18d1c0c613c094e576be22c0f788dfa19165bc
  • Vorgänger db62bb40
  • Nachfolger 497b9801

Weitere Fallback-Module entfernt und Doku angepasst (s.a. #344)

Unterschiede anzeigen:

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>&nbsp;</td><th width="60%" align="center">Kapitel 2. Installation und Grundkonfiguration</th><td width="20%" align="right">&nbsp;<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>&nbsp;</td><th width="60%" align="center">Kapitel 2. Installation und Grundkonfiguration</th><td width="20%" align="right">&nbsp;<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>&nbsp;</td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right">&nbsp;<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>&nbsp;</td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right">&nbsp;<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>&lt; %separate_X_subtotal%&gt;</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>&lt;%separate_L_subtotal%&gt;</strong></span> und für
21 21
        Verpackungsmaterial <span class="bold"><strong>
22
        &lt;%separate_M_subtotal%&gt;</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
        &lt;%separate_M_subtotal%&gt;</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>&nbsp;</td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right">&nbsp;<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>&nbsp;</td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right">&nbsp;<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 &#34;Features&#34;"><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 &#34;Features&#34;"><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 &#34;Allgemeine Dokumentenanhänge&#34;"><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 &#34;Allgemeine Dokumentenanhänge&#34;"><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>&nbsp;</td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right">&nbsp;<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>&nbsp;</td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right">&nbsp;<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-&gt;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-&gt;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-&gt;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-&gt;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 &lt;alles&gt;&lt;nur Preis&gt;&lt;nur
22 22
          Bestand&gt;&lt;Preis und Bestand&gt; 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-&gt;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-&gt;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/&lt;SHOPCONNECTORNAME&gt;.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>&nbsp;</td><th width="60%" align="center">&nbsp;</th><td width="20%" align="right">&nbsp;<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>&nbsp;</td><th width="60%" align="center">&nbsp;</th><td width="20%" align="right">&nbsp;<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-&gt;{TEMPLATE_ARRAYS}{number} },          $form-&gt;{"partnumber_$i"};
111 111
  push @{ $form-&gt;{TEMPLATE_ARRAYS}{description} },     $form-&gt;{"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
          -&gt; <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-&gt;message(0, 'Meine Konfig:' . Dumper (%::myconfig));
138
$main::lxdebug-&gt;message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form-&gt;{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-&gt;message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form-&gt;{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-&gt;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-&gt;{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-&gt;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-&gt;{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-&gt;{cache}{all_units}</code>
190 190
                     </p></li><li class="listitem"><p>Wird nur in
191 191
              <code class="function">AM-&gt;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>&nbsp;</td><td width="20%" align="center">&nbsp;</td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch04s02.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top">3.9. Webshop-Api&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Zum Anfang</a></td><td width="40%" align="right" valign="top">&nbsp;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">&nbsp;</td><th width="60%" align="center">&nbsp;</th><td width="20%" align="right">&nbsp;<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">&nbsp;</td><td width="20%" align="center">&nbsp;</td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch01.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top">&nbsp;</td><td width="20%" align="center">&nbsp;</td><td width="40%" align="right" valign="top">&nbsp;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;
... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet.

Auch abrufbar als: Unified diff