All links of one day
in a single page.
<Previous day - Next day>

rss_feedDaily RSS Feed
floral_left The Daily Shaarli floral_right
——————————— Monday 02, April 2018 ———————————

Diagnostiquer et réparer une erreur SQL dans Tiny TIny RSS

Après la mise à jour de mon Tiny Tiny RSS (agrégateur de flux RSS), le script de mise à jour des flux RSS (« update_daemon2.php ») que j'exécute avec systemd crachait ceci dans les logs :

Apr  1 18:58:20 hostname update_daemon2.php[827]: PHP Fatal error:  Uncaught PDOException: There is no active transaction in /var/www/ttrss/classes/rssutils.php:1177
Apr  1 18:58:20 hostname update_daemon2.php[827]: Stack trace:
Apr  1 18:58:20 hostname update_daemon2.php[827]: #0 /var/www/ttrss/classes/rssutils.php(1177): PDO->commit()
Apr  1 18:58:20 hostname update_daemon2.php[827]: #1 /var/www/ttrss/classes/rssutils.php(190): RSSUtils::update_rss_feed('85', true, false)
Apr  1 18:58:20 hostname update_daemon2.php[827]: #2 /var/www/ttrss/update.php(199): RSSUtils::update_daemon_common(50)
Apr  1 18:58:20 hostname update_daemon2.php[827]: #3 {main}

Au début, seuls deux flus RSS étaient concernés. Puis, progressivement, tous les flux ont été concernés…

On peut supposer qu'il y a une requête SQL mal formée dans le lot de requêtes qui forme la transaction SQL qui est validée à la ligne 1177 de rssutils.

La meilleure façon d'avoir de la visibilité sur cela est de se connecter à l'interface web de ttrss avec un compte disposant des droits d'administration et d'aller dans le menu « Actions » -> « Configuration » -> « Système » et de constater une erreur SQL qui se produit juste avant un commit SQL. Il est vain de modifier les fichiers index.php et update_daemon2.php pour y ajouter « error_reporting(-1); » en espérant voir l'erreur apparaître dans les logs du serveur web, car ttrss stocke les erreurs dans sa base de données…

Dans mon cas, cette manipulation a mis en évidence l'erreur suivante : Unknown column 'width' in 'field list'. Probablement une colonne qui a été ajoutée lors d'une mise à jour… Pour savoir laquelle, il suffit de chercher dans les fichiers du dossier « schema/versions/mysql » (ou pgsql) : grep -Ri width .. Il s'agit de 126.sql.

Il suffit de rejouer ce fichier sans la requête « update ttrss_version set schema_version = 126; » et c'est gagné.

On peut jouer les autres fichiers SQL afin de s'assurer que la base de données de Tiny Tiny RSS soit OK : mysql -u <user> -p <nom_bdd_ttrss> < 127.sql. Si une modif' a déjà été effectuée, alors la transaction SQL échouera et la base de données ne sera pas écrasée.

(Tenter de) Réparer apt / dpkg

Bon, il existe déjà des centaines de tutoriels sur ce sujet, donc je vais faire vite.

Soit une machine virtuelle qui IOwait à mort puis qui remonte automatiquement / en lecture seule. Il est impossible de le remonter en écriture avec les commandes usuelles. Je décide de reboot la machine virtuelle proprement depuis le système d'exploitation. Le shell distant m'est retiré, des démons sont arrêtés, mais ça reste bloqué à ce stade, pendant plus de 10 minutes. Je force un reboot côté hyperviseur. Au reboot, je tombe dans l'initramfs puisque le système de fichiers de la racine est en vrac… Je lance un fsck -y, je reboot… Reboot OK. Quelque temps après, j'essaye d'installer un logiciel et…

# apt-get install ncdu
Lecture des listes de paquets... Erreur !
E: Splitting of file /var/lib/apt/lists/security.debian.org_dists_stretch_updates_InRelease failed as it doesn't contain all expected parts 0 1 0
E: Les listes de paquets ou le fichier « status » ne peuvent être analysés ou lus.



Si je lance un apt-get update, j'obtiens l'erreur suivante :

Impossible d'ouvrir le fichier /var/lib/apt/lists/partial/security.debian.org_dists_stretch_updates_main_binary-amd64_Packages.xz - open (13: Permission non accordée) [IP : 2a04:4e42:1d::204 80]

Solution :

# rm -f /var/lib/apt/lists/* /var/lib/apt/lists/partial/*

Retentons :

# apt-get update
[…] 
Lecture des listes de paquets... Erreur !
E: Problem parsing dependency 47
E: Erreur apparue lors du traitement de mount (NewVersion2)
E: Problem with MergeList /var/lib/dpkg/status
E: Les listes de paquets ou le fichier « status » ne peuvent être analysés ou lus.

De même, dpkg ne semble pas être en forme :

