Introduction

Parfois, vous n'aurez pas le choix. Comme bien souvent dans une entité, une DSI prend des décisions qui ne sont pas toujours les plus avisées et ce, pour de multiples raisons.

Ainsi, il est probable qu'on vous demande des choses complexes à réaliser. Dans ces éléments du quotidien, on va par exemple vous imposer de connecter un serveur sous Debian vers une base de données Oracle.

S'il avait fallu se connecter à un serveur PostgreSQL ou MySQL, l'opération aurait été sans doute beaucoup plus facile. Car, il faut bien l'avouer, demander de connecter un OS libre à des logiciels propriétaires est souvent synonyme de galère sans nom.

L'objet de cet article est de présenter une méthode pour régler ce problème de connexion. Il vous permettra d'installer le client Oracle sous Debian 8.0 (Jessie) ainsi que l'interpreteur SQL en ligne de commande d'Oracle. Nous verrons également comment connecter un client en Python via la bibliothèque cx_Oracle.

Rappel: Oracle Database est un logiciel propriétaire qui coûte assez cher. Le support des OS GNU/Linux est assuré uniquement pour la distribution RHEL et, bien entendu, la distribution Oracle Linux. Néanmoins, il est quand même possible d'installer le client Oracle officiel dans d'autres distributions, moyennant quelques manipulations assez simples à mettre en oeuvre.

Télécharger ce qu'il faut

Il vous faut:

Prenez soin de prendre la version adaptée à votre architecture. Dans la pratique, si vous êtes sous ARM, c'est mort ! Seules les architectures x86 et x86_64 sont gérées !

Bien sûr, comme Oracle est une entreprise, vous aurez besoin de créer un compte (à la con) pour seulement télécharger ces archives. Donnez une adresse email jetable, ça ne vaut pas la peine de rentrer dans ce jeu (après tout, vous utilisez Oracle parce qu'on vous oblige à le faire) !

Installer l'ensemble

Voici mon approche:

  • J'installe tout dans /opt/oracle, conformément aux règles FHS.
  • Il faudra ensuite modifier quelques variables d'environnement pour accéder à ce répertoire.
# apt install libaio1
# mkdir -p /opt/oracle
# cd /opt/oracle
# unzip /tmp/instantclient-basic-linux.x64-12.1.0.2.0.zipunzip /tmp/instantclient-basic-linux.x64-12.1.0.2.0.zip
# unzip /tmp/instantclient-sdk-linux.x64-12.1.0.2.0.zip
# unzip /tmp/instantclient-sqlplus-linux.x64-12.1.0.2.0.zip
# cd instantclient_12_1 && ln -s libclntsh.so.12.1 libclntsh.so

Ensuite, il reste à déclarer quelques variables d'environnement pour que tout fonctionne correctement

$ export ORACLE_HOME=/opt/oracle/instantclient_12_1
$ export LD_LIBRAY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME
$ export PATH=$PATH:$ORACLE_HOME

Copiez ça dans votre .bashrc !

# Oracle things
export ORACLE_HOME=/opt/oracle/instantclient_12_1
if [ "$LD_LIBRARY_PATH" = "" ]; then
    export LD_LIBRARY_PATH=$ORACLE_HOME
else
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME
fi
export PATH=$PATH:$ORACLE_HOME

Si vous avez un fichier tnsnames.ora, le fichier qui référence les connexions vers le ou les serveurs Oracle de votre environnement, vous devez le placer au bon endroit (celui par défaut), ce qui vous permettra d'économiser une variable d'environnement.

# mkdir -p /opt/oracle/instantclient_12_1/network/admin
# cp /tmp/tnsnames.ora /opt/oracle/instantclient_12_1/network/admin/

Tester que tout marche

Le client est installé et configuré, il reste à tester l'ensemble. Vous devez disposer d'un vrai serveur Oracle Database pour vérifier que la connexion se déroule correctement. Pour réaliser ce test de connexion, nous allons utiliser SQLPlus (après tout, c'est le client officiel):

$ sqlplus user/password@tnsname

SQL*Plus: Release 12.1.0.2.0 Production on Tue Jul 21 14:33:08 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connecte a :
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SQL>

Si vous avez le prompt SQL, alors ça veut dire que votre installation est fonctionnelle. Si ce n'est pas le cas, veillez à bien spécifier le tnsname tel qu'il est indiqué dans le fichier tnsnames.ora. Par exemple dans:

THESERVER.WORLD =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = sdf.my-domain.example)(PORT = 51478))
    (CONNECT_DATA = (SID = theserver))
  )

Le nom du tnsname est bien THESERVER.WORLD et non theserver qui correspond au SID. Le SID (Oracle System Identifier) était utilisé pour les serveurs Oracle Database d'avant la version 8.1.

Par ailleurs, le client Oracle gère le fichier tnsnames.ora de façon équivalente s'il est encodé avec des caractères de fin de ligne de MS-Windows. Vous pouvez le copier tel quel sur votre Debian et ça devrait fonctionner.

Installer cx_Oracle

Maintenant que nous disposons de tout ce qu'il faut comme binaire pour Oracle, on peut lancer la création de cx_Oracle. Je vous recommande de télécharger la source dans un répertoire puis de le compiler via les instructions standard. En effet, sous Debian, l'utilisation des distutils permet de créer les modules Python dans /usr/local/lib/python2.7/dist-packages/.

Attention, par défaut, Debian Jessie utilise Python 2.7 !

# apt install python-dev build-essential
$ cd ~/projects/oracle/
$ wget https://pypi.python.org/packages/source/c/cx_Oracle/cx_Oracle-5.1.3.tar.gz
$ tar -xzf cx_Oracle-5.1.3.tar.gz
$ cd cx_Oracle-5.1.3
$ python setup.py build
# python setup.py install

Ensuite, un simple chargement du module cx_Oracle sous Python devrait vous confirmer que tout est correct. Si vous voulez vraiment tester une connexion vers un serveur existant, adaptez le script qui suit devrait suffire:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import cx_Oracle

connection = cx_Oracle.Connection("user/password@tnsname")
cursor = connection.cursor()

try:
    cursor.execute("select 1 / 0 from dual")
except cx_Oracle.DatabaseError, exc:
    error, = exc.args
    print >> sys.stderr, "Oracle-Error-Code:", error.code
    print >> sys.stderr, "Oracle-Error-Message:", error.message

Conclusion

Ce document permet d'installer le client Oracle 12c sous Debian Jessie amd_64. C'est assez facile finalement et on peut facilement créer des scripts de déploiement (Puppet/Ansible et autres) ! Avec cx_Oracle, Oracle Database est également accessible à tout bon codeur Python tout en bénéficiant de l'API DB 2.0 de ce dernier, vous permettant de créer du code (quasi) indépendant du SGBDR.

