Quelques astuces diverses, septième
J’aime mon métier. On est jamais une semaine sans faire quelque chose de nouveau, de bricoler certaines commandes, de gagner du temps dans l’absolu, de devoir contourner une limitation bizarre. Bref, vous l’avez compris, y’a toujours des choses à apprendre, et il serait idiot de ne pas partager tout ça.
Nettoyer les fichiers temporaires de Rsync
Après un rsync foireux (sans utiliser –append-verify), beaucoup de fichiers partiels sont restés sur le serveur de destination. Ce sont de simples fichiers cachés, pour les nettoyer, c’est pas compliqué :
1 |
find /dir/to/search/ -type f -iname ".*" -ls |
Attention toutefois si des fichiers cachés légitimes se trouvent dans ces dossiers (.htaccess par exemple).
Synchroniser uniquement les permissions d’une arborescence depuis un backup
J’ai eu l’occasion de devoir uniquement réparer les permissions d’une arborescence après un chmod 755 malencontreux sur tous les dossiers d’un client (cassant des dépots Git, des traitements automatisés…). Contrairement à ce qu’on pense, ce n’est pas rsync qui va faire le taf à partir du backup :
1 2 3 |
$ cd /mnt/backup/www $ find . ! -type l -exec chmod -v --reference='{}' /www/'{}' \; $ find . ! -type l -exec chown -v --reference='{}' /www/'{}' \; |
Bien évidemment j’ai compris ça après avoir fait mon rsync…
Python/virtualenv : faire en sorte qu’un venv puisse exploiter les modules « globaux »
Un problème que j’ai découvert avec virtualenv, c’est que si on installe un module via le gestionnaire de paquets, donc accessible via tout le système, ce n’est pas le cas pour vos environnements virtuels Python, du moins par défaut. Pour corriger ce petit souci, il faut mettre à jour son environnement avec la commande suivante :
1 |
virtualenv --system-site-packages <nom_du_venv> |
Évidemment l’alternative est d’installer le module au sein du virtualenv 😀
Utilisateur en lecture seule pour mysqlump
Un collègue a pensé que le SELECT était suffisant pour un utilisateur en lecture seule destiné à faire des dumps. Il n’était pas si loin :
1 |
mysql> GRANT SELECT, LOCK TABLES ON 'user'@'host'; |
diff au travers d’SSH
Quand vous devez comparer le contenu de deux fichiers, diff est un des outils les plus pratiques pour identifier les points à corriger. Il y a par contre quelques subtilités quand les deux fichiers en question ne se trouvent pas sur le même serveur :
1 2 3 4 5 6 7 8 |
Avec une clé SSH sans passphrase : diff foo <(ssh myServer 'cat foo') Si besoin d'un mot de passe : vimdiff /path/to/file scp://remotehost//path/to/file ssh [login]@[host] "cat [remote file]" | diff - "[local file]" |
Vérifier la date d’un certificat SSL/TLS avec OpenSSL
Soit vous utilisez votre navigateur, mais c’est lent (chargement complet du site, plusieurs clics pour afficher le contenu du certificat), un peu plus rapide avec une extension comme Calomel SSL Validation, sinon, inévitablement OpenSSL revient sur le tapis :
1 2 3 |
[seboss666@SebLBNvm ~ ]$ echo | openssl s_client -servername blog.seboss666.info -connect blog.seboss666.info:443 2>/dev/null | openssl x509 -noout -dates notBefore=Jul 7 00:00:00 2017 GMT notAfter=Sep 5 23:59:59 2019 GMT |
Relancer automatiquement la connexion MySQL pour votre API en Python
Je suis en train de réécrire l’API pour collect que j’avais commencé à l’époque, toujours en Python, mais avec Flask au lieu de Bottle, et en conservant la base MySQL plutôt que MongoDB. Mais une chose à laquelle je ne m’attendais pas, c’était que la connexion pourtant persistante que mon application crée lors du lancement finit par être coupée (par MySQL probablement). Et par défaut, il ne la rétablit pas, pour ça, il suffit d’ajouter une petite ligne au début de votre code :
1 2 |
base = mdb.connect('127.0.0.1', 'user', 'pass', 'base') base.ping(True) |
Drupal : lister les modules installés avec Drush
Le site d’un client m’envoyait les logs Drupal dans /var/log/messages (très, très dégueulasse on est d’accord), en lui demandant de changer ce paramètre l’agence nous dit qu’il n’y a rien à faire côté Drupal. Pas de bol, après un grep dégueu j’ai identifié le module coupable . Mais il y a plus propre avec drush :
1 2 |
[www-data@client-p-web01:~/www/current/src]$ drush @sites pm-list --yes --type=module --status=enabled |grep syslog Core Syslog (syslog) 7.56 |
Forcer le type d’un fichier particulier avec Nginx
Quand on peut pas installer le module more_headers, et qu’nginx force application/octet-stream, un simple add_header ne suffit pas, il faut jouer un peu plus :
1 2 3 4 |
location /download/ { types { } default_type text/plain; } |
Whitelister le dossier .well-known pour Let’s Encrypt sur Nginx
Nginx toujours. Un client a empêché que ses certificats Let’s Encrypt soient renouvelés en ajoutant des règles de sécurité. Combiné avec une redirection forcée vers HTTPS, c’est une catastrophe. Pour empêcher Nginx de me renvoyer lors du challenge ACME, j’ai dû adapter un peu la configuration :
1 2 3 4 5 6 7 8 |
server { listen 80; server_name domain.tld; root /var/www/; location ~ ^/(?!\.well-known) { return 301 https://$server_name$request_uri; } } |
Je vous laisse vous torturer l’esprit pour comprendre la regex 😛 Le résultat est là : pas de redirection HTTPS lors du challenge ACME, et le renouvellement a pu se faire.
Comme d’habitude, si vous avez vous aussi des bricoles rapidos comme ça à partager, les commentaires complètent très bien 🙂 (ou au pire envoyez par mail, j’inclue dans un prochain billet en vous citant)