dpkg --get-selections
dpkg: erreur: analyse du fichier '/var/lib/dpkg/status' vers la ligne 6135 paquet 'mount' :
 champ « Pre-Depends », référence à « libc6 » : version contenant «   » 

En effet, si l'on ouvre /var/lib/dpkg/status avec un éditeur de texte, on constate qu'il est corrompu : y'a du n'importe quoi en plein milieu du fichier, après le paquet « mount ». La fin du fichier est également tronqué (il se termine en plein milieu d'une description d'un paquet).

Le fichier /var/lib/dpkg/status-old permet de gérer ce genre de cas… Sauf qu'il est corrompu lui aussi (il commence en plein milieu d'une description d'un paquet). Pas aux mêmes endroits, mais corrompu tout de même. Les deux fichiers ne permettent pas d'avoir une vue d'ensemble correcte des paquets installés…

On peut tenter de reconstruire le fichier status avec un script, à partir des infos contenues dans /var/lib/dpkg/info, mais je n'ai aucune idée de la fiabilité et de la viabilité de cette méthode.

J'ai une sauvegarde du fichier status en date du 10 décembre 2017. Je décide de l'utiliser. Mais, si je tente d'installer un paquet, je reçois des milliers de lignes de la forme :

Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, <__ANONIO__> line 1.
Use of uninitialized value $item in hash element at /usr/share/perl5/Debconf/DbDriver/File.pm line 85, <__ANONIO__> chunk 10.
Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, <__ANONIO__> line 589.
Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, <__ANONIO__> line 18841.
Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, <__ANONIO__> line 18842.
Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, <__ANONIO__> line 18843.
Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, <__ANONIO__> line 18844.



Je dispose d'une sauvegarde complète de cette machine en date du 10 décembre 2017. Je pourrais tout restaurer d'un coup pour en finir… D'autant que rien a changé sur la machine depuis cette date… Mais d'un côté, c'est "amusant" d'essayer de s'en sortir. D'autant que cette machine sert environ à rien, donc ce n'est pas grave si elle devient instable dans quelques mois à cause de ma tentative de réparation…

Je décide de mettre à jour les paquets, afin que la version indiquée dans le fichier status corresponde à ce qui est réellement installé. Ben, oui, la version mineure de Stretch, 9.4, est sortie entre ma sauvegarde du fichier status et aujourd'hui.

# apt-get upgrade
# apt-get dist-upgrade

Évidemment, je ne me focalise pas sur la palanquée d'erreurs qui est affichée et je refuse toutes les demandes de remplacement de fichiers de conf'.



Maintenant, je vais m'occuper des erreurs suivantes :

dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « libapache2-mod-php5 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php-auth » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « softhsm » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « mysql-client-5.5 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-mysql » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « libsofthsm » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « libclamav7 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-pspell » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « softhsm-common » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-json » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-readline » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-intl » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « libiperf0 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « mysql-server-core-5.5 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-mcrypt » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « libperl5.20 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « apache2-mpm-prefork » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-imap » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-cli » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-gd » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « linux-image-3.16.0-4-amd64 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-common » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-sqlite » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé

Nous pouvons déjà faire semblant de désinstaller les paquets qui n'existent plus dans Stretch (il est possible que certains paquets aient déjà été supprimés lors de l'upgrade/dist-upgrade précédent, auquel cas il faut les retirer de la liste au compte-gouttes) :

# apt-get remove libapache2-mod-php5 php5-mysql php5-pspell php5-json php5 php5-cli php5-readline php5-intl php5-mcrypt php5-imap php5-gd php5-common php5-sqlite libsofthsm linux-image-3.16.0-4-amd64 apache2-mpm-prefork php-auth mysql-client-5.5 mysql-server-core-5.5

Continuons avec les logiciels que je n'utilise plus dans cette version :

# apt-get remove softhsm softhsm-common

Terminons en réinstallant les paquets encore utilisés, mais qui sont en erreur :

# apt-get install --reinstall libclamav7 libiperf0



Attaquons-nous maintenant aux avertissements suivants (extrait) :

debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/uucp/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/games/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/mail/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/www-data/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/list/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/proxy/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/gnats/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/news/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/bin/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/sys/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/backup/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/daemon/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/nobody/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/irc/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/man/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/lp/shell/_bin_sh/_usr_sbin_nologin.

Pour réparer, utilisons la commande suivante :

# /usr/share/debconf/fix_db.pl



Et voilà, nous avons enfin terminé ! \o/

xkcd: Star Lore

Hahahaha. :'D

‒ That cluster was known to the ancients as the five sisters.
‒ The red one is a supergiant, and will probably explode within the next million years.
‒ Wow!
There are too many status LEDs in my room.
That one is a variable star which pulses every 30 seconds. Its name comes from a Greek word meaning "smoke alarm."

-