Comment changer le thème wordpress depuis la base de données

Cet article vous explique comment changer le thème WordPress directement depuis la base de donnée.

Il m’est arrivé de travailler sur un thème wordpress qui utilisait une librairie spécifique pour gérer les templates, Timber. Timber permet d’utiliser des vues au format  twig ce qui est nettement plus propre et maintenable que le PHP que l’on voit dans l’écrasante majorité des thèmes.

Lors de l’installation d’une instance spécifique, le plugin Timber a était désactivé, ce qui fait que WordPress ne bootait plus du tout, que ce soit le front ou l’admin.

L’astuce pour pouvoir accéder à l’admin dans ce genre de cas consiste à changer le thème courant directement dans la base de données.

Pour cela, vous devez changer 2 variables de la table wp_options, template et stylesheet.

Pour afficher le contenu actuel de ces 2 variables

SELECT * FROM wp_options WHERE option_name = 'template';
SELECT * FROM wp_options WHERE option_name = 'stylesheet';

Changer le theme wordpress depuis la base de données

UPDATE wp_options SET option_value = 'spun' WHERE wp_options.option_id = 44;
UPDATE wp_options SET option_value = 'spun' WHERE wp_options.option_id = 45;

WordPress en ligne de commande

Il existe une autre technique pour manipuler l’installation d’un wordpress, l’interface en ligne de commande, wp.

Ce client permet de faire à peut prêt n’importe quoi sur son installation, comme ajouter, mettre à jour supprimer des plugins. Cela m’a sauvé plus d’une fois lorsqu’un plugin non à jour empêcher wordpress de fonctionner complètement.

Vous pouvez aussi manipuler directement le core de WordPress comme faire une mise à jour, et plus globalement manipuler n’importe quel entité de WordPress, un post, une taxonomie, etc…

 

Ping sur un sous-réseau avec bash

Afin de détecter si des adresses IP d’un réseau sont disponibles ou occupés, il peut être utile de faire un ping sur un sous-réseau ou sur une plage d’adresses donnée.

Par exemple sur un réseau local derrière une box d’accès, le principe est d’effectuer un ping sur les adresses ip possibles :

$ ping 192.168.1.2
$ ping 192.168.1.3
...

Faire une boucle simple

ping boucle avec bash for

Avec une boucle bash, on peut utiliser la commande suivante :

$ for ip in `seq 2 254`; do ping -c1 -t1 192.168.0.${ip}; done

Le résultat n’est pas très parlant et l’exécution assez lente à cause des timeouts possibles.

Améliorer la boucle

Pour améliorer la commande, on va filtrer le résultat de la commande ping et se servir du code de retour de la commande pour afficher les IP qui ont répondu.

$ for ip in `seq 2 254`; do (ping -c1 -t1 192.168.1.${ip} > /dev/null 2>&1 && echo 192.168.1.${ip} &); done

ping boucle avec bash for fork

 

 

Rails 4 : exécuter une application dans un sous-répertoire avec Nginx

Cet article détaille la configuration Nginx et Rails pour faire tourner une application Rails dans un sous-répertoire.

Contexte

On ne va pas discuter ici si nous utilisons la meilleure architecture pour ce cas de figure mais  comment configurer un environnement existant pour faire fonctionner notre application dans un sous-répertoire.

L’application utilise Rails 4 et est servie par thin.

  • L’ancienne url de l’application : http://www.mydomain.com
  • La nouvelle url de l’application : http://www.mydomain.com/fr
  • Nginx écoute sur le port 80 et sert de reverse proxy vers un cluster thin qui sert l’application Rails

Configuration de Rails

config.ru

  • config.ru avant
# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment', __FILE__)
run Rails.application
  • config.ru après
map MyApp::Application.config.relative_url_root || "/" do
    run Rails.application
end

config/application.rb

Pour servir votre application dans un sous-répertoire, il faut utiliser l’option relative_url_root.

Cette option se change dans le fichier config/application.rb

config.relative_url_root = "/fr"

Configuration de Nginx

La configuration a été modifiée pour changer le « location / » en « location /fr ».

Nous avons rajouté un règle de réécriture pour gérer les assets rails qui sont servis directement par Nginx.

  • La configuration de notre vhost nginx
