PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Olivier Delort : Bloc-notes : base de données Kodi corrompue

jeudi 26 mars 2015 à 16:01

Anciennement XBMC (XBox MediaCenter), Kodi est un formidable outil pour gérer ses médiathèques. Il me sert principalement pour gérer mes fichiers multimédia. Il arrive parfois, au vu de la très grande quantité de fichiers que je possède, à SQLite de s’emballer et la base de données des médiathèques se corrompt. Dernier exemple en date d’hier soir, la moitié de mes diaporamas étaient amputées d’une voir plusieurs diapositives. Alors que le fichier image (jpg, png) s’y rapportant était présent “physiquement” sur le disque dur ou le partage NFS. Au départ j’ai cru à une erreur du scrapeur, mais une analyse des logs ne révéla rien. J’ai conclu que ma base de données était donc corrompue. En effet kodi créée un fichier  SQLite pour chaque médiathèque (audio, photo, et autre). Ses fichiers sont sotckés dans : “/home/$User/.kodi/userdata/Database/

Objectif

Supprimer la base de données corrompue pour recréer une base de données saine avec comme moteur  MariaDB. SQlite est très bien pour de petites bases de données mais j’ai atteint rapidement sa limite. J’ai eu le même cas avec mon serveur owncloud que j’avais aussi migré vers mariaDB à l’époque.

Suppression de la BDD corrompue

Dans un premier temps à partir de kodi je supprime toutes les sources alimentant la médiathèque des photos. Ensuite, je nettoie la médiathèque et je quitte kodi. Je me rends dans le répertoire contenant le fichier de la base de données et je le renomme au cas où.

cd /home/olivier/.kodi/userdata/Database/
mv MyPictures90.db MyPictures90_bak24032015.db

L’ancienne base est maintenant supprimée.

Création de la nouvelle BDD

Je commence par installer MariaDB. Je me rends sur cette page qui permet de générer les dépôts pour sa distribution. Dans mon cas il s’agit d’une Debian Sid. Il ne me reste plus qu’à copier – coller les dépôts dans mon sources.list et d’installer la signature du dépôt :

sudo apt-get install python-software-properties
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
sudo add-apt-repository 'deb http://ftp.igh.cnrs.fr/pub/mariadb/repo/10.0/debian sid main'
sudo apt-get update
sudo apt-get install mariadb-server

Je créer maintenant un utilisateur “kodi” qui pourra créer une BDD pour chaque médiathèque.

CREATE USER 'kodi' IDENTIFIED BY 'motdepasse';
#réglage de ses privilèges
GRANT ALL ON *.* TO 'kodi';

Je configure kodi en mode Sql grâce à l’ajout d’un fichier advancedesettings.xml qui sera stocké dans le dossier “/home/olivier/.kodi/userdata“.


  
    mysql
    127.0.0.1
    3306
    kodi
    lemotdepasse
   
  
    mysql
    127.0.0.1
    3306
    kodi
    lemotdepasse
  

    mysql
    127.0.0.1
    3306
    kodi
    lemotdepasse
  
  
    true
    true
  

A partir de là mon instance Kodi est prête pour une nouvelle médiathèque.

Nouvelle mediathèque

Rien de plus facile, il suffit d’ajouter les sources désirées dans Kodi pour qu’il se charge de créer les médiathèques et les BDD.  Pour ceux qui voudraient aller plus loin, il est possible d’utiliser plusieurs instances Kodi avec la même BDD en “ouvrant” le serveur MariaDB/MySQL au réseau. Cela permet aux différents appareils embarquant kodi d’avoir accès à la même information en temps réel. Pour cela je vous conseille cette excellente page du wiki de kodi.

Diaspora*

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

Mathieu Ignacio : Protocole IP : Une introduction à SCTP [partie 2]

jeudi 26 mars 2015 à 11:12

Après avoir introduit SCTP/IP dans la partie précédente. J'ai écrit un petit client /server en C que vais décrypter dans cette partie.

Que les développeurs professionnels m'en excusent, mais le code présenté ici est celui d'un amateur qui bien qu'ayant une eu une solide formation en C, n'a pas codé en C depuis... presque une quinzaine d'année. Par ailleurs, le but du code écrit ci-dessous est d'être didactique, je déconseille donc fortement de le reprendre tel quel pour développer quelque chose de solide. Pour le moment, ce code n'apporte rien comparé à du TCP ou de l'UDP, il s'agit dans cette partie de poser les bases d'un client et d'un serveur SCTP.

Description de l'archive

L'archive associée à ce billet comporte 5 fichiers :

Idéalement il faudrait avoir 2 fenêtres disponible : une pour le client et l'autre pour le serveur. Après avoir ouvert l'archive, il faut compiler le programme avec compile.sh :

matou@nausicaa:~/Travaux/SCTP$ ./compile.sh 
sctp_server.c: In function ‘main’:
sctp_server.c:32:7: warning: variable ‘message_status’ set but not used [-Wunused-but-set-variable]
matou@nausicaa:~/Travaux/SCTP$

Il reste un petit warning, mais c'est pas grand chose. Dans la fenêtre du serveur, exécuter le serveur :

matou@nausicaa:~/Travaux/SCTP$ ./sctp_server 
Awaiting connections

Le serveur ne rend pas la main, il attend qu'un client se connecte. Dans la fenêtre du client exécuter le client :

matou@nausicaa:~/Travaux/SCTP$ ./sctp_client 
Socket creation
Connection to server
Send message
matou@nausicaa:~/Travaux/SCTP$ 

Le client a rendu la main, il a décrit ses actions. De retour coté serveur on a désormais :

matou@nausicaa:~/Travaux/SCTP$ ./sctp_server 
Awaiting connections
 Data : Ceci est un message
Awaiting connections

Le serveur a été contacté par le client qui lui a transmis un message ("ceci est un message") et attend désormais une nouvelle connexion. Vous pouvez relancer plusieurs fois le client pour voir le message apparaitre côté serveur.

Analyse du client

La partie cliente n'est pas bien compliqué. Concrètement elle ressemble trait pour trait à une communication en TCP ou en UDP. Pour résumer on a les étapes suivantes :

link = create_sctp_socket(&socket_definition,"127.0.0.1",62324);
connection_to_server(link, socket_definition);
send_message_unsafe(link,message);
  1. On créé une socket de type SCTP associée à au serveur ayant l'IP 127.0.0.1 et sur le port 62324
  2. On se connecte sur le serveur
  3. On envoie le message
  4. Et on s'arrête là

Ca a l'air simple écrit comme ça, en fait la réalité est un peu plus complexe car j'ai camouflé la plupart des options en écrivant cette surcouche de trois fonctions. On y reviendra plus tard.

Analyse du serveur
listener = create_sctp_socket(&server_address,"127.0.0.1",62324);
bind( listener, (struct sockaddr *)&server_address, sizeof(server_address) );
set_sctp_server_options(listener);
listen( listener, 5 );
while( 1 )
          client_connection = accept( listener, NULL, NULL );
          sctp_recvmsg( client_connection, message, sizeof(message), ...);
          close(client_connexion)

On a donc les étapes suivantes :

  1. create_sctp_socket : On créé une socket associée à l'IP du serveur et au port destination. Contrairement à la partie cliente j'ai appelé la variable qui stocke ce socket "listener" pour les différencier, mais concrètement c'est la même fonction qui a été appelée avec les mêmes arguments : la structure de données renvoyée est absolument identique.
  2. bind : on demande au système d'associer la définition de la socket précédente avec une vraie interface et un vrai port.
  3. set_sctp_server_options : C'est la partie la plus intéressante du code : tout le reste vous le trouverez dans n'importe quel tutoriel client/serveur TCP/IP. C'est dans cette fonction que sont camouflées la plupart des options intéressantes propre à SCTP. J'y reviens dans la prochaine section.
  4. Listen : On se met en écoute sur la socket et on accepte 5 connexions simultanées au maximum.
  5. while (1) : On boucle indéfiniment sur les trois fonctions suivantes:
  6. accept() : on attend qu'un nouveau client se connecte
  7. sctp_recvmsg() : on attend un unique message
  8. close() : et on ferme la connexion pour revenir à l'étape du accept
Les options propres à sctp

Dans create_sctp_socket la fonction socket() permet de choisir le type de protocole utilisé. Pour de l'UDP nous aurions socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) et pour du TCP socket(AF_INET, SOCK_STREAM, IPPROTO_TCP). Mais pour du SCTP nous avons plusieurs modes. Dans ce code j'ai utilisé socket(PF_INET, SOCK_STREAM, IPPROTO_SCTP) qui est le mode one-to-one le plus proche de TCP-UDP et qui a pour objectif de faciliter le portage d'applications vers du SCTP, mais qui nous prive de la possibilité de bénéficier du multi-homing. Il est possible de choisir le mode one-to-many avec les options suivantes : socket(PF_INET, SOCK_SEQPACKET, IPPROTO_SCTP), mais le reste du code ne serait plus nécessairement compatible.

Dans set_sctp_server_options nous avons :

sctp_config.sinit_num_ostreams = 5;
sctp_config.sinit_max_instreams = 5;
sctp_config.sinit_max_attempts = 4;
setsockopt(mysocket, IPPROTO_SCTP, SCTP_INITMSG, &sctp_config, ...);

Et là ça se corse, car il nous faut rentrer dans les détails et la littérature sur le sujet est peu abondante. La structure sctp_initmsg permet de définir les options initiales de sctp. Ici nous avons :

  1. sinit_num_ostreams : Définie le nombre de conversations parallèles maximum qui pourront être ouvertes en sortie (out streams). Attention, je ne parle pas de connexion ou de socket simultanées mais du nombre de flux au sein d'une unique connexion client->serveur. Cela ne nous sert à rien avec le code présenté dessus...
  2. sinit_num_instreams : Le nombre de conversations simultanées maximum gérées par le serveur. Par contre, je n'ai pas trouvé si cela était une limite par connexion ou une limite sur la totalité des connexions. Si vous avez des pistes cela m'intéresse.
  3. sinit_max_attempts : C'est le nombre de fois que la pile SCTP tente de faire un INIT vers une destination avant de considérer qu'elle n'est pas accessible.

Note : toutes ces options ont des valeurs par défaut que j'aurais pu laisser en positionnant leurs valeurs à "0". Mais comme les morceaux de codes dont je me suis inspiré pour faire cet article modifiaient tous ces valeurs, j'en ai profité pour aborder le sujet.

Pour la suite

Pour celles et ceux qui ont déjà écrit des programmes utilisant du TCP/IP cet article n'apporte encore pas grand chose. Dans la prochaine partie j'aborderais le multi-homing et les conversations parallèles car ce sont les vrais atouts de SCTP sur UDP et TCP. Ca sera nécessairement un article avec beaucoup de code. Excusez-moi les non-développeurs, j'aurais également d'autres articles pour vous sur d'autres sujets.

Liens :

La man page linux SCTP : absolument nécessaire pour connaitre toutes les options.

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

Articles similaires

Carl Chenet : On a une sauvegarde de la base de données ? Elle a 6 mois, inutilisable

jeudi 26 mars 2015 à 00:00

Suivez-moi aussi sur Diaspora*diaspora-banner ou Twitter  ou sur Identi.ca

Péremption des données

Quel informaticien n’a pas été confronté à la péremption des données ? Vos données sont trop vieilles, inutilisables. Les causes peuvent être multiples : schémas des données ayant évolués, format de fichiers incompatibles ou delta trop important avec l’existant.

time-expired

Le cas est particulièrement flagrant avec une sauvegarde. Si cette dernière contient bien des données, que ces dernières sont cohérentes mais inutilisables aujourd’hui, vous pouvez la considérer comme périmée.

Backup Checker