Mais il faut quand même relativiser: l'installation du dernier client PostgreSQL et de la bibliothèque Python relative se réalise de la manière suivante:

# aptitude install postgresql-client python-psycopg2

C'est quand même bien plus facile, non ?

A la fin de cet article, il reste un point intéressant à étudier. En effet, si vous êtes sous Debian, pourquoi ne pas créer un ensemble de paquets permettant de déployer ces binaires grâce à dpkg (et le reste des outils permettant d'installer des paquest Debian) ? Ce sera l'objet d'un prochain article...

Posted mar. 14 juil. 2015 17:24:15

Introduction

A la suite de notre article sur l'installation manuelle du client Oracle 12c sous Debian, j'avais émis l'hypothèse de créer un ensemble de paquets facilement déployables sous Debian. Ce sera l'objet de cet article qui va nous plonger un peu dans la création de paquets Debian.

Pour commencer, je ne suis pas développeur Debian. Donc je ne suis pas un spécialiste de la chose (même si je m'entraîne régulièrement). Je vais donc faire des erreurs ou des choix qui ne seront pas appropriés. Mais mon objectif est d'obtenir des paquets Debian permettant d'installer facilement le client Oracle via dpkg.

Ensuite, sachez qu'à moins d'un coup de tonnerre dans le Landerneau, la licence du client Oracle ne permettra JAMAIS d'envisager son inclusion dans la distribution Debian (même dans non-free). Je ne pourrais non plus JAMAIS distribuer ces paquets prêts à l'emploi.

Enfin, distribuer des binaires purs déjà compilés dans un paquet Debian est un travail particulier. En effet, la majorité des paquets Debian (et donc des outils qui vont avec) sont créés à partir de sources qu'il faut compiler. Ici, nous avons juste un ensemble de fichiers qu'il s'agira de répartir comme il faut sur le système.

Vous êtes prévenus, passons à la suite...

Télécharger ce qu'il faut

Il vous faut:

  • le client Oracle 11g nommé Instant Client.
  • le SDK Oracle 11g qui est nécéssaire pour compiler le provider Oracle de QGIS ou d'autres bibliothèques telles que cx_Oracle.
  • le binaire de SQLPlus 11g, le client SQL en ligne de commande d'Oracle. Il n'est pas nécéssaire pour la suite mais sa présence vous permettra de tester la connexion vers votre serveur Oracle Database.

Prenez soin de prendre la version adaptée à votre architecture (X86 32 ou 64 bits) et stockez ces archives dans le répertoire ~/projects/oracle/oic/.

J'ai pris le client 11g pour des questions techniques (je vais compiler le client Oracle Spatial QGIS avec cette version) mais je pense qu'on peut faire le même travail pour la version 12c sans trop de souci.

Ce que nous allons produire

Pour ma part, j'ai choisi de créer trois paquets:

  • oracle-instantclient-11.2.0.4-1.deb qui contiendra la base de l'installation, c'est à dire, tout ce qui se trouve dans le client Oracle basique, ses binaires comme ses bibliothèques partagées.
  • oracle-instantclient-dev-11.2.0.4-1.deb qui contiendra le SDK.
  • oracle-sqlplus-11.2.0.4-1.deb qui contiendra le binaire SQLPus.

Il y aura bien sûr une interdépendance entre les paquets. Plutôt que de tout mettre dans /opt, je vais installer l'ensemble des fichiers dans le système standard Debian mais en respectant les chemins qu'on peut trouver dans les paquets RPM fournis par Oracle. En effet, l'objectif est de se conformer le plus possible à la charte Debian tout en permettant à la majorité des programmes qui se basent sur Oracle de trouver les bibliothèques. De fait, la charte Debian interdit de mettre des fichiers dans /opt et dans /usr/local. Donc autant tout mettre au bon endroit directement. De plus, la désinstallation via apt permettra facilement de retirer l'ensemble des fichiers en cas de problème, sans pourrir le reste du système (enfin, si on travaille bien).

Un peu de théorie sur les paquets Debian

Pour mieux comprendre ce que nous allons faire, vous DEVEZ lire le guide du nouveau mainteneur Debian.

Dans la pratique, nous allons créer des paquets Debian simples qui ne font que copier des fichiers au bon endroit. C'est un type de paquet spécial mais assez facile à comprendre: il n'y a pas de phase de compilation.

Pour résumer, voici les éléments à intégrer avant de commencer:

  • On créé un répertoire dédié à chaque paquet.
  • Dans ce répertoire, on dézippe chaque archive du client Oracle selon le nom du paquet.
  • On créé ensuite un répertoire debian à la racine du répertoire dédié.
  • Dans ce répertoire debian, on créé les fichiers nécessaires à la création du paquet.
  • Pour faire simple, on va surtout déclarer où placer les fichiers Oracle dans le système cible.
  • Ensuite, nous allons utiliser les outils debian pour créer le paquet (via dpkg-buildpackage).

Avant de nous plonger dans le travail, créez les répertoires dédiés à l'empaquetage:

$ mkdir -p ~/projects/oracle/packaging/oracle-instantclient/debian
$ mkdir -p ~/projects/oracle/packaging/oracle-sqlplus/debian
$ mkdir -p ~/projects/oracle/packaging/oracle-instantclient-dev/debian
$ cd ~/projects/oracle/packaging/oracle-instantclient && unzip ~/projects/oracle/oic/instantclient-basic-linux.x64-11.2.0.4.0.zip
$ cd ~/projects/oracle/packaging/oracle-sqlplus && unzip ~/projects/oracle/oic/instantclient-sqlplus-linux.x64-11.2.0.4.0.zip
$ cd ~/projects/oracle/packaging/oracle-instantclient-dev && unzip ~/projects/oracle/oic/instantclient-sdk-linux.x64-11.2.0.4.0.zip

Paquet oracle-instantclient-11.2.0.4-1.deb

Introduction

Les fichiers binaires sont dans le répertoire ~/projects/oracle/packaging/oracle-instantclient/instantclient_11_2. Nous allons créer un ensemble de fichiers pour l'empaquetage Debian. Ces derniers sont dans ~/projects/oracle/packaging/oracle-instantclient/debian/ et je vais les présenter un par un...

Fichier control

Ce fichier permet de définir les informations de dépendances du paquet ainsi que le nom précis et les éléments qui se retrouveront dans les métadonnées du paquet. Voici son contenu adapté:

Source: oracle-instantclient
Section: non-free/database
Priority: extra
Maintainer: Médéric Ribreux <mederic.ribreux@medspx.fr>
Build-Depends: debhelper (>= 9.0.0~)
Standards-Version: 3.9.6

Package: oracle-instantclient
Architecture: amd64
Depends: ${misc:Depends}, libaio1
Description: Oracle Instant Client base package
 Instant Client allows you to run your applications without installing
 the standard Oracle client or having an ORACLE_HOME. OCI, OCCI,
 Pro*C, ODBC, and JDBC applications work without modification, while
 using significantly less disk space than before.

On voit que le paquet dépend notamment de libaio1 et j'ai indiqué un petit blabla pour plus d'informations.

Fichier changelog

Ce fichier permet de présenter les informations sur l'évolution du packaging ainsi que de préciser le numéro de version du paquet.

[[! format bash """ oracle-instantclient (11.2.0.4.0-1) unstable; urgency=low

"""]]

Fichier compat

Ce fichier précise quelle est la version de système d'empaquetage que nous utilisons (dans notre cas, il s'agit de debhelper v9).

9

Fichier README.Debian

Ce fichier indique des informations sur le contenu du paquet. J'ai fait un petit blabla sur les autres utilitaires présent dans les binaires livrés par Oracle.

Oracle Instant Client for Debian
--------------------------------

This package install the basic Oracle Instant Client on a Debian
system. This package only install the libraries and the executable
binaries into the Debian system. Ths package can only work for x86_64
systems as Oracle Corporation only provides binaries for this
plateform.

To use a tnsnames.ora file, you have to export the TNS_ADMIN
environment variable on a per-user configuration. I suggest you use
the following:

  $ mkdir ~/.oracle
  $ mv tnsnames.ora ~/.oracle/
  $ echo "# TNSNAMES for Oracle" >> ~/.profile
  $ echo "export TNS_ADMIN=~/.oracle/" >> ~/.profile

With this package, you will also find the following tools:

* adcri: ADR Command Interpreter
  The ADR Command Interpreter (ADRCI) is a command-line tool that you
  use to manage Oracle Database diagnostic data.
* genezi: Generate EZ Instantclient
  Instant Client (i.e. no sqlplus) from 10.2.0.3 up can run
  LD_LIBRARY_PATH=$ORACLE_HOME/lib genezi -v to get client
  version.
* uidrvci: ADR related. E.g., uidrvci
  /u01/app/oracle/diag/rdbms/db_name/instance_name/trace getSchema
  INC_METER_SUMMARY, where INC_METER_SUMMARY is an .ams file under the
  trace/metadata subdir of the directory in the second arg. This
  getSchema command shows the table definition of v$incmeter_summary
  (summary of incident meters). Not sure what use this command really
  has.

Fichier rules

C'est le fichier le plus important: il indique comment compiler le paquet. Dans notre cas, il y juste des fichiers à copier donc le fichier rules est très simple. Il repose sur d'autres fichiers (install, docs, etc.) pour paramétrer quoi faire.

#!/usr/bin/make -f

clean:
    dh_clean

%:
    dh $@

Fichier install

Ce fichier indique quels sont les fichiers à copier et où doivent-ils être copiés. Dans notre cas, nous allons effectuer une installation directement dans le système d'exploitation pour nous conformer à la charte Debian. La majorité se retrouve dans /usr/lib/oracle/11.2/client64/lib mais il y a quelques binaires qui vont se retrouver dans /usr/bin. Enfin, les jar ont vocation à être dans /usr/share/java.

instantclient_11_2/adrci usr/lib/oracle/11.2/client64/bin
instantclient_11_2/genezi usr/lib/oracle/11.2/client64/bin
instantclient_11_2/uidrvci usr/lib/oracle/11.2/client64/bin
instantclient_11_2/libclntsh.so.11.1 usr/lib/oracle/11.2/client64/lib
instantclient_11_2/libocci.so.11.1 usr/lib/oracle/11.2/client64/lib
instantclient_11_2/libnnz11.so usr/lib/oracle/11.2/client64/lib
instantclient_11_2/libociei.so usr/lib/oracle/11.2/client64/lib
instantclient_11_2/libocijdbc11.so usr/lib/oracle/11.2/client64/lib
instantclient_11_2/ojdbc5.jar usr/lib/oracle/11.2/client64/lib
instantclient_11_2/ojdbc6.jar usr/lib/oracle/11.2/client64/lib
instantclient_11_2/xstreams.jar usr/lib/oracle/11.2/client64/lib
oracle-instantclient.conf etc/ld.so.conf.d

Le répertoire /usr/lib/oracle/11.2/client64/ correspond à l'emplacement d'installation du paquet RPM officiel d'Oracle. C'est cet emplacement que nous allons utiliser car de nombreux programmes s'attendent à le trouver à cet endroit. C'est le cas de QGIS par exemple.

Par ailleurs, ces fichiers étants situés dans des emplacements non standards pour le linker dynamique, il faut ajouter un fichier dans /etc/ld.so.conf.d/. Ce dernier permettra d'ajouter les bibliothèques présentes dans /usr/lib/oracle/11.2/client64/lib dans le chemin de recherche du linker dynamique du système. C'est un peu crade (j'aurais pu mettre tout dans /usr/lib et /usr/bin) mais j'ai préferré suivre ce qui avait été fait pour le RPM tout en permettant de lancer sqlplus directement en ligne de commande, sans créer la variable d'environnement ORACLE_HOME. Le contenu du fihcier est présenté un peu plus bas...

Fichier docs

Ce fichier indique quels sont les fichiers de doc qui vont se retrouver dans /usr/share/doc/oracle-instantclient/

instantclient_11_2/BASIC_README

Ce fichier indique quels sont les liens symboliques à réaliser lors de l'installation du paquet. Pour notre part, nous devons créer le lien vers libclntsh.so (comme vu dans la procédure manuelle).

usr/lib/oracle/11.2/client64/lib/libclntsh.so.11.1 usr/lib/oracle/11.2/client64/lib/libclntsh.so
usr/lib/oracle/11.2/client64/lib/libocci.so.11.1 usr/lib/oracle/11.2/client64/lib/libocci.so

Fichier shlibs

Le paquet oracle-instantclient installe des binaires mais également des bibliothèques partagées. Sous Debian, il faut respecter certaines règles, notamment pour indiquer quelles sont les bibliothèques que le paquet installe. Cela permet aux autres paquets Debian qui vont utiliser ces bibliothèques de déterminer automatiquement quel sont les dépendances vers les paquets qui embarques ces bibliothèques partagées.

Voici le contenu du fichier:

libclntsh       11.1    oracle-instantclient (>= 11.2)
libnnz11        11.1    oracle-instantclient (>= 11.2)
libocci     11.1    oracle-instantclient (>= 11.2)
libociei    11.1    oracle-instantclient (>= 11.2)
libocijdbc11    11.1    oracle-instantclient (>= 11.2)

Chaque ligne indique le nom global de la bibliothèque partagée, suivi du numéro de version (11.1 tel que le SONAME l'indique). On trouve en fin de chaque ligne, le nom du paquet concerné.

A l'issue de l'installation, le contenu de ce paquet est déposé dans /var/lib/dpkg/info/oracle-instantclient.shlibs.

C'est la manière la plus simple que j'ai trouvée pour indiquer les dépendances pour les bibliothèques partagées pour qu'elles puissent être identifiées par les programmes tiers. Il existe également la version avec les fichiers de symbôles mais c'est, de mon point de vue, plus compliqué à gérer.

Dans la pratique, lorsqu'on travaille avec les sources du programme, cette opération est réalisée quasiment automatiquement par les programmes de création de paquets Debian. Dans notre cas, nous n'avons que des binaires et nous devons créer cette information à la main.

Fichier copyright

Il s'agit du fichier qui précise les licences des différents composants du paquet, y compris les fichiers Debian. Il repose sur une norme précise. Pour ma part, j'ai ajouté la totalité de la licence Oracle (juste pour faire propre) d'où la taille du fichier.

Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=135
Name: oracle-instantclient
Maintainer: Médéric Ribreux <mederic.ribreux@medspx.fr>
Source: http://medspx.fr

Files: instantclient_11_2/*
Copyright: 2013 Oracle Corporation
License: Oracle Technology Network Development and Distribution License Terms for Instant Client

Files: debian/*
Copyright: 2015 Médéric Ribreux <mederic.ribreux@medspx.fr>
License: GPL-2+

License: GPL-2+
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.
 .
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 GNU General Public License for more details.
 .
 You should have received a copy of the GNU General Public License along
 with this program; if not, write to the Free Software Foundation, Inc.,
 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 .
 On Debian systems, the full text of the GNU General Public
 License version 2 can be found in the file
 `/usr/share/common-licenses/GPL-2'.

License: Oracle Technology Network Development and Distribution License Terms for Instant Client
 Export Controls on the Programs
 
 Selecting the "Accept License Agreement" button is a confirmation of
 your agreement that you comply, now and during the trial term, with
 each of the following statements:

 -You are not a citizen, national, or resident of, and are not under
 control of, the government of Cuba, Iran, Sudan, Libya, North Korea,
 Syria, nor any country to which the United States has prohibited
 export.
 -You will not download or otherwise export or re-export the Programs,
 directly or indirectly, to the above mentioned countries nor to
 citizens, nationals or residents of those countries.
 -You are not listed on the United States Department of Treasury lists
 of Specially Designated Nationals, Specially Designated Terrorists,
 and Specially Designated Narcotic Traffickers, nor are you listed on
 the United States Department of Commerce Table of Denial Orders.

 You will not download or otherwise export or re-export the Programs,
 directly or indirectly, to persons on the above mentioned lists.

 You will not use the Programs for, and will not allow the Programs to
 be used for, any purposes prohibited by United States law, including,
 without limitation, for the development, design, manufacture or
 production of nuclear, chemical or biological weapons of mass
 destruction.

 EXPORT RESTRICTIONS
 You agree that U.S. export control laws and other applicable export
 and import laws govern your use of the programs, including technical
 data; additional information can be found on Oracle®'s Global Trade
 Compliance web site (http://www.oracle.com/products/export).

 You agree that neither the programs nor any direct product thereof
 will be exported, directly, or indirectly, in violation of these
 laws, or will be used for any purpose prohibited by these laws
 including, without limitation, nuclear, chemical, or biological
 weapons proliferation.

 Oracle Employees: Under no circumstances are Oracle Employees
 authorized to download software for the purpose of distributing it to
 customers. Oracle products are available to employees for internal
 use or demonstration purposes only. In keeping with Oracle's trade
 compliance obligations under U.S. and applicable multilateral law,
 failure to comply with this policy could result in disciplinary
 action up to and including termination.

 Note: You are bound by the Oracle Technology Network ("OTN") License
 Agreement terms. The OTN License Agreement terms also apply to all
 updates you receive under your Technology Track subscription.

 The OTN License Agreement terms below supercede any shrinkwrap
 license on the OTN Technology Track software CDs and previous OTN
 License terms (including the Oracle Program License as modified by
 the OTN Program Use Certificate).

 Oracle Technology Network Development and Distribution License
 Agreement for Instant Client

 "We," "us," and "our" refers to Oracle America, Inc. "You" and "your"
 refers to the individual or entity that wishes to use the Programs
 from Oracle under this Agreement. "Programs" refers to the Software
 Products referenced below that you wish to download and use and
 Program documentation. "License" refers to your right to use the
 Programs and Program documentation under the terms of this
 Agreement. The substantive and procedural laws of California govern
 this Agreement. You and Oracle agree to submit to the exclusive
 jurisdiction of, and venue in, the courts of San Francisco, San
 Mateo, or Santa Clara counties in California in any dispute arising
 out of or relating to this Agreement.

 We are willing to license the Programs to you only upon the condition
 that you accept all of the terms contained in this Agreement. Read
 the terms carefully and select the "Accept" button at the bottom of
 the page to confirm your acceptance. If you are not willing to be
 bound by these terms, select the "Do Not Accept" button and the
 registration process will not continue.

 Software Product
 - Instant Client
 
 License Rights

 License.
 We grant you a non-exclusive right and license to use the Programs
 solely for your business purposes and development and testing
 purposes, subject to the terms of this Agreement. You may allow third
 parties to use the Programs, subject to the terms of this Agreement,
 provided such third party use is for your business operations only.

 Distribution License
 We grant you a non-exclusive right and license to distribute the
 Programs, provided that you do not charge your end users for use of
 the Programs. Your distribution of such Programs shall at a minimum
 include the following terms in an executed license agreement between
 you and the end user that: (1) restrict the use of the Programs to
 the business operations of the end user; (2) prohibit (a) the end
 user from assigning, giving, or transferring the Programs or an
 interest in them to another individual or entity (and if your end
 user grants a security interest in the Programs, the secured party
 has no right to use or transfer the Programs); (b) make the Programs
 available in any manner to any third party for use in the third
 party's business operations (unless such access is expressly
 permitted for the specific program license or materials from the
 services you have acquired); and (c) title to the Programs from
 passing to the end user or any other party; (3) prohibit the reverse
 engineering (unless required by law for interoperability),
 disassembly or decompilation of the Programs and prohibit duplication
 of the Programs except for a sufficient number of copies of each
 Program for the end user's licensed use and one copy of each Program
 media; (4) disclaim, to the extent permitted by applicable law, our
 liability for any damages, whether direct, indirect, incidental, or
 consequential, arising from the use of the Programs; (5) require the
 end user at the termination of the Agreement, to discontinue use and
 destroy or return to you all copies of the Programs and
 documentation; (6) prohibit publication of any results of benchmark
 tests run on the Programs; (7) require the end user to comply fully
 with all relevant export laws and regulations of the United States
 and other applicable export and import laws to assure that neither
 the Programs, nor any direct product thereof, are exported, directly
 or indirectly, in violation of applicable laws; (8) do not require us
 to perform any obligations or incur any liability not previously
 agreed to between you and us; (9) permit you to audit your end user's
 use of the Programs or to assign your right to audit the end user's
 use of the Programs to us; (10) designate us as a third party
 beneficiary of the end user license agreement; (11) include terms
 consistent with those contained in the sections of this Agreement
 entitled "Disclaimer of Warranties and Exclusive Remedies," "No
 Technical Support," "End of Agreement," "Relationship Between the
 Parties," and "Open Source"; and (11) exclude the application of the
 Uniform Computer Information Transactions Act.

 You may allow your end users to permit third parties to use the
 Programs on such end user's behalf for the purposes set forth in the
 end user license agreement, subject to the terms of such
 agreement. You shall be financially responsible for all claims and
 damages to us caused by your failure to include the required
 contractual terms set forth above in each end user license agreement
 between you and an end user. We are a third party beneficiary of any
 end user license agreement between you and the end user, but do not
 assume any of your obligations thereunder, and you agree that you
 will not enter into any end user license agreement that excludes us
 as a third party beneficiary and will inform your end users of our
 rights.

 If you want to use the Programs for any purpose other than as
 expressly permitted under this Agreement you must contact us to
 obtain the appropriate license. We may audit your use of the
 Programs. Program documentation is either shipped with the Programs,
 or documentation may be accessed online at
 http://www.oracle.com/technetwork/indexes/documentation/index.html.

 You agree to: (a) defend and indemnify us against all claims and
 damages caused by your distribution of the Programs in breach of this
 Agreement and/or failure to include the required contractual
 provisions in your end user agreement as stated above; (b) keep
 executed end user agreements and records of end user information
 including name, address, date of distribution and identity of
 Programs distributed; (c) allow us to inspect your end user
 agreements and records upon request; and, (d) enforce the terms of
 your end user agreements so as to effect a timely cure of any end
 user breach, and to notify us of any breach of the terms.

 Ownership and Restrictions
 We retain all ownership and intellectual property rights in the
 Programs. You may make a sufficient number of copies of the Programs
 for the licensed use and one copy of the Programs for backup
 purposes.

 You may not:
 -use the Programs for any purpose other than as provided above;
 -charge your end users for use of the Programs;
 -remove or modify any Program markings or any notice of our
 proprietary rights;
 -assign this agreement or give the Programs, Program access or an
 interest in the Programs to any individual or entity except as
 provided under this agreement;
 -cause or permit reverse engineering (unless required by law for
 interoperability), disassembly or decompilation of the Programs;
 -disclose results of any Program benchmark tests without our prior
 consent.

 Export
 You agree that U.S. export control laws and other applicable export
 and import laws govern your use of the Programs, including technical
 data; additional information can be found on Oracle's Global Trade
 Compliance web site located at
 http://www.oracle.com/products/export/index.html. You agree that
 neither the Programs nor any direct product thereof will be exported,
 directly, or indirectly, in violation of these laws, or will be used
 for any purpose prohibited by these laws including, without
 limitation, nuclear, chemical, or biological weapons proliferation.

 Disclaimer of Warranty and Exclusive Remedies

 THE PROGRAMS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. WE
 FURTHER DISCLAIM ALL WARRANTIES, EXPRESS AND IMPLIED, INCLUDING
 WITHOUT LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.

 IN NO EVENT SHALL WE BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
 PUNITIVE OR CONSEQUENTIAL DAMAGES, OR DAMAGES FOR LOSS OF PROFITS,
 REVENUE, DATA OR DATA USE, INCURRED BY YOU OR ANY THIRD PARTY,
 WHETHER IN AN ACTION IN CONTRACT OR TORT, EVEN IF WE HAVE BEEN
 ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. OUR ENTIRE LIABILITY FOR
 DAMAGES HEREUNDER SHALL IN NO EVENT EXCEED ONE THOUSAND DOLLARS
 (U.S. $1,000).

 No Technical Support
 Our technical support organization will not provide technical
 support, phone support, or updates to you or end users for the
 Programs licensed under this agreement.

 Restricted Rights
 If you distribute a license to the United States government, the
 Programs, including documentation, shall be considered commercial
 computer software and you will place a legend, in addition to
 applicable copyright notices, on the documentation, and on the media
 label, substantially similar to the following:
 NOTICE OF RESTRICTED RIGHTS
 "Programs delivered subject to the DOD FAR Supplement are 'commercial
 computer software' and use, duplication, and disclosure of the
 programs, including documentation, shall be subject to the licensing
 restrictions set forth in the applicable Oracle license
 agreement. Otherwise, programs delivered subject to the Federal
 Acquisition Regulations are 'restricted computer software' and use,
 duplication, and disclosure of the programs, including documentation,
 shall be subject to the restrictions in FAR 52.227-19, Commercial
 Computer Software-Restricted Rights (June 1987). Oracle Corporation,
 500 Oracle Parkway, Redwood City, CA 94065."

 End of Agreement
 You may terminate this Agreement by destroying all copies of the
 Programs. We have the right to terminate your right to use the
 Programs if you fail to comply with any of the terms of this
 Agreement, in which case you shall destroy all copies of the
 Programs.

 Relationship Between the Parties
 The relationship between you and us is that of
 licensee/licensor. Neither party will represent that it has any
 authority to assume or create any obligation, express or implied, on
 behalf of the other party, nor to represent the other party as agent,
 employee, franchisee, or in any other capacity. Nothing in this
 Agreement shall be construed to limit either party's right to
 independently develop or distribute software that is functionally
 similar to the other party's products, so long as proprietary
 information of the other party is not included in such software.

 Open Source
 "Open Source" software - software available without charge for use,
 modification and distribution - is often licensed under terms that
 require the user to make the user's modifications to the Open Source
 software or any software that the user 'combines' with the Open
 Source software freely available in source code form. If you use Open
 Source software in conjunction with the Programs, you must ensure
 that your use does not: (i) create, or purport to create, obligations
 of us with respect to the Oracle Programs; or (ii) grant, or purport
 to grant, to any third party any rights to or immunities under our
 intellectual property or proprietary rights in the Oracle
 Programs. For example, you may not develop a software program using
 an Oracle Program and an Open Source program where such use results
 in a program file(s) that contains code from both the Oracle Program
 and the Open Source program (including without limitation libraries)
 if the Open Source program is licensed under a license that requires
 any "modifications" be made freely available. You also may not
 combine the Oracle Program with programs licensed under the GNU
 General Public License ("GPL") in any manner that could cause, or
 could be interpreted or asserted to cause, the Oracle Program or any
 modifications thereto to become subject to the terms of the GPL.

 Entire Agreement
 You agree that this Agreement is the complete agreement for the
 Programs and licenses, and this Agreement supersedes all prior or
 contemporaneous Agreements or representations. If any term of this
 Agreement is found to be invalid or unenforceable, the remaining
 provisions will remain effective.

 Last updated: 01/24/08

 Should you have any questions concerning this License Agreement, or
 if you desire to contact Oracle for any reason, please write:
 Oracle America, Inc.
 500 Oracle Parkway,
 Redwood City, CA 94065

 Oracle may contact you to ask if you had a satisfactory experience
 installing and using this OTN software download.

Fichier sources/format

Il s'agit du fichier qui précise le type de paquet Debian. Dans notre cas, c'est un paquet natif.

3.0 (native)

Fichier oracle-instantclient/oracle-instantclient.conf

Il s'agit du fichier permettant au linker dynamique de trouver les bibliothèques partagées d'Oracle car elles ne sont pas situées dans /usr/lib.

Il doit être placé dans la racine du répertoire d'empaquetage (avant debian):

# Oracle Instant Client libraries
/usr/lib/oracle/11.2/client64/lib

Création du paquet

Nous allons utiliser dpkg-buildpackage pour créer le paquet:

$ cd ~/projects/oracle/packaging/oracle-instantclient
$ dpkg-buildpackage -b -us -uc

Voici l'explication des options:

  • -b indique que nous souhaitons créer uniquement le paquet binaire et non le paquet source.
  • -us indique que nous ne souhaitons pas signer le paquet source.
  • -uc indique que nous ne souhaitons pas signer le paquet .changes.

La construction du paquet devrait remonter quelques avertissements, notamment des symbôles non utilisés dans la bibliothèque libocci.so. Ce n'est pas grave, cela signifie que dpkg-shlibdeps n'a pas été capable de trouver ces symbôles dans d'autres bibliothèques pour déterminer les dépendances du paquet.

A l'issue de la création du paquet, vous devriez disposer du fichier ~/projects/oracle/packaging/oracle-instantclient_11.2.0.4.0-1_amd64.deb que vous pourrez installer via dpkg avec le compte root.

Paquet oracle-sqlplus-11.2.0.4-1.deb

Introduction

Le principe est le même que pour le paquet précédent. Je ne vais détailler que les fichiers qui changent.

Fichier control

Source: oracle-sqlplus
Section: non-free/database
Priority: extra
Maintainer: Médéric Ribreux <mederic.ribreux@medspx.fr>
Build-Depends: debhelper (>= 9.0.0~)
Standards-Version: 3.9.6

Package: oracle-sqlplus
Architecture: amd64
Depends: ${misc:Depends}, oracle-instantclient (=11.2.0.4.0-1)
Description: Oracle Instant Client SQLPlus utility
 Oracle SQLPlus is a command line sql utility. You can use it to send
 SQL commands and scripts to Oracle Database servers.

Fichier install

instantclient_11_2/sqlplus usr/lib/oracle/11.2/client64/bin
instantclient_11_2/libsqlplus.so usr/lib/oracle/11.2/client64/lib
instantclient_11_2/libsqlplusic.so usr/lib/oracle/11.2/client64/lib
instantclient_11_2/glogin.sql usr/lib/oracle/11.2/client64/lib

On place tout dans le même répertoire que pour le paquet précédent. Mais comme j'aime bien disposer de la commande sqlplus sans taper son chemin complet, nous allons créer un lien symbolique pour pallier à ce problème.

usr/lib/oracle/11.2/client64/bin/sqlplus usr/bin/sqlplus

Et voilà, sqlplus est disponible depuis le shell directement.

Fichier changelog

oracle-sqlplus (11.2.0.4.0-1) unstable; urgency=low

  * Initial release.

 -- Médéric Ribreux <mederic.ribreux@medspx.fr>  Sun, 24 May 2015 12:37:54 +0100

Fichier docs

instantclient_11_2/SQLPLUS_README

Création du paquet

On utilise également dpkg-buildpackage et on obtient

Paquet oracle-instantclient-dev-11.2.0.4-1.deb

Introduction

Même punition, il faut procéder de la même manière que pour le paquet oracle-instantclient, en supprimant le fichier links.

Fichier control

Source: oracle-instantclient-dev
Section: non-free/database
Priority: extra
Maintainer: Médéric Ribreux <mederic.ribreux@medspx.fr>
Build-Depends: debhelper (>= 9.0.0~)
Standards-Version: 3.9.6

Package: oracle-instantclient-dev
Architecture: amd64
Depends: ${misc:Depends}, oracle-instantclient (=11.2.0.4.0-1)
Description: Oracle Instant Client Development package
 This package allow development for third parties software based upon
 Oracle Instant Client. It provides the necessary headers to compile
 software that requires Oracle Database access.

Fichier changelog

oracle-instantclient-dev (11.2.0.4.0-1) unstable; urgency=low

  * Initial release.

 -- Médéric Ribreux <mederic.ribreux@medspx.fr>  Sun, 24 May 2015 12:37:54 +0100

Fichier install

instantclient_11_2/sdk/include/*.h usr/include/oracle/11.2/client64
instantclient_11_2/sdk/ottclasses.zip usr/lib/oracle/11.2/client64/lib
instantclient_11_2/sdk/demo/* usr/share/oracle/11.2/client64
instantclient_11_2/sdk/ott usr/share/oracle/11.2/client64

Fichier docs

instantclient_11_2/sdk/SDK_README

Fichier rules

#!/usr/bin/make -f

clean:
    dh_clean

%:
    dh $@

Placer le fichier tnsnames.ora

Nous disposons maintenant de paquets prêts à l'emploi mais il reste un dernier acte de configuration manuelle: le fichier tnsnames.ora. Difficile quand on conçoit un paquet de placer ce fichier. Faut-il le rendre disponible pour tout le système ou seulement pour l'utilisateur ?

Mon choix est cependant limité par le binaire fourni par Oracle. En effet, le client Oracle dans son ensemble (SQLPlus aussi) ne retrouve le fichier tnsnames.ora qu'en fonction d'une variable d'environnement (TNS_ADMIN ou ORACLE_HOME). Or, nous n'avons rien indiqué dans notre paquet pour créer ces variables d'environnement. De plus, je n'aime pas ajouter de nouvelles variables d'environnement pour tout le système.

Le système le plus simple et le plus propre que j'ai trouvé consiste à créer un répertoire .oracle dans votre répertoire home, à placer le fichier tnsnames.ora dedans et à définir la variable d'environnement TNS_ADMIN au niveau de votre ~/.profile. D'un côté, on permet à plusieurs utilisateurs différents de disposer de fichier tnsnames différents. De plus, par défaut, aucun utilisateur ne peut utiliser ce fichier sans action préalable ce qui me paraît plus intéressant d'un point de vue sécurité (ce n'est pas énorme mais c'est mieux que rien que d'empêcher un compte n'ayant pas forcément besoin du client Oracle de ne pas connaître les emplacements des serveurs de base de données).

Voici la manipulation:

$ mkdir ~/.oracle
$ mv tnsnames.ora ~/.oracle/
$ echo "# TNSNAMES for Oracle" >> ~/.profile
$ echo "export TNS_ADMIN=~/.oracle/" >> ~/.profile

Je l'ai indiquée dans le README.Debian du paquet oracle-instantclient.

Pourquoi .profile et non .bashrc. La réponse est assez simple: déclarer la variable dans .profile permet à tous les scripts non-interactifs qui sont lancés avec le shell sh de bénéficier de cette variable. C'est le cas du lanceur de QGIS par exemple. De plus, avec .profile, la variable est également disponible pour Bash. Que demande le peuple ?

Conclusion

Un simple:

# dpkg -i oracle-instantclient_11.2.0.4.0-1_amd64.deb oracle-instantclient-dev_11.2.0.4.0-1_amd64.deb oracle-sqlplus_11.2.0.4.0-1_amd64.deb

, suivi d'une initialisation de variable client (TNS_ADMIN), vous permettra d'installer le client Oracle, SQLPlus et le SDK sous forme de paquets Debian. C'est très pratique si vous devez installer ce client sur un grand nombre de serveurs par déploiement piloté (ou par des scripts).

Maintenant que nous avons les bases, il reste à voir comment créer les paquets Debian de QGIS en produisant le provider Oracle. Ce sera l'objet d'un prochain article...

Encore une fois, je ne suis pas un développeur Debian et ces paquets sont un peu spéciaux. J'ai sans doute fait des erreurs et peut-être que vous aurez besoin d'aller un peu plus loin. Dans ce cas, n'hésitez pas à lire la charte Debian et le guide du nouveau mainteneur Debian pour "hacker" plus loin !

Posted sam. 18 juil. 2015 14:27:57

Introduction

A la suite de mes différents articles sur l'installation et l'empaquetage du client Oracle, il est temps de passer à l'objectif final de ces opérations: installer le provider Oracle Spatial (que j'appelle aussi connecteur Oracle Spatial) pour QGIS sous Debian Jessie.

Nous allons récupérer les sources de QGIS, basculer sur une branche stable, effectuer nos petites modifications pour inclure les bibliothèques Oracle et créer les différents paquets. A l'issue de cette procédure, nous disposerons d'une installation complète de QGIS avec la possibilité de se connecter à un serveur Oracle Spatial, que ce soit pour un usage station de travail ou pour utiliser QGIS Server.

Mode opératoire

Pour ma part, j'effectue l'empaquetage dans une machine virtuelle. En effet, cette opération d'empaquetage de QGIS nécéssite d'installer une sacrée liste de paquets et je ne souhaite pas alourdir ma station de travail avec des paquets qui ne me serviront qu'une seule fois (ou dans tous les cas assez peu souvent).

Récupérer les sources et pointer vers la bonne version de QGIS

$ mkdir -p ~/packaging
$ git clone https://github.com/qgis/QGIS.git
$ cd ~/packaging
$ git clone ../QGIS
$ git checkout final-2_10_0

C'est la version 2.10 qui sera utilisée dans la suite de cet article mais les instructions doivent fonctionner aussi bien pour les versions ultérieures que pour les versions antérieures, à partir de la version 2.8.

Paquets à installer

Avant de pouvoir empaqueter QGIS, il va vous falloir un sacré paquet de paquets !

Voici la liste:

# apt install build-essential ca-certificates devscripts fakeroot bison cmake debhelper flex grass-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl0-dev libpq-dev libproj-dev libqt4-dev libqt4-opengl-dev libqtwebkit-dev libqwt-dev libspatialite-dev libsqlite3-dev libspatialindex-dev pkg-config pyqt4-dev-tools python-all-dev python-dev python-qt4-dev python-sip-dev txt2tags doxygen python-qscintilla2 pyqt4.qsci-dev libosgearth-dev libopenscenegraph-dev libqscintilla2-dev graphviz xvfb xauth xfonts-base xfonts-100dpi xfonts-75dpi xfonts-scalable spawn-fcgi lighttpd poppler-utils python-pyspatialite qt4-doc-html libqt4-sql-sqlite python-matplotlib osgearth-data python-psycopg2 python-httplib2 python-jinja2 python-markupsafe liblwgeom-2.1.7 qt4-designer

Si vous avez suivi mon précédent article, vous pourrez bien entendu, installer les paquets oracle-instantclient et oracle-instantclient-dev pour pouvoir compiler le provider Oracle. Vous pouvez également simplement installer le client Oracle à la main.

Modification du fichier debian/control.in

Le fichier debian/control.in est un fichier modèle pour le fichier debian/control. Pour ceux qui font régulièrement de la fabrication de paquet Debian, ce fichier ne devrait pas avoir de secret. QGIS présente la particularité de mettre à part la construction du paquet dédié au connecteur Oracle Spatial. En effet, le client et le SDK Oracle étant non libres, ils ne sont pas empaquetés dans la distribution Debian.

Vous devez donc modifier le fichier debian/control.in pour générer le paquet du provider Oracle. Si vous l'omettez, le paquet ne sera pas construit et le connecteur ne sera pas disponible même si l'iĉone d'accès à la boîte de dialogue de sélection des couches sera présente dans l'interface de QGIS. Ajoutez les éléments à la fin du fichier:

Package: qgis-oracle-provider
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, oracle-instantclient
Section: contrib/database
Description: QGIS oracle provider
 QGIS is a Geographic Information System (GIS) which manages, analyzes and
 display databases of geographic information.
 .
 This package contains the QGIS oracle provider.

Pensez à supprimer la dépendance vers oracle-instantclient si vous n'avez pas installé le client Oracle via le paquet non officiel que j'ai présenté dans cet article.

Modification du fichier debian/rules

Une fois le paquet du connecteur Oracle correctement déclaré, il reste à modifier le fichier debian/rules. En effet, par défaut, le fichier rules indique de ne fabriquer le paquet que sous la distribution sid-oracle. Or, nous sommes sous Jessie. Par défaut, la construction de paquet ne saura pas fabriquer le connecteur Oracle.

Vous devez modifier la variale CMAKE_OPTS et y inclure la directive -DWITH_ORACLE=TRUE, comme dans ce qui suit:

...
CMAKE_OPTS := \
        -DBUILDNAME=$(DEB_BUILD_NAME) \
        -DCMAKE_VERBOSE_MAKEFILE=1 \
        -DCMAKE_INSTALL_PREFIX=/usr \
        -DGRASS_PREFIX=/usr/lib/$(GRASS) \
        -DBINDINGS_GLOBAL_INSTALL=TRUE \
        -DPEDANTIC=TRUE \
        -DWITH_QSPATIALITE=TRUE \
        -DWITH_SERVER=TRUE \
        -DWITH_SERVER_PLUGINS=TRUE \
        -DSERVER_SKIP_ECW=TRUE \
    -DQGIS_CGIBIN_SUBDIR=/usr/lib/cgi-bin \
        -DWITH_APIDOC=TRUE \
        -DWITH_CUSTOM_WIDGETS=TRUE \
        -DWITH_ORACLE=TRUE \
        -DWITH_GLOBE=TRUE \
        -DWITH_INTERNAL_HTTPLIB2=FALSE \
        -DWITH_INTERNAL_JINJA2=FALSE \
        -DWITH_INTERNAL_MARKUPSAFE=FALSE \
        -DWITH_INTERNAL_PYGMENTS=FALSE \
        -DWITH_INTERNAL_DATEUTIL=FALSE \
        -DWITH_INTERNAL_PYTZ=FALSE \
        -DWITH_INTERNAL_SIX=FALSE
...

Modification de la configuration de CMake

Il faut modifier le fichier src/providers/oracle/ocispatial/cmake/FindOCI.cmake pour indiquer le répertoire du client Oracle et de son SDK. Si vous utilisez les paquets Debian du client Oracle OCI dont j'ai décris la réalisation, vous n'avez rien à faire. Si vous avez installé manuellement le client Oracle dans /opt, voici comment vous devez modifier le fichier:

FIND_PATH(OCI_INCLUDE_DIR oci.h
  PATHS
  /opt/oracle/instantclient_11_2/sdk/include
  $ENV{OSGEO4W_ROOT}/include
  $ENV{ORACLE_HOME}/rdbms/public
)

FIND_LIBRARY(OCI_LIBRARY clntsh oci
  PATHS
  /opt/oracle/instantclient_11_2/
  $ENV{OSGEO4W_ROOT}/lib
  $ENV{ORACLE_HOME}/lib
)
...

Création des paquets

Vous avez fait le plus dur ! Il ne reste qu'à lancer dpkg-buildpackage -us -uc -b et attendre ! Je vous conseille plutôt de lancer la commande qui suit:

$ DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -us -uc -b

L'option nocheck permet de ne pas jouer la batterie de tests à la suite de la compilation. Sachez que les tests prennent facilement une bonne demi-heure... QGIS est assez long à empaqueter comme ça (compter au moins une demi-heure sur une machine récente) !

Si jamais le processus échoue à un moment donné, il vous reste à "hacker" dans le répertoire debian et ailleurs pour voir ce qui manque. En règle générale, il s'agit d'un problème de dépendances. Pour éviter que dpkg-buildpackage ne relance toute la compilation from scratch, utilisez l'option -nc qui permet de ne pas nettoyer l'arborescence des sources. c'est très utile si vous avez un problème au moment de la création du paquet avec dh_shlibdeps par exemple.

A la fin du processus et si tout se passe bien, vous aurez une liste impressionnante de paquets deb dans le répertoire ~/packaging dont le fameux qgis-oracle-provider_2.10.0_amd64.deb !

Pour installer en mode brutal:

dpkg -i ~/packaging/*.deb

Tests

Lancez le client QGIS et tentez de créer une connexion Oracle Spatial. Si tout se passe bien, vous aurez accès à la liste de vos couches et vous pourrez en ajouter une dans le canevas de cartes.

Si ce n'est pas le cas, il va vous falloir "hacker" un peu plus. Le principal coupable sera sans doute le fichier tnsnames.ora. Lors de mon précédent article, j'avais indiqué qu'il fallait paramétrer une variable d'environnement TNS_ADMIN. Mais cette dernière n'est disponible que via un appel à Bash. Si vous lancez QGIS depuis le bureau (via les suckless-tools bien sûr), cette variable n'est pas initialisée et aucune connexion ne fonctionnera.

Vérifiez votre fichier ~/.profile pour voir s'il contient bien la variable TNS_ADMIN:

export TNS_ADMIN=~/.oracle

Une dernière recommandation

Pour assurer de bonnes performances sous Oracle Spatial, utilisez absolument les index spatiaux. Contrairement à PostGIS, les index spatiaux sont pratiquement des pré-requis sous Oracle Spatial car un très grand nombre de fonctions ne sont pas utilisables sans.

En plus de la création de l'index, vous devez vous assurer que l'utilisateur qui accède à vos données disposent également des droits de lecture sur les tables d'index (tables dont le nom commence par MDRT) sinon le provider Oracle de QGIS ne pourra pas utiliser les fonctions d'index. Voici un petit script en PL/SQL pour vous assurer de ces droits une fois tout vos index créés (remplacez utilisateur par le nom du compte Oracle à qui vous voulez donner accès à vos index, ce script doit être lancé par l'utilisateur propriétaire du schéma Oracle):

set serveroutput on
DECLARE
 tbName VARCHAR2(200);
 CURSOR mdrtTables IS
 SELECT SDO_INDEX_TABLE FROM ALL_SDO_INDEX_METADATA;
BEGIN
 -- We need to scan all the Index tables
 FOR tb in mdrtTables
 LOOP
   DBMS_OUTPUT.PUT_LINE('Table: ' || tb.SDO_INDEX_TABLE);
   EXECUTE IMMEDIATE 'GRANT SELECT ON ' || tb.SDO_INDEX_TABLE || ' TO utilisateur';
 END LOOP;
END;
/
EXIT

Conclusion

Grâce à l'empaquetage Debian, il est possible d'inclure le connecteur Oracle de QGIS en modifiant quelques fichiers. Au final, le processus n'est pas si simple car il faut installer le client Oracle et recréer le paquet Debian à la main alors que si vous aviez un serveur PostgreSQL/PostGIS, tout serait prêt "out-of-the-box".

Mais bon, parfois, on n'a pas le choix ! J'ai bien galéré à trouver une méthode suffisamment propre et automatisée pour ce travail étant donné la complexité du projet QGIS et surtout la difficulté amenée par le provider Oracle qui s'appuie sur du logiciel non libre, mal intégré sous Debian.

Néanmoins, les entités qui souhaiteraient installer QGIS Server sous Debian et qui n'ont que des données géographiques disponibles sous Oracle pourront aller un peu plus loin grâce à ces instructions...

Posted sam. 25 juil. 2015 17:44:12