mardi 1 mars 2016

Droits

Une phrase comme celle-ci
"Les droits sur /usr/bin sont du type 0755...."
reprise de l'article précédent a pu intriguer quelques néophytes.
Aussi, bien qu’il existe des centaines d’articles traitant des droits sur les fichiers en linux, je me suis finalement décidé à y mettre mon grain de sel.

Travaillant dans un (émulateur de) terminal, je génère à l'aide de la commande cat le fichier quisuisje contenant le texte :
echo Je suis $USER
Je termine par ENTER pour envoyer la ligne et CTRL+D pour signifier la fin du processus.
J'essaie d'exécuter le fichier avec
./quisuisje
mais évidemment ça ne fonctionne pas tant que je n'ai pas donné le droit d'exécution (chmod +x) :


J'examine (commande ls) quels sont les droits sur le fichier.
Ceux-ci

r droit en lecture
w droit en écriture
x droit en exécution

sont répartis en 3 catégories

  • droits du propriétaire du fichier (c'est moi : toto)
  • droits des membres du groupe indiqué. Ici ce sont les amis du propriétaire (membres du groupe toto)
  • droits des autres utilisateurs

Je ne veux pas que mes amis puissent modifier le fichier, aussi je leur enlève le droit en écriture sur le fichier :



La commande chmod, telle qu’utilisée ici, est suivie d’une ou de plusieurs lettres qui indiquent le ou les utilisateurs concernés :

u désigne le propriétaire
g les membres du groupe
o les autres

Vient ensuite ± puis le ou les droits ajoutés ou retirés selon le cas.
(Note: si rien ne précède +/-, la commande concerne tous les utilisateurs)

L'ensemble des droits sur un fichier constitue un nombre binaire et chaque droit attribué correspond à un bit de ce nombre binaire mis sur ON.
Les droits sur quisuisje correspondent au nombre binaire
000111101101
(Les 3 premiers bits sur OFF sont associés à des droits spéciaux dont il n'a pas été question jusqu’ici).

Je voudrais calculer le nombre hexadécimal correspondant.
Pour ce faire je regroupe les bits par série de 4 et je leur attribue les valeurs 8, 4, 2, 1.
J'annule ces valeurs si le bit est sur OFF, ensuite dans chaque groupe j'additionne les valeurs survivantes pour avoir le chiffre du nombre hexadécimal :

Le nombre décimal vaut :

1x256 + 14x16 + 13 = 493

Mais quel sens faut-il donner à la transformation en hexadécimal du nombre binaire correspondant aux droits ?
Aucun : ça n'a aucun sens. Il s'agit cependant d'un excellent entraînement pour passer maintenant à l'octal.
Les bits sont cette fois regroupés par séries de 3 avec les valeurs 4, 2, 1.
Pour le reste nous procédons de la même façon :


Le nombre décimal équivalent est évidemment inchangé :

7x64 + 5x8 + 5 = 493

Cette fois, ça a du sens.
Plutôt que d'adapter les droits sur quisuisje avec
chmod (g-w) quisuisje
on aurait pu les fixer directement :
chmod 755 quisuisje

Les droits rwx pour un dossier n'ont pas la même signification que pour un fichier :
r droit de lire le répertoire
w droit d'y ajouter ou d'y supprimer des fichiers
x droit d'y aller (dans le dossier)
Je crée dossier puis j’enlève les droits r et x aux utilisateurs qui ne sont ni toto (c’est moi) ni ses amis (membres du groupe toto) :


Au fait quels sont mes amis ?


Seulement riri.
Donc titine n’a pas le droit d’aller dans dossier :


Je rétablis le droit x pour tous. Cette fois titine peut aller dans dossier mais elle ne peut y lire le répertoire (il lui manque le droit r) :


Pour finir je donne à tous les droits rwx sur dossier (chmod 777 dossier).
Mais si un utilisateur à le droit de supprimer des fichiers, il peut tous les supprimer, même ceux qui ne sont pas à lui, même ceux pour lesquels il n'a pas le droit d'écriture!
Ainsi sur la copie d'écran qui suit, riri supprime le fichier hello appartenant à titine :


C'est ici qu'intervient le sticky bit :



S'il est activé pour un dossier dans lequel tous peuvent écrire, chacun ne pourra y supprimer que ces propres fichiers.

Activation :


Vérification:


Les droits sur le dossier sont maintenant décrit par la chaîne rwxrwxrwt et hello est à l'abri de toute suppression (sauf par son propriétaire titine ou toto propriétaire du dossier).
Le nom sticky bit provient d’un usage ancien de ce bit qui n’est pas celui expliqué ici.

Je peux aussi activer pour dossier le bit setgid :



Tout fichier créé par titine (comme salut) sera dorénavant caractérisé par le groupe toto (groupe du dossier de travail):


Comme riri appartient au groupe toto, il pourra donc modifier ce fichier.

Je veux maintenant faire machine arrière : remettre sur off les 2 bits spéciaux qui ont été activés :


Ça fonctionne pour le sticky bit (rwt devient rwx) avec chmod en mode numérique.
Pour le bit setgid, il faut utiliser chmod en mode symbolique.

Un dernier droit spécial n'a pas été évoqué jusqu'à présent.

Afin de pouvoir montrer sur une exemple ce dont il s'agit, je recopie l'exécutable whoami dans mon dossier test :


Comme je suis propriétaire de cette copie de whoami, je peux lui attribuer les droits que je veux.
Aussi j'active pour cet exécutable le bit setuid :



Pour ma copie de whoami lancée par titine, tout se passe comme si c'était moi (toto) qui l'avait lancée. Le whoami d'origine n'est évidemment pas impacté.
Pourquoi ne pas avoir avoir utilisé le fichier quisuisje pour ce qui précède?
Tout simplement parce que pour des raisons de sécurité le bit setuid est désactivé pour les fichiers scripts exécutables.

samedi 9 janvier 2016

Google-earth Fedora vs openSuse

Comme je l'ai indiqué dans le billet précédent, le paquet téléchargé ici pour Fedora 64 bits (à savoir le paquet google-earth-stable_current_x86_64.rpm) n'est pas installable suite à un conflit avec le fichier /usr/bin du paquet filesystem.
J'ai expliqué comment remédier à ce problème: supprimer la ligne

%dir %attr(0755, root, root) "/usr/bin"

dans le fichier spec du paquet (voir le billet précédent).

Cependant sur la page de téléchargement on peut constater que le paquet destiné à openSuse est le même que celui pour Fedora.
Et dans openSuse, l'installation de ce même paquet ne pose aucun problème!
Quel est ce mystère?
La réponse se trouve du côté du fichier /usr/bin fourni par filesystem.
Dans openSuse:




Les droits sur /usr/bin sont du type 0755, exactement comme dans le fichier spec.

Dans Fedora (23):




Les droits ne correspondent plus: ils valent 0555 ce qui provoque le conflit.

Plutôt que de supprimer la ligne litigieuse du fichier spec, il suffit de la modifier.


Donc je lance la commande


toto@rigel:~/Téléchargements$ rpmrebuild -p -e google-earth-stable_current_x86_64.rpm 

Ensuite dans l'éditeur qui s'ouvre (normalement c'est vi), je trouve la ligne ad hoc avec

/usr\/bin

J'amène à l'aide des flèches le curseur sur le 7, puis:

r5
:wq

A la question qui vient, je réponds que je veux continuer, ce qui provoque la création d'un nouveau paquet qu'il suffit d'installer.


 

mardi 8 décembre 2015

Mise à niveau vers Fedora 23

Je suis passé de Fedora 22 à Fedora 23 à l'aide des commandes suivantes:

[root@rigel ~]# dnf update --refresh

pour mettre à jour le système existant

[root@rigel ~]# dnf install dnf-plugin-system-upgrade

pour installer le programme qui convient

 [root@rigel ~]# dnf system-upgrade download --releasever=23

pour télécharger les paquets de la nouvelle version

[root@rigel ~]# dnf system-upgrade reboot

pour procéder à l'installation proprement dite.

En principe il n'y a pas de soucis.

Cependant si vous avez procédé à l'installation de chromium et de pepper-flash suivant ce qui est préconisé ici, il ne faut pas oublier de réactiver les dépôts russianfedora-free:

[root@rigel ~]# sed -i 's/enabled=0/enabled=1/' /etc/yum.repos.d/russianfedora-free.repo

[root@rigel ~]# sed -i 's/enabled=0/enabled=1/' /etc/yum.repos.d/russianfedora-free-updates.repo

En ce qui concerne google-earth, si un dépôt est configuré et activé, il faut le supprimer:

[root@rigel ~]# rm /etc/yum.repos.d/google-earth.repo

sous peine d'avoir une erreur qui empêche la mise à jour (c'est la même que celle dont il est question ci-après).

Le paquet téléchargé ici pour Fedora 64 bits (à savoir le paquet google-earth-stable_current_x86_64.rpm) n'est pas installable car:

Erreur : Erreur du contrôle de transaction
  le fichier /usr/bin de l'installation de google-earth-stable-7.1.4.1529-0.x86_64 entre en conflit avec le fichier du paquet filesystem-3.2-35.fc23.x86_64

Cette commande:

toto@rigel:~/Téléchargements$ rpmrebuild -p -s fichier google-earth-stable_current_x86_64.rpm && grep '/usr/bin' fichier
%dir %attr(0755, root, root) "/usr/bin"
%attr(0777, root, root) "/usr/bin/google-earth"

nous montre où est le problème: il faut supprimer la première ligne de l'output.

Je lance la commande:

toto@rigel:~/Téléchargements$ rpmrebuild -p -e google-earth-stable_current_x86_64.rpm 

qui donne la possibilité de modifier le fichier spec.

En principe l'éditeur est est vi. On y tape successivement les commandes

/usr\/bin
dd
:wq

A la question posée (veux-t-on continuer) la réponse à fournir est évidemment 'Oui', ce qui provoque la création d'un nouveau rpm qu'il reste à installer:

[root@rigel ~]# dnf install /home/toto/rpmbuild/RPMS/x86_64/google-earth-stable-7.1.4.1529-0.x86_64.rpm 

Pour que la recherche d'un lieu dans google-earth fonctionne correctement j'ai créé un alias:

alias google-earth='LC_NUMERIC=C google-earth'

(commande que j'ai mise dans mon fichier .bashrc)

Le lancement de google-earth en ligne de commande produit une série de messages d'erreurs:

1208/114257:ERROR:nss_ocsp.cc(581)] No URLRequestContext for OCSP handler.

Cependant google-earth ne crashe pas.

Si c'est le cas, il suffit de supprimer le dossier .googleearth:

[toto@rigel ~]$ rm -rf .googleearth/



mercredi 21 octobre 2015

sed utile

Et oui, c'est utile (sed utile)! La preuve par la suite.
Partant d'un fichier pdf, nous construisons chaque mois un fichier texte reprenant les dépenses liées à l’utilisation  d'une carte bancaire et ce en vue d'une importation dans une base de données.
Tout était OK jusqu'à ce que brusquement le fichier texte obtenu ne convienne plus alors que apparemment au niveau du fichier pdf rien n'était changé.
Ce fichier texte inadéquat se présentait comme suit:

blabla1 15,65
EUR
blabla2 58,49
EUR
blabla3 214,29
EUR
blabla4 1.028,56
EUR

La première anomalie (le nom de la devise sur une ligne à part) peut se résoudre facilement avec la commande sed:



Explications:
sed importe dans son espace de travail la première ligne du fichier cbxy avant d'exécuter le script, à savoir le texte entre apostrophes. Ce script comprend 2 commandes:

  1. N provoque l'importation de la ligne 2 dans l'espace de travail
  2. s/\n/ / remplace par un espace le caractère de fin de ligne (\n) qui sépare les deux lignes: elles sont concaténées.
La fin du script déclenche l'impression automatique de l'espace de travail puis sed passe à la lecture de la ligne suivante, c'est-à-dire la ligne 3 (blabla2).

Le problème serait donc résolu s'il n'y avait qu'une seule anomalie. Hélas une autre anomalie est apparue: la disparition du signe moins (-) devant les montants (alors que ce signe est bel et bien présent dans le fichier pdf).
De nouveau sed va nous aider:



L'option r enjoint à sed d'utiliser les expressions régulières étendues. L'option n désactive l'impression automatique de l'espace de travail, par contre le p qui se trouve à la fin du script provoque son impression à chaque substitution. De la sorte nous recevons en output seulement les lignes qui nous intéressent.
Dans la commande de substitution

s/ ([0-9]{1,3},[0-9]{2})$/ -\1/

le motif recherché se trouve en fin de ligne (symbole $). Il est constitué d'un espace suivi de 1 à 3 chiffres, une virgule puis encore 2 chiffres. Dans la chaîne de remplacement \1 désigne la partie de la chaîne trouvée correspondant à l'expression régulière qui est entre parenthèses. L'utilisation des parenthèses permet ainsi d'éviter que le signe moins ajouté soit suivi d'un espace.

La ligne blabla4 manque à l'appel. Elle peut être traitée comme ceci:


Cette fois la commande de substitution est:

s/[0-9]{1,3}\.[0-9]{3},[0-9]{2}$/-&/

La chaîne recherchée située en fin de ligne doit correspondre au motif suivant:
1 à 3 chiffres suivi d'un point, puis 3 chiffres une virgule et encore 2 chiffres (dans l’expression régulière le point est échappé ou sinon il correspondrait à n'importe quel caractère). Dans la chaîne de remplacement, & désigne la totalité de la chaîne trouvée.

Pour transformer cbxy tout en conservant les commandes à exécuter, nous créons le fichier cbxy.sed:


#!/bin/sed -rf
s/[0-9]{1,3}\.[0-9]{3},[0-9]{2}$/-&/
s/ ([0-9]{1,3},[0-9]{2})$/ -\1/
N
s/\n/ /

Nous le rendons exécutable avant utilisation:


Tout semble OK. On termine avec la commande:

[toto@rigel cbxy]$ ./cbxy.sed cbxy > cbxyok

samedi 3 octobre 2015

Listbox

Nous sommes dans libreoffice base, connecté à une notre base de données postgresql bdtest.
Ci-après une représentation schématique des tables qui vont être concernées dans la suite de cet article:

Les relations d'intégrité référentielle sont représentées par des flèches pointant vers les clefs primaires cibles.
La colonne "service" de la table "gestion" contient le code du service auquel appartient l'employé, tandis que le nom de ce service se trouve dans la table "services".
Nous avons déjà réalisé de nombreux formulaires relatifs à la table "employés" (voir par exemple ici), mais cette fois nous allons construire un formulaire très simple sur la base duquel nous allons présenter en détail la notion de zone de liste (listbox). L'utilité d'une telle zone est de pouvoir montrer à l'utilisateur une liste déroulante d’éléments parmi lesquels celui-ci peut faire un choix. A chaque élément de la liste lui correspond un autre qui est caché. Si l'élément affiché est changé, la table du formulaire est mise à jour non pas avec l'élément choisi mais avec l'élément caché correspondant. Différentes possibilités sont offertes pour le type de contenu de liste. Nous allons considérer les quatre types de contenu de liste les plus courants, à savoir: instruction sql, requête, table, liste de valeurs.

Formulaire de base
Avant de nous attaquer à cette notion de zone de liste, utilisons l'assistant pour construire le formulaire. Dans la première étape choisissons la table "employés" comme source de données et nous en sélectionnons tous les champs. Ensuite l'assistant nous propose la création d'un sous-formulaire contenant les données de la table "gestion":


(Dans bdtest existe aussi une relation de la table "paie" vers "employés" mais elle ne nous intéresse pas ici)

Cette fois n'afficherons dans le formulaire que le seul champ "service":


Pour la position des contrôles nous choisissons deux fois l'option "colonnes, étiquettes en haut".
En ce qui concerne la saisies des données, nous cochons ce qui nous convient:


Lorsque nous en avons fini avec l'assistant, il nous reste à repositionner et redimensionner les différents champs et choisir éventuellement une image de fond pour le formulaire.
Nous n'oublions pas de mettre en "lecture seule" le champ matricule. Pour ce faire nous le sélectionnons (CTRL +clic gauche) avant d'utiliser l'outil contrôle:




Utilisons l'outil "navigateur de formulaire"


afin de renommer MainForm et SubForm en Employés et Gestion:


Pour ce faire, il suffit de cliquer droit sur MainForm et SubForm et de choisir "Renommer" dans le menu contextuel qui surgit.
Cette étape n'est pas nécessaire mais apporte un plus au niveau clarté.
Il nous reste à affiner quelque peu les propriétés de "Employés" et de "Gestion". On y accède à travers le navigateur de formulaire via le menu contextuel de ces 2 éléments.
Pour "Employés" on demande un tri sur le matricule:


Pour "Gestion" nous souhaitons une barre de navigation qui soit celle de "Employés":


Remarquons en passant que l'assistant à correctement lié le formulaire "Gestion" à son fortmulaire parent.

Comme déjà indiqué le champ "service" contient seulement un code. Pour que le formulaire affiche en clair le nom du service, 2 possibilités s'offrent à nous:

  • Un sous-formulaire avec les données de la table "services", sous-formulaire lié à "Gestion"
  • Une zone de liste (listbox)
Cette article cible la deuxième possibilité. Cependant nous demandons au lecteur de faire preuve d'un peu de patience car pour mieux mettre en évidence les avantages de cette solution 2, nous allons d'abord procéder avec la solution 1 (mais le lecteur peut évidemment passer directement à la section "zone de liste").

Sous-formulaire "Services"
Cliquant droit sur "Gestion" nous créons un nouveau formulaire:


formulaire que nous renommons aussitôt "Services" avant de fixer ses propriétés sur le panneau adéquat obtenu via le menu contextuel:


Le lien avec la table parent (gestion) a du être ajouté manuellement et toucher à la table "services" ne sera pas autorisé.
Cela étant, le formulaire "Services" restant sélectionné, nous utilisons l'outil "ajouter un champ"


pour ajouter le champ "dénomination":


Après repositionnement, redimensionnement et suppression de l'étiquette du champ, on arrive à quelque chose comme ceci:



Quand un code de service est encodé, un appui sur ENTER projette le focus dans le champ suivant (celui qui contient le nom du service). Le focus passant du formulaire "Gestion" au formulaire "Services", cette action provoque l'enregistrement du nouveau code dans la base de données. Cependant le formulaire doit encore être rafraîchit pour que le nom du service soit actualisé.
Pour automatiser cela, il suffit d'assigner la macro

'*************************************
Sub ReloadTableOne
'*************************************
    Dim Frm as object
    Frm=Thiscomponent.DrawPage.Forms.getByIndex(0)
    Frm.reload()
End Sub

à l’événement "Après l'action d’enregistrement"  figurant dans l'onglet "Événements" des propriétés du formulaire "Gestion" (voir ce billet).

En l'absence d'intégrité référentielle n'importe quel code peut-être introduit même si aucun service n'y correspond.
Heureusement ce n'est pas le cas ici car postgresql gère l'intégrité référentielle: 


Zone de liste "service"
Procédons maintenant avec la deuxième possibilité: la création d'une zone de liste ce qui nous permettra d'afficher les données de la table "services" sans utilisation du sous-formulaire "Services".
Le champ "service" étant sélectionné, nous cliquons droit afin d'accéder au menu contextuel pour pouvoir remplacer le champ par une zone de liste:


Nous redimensionnons la zone puis nous accédons aux propriétés du contrôle:


Nous constatons que le champ de données sélectionné est bien  ce qui est attendu, à savoir "service".
Si le contenu de la liste est basé sur une table, seront affichés les éléments de la première colonne de cette table. Le numéro "Champ lié" indique lui la colonne (comptée à partir de 0) dont les éléments serviront pour la mise à jour éventuelle du champ "service". Ce sont les fameux éléments cachés (ils ne seront pas affichés). Mais dans la table "services", c'est tout le contraire! La colonne "dénomination"  qui contient les éléments à afficher est la deuxième, tandis que la colonne des éléments cachés est la première. Nous contournons le problème en prenant comme contenu de la liste l'instruction SQL:

SELECT dénomination, service_id
FROM services
ORDER by service_id ASC

Une autre solution serait de créer une requête libreoffice avec l'instruction ci-après et de choisir cette requête comme contenu de la liste.

Dans l'onglet général nous indiquons que la liste doit être déroulante:


Et voilà: pour changer un employé de service, il suffit que l'encodeur choisisse un nouveau nom de service dans la liste déroulante. Ce nouveau service apparaît en clair à l'écran avant même tout enregistrement. Le code du service de l'employé, figurant dans la table gestion, sera mis à jour avec service_id et ce de manière tout à fait transparente pour l'utilisateur.
De plus, indépendamment de toute intégrité référentielle, celui-ci ne peut entrer que des services existants.

Pour illustrer l’utilisation d'une table comme source de données pour une liste, créons la table servicesn (n pour nombre) où la colonne d'indice o (colonne 1) est bien la colonne "dénomination":

CREATE TABLE servicesn (
    "dénomination" character(25),
nombre integer,
    service_id character(2) NOT NULL
)

La colonne nombre est destinée à contenir le nombre d'employés pour chaque service. Nous la remplissons avec:

update servicesn
set nombre =
(select count(*) from gestion
where service = service_id)

Dans cas, l'onglet "Données" du panneau des propriétés de la liste se présenterait comme suit:


La colonne "Champ lié" (colonne des éléments cachés) est la colonne d'indice 2 (colonne 3).
Il n'est pas possible ici d'introduire via le panneau des propriétés une notion de tri. Il faudrait donc que l'ordre naturel de la table soit celui souhaité.

Nous avons déjà évoqué 3 possibilités pour le type du contenu de liste:
sql, requête, table.
Une dernière est possibilité est "Liste de valeurs".
Dans ce cas il faut encoder les valeurs qui peuvent servir pour la mise à jour du champ "service" donc dans notre cas le code des services:


La notion de champ lié est alors inopérante et il faut encoder sous l'onglet Général les valeurs qui seront présentées à l'utilisateur, soit le nom des services:


La table "services" est inutilisée, mais ceci ne semble pas être une solution satisfaisante car les valeurs en question doivent se trouver sur tous les postes clients.

mercredi 29 juillet 2015

freshplayer

Pour linux, le plugin flashplayer fournit par Adobe est resté bloqué sur la version 11. Il devient peu à peu obsolète. Par contre le navigateur chrome de google vient avec un plugin intégré, pepperflash qui lui continue à évoluer. Ce plugin peut-être utilisé par chromium mais pas directement par firefox.
Bienvenu soit le plugin freshplayer qui permet l'utilisation de pepperflash avec firefox. Pour que ça fonctionne, il faut disposer de pepperflash. Le plus simple pour ce faire est d'installer d'abord chromium puis le plugin pepperflash (car celui-ci n'est le plus souvent pas intégré dans chromium).
Pour Ubuntu ces deux installations sont assez évidentes. Rappelons cependant que la mise à jour de pepperflash n'est pas automatique et peut se faire avec la commande:

root@rigel:~# /update-pepperflashplugin-nonfree --install

Pour Fedora nous avons indiqué ici comment procéder à l'installation de chromium (et de pepperflash). Il faut évidemment adapter les commandes à la version de Fedora. Pour Fedora 22, remplacer 20 par 22 et éventuellement yum par dnf.
On peut aussi carrément installer chrome comme expliqué par exemple ici pour Fedora. Le site est en anglais, aussi nous reprenons brièvement ce qu'il convient de faire:
D'abord devenir root:

toto@rigel:~$ su -
Mot de passe : 
[root@rigel ~]

Ensuite pour installer le dépôt ad hoc, coller le texte:

cat << EOF > /etc/yum.repos.d/google-chrome.repo
[google-chrome]
name=google-chrome - \$basearch
baseurl=http://dl.google.com/linux/chrome/rpm/stable/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
EOF

et poursuivre par un appui sur ENTER puis procèder à l'installation avec:


[root@rigel ~]# dnf install google-chrome-stable

En ce qui concerne l'installation du plugin freshplayer, pour Ubuntu il existe un PPA qu'il suffit d'ajouter

toto@rigel:~$ sudo add-apt-repository ppa:nilarimogard/webupd8

Ensuite :

toto@rigel:~$ sudo apt-get update

