Planet Libre

System Linux : nagios: Error: Could not open check result queue directory '/var/log/nagios/spool/checkresults'

nagios livre jpg

Rapide à solutionner.

Le souci c'est que checkresults est un fichier au lieu d’être un dossier.

# rm -rf /var/log/nagios/spool/checkresults # mkdir -p /var/log/nagios/spool/checkresults # chown nagios: /var/log/nagios/spool/checkresults -R

Votre :

tail -f messages

sera plus agréable à lire.

Gravatar de System Linux
Original post of System Linux.Votez pour ce billet sur Planet Libre.

Articles similaires

genma : Lifehacking - TinyTask

Ayant à automatiser un certain nombres de tâches faite de façon graphique (des clics divers et variés au sein de différents logiciels en environement Windows), j'ai donc cherché un logiciel qui me permettrait de faire 500 fois la même chose. Et j'ai trouvé. Ce logiciel, c'est TinyTask. Disponible ici gratuitement ici (graticiel, logiciel non libre) https://www.vtaskstudio.com/tinytask.php

Remarque : la tâche nécessitait des actions en mode graphique au sein de différents logiciels, rien qui ne pouvait être automatisé par un script quelconque.

On l'installe, c'est léger. On le lance. On clique sur enregistrer. On exécute la séquence d'action que l'on souhaitera faire de manière répétitive. Cette séquence pouvant être au sein de différentes fenêtres. Et ça enregistre une macro qu'il est possible de rejouer un certain nombre de fois.

Quelques astuces :
- Ça marche bien dans une machine virtuelle (dans laquelle on a un Windows) ce qui permet de continuer à travailler à côté de ça sur la machine hôte. Sans cette astuce, on ne peut pas utiliser sa machine le temps que la tache se déroule. Une VM à lancer sur un second ou troisième écran pour garder un œil dessus. Car...
- Le logiciel plante parfois, donc on lance les répétitions par lot de 20 en gardant un œil dessus.
- Il faut penser à revenir sur la bonne fenêtre de départ à la fin de la séquence (en remettant le focus dessus). Car il semblerait que le logiciel enregistre les clics, la position de la souris et les saisies claviers, mais si on est sur la fenêtre d'un logiciel sans que l'on est le focus dessus, le clic se fait dans le vide et ça décale alors toute la séquence de la macro enregistrée.

Ce logiciel m'ayant bien dépannée (la tâche répétée 500 fois durait une minute à chaque fois une fois la séquence bien optimisée pour être sûre qu'elle marche comme je veux).

Je suis preneur d'un logiciel équivalent et aussi simple sous GNU/Linux Ubuntu. Par aussi simple, je ne veux pas d'un logiciel pour lequel il faut créer un script dans un langage dédié. Je voudrais un logiciel qui fasse la même chose que TinyTask.

Gravatar de genma
Original post of genma.Votez pour ce billet sur Planet Libre.

Carl Chenet : Déjà 500 abonnés à la newsletter hebdomadaire du Logiciel Libre

Peu après la publication la semaine dernière du numéro 7 du Courrier du hacker, la newsletter hebdomadaire résumant l’actualité francophone du Logiciel Libre, nous avons passé le cap symbolique des 500 abonnés.

E-mail S'abonner

Plus précisément le dernier numéro a été envoyé à 501 abonnés. Mais comme je n’étais pas sûr de passer le cap avant le numéro, j’ai choisi de l’annoncer un peu plus tard. Avec 516 abonnés au moment de la rédaction de ce billet, la palier est désormais bien franchi.

J’avais dans le précédent billet tiré plusieurs enseignements de la publication des 5 premiers numéros et les tendances que j’avais identifiées se sont confirmées. Nous n’en sommes qu’au tout début de la vie du projet et beaucoup de choses restent à faire. Continuer à informer le potentiel public de l’existence du Courrier du hacker et surtout être régulier dans la publication des numéros, un exercice moins trivial qu’il n’y paraît, la vie de tous les jours nous imposant sans cesse des contraintes.

Idée à retenir : un bon début de projet ne doit pas rendre trop optimiste, cela se joue toujours dans la durée.

Afin de faire évoluer la newsletter, je m’appuie sur les épaules d’illustres prédécesseurs, publiant sans faillir leurs newsletters depuis des années, comme la Hacker News Letter (375 numéros en … 7 ans) ou encore côté Python la Pycoders Weekly (290 numéros). Avec un peu de recherche on peut trouver des élément sur comment ces newsletters se sont développées et c’est autant de temps gagner à profiter de ces expériences.

Idée à retenir : gagner du temps en n’imaginant pas être le premier à faire ce qu’on fait et profiter de l’expérience de ces prédécesseurs.

Le numéro 8 publié ce vendredi offrira pour les plus rapides/chanceux un petit cadeau, pour remercier du soutien les premiers à s’être abonné à la newsletter 😉

Me suivre sur les réseaux sociaux

N’hésitez pas à me suivre directement sur les différents sociaux pour suivre au jour le jour mes différentes projets dans le Logiciel Libre :

Gravatar de Carl Chenet
Original post of Carl Chenet.Votez pour ce billet sur Planet Libre.

Articles similaires

Full Circle Magazine FR : Annonce importante : Ubuntu Party

L'association Ubuntu-fr organise la vingt-cinquième Ubuntu Party parisienne qui se déroulera le week-end des 25 et 26 novembre 2017. Nous aimerions vous y voir.

La formule de l'événement n'a pas changé et il y aura des conférences, des ateliers, des démonstrations, des cours, l'install-party et les stands associatifs. Le programme complet n'est pas encore disponible, mais sera sur http://www.ubuntu-paris.org/ très bientôt, nous venons à peine de clôturer les suggestions.

Elle aura lieu comme d'habitude au Carrefour Numérique de la Cité des sciences et de l'industrie de La Villette au 30, avenue Corentin-Cariou dans le 19ème arrondissement. Pour plus de détails http://www.cite-sciences.fr/fr/infos-pratiques/acces/ . Bien entendu, l'accès est libre et gratuit.

Clache, bénévole pour l'Ubuntu Party

Gravatar de Full Circle Magazine FR
Original post of Full Circle Magazine FR.Votez pour ce billet sur Planet Libre.

Articles similaires

Marien Fressinaud : Lessy Antlia

J’expliquais dans mon article du 8 octobre que je souhaitais que Lessy soit un projet s’adressant à une large portion de la population non-geek. Pour cela, je voulais le rendre plus accueillant et plus communautaire. C’est pourquoi je suis très fier d’annoncer la sortie de Lessy Antlia (le nom de cette nouvelle version). Au menu, énormément de documentation.

J’ai passé les dernières semaines à travailler les valeurs que je voulais défendre avec Lessy. Après avoir dessiné, trié et organisé toutes les idées que j’avais en tête, j’ai abouti à une première version de la vision de Lessy (en anglais) :

Lessy is a time manager application built upon strong principles. It is designed to be as intuitive and inclusive as possible. Its goal is to return people their power to manage time, instil self-confidence and challenge their capacity to question themselves. It is built by a diverse and welcoming community.

On peut traduire cela par :

Lessy est un gestionnaire de temps basé sur des principes forts. Il est conçu pour être aussi intuitif et inclusif que possible. Son objectif est de redonner à ses utilisateurs et utilisatrices leur capacité à gérer leur temps, leur confiance en eux et leur capacité à se remettre en question. Il est développé par une communauté accueillante et diversifiée.

Cette vision est donnée en préambule du fichier README de Lessy et est immédiatement suivi d’une précision : toute fonctionnalité développée, toute discussion que nous avons au sein de la communauté, toute décision que nous prenons doit aller dans le sens de cette vision.

Voilà donc pour la mise en bouche. Je regrette souvent le manque de direction dans les projets communautaires qui mène bien souvent à des logiciels qui font beaucoup de choses mais qui manquent de personnalité. Avec Lessy, je veux donner un cap au logiciel et mes engagements personnels transparaissent dans cette vision. Lorsque j’ai commencé à développer cette application, c’était pour me redonner la main sur le temps qui m’échappait, alors pourquoi ne pas complètement l’assumer jusque dans l’ADN de Lessy ?

On m’a demandé l’autre jour en quoi Lessy est-il éthique. J’étendrais la question à en quoi Lessy correspond aujourd’hui à la vision que je viens de donner. Et c’est vrai qu’en utilisant Lessy on voit difficilement une application éthique, inclusive, redonnant un peu de pouvoir à ses utilisateurs et utilisatrices ; tout au plus une todo-list un peu originale. Et c’est effectivement le défi que je me donne pour les mois à venir : faire transparaître la vision dans l’interface. Cependant, je ne pense pas être capable de faire cela à moi seul et c’est pourquoi je voulais rapidement me concentrer sur la documentation communautaire. Cette documentation contient donc désormais :

  • le README, véritable porte d’entrée du projet ;
  • un fichier de contribution expliquant comment participer à Lessy, j’ai pris le soin de lister une majorité d’activités ne nécessitant pas de connaissances en développement informatique ;
  • un code de bonne conduite pour assurer qu’aucun comportement déplacé ne sera jamais accepté au sein de cette communauté ;
  • une liste des contributeurs pour remercier celles et ceux ayant contribué de près ou de loin au projet.

La documentation technique a elle aussi été largement revue pour aborder plus de sujets différents.

J’espère que tous ces documents sauront attirer une population hétérogène de contributeurs et contributrices, bien que je ne me fasse pas d’illusion : il faut désormais que je me bouge pour rendre l’application réellement attrayante.

Tout cela m’a pris beaucoup de temps à rédiger, surtout que tout a été fait en anglais alors que ce n’est pas ma langue de prédilection. J’ai fait ce choix volontairement en me disant qu’il serait plus facile de trouver des personnes souhaitant contribuer en visant large qu’en visant un public uniquement francophone. De plus, j’ai le sentiment que les Français·e·s sont de plus en plus à l’aise avec l’anglais. Seul l’avenir me le dira !

Gravatar de Marien Fressinaud
Original post of Marien Fressinaud.Votez pour ce billet sur Planet Libre.

Thuban : Comment créer une iso d'OpenBSD personnalisée?

Depuis la publication d'isotop, je me dis que ça serait intéressant d'expliquer un peu comment cette "non-distribution" est faîte. Vous allez, voir, c'est enfantin.
Je vais décrire la procédure en détaillant les commandes utilisées, sachant qu'en réalité tout ceci est mis dans des scripts pour se simplifier la vie.

Isotop n'est qu'une OpenBSD personnalisée. Pour ça, on récupère d'abord une image d'installation iso depuis un miroir.

ftp -o install6.2.iso https://ftp.fr.openbsd.org/pub/OpenBSD/6.2/amd64/install62.iso

Ensuite, on décompresse cette iso pour pouvoir modifier son contenu :

