Packaging

Various Linux distributions provides packages (deb, rpm, …) for GLPI (Debian, Mandriva, Fedora, Redhat/CentOS, …) and for some plugins. You may want to take a look at Remi’s package for Fedora/RHEL to rely on a concrete example.

Here is some information about using and creating package:

  • for users to understand how GLPI is installed

  • for support to understand how GLPI work on this installation

  • for packagers

Sources

GLPI public tarball is designed for ends-user; it will not fit packaging requirements. For example, this tarball bundle a lot of third party libraries, it does not ships unit tests, etc.

A better candidate would be to retrieve directly a tarball from github as package source.

Filesystem Hierarchy Standard

Most distributions requires that packages follows the FHS (Filesystem Hierarchy Standard):

  • /etc/glpi for configuration files: config_db.php and config_db_slave.php. Prior to 9.2 release, other files stay in glpi/config; beginning with 9.2, those files have been moved;

  • /usr/share/glpi for the web pages (read only dir);

  • /var/lib/glpi/files for GLPI data and state information (session, uploaded documents, cache, cron, plugins, …);

  • /var/log/glpi for various GLPI log files.

Please refer to GLPI installation documentation in order to get GLPI paths configured.

Apache Configuration File

Here is a configuration file sample for the Apache web server:

#To access via http://servername/glpi/
Alias /glpi /usr/share/glpi

# some people prefer a simple URL like http://glpi.example.com
#<VirtualHost *:80>
#  DocumentRoot /usr/share/glpi
#  ServerName glpi.example.com
#</VirtualHost>

<Directory /usr/share/glpi>
    Options None
    AllowOverride None

    # to overwrite default configuration which could be less than recommended value
    php_value memory_limit 64M

   <IfModule mod_authz_core.c>
      # Apache 2.4
      Require all granted
   </IfModule>
   <IfModule !mod_authz_core.c>
      # Apache 2.2
      Order Deny,Allow
      Allow from All
   </IfModule>
</Directory>

<Directory /usr/share/glpi/install>
    # 15" should be enough for migration in most case
    php_value max_execution_time 900
    php_value memory_limit 128M
</Directory>

# This sections replace the .htaccess files provided in the tarball
<Directory /usr/share/glpi/config>
   <IfModule mod_authz_core.c>
      # Apache 2.4
      Require all denied
   </IfModule>
   <IfModule !mod_authz_core.c>
      # Apache 2.2
      Order Deny,Allow
      Deny from All
   </IfModule>
</Directory>

<Directory /usr/share/glpi/locales>
   <IfModule mod_authz_core.c>
      # Apache 2.4
      Require all denied
   </IfModule>
   <IfModule !mod_authz_core.c>
      # Apache 2.2
      Order Deny,Allow
      Deny from All
   </IfModule>
</Directory>

<Directory /usr/share/glpi/install/mysql>
   <IfModule mod_authz_core.c>
      # Apache 2.4
      Require all denied
   </IfModule>
   <IfModule !mod_authz_core.c>
      # Apache 2.2
      Order Deny,Allow
      Deny from All
   </IfModule>
</Directory>

<Directory /usr/share/glpi/scripts>
   <IfModule mod_authz_core.c>
      # Apache 2.4
      Require all denied
   </IfModule>
   <IfModule !mod_authz_core.c>
      # Apache 2.2
      Order Deny,Allow
      Deny from All
   </IfModule>
</Directory>

Logs files rotation

Here is a logrotate sample configuration file (/etc/logrotate.d/glpi):

# Rotate GLPI logs daily, only if not empty
# Save 14 days old logs under compressed mode
/var/log/glpi/*.log {
   daily
   rotate 14
   compress
   notifempty
   missingok
   create 644 apache apache
}

SELinux stuff

For SELinux enabled distributions, you need to declare the correct context for the folders.

As an example, on Redhat based distributions:

  • /etc/glpi and /var/lib/glpi: httpd_sys_script_rw_t, the web server need to write the config file in the former and various data in the latter;

  • /var/log/glpi: httpd_log_t (apache log type: write only, no delete).

Use system cron

GLPI provides an internal cron for automated tasks. Using a system cron allow a more consistent and regular execution, for example when no user connected on GLPI.

Note

cron.php should be run as the web server user (apache or www-data)

You will need a crontab file, and to configure GLPI to use system cron. Sample cron configuration file (/etc/cron.d/glpi):

# GLPI core
# Run cron from to execute task even when no user connected
*/4 * * * * apache /usr/bin/php /usr/share/glpi/front/cron.php

To tell GLPI it must use the system crontab, simply define the GLPI_SYSTEM_CRON constant to true in the config_path.php file:

<?php
//[...]

//Use system cron
define('GLPI_SYSTEM_CRON', true);

Using system libraries

Since most distributions prefers the use of system libraries (maintained separately); you can’t rely on the vendor directory shipped in the public tarball; nor use composer.

The way to handle third party libraries is to provide an autoload file with paths to you system libraries. You’ll find all requirements from the composer.json file provided along with GLPI:

<?php
$vendor = '##DATADIR##/php';
// Dependencies from composer.json
// "ircmaxell/password-compat"
// => useless for php >= 5.5
//require_once $vendor . '/password_compat/password.php';
// "jasig/phpcas"
require_once '##DATADIR##/pear/CAS/Autoload.php';
// "iamcal/lib_autolink"
require_once $vendor . '/php-iamcal-lib-autolink/autoload.php';
// "phpmailer/phpmailer"
require_once $vendor . '/PHPMailer/PHPMailerAutoload.php';
// "sabre/vobject"
require_once $vendor . '/Sabre/VObject/autoload.php';
// "simplepie/simplepie"
require_once $vendor . '/php-simplepie/autoloader.php';
// "tecnickcom/tcpdf"
require_once $vendor . '/tcpdf/tcpdf.php';
// "zendframework/zend-cache"
// "zendframework/zend-i18n"
// "zendframework/zend-loader"
require_once $vendor . '/Zend/autoload.php';
// "zetacomponents/graph"
require_once $vendor . '/ezc/Graph/autoloader.php';
// "ramsey/array_column"
// => useless for php >= 5.5
// "michelf/php-markdown"
require_once $vendor . '/Michelf/markdown-autoload.php';
// "true/punycode"
if (file_exists($vendor . '/TrueBV/autoload.php')) {
   require_once $vendor . '/TrueBV/autoload.php';
} else {
   require_once $vendor . '/TrueBV/Punycode.php';
}

Note

In the above example, the ##DATADIR## value will be replaced by the correct value (/usr/share/php for instance) from the specfile using macros. Adapt with your build system possibilities.

Using system fonts rather than bundled ones

Some distribution prefers the use of system fonts (maintained separately).

GLPI use the FreeSans.ttf font you can configure adding in the config_path.php:

<?php
//[...]

define('GLPI_FONT_FREESANS',  '/path/to/FreeSans.ttf');

Creative Commons License