upstream thin_cluster {
    server unix:/var/www/myapp/shared/tmp/sockets/thin.0.sock;
    server unix:/var/www/myapp/shared/tmp/sockets/thin.1.sock;
}

server {
    listen 80;
    server_name  www.mydomain.com

    root /var/www/myapp/current/public;
    index.html;

    location ~ ^/fr/assets/  {
            rewrite ^/fr(.*)$ $1 last;
    }

    location /fr {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host:$server_port;
        proxy_redirect off;

        if (-f $request_filename/index.html) {
            rewrite (.*) $1/index.html break;
        }

        if (-f $request_filename.html) {
            rewrite (.*) $1.html break;
        }

        if (!-f $request_filename) {
            proxy_pass http://thin_cluster;
            break;
        }
    }
}

 

 

Changer le mot de passe root MySQL sur Ubuntu 16.04

Cet article vous décrit la procédure pour changer le mot de passe root MySQL sur Ubuntu 16.04.

Lorsque vous installez MySQL sur Ubuntu (16.04), l’installation vous demande de fixer un mot de passe pour le compte root MySQL. Il peut arriver que si vous générez un mot de passe aléatoire que certains caractères ne passent pas bien dans la boite de dialogue prévue à cet effet. Vous vous retrouvez alors dans l’impossibilité de vous connecter en root sur votre nouvelle installation.

Désactiver l’authentification MySQL

Pour changer le mot de passe root MySQL, il faut d’abord désactiver l’authentification MySQL afin de pouvoir se connecter.

Cette opération est possible grâce à l’option skip-grant-tables

Editez le fichier /etc/mysql/mysql.conf.d/mysqld.cnf et ajoutez cette option dans la section [mysqld]

[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
skip-grant-tables

Redémarrer mysql :

$ /etc/init.d/mysql restart

Changer le mot de passe root MySQL

Vous pouvez maintenant vous connecter sans mot de passe. Exécutez la console mysql en ligne de commande pour changer le mot de passe comme suit :

$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.16-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use mysql;

mysql> UPDATE user SET authentication_string = PASSWORD('password'), password_expired = 'N' WHERE User = 'root' AND Host = 'localhost';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Réactivez l’authentification MySQL

Editez le fichier /etc/mysql/mysql.conf.d/mysqld.cnf et enlevez l’option skip-grant-tables.

Redémarrez mysql, l’authentification et votre mot de passe root MySQL sont à jour

$ /etc/init.d/mysql restart

 

Restriction d’accès par IP ou password avec Nginx

Cet article vous montre comment configurer la restriction d’accès à votre serveur web Nginx à une ou plusieurs adresses IP de votre choix.

Configuration de la restriction d’accès

La configuration du site par défaut se trouve dans /etc/nginx/sites-available/default

La section qui nous intéresse est le location

location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
 }

Il faut ajouter les règles d’accès. Ici on autorise une adresse IP et on exclut tout le reste.

location / {
    # bureau
    allow 2a01:xxxx:51e:xxxx:14d:xxxx:9146:xxxx;
    # Deny the rest of the world
    deny all;

    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
 }

Test de la configuration Nginx

Avant d’activer une nouvelle configuration, il est toujours utile de bien s’assurer que la configuration est correcte et qu’il n’y a pas d’erreur de syntaxe dans le fichier.

Pour effectuer ce test, il faut utiliser le paramètre configtest avec le script de démarrage :

$ /etc/init.d/nginx configtest
* Testing nginx configuration
...done.

Si vous avez une erreur dans votre fichier de configuration, comme par exemple un ‘;’ oublié, le test va vous l’indiquer de la façon suivante :

$ /etc/init.d/nginx configtest
 * Testing nginx configuration
   ...fail!

Vérifiez les logs pour obtenir un message plus explicite :

$ tail /var/log/nginx/error.log
 [...]
 2016/11/22 10:39:05 [emerg] 14733#14733: invalid number of arguments in "allow" directive in /etc/nginx/sites-enabled/default:47

 

Recharger la configuration Nginx :

$ /etc/init.d/nginx reload

Vous pouvez aussi recharger la configuration avec le binaire Nginx :

$ nginx -s reload

