Commit 932cd5ee authored by Alexander Wirt's avatar Alexander Wirt

Imported Upstream version 1.5.1

parent 06735add
......@@ -4,6 +4,25 @@ Icinga 1.5.x Change Log
Thanks to all contributers, testers and developers. Please read AUTHORS and THANKS for a detailed list :-)
1.5.1 - 09/09/2011
ENHANCEMENTS
FIXES
* core: free memory allocated notification macros right after sending the notification, not in next notification
* classic ui: fix Localization: Form validation message could be improved (thx Mario Rimann) #1849
* classic ui: fix wrong titles in list of scheduled downtimes (thx Mario Rimann) #1848
* classic ui: fix host and service names are not allowed to have a '+' included #1843
* idoutils: idomod: change stacked memory allocation for broker_data IDO_MAX_BUFLEN #1879
* idoutils: fix idomod should log more verbose on errors, asking for a running ido2db process #1885
* spec file: re-add processing headers
CHANGES
1.5.0 - 24/08/2011
ENHANCEMENTS
......
......@@ -78,7 +78,7 @@ MKDIR=/bin/mkdir
###############################
# Global
###############################
ICINGA_VERSION=1.5.0
ICINGA_VERSION=1.5.1
CP=@CP@
......
......@@ -3,7 +3,7 @@
* ICINGA.C - Core Program Code For Icinga
*
* Program: Icinga
* Version: 1.5.0
* Version: 1.5.1
* License: GPL
* Copyright (c) 1999-2009 Ethan Galstad (http://www.nagios.org)
* Copyright (c) 2009-2011 Nagios Core Development Team and Community Contributors
......
......@@ -3,7 +3,7 @@
* ICINGASTATS.C - Displays Icinga Statistics
*
* Program: Icingastats
* Version: 1.5.0
* Version: 1.5.1
* License: GPL
* Copyright (c) 2003-2008 Ethan Galstad (egalstad@nagios.org)
* Copyright (c) 2009-2011 Nagios Core Development Team and Community Contributors
......
......@@ -169,16 +169,12 @@ int service_notification(service *svc, int type, char *not_author, char *not_dat
}
/* get author and comment macros */
my_free(mac.x[MACRO_NOTIFICATIONAUTHOR]);
if (not_author)
mac.x[MACRO_NOTIFICATIONAUTHOR] = (char *)strdup(not_author);
my_free(mac.x[MACRO_NOTIFICATIONAUTHORNAME]);
my_free(mac.x[MACRO_NOTIFICATIONAUTHORALIAS]);
if (temp_contact != NULL) {
mac.x[MACRO_NOTIFICATIONAUTHORNAME] = (char *)strdup(temp_contact->name);
mac.x[MACRO_NOTIFICATIONAUTHORALIAS] = (char *)strdup(temp_contact->alias);
}
my_free(mac.x[MACRO_NOTIFICATIONCOMMENT]);
if (not_data)
mac.x[MACRO_NOTIFICATIONCOMMENT] = (char *)strdup(not_data);
......@@ -186,15 +182,10 @@ int service_notification(service *svc, int type, char *not_author, char *not_dat
/* if this is an acknowledgement, get author and comment macros */
if (type == NOTIFICATION_ACKNOWLEDGEMENT) {
my_free(mac.x[MACRO_SERVICEACKAUTHOR]);
if (not_author)
mac.x[MACRO_SERVICEACKAUTHOR] = (char *)strdup(not_author);
my_free(mac.x[MACRO_SERVICEACKCOMMENT]);
if (not_data)
mac.x[MACRO_SERVICEACKCOMMENT] = (char *)strdup(not_data);
my_free(mac.x[MACRO_SERVICEACKAUTHORNAME]);
my_free(mac.x[MACRO_SERVICEACKAUTHORALIAS]);
if (temp_contact != NULL) {
mac.x[MACRO_SERVICEACKAUTHORNAME] = (char *)strdup(temp_contact->name);
mac.x[MACRO_SERVICEACKAUTHORALIAS] = (char *)strdup(temp_contact->alias);
......@@ -202,7 +193,6 @@ int service_notification(service *svc, int type, char *not_author, char *not_dat
}
/* set the notification type macro */
my_free(mac.x[MACRO_NOTIFICATIONTYPE]);
if (type == NOTIFICATION_ACKNOWLEDGEMENT)
mac.x[MACRO_NOTIFICATIONTYPE] = (char *)strdup("ACKNOWLEDGEMENT");
else if (type == NOTIFICATION_FLAPPINGSTART)
......@@ -225,15 +215,12 @@ int service_notification(service *svc, int type, char *not_author, char *not_dat
mac.x[MACRO_NOTIFICATIONTYPE] = (char *)strdup("PROBLEM");
/* set the notification number macro */
my_free(mac.x[MACRO_SERVICENOTIFICATIONNUMBER]);
dummy = asprintf(&mac.x[MACRO_SERVICENOTIFICATIONNUMBER], "%d", svc->current_notification_number);
/* the $NOTIFICATIONNUMBER$ macro is maintained for backward compatability */
my_free(mac.x[MACRO_NOTIFICATIONNUMBER]);
mac.x[MACRO_NOTIFICATIONNUMBER] = (char *)strdup((mac.x[MACRO_SERVICENOTIFICATIONNUMBER] == NULL) ? "" : mac.x[MACRO_SERVICENOTIFICATIONNUMBER]);
/* set the notification id macro */
my_free(mac.x[MACRO_SERVICENOTIFICATIONID]);
dummy = asprintf(&mac.x[MACRO_SERVICENOTIFICATIONID], "%lu", svc->current_notification_id);
/* notify each contact (duplicates have been removed) */
......@@ -256,6 +243,21 @@ int service_notification(service *svc, int type, char *not_author, char *not_dat
/* free memory allocated to the notification list */
free_notification_list();
/* free memory allocated for all macros we've just used */
my_free(mac.x[MACRO_NOTIFICATIONAUTHOR]);
my_free(mac.x[MACRO_NOTIFICATIONAUTHORNAME]);
my_free(mac.x[MACRO_NOTIFICATIONAUTHORALIAS]);
my_free(mac.x[MACRO_NOTIFICATIONCOMMENT]);
my_free(mac.x[MACRO_NOTIFICATIONTYPE]);
my_free(mac.x[MACRO_SERVICENOTIFICATIONNUMBER]);
my_free(mac.x[MACRO_SERVICENOTIFICATIONID]);
/* kept for backwards compatibility */
my_free(mac.x[MACRO_NOTIFICATIONNUMBER]);
my_free(mac.x[MACRO_SERVICEACKAUTHORNAME]);
my_free(mac.x[MACRO_SERVICEACKAUTHORALIAS]);
my_free(mac.x[MACRO_SERVICEACKAUTHOR]);
my_free(mac.x[MACRO_SERVICEACKCOMMENT]);
/* this gets set in add_notification() */
my_free(mac.x[MACRO_NOTIFICATIONRECIPIENTS]);
......@@ -1297,41 +1299,30 @@ int host_notification(host *hst, int type, char *not_author, char *not_data, int
}
/* get author and comment macros */
my_free(mac.x[MACRO_NOTIFICATIONAUTHOR]);
if (not_author)
mac.x[MACRO_NOTIFICATIONAUTHOR] = (char *)strdup(not_author);
my_free(mac.x[MACRO_NOTIFICATIONAUTHORNAME]);
my_free(mac.x[MACRO_NOTIFICATIONAUTHORALIAS]);
if (temp_contact != NULL) {
mac.x[MACRO_NOTIFICATIONAUTHORNAME] = (char *)strdup(temp_contact->name);
mac.x[MACRO_NOTIFICATIONAUTHORALIAS] = (char *)strdup(temp_contact->alias);
}
my_free(mac.x[MACRO_NOTIFICATIONCOMMENT]);
if (not_data)
mac.x[MACRO_NOTIFICATIONCOMMENT] = (char *)strdup(not_data);
/* NOTE: these macros are deprecated and will likely disappear in Icinga 4.x */
/* NOTE: these macros are deprecated and will likely disappear in future major releases */
/* if this is an acknowledgement, get author and comment macros */
if (type == NOTIFICATION_ACKNOWLEDGEMENT) {
my_free(mac.x[MACRO_HOSTACKAUTHOR]);
if (not_author)
mac.x[MACRO_HOSTACKAUTHOR] = (char *)strdup(not_author);
my_free(mac.x[MACRO_HOSTACKCOMMENT]);
if (not_data)
mac.x[MACRO_HOSTACKCOMMENT] = (char *)strdup(not_data);
my_free(mac.x[MACRO_SERVICEACKAUTHORNAME]);
my_free(mac.x[MACRO_SERVICEACKAUTHORALIAS]);
if (temp_contact != NULL) {
mac.x[MACRO_SERVICEACKAUTHORNAME] = (char *)strdup(temp_contact->name);
mac.x[MACRO_SERVICEACKAUTHORALIAS] = (char *)strdup(temp_contact->alias);
mac.x[MACRO_HOSTACKAUTHORNAME] = (char *)strdup(temp_contact->name);
mac.x[MACRO_HOSTACKAUTHORALIAS] = (char *)strdup(temp_contact->alias);
}
}
/* set the notification type macro */
my_free(mac.x[MACRO_NOTIFICATIONTYPE]);
if (type == NOTIFICATION_ACKNOWLEDGEMENT)
mac.x[MACRO_NOTIFICATIONTYPE] = (char *)strdup("ACKNOWLEDGEMENT");
else if (type == NOTIFICATION_FLAPPINGSTART)
......@@ -1354,15 +1345,12 @@ int host_notification(host *hst, int type, char *not_author, char *not_data, int
mac.x[MACRO_NOTIFICATIONTYPE] = (char *)strdup("PROBLEM");
/* set the notification number macro */
my_free(mac.x[MACRO_HOSTNOTIFICATIONNUMBER]);
dummy = asprintf(&mac.x[MACRO_HOSTNOTIFICATIONNUMBER], "%d", hst->current_notification_number);
/* the $NOTIFICATIONNUMBER$ macro is maintained for backward compatability */
my_free(mac.x[MACRO_NOTIFICATIONNUMBER]);
mac.x[MACRO_NOTIFICATIONNUMBER] = (char *)strdup((mac.x[MACRO_HOSTNOTIFICATIONNUMBER] == NULL) ? "" : mac.x[MACRO_HOSTNOTIFICATIONNUMBER]);
/* set the notification id macro */
my_free(mac.x[MACRO_HOSTNOTIFICATIONID]);
dummy = asprintf(&mac.x[MACRO_HOSTNOTIFICATIONID], "%lu", hst->current_notification_id);
/* notify each contact (duplicates have been removed) */
......@@ -1385,6 +1373,21 @@ int host_notification(host *hst, int type, char *not_author, char *not_data, int
/* free memory allocated to the notification list */
free_notification_list();
/* clear allocated memory for macros we've just used */
my_free(mac.x[MACRO_NOTIFICATIONAUTHOR]);
my_free(mac.x[MACRO_NOTIFICATIONAUTHORNAME]);
my_free(mac.x[MACRO_NOTIFICATIONAUTHORALIAS]);
my_free(mac.x[MACRO_NOTIFICATIONCOMMENT]);
my_free(mac.x[MACRO_NOTIFICATIONTYPE]);
my_free(mac.x[MACRO_HOSTNOTIFICATIONNUMBER]);
my_free(mac.x[MACRO_HOSTNOTIFICATIONID]);
/* kept for backwards compatibility */
my_free(mac.x[MACRO_NOTIFICATIONNUMBER]);
my_free(mac.x[MACRO_HOSTACKCOMMENT]);
my_free(mac.x[MACRO_HOSTACKAUTHOR]);
my_free(mac.x[MACRO_HOSTACKAUTHORNAME]);
my_free(mac.x[MACRO_HOSTACKAUTHORALIAS]);
/* this gets set in add_notification() */
my_free(mac.x[MACRO_NOTIFICATIONRECIPIENTS]);
......
......@@ -881,7 +881,7 @@ void print_form_element(int element, int cmd) {
print_help_box(help_text);
printf("</td><td align=\"left\">");
printf("<TEXTAREA ID=\"com_data\" NAME='com_data' COLS=25 ROWS=2 onkeyup=\"check_input();\">%s</TEXTAREA>", escape_string(comment_data));
printf("<BR><DIV ID='com_data_error' class=\"inputError\" style=\"display:none;\">Comment data can't be send empty</DIV>");
printf("<BR><DIV ID='com_data_error' class=\"inputError\" style=\"display:none;\">Comment data can't be sent empty</DIV>");
printf("</td></tr>\n");
break;
......
......@@ -3061,7 +3061,7 @@ void show_downtime(int type) {
}
} else {
printf("<A NAME=%sDOWNTIME></A>\n", (type == HOST_DOWNTIME) ? "HOST" : "SERVICE");
printf("<TABLE BORDER=0 CLASS='comment' style='padding:0px;margin-bottom: -6px;'><TR><TD width='33%%'></TD><TD width='33%%'><DIV CLASS='commentTitle'>Scheduled %s Downtime</DIV></TD><TD width='33%%'>", (type == HOST_COMMENT) ? "Host" : "Service");
printf("<TABLE BORDER=0 CLASS='comment' style='padding:0px;margin-bottom: -6px;'><TR><TD width='33%%'></TD><TD width='33%%'><DIV CLASS='commentTitle'>Scheduled %s Downtime</DIV></TD><TD width='33%%'>", (type == HOST_DOWNTIME) ? "Host" : "Service");
/* add export to csv link */
if (display_type != DISPLAY_COMMENTS) {
......
......@@ -38,17 +38,6 @@ void sanitize_cgi_input(char **cgivars) {
int x, y, i;
int keep;
/* Added by Ricardo B. 2011-06-16
Somehow on POST the plus gets turned into HEX so we have to convert it back to blank after all parsing is done.
*/
for (strptr = cgivars[i=0]; strptr != NULL; strptr = cgivars[++i]) {
for (x = 0, y = 0; strptr[x] != '\x0'; x++) {
if (strptr[x] == '+')
strptr[x] = ' ';
}
}
/* don't strip for now... */
return;
......@@ -109,7 +98,7 @@ unsigned char hex_to_char(char *input) {
/* unescape hex characters in CGI input */
/* unescape hex characters and plus in CGI input */
void unescape_cgi_input(char *input) {
int x, y;
int len;
......@@ -125,6 +114,10 @@ void unescape_cgi_input(char *input) {
else if (input[x] == '%') {
input[y] = hex_to_char(&input[x+1]);
x += 2;
// RB 2011-09-08
// convert plus as well that it can bu used in service and host names
} else if (input[x] == '+') {
input[y] = ' ';
} else
input[y] = input[x];
}
......
......@@ -2423,9 +2423,9 @@ ac_config_headers="$ac_config_headers include/config.h include/snprintf.h"
PKG_NAME=icinga-core
PKG_VERSION="1.5.0"
PKG_VERSION="1.5.1"
PKG_HOME_URL="http://www.icinga.org/"
PKG_REL_DATE="08-24-2011"
PKG_REL_DATE="09-09-2011"
ac_aux_dir=
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
......
......@@ -9,9 +9,9 @@ AC_CONFIG_HEADER(include/config.h include/snprintf.h)
AC_PREFIX_DEFAULT(/usr/local/icinga)
PKG_NAME=icinga-core
PKG_VERSION="1.5.0"
PKG_VERSION="1.5.1"
PKG_HOME_URL="http://www.icinga.org/"
PKG_REL_DATE="08-24-2011"
PKG_REL_DATE="09-09-2011"
dnl Figure out how to invoke "install" and what install options to use.
AC_PROG_INSTALL
......
......@@ -110,7 +110,7 @@ $conf['nagios_base'] = "/icinga/cgi-bin";</programlisting></para>
<listitem>
<para>Anlegen einer neuen Grid-Ansicht im "Data" Cronk-Container</para>
<para>Editieren von cronks.xml im Unterverzeichnis app/modules/Cronks/config/ unter &name-web; und hinzufügen von: <programlisting>&lt;ae:parameter name="gridMyHostView"&gt;
<para>Editieren von cronks.xml im Unterverzeichnis app/modules/Cronks/config/ unter &name-web; und hinzufügen von: <programlisting>&lt;cronk name="gridMyHostView"&gt;
&lt;ae:parameter name="module"&gt;Cronks&lt;/ae:parameter&gt;
&lt;ae:parameter name="action"&gt;System.ViewProc&lt;/ae:parameter&gt;
&lt;ae:parameter name="hide"&gt;false&lt;/ae:parameter&gt;
......@@ -121,7 +121,7 @@ $conf['nagios_base'] = "/icinga/cgi-bin";</programlisting></para>
&lt;ae:parameter name="ae:parameter"&gt;
&lt;ae:parameter name="template"&gt;icinga-my-host-template&lt;/ae:parameter&gt;
&lt;/ae:parameter&gt;
&lt;/ae:parameter&gt;</programlisting></para>
&lt;/cronk&gt;</programlisting></para>
</listitem>
</orderedlist>
......@@ -200,7 +200,7 @@ $conf['nagios_base'] = "/icinga/cgi-bin";</programlisting></para>
<para>Editieren von cronks.xml im Unterverzeichnis app/modules/Cronks/config/ unter &name-web; und hinzufügen von:</para>
<programlisting>&lt;ae:parameter name="gridMyServiceView"&gt;
<programlisting>&lt;cronk name="gridMyServiceView"&gt;
&lt;ae:parameter name="module"&gt;Cronks&lt;/ae:parameter&gt;
&lt;ae:parameter name="action"&gt;System.ViewProc&lt;/ae:parameter&gt;
&lt;ae:parameter name="hide"&gt;false&lt;/ae:parameter&gt;
......@@ -211,7 +211,7 @@ $conf['nagios_base'] = "/icinga/cgi-bin";</programlisting></para>
&lt;ae:parameter name="ae:parameter"&gt;
&lt;ae:parameter name="template"&gt;icinga-my-service-template&lt;/ae:parameter&gt;
&lt;/ae:parameter&gt;
&lt;/ae:parameter&gt;</programlisting>
&lt;/cronk&gt;</programlisting>
</listitem>
<listitem>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE section [
<!DOCTYPE chapter [
<!ENTITY % all.entities SYSTEM "all-entities.ent">
%all.entities;
]>
......@@ -36,6 +36,18 @@
Laufzeit des Moduls vorhanden ist.</para>
<para><code> broker_module=/usr/local/icinga/bin/livestatus.o /usr/local/icinga/var/rw/live</code></para>
<note>
<para>Ab &name-icinga; 1.4 können Sie statt des broker_module-Eintrags die neue module-Definition in einer Ihrer
Objektkonfigurationsdateien benutzen:</para>
<screen> define module{
module_name mklivestatus
path &url-icinga-base;/bin/livestatus.o
module_type neb
args &url-icinga-base;/var/rw/live
}</screen>
</note>
</listitem>
<listitem>
......@@ -62,7 +74,10 @@
<indexterm zone="int-mklivestatus">
<primary>MKLiveStatus-Integration</primary>
</indexterm>
<indexterm zone="int-mklivestatus">
<primary>Addons</primary><secondary>MKLiveStatus-Integration</secondary>
<primary>Addons</primary>
<secondary>MKLiveStatus-Integration</secondary>
</indexterm>
</section>
......@@ -107,9 +107,7 @@
</indexterm>
<section>
<title>Host-Definition</title>
<para><anchor xml:id="objectdefinitions-host" /><emphasis role="bold">Host-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-host" />Host-Definition</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -947,9 +945,7 @@
</section>
<section>
<title>Hostgruppen-Definition</title>
<para><anchor xml:id="objectdefinitions-hostgroup" /><emphasis role="bold">Hostgruppen-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-hostgroup" />Hostgruppen-Definition</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -1129,9 +1125,7 @@
</section>
<section>
<title>Service-Definition</title>
<para><anchor xml:id="objectdefinitions-service" /><emphasis role="bold">Service-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-service" />Service-Definition</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -1879,9 +1873,7 @@
</section>
<section>
<title>Servicegruppen-Definition</title>
<para><anchor xml:id="objectdefinitions-servicegroup" /><emphasis role="bold">Servicegruppen-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-servicegroup" />Servicegruppen-Definition</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -2066,9 +2058,7 @@
</section>
<section>
<title>Kontakt-Definition</title>
<para><anchor xml:id="objectdefinitions-contact" /><emphasis role="bold">Kontakt-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-contact" />Kontakt-Definition</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -2443,9 +2433,7 @@
</section>
<section>
<title>Kontaktgruppen-Definition</title>
<para><anchor xml:id="objectdefinitions-contactgroup" /><emphasis role="bold">Kontaktgruppen-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-contactgroup" />Kontaktgruppen-Definition</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -2573,9 +2561,7 @@
</section>
<section>
<title>Zeitfenster-Definition (timeperiod)</title>
<para><anchor xml:id="objectdefinitions-timeperiod" /><emphasis role="bold">Zeitfenster-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-timeperiod" />Zeitfenster-Definition (timeperiod)</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -2763,9 +2749,7 @@
</section>
<section>
<title>Befehls-Definition (command)</title>
<para><anchor xml:id="objectdefinitions-command" /><emphasis role="bold">Befehls-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-command" />Befehls-Definition (command)</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -2884,9 +2868,7 @@
</section>
<section>
<title>Service-Abhängigkeits-Definition (servicedependency)</title>
<para><anchor xml:id="objectdefinitions-servicedependency" /><emphasis role="bold">Service-Abhängigkeits-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-servicedependency" />Service-Abhängigkeits-Definition (servicedependency)</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -3138,9 +3120,7 @@
</section>
<section>
<title>Serviceeskalations-Definition</title>
<para><anchor xml:id="objectdefinitions-serviceescalation" /><emphasis role="bold">Serviceeskalations-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-serviceescalation" />Serviceeskalations-Definition</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -3521,9 +3501,7 @@
</section>
<section>
<title>Host-Abhängigkeits-Definition (hostdependency)</title>
<para><anchor xml:id="objectdefinitions-hostdependency" /><emphasis role="bold">Host-Abhängigkeits-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-hostdependency" />Host-Abhängigkeits-Definition (hostdependency)</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -3734,9 +3712,7 @@
</section>
<section>
<title>Host-Eskalations-Definition</title>
<para><anchor xml:id="objectdefinitions-hostescalation" /><emphasis role="bold">Host-Eskalations-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-hostescalation" />Host-Eskalations-Definition</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -4044,9 +4020,7 @@
</section>
<section>
<title>erweiterte Hostinformations-Definition (hostextinfo)</title>
<para><anchor xml:id="objectdefinitions-hostextinfo" /><emphasis role="bold">erweiterte Hostinformations-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-hostextinfo" />erweiterte Hostinformations-Definition (hostextinfo)</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -4326,10 +4300,7 @@
</section>
<section>
<title>erweiterte Serviceinformations-Definition (serviceextinfo)</title>
<para><anchor xml:id="objectdefinitions-serviceextinfo" /><emphasis role="bold">erweiterte
Serviceinformations-Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-serviceextinfo" />erweiterte Serviceinformations-Definition (serviceextinfo)</title>
<para><emphasis>Beschreibung:</emphasis></para>
......@@ -4534,9 +4505,7 @@
</section>
<section>
<title>Module-Definition</title>
<para><anchor xml:id="objectdefinitions-module" /><emphasis role="bold">Module Definition</emphasis></para>
<title><anchor xml:id="objectdefinitions-module" />Module-Definition</title>
<para><emphasis>Beschreibung:</emphasis></para>
......
......@@ -16,6 +16,12 @@
<para>Verweise zu Konfigurations-Tools und anderen Addons finden Sie <link linkend="addons">hier</link>.</para>
<anchor xml:id="quickstart-packages" />