[Bash] Récupérer la taille des bases MySQL

#!/bin/bash
#
# MySQL_DB_Sizes
#
# Auteur      : Johan 
# Contact     : johan@slashroot.fr
# Date        : 13/07/2011
# Version     : 1.0
# Description : Recupère la taille de chaque base de données et envoi les résultats par email
# Commentaire : L'utilisateur doit avoir acces en lecture a toutes les bases dont on souhaite connaitre la taille

# Reminder for a MySQL read only user
# CREATE USER 'ro-user'@'localhost' IDENTIFIED BY 'MySQL_Ro_User_Password';
# GRANT SELECT ON database1.* TO 'ro-user'@'localhost';
# GRANT SELECT ON database2.* TO 'ro-user'@'localhost';
# ...

#
# Usage
#
usage(){
    echo ""
    echo "Utilisation : mysql_db_sizes -s server_name -u mysql_user -p file/password [-b database1,database2...] [-m adresse@domain.com]"
    echo ""
    echo "OPTIONS :"
    echo "   -h     Affiche l'aide"
    echo "   -u     Utilisateur MySQL a utilise pour la requete SQL"
    echo "   -s     Serveur contenant la base de données"
    echo "   -p     Type d'authentification a utiliser (prompt du password ou fichier ~/.my.cnf)"
    echo "   -b     Specifie les bases a afficher (par defaut toutes celles accessibles"
    echo "   -m     Envoi le resultat par email au lieu de l'afficher dans le terminal"
    echo ""
    echo "EXEMPLES :"
    echo "   1 - Affichage de la taille de toutes les bases avec une authentification par mot de passe"
    echo "          mysql_db_sizes -s localhost-u bob  -p password"
    echo "   2 - Envoi de la taille des bases db1 et db2 par email avec une authentification par fichier"
    echo "          mysql_db_sizes -s localhost -u bob -p file -b db1,db2 -m bob@admin.fr"
    echo ""
}
 (suite…)

[Bash] Replication d’une base Kerberos

Ce script permet de répliquer une base de royaume Kerberos d’un master vers un ou plusieurs slave en s’appuyant sur le service kpropd.

#!/bin/bash  
#
# Kerberos_Replication
#
# Auteur      : Johan
# Contact     : johan@slashroot.fr
# Date        : 04/07/16
# Version     : 1.0
# Description : Ce script permet de repliquer une base de royaume kerberos vers un ou plusieurs serveurs slaves
# Commentaire : A mettre en crontab


print_usage ()
{
    echo ""
    echo "Utilisation : kerberos_replication ROYAUME SLAVE1 SLAVE2 ..."
    echo ""
}

 (suite…)

[Bash] Dump d’une base Kerberos

#!/bin/bash  
#
# Kerberos_Dump
#
# Auteur      : Johan
# Contact     : johan@slashroot.fr
# Date        : 24/05/16
# Version     : 1.0
# Description : Le script realise un double dump (standard et ov) de la base kerberos passee en parametre
# Commentaire : On part du principe que le script est execute en cron de maniere journaliere 
#

#
# Definition des variables
#

# Royaume a sauvegarder
realm=$1
[[ -z "$realm" ]] || [[ "$realm" = "-"* ]] && echo "Usage: $0 REALM" && exit 1

# Repertoire contenant les dumps
save_rep="/var/kerberos/backup"

# Date et heure du dump
heure="`date +%H%M`"
date="`date +%Y%m%d`"

# Nombre de dump a conserver
nb_backup=30

# Nom du fichier de backup
save_file="${realm}-${date}_${heure}"

#
# Verifications
#

# On verifie qu'on a bien la commande kdb5_util
if [ ! -f /usr/sbin/kdb5_util ] ; then
    echo "ERREUR - Il manque la commande kdb5_util"
    exit 1
fi

# On regarde si le repertoire de sauvegarde existe deja, sinon on le cree
if [ ! -d $save_rep ] ; then
    mkdir -p $save_rep 
    if [ ! -d $save_rep ] ; then
        echo "ERREUR - Impossible de créer le dossier qui va contenir les sauvegardes"
        exit 1
    fi
fi

# 
# Au travail
#

