Empaqueter le client Oracle 11g sous Debian Jessie🔗

Posted by Médéric Ribreux 🗓 In blog/ Debian/

#debian

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:

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:

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:

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.

oracle-instantclient (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 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

Fichier links

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:

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.

Fichier links

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 le paquet adéquat.

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 !