Vous pouvez vérifier dans les logs Nginx que la configuration a bien été rechargée :

$ tail /var/log/nginx/error.log
[...]
2016/11/22 10:32:32 [notice] 14665#14665: signal process started

Test de la restriction d’accès

On peut tester la configuration depuis une IP externe :

$ curl -I http://vm.domain.com/
HTTP/1.1 403 Forbidden
Server: nginx/1.10.0 (Ubuntu)
Date: Tue, 22 Nov 2016 09:12:41 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive

Restriction d’accès par mot de passe

Pour créer un fichier de mot passe au format utilisé par Apache, vous pouvez utiliser la commande openssl :

$ printf "USER:$(openssl passwd -crypt)\n" >> .htpasswd

La fonction -crypt limite les mots de passe à 8 caractères

Pour des mots de passe plus long, utilisez la fonction -apr1

$ printf "USER:$(openssl passwd -apr1)\n" >> .htpasswd

Les 2 commandes précédentes vont vous demander le mot de passe de manière interactive dans le terminal.
Pour scripter cette commande, vous pouvez indiquer directement le mot de passe :

$ printf "USER:$(openssl passwd -apr1 PASSWORD)\n" >> .htpasswd

Attention, en utilisant cette dernière commande, vous pouvez faire apparaitre votre mot de passe dans l’historique du shell.

Configuration de Nginx pour l’accès par mot de passe

Il faut modifier votre section « location » pour indiquer à Nginx d’utiliser un fichier d’authentification:

location / {
    satisfy any;
    deny all;

    auth_basic "private";
    auth_basic_user_file /var/www/.htpasswd;

    try_files $uri $uri/ =404;
}

Configurer Nginx pour restreindre l’accès par IP ou par mot de passe

Dans cette configuration vous pouvez whitelister une ou plusieurs adresses IP et quand même laisser la possibilité de se connecter via un mot de passe si vous n’avez pas d’IP fixe.

location / {
    satisfy any;
    allow 111.222.333.444;
    deny all;

    auth_basic "private";
    auth_basic_user_file /var/www/.htpasswd;

    try_files $uri $uri/ =404;
}

WordPress: désactiver le versioning des articles

WordPress intègre un mécanisme de gestion de version des articles et pages que vous publiez. A chaque fois que vous enregistrez un article, la version précédente est conservée. Cela permet de revenir en arrière ou de récupérer du contenu qui aurait été effacé par mégarde.

Dans certains contextes vous pouvez avoir besoin de désactiver cette fonctionnalité. Pour ma part, c’est pour un blog sauvegardé quotidiennement et dont les articles sont d’abord rédigés dans google docs. L’idée ici est de ne pas encombrer la base de données avec des révisions dont on ne se sert pas.

Désactiver la gestion des versions

La désactivation se fait simplement dans le fichier de config wp-config.php en ajoutant la ligne suivante :

define(’WP_POST_REVISIONS’, false);

Nettoyage des anciennes révisions

Si vous désactivez la gestion des révisions sur une base déjà en place, vous pouvez effacer les révisions existantes pour nettoyer la base de données.

Une première méthode est d’utiliser un plugin conçu pour cette tâche :

  • WP Optimize qui permet aussi de faire tout un tas d’autres choses

Sinon vous pouvez aussi le faire directement dans la base de données :

DELETE FROM wp_posts WHERE post_type = "revision";

DELETE a,b,c
 FROM wp_posts a
 LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
 LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
 WHERE a.post_type = "revision";

La 1ere requête permet de supprimer les révisions et la seconde les meta-données associées à ces révisions.

 

ffmpeg: commandes utiles

Extraire les images d’une vidéo

ffmpeg -i vI5pVmJz7Co.mp4 -r 1/1 snapshots/snap%04d.jpg
  • -i le fichier source
  • snapshots/snap%04d.jpg le nomage des images extraites.

Assembler des images pour faire une vidéo

ffmpeg -start_number 2789 -i _MG_%04d.JPG -c:v libx264 -pix_fmt yuv420p jour1.mp4
  • -start_number 2789  la première image à traiter est _MG_2789.JPG
  • -c:v libx264 utiliser l’encodeur utilise le codec libx264
  • -qp 0 qualité maximale
  • -pix_fmt yuv420p le format des pixels
  • jour1.mp4 le fichier de sortie

 

