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 !