Archives pour la catégorie Tutoriel

Motion sous linux

Le logiciel motion sous GNU/Linux est un démon qui permet de faire des captures vidéo sur du long terme à partir d’une webcam.

Voici quelques fonctions sympas :

  • Créer une vidéo accéléré du ciel, d’une plante ou d’un escargot en accéléré
  • Capturer et envoyer sur un FTP l’image d’une webcam à intervalle régulière
  • Enregistrer les séquences de mouvement devant une webcam
  • Se connecter à motion via le web pour contrôler ou visualiser sa webcam
  • Avoir 8 webcams (ou plus) qui captent en même temps sur la même machine
  • Traquer et suivre avec une webcam motorisée les mouvements
  • Enregistrer les événements dans une base de données

Je vais vous préciser ici les options de base pour permettre les 3 fonctions ci dessous (Je pars de la config du paquet de Debian Squeeze) :

  1. Créer une image toute les 10s
  2. Créer un film d’une semaine de capture avec 1 minute capturée = 1 frame donc 1 journée capturée = 1 minutes de vidéo environ.
  3. Créer autant de séquences vidéo à 5 FPS que de détections de mouvement avec une image associée
# Pour le point 3 : On définit le framerate à 5FPS
framerate 5
# Je fixe la sensibilité à 1000 pixel pour la captation de mouvement
threshold 1000
# Je capture 3 frames de buffer avant une captation de mouvement
pre_capture 3
# Je clos les captation de mouvement 5 secondes si plus rien de bouge devant la webcam
gap 5
# Je décide d'avoir une image qui correspond aux premiers instant de detection de mouvement
output_normal first

# Point 2 : Je capture une frame toute les 60 secondes pour la vidéo en accélérée
ffmpeg_timelapse 60
# Je fait réinitialiser le film accéléré tout les lundi
ffmpeg_timelapse_mode weekly-monday
# Je fixe la qualité des vidéo à 15/31 (2 étant le plus fort)
ffmpeg_variable_bitrate 15
# Je définis la compression en mpeg4
ffmpeg_video_codec mpeg4

# Pour le point 1 : Je définis 1 capture image toutes les 10 secondes
snapshot_interval 10

Tags: , , ,

Un lecteur de musique autonome

Je suis sûr que vous connaissez déjà beaucoup de lecteur audio sous GNU/Linux, celui que je vous propose est séparé en 2, MPD :

  • Un backend qui lit la musique sans qu’il soit nécéssaire d’avoir une interface graphique lancée
  • Un ou des frontend pour controler votre musique, l’intéret est qu’il peut etre déporté sur une autre machine, que ce soit un pc ou même un téléphone.

Le daemon en backend s’appelle mpd, la première fois, il vous faut indiquer où se trouve vos MP3, ainsi que l’interface audio de sortie (pouvant être alsa, oss, jack… sur le device que vous voulez). Voici les lignes modifiées de mon fichier /etc/mpd.conf qui peuvent vous être utiles :

music_directory « /media/mp3/ »
password « motdepasse@read,add,control,admin »
default_permissions « read »
audio_output {
type « alsa »
name « My ALSA Device »
device « hw:0,0″ # optional
format « 44100:16:2″ # optional
}
mixer_type « software »

J’ai ici choisis d’utiliser une connexion par mot de passe pour controler mpd.

Pour le frontend qui va nous servir à controler notre mpd, nous avons une multitude de choix, cela va du client en ncurses (dans un terminal comme ntop), à l’application sur téléphone portable en passant par de multiples clients graphiques ou plugins pour lecteurs répputés.

J’ai choisis sonata sous GTK, a vous de jouer !

Tags:

Bridgez votre vpn avec votre reseau domestique

Bridger des interfaces réseau a l’interet de simuler une connexion directe ou se comportant comme un hub, tout en ayant la possibilité de filtrer les packets.

Ici je vous explique la mise en place d’un bridge tel qu’il puisse fonctionner.

Le serveur possede 4 interfaces réseau :

eth0 : Connexion indépendante non filtrée permettant l’administration du serveur 192.168.99.0/24

eth1 et eth2 : Connexion bridgées (mode promiscus).

