10 nov. 2012

[astuce] Sauvegarder ses clés Putty et WinSCP

Vous pouvez très facilement sauvegarder la configuration de tous vos serveurs ainsi que les clés SSH et mots de passe de Putty et de WinSCP.

Pour cela, il suffit d'exporter les deux clés suivantes depuis le Registre Windows :
HKEY_CURRENT_USER\Software\SimonTatham
HKEY_CURRENT_USER\Software\Martin Prikryl


Export de la clé de registre de Putty

Cela créé chacun un fichier .reg. Pour restaurer vos paramètres, il suffit d'exécuter le .reg sur l'ordinateur/session souhaitée, et tout est restauré !

[astuce] Lever les exceptions NullReferenceException de l'évènement Form.Load du débogueur de Visual Studio 2010

Par défaut, Microsoft Visual Studio 2010 ne capture pas le débogage de l'exception NullReferenceException si cette exception est levée depuis le bloc de script de l'évènement Form.Load. En effet, l'exécution en débug ne révèle pas l'exception, même si un try-catch capture effectivement l'exception. Donc si on teste une boîte de dialogue qui possède du code dans le Load qui fait appel à une variable qui peut être nulle sans être dans un try-catch, la fenêtre s'affiche sans que l'on remarque l'erreur.

Voici un code d'exemple, où on a volontairement fait appel (ligne 25) à la liste maListe qui n'a pas été initialisée (ligne 19) :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace testException
{
    public partial class Fille : Form
    {
        public Fille()
        {
            InitializeComponent();
        }

        List<int> maListe;

        private void Fille_Load(object sender, EventArgs e)
        {
            try
            {
                foreach (int i in maListe)
                {

                }
            }
            catch (NullReferenceException) { Text = "Exception"; return; }

            Text = "Completed";
        }
    }
}



Pour corriger ce comportement par défaut, il suffit de se rendre dans le menu "Déboguer > Exceptions..." et de cocher la case System.NullReferenceException.
Cochez la case System.NullReferenceException
 Re-déboguez le projet, et vous obtiendrez enfin la capture de l'erreur :

Le débogueur de VS 2010 à capturé NullReferenceException

[snippet] Script d'alerte de d'indisponibilité de serveur

Un petit script Powershell qui vérifie si les machines spécifiées (dans un fichier texte par exemple) répondent, et si une machine ne répond pas, un mail d'alerte est automatiquement envoyé avec un rapport. Il suffit ensuite de créer une tâche planifiée s'exécutant toutes les 10 minutes...

Voici le script powershell :

# ce script sert à vérifier l'état des tâches sauvegardes
# et d'envoyer un mail rapport à la fin
# ci-dessous la configuration de l'envoie de mail

$expediteur = "Opérateur de sécurité"

$destinataire = "admin1@domaine.tld,admin2@domaine.tld" # séparer entre virgule

$serveur = "srv-exchange.domaine.tld"

$objet = "Message alerte disponibilité quotidienne " + [System.DateTime]::Now

# ci-dessous la configuration du fichier de log

$log = "verifDispo.txt"

############################ NE RIEN MODIFIER CI-DESSOUS ######################

echo "Tâche en cours..."
$dateStartRapport = date
$data = "Nom".PadRight(20)+"État`n"
$data += '-'.PadRight(20-1,'-')+' '+'-'.PadRight(7-1,'-')
$countOK = 0
$count = 0

if($args.length -eq 1 -and $args[0] -ine "-help") {
    $file = $args[0]
}
else {
    $file = "dispo.txt"
}


foreach ($srv in Get-Content $file)
{
    if($srv -ne "") {
        $count++
        $line = "`n"+$srv.PadRight(20)
        if($srv.StartsWith('#')) {
            $line += "Ignoré"
            $countOk++
        }
        else {
            ping -n 1 -w 1000 $srv | Out-Null
            if($?) {
                $line += "Ok"
                $countOk++
            }
            else {
                $line += "Erreur"
            }
        }
        $data += $line
    }
}

$rapport = "Rapport de disponibilité " + $dateStartRapport
$rapport += "`nRésumé: $countOk/$count OK en "+((Get-Date) - $dateStartRapport).minutes.ToString().PadLeft(3)+" minutes, terminé à $(Get-Date)"
$rapport += "`n`n$data"
$rapport += "`n`nTerminé"
$rapport >> $log
if($count -ne $countOk) {
    # envoie du mail
    $message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $rapport
    $message.Priority = "High"
    $client = new-object System.Net.Mail.SmtpClient $serveur
    $client.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
    $client.Send($message)
    if($?) { "Mail envoyé avec succès à $destinataire" >> $log }
    else { "Mail erreur pour $destinataire" >> $log }
}
else { "Mail non envoyé" >> $log }

Le script est très simpliste. Il ne vérifie pas l'état des services. Donc si le firewall du serveur (ou poste client !) est configuré pour ne pas répondre aux pings, cela ne fonctionnera pas. D'ailleurs, si un serveur subit une usurpation d'IP, ça ne sera pas détecté non plus. Evidemment, si c'est le serveur de messagerie qui ne répond plus, vous ne risquez pas de recevoir l'alerte non plus...

[snippet] Récupérer le numéro de ligne avec MySQL

Il est souvent utile de connaître le numéro de ligne de l'enregistrement courant lors d'un parcours du résultat d'une requête SQL, plutôt que d'utiliser une variable compteur côté programmation du traitement. Pour cela, la plupart des SGBD ont implémentés un champ ou une variable système spécifique, comme le ROWNUM (une colonne système qui retourne le numéro de la ligne courante). La plupart des SGBD mais pas MySQL.

Il existe cependant une solution pour pallier à ce manque. Il suffit de définir une variable dans la session MySQL avant la requête, et de l'incrémenter depuis la requête, comme ceci :
SET @rownum=0;
SELECT @rownum:=@rownum+1, * FROM table WHERE champ1 = champ2;

Et voilà, le tour est joué. D'ailleurs, la colonne @rownum pourra être utilisée dans les clauses WHERE, ORDER BY...