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