eth3 : Connexion cliente dhcp prévue pour une connexion filtrante du serveur dans un réseau client. (Médiathèque, entreprise)

tap0 : connexion du réseau privé virtuel

br0 : Connexion du bridge rassenmblant eth1, eth2, et tap0

Un bridge d’interface se compose en interfaces bridgé et en une interface bridge (br0) rassemblant ces derniers. Les interfaces bridgées doivent être sans ip et en mode promiscus. Nous précisons tout les paramètre réseau à l’interface br0.

Modifions la configuration d’openvpn

sudo nano /etc/openvpn/server.conf

Remplacez dev tun par dev tap0

Remplacez server 10.8.0.0 255.255.255.0
par
server-bridge 192.168.9.128 255.255.255.0 192.168.9.129 192.168.9.254
(où 192.168.9.1 sera l’ip du serveur et 192.168.9.129 192.168.9.254 sera la plage dhcp)

Créez l’interface tap0 et bridgez vos interfaces ainsi (attention ceci provoque une microcoupure réseau) :
sudo openvpn –mktun –dev tap0
sudo ifconfig tap0 up
sudo brctl addbr br0
sudo brctl addif br0 tap0
sudo brctl addif br0 eth1
sudo brctl addif br0 eth2
sudo ifconfig tap0 0.0.0.0 promisc up
sudo ifconfig eth1 0.0.0.0 promisc up
sudo ifconfig eth2 0.0.0.0 promisc up
sudo ifconfig br0 up
sudo ifconfig br0 192.168.9.1

Sur le client, remplacez dev tun par dev tap dans le fichier /etc/openvpn/client.conf

Tags: , , ,

Créer un réseau privé virtuel

Le réseau privé virtuel ou VPN (Virtual Private Network) permet de vous connecter à un réseau par un tunnel crypté. Vous pouvez ainsi vous y connecter depuis une entreprise, depuis chez quelqu’un.

Ses applications et avantages sont nombreuses :
- Avoir une liaison crypté sur un support non crypté (du Wifi ouvert par exemple)
- Se connecter à son réseau domestique depuis n’importe où
- Isoler/sécuriser les communications en interconnectant des postes par VPN

Pour ma part c’est surtout pour les deux premier points. Ce tutoriel s’adresse plus particulièrement aux utilisateurs d’Ubuntu.

Commencons

Sur le client

Installez openvpn et openssh-server
sudo apt-get install openssl openvpn openssh-server
Donnez le droit à l’écriture dans le répertoire de configuration openvpn
sudo chmod o+w /etc/openvpn

La suite se fait sur le serveur

Installez openvpn
sudo apt-get install openssl openvpnNous allons maintenant créer des jeux de certification grace aux outils se trouvant dans /usr/share/doc/openvpn/examples/easy-rsa/
Les clés et certificats générés seront crées dans le sous repertoire keys.
cd /usr/share/doc/openvpn/examples/easy-rsa/

Avant de commencer, nous allons modifier les reglages par defaut utilisés par ces outils.
sudo nano vars
Editez à la fin de ce fichier les paramètres afin qu’ils correpondent aux votres :
export KEY_COUNTRY=FR
export KEY_PROVINCE=NA
export KEY_CITY=Paris
export KEY_ORG= »MonOrganisation »
export KEY_EMAIL= »mon@email.ici »
Enregistrez et fermez.

Executez ce fichier (Notez bien qu’il s’agit d’un point et non de sh en debut de ligne)
. ./vars

Nettoyez les jeux de clés déjà présent (Les clées precements crées seront effacés du repertoire keys)
sudo ./clean-all

Executez la génération du certicat qui autentifira tout les jeux de clés :
sudo ./build-ca
Répondez aux questions par une simple validation de la touche enter

Executez la génération du jeu de clé serveur :
Ici remplacez server par le hostname de votre serveur
sudo ./build-key-server server
Validez les questions par defaut SAUF « Common name » où mettez votre hostname expliqué ci dessus.
Et répondez « y » aux deux dernière questions ( Sign the certificate ? [y/n] requests certified, commit ? [y/n] )

Faites la même chose (mais avec « build-key ») pour chcunes des clés à destination de client (nous nous occuperons de les transferer plus tard)
Ici remplacez client par le hostname de votre client
sudo ./build-key client
Validez les questions par defaut SAUF « Common name » où mettez votre hostname expliqué ci dessus.
Et répondez « y » aux deux dernière questions ( Sign the certificate ? [y/n] requests certified, commit ? [y/n] )
Il n’est pas nécéssaire d’utiliser un mot de passe si vous pensez que la clé (fichier) ne pourrat être compromise.

Executez la génération des paramètres Diffie-Hellman
sudo ./build-dh

Voilà, vos clés et certificats sont prets, nous allons maintenant les placer au bon endroit.

Placement des clés au bons endroits

Restez dans le répertoire /usr/share/doc/openvpn/examples/easy-rsa/Déplacez les clés serveurs (remplacez server par le hostname donné au serveur)
sudo mv keys/server.crt keys/server.key keys/ca.crt keys/ca.key keys/dh1024.pem /etc/openvpn/

Déplacez la clé client
sudo scp keys/ca.crt keys/fanchbox.crt keys/fanchbox.csr keys/fanchbox.key utilisateur@ip-du-client:/etc/openvpn/
sudo rm keys/ca.crt keys/fanchbox.crt keys/fanchbox.csr keys/fanchbox.key

Paramètrage du serveur openvpn

Réutilisons l’exemple proposé par openvpn
cd /etc/openvpn
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
sudo gunzip server.conf.gz

Editez le fichier /etc/openvpn/server.conf
sudo nano server.conf
Modifiez les ligne faisant référence aux fichier clés (remplacez server par le hostname donné au serveur)
cert server.crt
key server.key # This file should be kept secret
Enregistrez et fermez le fichier

Testez en lancant openvpn avec le fichier de configuration :
sudo openvpn /etc/openvpn/server.conf

Si vous avez des erreurs, ceux ci sont généralement assez explicite (file not found…) pour les résoudre facilement.

Thu Jan 31 12:49:34 2008 OpenVPN 2.0.9 i486-pc-linux-gnu [SSL] [LZO] [EPOLL] built on May 21 2007
Thu Jan 31 12:49:34 2008 Diffie-Hellman initialized with 1024 bit key
Thu Jan 31 12:49:34 2008 TLS-Auth MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
Thu Jan 31 12:49:34 2008 TUN/TAP device tun0 opened
Thu Jan 31 12:49:34 2008 ifconfig tun0 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
Thu Jan 31 12:49:35 2008 route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.2
Thu Jan 31 12:49:35 2008 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Thu Jan 31 12:49:35 2008 UDPv4 link local (bound): [undef]:1194
Thu Jan 31 12:49:35 2008 UDPv4 link remote: [undef]
Thu Jan 31 12:49:35 2008 MULTI: multi_init called, r=256 v=256
Thu Jan 31 12:49:35 2008 IFCONFIG POOL: base=10.8.0.4 size=62
Thu Jan 31 12:49:35 2008 IFCONFIG POOL LIST
Thu Jan 31 12:49:35 2008 Initialization Sequence Completed

Votre serveur est maintenant à l’écoute. (tant que vous ne coupez pas le programme).

Pour que cette configuration soit reconnue par le service openvpn (vous savez, le /etc/init.d/openvpn start), éditez le fichier /etc/default/openvpn

sudo nano /etc/default/openvpn

Ajoutez la ligne suivant, enregistrez et fermez.

AUTOSTART= »server »

Openvpn serat alors lancé à chaque démarrage.

Paramètrage d’openvpn sur le client

Resécurisons le répertoire dont nous avons modifié les permission précedement
sudo chmod o-w /etc/openvpn

Réutilisons l’exemple proposé par openvpn
cd /etc/openvpn
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .

Editez le fichier de configuration (celui ci est prévu pour se connecter à un serveur précis)
sudo nano /etc/openvpn/client.conf
Modifiez les lignes suivantes à votre convenance :
#Remplacez server par le hostname du serveur (accessible par le client)
remote server 1194
#Remplacez le nom des fichiers pour utiliser les clés du client
cert fanchbox.crt
key fanchbox.key
Enregistez et fermez.

Il ne vous reste plus qu’a lancer openvpn avec ce fichier de configuration pour vous connecter au serveur par vpn. Cela va vous créer une nouvelle interface avec une ip que vous attribuera le serveur (ici 10.8.0.x).
sudo openvpn /etc/openvpn/client.conf

Ce tutoriel s’inspire en partie des pages openvpn sur toulouse-sans-fil et openvpn sur Ubuntu-fr

Si vous êtes sages je vous expliquerai peut-être comment bridger le vpn avec votre réseau domestique, et comment vous y connecter grâce à gnome-network-manager.

Have fun !

Tags: , , , ,

Redirection de port via SSH

Rediriger un port peut s’avérer très utile lorsque par exemple vous n’avez pas accès au port tant convoité sur un serveur.

Dans mon cas, je souhaite pouvoir utiliser la base de donnée mysql située sur un serveur principal, depuis un site qui se situe sur une autre serveur (dit de secours).

Ce schema illustre bien mon exemple, pour réaliser cela, il suffira d’ouvrir une connexion ssh depuis le serveur principale vers le serveur secondaire en utilisant la redirection de port. ;-)

Tags: , , ,

Crontab si facile !

Crontab

Cron est à GNU ce que at est à MS Windows, il s’agit du système de programmation des tâches de base fournit par l’OS.

Chaque utilisateur peut modifier ses propres tâches en tapant crontab -e. Les tâches exécutées sont bien évidement lancées sous l’utilisateur du cron.

La visualisation

crontab -l permet simplement de visualiser la liste des tâches pour l’utilisateur.

La purge

crontab -r permet vider les tâches de l’utilisateur.

L’édition

En tapant crontab -e , vous tomberez sur l’édition du fichier correspondant à votre cron. La syntaxe est assez simple.

Voici la première ligne que l’on peut trouver.
#m h dom mon dow command
nous pouvons par déduction découvrir sa signification.
m comme Minute
h comme Hour
dom comme Day Of Month
mon comme Month
dow comme Day Of Week (0 = dimanche)

Des exemples

Lancer une commande :

Tous les jours à 14h30
#m h dom mon dow command
30 14 * * * ~/commande.shTout les Lundi à minuit
#m h dom mon dow command
0 0 * * 1 ~/commande.sh

Tous les 1ers de chaque mois à minuit
#m h dom mon dow command
0 0 1 * * ~/commande.sh

Tous les 3 minutes
#m h dom mon dow command
*/3 0 * * * ~/commande.sh

A 6h et 18h
#m h dom mon dow command
* 6,18 * * * ~/commande.sh

Toutes les minutes de 19h à 20h le vendredi
#m h dom mon dow command
* 19-20 * * 5 ~/commande.sh

Allons plus loin

La présence du fichier /etc/cron.allow donnera la liste des utilisateurs autorisés à utiliser cron, dans le cas ou ce fichier n’existe pas, tout le monde peut y acceder. Le fichier /etc/cron.deny à l’inverse, interdira les utilisateurs souhaités.

Vous pouvez aussi utiliser les parametres spéciaux :

@reboot exécution au démarrage du système
@yearly exécution une fois par an (ou @annually)
@monthly exécution une fois par mois
@weekly exécution une fois par semaine
@daily exécution une fois par jour (ou @midnight)
@hourly execution une fois par heure

Envoyer la sortie standard vers une adresse email

~/commande.sh | mail -s « sujet du mail » email@dom.tld

Vous pouvez bien sûr utiliser la redirection standard et d’erreur dans votre commande.

Bonne programmation !

Tags: , ,

Screen, domptez le multi-tache en ligne de commande

Cet article s’adresse à vous si vous travaillez sur vos serveur à distance.

Je pars du principe que vous connaissez déjà le système de la manipulation des processus ; ctrl + c pour suspendre, ctrl + z pour suspendre, fg pour recuperer en avant plan, bg pour dé-suspendre en arriere plan et jobs…

nohup

Nohup est une commande qui permet de garder une autre commande passée en paramètre même si vous fermez votre console ou coupez la connexion avec le serveur.Nohup génere un fichier nohup.out qui recupere la sortie standard de la commande passée en paramètre.

screen

Screen est un programme, dont on peut comparer à une console ; en lancant screen, vous vous retrouvez comme dans une nouvelle console. Vous pouvez lancez plusieurs screens comme vous le souhaitez.

Voici les commandes :

screen Crée un nouvel environement shell

screen wget http://www.serveur.tld/file.txt Lance la commande wget… dans un nouveau screen

screen -r [id_du_screen_facultatif] Recupere un envirenement, si il en existe plusieurs, vous verez la liste des screens

Quel interet me direz vous ? Et bien vous pouvez à l’aide de divers raccourcis naviguer à travers les screens. Simplement avec le raccourcis ctrl + a puis votre touche de commande :

ctrl + a puis d Quit le screen sans le terminer

ctrl + a puis \ Quit le screen et le termine

ctrl + a puis maj + s Divise votre screen en 2 vues

ctrl + a puis tab Bascule d’une partie à l’autre

ctrl + a puis c Ouvre un shell dans la vue en cours

ctrl + a puis  » Vous demande quelle vue utiliser dans la vue en cours

ctrl + a puis un_nombre Choisis le numero de vue à utiliser dans la vue en cours

ctrl + a puis maj + a Renomme la vue en cours

Bref vous comprendrez ici l’avantage de screen, vous pouvez recuperer votre shell depuis n’importe où.

Tags: , , ,

Comment sauvegarder votre serveur ?

Posséder ou gérer un serveur c’est bien, mais en oublier ses sauvegardes c’est mal !

Je vous propose ici une méthode pour faire des sauvegardes complètes et incrémentales très simples pour vos données. Je vous parlerais de la sauvegarde du système par la suite.

Que sauvegarder ?

On va s’occuper uniquement des données modifiables par vous et vos application, je parle bien sûr de vos scripts, bases de données et tout ce qui est hors système.

Quand sauvegarder ?

Cela va dépendre de la vitesse de changement de vos données, il va de soi que nous n’aurons pas besoin d’une sauvegarde toute les heures pour un site personnel.
Personnellement, j’estime à 2 heures de perte maximum pour mes bases de données et 24H pour les fichiers.

Où sauvegarder ?

Sauvegarder sur la même machine n’a qu’un intérêt très limité, en cas d’erreur humaine sur la machine ou accident matériel, nous perdons la machine et ses sauvegardes.
Il est donc important de placer ses sauvegardes sur un support géographiquement décalé par rapport à la machine à sauvegarder.

De quel façon sauvegarder ?

Nous utiliserons ssh pour réaliser nos transferts d’un serveur à l’autre. Le serveur de sauvegarde lancera de lui même les opérations par tache cron.

Nous allons dans cette exemple faire une sauvegarde par jour, et conserver les sauvegardes des 2 derniers jours, 2 dernières semaines, et 2 derniers mois.
Le principe est simple et a déjà fait ses preuves, nous utilisons les hardlinks :

  1.  On imagine que une sauvegarde de la veille existe déjà sur le serveur des sauvegardes.
  2. On déplace la sauvegarde de la veille dans « backup_J-1″
  3. On duplique ce répertoire avec des hardlinks, notre copie sera donc très légère par rapport à une sauvegarde complète, mais tout le fichiers sont présents.
  4. On synchronise cette copie avec la machine à sauvegarder

Pour les bases de données, j’utilise un script qui crée une archive par base de données ; le script a la faculté de découvrir toutes les bases de l’utilisateur employé.

Le script

Voici mon script lancé une fois par jour :
#!/bin/shdirbackups='/home/user/backups'
dirtoarchive='user@machine:/home/linuxquimp'
targetdumps=$dirbackups/day-1/mysql
bdduser=user_bdd
bddpass='pass_bdd'
bddhost='machine'

#Deplacement des archives
mv $dirbackups/day-3 $dirbackups/day-3-deleted
rm -rf $dirbackups/day-3-deleted
mv $dirbackups/day-2 $dirbackups/day-3
mv $dirbackups/day-1 $dirbackups/day-2
mv $dirbackups/day $dirbackups/day-1

# Creation de la copie de day-1/ sur day/
mkdir -p $dirbackups/day
cp -al $dirbackups/day-1/* $dirbackups/day/
rm -rf $dirbackups/day/mysql

# Synchronisation
rsync --delete --stats --rsync-path=/home/user/cron/rsync-2.6.9/rsync $dirtoarchive/ $dirbackups/day

databases=(`echo 'show databases;' | mysql -h $bddhost -u $bdduser --password=$bddpass | grep -v ^Database$`)
test -d $targetdumps || mkdir -p $targetdumps
for d in "${databases[@]}"; do
if [[ $d != 'tmp' && $d != 'test' && $d != 'information_schema' ]]
then
mysqldump --host=$bddhost --user=$bdduser --password=$bddpass --quick --add-drop-table --all ${d} | gzip > $targetdumps/${d}.sql.gz
fi
done

Rien de ne vous empeche d’utiliser la partie qui sauvegarde les bases de données dans un cron lancé plusieurs fois par jour/ par heure.

Je pense que vous aurez compris qu’il faille aussi toute les semaines et tout les mois lancer les autres scripts qui permettent de deplacer les backups dans les bons repertoires.

Toute les 2 heures :
#!/bin/sh

dirtoarchive='user@machine:/home/linuxquimp'
targetdumps=$dirbackups/day/mysql
bdduser=user_bdd
bddpass='pass_bdd'
bddhost='machine'

databases=(`echo 'show databases;' | mysql -h $bddhost -u $bdduser --password=$bddpass | grep -v ^Database$`)
ladate=(`date +%F_%H-%M-%S`)
test -d $targetdumps || mkdir -p $targetdumps
for d in "${databases[@]}"; do
if [[ $d != 'tmp' && $d != 'test' && $d != 'information_schema' ]]
then
mysqldump --host=$bddhost --user=$bdduser --password=$bddpass --quick --add-drop-table --all ${d} | gzip > $targetdumps/${d}_$ladate.sql.gz
fi
done

Toute les semaines avant le backup du jour :
Dans ce script je supprime les dumps mysql faits chaque heure
#!/bin/sh
dirbackups='/home/user/backups'

# deplacement des archives

rm $dirbackups/week-2
mv $dirbackups/week-1 $dirbackups/week-2
mv $dirbackups/day-3 $dirbackups/week-1

#Suppression des dump horaires database
#rm -rf $dirbackups/week-1/mysql
rm $dirbackups/week-1/mysql/*_*-*-*_*-*-*.sql.gz

Tous les mois avant le backup de la semaine :
#!/bin/sh
dirbackups='/home/user/backups'

#deplacement des archives
mv $dirbackups/month-3 $dirbackups/month-3-deleted
rm -rf $dirbackups/month-3-deleted
mv $dirbackups/month-2 $dirbackups/month-3
mv $dirbackups/month-1 $dirbackups/month-2
mv $dirbackups/week-2 $dirbackups/month-1

Il y a surement des erreurs mais le principe est là… ;)

Tags: , , , , ,

Authentification automatique par SSH sans mot de passe

Simplement avec un système de certificat.

Voici comment ça fonctionne

Imaginons un poste client et un poste serveur, nous tentons évidement d’etablir une connexion ssh du client vers le serveur.
Habituellement, nous tapons la commande : ssh user@machine , puis on entre le mot de passe.

Pour éviter cela, nous allons faire 2 choses :

  1. Créer un jeu de clés (clé publique et clé privée) sur le client
  2. Copier la clé publique du client sur le serveur.

Voici comment procéder

Générer le jeu de clé/certificat sur le client

ssh-keygen -t dsa
On vous demandera où placer ce jeu, répondez par default.
On vous demandera une passphrase pour crypter votre certificat, vous pouvez ne rien mettre si vous estimez que vous seul pouvez acceder à votre compte local du client.

Copiez la clé publique sur le serveur

ssh-copy-id -i ~/.ssh/id_dsa.pub user@machine
Cette commande ne fait qu’ajouter votre clé publique dans un fichier sur le serveur. Voici une commande équivalente :
cat ~/.ssh/id_dsa.pub | ssh user@machine "cat - >> ~/.ssh/authorized_keys"

Voila, vous pouvez desormais vous identifier sur le serveur sans mot de passe.

Tags: , , , ,