vendredi 29 juin 2018

Etendre une partition LVM avec un nouveau disque

De plus en plus on utilise par défaut LVM (Logical Volume Manager) pour gérer les disques logiques d'une machine linux, ce qui apporte beaucoup de souplesse.

Le gros avantage est de pouvoir redimensionner les partitions à la volée. Dans mon cas, le but est d'ajouter un disque sur une machine et que son espace soit intégré au disque logique principal. C'est extrêmement rapide et simple, une fois que l'on connait les commandes de bases.

Lorsque vous ajoutez un disque sous linux, vous ne savez pas quel point de montage lui a été attribué. Pour le retrouver:

[email protected]:~# lsblk
NAME                                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0                                   2:0    1     4K  0 disk
sda                                   8:0    0    40G  0 disk
├─sda1                                8:1    0   243M  0 part /boot
├─sda2                                8:2    0     1K  0 part
└─sda5                                8:5    0  39,8G  0 part
  ├─debian-root   254:0    0 288,1G  0 lvm  /
  └─debian-swap_1 254:1    0   1,7G  0 lvm  [SWAP]
sdb                                   8:16   0   250G  0 disk
sr0                                  11:0    1  1024M  0 rom

Notre disque est le sdb Utilisez fdisk (ou cfdisk) pour créer sa partition principale (/dev/sdb1). Nous pouvons maintenant le préparer pour LVM:

[email protected]:~# pvcreate /dev/sdb1
[email protected]:~# pvscan
  PV /dev/sda5   VG debian   lvm2 [39,76 GiB / 0    free]
  PV /dev/sdb1                      lvm2 [250,00 GiB]
  Total: 2 [289,76 GiB] / in use: 1 [39,76 GiB] / in no VG: 1 [250,00 GiB]

Nous voyons que nous avons maintenant 2 partitions lvm, dont une qui n'est pas utilisée du tout, ni attribuée. Encore quelques petites commandes et le tour est joué: Tout d'abord, on ajoute /dev/sdb1 au virtual group (vg):

[email protected]:~# vgextend debian /dev/sdb1
  Volume group "debian" successfully extended
[email protected]:~# pvscan
  PV /dev/sda5   VG debian   lvm2 [39,76 GiB / 0    free]
  PV /dev/sdb1   VG debian   lvm2 [250,00 GiB / 250,00 GiB free]
  Total: 2 [289,75 GiB] / in use: 2 [289,75 GiB] / in no VG: 0 [0   ]

Maintenant, on va étendre le volume logique:

[email protected]:~# lvextend /dev/debian/root /dev/sdb1
  Size of logical volume debian/root changed from 38,10 GiB (9753 extents) to 288,09 GiB (73752 extents).
  Logical volume root successfully resized

Et le dernier point: nous allons étendre le filesystem du volume pour qu'il occupe tout l'espace disponible:

[email protected]:~# resize2fs /dev/debian/root
resize2fs 1.42.12 (29-Aug-2014)
Le système de fichiers de /dev/debian/root est monté sur / ; le changement de taille doit être effectué en ligne
old_desc_blocks = 3, new_desc_blocks = 19
Le système de fichiers sur /dev/debian/root a maintenant une taille de 75522048 blocs (4k).

Et le tour est joué, vous pouvez le vérifier avec un df -h

lundi 23 octobre 2017

Nginx: répertoire par sous-domaine

Cette petite astuce permet de simplifier la gestion des sous-domaines sur nginx, et surtout ne pas avoir à modifier sa configuration à chaque fois que l'on crée ou supprime un sous-domaine.

Elle exploite la possibilité de nginx d'utiliser des expressions rationnelles dans le nom du serveur.

Configuration

server {
        listen 80;
        server_name ~^(?<subdomain>([^\.]+))\.domaine\.com$;
        if (!-d /home/domain/public_html/$subdomain) {
                rewrite . http://domain.com redirect;
        }
        root /home/domain/public_html/$subdomain;
        index index.php index.html;
        location / {
                try_files $uri $uri/ /index.php?$args;
        }
        access_log /var/log/nginx/domain.dynam.access.log;
        error_log /var/log/nginx/domain.dynam.error.log;
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_index index.php;
                include fastcgi.conf;
        }
        location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|txt|xml)$ {
                access_log off;
                expires 30d;
        }
}

Explications

URL appelée

server_name ~^(?<subdomain>([^\.]+))\.domaine\.com$;

Cette directive permet de capturer dans la variable $subdomain tout ce qui précède .domaine.com dans l'url appelée. Notez qu'elle ne prend pas en compte l'appel http://domaine.com qui sera notre adresse par défaut et doit donc être traitée par un autre bloc de configuration.