# Sauvegarde de la base kerberosa
cd $save_rep
/usr/sbin/kdb5_util -r $realm dump $save_file
/usr/sbin/kdb5_util -r $realm dump -ov $save_file.ov

# On verifie que tout s'est bien passe
if [ -f "$save_file.dump_ok" -a -f "$save_file.ov.dump_ok" ]; then 
    rm -f $save_file.dump_ok $save_file.ov.dump_ok
    exit 0
else
    echo "ERREUR - Le dump de la base du royaume $realm s'est mal passe"
    exit 1
fi

# On supprime les sauvegardes en trop s'il y en a
find $save_rep -name "$realm-*_*" -mtime +30 -ls -delete

[Powershell] Récupérer la date de dernière connexion

#
# Get-Lastlogon
#
# Auteur : Johan
# Contact : johan@slashroot.fr
# Date : 24/03/14
# Version : 1.0
# Description : Récupère la date de dernière connexion d'un utilisateur ou d'un ordinateur
# Commentaire : Le lastlogon n'etant pas replique entre les DCs, le script recupere les valeurs de chaque DC puis selectionne la plus recente 
# Requis : Module ActiveDirectory

# On importe le module ActiveDirectory
Import-Module ActiveDirectory -ErrorAction SilentlyContinue

# Si le module est bien présent
if ($? -eq 'true')
{
    # On lance la boucle pour chaque demande (utilisateur/ordinateur)
    do {
        # On lance la boucle pour la séléction du type (utilisateur ou ordinateur) afin de prendre en compte les fautes de frappe
        $i=0
        while ($i -eq 0)
        {
            # Mise en forme de l'affichage
            echo "`nAfficher la date de derniere connexion d'un :`n"
            echo "1 - Utilisateur"
            echo "2 - Ordinateur`n"

            # Demande du type
            $choix = Read-host "Choix"
            echo ""

            # Demande du login utilisateur ou nom de machine puis test de l'existence du compte
            # Si l'utilisateur existe, on continue le script, sinon, on recommence le script
            switch ($choix){
                 1 {$name = Read-host "Login de l'utilisateur "; echo "" ; if ((Get-ADUser -Filter {sAMAccountName -eq $name}) -ne $null) { $i=1 } else { echo "L'utilisateur n'existe pas !`n" }; break}
                 2 {$name = Read-host "Nom de la machine "; echo "" ; if ((Get-ADComputer -Filter {name -eq $name}) -ne $null) { $i=1 } else { echo "L'ordinateur n'existe pas !`n" }; break}
                 default {"Mauvais choix !`n"; break}
                 }
        }

        # On récupère la liste de tous les DC du domaine
        $liste_DC = (Get-ADDomainController -Filter *).HostName

        # On fixe les variables
        $lastLogon = 0
        $logonDC = $null

        # Pour chaque DC du domaine
        foreach ($dc in $liste_DC)
        {
            # On formule la requête selon le type et on récupère la valeur
            switch ($choix){
                 1 {$res = Get-ADUser $name -Properties LastLogon -Server $dc ; break}
                 2 {$res = Get-ADComputer $name -Properties LastLogon -Server $dc  ; break}
                 }
    
            # Si le lastlogon est plus récent, on prend la valeur et le nom du DC
            if ($lastLogon -lt $res.LastLogon)
            {
                $lastLogon = $res.LastLogon
                $logonDc = $dc
            }
        }

        # On converti le lastlogon au format date 
        $lastLogon = [DateTime]::FromFileTime($lastLogon)

        # On affichage le lastlogon et le DC correspondant
        echo "Derniere connexion : $lastlogon"
        echo "Serveur      : $logonDC`n"

    # On propose de relancer le script pour un autre compte
    $quit = Read-Host “On continue ? (O/n)”
    }
    until (($quit -eq “n”) -or ($quit -eq “N”))
}
else
{
    # Si le module est absent, on abandonne le script
    echo "Il faut le module ActiveDirectory !"
}

[Powershell] Lister les postes inactifs

#
# Get-Inactive-Computers
#
# Auteur : Johan
# Contact : johan@slashroot.fr
# Date : 03/12/15
# Version : 1.0
# Description : Ce script récupère tous les postes présents dans la l'AD et dresse la liste des postes ne s'étants pas connectés depuis X mois
# Commentaire : Le résultat est envoyé par email
# Requis : Module ActiveDirectory

