Backup automatique sur Disque Externe | Robocopy / alerte Mail+Android

Backup automatique sur Disque Externe | Robocopy / alerte Mail+Android - Stockage/Sauvegarde - Windows & Software

Marsh Posté le 23-10-2012 à 11:47:44    

Bonjour  :hello:  
 
Par le biais de ce topik, je vais partager mes scripts de backup permettant de :
 
 - Démarrer un ou plusieurs HDD externe (via un relais 220v commandé par l'USB)
 - Lancer un ou plusieurs backups (via robocopy)
 - traiter le code retour d'un backup :
    -> si OK : envoi d'un mail simple de notification
    -> si KO : envoi d'un mail + fichier de log + notification sur téléphone android
 - démontage propre des disques de sauvegarde
 - arrêt électrique des disques de sauvegarde (via le relais commandé par USB)
 
 
Mes scripts tournent chez moi sur un serveur HP Proliant N40L sous Windows Home Server 2011 ...
Ils doivent fonctionner sans soucis sur Win 7 ou Win 2008 server.
Ils sont écrits sous powershell (dispo sur les OS cités ci dessus :o)
 
Avec un peu de boulot, ca doit être adaptable sous Linux & consorts .. en utilisant rsync à la place de robocopy ;)
 
 
http://hfr-rehost.net/www.okki.fr/IMG/site/puce_titre.gif Démarrage / Arrêt des disques via un relais USB
 
Le démarrage des HDD est réalisé avec un relais commandé en USB ... en cherchant un peu on trouve ce genre de matos sur la baie ;)
J'ai utilisé ceci : http://sigma-shop.com/product/69/u [...] nnels.html
Ca permet de piloter deux relais .. donc deux équipements séparément.
Il existe un modèle avec un seul relais un peu moins cher : http://sigma-shop.com/product/7/us [...] l-box.html
Les frais de port sont faible sur cette boutique ... et ca arrive assez rapidement (env. une semaine pour moi ;))
 
http://hfr-rehost.net/sigma-shop.com/userfiles/productlargeimages/product_223.jpg
 
Manuel : http://kmtronic.com/usb-relay-cont [...] nnels.html
Drivers : http://www.ftdichip.com/Drivers/VCP.htm
 
Des exemples d'utilisation des relais USB ici : http://kmtronic.com/software-examples.html
J'utiliserais dans mes scripts l'utilitaire en ligne de commande qu'ils fournissent...
 
Exemple de démarrage arrêt des disques :  
http://kmtronic.com/windows-command-line-example.html

Code :
  1. usbrelay.exe -c:3 -r:1#1 (allumer relais 1 sur port com 3)
  2. usbrelay.exe -c:3 -r:1#0 (éteindre relais 1 sur port com 3)


 
http://hfr-rehost.net/www.okki.fr/IMG/site/puce_titre.gif Sauvegarde via robocopy & gestion des erreurs
 
Voici le script robocopyBackup.ps1
 

