Le Blog de C-quad

Archive pour mars 2011

Mise en place d’un système de vidéosurveillance – 2ème partie : Zoneminder

Cet article a pour but de mettre en place un système de vidéo-surveillance avec Zoneminder. Comme vu précédemment pour le choix du matériel, je dispose de caméras extérieures analogiques et intérieures ainsi que d’une carte d’acquisition.

Pourquoi Zoneminder ?

L’objectif n’est pas uniquement de pouvoir visualiser les caméras, mais de :

  • détecter les mouvements sur une caméra
  • enregistrer une séquence vidéo sur un évènement
  • être prévenu en cas d’évènement (par mail par exemple)
  • interagir avec la maison (domotique)

A ma connaissance, seul ZoneMinder rempli toutes ces fonctionnalités en étant un logiciel open source bien entendu.

Installation de ZoneMinder

L’installation de ZoneMinder se fera grâce à yum comme d’habitude.

# yum install zoneminder

================================================================================
 Paquet                      Architecture
 Version               Dépôt       Taille
================================================================================
Installation:
 zoneminder                  x86_64     1.24.2-5.fc14         fedora      1.2 M
Installation pour dépendance:
 mysql-libs                  x86_64     5.1.55-1.fc14         updates     1.2 M
 perl-Archive-Tar            noarch     1.64-1.fc14           fedora       64 k
 perl-Archive-Zip            noarch     1.30-3.fc14           fedora      107 k
 perl-Compress-Raw-Bzip2     x86_64     2.030-1.fc14          fedora       31 k
 perl-Compress-Raw-Zlib      x86_64     2.030-1.fc14          fedora       58 k
 perl-Convert-BinHex         noarch     1.119-13.fc14         fedora       43 k
 perl-DBD-MySQL              x86_64     4.017-1.fc14          fedora      136 k
 perl-DBI                    x86_64     1.613-1.fc14          fedora      776 k
 perl-Date-Manip             noarch     6.07-3.fc14           fedora      1.2 M
 perl-Device-SerialPort      x86_64     1.04-8.fc14           fedora       64 k
 perl-Email-Date-Format      noarch     1.002-7.fc14          fedora       16 k
 perl-HTML-Parser            x86_64     3.68-1.fc14           fedora      111 k
 perl-HTML-Tagset            noarch     3.20-5.fc14           fedora       16 k
 perl-IO-Compress            noarch     2.030-1.fc14          fedora      216 k
 perl-IO-Socket-SSL          noarch     1.38-1.fc14           updates      71 k
 perl-IO-Zlib                noarch     1:1.10-141.fc14       updates      31 k
 perl-IO-stringy             noarch     2.110-13.fc14         fedora       69 k
 perl-MIME-Lite              noarch     3.027-4.fc14          fedora       89 k
 perl-MIME-Types             noarch     1.28-3.fc14           fedora       32 k
 perl-MIME-tools             noarch     5.428-2.fc14          fedora      249 k
 perl-MailTools              noarch     2.07-1.fc14           fedora      102 k
 perl-Module-Load            noarch     1:0.16-141.fc14       updates      26 k
 perl-Net-LibIDN             x86_64     0.12-4.fc14           fedora       35 k
 perl-Net-SMTP-SSL           noarch     1.01-5.fc14           fedora      8.1 k
 perl-Net-SSLeay             x86_64     1.36-2.fc14           fedora      173 k
 perl-PHP-Serialization      noarch     0.27-5.fc14           fedora       11 k
 perl-Package-Constants      noarch     1:0.02-141.fc14       updates      25 k
 perl-TimeDate               noarch     1:1.20-2.fc14         fedora       42 k
 perl-URI                    noarch     1.54-2.fc14           fedora      102 k
 perl-YAML-Syck              x86_64     1.07-4.fc14           fedora       75 k
 perl-libwww-perl            noarch     5.837-2.fc14          updates     386 k
 php                         x86_64     5.3.5-1.fc14          updates     1.1 M
 php-cli                     x86_64     5.3.5-1.fc14          updates     2.2 M
 php-common                  x86_64     5.3.5-1.fc14          updates     527 k
 php-mysql                   x86_64     5.3.5-1.fc14          updates      78 k
 php-pdo                     x86_64     5.3.5-1.fc14          updates      76 k
Mise à jour pour dépendance:
 perl                        x86_64     4:5.12.3-141.fc14     updates      11 M
 perl-Module-Pluggable       noarch     1:3.90-141.fc14       updates      38 k
 perl-Pod-Escapes            noarch     1:1.04-141.fc14       updates      31 k
 perl-Pod-Simple             noarch     1:3.13-141.fc14       updates     210 k
 perl-libs                   x86_64     4:5.12.3-141.fc14     updates     594 k
 perl-threads-shared         x86_64     1.32-141.fc14         updates      51 k

Résumé de la transaction
================================================================================
Install      37 Package(s)
Upgrade       6 Package(s)

Taille totale des téléchargement : 23 M

Jusqu’à présent, je n’ai jamais rien eu à redire sur la qualité des paquets installés sous Fedora, mais malheureusement je trouve que celui-ci n’est pas à la hauteur :

On constate bien qu’un serveur mysql est nécessaire au fonctionnement de ZoneMinder, mais mysql ne figure pas parmi les dépendances. Cela pourrait s’expliquer si l’utilisateur avait le choix d’installer ZoneMinder sur une autre base de données (postgreSQL par exemple) mais cela ne semble pas être le cas.

Il est donc nécessaire d’installer mysql comme détaillé dans un précédent article.

Une fois cela réalisé, il est nécessaire de suivre les instructions renseignées dans /usr/share/doc/zoneminder-1.24.2/README.Fedora

Mise en place de la base de données de ZoneMinder :

Si vous avez sécurisé votre installation de mysql, il est nécessaire de vous authentifier pour exécuter les commandes fournies dans README.Fedora :

$ mysql -u root -p mysql < /usr/share/zoneminder/db/zm_create.sql
$ mysqladmin -u root -p reload

Par défaut zoneminder est désactivé dans son fichier de configuration, nous allons donc éditer /etc/httpd/conf.d/zoneminder.conf :

Alias /zm "/usr/share/zoneminder/www"
<Directory "/usr/share/zoneminder/www">
 Options -Indexes MultiViews FollowSymLinks
 AllowOverride All
 Order allow,deny
 Allow from all
Deny from all # DELETE THIS LINE
</Directory>

Nous rechargeons ensuite la configuration apache :

# service httpd reload

Paramétrage php

Malheureusement toutes ces actions ne sont pas suffisantes, si vous essayer d’accèder à votre installation de Zonemider située sous localhost/zm vous obtiendrez cette erreur :