Puis:

toto@rigel:~$ sudo install freshplayerplugin

Pour Fedora, il s'agit de compiler freshplayerplugin à partir de la source.
Installons d'abord ce qui convient (les dépôts rpmfusion ont été configurés):

[root@rigel ~]# dnf install glib2-devel libX11-devel uriparser-devel cairo-devel pango-devel freetype-devel gtk2-devel gcc-c++ alsa-lib-devel libconfig-devel libevent-devel mesa-libGLES-devel git cmake ragel

Ensuite procédons avec les commandes;

[root@rigel ~]# git clone https://github.com/i-rinat/freshplayerplugin.git
...
[root@rigel ~]# cd freshplayerplugin 
[root@rigel fresplayerplugin]# mkdir build 
[root@rigel freshplayerplugin]# cd build 
[root@rigel build]# cmake ..

(Les .. qui suivent la commande cmake sont essentiels; ils désignent le répertoire supérieur)

En image:


Le paquet openssl est manquant. Pourtant il est installé. Mais lors d'une compilation ce qui est nécessaire ce sont les paquets de développement.
Donc nous installons openssl-devel:

[root@rigel build]# dnf install openssl-devel
...
[root@rigel build]# cmake ..

Ensuite pour répondre aux autres messages issus par cmake et qui indiquent des paquets manquants:

[root@rigel build]# dnf install ffmpeg-devel libva-devel libvdpau-devel libv4l-devel
...
[root@rigel build]# cmake ..

Pour finir, si tout est OK:


[root@rigel build]# make
...
[root@rigel build]# cp libfreshwrapper-pepperflash.so /usr/lib64/mozilla/plugins/

Cela fonctionne pour autant que l'on ait désinstallé (ou désactivé le flashplayer de Adobe)

Pour d'autres distributions, freshplayerplugin se trouve directement dans les dépôts.

samedi 13 juin 2015

redirections revisitées

Pourquoi revisitées?
Parce que nous avons déjà traité du sujet dans ce billet et dans celui-ci.
Et aussi parce que l'approche sera cette fois quelque peu différente.
Dans un répertoire test, nous lançons les commandes suivantes touch et ls:

toto@aldebaran:~/test$ touch titi
toto@aldebaran:~/test$ ls titi tata
ls: impossible d'accéder à tata: Aucun fichier ou dossier de ce type
titi

La commande ls nous fournit 2 lignes en sortie:

  • un message qui nous informe que le fichier tata n'existe pas
  • le nom du fichier titi qui vient d'être créé par touch

Le message est venu via le canal de sortie des erreurs (stderr), titi (nom du fichier) via la sortie standard (stdout).
Stdout est géré par le système via le descripteur de fichier #1, tandis que stderr est lié au descripteur de fichier #2
Le descripteur de fichier #0 correspond quant à lui à l'entrée standard (stdin).
Ces fichiers se trouvent dans le répertoire /proc/pid/fd où pid est l'identifiant du processus concerné:


(Ici l'identifiant du processus ls est 2609).

Ce répertoire n'existe que pendant la durée de vie du processus.
Les fichiers /proc/self/fd sont hérités de ceux existant dans le shell d'où est lancé le processus

Examinons le résultat suivant:

toto@aldebaran:~/test$ ls titi tata 2>&1 1>/dev/null
ls: impossible d'accéder à tata: Aucun fichier ou dossier de ce type
toto@aldebaran:~/test$ 

2>&1 : le descripteur 2 prend toutes les caractéristiques du descripteur 1. Les messages d'erreur sont dirigés suivant le canal correspondant au descripteur 1 (canal 1).
1>/dev/null : le descripteur 1 pointe vers /dev/null. La sortie standard est envoyée vers le néant. Cela ne modifie en rien les nouvelles caractéristiques acquises juste avant par le descripteur 2.

Remarquons que la première redirection ne change rien: les messages d'erreur seraient de toute façon arrivés à l'écran.
Toutes ces redirections sont éphémères: elles s'effectuent au niveau des descripteurs qui se trouvent dans /proc/self/fd.
Il est possible de définir des redirections au niveau du shell comme ici:

toto@aldebaran:~/test$ echo $$
2959
toto@aldebaran:~/test$ exec 3>&1 1>sortie
toto@aldebaran:~/test$ ls titi
toto@aldebaran:~/test$ echo
toto@aldebaran:~/test$ ls -l /proc/2959/fd/[0-3]

Avec la commande echo $$ nous cherchons à connaître l'identifiant du processus (pid) correspondant au shell dans lequel nous sommes.
La commande suivante crée un descripteur 3 qui reprend toutes les caractéristiques du descripteur 1 (ce descripteur 3 constitue en quelques sorte une sauvegarde du descripteur 1), puis nous faisons pointer ce descripteur 1 vers le fichier sortie.
Dorénavant, seuls les messages d'erreur arriveront à l'écran: les deux commandes ls suivantes n'affichent aucun résultat puisque les descripteurs au niveau des processus fils (processus des commandes) sont hérités de ceux qui existent au niveau du shell. Dans le cas de deux commandes reliées par un tube (pipe), cette dernière affirmation n'est pas tout a fait exacte.
Vérifions:

toto@aldebaran:~/test$ echo
toto@aldebaran:~/test$ ls -l /proc/self/fd/[0-3] | cat
toto@aldebaran:~/test$ echo
toto@aldebaran:~/test$ ls titi | ls -l /proc/self/fd/[0-3]

La première commande ls fournira les descripteurs du processus en amont du tube.
La commande en aval, cat, recopie simplement l'entée standard vers la sortie standard.
La troisième commande ls nous informera sur les descripteurs au niveau du processus en aval (la commande ls titi n'enverra rien dans le fichier sortie, ni à l'écran, mais il faut une commande en amont).
Les commandes echo ont simplement pour but de rendre le fichier sortie plus lisible.
Examinons maintenant le contenu du fichier sortie à l'aide de la commande cat, en n'oubliant pas que le descripteur 3 est une sauvegarde du descripteur 1:

toto@aldebaran:~/test$ cat sortie >&3
titi

lrwx------ 1 toto toto 64 jun 12 15:19 /proc/2959/fd/0 -> /dev/pts/1

l-wx------ 1 toto toto 64 jun 12 15:19 /proc/2959/fd/1 -> /home/toto/test/sortie
lrwx------ 1 toto toto 64 jun 12 15:19 /proc/2959/fd/2 -> /dev/pts/1
lrwx------ 1 toto toto 64 jun 12 15:19 /proc/2959/fd/3 -> /dev/pts/1

lrwx------ 1 toto toto 64 jun 12 15:20 /proc/self/fd/0 -> /dev/pts/1

l-wx------ 1 toto toto 64 jun 12 15:20 /proc/self/fd/1 -> pipe:[36369]
lrwx------ 1 toto toto 64 jun 12 15:20 /proc/self/fd/2 -> /dev/pts/1
lrwx------ 1 toto toto 64 jun 12 15:20 /proc/self/fd/3 -> /dev/pts/1

lr-x------ 1 toto toto 64 jun 12 15:21 /proc/self/fd/0 -> pipe:[36372]

l-wx------ 1 toto toto 64 jun 12 15:21 /proc/self/fd/1 -> /home/toto/test/sortie
lrwx------ 1 toto toto 64 jun 12 15:21 /proc/self/fd/2 -> /dev/pts/1
lrwx------ 1 toto toto 64 jun 12 15:21 /proc/self/fd/3 -> /dev/pts/1
toto@aldebaran:~/test$ 

Dans le processus en amont, fd/1 pointe vers le tube et n'a donc aucun rapport avec fd/1 au niveau du shell (qui pointe vers sortie).
Dans le processus en aval, l'entrée standard est alimentée par la sortie du tube: donc la sortie standard du processus en amont est connectée via le tube (pipe) à l'entrée standard du processus en aval.
Les deux tubes (pipe) portent des numéros différents car ils concernent deux lignes de commandes différentes.
Essayons d'écrire une ligne de commande qui affichent les descripteurs en amont et en aval d'un tube.
Tout d'abord nous réinitialisons le descripteur 1 à partir de sa sauvegarde puis nous clôturons le descripteur 3, tout cela avant de procéder:


Ça ne fonctionne pas: la commande en amont ne fournit aucun résultat car celui-ci est réceptionné à droite du tube via l'entrée standard qui n'est pas utilisée par la commande ls en aval.
Nous allons rediriger le résultat de la commande en amont vers stderr de cette commande pour éviter le tube. Mais par là même du fait de vouloir visualiser un résultat, nous allons le modifier. Cela rappelle un peu la théorie de la mécanique quantique qui dit que l'observation d'un phénomène modifie ce phénomène. Aussi nous allons avant tout sauvegarder l'état initial du descripteur 1 amont dans un descripteur 3. Cette fois tout est OK:


Revenons sur la commande ls titi tata 2>&1 1>/dev/null que nous avons considérée au début. Si cette commande se trouve en amont d'un tube, la redirection 2>&1 (qui ne servait à rien) trouve cette fois toute son utilité: les messages d'erreur sont envoyés à l'écran via le tube ce qui n'est pas le cas autrement:


toto@aldebaran:~/test$ ls titi tata 2>&1 1>/dev/null | tr t b
ls: impossible d'accéder à baba: Aucun fichier ou dossier de ce bype
toto@aldebaran:~/test$ ls titi tata 1>/dev/null | tr t b
ls: impossible d'accéder à tata: Aucun fichier ou dossier de ce type
toto@aldebaran:~/test$ 

On voudrait maintenant que la sortie standard arrive également sur l'écran mais sans transiter par le tube (pipe).
Ceci réalise notre souhait:

toto@aldebaran:~/test$ ls titi tata 3>&1 1>&2 2>&3 | tr t b
titi
ls: impossible d'accéder à baba: Aucun fichier ou dossier de ce bype
toto@aldebaran:~/test$
(c'est bien titi qui est affiché et non bibi)

Nous créons tout d'abord le descripteur 3 en tant que copie du descripteur 1. Ensuite le descripteur 1 acquiert toutes les caractéristiques du descripteur 2, la sortie standard est donc envoyée sur le canal 2. Le canal 1 est perdu, heureusement nous en avons une copie  (le canal 3 qui conduit au tube) vers lequel nous envoyons la sortie des erreurs.

Si par contre le descripteur 3 est créé au niveau du shell, il lui correspond un canal qui arrive sur l'écran (puisque fd/3 est alors une copie de fd/1 au niveau du shell).
Au niveau de la commande, nous pouvons utiliser les mêmes redirections qu'avant, mais il est plus simple de procéder comme ceci:

toto@aldebaran:~/test$ ls titi tata 2>&1 1>&3 | tr t b
ls: impossible d'accéder à baba: Aucun fichier ou dossier de ce bype
titi
toto@aldebaran:~/test$ 

D'autres détails concernant notamment stdin, peuvent être trouvés dans ce billet.