mkdir -p loopdir mkdir -p ./install6.2 if [ "$(uname)" = "OpenBSD" ]; then vnconfig vnd0 install6.2.iso mount -t cd9660 /dev/vnd0c loopdir/ cp -r loopdir/* ./install6.2 umount loopdir/ vnconfig -u vnd0 else mount -o loop install6.2.iso loopdir cp -r loopdir/* ./install6.2 umount loopdir/ fi rm -r loopdir/

Selon si on est sous OpenBSD ou Linux, la procédure n'est pas tout à fait la même. Ces commandes n'ont rien de magique, on trouve facilement sur le web comment extraire une iso.

Nous voilà donc avec un dossier install6.2 qui contient tout le nécessaire pour installer OpenBSD. C'est maintenant que la personnalisation commence. On peut configurer l'installation grâce à 3 mécanismes :

  • Intégrer une archive siteXX.tgz (remplacez XX par le numéro de version, ici 62) qui sera décompressée à l'installation sur la racine /. Cela permet d'intégrer les configurations voulues. Par exemple, le fichier /etc/doas.conf personnalisé, ou encore un dossier /etc/skel qui contient tout ce qui sera copié dans le dossier personnel d'un nouvel utilisateur (langue, profil firefox...)).
  • Ajouter un script "install.site" dans cette archive. ce dernier sera exécuté juste à la fin de l'installation. On peut y mettre un miroir pour récupérer les paquets, activer par défaut certains services comme le résolveur unbound...
  • Ajouter un script "etc/rc.firsttime" qui sera lancé au premier démarrage de la machine. Ce dernier me sert principalement à installer les paquets de logiciels.

C'est parti, on crée un dossier "site" dans lequel on va mettre tout notre bazar :

mkdir site

Allez, pour l'exemple, je vais ajouter un set d'icônes dedans :

mkdir -p site/usr/local/share/icons cp -r /usr/local/share/icons/Arc site/usr/local/share/icons

J'y met aussi un script "install.site" qui va activer la gestion d'énergie juste après l'installation :

echo "rcctl enable apmd" >> site/install.site echo "rcctl set apmd status on" >> site/install.site echo "rcctl set apmd flags -A">> site/install.site chmod +x site/install.site

Enfin, je mets dans le script lancé au premier démarrage de quoi installer un environnement de bureau :

echo "pkg_add xfce" >> site/etc/rc.firsttime chmod +x site/etc/rc.firsttime

Allez zou, on met ces configurations dans une archive comme prévu :

cd site tar cvzf ../site62.tgz *

Ne reste plus qu'à copier cette archive dans l'iso extraite :

cp site62.tgz install6.2/6.2/amd64/site62.tgz

Lors de l'installation, il sera proposé d'installer le set site62 afin de profiter de cette configuration.

Enfin, on reconstruit l'iso. Remplacez genisoimage par mkisofs selon ce qui est disponible sur votre système :

genisoimage -r -no-emul-boot -b 6.2/amd64/cdbr -c boot.catalog -o ./CustomOBSD.iso install6.2

Et voilà ;)
Fastoche non ?

Pour plus de détails ou d'idées, je vous invite à aller regarder le code source d'isotop, en particulier les scripts qui servent à la génération des images. Ces derniers permettent notamment de générer une iso personnalisée d'OpenBSD même à partir d'un sysètme Linux.

Gravatar de Thuban
Original post of Thuban.Votez pour ce billet sur Planet Libre.

Articles similaires

genma : Lifehacking - Mes astuces pour faire ma veille ciblée

Dans le présent billet, je voudrais présenter deux astuces pour faire ma veille ciblée. Un autre billet, en cours de rédaction, abordera plus en détail le cas des fils RSS et l'usage d'un agrégateur. Un précédent billet Le combo gagnant pour optimiser sa veille présentait mon cycle de veille quotidienne : lecture en direct (au sein de l'agrégateur) ou lecture plus tard (via Wallabag), conservation du lien (Shaarli). Cette veille recoupe un tous les domaines qui ont un intérêt pour moi.

Le présent billet se focalise sur une veille ciblée. Par veille ciblée j'entends le fait de faire une recherche sur une thématique donnée, pour avoir un état des lieux ou un état de l'art à un instant t. Cela m'est utile dans le cadre de la préparation de mes projets professionnels, pour me remettre à jour ou au contraire découvrir un nouveau domaine.

Rq : chacune de ces astuces est complémentaire des autres.
Rq2 : ces conseils marchent très bien pour faire une veille ciblée sur un sujet technologique ou un logiciel libre particulier, mais sont probablement efficace dans d'autres cas.

Moteurs de recherche

Je n'évoquerai que brièvement la recherche par mot clef judicieusement choisi au sein de différents moteurs de recherche, avec classement par date pour trouver les publications les plus récentes. Cela semble une évidence. C'est ainsi que font la plupart des personnes qui affirment faire de la veille (et auxquelles je pose la question suivante lors des entretiens de recrutement : "faites vous de la veille et si oui, comment ?".

Journal du Hacker

Je suis abonné via le fil RSS au Journal du Hacker (pas encore à la newsletter - Le Courrier du hacker : le point après (déjà) 5 numéros et les leçons retenues).

Là encore, je profite de la fonctionnalité de moteur de recherche incluse sur le site et je fais une recherche par mots clefs, que je trie par date. Cela me permet de retrouver des liens vers différents billets de blog au sein desquels le sujet d'intérêt a été abordé. Et je profite donc du présent billet pour remercier tous les membres de la communauté qui prennent le temps de saisir des articles d'intérêt et d'ajouter des tags pertinents.

Attention toutefois : le Journal du Hacker ne référencie (par choix éditorial, cf https://www.journalduhacker.net/about) que des articles en langue française, et exclue donc de facto toute la richesse du monde anglophone (dont on pourra profiter via les moteurs de recherche).

Rq : les articles les plus pertinents des gros blogs et sites comme Linuxfr.org sont généralement ajoutés dans le journal du Hacker, cela me fait gagner un temps certain en n'ayant pas à chercher sur ces sites (vu que si un article correspond à ma thématique d'intérêt, il ressortira dans le résultat de recherche du Journal du Hacker).

Slideshare

Slideshare est le site où l'on retrouve bon nombre de supports divers et variés de présentation, de conférences... Là encore, le site dispose d'un moteur de recherche interne, je fais une recherche par mots clefs. Et je peux ainsi retrouver des supports qui me permettent d'avoir des retour d'expériences, des états des lieux, des introductions sur différents sujets d'intérêts.

Là encore, la date est importante, ainsi que le numéro de version pour les logiciels présentés (il faut bien avoir en tête quelle est la dernière version d'un logiciel avant d'étudier 80 slides sur une API d'un logiciel qui est désormais dépréciée avec la dernière version en date...)

Youtube

Complémentaire de Slideshare, YouTube permet d'avoir les conférences et le discours autour du support mais aussi de trouver des tutoriels, des vidéos de démonstration et de fonctionnement des logiciels. YouTube étant le site incontournable pour la vidéo, la mode étant à ne plus faire de l'écrit mais des vidéos, YouTube peut être une bonne source pour avoir un aperçu d'un sujet (par chance les logiciels sont un sujet moins polémique et moins soumis à controverse que d'autres, mais il ne faut toutefois pas en oublier son esprit critique).

Les réseaux sociaux

Il m'arrive également de poser une question précise et ciblée, généralement en anglais pour faciliter la visibilité (les personnes susceptibles de répondre techniquement sachant l'anglais, même dans le cercle francophone). Là encore, je regarde qui me répond (est-ce une personne que je connais, de confiance ou un expert du sujet qui intervient suite à la diffusion au sein du réseau social de mon message).

Faire appel à sa mémoire

Je fais également appel à mémoire. J'essaie de me rappeler si je n'ai pas récemment lu ou passé tel ou tel sujet sur tel ou tel site que je suis (et je recherche dans mon Shaarli), si je ne connais pas une personne spécialiste de la dite technologie et avec laquelle je serai en relation via les réseaux sociaux (je lui demande alors quelques conseils et ressources pour bien démarrer sur le sujet).

Autres

Je pourrais également chercher sur des sites comme Medium ou autre, mais je pars du principe que si l'information se trouve sur ces derniers et est accessible librement, elle aura été référencée et donc trouvée via l'astuce du moteur de recherche.

Conclusion

N'hésitez pas vous aussi à partager en commentaire vos astuces pour faire votre veille sur le logiciel libre, je suis preneur d'autres astuces qui pourraient m'aider à être encore plus efficace sur le sujet, lifehacking oblige.

Gravatar de genma
Original post of genma.Votez pour ce billet sur Planet Libre.

Dimitri Robert : Culture et logiciels libres sont-ils des biens communs ?

Le 18 septembre dernier le mouvement Utopia organisait une soirée sur les biens communs intitulée « Communs pour tous et tous pour les communs ? ». Aux côtés de Pierre Crétois, docteur en philosophie et Isabelle Attard, ancienne députée qui s’est notamment battue pour une reconnaissance du domaine public, j’ai été invité à parler des logiciels libres, en quoi ce sont des biens communs.

Isabelle et moi-même avons largement évoqué la culture, la culture libre, le domaine public et les dérives du droit d’auteur (et des pistes pour le hacker), les atteintes d’entreprises et de l’État envers le domaine public.

L’intervention d’Isabelle Attard débute à 41:35 et celle de Dimitri Robert à 1:03:35.

Cet article Culture et logiciels libres sont-ils des biens communs ? est publié sous licence CC By-SA 4.0 par Dimitri Robert sur Formation logiciel libre - Reprenez le contrôle de votre informatique !.

Gravatar de Dimitri Robert
Original post of Dimitri Robert.Votez pour ce billet sur Planet Libre.

Articles similaires

nIQnutn : Copier un article pour le partager sur un wiki

Je reviens à la charge encore une fois sur le sujet de la contribution pour le logiciel libre. Il y a moins d'un an, j'avais déjà écrit sur le sujet: Contribuer à un Wiki . Je pense que la documentation est une partie importante et indispensable pour que le logiciel libre soit accessible au plus grand nombre (débutants et experts) et surtout continuer de découvrir des choses. On va voir ce qu'il est possible de faire et comment.

Aussi bien pour de la documentation, un tuto ou un article, on tombe régulièrement sur du contenu intéressant et utile à partager. En règle générale, il n'est disponible que sur le site où l'auteur l'a posté. On en retrouve sur les forums, réseaux sociaux, blogs, wikis, ... Pour aider la communauté et ajouter sa pierre à l'édifice, je vous propose de repartager toutes ces connaissances et les intégrer dans un wiki. Pas un simple copier/coller mais une méthode rapide pour garder l'ensemble de la mise en forme (titres, gras, italique, balise de code, ...). Par exemple, pour copier l'article Commandes en vrac et l'intégrer au wiki Debian-Facile. Cela nous permettra de centraliser la connaissance autour de Debian.

Vous l'aurez compris, je vous ai préparé un tuto pour faire des tutos ou comment repartager un article sur un wiki.

Cette méthode permet de gagner du temps et surtout ne pas s’embêter avec les différents formats et syntaxes qui peuvent exister. Le wiki Debian-Facile utilise la syntaxe dokuwiki et je n'ai toujours pas l'habitude de l'utiliser, donc ça m'arrange.

C'est valable pour tous les formats qui seront convertibles avec pandoc et vous pouvez contribuer pour n'importe quel wiki ou site. Vous pouvez également vous créer votre propre wiki et garder sous la main tous les trucs qui vous sont utiles. L'objectif est d'enrichir mutuellement ces documentations pour les compléter et les actualiser le plus facilement possible.

Aujourd'hui, on aura simplement besoin de Firefox et pandoc.

Debian 9.2 (stretch)
Firefox 52.4
pandoc 1.17.2 Récupérer l'article orignal

Une fois que vous avez repéré un article intéressant à partager, il faut le récupérer. On va donc extraire le texte qui nous intéresse au format HTML (on ne prendra que ce qui nous intéresse, pas la totalité de la page).

Pour ça, on va utiliser l'Inspecteur de Firefox. Il permet de repérer facilement les blocs qui contiennent le texte qui nous est utile pour le copier.
Pour lancer l'inspecteur: Ctrl+Maj+C ou clic-droit puis Examiner l'élément en se positionnant sur le début du texte à copier.

Dans l'inspecteur on identifie le bloc à récupérer, il apparaît en surbrillance sur la page. On fait un clic-droit puis Copier > L'extérieur du HTML.
On enregistre le tout dans un fichier texte, par exemple: commandes-en-vrac.html

Votre navigateur ne supporte pas la balise vidéo ! Mettez-vous à jour !

Pour ceux qui ne connaissent pas HTML, il faut tâtonner en survolant les éléments qui seront identifiés en surbrillance.
Il est aussi possible d'afficher directement le code source de la page, avec un clic-droit: Code source de la page ou Ctrl+U.

Convertir l'article

On va utiliser l'utilitaire pandoc pour transformer l'article enregistré au format HTML vers le format dokuwiki utilisé par le wiki Debian-Facile.

On commence par installer le paquet:


#root apt install pandoc

Ensuite on lance la commande qui va bien en prenant soin de modifier les chemins des fichiers et autres paramètres si besoin:


$user pandoc -s -r html /tmp/commandes-en-vrac.html -w dokuwiki -o /tmp/commandes-en-vrac.dokuwiki
  • -r html : le format du fichier d'entrée
  • /tmp/commandes-en-vrac.html : le chemin du fichier d'entrée
  • -w dokuwiki: le format du fichier de sortie
  • -o /tmp/commandes-en-vrac.dokuwiki : le chemin du fichier de sortie

Pour consulter la documentation sur pandoc et les formats supportés:


$user pandoc --help man pandoc Copier l'article dans le wiki

On a donc notre article au format dokuwiki dans le fichier commandes-en-vrac.dokuwiki . Il nous reste la partie facile et rapide à faire. On copie le contenu du fichier commandes-en-vrac.dokuwiki puis on le colle dans la page du wiki qui correspond.

On prend quand même le temps de vérifier que la mise en forme est correcte. Il faut vérifier les liens qui peuvent ne plus pointer au bon endroit. S'il y a des images ou des vidéos, il faudra peut-être penser à les ajouter au wiki (au cas la source disparaisse ou soit déplacée). Si on a un peu de temps et pour faire les choses bien, on peut vérifier et compléter certains points.

Quelques conseils pour la rédaction

En règle générale, copier un article ne suffit pas, il faut parfois effectuer quelques modifications. Quelques éléments à vérifier:

  • Indiquer la date de rédaction,
  • Indiquer la version des logiciels utilisés,
  • Indiquer les fichiers importants: les fichiers de configuration et les données pour les sauvegardes,
  • Citer les sources et autres liens utiles,
  • Respecter le respect des licences,
  • Vérifier l'orthographe: j'utilise LibreOffice Writer avec Grammalecte,
  • ...
Pourquoi ?

C'est vrai que c'est un peu idiot de se poser la question à la fin sur l'utilité de dupliquer du contenu. Voici quelques raisons:

  • Repartager les contenus intéressants: certains articles sont oubliés parce que le site n'est pas connu.
  • Améliorer la visibilité du libre: plus il y aura d'articles plus ils seront faciles à trouver sur internet.
  • Le contenu peut disparaître: de nombreux sites disparaissent tous les jours embarquant en même temps des connaissances importantes.
  • Adapter un contenu: en modifiant seulement les commandes qui peuvent différer d'une distribution à l'autre.
  • Compléter une documentation existante.
  • ...

Par ailleurs, c'est dans l'esprit du logiciel libre de partager et de réutiliser. Pourquoi devrait-on s’embêter à refaire de la documentation quand certains ont déjà fait un superbe travail ? Je peux vous assurer qu'écrire un article de qualité c'est pas évident et surtout c'est chronophage. Autant se concentrer sur l'écriture du contenu nouveau ou adapter l'existant plutôt que de repartir de zéro.

C'est une des nombreuses manières de contribuer pour le développement et la promotion du logiciel libre. Vous pouvez également:

  • Repartager des articles via les réseaux sociaux, le Journal du Hacker ou votre Shaarli,
  • Participer au développement d'un logiciel,
  • Remonter les bugs,
  • Rédiger de la documentation et des tutos pour la communauté,
  • Faire de l'entraide sur les forums et chats,
  • Organiser et participer à des évènements du libre,
  • Financer des auteurs et des projets,
  • ...

Pas d'excuses, nous avons tous la possibilité de contribuer, même si cela peut sembler modeste. Tout ce que vous pourrez faire sera utile.

Ressources nIQnutn CC-BY

Gravatar de nIQnutn
Original post of nIQnutn.Votez pour ce billet sur Planet Libre.

Thuban : Publication d'isotop-0.2.1

Première mise à jour pour isotop, l'OpenBSD personnalisée et préparée pour une utilisation bureau.

Parmi les changements effectués, vous remarquerez que :

  • Le tkmenu comprte des entrées vers les outils relatifs à isotop : mise à jour, gestion des paquets...
  • L'outil OPaMa pour gérer les paquets est inclus
  • Les divers outils livrés avec xfce sont triés sur le volet. Cela entraîne le remplacement de mpd/xfmpc par deadbeef, parole a disparu.
  • Un lecteur PDF plus "commun" que mupdf est intégré.
  • La gestion des traductions est prêt et plus pratique à modifier pour ajouter d'autres langues (seulement le français et l'anglais sont gérés pour l'instant).
  • Lorsqu'une imprimante est branchée, elle peut être configurée par simple utilisateur (le module ulpt est désactivé au premier démarrage, cela nécessite un redémarrage. Si vous voulez installer une imprimante, redémarrez le pc juste après l'installation ;) )
  • Quelques jeux ont été ajoutés. La ludothèque d'OpenBSD est très fournie oO .
  • Compression des images au format xz pour limiter le temps de transfert.

Tous les liens sont sur la page officielle, je recopie ici uniquement les magnets à ouvrir avec un client bittorrent (avec trackers publics)

magnet:?xt=urn:btih:45e36d480c6e813e822fbd36f454799a0bde686d&dn=isotop-0.2.1-amd64-full.fs.xz&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=http%3A%2F%2Fopensharing.org%3A2710%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337 magnet:?xt=urn:btih:8d86b6c82bec186da5ce800c6497ec04d9d42f59&dn=isotop-0.2.1-amd64-full.iso.xz&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=http%3A%2F%2Fopensharing.org%3A2710%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337 magnet:?xt=urn:btih:6523d3c7a9923ec0b78d12501afffe05c6960e95&dn=isotop-0.2.1-amd64-netinst.fs.xz&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=http%3A%2F%2Fopensharing.org%3A2710%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337 magnet:?xt=urn:btih:81d3582a2988699746ea896b96b2a596d99ddb08&dn=isotop-0.2.1-amd64-netinst.iso.xz&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=http%3A%2F%2Fopensharing.org%3A2710%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337 magnet:?xt=urn:btih:42f765c3d53ee04b2a85b694fa9b0a5994885d91&dn=isotop-0.2.1-i386-full.fs.xz&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=http%3A%2F%2Fopensharing.org%3A2710%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337 magnet:?xt=urn:btih:f28fad02eb0bcf4d155930f6374243674c857418&dn=isotop-0.2.1-i386-full.iso.xz&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=http%3A%2F%2Fopensharing.org%3A2710%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337 magnet:?xt=urn:btih:27c53186b29bd785ebbf6ff48563191f2a2014a9&dn=isotop-0.2.1-i386-netinst.fs.xz&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=http%3A%2F%2Fopensharing.org%3A2710%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337 magnet:?xt=urn:btih:fc9fc6b8f57cf9773071eb8deda187eb59cdbd8d&dn=isotop-0.2.1-i386-netinst.iso.xz&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=http%3A%2F%2Fopensharing.org%3A2710%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337

Pour finir, je laisse ici une petite vidéo d'une installation filmée, en 15 minutes 34 secondes chrono, pour fred' ;)

Gravatar de Thuban
Original post of Thuban.Votez pour ce billet sur Planet Libre.

Articles similaires

Max Koder : Exploiter du JSON en Bash avec PHP

Du JSON en Bash avec PHP

Faire du JSON avec PHP ou tout autre langage orienté web, c’est trivial. Mais lorsqu’il faut commencer à se le coltiner en Bash, c’est déjà plus galère..
Pour un besoin personnel, je dois justement lire du JSON dans un shell. Le cahier des charges est simple : J’ai PHP et Python sur la bécane (un serveur), et dans l’optique de partager ce code plus tard, je ne souhaite pas avoir de dépendances. Exit donc jq, qui est une librairie permettant de combler largement mon besoin. En plus, je ne connais pas grand chose à Python, et j’ai franchement pas le temps de m’y mettre.
Dans ce billet, je vous montre comment exploiter du JSON en Bash avec PHP. Je tiens tout de même à préciser que cet article n’a pas vocation à vous apprendre ces 2 langages, mais suppose que vous en connaissiez déjà les bases.

Je vous préviens, c’est long, mais c’est également l’occasion de voir quelques astuces Bash (notamment sur les tableaux) que peut-être vous ne connaissiez pas

Petit aparté

J’avais dit vouloir prendre un peu de recul par rapport à ce blog, et me recentrer. Je continue donc le site dont je vous avais parlé, mais il est difficile pour moi de ne pas écrire ici dès lors que j’ai le clavier sous la main, dès que quelque chose me trotte dans la tête.
Aujourd’hui, reprise du boulot, je lâche ma tasse de café pour rédiger quelques lignes ici. On ne se refait pas. Et puis, je ne m’étais jamais imposé de rythme, alors autant continuer comme ça.
Oui, je change d’avis comme de chemise. Ou plutôt, je fais comme bon me semble, comme j’ai toujours fait. Si demain je n’ai pas envie de continuer cet article, qui ira me dire quelque chose ?

Je crois que je ne sais pas comment évoluera mon temps passé sur le PC. Il y a fort à parier qu’à terme les extras ne se fassent plus. Je consultais de temps à autre Mastodon, mais il ne s’agit pour la plupart que de geeks / libristes qui exposent leurs articles, des liens vers un tweet, une humeur à partager. Je n’ai pas besoin de ça.
Au contraire, je pense qu’en fait ce blog est devenu le centre de mon activité sur Internet, et que le reste ne fait que graviter autour. L’avenir nous le dira.

Utiliser PHP en Bash

Pour revenir à nos moutons, nous souhaitions exploiter du JSON en Bash avec PHP. On va tenter d’y aller étape par étape. Il s’agit tout d’abord d’exécuter un script PHP depuis un script Bash ou directement depuis un shell.

Nous partirons sur 2 fichiers : un script Bash, l’autre un PHP, tous 2 dans le même dossier.

Voilà le contenu du fichier ‘disk.php’, qui ne fera que retourner une valeur au script Bash :

<?php echo 5;

À présent, le fichier ‘test.sh’, le fichier Bash :

#!/bin/bash echo "Nombre de disques : " $(php -f $(dirname $0)'/disks.php')

Si vous lancez à présent le script test.sh, que vous aurez rendu exécutable auparavant, vous aurez ceci :

Nombre de disques : 5

J’explique :

Pour lancer un script PHP depuis Bash, il suffit de faire

php -f chemin/du/script.php  :
  • php  est la commande permettant de lancer la fonction PHP, que vous aurez installé bien sûr…
  • L’option -f  indique qu’on souhaite exécuter un fichier et non pas une commande
  • Le dernier argument est le chemin et le nom du script à traiter.

Au cas où :

dirname $0  permet de récupérer le chemin absolu du script courant.

Enfin, il est bon de savoir que tout ce qui sortira du script PHP (les echo, print etc), ne seront pas affichés. Ils seront simplement retournés au script Bash.
On pourrait ainsi réécrire la partie Bash comme ceci, sans toucher au PHP :

#!/bin/bash nbDisks=$(php -f $(dirname $0)'/disks.php') echo "Nombre de disques : $nbDisks" # Nombre de disques : 5

Ça ne changerait rien, PHP n’affiche rien. La valeur 5 serait simplement affectée à la variable

$nbDisks , qu’on afficherait ensuite. Arguments

Tout ça c’est bien, mais c’est trop scolaire. À quoi sert d’appeler un script si on ne peut pas lui passer d’arguments ? Pas grand chose, en effet.
Il y a 2 méthodes pour passer des arguments à PHP depuis Bash, que nous allons voir.

Des arguments simples

Il s’agit de passer un seul argument, une seule valeur au script à exécuter.

Dans l’exemple qui va suivre, je souhaite récupérer en Bash le nombres d’élèves de certaines classes. Si le nom d’un professeur est renseigné, on va chercher le nombre d’élèves de sa classe (on peut imaginer une requête SQL depuis PHP par exemple). Si aucun professeur n’est trouvé, on indique une erreur.
Enfin, si aucun nom n’est indiqué, on retourne le nombre d’élèves de toutes les classes.

Script PHP :

<?php if ($argc === 1) { // Aucun argument n'est donné, on donne tous les élèves echo '62'; } else { if ($argv[1] === 'michu') { // Classe de Mme Michu echo '28'; } elseif ($argv[1] === 'foo') { // Classe de Foo echo '34'; } else { echo 'Pas de classe avec ce professeur'; } }

2 points tout de même :

  • $argv  est un tableau contenant les arguments passés au script lorsque PHP est utilisé en CLI. Quelque soit le nombre d’arguments, $argv[0]  contient le chemin et le nom du script en cours.
  • $argc  contient le nombre d’arguments passés au script. Lorsque aucun argument n’est donné, cette variable est égale à 1.

Passons au script Bash :

#!/bin/bash echo "Nombre d'élèves dans la classe de Mme Michu : "$(php -f $(dirname $0)'/students.php' 'michu') echo "Nombre d'élèves dans la classe de Foo : "$(php -f $(dirname $0)'/students.php' 'foo') echo "Nombre d'élèves total : "$(php -f $(dirname $0)'/students.php') echo "Nombre d'élèves chez Bar : "$(php -f $(dirname $0)'/students.php' 'bar')

Le résultat :

Nombre d'élèves dans la classe de Mme Michu : 28 Nombre d'élèves dans la classe de Foo : 34 Nombre d'élèves total : 62 Nombre d'élèves chez Bar : Pas de classe avec ce professeur

À noter qu’il est possible de passer plusieurs arguments avec cette méthode, simplement en les espaçant :

echo $(php -f $(dirname $0)'/students.php' 'michu' 'plop' 55 'baz')

Cette méthode permet de passer plusieurs valeurs simplement, mais elle ne couvre pas tous les besoins.

Bon à savoir : Chaque argument est envoyé comme une chaîne de caractères, qu’il soit entouré de guillemets ou pas.
Aussi, dans l’exemple précèdent, le ’55’ passé au script sera de type string lorsqu’il sera utilisé par PHP.

Arguments associatifs

Il existe une astuce que j’ai découvert il y a peu, c’est de pouvoir passer des paramètres avec un nom et une valeur à un tel script. Quelle utilité à vrai dire ?
Dans l’exemple précèdent, avec les classes et le nombre d’élèves, comment passer au script que la classe de Mme Michu possède maintenant 30 élèves ?

Et bien il suffit de passer les paramètres précédés d’un double tiret

--  et de les assigner comme suit :#!/bin/bash echo "$(php -f $(dirname $0)'/disks.php' -- 'nom=Mme Michu' eleves=30)"

Coté PHP, nous allons toujours utiliser les variables $argc et $argv. Cependant, pour pouvoir les utiliser correctement, il va falloir faire une petite manipulation :

<?php print_r($argv); if ($argc === 1) { // No argument } else { $args = []; for ($i = 1; $i <= $argc - 1; $i++) { // Each args $strArgs = explode('=', $argv[$i]); $args[$strArgs[0]] = $strArgs[1]; } } if (isset($args)) { echo $args['nom'] . ' a dans sa classe ' . $args['eleves'] . ' élèves'; }

Une fois le script Bash lancé, le résultat sera celui-ci :

Array ( [0] => /home/maxk/bin/students.php [1] => nom=Mme Michu [2] => eleves=30 ) Mme Michu a dans sa classe 30 élèves

Je n’explique pas le print_r($argv), je pense que vous comprendrez. En revanche, on voit clairement que pour exploiter les arguments, il va falloir séparer le nom de l’argument (nom et eleves) de leurs valeurs (Mme Michu et 30).

C’est ce que fait le script ensuite : Il explose chaque argument s’il y en a avec le signe ‘=’, et on se retrouve avec un tableau ($args) qui contient les arguments exploitables. Pas beau ça ?

Variables globales

Avant d’attaquer les choses sérieuses, je voulais vous parler d’un petit truc qui m’est bien utile.
Dans mes scripts, j’ai régulièrement besoin de passer des variables de Bash à PHP. Je peux utiliser les arguments décrits ci-dessus bien sûr, mais il existe des cas où cela devient redondant.
C’est le cas par exemple lorsqu’il s’agit de passer encore et toujours la même valeur, la même variable.

En Bash

Il est possible de passer, en Bash, des variables en globales, c’est à dire que cette variable sera connue de tous les scripts qui seront exécutés.

Vous connaissiez cette façon pour assigner une valeur à une variable :

foo='je suis locale'

Et bien, il y a une autre façon de déclarer une variable pour qu’elle soit globale, qu’elle puisse être utilisée dans tous les scripts lancés depuis le processus :

export bar='je suis globale'

La variable

bar  est ici accessible depuis n’importe quel script ! Essayons cela.
Créez un fichier qui va déclarer 2 variables, une locale et une globale, et qui lancera un autre script Bash :#!/bin/bash foo='je suis locale' export bar='je suis globale' $(dirname $0)'/export.sh'

Puis créez le second fichier, export.sh, qui sera appelé depuis le premier script, et qui aura pour simple fonction d’afficher le contenu de ces 2 variables :

#!/bin/bash echo $foo echo $bar

Lançons le premier script (test.sh) et observons le résultat :

je suis globale

Seul le résultat de $bar est affiché, car

$foo  n’est pas connu du script export.sh. En revanche, Bash ne lève aucune erreur si une variable n’existe pas, elle sera simplement considérée comme une chaîne de caractères vide. En PHP

À présent, voyons comment récupérer une variable globale déclarée en Bash depuis PHP.
Cela est possible grâce à la fonction getenv(), qui permet de récupérer une variable de l’environnement.

Comme tout à l’heure, nous allons déclarer une variable globale dans notre script, et appeler un script PHP, qui devra l’afficher :

#!/bin/bash foo='je suis locale' export bar='je suis globale' echo $(php -f $(dirname $0)'/disks.php')

Et le script PHP :

<?php $varFoo = getenv('foo'); $varBar = getenv('bar'); echo "Foo : $varFoo\\r"; echo "Bar : $varBar\\r";

Lançons le script Bash, et voyons le résultat :

Foo : Bar : je suis globale

Il est possible de récupérer les variables de Bash en PHP. Génial non ?
À savoir qu’une fois la variable déclarée avec

export , il est possible de la modifier à souhait en Bash, sans la précéder de export , elle sera toujours globale. Du JSON en Bash avec PHP

Maintenant que nous avons vu qu’utiliser PHP avec Bash n’était pas bien difficile, il est l’heure de nous intéresser au sujet important : Exploiter du JSON en Bash avec PHP.

Dans les exemples qui vont suivre, pour éviter les répétitions, nous partirons du principe que notre fichier JSON system.json contient ceci :

{ "host": "Debian 8.9", "kernel": "3.16.0-4-586", "packages": { "yunohost": "2.6.4", "yunohost-admin": "2.6.1", "moulinette": "2.6.1", "ssowat": "2.6.8" }, "system": { "disks": { "sda7": "Mounted on /tmp, 360.0MiB (358.0MiB free)", "sda5": "Mounted on /var, 2.7GiB (1.7GiB free)", "sda8": "Mounted on /home, 131.3GiB (130.8GiB free)", "sda1": "Mounted on /, 8.1GiB (6.7GiB free)" }, "memory": { "ram": "2.0GiB (1.5GiB free)", "swap": "4.0GiB (4.0GiB free)" } }, "apps": { "installed": "Firefox", "installed": "Netbeans", "installed": "VLC" } }

Récupérer une valeur

Le plus simple pour démarrer, c’est de demander à PHP de nous retourner une simple valeur contenue dans ce fichier JSON.
Pour cela, il nous faudra en Bash fournir un argument : La clé que nous souhaitons récupérer. Le script PHP s’occupera de nous retourner le résultat.

Je vous donne le code complet du script PHP (je l’ai appelé system.php). Je me suis aidé des trucs que l’on a vu plus haut, et je vous explique le reste ensuite :

<?php // Récupération du chemin du fichier JSON $path = getenv('ROOT_PATH'); $jsonFile = $path . '/system.json'; // Explosion des arguments if ($argc === 1) { // Pas d'argument } else { $args = []; for ($i = 1; $i <= $argc - 1; $i++) { // Pour chaque argument, on explose son nom et sa valeur $strArgs = explode('=', $argv[$i]); $args[$strArgs[0]] = $strArgs[1]; } } // Récupération et décodage du fichier en un objet json $system = json_decode(file_get_contents($jsonFile)); // Si une clé est spécifiée, on tente d'y accèder if (isset($args['key'])) { $parts = explode("->", $args['key']); foreach ($parts as $part) { if (isset($system->$part)) { $system = $system->$part; } } } // On retourne le résultat echo $system;

Au début, on voit que je fais appel à la variable

ROOT_PATH  qui sera définie dans le script Bash. Elle nous servira en PHP à aller récupérer le chemin du fichier JSON.
Puis on définit le chemin du fichier JSON à utiliser.

La partie suivante est expliquée en haut, jusqu’à la récupération du fichier JSON, que l’on décode en un objet JSON. Si vous n’êtes pas à l’aise avec l’utilisation de JSON en PHP, je ne peux que vous conseiller cet excellent article sur le sujet

Enfin, nous allons ‘découper’ chaque partie de la clé si elle est fournie, en cherchant les éventuels 

->  présents, et tenter de récupérer la valeur correspondante dans le JSON. Par exemple en fournissant la clé ‘system->memory->ram’, le script va découper celle-ci en 3 parties et tenter d’accéder successivement à :
$system->system , puis $system->system->memory , et enfin $system->system->memory->ram .
Si celle-ci existe, sa valeur est retournée, sinon, on retourne la dernière valeur trouvée.

L’utilisation de ce script avec Bash est donc toute aisée, puisqu’il suffit de définir le dossier courant du script, la variable globale

ROOT_PATH , et la clé de la valeur à récupérer avec le nom ‘key’ :#!/bin/bash export ROOT_PATH=$(dirname $0) echo "Version du kernel : " $(php -f $ROOT_PATH'/system.php' 'key=kernel') echo "RAM : " $(php -f $ROOT_PATH'/system.php' 'key=system->memory->ram')

Résultat :

Version du kernel : 3.16.0-4-586 RAM : 2.0GiB (1.5GiB free)

Pas bien ça ? Si, c’est bien, mais pas tant que ça.
Imaginez que vous souhaitez récupérer tous les packages contenus dans le fichier JSON. Si vous ne les connaissez pas à l’avance, c’est impossible avec cette méthode.
C’est ce que nous allons voir tout de suite.

Récupérer un tableau

Si à première vue il est assez facile de passer un tableau de PHP à Bash, en réalité c’est tout autre. Comme vous le savez (ou le découvrez), PHP ne peut retourner que du texte à Bash. Il va donc falloir ruser pour récupérer un tel tableau.

Tableau indexé

Il s’agit simplement de récupérer une liste, sans notion d’association, de valeurs. On souhaite par exemple récupérer les applications installées dans notre fichier JSON, à savoir Firefox, Netbeans et VLC.

Comme dit juste au dessus, le problème est que le retour de PHP à Bash ne se fait que par une chaîne de caractères. Pour en extraire un tableau, il va donc falloir trouver un délimiteur, un truc qui va séparer chaque valeur.
Ce séparateur peut être plein de choses, comme un espace, un retour à la ligne, une lettre, …Dans tous les cas, il faut être certain de ne pas croiser ce caractère dans les données JSON à traiter.
Pour ma part, comme je sais que j’aurai éventuellement des espaces, des tabulations et des sauts de ligne, j’ai choisi d’utiliser un symbole que je ne croiserai certainement pas : ¶

Si l’on est sûr que les valeurs du tableau ne contiennent pas ce caractère spécial, on peut donc l’utiliser pour en séparer les valeurs.

On va modifier un peu notre script PHP pour que, si la clé demandée contient un tableau (objet StdClass de notre JSON), il nous retourne le tableau sous forme de chaîne de caractère, en séparant les valeurs par le caractère choisi plus haut :

<?php // Récupération du chemin du fichier JSON $path = getenv('ROOT_PATH'); $jsonFile = $path . '/system.json'; // Explosion des arguments if ($argc === 1) { // Pas d'argument } else { $args = []; for ($i = 1; $i <= $argc - 1; $i++) { // Pour chaque argument, on explose son nom et sa valeur $strArgs = explode('=', $argv[$i]); $args[$strArgs[0]] = $strArgs[1]; } } // Récupération et décodage du fichier $system = json_decode(file_get_contents($jsonFile)); // Si une clé est spécifiée, on tente d'y accèder if (isset($args['key'])) { $parts = explode("->", $args['key']); foreach ($parts as $part) { if (isset($system->$part)) { $system = $system->$part; } } } if (is_object($system)) { // La clé contient plusieurs valeurs $str = ""; // On initialise une chaîne vide foreach ($system as $key => $value) { $str .= $value . '¶'; // On colle chaque valeur dans la chaîne et un séparateur } $system = $str; // On attribue cette chaîne à notre variable qui sera retournée au script Bash } // On retourne le résultat echo $system;

J’ai mis en bleu les lignes que j’ai rajouté par rapport au script précédent. C’est ce bout de code qui va permettre de retourner toutes les valeurs si la clé passée ne contient pas qu’une seule valeur mais plusieurs.

Rien de compliqué là-dedans, vous devriez vous en sortir avec les commentaires. Passons au Bash :

#!/bin/bash export ROOT_PATH=$(dirname $0) declare -a apps IFS='¶' read -a apps <<<$(php -f $ROOT_PATH'/system.php' 'key=apps') for app in "${apps[@]}" do echo $app done echo "Mon préféré est ${apps[1]}"

Plusieurs choses à noter ici :

  • declare -a apps  : On déclare la variable apps comme un tableau indexé.
  • IFS  : C’est une variable du Shell, qui définit le séparateur. Par défaut, elle contient un espace, une tabulation (\\t)et un retour à la ligne (\\n). Chaque caractère qu’elle contient est un séparateur à lui-seul, il n’est pas possible d’utiliser une suite de caractères.
    En le faisant suivre d’une autre instruction, le séparateur est modifié uniquement pour cette instruction.
  • read  : Attend une réponse de l’utilisateur, comme un prompt
  • -a apps  : Détermine le nom de la variable dans laquelle le résultat de read sera stockée.
  • <<<  : Permet de ne pas attendre que l’utilisateur tape quelque chose, mais va envoyer la résultat du script PHP à l’instruction read, comme si l’utilisateur l’avait tapé lui-même dans le Shell.
  • On lance le script PHP system.php en donnant la clé ‘apps’, pour récupérer les applications de notre fichier JSON.

À l’issue de la commande

read …, la variable $apps  contient un tableau indexé avec les valeurs Firefox, Netbeans et VLC.

Puis on parcours simplement le tableau et on affiche chaque valeur.
Enfin, on affiche uniquement l’élément du tableau qui a pour index 1. Pour mémoire, les index commencent à 0.

Si on lance le script, voilà le résultat :

Firefox Netbeans VLC Mon préféré est Netbeans

Tableaux associatifs

On touche au but, mais également la partie la plus chiante.
Toujours dans notre fichier JSON de départ, comment pourriez-vous associer les disques (sda7, sda5 etc) à leurs mémoires respectives ?
Depuis Bash 4, il est possible d’utiliser des tableaux associatifs. Et vous allez voir que ça vaut le coup de se faire chier un peu, car on va commencer à pouvoir profiter pleinement de notre fichier JSON.

Mais le problème rencontré à la création d’un simple tableau est double. Il va maintenant falloir séparer chaque entité du tableau, mais également séparer la clé de sa valeur. Pour cela j’ai utilisé une solution toute simple : J’ai pris un second caractère spécial : þ . Ainsi dans le script que PHP doit me retourner, un tableau va ressembler à ça :

clé1þvaleur1¶clé2þvaleur2¶...

Et Bash s’occupera de découper cela.
Mais il y a un autre soucis : Comment faire savoir à PHP que l’on souhaite récupérer un tableau associatif, et non pas un tableau indexé ?
Et bien nous allons encore une fois utiliser un argument, que l’on nommera ‘assoc’. Si celui-ci est passé à 1, alors PHP devra retourner un tableau associatif, sinon un tableau indexé.

Vous y êtes ? C’est parti !

<?php // Récupération du chemin du fichier JSON $path = getenv('ROOT_PATH'); $jsonFile = $path . '/system.json'; // Explosion des arguments if ($argc === 1) { // Pas d'argument } else { $args = []; for ($i = 1; $i <= $argc - 1; $i++) { // Pour chaque argument, on explose son nom et sa valeur $strArgs = explode('=', $argv[$i]); $args[$strArgs[0]] = $strArgs[1]; } } // Récupération et décodage du fichier $system = json_decode(file_get_contents($jsonFile)); // Si une clé est spécifiée, on tente d'y accèder if (isset($args['key'])) { $parts = explode("->", $args['key']); foreach ($parts as $part) { if (isset($system->$part)) { $system = $system->$part; } } } if (is_object($system)) { // La clé contient plusieurs valeurs $str = ""; // On initialise une chaîne vide foreach ($system as $key => $value) { if (isset($args['assoc']) && $args['assoc'] === '1') { // Tableau associatif // On colle chaque clé et valeur dans la chaîne // La clé est séparée de sa valeur $str .= $key . 'þ' . $value . '¶'; } else { // Tableau indexé $str .= $value . '¶'; // On colle chaque valeur dans la chaîne et un séparateur } } $system = $str; // On attribue cette chaîne à notre variable qui sera retournée au script Bash } // On retourne le résultat echo $system;

Encore une fois j’ai mis les lignes ajoutées en évidence.
En gros si l’argument ‘assoc’ est passé à 1, on insère dans la chaîne de retour la clé et la valeur, avec les séparateurs choisis. Sinon, on n’insère que la valeur.

Passons au Bash à présent, ça risque d’être un peu long…

#!/bin/bash export ROOT_PATH=$(dirname $0) # On déclare le tableau indexé tmp declare -a tmp # On récupère les disques et on demande au script PHP un tableau associatif IFS='¶' read -a tmp <<<$(php -f $ROOT_PATH'/system.php' 'key=system->disks' 'assoc=1') # Déclaration du tableau associatif disks declare -A disks # On parcourt les disques stockés dans la variable $tmp for disk in "${tmp[@]}" do # On explose la clé de sa valeur à l'aide du second séparateur IFS='þ' read -a arr <<<$disk # On associe la clé et la valeur dans le tableau associatif # disks[cle]=valeur disks[${arr[0]}]=${arr[1]} done for K in "${!disks[@]}" do echo $K --- ${disks[$K]} done # Déclaration d'un tableau pour les clés declare -a keys # On récupère toutes les clés des disques keys=(${!disks[@]}) echo "Ma partition /var se nomme ${keys[2]} et est ${disks[${keys[2]}]}" echo "Mais je peux utiliser ça aussi : ${disks['sda7']}"

Pratiquement tout a été modifié depuis l’étape plus haut.
J’ai modifié la variable

$apps  en en $tmp , car ce tableau n’est maintenant que temporaire : Une fois le script PHP exécuté, c’est un tableau contenant les clés et les valeurs sous cette forme :clé1þvaleur1 clé2þvaleur2

Remarquez qu’on déclare ensuite le tableau

$disks . Ce n’est pas une faute de frappe, j’ai volontairement mis un A majuscule, à l’instar de $tmp . Et oui, un tableau associatif sous Bash se déclare de telle façon :declare -A montableau

Puis on parcourt les disques (la variable

$tmp ), dont on va extraire la clé et la valeur.
Pour cela, on utilise encore la méthode du read <<< , avec un autre séparateur, le second (ici þ ). La clé et la valeur sont donc stockées dans un autre tableau temporaire, $arr , puis on stocke ces 2 informations dans notre tableau associatif $disks .
Vous suivez encore ?

Une fois la boucle

for disk in ...  terminée, le tableau $disks  est rempli. Nous pouvons donc le parcourir afin d’y afficher son contenu. C’est ce que fait la boucle for K ...  qui suit.

Pour info, le ‘!’ dans l’instruction ${!disks[@]  signifie que l’on souhaite regarder dans les clés du tableau associatif. Le « @ » est utilisé pour récupérer toutes les données.
On peut donc traduire vulgairement :

for K in "${!disks[@]}"

Par :

« Pour toutes les clés appelées K trouvées dans le tableau $disks »

Mais… À ce stade, il est impossible d’afficher un seul élément du tableau, ni la clé ni sa valeur (à moins de connaître la clé). Si vous pensiez pouvoir faire ceci :

echo "${!disks[1]}" # Incorrect

Et bien ça ne fonctionne pas. En fait, il n’y a pas moyen de récupérer la clé d’un tableau associatif en Bash.
C’est pour cela que le code suivant est fait :

# Déclaration d'un tableau pour les clés declare -a keys # On récupère toutes les clés des disques keys=(${!disks[@]})

On va de nouveau créer un tableau indexé

$keys , et on va récupérer dans celui-ci toutes les clés de notre tableau $disks .
À partir de ce moment là, on pourra récupérer la clé et la valeur de chaque élément indépendamment :echo "Ma partition /var se nomme ${keys[2]} et est ${disks[${keys[2]}]}" echo "Mais je peux utiliser ça aussi : ${disks['sda7']}"

Et le résultat de ce script :

sda1 --- Mounted on /, 8.1GiB (6.7GiB free) sda7 --- Mounted on /tmp, 360.0MiB (358.0MiB free) sda5 --- Mounted on /var, 2.7GiB (1.7GiB free) sda8 --- Mounted on /home, 131.3GiB (130.8GiB free) Ma partition /var se nomme sda5 et est Mounted on /var, 2.7GiB (1.7GiB free) Mais je peux utiliser ça aussi : Mounted on /tmp, 360.0MiB (358.0MiB free)

On dit merci qui ?

En bonus

Comme je suis un mec bien, je vais vous donner une autre petite astuce sur les tableaux : Il est possible de connaître le nombre d’éléments que possède un tableau :

echo "Le tableau possède ${#disks[@]} éléments" # Le tableau possède 4 éléments

Enjoy !

L’article Exploiter du JSON en Bash avec PHP est apparu en premier sur Max-Koder.

Gravatar de Max Koder
Original post of Max Koder.Votez pour ce billet sur Planet Libre.

Articles similaires

Journal du hacker : Liens intéressants Journal du hacker semaine #43

Pour la 43ème semaine de 2017, voici 10 liens intéressants que vous avez peut-être ratés, relayés par le Journal du hacker, votre source d’informations pour le Logiciel Libre francophone !

Pour ne plus rater aucun article de la communauté francophone, voici :

De plus le site web du Journal du hacker est « adaptatif (responsive) ». N’hésitez pas à le consulter depuis votre smartphone ou votre tablette !

Le Journal du hacker fonctionne de manière collaborative, grâce à la participation de ses membres. Rejoignez-nous pour proposer vos contenus à partager avec la communauté du Logiciel Libre francophone et faire connaître vos projets !

Et vous ? Qu’avez-vous pensé de ces articles ? N’hésitez pas à réagir directement dans les commentaires de l’article sur le Journal du hacker ou bien dans les commentaires de ce billet :)

Gravatar de Journal du hacker
Original post of Journal du hacker.Votez pour ce billet sur Planet Libre.

Articles similaires

Marien Fressinaud : Lessy : versions et itérations

Je me suis intéressé ces derniers jours au système de sortie des nouvelles versions de Lessy. Cela peut paraître étonnant, mais décider d’un tel système est parfois compliqué et pose plusieurs problèmes.

Pour commencer, on peut se poser la question « pourquoi versionner ? ». J’y vois personnellement quatre intérets en particulier :

  • montre que le projet vit (marketing) ;
  • donne une indication sur le niveau de modifications au sein du logiciel depuis la version précédente (dépendances) ;
  • permet de revenir à une version plus ancienne en cas de soucis avec la nouvelle (sécurité) ;
  • donne l’occasion de célébrer quelque chose au sein de la communauté (motivation).

Lorsque je travaillais encore sur FreshRSS, nous nous étions souciés de la question de la visibilité. Nous avions alors trois versions distinctes : une stable, sortant à intervalles plutôt longs, la bêta qui sortait tous les… hum… deux mois (?) et la version de développement. Nous avions décidé de mettre en avant la version bêta qui était alors moins testé que la version stable mais qui avait l’avantage de garder les utilisateurs accrochés à « l’actualité » de FreshRSS. Ce système avait toutefois le désavantage d’être lourd à maintenir. Je souhaitais par conséquent un système plus simple pour Lessy tout en continuant de mettre en avant le travail quotidien effectué.

Concernant le deuxième point, à savoir que le versionnage donne une indication sur le niveau de modifications depuis la version précédente, je pense évidemment au système « semantic version ». Si ce système possède un intéret évident dans le cas de dépendances (ex. le logiciel A dépend du logiciel B dans sa version X), je ne le vois pas dans le cas d’un logiciel en « bout de chaine » tel que Lessy. C’est pourquoi je suis parti sur un système de nommage totalement différent.

La raison consistant à donner des numéros de version pour permettre de revenir en arrière en cas de soucis me paraît évidemment légitime bien que le cas se présente à mon avis de façon assez rare.

Enfin, sortir une nouvelle version est loin d’être uniquement une tâche technique. Il s’agit avant tout de fêter une nouvelle étape franchie dans le développement et de marquer d’une pierre blanche l’avancement pour pouvoir constater plus tard tout le chemin parcouru. Célébrer une nouvelle version, ça motive énormément !

Concrêtement, comment cela va-t-il se passer pour Lessy ?

L’ensemble des tâches à effectuer (fonctionnalités, tâches techniques, corrections de bugs, etc.) sont listées en vrac dans les tickets GitHub, ce qui me sert par conséquent de boite d’entrée. Ces tâches sont ensuite triées par petits groupes au sein d’itérations représentées par les projets GitHub. Les tâches d’une itération forment un ensemble de fonctionnalités ou tâches techniques similaires et leur temps de développement total effectif ne doit pas être excessif (je me fixe 2 ou 3 semaines comme maximum). Ces itérations permettent ainsi de dessiner une pseudo-roadmap du projet. Et comme chacune d’entre elles est nommée (d’après les constellations astronomiques), la fin d’une itération donne son nom à une nouvelle version de Lessy.

Ainsi, des quatre points que je listais plus haut, seul la problématique des dépendances n’est pas du tout adressé. Pour les trois autres :

  • marketing : des versions sortent régulièrement et leurs noms sont plus sympas qu’un simple nombre ;
  • sécurité : revenir à une version antérieure est évidemment toujours possible, renforcé par le fait que chaque « commit » dans « master » peut être considéré comme stable ;
  • motivation : savoir qu’une itération est courte par principe permet de savoir qu’à la fin du mois je pourrais éventuellement passer à autre chose. De plus sortir une version est un processus relativement simple.

Pour terminer, si j’ai choisi de nommer les versions de Lessy par les noms des constellations astronomiques, c’est avant tout parce que je cherchais un système de nommage original permettant de penser à autre chose qu’à seulement du code. Comme lever le nez du clavier ne suffit pas toujours à se changer les idées, je me disais que le lever vers le ciel serait une bonne idée.

Gravatar de Marien Fressinaud
Original post of Marien Fressinaud.Votez pour ce billet sur Planet Libre.

Pierre-Alain Bandinelli : Tomato by Shibby est mort ? Vive LEDE !

Si j'en crois Wikipedia, l'histoire du micrologiciel Tomato remonte au vénérable Linksys WRT54G et au projet HyperWRT qui avait été développé pour ce routeur. HyperWRT a été supporté par les bénévoles de 2004 à 2008 et en 2008 un fork aura lieu et mènera à Tomato qui sera développé jusqu'en version 1.28. Et là, nouvel abandon, et nouveaux forks, celui de Shibby (un développeur polonais) acquiert une certaine renommée. En 2017, deux vulnérabilités majeures sont publiées :

  • l'une concerne le logiciel dnsmasq (un petit serveur DNS/DHCP) : elle est publiée le 2 octobre 2017 sous le numéro CVE-2017-14491. Brièvement, une faille est détectée qui permet l'exécution de code distant sur une machine propulsant dnsmasq
  • la seconde est KRACK, la découverte par un chercheur belge d'une faille dans le protocole WPA2

Deux très bonnes raisons de mise à jour !

Tous les utilisateurs de firmware de routeurs & points d'accès se sont alors tournés vers les fournisseurs de ceux-ci, et les utilisateurs de Tomato by Shibby ont attendu avec impatience la sortie d'une nouvelle version. Malheureusement, deux semaines après ces annonces, aucun signe de vie et le site qui hébergeait les données de Tomato by Shibby n'est plus accessible au moment où j'écris ces lignes.

Il y a de nombreuses distributions basées sur Tomato by Shibby et d'autres forks de Tomato (cf. la page de Wikipedia sur Tomato, cependant si celle-ci est un jour, aucun des forks n'a été mis à jour post-annonce de KRACK ce qui n'augure rien de bon). Le code source étant disponible, de bonnes âmes expertes sauront peut-être faire renaître la tomate de ses cendres.

Pas de panique, il semble que LEDE soit une bonne alternative à Tomato dans la plupart des cas. Supporté par une communauté qui semble un peu plus large (Tomato by Shibby était, ne semble-t-il, soutenu que par un seul homme), LEDE est un fork d'OpenWRT. La dernière version 17.01.4 est très stable, très pratique et a été patchée pour KRACK !

Il est délicat de comparer LEDE et Tomato : là où Tomato se borne (bornait ?) à propulser routeurs et autres périphériques réseau, LEDE (Linux Embedded Development Environment) veut aller plus loin et propose une véritable micro-distribution avec gestion de paquets (avec l'utilitaire opkg). L'interface graphique LuCI de LEDE est très agréable, elle comporte moins de fonctionnalités que Tomato et il est probable qu'il faille recourir plus fréquemment à la ligne de commande de LEDE pour les paramétrages complexes possibles dans Tomato (par ex. la QoS, la gestion avancée des VLAN etc...). Mais dans les situations simples, LEDE peut-être un remplacement immédiat à Tomato. Pour les cas complexes, la migration est à évaluer, surtout si personne ne reprend le flambeau de Shibby !

Pour découvrir LEDE, c'est ici.

Gravatar de Pierre-Alain Bandinelli
Original post of Pierre-Alain Bandinelli.Votez pour ce billet sur Planet Libre.

Pierre-Alain Bandinelli : Comment LEDE a sauvé mes "vieux" points d'accès Wifi

J'avais acheté il y a peut-être 2-3 ans des petits points d'accès Wifi d'une marque chinoise. Lors de la divulgation de KRACK, je vérifiais le site du fabricant mais je constatais qu'aucune mise à jour n'était publiée pour ces appareils.

Je me tournais alors vers LEDE, le fork open source d'OpenWRT. En quelques minutes, j'identifiais le matériel dans la liste des matériels supportés, je téléchargeais la version 17.01.4 publiée le 18 octobre avec les corrections nécessaires pour KRACK.

L'installation de LEDE sur les points d'accès fut très facile :

  1. réinitialiser les points d'accès à l'aide du bouton RESET
  2. se connecter à l'interface du constructeur chinois, et se rendre dans la section "Firmware upgrade"
  3. téléverser le fichier de micrologiciel de LEDE
  4. ... patienter pendant le processus et le redémarrage
  5. se connecter sur http://192.168.1.1 pour trouver LuCI, l'interface graphique de LEDE

Deux enseignements :

  • si vous ne connaissez pas LEDE, c'est une très belle distribution pour les routeurs/points d'accès et autres petits périphériques du genre ; une bien pratique suite à OpenWRT
  • le llbre est une bonne solution à l'obsolescence et peut apporter une pérennité d'usage de matériels délaissés par les fabricants

Gravatar de Pierre-Alain Bandinelli
Original post of Pierre-Alain Bandinelli.Votez pour ce billet sur Planet Libre.

debian-facile.org : Présentation du Manuel de référence Debian

Le guide de référence Debian

Le guide de référence Debian est destiné à procurer un large aperçu du système Debian en tant que guide de l?utilisateur d?un système installé. Il couvre de nombreux aspects de l?administration du système à l?aide d?exemples de commandes de l?interpréteur pour les non-développeurs.

Le but de ce document:

    fournir un aperçu et passer les cas marginaux (vue d?ensemble) ;
    le garder court et simple ;
    ne pas réinventer la roue (utiliser des liens pointant vers les références existantes) ;
    mettre l?accent sur les outils n?ayant pas d?interface graphique ou en mode console (utiliser des exemples en ligne de commande) ;


On y trouvera:

Toutes les bases pour comprendre et administrer un système type Unix.

    L'administration des utilisateurs ;
    le compte administrateur ;
    la gestion des permissions ;
    le système de fichiers ;

Toutes les bases de la gestion des paquets

    Les mises à jour ;
    les opérations de base pour la gestion des paquets ;
    aptitude ;
    apt-get ;
    apt-cache ;
    les archives Debian ;
    création d?une petite archive publique de paquets ;

Des explications sur l'initialisation du système

Les différentes étapes du processus d?amorçage du système ;
    l'Initialisation des modules du noyau ;

Des notions sur l'authentification

    Les fichiers de configuration importants ;
    gestion des informations des comptes et des mots de passes ;
    avoir un mot de passe de qualité ;
    sudo ;
    mot de passe sûr avec internet ;
    sécuriser le mot de passe de l?administrateur ;

Des explications sur la configuration réseau

    La gestion du périphérique réseau ;
    La configuration du réseau ;
    Le pare-feu ;

Des présentations sur les applications réseau

    Le navigateur web ;
    le courrier électronique ;
    leur configuration ;
    les serveurs POP3/IMAP4 ;
    Le serveur et les utilitaires d'impression ;
    Les serveurs d'accès à distance comme SSH ;

Tout savoir sur votre interface graphique (X Window)

    Configurer votre environnement de bureau ;
    Le serveur X ;
    Démarrer le système X Window ;
    les applications de bureautique ;
    les applications utilitaires pour X ;

Comprendre les paramètres linguistiques

    Le clavier ;
    l'affichage de sortie ;
    la reconfiguration des paramètres linguistiques ;

On trouvera aussi un chapitre astuces

    Commandes colorisées ;
    afficher les fichier ouverts par un processus ;
    tracer l?activité d?un programme;
    astuces de maintenance du système ;
    astuces relatives au stockage des données ;
    gestion de l'espace disque ;
    créer le fichier image du disque ;
    le noyau Linux ;
    La virtualisation ;

On apprendra à synchroniser, archiver, sauvegarder

    Partager, copier et archiver ;
    sauvegarder et restaurer ;
    et plus encore ;

Il est aussi proposer un chapitre sur la conversion de données

    Imprimer convenablement une page de manuel ;
    créer une page de manuel ;
    fusionner deux fichiers PS ou PDF ;
    extraire des données XML
    etc...


Ce document est parcemé de petites choses qui facilitent sa compréhension, on y verra:

Des mises en garde

Attention
"En utilisant une source d?archive mixte, vous devez vous assurer par vous-même de la compatibilité des paquets car Debian ne la garantit pas.
S?il existe des incompatibilités de paquets, vous pouvez casser votre système. Vous devrez être capable d?apprécier ces exigences techniques.
L?utilisation de sources mixtes d?archives aléatoires est une opération entièrement facultative et son utilisation est quelque chose que je ne vous encourage pas à faire."


Des avertissements

Avertissement
"Ne jouez pas avec les chargeurs d?amorçage sans avoir un support de secours amorçable (CD ou disquette) créé à partir des images du paquet grub-rescue-pc.
Il vous permettra de démarrer votre système sans même avoir de chargeur initial fonctionnel sur le disque dur."


Des astuces

Astuce
Les n?uds de périphériques n?ont pas besoin d?être statiques pour les règles de montage se trouvant dans « /etc/fstab ».
Vous pouvez utiliser UUID à la place de leur nom de périphérique tel que« /dev/sda » pour monter les périphériques.
Consultez Section 9.5.3, « Accès à une partition en utilisant l?UUID ».


Des Tableaux

    Tableau 4.7. Liste des services et ports sûrs et non sûrs;
    Tableau 6.1. Liste de navigateurs web;
    Tableau 6.2. Liste des paquets de greffons pour les navigateurs;
    ETC...


Des notes

Note
Une fois que quelqu?un a accès à l?interpréteur de commandes de l?administrateur, il peut accéder à l?ensemble du système et en réinitialiser tous les mots de passe.
De plus, il peut compromettre le mot de passe de n?importe quel utilisateur en utilisant des outils de cassage de mots de passe par force brute tels que les paquets john et crack
(consultez Section 9.4.11, « Vérification de la sécurité et de l?intégrité du système »).
Ces mots de passes cassés peuvent permettre de compromettre d?autres systèmes.


Note
L?installation de logiciels tels que scribus (KDE) sous l?environnement de bureau GNOME est acceptable puisqu?il n?existe pas de fonctionnalité équivalente sous l?environnement de bureau de GNOME.
Cependant, l?installation de nombreux paquets ayant les mêmes fonctionnalités pollue votre menu.


Des exemple de fichiers

Script d?exemple pour la sauvegarde du système

#!/bin/sh -e
# Copyright (C) 2007-2008 Osamu Aoki , Public Domain
BUUID=1000; USER=osamu # UID and name of a user who accesses backup files
BUDIR="/var/backups"
XDIR0=".+/Mail|.+/Desktop"
XDIR1=".+/\\.thumbnails|.+/\\.?Trash|.+/\\.?[cC]ache|.+/\\.gvfs|.+/sessions"
XDIR2=".+/CVS|.+/\\.git|.+/\\.svn|.+/Downloads|.+/Archive|.+/Checkout|.+/tmp"
XSFX=".+\\.iso|.+\\.tgz|.+\\.tar\\.gz|.+\\.tar\\.bz2|.+\\.cpio|.+\\.tmp|.+\\.swp|.+~"
SIZE="+99M"
DATE=$(date --utc +"%Y%m%d-%H%M")
[ -d "$BUDIR" ] || mkdir -p "BUDIR"
umask 077
dpkg --get-selections \\* > /var/lib/dpkg/dpkg-selections.list
debconf-get-selections > /var/cache/debconf/debconf-selections

{
find /etc /usr/local /opt /var/lib/dpkg/dpkg-selections.list \\
     /var/cache/debconf/debconf-selections -xdev -print0
find /home/$USER /root -xdev -regextype posix-extended \\
  -type d -regex "$XDIR0|$XDIR1" -prune -o -type f -regex "$XSFX" -prune -o \\
  -type f -size  "$SIZE" -prune -o -print0
find /home/$USER/Mail/Inbox /home/$USER/Mail/Outbox -print0
find /home/$USER/Desktop  -xdev -regextype posix-extended \\
  -type d -regex "$XDIR2" -prune -o -type f -regex "$XSFX" -prune -o \\
  -type f -size  "$SIZE" -prune -o -print0
} | cpio -ov --null -O $BUDIR/BU$DATE.cpio
chown $BUUID $BUDIR/BU$DATE.cpio
touch $BUDIR/backup.stamp




Comme on le voit ce document peut être votre livre de chevet ou alors il peut se picorer à l'envie selon le problème que l'on recontre.



https://www.debian.org/doc/manuals/debi ? ex.fr.html

Gravatar de debian-facile.org
Original post of debian-facile.org.Votez pour ce billet sur Planet Libre.

Remi Collet : Astuces de configuration de PHP

Traduction de l'article PHP Configuration Tips.

Cet article regroupe les informations actualisées qui ont été publiées ici au cours des dernières années.

RHEL 7 fournit le serveur HTTP Apache  version 2.4 et PHP version 5.4.

Le configuration la plus commune pour Apache et PHP utilise mod_php, mais présente quelques limites et inconvénients :

  • une seule versions de mod_php peut être utilisée
  • mod_php tourne dans le processus httpd, sans isolation
  • mod_php n'est supporté que pour le MPM prefork

Cet article explique comment déléguer l'exécution des scripts PHP à un service d'arrière plan utilisant le protocole  FastCGI, comment utiliser une version récente de PHP, comment utiliser plusieurs versions de PHP, et comment améliorer les performances d'Apache..

Le paquet du serveur HTTP d'apache disponible dans RHEL fournit l'ensemble des fonctionnalités nécessaires pour une telle configuration.

1. Basculer vers php-fpm 1.1. Supprimer mod_php

Il est conseillé de supprimer ou de désactiver mod_php afin de réduire la consommation mémoire de chaque processus httpd.

Vous pouvez soit déinstaller le paquet php, qui ne contient que ce module

yum remove php

ou simplement le désactiver en commentant la directive LoadModule directive dans le fichier /etc/httpd/conf.modules.d/10-php.conf.

# disabled # LoadModule php5_module modules/libphp5.so 1.2. Installer php-fpm

Vous pouvez maintenant installer php-fpm et activer son service

yum install php-fpm systemctl start php-fpm systemctl enable php-fpm

Remarque: le paquet php-fpm est disponible dans le canal optional, qui doit être activé.

Pour configurer l'exécution des scripts PHP, modifiez ou créez le fichier de configuration /etc/httpd/conf.d/php.conf :

Les lignes suivantes interdise l'accès aux fichiers .user.ini depuis les clients Web!

Require all denied

Activation de la gestion du Multiviews par php:

AddType text/html .php

Ajouter index.php à la liste des fichiers utilisés pour fournir le contenu d'un dossier :

DirectoryIndex index.php

La ligne suivante active les entêtes d'autorisation :

  SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=

Rediriger l'exécution des scripts PHP vers le service FPM

SetHandler "proxy:fcgi://127.0.0.1:9000"

Si des directives php_value sont présentes dans ce fichier, vous devez les supprimer, elles ne concernent que mod_php.

Vous pouvez maintenant redémarrer le serveur web et, avec une simple page de test

<?php phpinfo();

vérifier qui PHP est désormais exécuté à par le service FastCGI:

PHP Version 5.4.16 Server API= FPM/FastCGI 1.3. Réglages de PHP

Le fichier de configuration principal est /etc/php-fpm.conf, qui contient beaucoup de commentaires expliquant chaque option.

FPM pour exécuter plusieurs services (pool), chacun exécutant les scripts PHP avec des options pouvant être différentes, le fichier de configuration du service par défaut (www) est /etc/php-fpm.d/www.conf, qui contient aussi de nombreux commentaires.

1.3.1. php_value, php-flag

Les options de PHP peuvent être configurées en utilisant les directives php_value, php_admin_value, php_flag et php_admin_flag :

  • avec mod_php,  dans les fichiers de configuration d'Apache
  • avec FPM, dans les fichiers de configuration de chaque service (pool)
1.3.2. .htaccess

Les options peuvent, en plus, être définies pour un dossier spécifique :

  • avec mod_php, en utilisant un fichier .htaccess
  • avec FPM, en utulisation un fichier .user.ini (les mot clés php_* ne sont pas nécessaires).
1.3.3. Réglages des processus

FPM fonctionne en service et lance plusieurs processus pour gérer les différentes requêtes en parallèle, il existe plusieurs modes :

  • pm = ondemand, un processus est lancé uniquement lors d'une nouvelle connexion, et arrêté lorsqu'il n'y a pas d'activité, ce mode est  adapté pour les environnements de développement
  • pm = dynamic, un groupe de processus est toujours en fonctionnement, plus de processus seront démarrés en cas de besoin, ce mode adapté à la production
  • pm = static, un nombre fixe de processus est toujours présent, ce mode est adapté à la production et peut améliorer les performances
1.4. Réglages du Serveur HTTP Apache 1.4.1. Mode threadé

Par défaut, le serveur HTTP apache utilise un ensemble de processus pour gérer les requêtes entrantes (MPM prefork).

Comme nous n'utilisons plus mod_php, nous pouvons basculer sur un MPM threadé (worker or event), et c'est un ensemble de threads qui gérera les requêtes, réduisant le nombre de processus, la consommation mémoire, et améliorant les performances, en particulier lorsqu'il s'agit de servir de nombreux fichiers statiques.

Changer leMPM utilisé dans le fichier de configuration /etc/httpd/conf.modules.d/00-mpm.conf :

# disabled # LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # disabled # LoadModule mpm_worker_module modules/mod_mpm_worker.so LoadModule mpm_event_module modules/mod_mpm_event.so 1.4.2. Unix Domain Socket

Par défaut, FPM écoute sur un socket réseau, mais il peut aussi utiliser un socket local (UDS), ce qui peut améliorer sensiblement les performances :

Dans la configuration du service (pool) FPM :

  listen = /run/php-fpm/www.sock listen.owner = apache listen.mode = 0660

Dans la configuration du serveur Apache :

  SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" 1.4.2. Séparation du frontal et des serveurs applicatifs

Par défaut, FPM écoute les requêtes entrantes sur un socket réseau local, il est évidement possible d'utiliser un serveur séparé, une machine virtuelle ou un containeur (une instance docker)

Dans le configuration du service (pool) FPM :

  listen = 10.0.0.2:9000   listen.allowed_clients = 10.0.0.1

Dans la configuration du serveur Apache :

  SetHandler "proxy:fcgi://10.0.0.2:9000" 1.4.3 Plusieurs serveurs applicatifs

Pour traiter plus de requêtes simultanément, vous pouvez désirer répartir la charger entre plusieurs serveurs PHP, ce qui est très facile.

Exemple de configuration du serveur Apache avec 3 serveurs applicatifs :

  # Création du répartiteur de charge       BalancerMember fcgi://10.0.0.2:9000     BalancerMember fcgi://10.0.0.3:9000     BalancerMember fcgi://10.0.0.4:9000     # Redirection de l'exécution des scripts PHP       SetHandler "proxy:balancer://phpfpmlb"   2. Utilisation d'une version récente de PHP

RHEL fournit PHP version 5.4, qui était la version courante lors de la publication de RHEL-7, mais qui peut être trop ancienne pour des projets récents.

PHP version 5.6, 7.0 et 7.1 sont maintenant supportés sur RHEL, fournit dans le produit Red Hat Software Collections (RHSCL).

Dans l'example ci-dessous, nous utiliserons la version 7.0, mais s'applique à l'identique pour les autres versions.

2.1. Installation

Installation de la  Software Collection, après avoir activé le canal RHSCL:

  yum install rh-php70

Installation du service FPM service pour cette version:

  yum install rh-php70-php-fpm

Installation des extensions supplémentaires nécessaires :

  yum install rh-php70-php-mbstring rh-php70-php-pgsql rh-php70-php-opcache

Astuce : comparer la liste des extensions disponibles, pour s'assurer que tout ce qui est nécessaire est présent.

php --modules | tee /tmp/54 scl enable rh-php70 'php --modules' | tee /tmp/70 diff /tmp/54 /tmp/70

Astuce : ne jamais se fier au nom des paquets, mais préférer le nom des extensions (e.g. php-mysqli ou rh-php70-php-simplexml), en effet la découpage des paquets peut changer entre les versions.

2.2. Utiliser une nouvelle version de PHP

Lorsqu'on utilise FPM, c'est aussi simple que d’arrêter l'ancien service et de démarrer le nouveau:

  systemctl stop php-fpm   systemctl start rh-php70-php-fpm 2.3. Paquet additionnels

Les Software Collections fournissent les même extensions que les paquets standard de RHEL.

Les utilisateurs sont habitués à trouver des extensions supplémentaires dans le dépôt EPEL, de la même manière, des extensions sont disponibles dans le dépôt communautaire centos-sclo-sclo, pour plus d'information, cherchez sclo-php sur le site https://www.softwarecollections.org/.

3. Utiliser plusieurs versions de PHP

Puisque l'exécution de PHP est redirigée version le service FastCGI service par la directive SetHandler, elle peut être définie pour chaque hôte virtuel, chaque projet ou chaque dossier.

Dans l'exemple ci-dessous, nous utiliserons PHP version 5.4 du système de base (pour des applications anciennes, qui a été configuré précédement)  et PHP version 7.1 simultanément.

3.1. Installation

Installation de la Software Collection, après avoir activé le canal RHSCL:

yum install rh-php71 rh-php71-php-fpm rh-php71-php-mbstring rh-php71-php-opcache ...

Configuration de FPM pour écouter sur un port différent de celui utilisé par le service php-fpm service par défaut, dans le fichier /etc/opt/rh/rh-php71/php-fpm.d/www.conf.

  listen = 127.0.0.1:9071

Configurer SELinux pour ne pas bloquer ce port :

  semanage port -a -t http_port_t -p tcp 9071

Démarrer le service :

  systemctl start rh-php71-php-fpm

Il est désormais possible de choisir la version de PHP utilisée pour chaque dossier dans le fichier de configuration du serveur Apache :

Exemple:

  # Utiliser PHP 7.1 par défaut       SetHandler "proxy:fcgi://127.0.0.1:9071"     # Utiliser PHP 5.4 pour une ancienne application            SetHandler "proxy:fcgi://127.0.0.1:9000"       4. Conclusion

J'espère que ce petit article a illustré les nombreux bénéfices de basculer sur FPM pour vos applications PHP:

  • isolation des processus entre le frontal web (httpd) et les serveurs applicatifs (fpm)
  • amélioration des performances
  • utilisation des versions modernes de PHP
  • utilisation de plusieurs versions de PHP

Gravatar de Remi Collet
Original post of Remi Collet.Votez pour ce billet sur Planet Libre.

Articles similaires

genma : Quelques trucs sympa avec SSH

Le fichier config

Pour éviter les attaques par défaut sur le port 22 pour SSH, il est courant de changer de port. Du coup, il faut lancer ssh avec l'option -p. Exemple

ssh -p 1234 moi@monserveur.org

De plus, l'utilisateur que l'on veut utiliser peut être un utilisateur différent de la session courante. On peut aussi vouloir renommer le nom du serveur pour simplifier

Pour simpifier tout ça, il y a le fichier config qui se trouve /.ssh/config

Extrait du fichie ~/.ssh/config

###################################
# PERSO #
###################################
host cloud
User moi
hostname cloud.monserveur.org
Port 1234
IdentityFile /home/genma/.ssh/SSHKey

Et du coup la commande ci-dessus

ssh -p 1234 moi@monserveur.org

deviendra

ssh moi@cloud

Avoir une bannière personnalisé à la connexion ssh

Quand je suis connecté, j'aime bien avoir une petite personnalisation du genre :

genma@PC~$ ssh genma@cloud.monserveur.org
.____________.
MM. .MM | |
"MM._______.MM" | Le cloud |
/ \\ | de Genma |
/ dMMb dMMb \\ | |
/ dM"""Mb dM"""Mb \\ |____________|
| MMMMM"/O\\"MMMMM | ||o
| "MMM"/ \\"MMM" | .dMMM 8
| dMMMMMMMM
\\ \\ / dMMMMMMMP
AMMMMMMMMM\\_____/MMMMMMMMMMMM"
Enter passphrase for key '/home/genma/.ssh/SSHKey':

Pour celà, j'ai créé (repris en l'adaptant un peu) un dessin en ASCII art. Il faut ensuite créer un fichier

/etc/banner

qui contient l'ASCII art dedans. Et aux connexions SSH suivantes, ce dessin apparaîtra.

Recevoir un SMS - Freemobile à la connexion SSH

J'avais rédigé un tutoriel SSH Notification par SMS Freemobile à la connexion expliquant d'être notifié par sms lors de toutes initialisation d'une connexion sftp ou ssh quand on est un utilisateur Freemobile. Je vous renvoie donc vers cette astuce.

Avoir un prompt coloré

Pour avoir un prompt (invite de commande) coloré et savoir de suite, visuellement, sans avoir à lire sur quel machine je suis (je met du vert, du bleu, du violet) ou si je suis en root (je met alors du rouge), j'utilise la technique du prompt coloré que j'avais décrite ici : Prompt coloré pour son shell

Gravatar de genma
Original post of genma.Votez pour ce billet sur Planet Libre.

Paul Ezvan : BOINC, systemd et priorité des processus sous Linux, la suite

Dans mon précédent billet j'avais pensé réglé mon problème, le démon BOINC laissant toutes les ressources processeur libres en cas de besoin.
Pour cela j'avais configuré systemd pour allouer une priorité faible au cgroup contenant les processus de calculs BOINC:
sudo systemctl set-property boinc.service CPUWeight=1
Comme noté dans les commentaires, cet attribut n'est pas disponible dans les versions de systemd antérieures à 231, où il remplace l'attribut CPUShares.
L'équivalent pour ces versions est: systemctl set-property boinc.service CPUShares=2
Ce changement reflète une modification de l'interface cgroups du noyau, où l'attribut cpu.shares est remplacé par cpu.weight. Or cette modification n'a pas encore été intégrée dans la branche principale, ce qui conduit systemd à convertir la valeur de CPUWeight à son équivalent cpu.shares sur mon système.

Pourtant j'ai remarqué que la lecture de vidéos n'était pas fluide sur mon système. En renouvelant l'expérience précédemment décrite les résultats montraient que BOINC ne laissait pas libres toutes les ressources du processeur.
Après avoir lu quelque documentation comme la page de manuel de systemd sur la gestion des ressources et la documentation du noyau sur les cgroups, j'ai pu comprendre d'où venait le problème.
Les cgroups sont organisés hiérarchiquement. Les ressources processeur définies dans un cgroup sont partagées entre les cgroups ayant le même parent.
De plus systemd utilise une hiérarchie spécifique pour grouper les processus du système, nommée slices. systemd sépare les processus utilisés par des services et ceux utilisés par les sessions utilisateurs dans des slices différentes, user.slice et system.slice, qui font partie de la slice racine .slice. Ceci peut-être observé avec la commande systemd-cglsqui représente un arbre des processus, services et slices. Ces slices sont ensuites reflétées dans l'organisation des cgroups créés par systemd.
Le service BOINC est donc lancé dans la slice system.slice, comme la plupart des autres services. Cela signifie qu'il partage son temps processeur avec les autres service dans cette slice selon la configuration CPUWeight donnée, et que la slice partage cette ressource avec les autres slices selon leurs configurations propres.
Celle ci est pour a slice contenant les services et celle contenant les sessions des utilisateurs:
% cat /sys/fs/cgroup/cpu/system.slice/cpu.shares
1024
% cat /sys/fs/cgroup/cpu/user.slice/cpu.shares
1024

Les deux slices ont donc le même nombre de shares configuré. Le résultat est que si chacune demande toutes les ressources processeur disponible, chacune aura 50% du temps disponible alloué. Et donc dans le cas de BOINC, l'utilisateur n'a que 50% du temps processeur disponible !
Une solution est de créer une slice dédiée pour BOINC, et de lui allouer une faible priorité.
On procède en créant la configuration de la slice dans le fichier /etc/systemd/system/lowprio.slice qui a le contenu suivant:

[Unit]
Description=Slice with low CPU priority
DefaultDependencies=no
Before=slices.target
[Slice]
CPUWeight=1

Ensuite on surcharge la configuration du service BOINC en créant un fichier /etc/systemd/system/boinc.service avec le contenu suivant:

.include /usr/lib/systemd/system/boinc.service
[Service]
Slice=lowprio.slice

Finalement on recharge la configuration de systemd et redémarre le service BOINC:

% sudo systemctl daemon-reload
% sudo systemctl restart boinc.service

On peut maintenant relance la même expérience qu'auparavant, mais en utilisant la commande systemd-cgtop qui montre l'utilisation du processeur par groupe:

Control Group Procs %CPU Memory Input/s Output/s
/ 72 558.4 5.1G - -
/lowprio.slice 8 520.0 - - -
/user.slice 47 33.8 - - -
/system.slice 16 2.9 - - -
/init.scope 1 - - - -
/lowprio.slice/boinc.service 8 - - - -

On remarque que boinc.service n'a pas de temps CPU comptabilisé. C'est parce que j'ai retiré l'attribut CPUWeight pour le service, ce qui désactive le suivi de l'utilisation processeur de son cgroup. Ce n'est pas un problème car le cgroup parent lowprio.slice le comptabilise, et utilise environ 558% de temps processeur.
On relance l'expérimentation en lançant la commande % for i in `seq 8`; do sha512sum /dev/zero&;done.
Cette fois cgtop montre que toutes les ressources processeurs sont attribuées à la slice contenant les sessions utilisateurs user.slice:

Control Group Procs %CPU Memory Input/s Output/s
/ 80 800.0 5.4G - -
/user.slice 55 784.4 - - -
/lowprio.slice 8 10.8 - - -
/system.slice 16 4.0 - - -
/init.scope 1 - - - -
/lowprio.slice/boinc.service 8 - - - -

On note que system.slice est aussi utilisée car le serveur d'affichage Xorg est lancé dans cette slice, et je joue une vidéo en parallèle. Il faut donc allouer une priorité suffisante à ce groupe pour ne pas impacter la vitesse d'affichage.
Pour conclure on peut noter que l'utilisation des cgroups et de systemd a fortement compliqué la configuration de l'allocation des ressources processeur du système. Il m'a fallu pas mal de temps pour comprendre comment revenir au comportement voulu par BOINC, c'est à dire de laisser toutes les ressources processeur disponibles quand n'importe quel autre programme en a besoin.

Thème: BOINCLinuxLibresystemd

Gravatar de Paul Ezvan
Original post of Paul Ezvan.Votez pour ce billet sur Planet Libre.

Articles similaires

System Linux : Petit test simpliste de Ani-Shell.php

ani-shell.jpg

Charmant fichier php...

Pour tester la "chose" il vous faut un apache et php sur votre bécane :

# apt-get update && apt install apache2 # apt install php7.0 libapache2-mod-php7.0 # service apache2 restart

Vérifier que ça fonctionne :

# vi /var/www/html/phpinfo.php

Copier ceci dedans :

<?php phpinfo(); ?>

Télécharger la "chose" :

Cette bestiole est détecté en malware alors faites gaffe... :

https://sourceforge.net/projects/ani-shell/files/?source=navbar

# mv Ani-Shell.php /var/www/html/

Allons voir :

http://localhost/Ani-Shell.php

Username : lionaneesh Password : lionaneesh

Il a des copains aussi :

git clone https://github.com/JohnTroony/php-webshells.git

Amusez vous bien :)

Gravatar de System Linux
Original post of System Linux.Votez pour ce billet sur Planet Libre.

Articles similaires

Pages