Code :
  1. param ([string]$nom, [string]$source, [string]$destination)
  2. ##############################################################################
  3. #               Robocoby Backup, Mail & Android Notification                 #
  4. #----------------------------------------------------------------------------#
  5. # Author : Guillaume Carrière (contact@guillaumecarriere.fr)                 #
  6. # Date   : 13 oct 2012                                                       #
  7. #----------------------------------------------------------------------------#
  8. # Usage   : C:\Backup\robocopyBackup.ps1 <nomBackup> <Source> <Destination>  #
  9. #                                                                            #
  10. # Example : C:\Backup\robocopyBackup.ps1 Photos D:\ N:\                      #
  11. ##############################################################################
  12. #Configuration du répertoire de logs
  13. $logDir="C:\Backup\logs\"
  14. #Configuration de l'envoi de Mail
  15. $mailFrom="donotreply@xxx.fr"
  16. $mailTo="monmail@xxx.fr"
  17. $mailSmtpServer="smtp.xxx.fr"
  18. #Configuration de l'envoi de la notification Android (nécessite un compte chez NMA et l'installation de l'appli)
  19. $nmaURL = "https://www.notifymyandroid.com/publicapi/notify"
  20. $nmaApiKey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
  21. #Gestion des paramètres d'appel du script
  22. $backupName=$nom
  23. $backupSource=$source
  24. $backupDestination=$destination
  25. #Contrôle des paramètres
  26. If ($backupName -eq "" -or $backupSource -eq "" -or $backupDestination -eq "" ) {
  27. Write-Host "Erreur d'appel de robocopyBackup !"
  28. Write-Host "Usage   : C:\Backup\robocopyBackup.ps1 <nomBackup> <Source> <Destination>"
  29. exit
  30. }
  31. If (!(Test-Path -path $backupSource)) {
  32. Write-Host "La source de la sauvegarde n'existe pas : ""$backupSource"" !"
  33. exit
  34. }
  35. If (!(Test-Path -path $backupDestination)) {
  36. Write-Host "La destination de la sauvegarde n'existe pas : ""$backupDestination"" !"
  37. exit
  38. }
  39. #Horodatage début backup
  40. $timesStart = Get-date -Format 'dddd dd MMM yyyy'
  41. $hourStart = Get-Date -Format 'HH"h"mm'
  42. Write-Host "Exécution de la sauvegarde : "$backupName
  43. Write-Host "Source        : "$backupSource
  44. Write-Host "Destination   : "$backupDestination
  45. Write-Host "Début Backup  : $timesStart à $hourStart"
  46. Write-Host "========================================"
  47. #Exécution de la sauvegarde
  48. $logFile = "$logDir{0:yyyy'-'MM'-'dd'_'HH'h'mm}_$backupName.log" -f (Get-Date)
  49. robocopy $backupSource $backupDestination /MIR  /R:3 /W:2 /LOG:$logFile /XD $backupSource"System Volume Information" $backupSource"`$RECYCLE.BIN" /NP
  50. $backupExitCode = $lastexitcode
  51. #Définition des codes retour de robocopy
  52. $exitCodeMessages = @{
  53. "16"="Erreur fatale lors de l'opération. Voir fichier de Log"
  54. "15"="Echec de la copie. Voir le fichier de Log."
  55. "14"="Echec de la copie. Voir le fichier de Log."
  56. "13"="Echec de la copie. Voir le fichier de Log."
  57. "12"="Echec de la copie. Voir le fichier de Log."
  58. "11"="Echec de la copie. Voir le fichier de Log."
  59. "10"="Echec de la copie. Voir le fichier de Log."
  60. "9"="Echec de la copie. Voir le fichier de Log."
  61. "8"="Echec de la copie. Plusieurs fichiers n'ont pas été copiés. Voir le fichier de Log."
  62. "7"="Copie OK. Certains fichiers présents et supplémentaires ont générés une incohérence entre la source et la destination. Voir le fichier de Log."
  63. "6"="Copie OK. Certains fichiers et dossiers suplémentaires ont génété une incohérence entre la source et la destination. Voir le fichier de Log."
  64. "5"="Copie OK. Certains fichiers ont été copiés et d'autres ont généré une incohérence entre la source et la destination. Voir le fichier de Log."
  65. "4"="Copie OK. Une incohérence entre la source et la destination de la sauvegarde a été détectée. Voir le fichier de Log."
  66. "3"="Copie OK. Certains fichiers supplémentaires ont été copiés avec succès."
  67. "2"="Copie OK. Certains fichiers ou répertoires supplémentaires ont été détectés et copiés avec succès."
  68. "1"="Copie OK. Un ou plusieurs fichiers ont été copiés avec succès du répertoire source au répertoire de destination."
  69. "0"="Copie OK. Aucun changement. Le répertoire source était identique au répertoire de destination."
  70. }
  71.                                    
  72. #Horodatage fin backup
  73. $timesEnd = Get-date -Format 'dddd dd MMM yyyy'
  74. $hourEnd = Get-Date -Format 'HH"h"mm'
  75. Write-Host "========================================"
  76. Write-Host "Code retour   : $backupExitCode - "$exitCodeMessages["$backupExitCode"]
  77. Write-Host "Fin Backup    : $timesStart à $hourStart"
  78. Write-Host "Envoi du mail de notification..."
  79. #Titre du mail
  80. $mailBackupKO = "[Backup KO]/!\ /!\ Echec de la sauvegarde ""$backupName"" du $timesStart /!\ /!\"
  81. $mailBackupOK = "[Backup OK]Succès de la sauvegarde ""$backupName"" du $timesStart"
  82. #Génération du mail
  83. $mail = New-Object System.Net.Mail.MailMessage
  84. $mailBody = ""
  85. $mailSubject = ""
  86. If ($backupExitCode -lt 4) {
  87.     $mailBody = "Ceci est un message de confirmation du bon déroulement de la sauvegarde ""$backupName""
  88. démarrée le $timesStart à $hourStart et terminée le $timesEnd à $hourEnd.`n
  89. Le résultat de la sauvegarde est le suivant : "+$exitCodeMessages["$backupExitCode"]
  90.     $mailSubject = $mailBackupOK
  91.     $mail.priority = 'Normal'
  92.     $mail.Attachments.Clear()
  93. } Else {
  94.     $mailBody = "Ceci est un message d'alerte concernant un problème survenu lors la sauvegarde ""$backupName""
  95. démarrée le $timesStart à $hourStart et terminée le $timesEnd à $hourEnd. `n
  96. Le résultat de la sauvegarde est le suivant : "+$exitCodeMessages["$backupExitCode"]+"`n
  97. Pour de plus amples détails, consultez les fichiers log en pièces jointe."
  98.     $mailSubject = $mailBackupKO
  99.     $mail.priority = 'High'
  100.     $mail.Attachments.Add("$logFile" )
  101. }
  102. #Envoi du mail
  103. $mail.Subject = $mailSubject
  104. $mail.Body = $mailBody
  105. $mail.From = $mailFrom
  106. $mail.To.Add($mailTo)
  107. $smtpServer = $mailSmtpServer
  108. $smtpClient = New-Object system.net.mail.SmtpClient($SmtpServer)
  109. $smtpClient.Send($mail)
  110. $mail.Attachments.Dispose()
  111. $mail = $null
  112. $smtpClient = $null
  113. Write-Host "Mail envoyé ;)"
  114. #Envoi de la Notification Android Si Erreur (code d'erreur supérieur à 3) !
  115. If ($backupExitCode -gt 3){
  116. $priority = 2 #2 = Max Level priority
  117. $notificationDescription = "<b>Nom Backup :</b> $backupName <br /><b>Début :</b> $timesStart à $hourStart <br /><b>Fin :</b> $timesEnd à $hourEnd <br /><br /><b>Code retour robocopy :</b> $backupExitCode <br /><b>Message de retour :</b> "+$exitCodeMessages["$backupExitCode"]+" <br />"
  118. $parameters = 'apikey=' + $nmaApiKey + '&application=Sauvegarde '+$backupName+'&event=' + $mailSubject + '&description=' + $notificationDescription + '&priority=' + $priority + '&content-type=text/html'
  119. $httpRequest = New-Object -ComObject Msxml2.XMLHTTP
  120. $httpRequest.open('POST', $nmaURL, $false)
  121. $httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded" )
  122. $httpRequest.setRequestHeader("Content-length", $parameters.length)
  123. $httpRequest.setRequestHeader("Connection", "close" )
  124. $httpRequest.send($parameters)
  125. Write-Host "Envoi notification Android = "$httpRequest.statusText
  126. }
  127. Write-Host "-END-"
  128. exit


 
La configuration du script fait dans les lignes 13 à 21 :
Les paramètres sont normalement assez clair ...  
Il faut spécifier un smtp server accessible (je ne prend pas en charge l'authentification SMTP pour l'instant)
 
La notif android fera l'objet d'un paragraphe spécifique
 

#Configuration du répertoire de logs
$logDir="C:\Backup\logs\"
#Configuration de l'envoi de Mail
$mailFrom="donotreply@xxx.fr"
$mailTo="monmail@xxx.fr"
$mailSmtpServer="smtp.xxx.fr"
#Configuration de l'envoi de la notification Android (nécessite un compte chez NMA et l'installation de l'appli)
$nmaURL = "https://www.notifymyandroid.com/publicapi/notify"
$nmaApiKey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'


 
 
http://hfr-rehost.net/self/pic/7b2a8ac2b35127d941fcad6cf7ae89b61fc34de2.png
 
 
:)


Message édité par gysmovoile le 23-10-2012 à 12:07:20

---------------
--> Cuisine à la Plancha, ça sent bon le soleil :) <-- Nexus 7 2013 --
Reply

Marsh Posté le 23-10-2012 à 11:47:44   

Reply

Marsh Posté le 23-10-2012 à 11:47:58    

Reply

Marsh Posté le 23-10-2012 à 11:48:03    

Reply

Marsh Posté le 23-10-2012 à 11:56:18    

Reply

Marsh Posté le 23-10-2012 à 12:28:16    

drap :)


---------------
Cnam : RSX101 - CCE105 - RCP105 - RSX112 - NSY115 - NFP107 - NSY104 - NFE155 - NFE107 - NFE108 - EME102 - TET102 - Bulats Niv.2 [-]
Reply

Marsh Posté le 23-10-2012 à 15:24:09    

drap ^^

Reply

Marsh Posté le 23-10-2012 à 15:30:23    

drap

Reply

Marsh Posté le 23-10-2012 à 20:13:15    

drapal :)  :bounce:


---------------
Cookie the cat :D
Reply

Marsh Posté le 24-10-2012 à 01:43:57    

super taff...  :jap:  et drapal

Reply

Marsh Posté le 10-11-2012 à 19:41:37    

Super !
 
je cherchais vainement ce topic et je l'ai enfin trouvé.
 
Alors merci   :bounce:  
 
Mais comme je ne voyais rien j'ai commencé à faire des recherches pour faire un batch et j'ai donc  des petites questions :
 
- est-ce qu'il ne serait pas intéressant de rajouter les options robocopy /purge /xo ? pour assurer une destination et une source identique et éviter des copies inutiles ?
- est-ce qu'on ne peut pas utiliser devcon disable xxx et devcon enable xxx pour activer les disques externes (ça ne coupe pas totalement l'alim mais ça coupe les disques durs) ?
- pour le wait, attente d'activation du disque dur tu fais un truc du style "ping 1.1.1.1 -n 1 -w 10000 > nul" ?
- lorsque le disque dur s'active, comment éviter l'ouverture d'une fenêtre d'exécution automatique ?
 
 :jap:


Message édité par herve502 le 11-11-2012 à 11:55:55
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed