Installer symfony sur ubuntu 8.04

Ne pas utiliser apt, la version qu’il installe va générer des erreurs.

PHP Fatal error: Uncaught Error: Call to undefined method Composer\Package\RootPackage::getConfig() in /home/manu/.config/composer/vendor/fxp/composer-asset-plugin/Config/ConfigBuilder.php:111
Stack trace:
#0 /home/manu/.config/composer/vendor/fxp/composer-asset-plugin/Config/ConfigBuilder.php(74): Fxp\Composer\AssetPlugin\Config\ConfigBuilder::getConfigBase(Object(Composer\Composer), Object(Composer\IO\ConsoleIO))
#1 /home/manu/.config/composer/vendor/fxp/composer-asset-plugin/FxpAssetPlugin.php(82): Fxp\Composer\AssetPlugin\Config\ConfigBuilder::build(Object(Composer\Composer), Object(Composer\IO\ConsoleIO))
#2 /usr/share/php/Composer/Plugin/PluginManager.php(215): Fxp\Composer\AssetPlugin\FxpAssetPlugin->activate(Object(Composer\Composer), Object(Composer\IO\ConsoleIO))
#3 /usr/share/php/Composer/Plugin/PluginManager.php(188): Composer\Plugin\PluginManager->addPlugin(Object(Fxp\Composer\AssetPlugin\FxpAssetPlugin))
#4 /usr/share/php/Composer/Plugin/PluginManager.php(240): Composer\Plugin\PluginManager->registerPackage(Obje in /home/manu/.config/composer/vendor/fxp/composer-asset-plugin/Config/ConfigBuilder.php on line 111

Si vous l’avez déjà installée, supprimez la avec

sudo apt-get remove composer

ensuite, tapez la commande suivante dans un terminal:

curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/bin --filename=composer

Et ça fonctionne

Freecad: erreurs et non fonctionnement

Si vous avez des problèmes avec freecad (astuce: lancez freecad dans une console pour voir les erreurs), il peut s’agir d’un problème de locales.

Traceback (most recent call last):
File "<string>", line 1, in <module>
<type 'exceptions.TypeError'>: Either three floats, tuple or Vector expected

La solution consiste à créer un fichier qui va exporter la lang qui va bien à freecad avant de le lancer.

Créez le fichier /usr/local/bin/freecad.sh avec le contenu suivant:


#!/bin/bash
export LC_ALL=C
freecad $1 $2 $3 $4 $5

rendez le exécutable par sudo chmox +x /usr/local/bin/freecad.sh

Modifiez le lanceur de freecad (/usr/share/applications.freecad.desktop) de la manière suivante:

[Desktop Entry]
Version=1.0
Name=FreeCAD
Name[de]=FreeCAD
Comment=Feature based Parametric Modeler
Comment[de]=Feature-basierter parametrischer Modellierer
GenericName=CAD Application
GenericName[de]=CAD-Anwendung
Exec=/usr/local/bin/freecad.sh %F
Path=/usr/lib/freecad
Terminal=false
Type=Application
Icon=freecad
Categories=Graphics;Science;Engineering
StartupNotify=true
GenericName[de_DE]=Feature-basierter parametrischer Modellierer
Comment[de_DE]=Feature-basierter parametrischer Modellierer
MimeType=application/x-extension-fcstd

Notez la modification de la ligne 9.

C’est tout. Quand vous lancez freecad, cela devrait désormais fonctionner.

Plus d’infos: https://www.freecadweb.org/tracker/view.php?id=2891

Python: obtenir le nom et des infos sur la fonction appelante

Pour débugguer, il est parfois utile de savoir qui fait appel à quoi, et avec quels arguments. C’est le rôle du module inspect.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import inspect

def foo(val):
val = val + 1
print "%s: Fonction '%s' appelée par '%s' à la ligne %s" % (inspect.stack()[0][1], inspect.stack()[1][4][0].strip(), inspect.stack()[2][4][0].strip(), inspect.stack()[1][2] )
#print inspect.stack()

def essai(val):
foo(val)

def main():
essai(7)

if __name__ == '__main__':
main()


et le résultat

test_inspect.py: Fonction 'foo(val)' appelée par 'essai(7)' à la ligne 12

Je le met ici pour le jour où j’en aurai encore besoin

rsync par Cron: permission denied

J’ai été confronté à un étrange problème sur certaines machines en Ubuntu 12.04 (precise) pour lequel je vous livre ma solution de contournement. Ce n’est pas transcendant, mais ça fonctionne en attendant d’en savoir plus ou de trouver une autre solution.An_rsync_Primer