Redirection par défaut

if (!-d /home/domain/public_html/$subdomain) {
   rewrite . http://domain.com redirect;
}

Cette directive est connue des habitués des scripts shell: s'il n'existe pas de sous-répertoire correspondant au sous-domaine, on redirige (de manière visible) l'utilisateur sur l'url par défaut.

Définition du répertoire source

root /home/domain/public_html/$subdomain;

On définit de manière dynamique le répertoire source, toutes les directives suivantes l'utiliseront.

mercredi 4 janvier 2017

Bloquer des pays sur Nginx

Depuis un certains temps, mes différents sites se font spammer par des robots provenant en particulier de 3 pays, à savoir la Chine, l’Afghanistan et l'Iran.

Utilisant un compte Cloudflare gratuit, je n'ai pas la possibilité de les bloquer via l'interface, je suis donc obligé de faire cela via la configuration de nginx. J'en ai donc profité pour faire un petit script qui automatise la liste des IP à bannir pour gérer ça d'une manière plus simple.

Lire la suite...

vendredi 28 octobre 2016

MyBB 1.8 - Plugin GeSHi (Generic Syntax Highlight)

J'avais développé il y a fort longtemps un plugin pour intégrer GeSHi dans MyBB 1.6.

MyBB a changé de version, le plugin n'est plus compatible et souffrait de quelques bugs. Aujourd'hui, voici la nouvelle version fonctionnelle.

Lire la suite...

lundi 10 octobre 2016

Décrypteur de log rsync

Comme beaucoup de monde, j'utilise rsync de manière automatisée pour effectuer mes sauvegardes mais les logs sont difficilement interprétables d'un simple regard. J'ai donc décidé de me faire un petit analyseur qui me permettra d'avoir un rendu bien plus lisible. Et en couleur pour que ce soit encore plus visuel.

Le rendu sera, pour chaque ligne de log rsync:

  • l'action effectuée (upload, download, suppression, modification ou ignore)
  • le type de contenu (fichier, répertoire, lien symbolique)
  • le nom du contenu traité
  • les raisons de la modification

A la fin de l'analyse, un comptage des différentes actions sera affiché.

Lire la suite...

dimanche 9 octobre 2016

Log coloré en TCL

Pour faire suite au billet Log coloré en PHP, voici la version utilisable en TCL.

Je me suis appuyé sur une astuce donnéesur wiki.tcl.tk et tout particulièrement sur la proposition d'Andy Goth.

Code