[error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected $end in /usr/share/zoneminder/www/includes/functions.php on line 2309

Cela provient de la directive short_tag dans /etc/php.ini :

;short_open_tag = Off
short_open_tag = On

Cette fonctionnalité permet d’interpréter les tags <? et ?> comme des tags php <?php et ?>. Cette possibilité date des premières versions de php et a été retirée par la suite pour améliorer la qualité du parseur de php.

Pour que cette modification de php.ini soit prise en compte il est nécessaire de le faire savoir à apache :

# service httpd reload

Petits problèmes sur le paquet

SELinux

Vous devriez désormais avoir une application zoneminder accessible, mais qui va déclencher pas mal d’alertes SELinux. Il est pour l’instant nécessaire de désactiver SELinux pour ZoneMinder.

Un bug existe sur ce sujet : https://bugzilla.redhat.com/show_bug.cgi?id=611016

J’ai proposé mon aide au mainteneur, mais pour l’instant je n’ai pas eu de retour.

Cambozola

ZoneMinder fait appel à cambozola, un application open source développée en java qui permet de mettre en place un client/serveur de streaming video. Le souci c’est que cette application devrait être dans un autre paquet et non directement dans le paquet ZoneMinder.

J’ai donc déposé un bug sur ce sujet :https://bugzilla.redhat.com/show_bug.cgi?id=654052 et réalisé un paquet pour cambozola (voir mes paquets).

Néanmoins, ZoneMinder pour pouvoir être intégré aux dépôts officiels Fedora n’inclut pas ffmpeg et donc la capture des caméras se fait en mode jpeg. Je constate donc, sauf erreur de ma part, que cambozola ne sert pas en l’état.

Mise en place des caméras

Ma maison est neuve avec des peintures toutes fraiches et les caméras étant analogiques, il faut qu’un cable relie l’ordinateur à toutes les caméras. Il était bien sur hors de question, que des câbles soient visibles dans et à l’extérieur de la maison. Et autant que possible, je voulais des caméras qui soient assez discrètes.

les caméras sont donc placées sous l’avancée de toit, elles seront donc plutôt protégée de la pluie. Et j’en ai profité pour faire passer les câbles directement sous les tuiles.

Voici donc la caméra située à l’entrée de la maison :

Caméra Exterieure Entrée

La caméra qui donne derrière est encore plus discrète :

Caméra extérieure arrièreQuand à la caméra située dans le garage,  la discrétion n’était pas l’objectif premier, c’était plutôt de couvrir la plus grande superficie. la caméra est donc plutôt visible :

Caméra GarageLes lumières bleues sont en réalité les LED infrarouge qui ne sont pas aussi voyante « en vrai avec un œil humain ».

Configuration de la carte d’acquisition

Afin de pouvoir utiliser correctement la carte d’acquisition, c’est à dire que les 8 chipset BT878a soient reconnus, il est nécessaire de le spécifier dans le fichier /etc/modprobe.d/bttv.conf :

$ cat /etc/modprobe.d/bttv.conf
options i2c-algo-bit bit_test=1
options bttv gbuffers=16 card=102,102,102,102,102,102,102,102 radio=0,0,0,0,0,0,0,0 tuner=4,4,4,4,4,4,4,4 chroma_agc=1 combfilter=2 full_luma_range=1 coring=1 autoload=0

Configuration de ZoneMinder

Une fois l’installation terminée vous devriez avoir ZoneMinder fonctionnel à l’adresse suivante http://localhost/zm.

Je vous conseille d’aller regarder la page « options », elles sont très nombreuses et certaines sont encore obscures pour moi.

Pour ajouter une caméra, il faut faire « Add New Monitor » :

On y renseigne le nom que l’on veut donner au moniteur, si la caméra est locale ou distante:

  • On choisira local pour une caméra reliée directement à l’ordinateur
  • et distante (remote) pour les caméras IP

Dans mon cas c’est des caméras locales, il faut donc ensuite configurer dans l’onglet « source » le chemin pour accéder aux caméras :

 

Une fois les moniteurs sur les caméras ajoutés, vous devriez les voir apparaitre sur l’écran principal. ils ne doivent pas être rouge quand ils sont activés sinon c’est qu’il y a un souci.

Sur l’écran principal, le lien « Montage » permet d’avoir une vue regroupant toutes vos caméras :

On constate clairement que la qualité des caméras varie beaucoup, les caméras exterieures sont de bien meilleures factures que les caméras intérieures. Pour seulement 5 € d’écart les caméras extérieures qui présentent l’avantage d’être étanche sont nettement plus avantageuse.

Reste à faire

  • Recevoir les alertes quand un évènement est déclenché
  • Interconnecter ZoneMinder avec une alarme pour faciliter la mise à jour de son statut en fonction de l’état de l’alarme.

 

Interface graphique à distance avec FreeNX

Il y a déjà quelques temps j’avais rédigé un article sur l’accès à distance avec vnc, nous allons voir maintenant comment faire la même chose avec FreeNX.

La technologie NX est un protocole client-serveur permettant des connexions graphiques X11 distantes rapides et sûres pour accéder à un bureau Linux / Unix à distance. Le protocole est basé à la fois sur SSH (pour la sécurité) et sur la compression X (pour l’interface graphique et la rapidité)

Par rapport à VNC, j’y retrouve 2 avantages :

  • Fonctionne sur une  connexion avec peu de bande passante
  • Permet de s’authentifier (la prise de main peut facilement se faire sans qu’une session soit ouverte)

Installation et configuration de FreeNX

Comme tout logiciel sous Fedora, l’installation est très simple il nous suffira de l’installer avec yum :

# yum install freenx

Nous vérifions ensuite que le service tourne bien :

# service freenx-server status
freenx-server est en cours d’exécution

Nous allons ensuite récupérer la clé située dans /etc/nxserver/

# cat /etc/nxserver/client.id_dsa.key

Installation du client

Il n’y a malheureusement pas à ma connaissance de client libre qui soit pleinement fonctionnel avec le serveur freenx. Il est donc nécessaire de télécharger le client fourni par nomachine.

La configuration n’est pas compliquée, il suffit de lancer nxclient sur le client et de cliquer sur le bouton configure.

On renseigne l’adresse du serveur auquel on désire se connecter. Il est important de cliquer sur le bouton « Key »  et d’y copier collé le contenu du fichier clé édité sur le serveur (/etc/nxserver/client.id_dsa.key)

Et tout doit fonctionner.

Références

Documentation fedora-fr

Teradata : débloquer une table bloquée suite à un fastload

Teradata fourni une base de données massivement parallèle que j’utilise dans le cadre mes prestations. Teradata n’est en aucun cas une solution de base de données libre et cela se ressent par la pauvreté de documentations disponibles sur le web.

Je me permet donc de faire un écart et de partager mes connaissances sur un outil propriétaire.

Teradata mets à disposition de ces clients un outil nommé fastload qui permet de charger un fichier dans la base de données.  Je ne vais pas détailler l’utilisation du fastload mais plutot ce qu’il faut faire lorsque l’on est confronté à cette erreur :

*** Failure 2652 Operation not allowed: database.table is being loaded.

Ce cas se produit principalement quand un fastload a été effectué mais que celui ci n’est pas terminé (incident, mise en pause, etc …)

Je vous conseille donc dans un premier temps de vérifier si c’est bien cette situation dans la table QryLog :

select StartTime,SessionID,UserName,DefaultDatabase,LogonSource,ClientAddr,ErrorCode,ErrorText,StatementType,QueryText
from dbc.QryLog
where StartTime between '2011-03-09 02:00:00' AND '2011-03-09 05:00:00'
and Querytext like '%database.table%'
and AppID='FASTLOAD';

Cette requête d’exemple est bien sur à adapter en fonction de vos besoins. Le champs qui nous intéresse vraiement est « QueryText ».

Donc si vous retrouvez bien dans cette table un début de fastload, sans le « end fastload » c’est que vous êtes bien dans le cas d’un fastload non terminé.

Il faut donc le terminer pour débloquer la table :

$ fastload << ! 
logon bdd/user,password;

BEGIN LOADING database.table 
ERRORFILES database.table_E1, 
 database.table_E2;
end loading ;
logoff;
!

il faut bien sur remplacer « database.table » et les tables d’erreurs par les informations que vous aurez récupéré dans la table QryLog.

Mise en place d’un système de vidéo-surveillance – 1ère Partie : Le Matériel

Suite à un cambriolage, un des éléments qui m’a tracassé c’était de ne pas avoir d’éléments qui puissent permettre d’appréhender les auteurs.

Je me suis donc mis en quête d’un système de vidéo-surveillance. Il est vrai qu’il existe des produits sur le commerce  tout fait mais j’ai préféré monter cette  solution moi-même avec quelques pré-requis :

  • L’ensemble des outils utilisés doivent être libres
  • La solution ne doit pas être couteuse

Après quelques recherches sur internet mon choix s’est porté sur le logiciel libre ZoneMinder. Je reviendrais sur les raisons de ce choix et les spécificités dans un prochain article.

Maintenant la solution logicielle choisie, il reste à définir le matériel compatible à acheter.

Le Matériel

Pour faire fonctionner le système de vidéo-surveillance, il faut un ordinateur et des caméras.

Le choix des caméras

Les caméras IP

J’ai commencé par regarder les caméras ip. les caméras IP compressent numériquement les images, et, limitant leur flux (images par secondes), elles sont capables de produire des vidéos en haute résolution tout en minimisant la bande passante utilisée. Ces caméras sont annoncées comme étant l’avenir de la video-surveillance.

Les caméras ip Axis par exemple sont effectivement de très bon produits.

Par contre, même si les tarifs sont en baisse, je ne les considèrent pas comme peu couteuses. La solution proposée ci dessus étant proposée à 1500 euros pour 4 caméras. Il est vrai qu’il est clairement possible de trouver des caméras IP moins chères, mais il est très difficile d’en trouver de qualité en dessous de 150 euros l’unité.

Les caméras CCTV

Je me suis donc rabattu sur les caméras de video-surveillance ancienne génération, les caméras CCTV. Ces caméras sont commercialisées depuis déjà de nombreuses années, le matériel est éprouvé, produit en grandes quantités et donc beaucoup moins cher !

caméras extérieures

J’ai donc acheté 2 caméras extérieures étanches avec vision infra-rouge.

Ces caméras vendues sur ebay à 30 euros sont un très bon rapport qualité prix, La qualité d’image est correcte, l’angle suffisant pour mon cas et la vision infra rouge 24 led fonctionne vraiment bien (J’ai été bluffé par la sensibilité de cette caméra).

caméras intérieures

Pour les caméras intérieurs j’ai choisi de prendre des petits dômes :

Elles aussi vendues sur ebay disposent du même capteur ainsi que de la vision infrarouge pour un tarif tout à fait abordable aussi.

Il reste encore les câbles pour relier ces caméras à l’ordinateur. J’ai choisi de prendre des cables video plus alimentation

La connectique des caméras étant en BNC, j’ai regretté de mettre séparé des nombreux câbles réseau BNC que j’avais, je pense que cela m’aurait éviter d’acheter ces câbles. Mais on ne peut malheureusement pas toujours tout garder. Et ces câbles présentent l’avantage de transporter aussi le courant, il n’y a donc pas de souci à se faire pour alimenter les caméras, tous les transfos seront au même endroit, c’est à dire avec le pc. Cela permet d’avoir un système de vidéo-surveillance encore fonctionnel en cas de coupure de courant si l’installation est branchée sur un bon onduleur.

J’ai donc commandé ces câbles au même vendeur sur ebay

 

Au final, pour environ 200€ j’ai réussi à acheter 2 caméras extérieures étanches – 4 caméras intérieures et la connectique. Soit donc quasiment le prix d’une bonne caméra IP.

Les caméras sont des caméras analogiques, pour les relier à un ordinateur, il faut que celui ci dispose d’une carte d’acquisition.

La carte d’acquisition video

Il nous faut donc une carte d’acquisition qui soit capable de :

  • gérer 6 caméras,
  • fonctionne sous Linux
  • soit compatible avec ZoneMinder
  • Suffisamment performante pour capturer assez d’images pour que cela soit exploitable par la suite.

Parce que pour les cartes d’acquisition on trouve vraiment tout, j’étais même tombé sur une carte 8 entrées à 15€ …

Le souci de ces cartes entrée de gamme, c’est qu’il n’y a qu’un seul chipset bt878 et donc que si l’on place 2 caméras on tombe déjà à 12 images par secondes, 4 caméras on est à 6 images par secondes et 8 caméras 3 images par secondes. On pourrait considérer que 3 images par secondes c’est suffisant, mais ces débits étant théorique, on pourrait facilement être en dessous. La détection de mouvement risque d’être délicate avec un rafraichissement aussi faible.

Je conseille donc plutôt de chercher une carte d’acquisition avec un chipset dédié à chaque caméras.

J’ai choisi cette carte : 8 Channel 240 FPS Capture Card using the Connexant 878A Chip

Pour l’ordinateur, j’ai choisi d’en acheter un dédié à devenir serveur. J’ai pris le starter de materiel.net. J’avais peur que le traitement des 6 caméras consomme beaucoup de ressources et je n’ai donc pas osé prendre un mini PC à base d’Intel Atom de type EeeBox. Je pense qu’en réalité, un ordinateur moins puissant aurait surement suffit et j’aurais économiser un peu de courant. Néanmoins, du coup mon installation sera plus facilement évolutive et il me reste de la puissance pour faire effectuer d’autres taches à ce serveur.

Le bilan

La solution complète m’a donc couté :

  • 290 € pour l’ordinateur
  • 70 € pour la carte d’acquisition
  • 200 € pour les caméras et cables

Par contre, il faut être très patient pour les caméras. J’ai été livré de la carte d’acquisition ainsi que de l’ordinateur dans les 2 semaines qui ont suivi ma commande. Par contre pour le reste commandé sur ebay, il a été nécessaire d’attendre presque 3 mois.

Je vous laisse imaginer le soulagement lorsque le facteur me remets le colis en bon état après cette attente :

Mais surprise, je constate que seules les caméras extérieures sont dans le colis. Je fais un mail au vendeur qui me répond dans la journée que ma commande a été expédiée en 2 colis et que je devrais donc recevoir la deuxième partie bientôt.

Et effectivement une petite semaine plus tard, j’ai bien reçu la suite :

Nous verrons dans un prochain article, la partie logiciel, c’est à dire ZoneMinder

Forcer l’utilisation de https pour certaines pages

Nous avons vu précédemment comment sécuriser l’accès à un site web en activant le support de https, nous allons voir maintenant comment forcer l’utilisation d’une page en https.

L’intérêt d’utiliser le protocole https est d’éviter que vos identifiants et mot de passe circulent en clair sur le réseau. C’est bien joli de pouvoir accéder aux pages sécuriser, mais si l’accès aux pages non sécurisées est toujours disponible, le travail n’est qu’a moitié accompli.

La configuration a éffectuer

Le principe utilisé sera de réaliser une redirection à partir du répertoire que l’on désire sécuriser. Pour cela, il existe plusieurs solutions:

  • Via .htaccess
  • Via la configuration d’apache

La solution que j’ai choisie est de modifier directement la configuration d’apache.

Beaucoup de sites proposent de modifier le fichier httpd.conf, je le déconseille fortement ! il existe un répertoire dédié aux personnalisations d’apache : conf.d, c’est dans le répertoire conf.d qu’il faut créer un fichier avec ce que l’on souhaite modifier.

Cette façon de procéder permettra de s’affranchir de tout risque lors d’une mise à jour d’apache. Le paquet apache écrasera le fichier httpd.conf lors d’une mise à jour, alors que le répertoire conf.d sera lui conservé et de ce fait vous n’auriez rien perdu.

Voici un exemple pour sécuriser l’accès à la page d’administration d’un blog wordpress :

<Directory "/var/www/html/wordpress/wp-admin">
 RewriteEngine on
 RewriteBase /var/www/html/wordpress/wp-admin
 RewriteCond %{SERVER_PORTS} !^443$
 RewriteRule ^(.*)?$ https://%{SERVER_NAME}/wordpress/wp-admin/ [L,R]
 </Directory>

Il vous suffit de recopier cette section dans un fichier et de le déposer dans le répertoire /etc/httpd/conf.d/

On vérifiera ensuite que la configuration est correcte,

  • soit directement avec apachectl :
$ apachectl configtest
Syntax OK
  • soit avec la commande service
# service httpd configtest
Syntax OK

Il faut bien sur que la syntaxe soit OK avant de procéder à un rechargement de la configuration d’apache.

# service httpd reload