S.O.S.s.h.

J’ai des dossiers que je synchronise avec ou depuis un serveur distant en utilisant rsync, principalement pour faire des sauvegardes. Ces commandes rsync sont intégrées dans des scripts que j’utilise depuis plusieurs années sans problème. Pour pouvoir éviter les problèmes de droits, ces scripts sont lancés par le cron du root.
La commande qui nous intéresse est de cette forme:
rsync -avP dossier/local manu@serveur:/dossier/distant/ > /tmp/monlog.log 2>&1

Et le root peut se connecter au serveur sans mot de passe par échange de clef ssh.

Or, depuis quelques temps, impossible de faire la sauvegarde. Les logs contiennent quelque chose comme ceci:

Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]

Alors que lorsque le programme est lancé en root depuis un terminal, il fonctionne sans erreur! (Donc pas de problème de droits d’accès aux dossiers/fichiers)

Environnement variable ou Variables d’environnement

Le cron n’ouvre pas un véritable shell lorsqu’il lance une action programmée, et les variables d’environnement utilisées dans une console ne sont pas toutes présentes. C’est peut être l’une des raisons du problème.

Sur certains forums, on a parlé de SSH_AUTH_SOCK et de SSH_AGENT_PID, mais je n’ai pas réussi à les faire prendre en compte pour résoudre le problème…

Où est la clef?

Qu’importe, indiquons à ssh qu’on veut utiliser la clef qui nous permet de s’identifier sur le serveur

rsync -avP -e "ssh -l root -i /root/.ssh/id_rsa" dossier/local manu@serveur:/dossier/distant/ > /tmp/monlog.log 2>&1

Et? Pas mieux, toujours rejeté par le serveur…

Qui me parle ?

Comme les logs du serveur n’indiquaient pas d’informations utiles, il faut demander à rsync d’être plus bavard

rsync -avvvv -e "ssh -l root -i /root/.ssh/id_rsa" dossier/local manu@serveur:/dossier/distant/  > /tmp/monlog.log 2>&1

Du coup, ça donne quelques indications dans le log:

opening connection using: ssh -l root -i /root/.ssh/id_rsa -l manu serveur rsync --server -vvvvue.Lsf . /dossier/distant/
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).

Ahhhh! Pourquoi il me met un -l manu alors que je lui ai spécifié -l root ?
Eh bien je ne sais pas, mais c’est la source du problème: identifié en tant que manu, il ne peut donc plus accéder à la clef ssh du root.

Comme je suis vicieux et mauvais perdant, j’ai essayé d’accéder à la clef de manu:

rsync -avvvv -e "ssh -l root -i /home/manu/.ssh/id_rsa" dossier/local manu@serveur:/dossier/distant/  > /tmp/monlog.log 2>&1

Et ça marche! Parce que le root peut entrer partout et lire les clefs de tous les utilisateurs (et surtout parce que manu aussi peut s’identifier en ssh sur le serveur sans mot de passe)

Et les droits d’accès aux dossiers ? Pas de problème, c’est toujours root (par l’intermédiaire du cron) qui lit les fichiers, mais il n’utilise pas sa propre clef et se fait passer pour manu dans le rsync.

Carpe diem

Pour résumer:

  • Plein de personnes ont rencontré le même problème, mais aucune solution proposée n’a fonctionné pour moi
  • Tout se passe comme si rsync refusait d’utiliser la clef du root
  • On peut utiliser la clef de n’import quel utilisateur, tant qu’il peut accéder au serveur. Au besoin, créer un utilisateur dédié.
  • C’est pénible, il faut que je modifie mes scripts qui me permettaient d’unifier la méthodologie
  • Bug ou pas bug ? Je ne sais pas.
  • Résolu? Je ne suis pas sûr. J’aimerai comprendre pourquoi sur certaines installations ça fonctionne, et pas sur d’autres, d’autant que j’essaye d’avoir des configurations logicielles le plus identiques possibles pour en simplifier la gestion.

En tous cas, si vous avez des infos sur ce changement de comportement, ou sur le moyen de fonctionner à l’ancienne mode, n’hésitez pas à laisser une bafouille.

Superviser vos serveurs avec FTPupinfo

Il est toujours pratique d’avoir un oeuil sur les ordinateurs dont on a la charge. Ne serait-ce que pour prévenir avant de guérir. Quand je dis serveurs, c’est tout type de machine linux.