namespace eval d {
   variable levels {"error" "warning" "notice" "debug" "info" "success"}
   foreach {name value} {r 1 g 2 b 4 c 6 m 5 y 3} {
      proc $name {} "return \033\\\[01\\;3${value}m"
      proc [string toupper $name] {} "return \033\\\[01\\;4${value}m"
   }
   proc n {} {return \033\[\;0m}
   proc puts {text {level ""}} {
      switch -nocase $level {
         "error" { ::puts "[r]$text[n]" }
         "warning" { ::puts "[y]$text[n]" }
         "notice" { ::puts "[c]$text[n]" }
         "debug" { ::puts "[m]$text[n]" }
         "info" { ::puts "[b]$text[n]" }
         "success" { ::puts "[g]$text[n]" }
         default { ::puts "$text" }
      }
   }
}

Utilisation

Voici un petit script de test:

#/usr/bin/tclsh
source debugger.tcl
foreach level $::d::levels {
   ::d::puts "Level is set to $level" $level
}

Le rendu sera:

Level is set to error
Level is set to warning
Level is set to notice
Level is set to debug
Level is set to info
Level is set to success

lundi 8 août 2016

[MàJ] Adapter la présentation de Weechat

Si vous utilisez weechat comme client IRC, peut-être n'appréciez-vous pas que la fenêtre de tchat soit alignée sur le pseudonyme le plus long et préférez une présentation sans alignement.

Cela peut se faire en trois réglages:

/set weechat.look.prefix_align none
/set irc.look.nick_prefix <
/set irc.look.nick_suffix >

Si vous voulez revenir à la présentation d'origine, il vous suffit de faire:

/set weechat.look.prefix_align right
/set irc.look.nick_prefix ""
/set irc.look.nick_suffix ""

Bien entendu, pensez à sauvegarder après avoir fait les changements.

Mise à jour

Depuis quelques versions de weechat, look.nick_prefix et look.nick_suffix dépendent de weechat et non pas du module irc. Il faut donc adapter le code ci-dessus en:

/set weechat.look.prefix_align none
/set weechat.look.nick_prefix <
/set weechat.look.nick_suffix >

jeudi 4 août 2016

Comparaisons des Raspberry Pi

J'ai trouvé sur Wikipédia un tableau comparatif des Raspberry Pi, et je me suis dit que ce serait intéressant de l'avoir à portée de main.

Lire la suite...

jeudi 28 juillet 2016

Log coloré avec PHP en console (PHP-CLI)

Il arrive que l'on fasse des scripts PHP qui doivent fonctionner en console, mais l'affichage est terne (blanc sur fond noir) et ne permet pas de mettre en valeur les messages importants.

J'ai donc créé une fonction log qui permet de coloriser le texte affiché sur une console linux. Elle fonctionne aussi avec MobaXterm, je ne l'ai pas testée avec cygwin.

La fonction

/*
 * Display a colored message, based on level
 * @var string $message The message to display
 * @var string $level The level (none, success, info, warning, error)
 * @var array $disp An array of informations to display
 * @void
 */
function log($message, $level='', $disp=array('class'=>true, 'function'=>true, 'file'=>true, 'line'=>true)) {
    $c = array(
        'r' => "\033[31m",
        'g' => "\033[32m",
        'b' => "\033[34m",
        'y' => "\033[33m",
        'n' => "\033[0m"
    );
    $bt = debug_backtrace();
    $caller = array_shift($bt);
    $precaller = array();
    if (count($bt)>0) {
        $precaller = array_shift($bt);
    }
    $prefixes = array();
    if ($disp['class'] === true && array_key_exists('class', $precaller)) { $prefixes[] = $precaller['class']; }
    if ($disp['function'] === true && array_key_exists('function', $precaller)) { $prefixes[] = $precaller['function']; }
    if ($disp['file'] === true && array_key_exists('file', $precaller)) {
        $prefixes[] = $precaller['file'];
    } elseif ($disp['file'] === true) {
        $prefixes[] = $caller['file'];
    }
    if ($disp['line'] === true) { $prefixes[] = $caller['line']; }
    $prefix = implode('::', $prefixes).'::';
    switch($level) {
        case 'success': echo $c['g'], $prefix, ' ', $message, $c['n'], PHP_EOL; break;
        case 'info': echo $c['b'], $prefix, ' ', $message, $c['n'], PHP_EOL; break;
        case 'warning': echo $c['y'], $prefix, ' ', $message, $c['n'], PHP_EOL; break;
        case 'error': echo $c['r'], $prefix, ' ', $message, $c['n'], PHP_EOL; break;
        default: echo $prefix, ' ', $message, PHP_EOL; break;
    }
}

Explications

Les couleurs

On crée un tableau contenant les différents codes couleurs ANSI a appliquer. Je ferai bientôt une petite explication sur ces codes. Notez bien que les codes doivent être entre guillemets et pas entre apostrophes, sans quoi ils ne seront pas interprétés.

La couleur n (normal) est en fait le retour à la normale, une suppression du code précédemment appliqué.

backtrace

La fonction PHP debug_backtrace permet d'obtenir dans un tableau toute la chaîne ayant permis d'arriver à l'exécution de la ligne courante, dans l'ordre anté-chronologique.

La première entrée du tableau contient une information très importante pour nous: le numéro de la ligne ayant appelé la fonction courante. La deuxième entrée du tableau, si elle existe, contient les informations sur le fichier, la classe et la fonction ayant appelés la fonction courante. S'il n'y a qu'une entrée dans le tableau, cela signifie que l'appel a été fait hors de toute fonction.

lundi 27 juin 2016

[MAJ] Fail2ban ne donne pas les lignes correspondantes à une détection

Après avoir appliqué ce que j'ai expliqué dans ce billet, j'ai reçu des mails signalant le bannissement de certaines IP suite à la détection de tentatives d'injection SQL.

Problème : juste en dessous de Lines containing IP: <le méchant> in /var/log/nginx/*.access.log, il n'y avait rien.

Je suis allé voir le fichier /etc/fail2ban/action.d/sendmail-whois-lines.conf et l'expression régulière présente ne fonctionne pas avec mes logs.

Version initiale:

[bash]
`grep '[^0-9]<ip>[^0-9]' <logpath>`

Je l'ai remplacée par:

[bash]
`egrep '[^0-9]?<ip>([^0-9]|$)' <logpath>`

Maintenant, ça fonctionne. Ceci est dû aux types de fichiers logs que j'utilise pour nginx et dont le premier élément de la ligne est l'adresse IP.

MAJ : Problème de dates

Il arrive parfois que fail2ban envoie des mails à une date erronée (comme 01/01/1970). Pour corriger ça, il faut éditer le fichier /etc/default/fail2ban et ajouter les lignes suivantes:

[conf]
LC_ALL=C
LANG=C

- page 1 de 11