#
# Variables
#

# Base de recherche
$base="OU=postes,DC=slashroot,DC=fr"

# Seuil d'inactivité (en mois)
$seuil="6"

# Parametres de messagerie
$expediteur = "bob@slashroot.fr"
$destinataire = "admin@slashroot.fr"
$serveur = "mx.slashroot.fr"

# On filtre le résultat selon l'OS (on ne prend pas en compte les Linux)
$os_filter="W*"

# Date d'il y a X mois
$date_seuil=$(Get-Date).addMonths(-$seuil)

$resultat=""

#
# Au boulot
#

# On importe le module ActiveDirectory
Import-Module ActiveDirectory -ErrorAction SilentlyContinue

# Si le module est bien présent
if ($? -eq 'true')
{
    # Requête LDAP pour récupérer tous les postes Windows
    $strCategory = “computer”
    $objDomain = New-Object System.DirectoryServices.DirectoryEntry(“LDAP://$base”)
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher($objDomain,”(&(objectCategory=$strCategory)(operatingSystem=$os_filter))”,@(‘name’))
    $liste=$objSearcher.FindAll() | %{$_.properties.name} | sort

    # Liste de tous les DC du domaine
    $liste_DC = (Get-ADDomainController -Filter *).HostName

    # Pour chaque poste on récupère son lastlogon sur chaque DC afin de trouver le plus récent
    foreach ($poste in $liste)
    {
        # On fixe les variables
        $lastLogon = 0
        $logonDC = $null
    
        # Pour chaque DC du domaine
        foreach ($dc in $liste_DC)
        {
            $res = Get-ADComputer $poste -Properties LastLogon -Server $dc
            # Si le lastlogon est plus récent, on prend la valeur et le nom du DC
            if ($lastLogon -lt $res.LastLogon)
            {
                $lastLogon = $res.LastLogon
                $logonDc = $dc
            }
        }
        # On converti le lastlogon au format date 
        $lastLogon = [DateTime]::FromFileTime($lastLogon)

        # Si le lastlogon est plus vieux que le seuil fixé, on ajoute le poste à la liste (en ne gardant que la date JJ/MM/YYYY)
        if ($lastLogon -lt $date_seuil)
        {
            $resultat+="$poste - $lastLogon `r"
        }
    } 

    # Si on a des postes problematiques
    if ( $resultat -ne "" )
    {
        # On envoi le résultant par email
        $objet = "[Active Directory] Postes inactifs"
        $texte = "Bonjour,`r`rVoici la liste des postes ne s'étant pas connectés au domaine depuis plus de $seuil mois :`r`r$resultat`rCordialement`r--`rBob"
        $message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
        $SMTPclient = new-object System.Net.Mail.SmtpClient $serveur
        $SMTPclient.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
        $SMTPclient.Send($message)
    }
}
else
{
    # Si le module est absent, on abandonne le script
    echo "Il faut le module ActiveDirectory !"
}

I’m back back !

Le précédent article s’est un peu transformé en échec alors on recommence !

Après 4 ans d’absence, me revoilà sur le blog !

Nouveau nom de domaine et nouvelle vie, je ne parlerai plus que de CentOS !

I’m back !

Après quasiment un an et demi d’absence, me revoilà sur ce blog.

J’ai profité de ce retour pour passer d’un hébergement simple à un serveur dédié chez OVH . C’est d’ailleurs ce thème qui va alimenter les futurs articles.

ps : l’adresse du blog est maintenant directement http://em-corporation.fr

[CentOS] Configuration du réseau

Lors d’une installation minimale, il n’y a quasiment rien de configuré et d’installé. Voici quelques infos pratiques pour commencer, selon les besoins.

Configuration de l’interface réseau en statique (/etc/sysconfig/network-scripts/ifcfg-eth0) :

DEVICE=eth0
HWADDR=08:00:27:86:41:4B
TYPE=Ethernet
UUID=4f05b63e-4113-4aa7-ac63-3ea5867291a8
IPADDR=10.0.1.23
NETMASK=255.255.255.0
NETWORK=10.0.1.0
BROADCAST=10.0.1.255
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none

Configuration du hostname et de la passerelle (/etc/sysconfig/network) :

NETWORKING=yes
HOSTNAME=jean-bob.em-corporation.fr
GATEWAY=10.0.1.254

Configuration de la résolution DNS (/etc/resolv.conf) :

nameserver 10.0.1.25
nameserver 10.0.1.26

Mise à jour du système et installation de NTP afin d’être à l’heure :

yum update && yum install -y ntp

On supprime les serveurs par défaut et ajoute nos serveurs au niveau du /etc/ntp.conf (ou alors le pool français fr.pool.ntp.org) :

nameserver 10.0.1.200
nameserver 10.0.1.201

Démarrage automatique de NTP et SSH :

chkconfig ntpd on && chkconfig sshd on

Il ne reste plus qu’à redémarrer la machine :

reboot

[Active Directory] Déployer des imprimantes par GPO

Nous supposons un serveur d’impression en 2008 R2 avec des clients Seven.

Création de la GPO :

Se rendre dans « Configuration utilisateur » -> « Préférences » -> « Paramètres du Panneau de configuration » -> « Imprimantes » :

Effectuer un clic droit « Nouveau » -> « Imprimante partagée »

Choisir mettre à jour (permet d’installer l’imprimante quand elle n’est pas présente et modifie sa configuration si un changement au niveau du serveur d’impression est effectuée).

Cocher le ciblage au niveau de l’élément puis dans l’éditeur de cible, cliquer sur « Nouvel élément » puis choisir la condition de déploiement (dans mon cas, l’appartenance de l’utilisateur à un groupe global). Il est possible de spécifier plusieurs conditions avec les opérateurs logiques ET et OU.

L’imprimante est maintenant configurée. Il ne reste plus qu’à faire de même pour les autres imprimantes.

Le ciblage le plus efficace dépend bien entendu de votre infrastructure. Avec le nombre impressionnant de critères de ciblage disponible, je pense que tout est facilement réalisable.

[Debian] Ajout d’un disque dur

Voici la marche à suivre afin de configurer un nouveau disque sous Debian (une fois branché physiquement).

On vérifie que le disque est bien branché :

fdisk -l

Disk /dev/sda: 85.9 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0005c4f3

Device Boot Start End Blocks Id System
/dev/sda1 1 1824 14651248+ 83 Linux
/dev/sda2 1825 2334 4096112 83 Linux
/dev/sda3 2334 10335 64267264 83 Linux
/dev/sda4 10336 10443 867510 82 Linux swap / Solaris

Disk /dev/sdb: 85.9 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

On constate que le nouveau disque (/dev/sdb) est bien là et qu’il ne contient pas de table de partition valide.

C’est parti pour la création d’une partition :

fdisk /dev/sdb

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x74122bdb.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-10443, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-10443, default 10443):
Using default value 10443