Or, s’il faut se connecter à chacun pour avoir des infos, cela devient vite pénible.

Il existe une pléthore de logiciels dédiés à cet usage. Des simples, comme phpsysinfo, et des poids lourds comme Nagios, zabbix, …

Les logiciels simples peuvent correspondre à un besoin ponctuel, mais manquent souvent des éléments dont on aurait besoin spécifiquement. Les poids lourds du genre sont cauchemardesques à configurer, et c’est souvent sortir le bazooka pour tuer une mouche… Sans compter les failles de sécurités régulières.

J’ai développé un logiciel nommé FTPupinfo destiné, à la base, à mon usage personnel, pour superviser mes serveurs. Puis il a évolué avec le temps pour devenir une application à part entière, située entre les deux catégories dont on a parlé.

Voici un rapide aperçu:

Capture 1

Avantages:

  • Facile à installer (paquet dans les dépôts absolacom)
  • C’est le client qui uploade vers le serveur, pas le serveur qui interroge le client (pas d’ouverture de ports, pas de faille). Pas besoin de se connecter à la machine à surveiller (pas d’ouverture de ports, pas de faille).
  • Paramétrable avec un simple fichier de configuration texte
  • Upload sur le serveur en mode FTP ou rsync (si upload activé, non obligatoire)
  • Copie en local possible des rapports générés
  • Rapide et léger
  • Possibilité d’activer/désactiver chacune des fonctions
  • Personnalisable par skins (que vous pouvez créer/ajouter)
  • Ajout de modules possibles (par exemple pour prendre en charge SNMP)
  • Pensé pour être sécuritaire
  • Possibilité d’exécuter des programmes avant, pendant, après le fonctionnement du logiciel (alertes par mail, nettoyages, …)
  • Possibilité de garder le dernier rapport, un par jour, tous…
  • Le dernier rapport est accessible même si le serveur ne l’est pas
  • Fonctionne sur Debian (et dérivées), Mandriva, Suse (depuis les sources)

Inconvénients:

  • Ne fonctionne pas encore pour Windows (et ce n’est pas une priorité). Fonctionne au strict minimum avec Cygwin avec une version modifiée du programme (contactez moi si vous êtes intéressé).
  • Visualisation en mode décalé. Pas de consultation en direct (le programme est lancé avec une granularité d’une minute).
  • Sans doute Certainement améliorable au niveau du code
  • Disponible uniquement en deb ou en source (si vous voulez packager pour votre distrib, soit vous vous en chargez, soit vous me dites comment faire)
  • Les skins sont moches (si,si. Je sais. Je ne suis pas graphiste, je le reconnais), mais c’est du full CSS (sauf scories) facilement modifiable.¹
  • En anglais pour l’instant (même si c’est peu gênant, le vocabulaire informatique utilisé étant souvent anglais). L’adaptation pour permettre la localisation est en projet.
  • …heu…
Page de statistiques

Page de statistiques

Toutes les infos se trouvent sur le site du projet et vous pouvez voir des exemples sur le site de démo.

Dernière précision, c’est entièrement du GPL gratuit pour la partie cliente (le programme qui tourne sur les ordinateurs). Seule la partie serveur de supervision (optionnelle) est payante.

Il est actuellement utilisé professionnellement par ma société pour superviser les clients, quelques sociétés partenaires et les écoles du département des Pyrénées Orientales équipées de serveurs Eclair (dont j’ai été le développeur initial pour le pôle de compétences de Perpignan) ou Zeli.

Les suggestions, remarques, rapports de bugs sont les bienvenus.

1. message subliminal très subtil 😉 : si vous savez fairedes skins potables, envoyez les moi et je les intègrerais au programme avec vos crédits.

Recevoir les logs par mail

Il peut être intéressant de recevoir les logs de vos ordinateurs par mail pour plusieurs raisons:

  • pour penser à les regarder,
  • pour recevoir les logs de vos serveurs,
  • pour garder un historique des logs et pouvoir remonter dans le temps,
  • générer des statistiques à partir des logs sans se connecter aux serveurs (ce qui est utilisé par exemple pour générer la liste des identifiants déconseillés)

Pour cela, je vous propose d’installer un utilitaire en python développé par mes soins.

ATTENTION: ce programme fonctionne pour Hardy et Jaunty. Il n’a pas été développé ou testé sur Karmic mais sera disponible pour toutes les version X.04 d’Ubuntu.