Convertir une vidéo

ffmpeg -i A017_C001_0903K7.mov -qscale 1 A017_C001_0903K7.mp4
  • -qscale 1 qualité maximale. Ce chiffre est compris entre 1 (meilleure qualité/fichier large) et 31 (qualité minimale/fichier plus petit).
  • le format de sortie est déduit de l’extension

Supprimer le son d’une vidéo

ffmpeg -i home.mp4 -vcodec copy -an home.mp4
  • -vcodev copy permet de ne pas ré-encoder la vidéo

Retailler des images en masse avec mogrify

Mogrify est un outil de la suite ImageMagick qui permet de manipuler des images.

Il permet de manipuler des images en masse, ce qui peut-être utile lorsque vous manipuler des bibliothèques importantes.

Par exemple, suite à un shooting, j’ai une centaine de photos en TIF à disposition qui pèsent chacune une centaine de mégas. Ce n’est pas très pratique pour avoir un aperçu rapide de ce que l’on dispose.

Grâce à mogrify je peux créer des aperçus JPEG de moindre poids facilement manipulables.

Exemple de commande :

mogrify -format jpg -quality 81 -resize 50% -path SD/ *.tif

Ici, je prends toutes les images TIF (*.tif) du répertoire courant et je les convertis en JPEG (-format jpg) avec une qualité de 81% (-quality 81) tout en les retaillant à 50% de leur taille originale.

Enfin je les place dans un sous-répertoire (-path SD/) pour les distinguer de mes originales.

 

WordPress : load important à cause de la tâche cron

Premiers symptômes

Le blog est down!!

Voilà ce que j’ai pu observer sur un serveur hébergeant un site sous WordPress :

$ w

18:21:28 up 104 days, 2:05, 3 users, load average: 121.49, 116.51, 105.74
[...]

$ tail -f access.log | grep_and_awk_magic
[...]
xxx.xxx.xxx.xxx - - [23/Aug/2016:18:16:59 +0200] "POST /wp-cron.php?doing_wp_cron=1471968693.4946770668029785156250 HTTP/1.0" 200 - "-" "WordPress/4.5.3; http://leblog.com" 224/224821178
xxx.xxx.xxx.xxx - - [23/Aug/2016:18:16:59 +0200] "POST /wp-cron.php?doing_wp_cron=1471968692.3692688941955566406250 HTTP/1.0" 200 - "-" "WordPress/4.5.3; http://leblog.com" 224/224903575
xxx.xxx.xxx.xxx - - [23/Aug/2016:18:18:17 +0200] "POST /wp-cron.php?doing_wp_cron=1471968868.4862370491027832031250 HTTP/1.0" 200 - "-" "WordPress/4.5.3; http://leblog.com" 148/148257345
xxx.xxx.xxx.xxx - - [23/Aug/2016:18:17:22 +0200] "POST /wp-cron.php?doing_wp_cron=1471968716.2659339904785156250000 HTTP/1.0" 200 - "-" "WordPress/4.5.3; http://leblog.com" 203/203774409
[...]

Comme c’est bizarre… la machine s’appelle elle-même…

Pour effectuer des tâches périodiques, WordPress utilise un système où à chaque requête il exécute un mécanisme pour vérifier si il y a des tâches à déclencher.

Malheureusement, en cas de fort traffic, il se peut que ce système ce tire une balle dans le pied en augmentant la charge du serveur.

Correction du problème

Pour corriger le problème, vous pouvez désactiver tout simplement ce mécanisme dans la configuration WordPress et mettre en place une tâche cron des familles.

wp-config.php

define('DISABLE_WP_CRON', true);

crontab -e

42 * * * *      cd /blog && php wp-cron.php

 

Curl: silence, on dort

curl-silencieux

Lors de l’utilisation de curl dans des tâches cron, il est parfait nécessaire de le rendre silencieux.

Pour cela, il faut utiliser le paramètre « -s » pour rendre curl silencieux et rediriger la sortie standard vers /dev/null

Exemple :

curl -s http://fr.charles.lescampeurs.org/ > /dev/null