jeudi 29 novembre 2012

Choix socket PostgreSQL

Lorsque le client Postgresql se trouve sur la même machine que le serveur, les communications entre le client et le serveur s'effectuent soit via la boucle locale, soit le plus souvent à travers un fichier de type spécial appelé socket.
L'emplacement du socket peut se choisir au niveau du fichier postgresql.conf. Supposons que ce fichier contienne la sentence
unix_socket_directory='/run/postgresql'
Vérifions quel est alors le contenu du dossier /run/postgresql:
Nous constatons que le dossier /run/postgresql possède les droits rwxrwsr-x (2775 en octal).
Il s'y trouve un fichier caché de type socket: celui avec la lettre s figurant en tête de la ligne le concernant.
Le choix de l'emplacement du socket tel que formulé dans le fichier postgresql.conf est inopérant pour une connexion vers le serveur postgresql depuis libreoffice base à l'aide du pilote natif sdbc.
Ainsi il se peut que la tentative de connexion échoue avec un message du genre:
could not connect to server: Aucun fichier ou dossier de ce type 
Is the server running locally and accepting 
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
Ici le fichier socket est recherché dans /tmp alors qu'il se trouve dans /run/postgresql.
Une solution consite à modifier postgresql.conf de manière à ce que le socket soit effectivement dans /tmp.
Cependant il ne s'agit pas vraiment d'une bonne idée: en effet /tmp jouit de droits particuliers de type rwxrwxrwt (1777 en octal):


La lettre t qui figure en dernière position dans la chaîne des droits indique que le sticky bit est sur on, ce qui signifie que si chacun peut écrire dans le dossier, il ne peut modifier que les fichiers qui lui appartiennent.
Or il arrive que si postgresql.conf demande que le socket se trouve dans /tmp, alors les droits de /tmp soient modifiés de manière inopportune.
Une meilleure solution consiste à utiliser la variable d'environnement PGHOST.
Celle-ci peut avoir deux significations.
La plus évidente est que PGHOST contienne le nom du host, comme ici:


Du fait que le nom du host est précisé, psql se connecte non pas à l'aide du fichier socket, mais via la boucle locale:


Mais si la valeur de PGHOST commence par une barre oblique (/), elle indique alors l'emplacement du socket:


Voilà la solution: il suffit de s'arranger pour que PGHOST existe et contienne la bonne valeur, par exemple en plaçant dans /etc/profile.d un fichier postgresql.sh contenant:
export PGHOST=/run/postgresql

dimanche 4 novembre 2012

Ubuntu 12.10 et libreoffice base

La version 12.10 d'Ubuntu souffre du même mal que la version précédente: impossible dans libreoffice base d'exécuter un rapport réalisé avec ORB (Oracle Report Builder).
Rien de changé. On tombe sur le même message d'erreur que précédemment:


Mais cette fois la solution présentée dans ce billet conduit tout droit au crash.
Nous allons passer au plan B: ne plus utiliser la version packagée par Ubuntu et la remplacer par celle téléchargeable sur le site de libreoffice
EDIT : voir une autre solution en fin de billet
Donc nous téléchargeons les fichiers:
LibO_3.6.3_Linux_x86-64_install-deb_en-US.tar.gz
LibO_3.6.3_Linux_x86-64_langpack-deb_fr.tar.gz
LibO_3.6.3_Linux_x86-64_helppack-deb_fr.tar.gz
correspondant à notre architecture.
Et puis nous procédons depuis le dossier de téléchargement:
toto@rigel:~/Downloadssudo apt-get remove libreoffice* 
toto@rigel:~/Downloadstar xzvf LibO_3.6.3_Linux_x86-64_install-deb_en-US.tar.gz 
toto@rigel:~/Downloads$ tar xzvf LibO_3.6.3_Linux_x86-64_langpack-deb_fr.tar.gz 
toto@rigel:~/Downloads$ tar xzvf LibO_3.6.3_Linux_x86-64_helppack-deb_fr.tar.gz 
toto@rigel:~/Downloads$ cd LibO_3.6.3.2_Linux_x86-64_install-deb_en-US/DEBS/ 
toto@rigel:~/Downloads$ sudo dpkg -i *.deb 
toto@rigel:~/Downloads$ cd desktop-integration/ 
toto@rigel:~/Downloads$ sudo dpkg -i *.deb 
toto@rigel:~/Downloads$ cd ../../../LibO_3.6.3.2_Linux_x86-64_langpack-deb_fr/DEBS/ 
toto@rigel:~/Downloads$ sudo dpkg -i *.deb 
toto@rigel:~/Downloads$ cd ../../LibO_3.6.3.2_Linux_x86-64_helppack-deb_fr/DEBS 
toto@rigel:~/Downloads$ sudo dpkg -i *.deb
Et voilà!
L'extension ORB est déjà installée avec le paquet
libobasis3.6-extension-report-builder_3.6.3.2-2_amd64.deb
de même que le pilote sdbc pour une connexion à postgresql
libobasis3.6-postgresql-sdbc_3.6.3.2-2_amd64.deb
On ne doit plus s'occuper de rien de ce côté là: cool!
Il ne reste plus qu'à tenter l'exécution du fameux rapport.
Si nous travaillons avec la base de données intégrée à libreoffice, tout est OK.
Essayons maintenant avec une base de données postgresql.
Tout d'abord se connecter.
Aie:

Ça commence bien!
La réponse à la question posée
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
est nécessairement positive puisque avec la version Ubuntu de libreoffice la connexion s'effectuait sans problèmes.
Du moins c'est ce que nous pensions mais avec la version Ubuntu de libreoffice le message en cas de problème aurait été:
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Et donc en fait la réponse est négative.
Pour que le socket qui convient soit utilisé, il suffit de remplacer dans le fichier /etc/postgresql/9.1/main/postgresql.conf
unix_socket_directory = '/var/run/postgresql'  
par
unix_socket_directory = '/tmp'  
et puis de redémarrer le serveur.
De la sorte tout est OK et le rapport s'exécute sans problèmes.
(EDIT: voir une meilleure solution ici.)
Il se peut que l'on ne souhaite pas changer l'emplacement du socket. Dans ce cas,  une façon de contourner le problème consiste à modifier les paramètres de connexion en ajoutant host=rigel à l'URL de la base de données (alors que ce n'est pas nécessaire puisque nous sommes sur la machine où tourne le serveur) de manière à forcer le passage par la boucle locale:


Cette fois nous recevons le message:


C'est normal car nous ne passons plus par le Unix domain socket et d'après le contenu du fichier /etc/postgresql/9.1/main/pg_hba.conf un mot de passe est nécessaire pour une connexion via la boucle locale:

# "local" is for Unix domain socket connections only
local   all             titine                                  peer map=map01
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
Pour avoir l'opportunité de fournir un mot de passe, il suffit de cocher "Mot de passe requis".
Attention, il s'agit d'un mot de passe postgresql et non pas d'un mot de passe système.
Bien évidement, de nouveau tout fonctionne nickel et nous avons le plaisir de voir s'afficher à l'écran un magnifique rapport.

EDIT:
Une autre possibilité consiste à installer le dépôt 'libreoffice' qui permet actuellement d'avoir directement une solution fonctionnelle sans qu'il soit nécessaire de télécharger les paquets depuis le site de libreoffice.
Les commandes à exécuter sont:

toto@rigel:~$ sudo add-apt-repository ppa:libreoffice/ppa
toto@rigel:~$ sudo apt-get update
toto@rigel:~$ sudo apt-get dist-upgrade

Les fichiers dont l'absence rendait impossible la lecture des rapports, à savoir les fichiers

.../program/librptlo.so
.../program/librptuilo.so
.../program/librptxmllo.so

sont fournis avec le paquet libreoffice-report-builder-bin qui devra donc être installé avec le paquet libreoffice-report-builder.