ATTENTION2: ce programme ne peut fonctionner simplement avec Orange. Pour ce FAI, il faut installer postfix et le paramétrer avec l’authentification sasl. Cela fera l’objet d’un prochain article. Pas de problème chez Free, Alice et SFR.

Zeli-sendlog

zeli-sendlog est un programme python qui va créer une archive des logs de l’ordinateur sur lequel il est installé et va automatiquement l’envoyer par mail aux adresses paramétrées.

Une fois installé, ce programme ne nécessite aucun réglage.

Installation

Il vous faut tout d’abord ajouter les miroirs Absolacom à votre fichier de sources tel qu’indiqué sur cette page. Rechargez la liste des paquets et installez le paquet zeli-sendlog et ses dépendances.

Paramétrage

Pour envoyer un mail, il vous faut trois choses:

  1. un serveur SMTP,
  2. une ou plusieurs adresses de destination,
  3. un nom pleinement qualifié afin que vos mails soient acceptés sans être considérés comme du spam.

Serveur SMTP

Il se règle dans le fichier /etc/smtp_server. Vous indiquez simplement le nom ou l’adresse de votre serveur SMTP. Par exemple, pour free, indiquez simplement smtp.free.fr.

Adresses de destination

Les adresses où seront envoyés les mails s’indiquent dans le fichier /etc/mail_secu.txt. Indiquez sur une ligne les adresses séparées par des virgules.

Si vous n’indiquez qu’une seule adresse, inutile d’ajouter une virgule.

Nom FQDN

Votre machine ne peut envoyer des mails que vers un serveur qui l’autorise. Pour cela, il faut qu’elle soit identifiée, et c’est son nom d’expéditeur qui est utilisé.

Si vous possédez un nom de domaine, éditez le fichier /etc/mailname et indiquez le nom de votre ordinateur ainsi: machine.mondomaine.org.

Identifiez correctement votre ordinateur, ce nom apparaît dans les courriers qui vous sont envoyés et vous permettront de vous y retrouver si vous recevez les logs de plusieurs serveurs.

Lancement en console

Vous pouvez lancer manuellement le programme pour envoyer les logs immédiatement ou pour vérifier son fonctionnement. En cas de problème, celui ci vous est affiché (en anglais) et vous permettra de rechercher une solution.

Dans un terminal, entrez: sudo sendlog

(le programme doit être lancé en root pour pouvoir accéder aux fichiers de log)

Programmation

A l’installation, le programme a paramétré le cron de root afin de lancer l’envoi de mail tous les jours à minuit. Pas avant, sinon il vous manquerait du contenu dans les logs du jour, pas après, sinon ce serait les logs du lendemain.

Faites quelques essais, mais n’envoyez pas beaucoup de mails en peu de temps, cela risquerait de vous faire mettre en quarantaine par votre FAI.

Une fois le logiciel paramétré, il n’y a plus à y toucher.

Servez vous, c’est GPL!

Installer un serveur LAMP avec Ubuntu

Un serveur LAMP signifie Linux Apache Mysql Php. Il est possible d’installer et configurer chacun des services manuellement, mais il existe une autre façon plus simple et moins connue de faire tout ceci en une seule fois.

Dans un terminal, entrez ceci:

sudo tasksel install lamp-server

Et c’est tout!

Ou alors:

sudo tasksel

tasksel

Et sélectionnez LAMP server, ou tout autre service que vous désirez installer.

Modifier un fichier PPD

Il est parfois nécessaire de pouvoir modifier un driver d’imprimante pour ajuster son comportement. Ayant eu à le faire récemment, je vous livre mes observations pour vous éviter mes galères:

  • Le fichier utilisé pour contrôler l’imprimante se trouve dans /etc/cups/ppd
  • Il porte le nom que vous avez donné à l’imprimante lors de son installation (exemple: copieur.ppd si vous avez nommé votre imprimante copieur)
  • Lors de l’installation, ou en passant par le gestionnaire des imprimante (Système /Administration/ Impression ou system-config-printer), les options sélectionnées (bacs, format, couleur/gris, …) sont directement écrites dans le fichier ppd de l’imprimante
  • Après modification manuelle du fichier ppd, vous devez redémarrer cups (/etc/init.d/cupsys restart)
  • En cas d’erreur de syntaxe dans le fichier ppd, l’onglet correspondant à la section n’apparaît plus dans les options lors de l’impression
  • Si la commande est trop longue pour tenir sur une seule ligne, le reste de la commande est sur la ligne suivante, et la ligne suivante doit comporter *End pour clore la commande.
  • exemple:
    *OpenUI *Fold/Pliage: PickOne
    *OrderDependency: 3 AnySetup *Fold
    *DefaultFold: None
    *Fold None/Non:  "&lt;&lt; /FoldType (Off) &gt;&gt; /KMOptions /ProcSet findresource /setKMoptions get exec"
    *Fold Stitch/Pliage et Agrafage centre:  "&lt;&lt; /Collate true &gt;&gt; setpagedevice
     &lt;&lt; /FoldType (CenterFoldIn) /StitchType true &gt;&gt; /KMOptions /ProcSet findresource /setKMoptions get exec"
    *End
    *Fold HalfFold/Pliage en deux:  "&lt;&lt; /Collate true &gt;&gt; setpagedevice
     &lt;&lt; /FoldType (CenterFoldIn) /StitchType false &gt;&gt; /KMOptions /ProcSet findresource /setKMoptions get exec"
    *End
    *Fold Stapling/Agrafage au milieu:  "&lt;&lt; /Collate true &gt;&gt; setpagedevice
     &lt;&lt; /Finish 1 &gt;&gt; /KMOptions /ProcSet findresource /setKMoptions get exec"
    *End
    *CloseUI: *Fold
  • Pour commenter une ligne, elle doit commencer par *%. Pour commenter une commande sur 2 lignes,  supprimer le saut de ligne et commenter la ligne.
  • Faire attention au codage du fichier (en particulier pour les accents dans les labels). Un mauvais codage et le ppd ne fonctionne plus! Il est normalement (si le ppd est bien écrit) déclaré en haut de fichier:*LanguageVersion: French et *LanguageEncoding: ISOLatin1
  • Toujours avoir une copie du ppd avant de le modifier. En cas d’erreur, il est parfois plus facile de tout recommencer au lieu de chercher quel caractère pose problème.
  • Éditez le code en root avec un éditeur de textes. Après enregistrement de vos modification, vous pourrez tester immédiatement un lancement d’impression pour aller vérifier les options que vous avez modifié.
  • Avancez étape par étape. En cas de problème, vous saurez que cela vient de votre dernière modification.

Grâce à cela, j’ai supprimé (mis en commentaire) les options qui apparaissaient dans les onglet lors de l’impression et qui perturbaient mes utilisateurs. J’ai aussi changé des labels pour les rendre plus explicites (1 face -> Recto, 2 Faces -> Recto Verso).

Une fois le ppd modifié et paramétré avec les options voulues par défaut, il suffit de le copier dans le dossier /etc/cups/ppd de chaque ordinateur en ayant besoin sous le nom de l’imprimante paramétrée et de relancer cups.

Utilisation de Bazaar

Bazaar est un gestionnaire de version. L’un de ses avantages est qu’il permet d’utiliser les protocoles ssh ou ftp, ce qui signifie qu’il n’est pas nécessaire de monter un « serveur » bazaar pour l’utiliser; il suffit d’un serveur où vous pouvez vous connecter en ssh.

Classement des dossiers

L’organisation des dossiers est laissée à votre goût, mais pour simplifier les explications, voici l’organisation que nous allons adopter sur le serveur:

  • Un dossier à la racine nommé bzr qui contiendra les divers projets à versionner
  • Un dossier par projet dans le dossier /bzr (projet1 et projet2 )
  • Les droits en lecture/écriture pour les membres du groupe projets sur le dossier /bzr (récursivement)
addgroup projets              # ajout d'un groupe projets
adduser manu projets        # ajout de l'utilisateur au groupe projets
mkdir -p /bzr/projet1         # création du dossier du premier projet
mkdir -p /bzr/projet2         # création du dossier du deuxième projet
chgrp -R projets /bzr         # attribution du groupe projet à tous les fichiers du répertoire /bzr
chmod -R g+rw /bzr          # attribution des droits en lecture/écriture à tous les fichiers pour les membres du groupe projets

Il n’est pas nécessaire d’installer bazaar sur le serveur, mais il est nécessaire que l’accès par ssh fonctionne, avec ou sans mot de passe.

Sur les clients

Mise en place du projet sur le serveur

Ce sont les clients (qui vont modifier le code des projets) qui doivent installer le logiciel bazaar

apt-get install bzr python-paramiko

Les préférences de bazaar (limitées) se trouvent dans Système/Préférences/Bazaar preferences

Ce sont eux, aussi, qui vont initier le versionning, à l’endroit qui leur va bien:

mkdir ~/projets
mv ~/Bureau/monprojet ~/projets # déplacement des fichiers du prototype dans les projets
cd ~/projets/monprojet
bzr init                        # initialisation du versionning du projet
bzr add *                    # ajout de tous les fichiers (récursif) au versionning
bzr commit -m "Création" # prise en compte des modifications avec le commentaire "Création"
bzr push sftp://manu@server/bzr/projet1 --use-existing-dir # envoi de la version du projet sur le serveur en utilisant les répertoires créés plus haut.

Récupération des fichiers sur un autre client

mkdir ~/beauprojet     # création du dossier qui va accueillir le projet
cd ~/beauprojet
bzr init                     # initialisation du dossier au versionning
bzr merge sftp://toto@server/bzr/projet1/  # intégration des fichiers de "monprojet" dans le dossier "beauprojet" dans lequel on se trouve

Chacun des clients possède maintenant les fichiers sur lesquels effectuer les développements

Codage!

Les clients vont effectuer les modifications sur les documents. Après chaque modification (enfin, chaque fin de bloc de modification) ou avant l’envoi des fichiers modifiés, il faudra effectuer la commande suivante (qu’ils aient décidé ou non d’envoyer les fichiers sur le serveur. Les commit peuvent être fait hors connexion.):

bzr commit -m "message"

qui permet de prendre en compte les modifications effectuées dans le versionning et, accessoirement, de revenir à une version antérieure.

Il suffit ensuite « d’assembler » les fichiers modifiés avec ceux du serveur, que ceux ci aient été modifiés ou non par une autre personne:

bzr merge sftp://toto@server/bzr/projet1/

Enfin, les fichiers « finaux » sont envoyés sur le serveur afin d’être disponibles pour tous les développeurs:

bzr push sftp://toto@server/bzr/projet1/

A retenir

  • Il ne suffit pas d’ajouter un fichier/dossier au répertoire du projet pour qu’il soit pris en compte. Il faut le faire manuellement avec bzr add lefichier
  • Pour supprimer un fichier, il faut utiliser bzr remove lefichier
  • la commande bzr status permet de savoir l’état des fichier (plus exactement, du versionning)
  • La commande bzr log permet de voir le log des changements avec les commentaires
  • la commande bzr conflicts affiche les versions de fichiers en conflits
  • La commande bzr resolve lefichier permet de résoudre les conflits dans le fichier lefichier
  • Le manuel de bzr donne plein d’informations et de commandes utilisables

Interface graphique

Il existe une interface graphique pour bazaar nommée olive (paquet bzr-gtk) que je n’ai pas réussi à utiliser: impossible de comprendre les messages d’erreur (pas parlant) et pas trouvé de configuration à effectuer (ni dans le programme, ni dans les fichiers de configuration).

Pas grave, je suis un adepte de la ligne de commande.

Autres sources:

http://bazaar-vcs.org/fr/IntroductionABzr

Identification SSH sans mot de passe

Pour utiliser SSH (et dérivés tels que sftp) sans mot de passe, il faut ajouter votre clef sur le serveur. Nous aurons donc un ordinateur (manu-desktop) qui pourra se connecter à un serveur (server) par ssh sans avoir besoin de spécifier de mot de passe.

Notez qu’il existe des outils graphiques pour réaliser ces opérations (par exemple seahorse sous Gnome), mais je n’en parlerais pas.

Sur l’ordinateur client (manu-desktop)

La première chose à faire, si vous n’avez pas de clef pour votre machine, est d’en générer une

manu@manu-desktop:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/manu/.ssh/id_rsa):
Created directory '/home/manu/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/manu/.ssh/id_rsa.
Your public key has been saved in /home/manu/.ssh/id_rsa.pub.
The key fingerprint is:
cd:9e:bb:0a:1e:22:29:fa:e3:dc:12:72:8a:15:13:58 manu@manu-desktop
manu@manu-desktop:~$ ls -l ~/.ssh
total 8,0K
3367418 -rw------- 1 manu manu 1,7K 2009-01-15 13:26 id_rsa
3367419 -rw-r--r-- 1 manu manu  399 2009-01-15 13:26 id_rsa.pub
manu@manu-desktop:~$

Ne mettez pas de passphrase et laisser les options par défaut pour la création de la clef. Il est aussi possible de spécifier les options via la ligne de commande:

ssh-keygen -qt rsa -b 1024 -C manu -f ~/.ssh/manu@manu-desktop.rsa -N ""