Pour répondre à ce problème, la nouvelle version 1.4 de Backup Checker a été publiée sur GitHub (étoiles appréciées :) ), l’outil de vérification automatisée de sauvegarde, offre une fonctionnalité permettant de contrôler l’âge de votre archive, qui mis en relation avec une durée que vous aurez définie, permettra l’émission d’un avertissement une fois cette durée écoulée, et tout cela automatiquement. Plus de mauvaise surprise le jour où vous devez utiliser la sauvegarde, donc le jour où votre infrastructure en a vraiment besoin.

Paquets Debian pour Wheezy et Squeeze

Proposed Debian Logo

Des paquets Debian sont désormais disponibles pour la version stable et la vieille stable de Debian. Mettre en place le dépôt se fait très simplement en un copier/coller en tant qu’utilisateur root pour Debian Wheezy :

apt-key adv --keyserver pgp.mit.edu --recv-keys 2B24481A \\
&& echo "deb http://debian.mytux.fr wheezy main" > /etc/apt/sources.list.d/mytux.list \\
&& apt-get update \\
&& apt-get install backupchecker

Pour Debian Squeeze :

apt-key adv --keyserver pgp.mit.edu --recv-keys 2B24481A \\
&& echo "deb http://debian.mytux.fr squeeze main" > /etc/apt/sources.list.d/mytux.list \\
&& apt-get update \\
&& apt-get install backupchecker
Rôles Ansible pour mettre en place Backup Checker

ansible

Le succès d’Ansible est clairement mérité. Léger à mettre en place, sans client, utilisant ssh et surtout une prise en main très rapide. C’est pourquoi nous proposons aujourd’hui des playbooks Ansible permettant de simplement déployer Backup Checker. Voici les playbooks en question :

Retour

Et vous ? Que pensez-vous de la vérification de sauvegarde ? Comment utilisez-vous Backup Checker ?  Nous sommes intéressés par  vos réactions et commentaires concernant le projet.

N’hésitez pas à vous manifester dans les commentaires de ce billet, via le gestionnaire de rapports de bugs ou directement auprès de l’auteur.


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

Okki : Sortie de GNOME 3.16

mercredi 25 mars 2015 à 21:07

Ça y est. Le tout nouveau GNOME 3.16 est disponible.

La grosse nouveauté, c’est l’apparition du centre de notifications, qui remplace avantageusement le tiroir de messagerie (qui se trouve être toujours disponible, mais sous une autre forme). Nous avons également droit à un nouveau thème, de nouvelles applications (Agenda, Builder, Caractères et Livres) et tout un tas de nouveautés dans les applications déjà existantes.

Mais je ne vais pas refaire les notes de version, qui ont été traduites en français, et que je vous invite à lire.

Une autre bonne nouvelle, pour le futur de GNOME, c’est la récente embauche par Red Hat de nouveaux développeurs, qui travailleront à temps plein sur GNOME et les technologies relatives au desktop sous Linux; et ce, après la récente embauche de Carlos Soriano pour travailler sur Fichiers.

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

Articles similaires

Remi Collet : PHP 7.0 en Software Collection

mercredi 25 mars 2015 à 18:50

Les RPM de la prochaine version majeure de PHP 7.0, sont disponibles dans le dépôt remi-test pour Fedora 20, 21, 22 et Enterprise Linux 6, 7 (RHEL, CentOS, ...) dans une nouvelle Software Collection (php70) permettant son installation en parallèle de la version système.

Comme je crois fortement au potentiel des SCL pour fournir un moyen simple d'installer plusieurs versions en parallèle, et qu'il me semble utile d'offrir cette possibilité pour PHP 7.0 afin de permettre aux développeurs de tester leur application, aux sysadmin de préparer une migration, ou simplement d'utiliser cette version pour une application spécifique, j'ai décidé de créer cette nouvelle SCL.

Installation :

yum --enablerepo=remi,remi-test install php70

emblem-important-2-24.pngA noter :

emblem-notice-24.pngLire aussi les autres articles concernant les SCL.

$ scl enable php70 'php -v'
PHP 7.0.0-dev (cli) (built: Mar 25 2015 14:40:01) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2015, by Zend Technologies

Comme d'habitude, vos retours sont les bienvenus, un forum dédié aux SCL est ouvert.

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

Articles similaires