Command (m for help): w

The partition table has been altered!

Une fois l’invite de commandes apparue, nous créons notre nouvelle partition en appuyant sur la touche ‘n’. Le système nous demande si nous voulons une partition primaire ou étendue, nous choisissons primaire (touche ‘n’) car le disque est complètement vierge. Ensuite il nous demande de saisir le numéro de la partition, nous lui spécifions alors le numéro ‘1’. Viens alors le choix du secteur de démarrage de la partition, nous choisissons la valeur par défaut qui nous est proposée qui correspond en fait au premier secteur utilisable pour une partition. Pour terminer nous choisissons le numéro du secteur marquant la fin de la partition, nous prenons le choix par défaut qui correspond au dernier secteur utilisable sur le disque. Nous finissons par la touche ‘w’ afin de prendre en compte les changements.

Par défaut, fdisk fixe le type à Linux. Nous devons seulement déclarer explicitement le type de la partition swap:

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 83

Il ne nous reste plus qu’à utiliser la commande MKFS pour formater la partition créée :

pour de l’ext3 :

 mke2fs -j /dev/sda1
 mke2fs -j /dev/sda3

pour de l’etx4 :

 mkfs -V -t ext4 /dev/sda1
 mkfs -V -t ext4 /dev/sda3

pour la swap

 mkswap /dev/sda2
 swapon /dev/sda2 (swap prête)