La commande précédente crée une clef rsa (-t) avec le commentaire (-C) manu d’une longueur de 1024 bits (-b) dans le fichier ~/.ssh/manu@manu-desktop.rsa (-f) avec une passphrase (-N) vide.

Sur le serveur (server)

Le compte utilisateur de connexion doit exister. Il n’est pas obligé que ce soit le même identifiant que sur le client. Par exemple, sur le serveur, mon compte est nommé zephir.

[root@server]:# adduser zephir
Ajout de l'utilisateur « zephir »...
Ajout du nouveau groupe « zephir » (1002)...
Ajout du nouvel utilisateur « zephir » (1002) avec le groupe « zephir »...
Création du répertoire personnel « /home/zephir »...
Copie des fichiers depuis « /etc/skel »...
Entrez le nouveau mot de passe UNIX :
Retapez le nouveau mot de passe UNIX :
passwd : le mot de passe a été mis à jour avec succès
Modification des informations relatives à l'utilisateur zephir
Entrez la nouvelle valeur ou « Entrée » pour conserver la valeur proposée
Nom complet []:
N° de bureau []:
Téléphone professionnel []:
Téléphone personnel []:
Autre []:
Ces informations sont-elles correctes ? [o/N] o
[root@server]:#

Sur l’ordinateur client (manu-desktop), fin des opérations

Il ne reste plus au client qu’à envoyer sa clef d’identification au serveur simplement par la commande suivante:

ssh-copy-id -i ~/.ssh/id_rsa.pub zephir@server

Acceptez l’identification du serveur, le mot de passe est demandé (puisque vous n’avez pas encore envoyé la clef) et la clef est copiée dans le fichier /home/zephir/.ssh/authorized_keys.
Tentez la commande suivante (Ctrl+D pour sortir)

ssh zephir@server

Vous ne devriez plus avoir de demande de mot de passe.

Sur le serveur, fin des opérations

Il est possible de sécuriser le serveur afin de n’accepter que les authentifications avec clef et sans demande de mot de passe (pour ssh. L’accès en local demandera toujours un mot de passe).
Ainsi, les tentatives d’attaque par force brute sont vouées à l’échec. MAIS, soyez conscient que vous ne pourrez plus vous connecter depuis une autre machine que celle pour laquelle vous avez envoyé la clef, pas plus que vous ne pourrez envoyer d’autres clefs.
Paramétrez le fichier /etc/ssh/sshd_config tel que ci dessous:

# Authentication:
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
 
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys
 
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

Relancez ensuite le serveur ssh pour prendre en compte les modifications.

Note sur la sécurité

L’accès au serveur est possible sans authentification par l’utilisateur manu depuis l’ordinateur client (manu-desktop). Si cet ordinateur est un portable et qu’il se fait voler, celui qui arrivera à se connecter avec l’identité de manu arrivera sans demande de mot de passe à se connecter au serveur !
Réfléchissez bien à l’utilisation de ce mode de fonctionnement avant de le mettre en place.
En cas de vol, il suffira de supprimer le fichier /home/zephir/.ssh/authorized_keys pour que la clef volée avec le portable ne soit plus opérationnelle.
Vous pouvez, de même, recréer et changer vos clefs d’identification lorsque vous le voulez en réutilisant les commandes données en début d’article.

Liens:

http://doc.ubuntu-fr.org/gnupg
http://doc.ubuntu-fr.org/ssh

Créer (compiler et packager) ses programmes en paquet .deb pour ubuntu ou debian

Le programme Debdevel permet de créer facilement et rapidement des paquet deb pouvant être installés sur Ubuntu, mais aussi toutes les dérivées de debian utilisant le gestionnaire de paquets apt (knoppix, mepis, …), à partir de vos propres programmes ou à partir de sources d’autres programmes.

Vous pourrez packager vos programmes, quel que soit le language de programmation (python, bash, C, …), voire même des documentations, fiches techniques, fichiers texte, … (bien que l’intérêt en soit limité, ça reste possible).

Mais ce logiciel (cette suite de logiciels, en fait), va plus loin, puisqu’elle vous permet aussi de:

  • Générer automatiquement des squelettes de documentation qu’il ne reste plus qu’à remplir (il est possible de rajouter vos propres modèles de documentation, au format voulu),
  • Créer un dépôt personnel en local,
  • Gérer un dépôt public (local ou distant),
  • Gérer trois niveaux de développement (dev, beta et stable),
  • Publier seulement l’un ou plusieurs niveaux de développement, et garder les autres privés,
  • Gérer autant de paquets que désiré, dans chacun des niveaux de développement,
  • Gérer autant de dépôts que désiré,
  • Tout faire graphiquement, sans ligne de commande ,
  • Tout fonctionne avec le clic droit de nautilus (bientôt konqueror et dolphin pour les utilisateurs de KDE, mais les logiciels fonctionnent cependant en ligne de commande avec KDE) ,
  • Trouver facilement une dépendance dans l’ensemble de vos paquets,
  • Trouver facilement et rapidement un terme ou du code dans l’ensemble des scripts de vos paquets,
  • Et d’autres choses en cours de développement.

Menu du clic droit

Bref, il faut 3 minutes sans connaissance particulière pour créer un dépôt, 3 minutes pour créer un paquet et y installer votre programme, 1 minute pour en faire un paquet deb et une minute pour le rendre public et accessible à vos utilisateurs par leur gestionnaire de paquet (apt-get, aptitude ou synaptic) qui les avertira automatiquement lorsqu’une mise à jour sera disponible. Et la mise à jour d’un paquet (en dehors du temps de correction de votre programme) prend moins d’une minute.

De quoi développer rapidement et facilement, sans se préoccuper de gérer les versions ou craindre de mélanger les programmes de dev avec les versions publiques, et éviter de passer du temps à se demander comment créer un paquet deb pour les publier!

Précisons quand même que ce programme ne développera pas de programmes à votre place mais vous simplifiera le packaging et la distribution de ceux ci.

La documentation est accessible ici . Elle vous indique toutes les procédures, du téléchargement à l’utilisation.

Envoyer un mail avec pièces jointes en python

Envoyer un mail avec pièces jointes avec python est simple en utilisant le code ci dessous.


import smtplib

import os
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encodersdef send_mail(send_from, send_to, subject, text, files=[], server="localhost"):

assert type(send_to)==list
assert type(files)==list
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = COMMASPACE.join(send_to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach( MIMEText(text) )

for f in files:
part = MIMEBase('application', "octet-stream")
print f
part.set_payload( open(f,"rb").read())
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))

msg.attach(part)

smtp = smtplib.SMTP(server)
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.close()

retour = "Une erreur s'est produite lors de l'envoi de mail"
files = [ 'monfichier1.zip', '/tmp/le_fichier.pdf' ] # les pièces jointes avec leur chemin
destinataires = [ 'moi@monsite.com', 'moncopain@chez.lui' ]

try:
send_mail('expediteur@monsite.com', destinataires , "Sujet du mail", "Texte du message",files , 'smtp.free.fr')
except:
send_mail('expediteur@monsite.com', [ 'adresse@secours.fr'] , " [ERROR ] Sujet du message", retour ,[] , 'smtp.free.fr')

C’est tout!

Ah, si!

  • N’utilisez pas ceci à tout va: il est facile de se faire blacklister avec l’étiquette « spammeur ». Et il est très difficile de se faire dé-blacklister.
  • Attention à la taille des pièces jointes. Si vous dépassez la taille limite de votre FAI (30Mo chez free), une erreur bloque le script avec un message du type:  smtplib.SMTPSenderRefused: (552, ‘Message size exceeds fixed limit’, ‘expediteur@monsite.com’)

Répondre une seule fois aux questions d’installation des paquets

Lorsque vous avez à installer plusieurs machines identiquement, vous allez répondre à chaque fois aux questions d’installation de tous les paquets.

Quand on a configuré une machine, il est possible de transférer toutes les réponses d’installations.

Installez debconf-utils sur tous les ordinateurs.

Sur la machine installée:

debconf-get-selections > /tmp/reponses.txt

Copiez le fichier reponses.txt sur un support ou par le réseau sur la machine à installer.

Sur la machine à installer:

debconf-set-selections -c  /media/reponses.txt # option -c pour tester le fichier

debconf-set-selections   /media/reponses.txt # installation des réponses dans la base de debconf /var/cache/debconf/config.dat

C’est utile pour les sauvegardes/restaurations rapides, pour installer rapidement plusieurs ordinateurs, pour reparamétrer en ligne de commande un logiciel, …

 Rappel:

Pour sauvegarder la liste des programmes installés: dpkg –get-selections > /tmp/listprog.txt

Pour installer l’ensemble des logiciels sur la seconde machine: dpkg –set-selections < /media/listprog.txt