Sauvegarde sous ubuntu server

Backup avec Mondo archive

Cherchant une solution de sauvegarde sur Ubuntu Server, j’ai trouvé mondo archive et mondo rescue. Cette solution permet de réaliser une exacte image de l’Os linux intallé (redhat, centos, ubuntu, debian…). Comme un ghost ré-installable via un ou des iso générées.

Installation

Ajout du dépôt dans le sources.list

sudo vim /etc/apt/sources.list

Liste des dépôts pour la version 11.10 de Ubuntu Server

# mondo depots
deb ftp://ftp.mondorescue.org//ubuntu 11.10 contrib
deb-src ftp://ftp.mondorescue.org//ubuntu 11.10 contrib

Installation des logiciels

sudo apt-get update
sudo apt-get upgrade
sudo atp-get install mondo*

Utilisation en ligne de commande

Génération d’une sauvegarde constituée d’une ou de plusieurs images iso de 650 Mo. Les images sont générées dans le répertoire temporaire (tmp).

sudo mondoarchive -O -N -d /tmp/

Génération d’une sauvegarde iso avec des volumes de 4,2go enregistrée sur le répertoire partagé de mon nas (ici, une freebox).

sudo mondoarchive -O -s 4200m -i -N -d /mnt/freebox

Aide du site http://wiki.pedrono.fr/index.php/Installation_de_Mondo

Extrait du man de mondoarchive

  • mondoarchive -O [ options ] : sauvegarde du PC.
  • mondoarchive -V [ options ] : vérification des sauvegardes.

Les autres options utiles:

  • -c speed: permet de forcer la vitesse de gravure quand on backup sur CD-R.
  • -w speed: permet de forcer la vitesse de gravure quand on backup sur CD-RW.
  • -p prefix: permet de fixer un préfixe pour le nom de nos fichiers de backup (dans le cas où la sauvegarde tient sur plusieurs CD par exemple, les noms seront du type <prefix><n° du media>.iso).
  • -i: force l’utilisation du format ISO pour la sauvegarde (à remplacer par -n ou -t si on souhaite utiliser un montage NFS ou un lecteur de bande).
  • -D: permet un backup différentiel. Utile si on souhaite faire des sauvegardes incrémentales quotidiennes.
  • -E path1 …pathN: permet d’exclure des répertoires du système de la sauvegarde. Il est à noter que mondoarchive exclu déjà par défaut les médias amovibles (/mnt/floppy, /mnt/cdrom, /proc, /sys, /tmp). Attention de ne pas mettre de / en fin de path à exclure.
  • -I path1 …pathN: permet d’inclure de force des dossiers à embarquer dans la sauvegarde, sachant que les dossiers par défaut sont /, /home et /etc.
  • -N: permet d’exclure explicitement tous les montages réseau quel que soit leur type.
  • -d dev|dir: permet de désigner le périphérique de sauvegarde, ou le chemin de stockage des images générées.
  • -s size: permet de préciser la taille maximale de chaque fichier image généré. Choisir par exemple 650m pour un CD-R.
  • -x: permet de pointer des partitions non-linux à backuper (notamment NTFS).

Il existe de nombreuses autres options mais je ne présente ici que les options essentielles à un backup ou un clonage rapide de système Linux.

Exemple d’utilisation de la commande:

root@centreon:~# mondoarchive -O -p centreon -i -d /root/

Grâce à cette commande, je demande à mondoarchive de procéder à une sauvegarde, en utilisant le format ISO. Les ISO seront préfixés centreon et seront stockées dans /root. Sans précision de taille maximale, mondoarchive va créer une seule image (éventuellement trop volumineuse pour stockage sur CD) que l’on souhaite réutiliser par la suite pour une restauration VMWare.

Mise à jour du serveur

Grosse mise à jour du serveur, vérifier vos script pour la compatibilité php/mysql

 

apache2 apache2-mpm-worker apache2-prefork-dev apache2-suexec apache2-utils
apache2.2-bin apache2.2-common apt apt-transport-https apt-utils gzip
libapache2-mod-fcgid libapt-inst1.3 libapt-pkg4.11 libc-bin libc-dev-bin
libc6 libc6-dev libfreetype6 libfreetype6-dev libgl1-mesa-dev
libgl1-mesa-dri libgl1-mesa-glx libglapi-mesa libglu1-mesa libglu1-mesa-dev
libgnutls26 libmysqlclient-dev libmysqlclient16 libpng12-0 libpng12-dev
libpq-dev libpq5 libruby1.8 libssl-dev libssl-doc libssl1.0.0 libtiff4
libtiff4-dev libtiffxx0c2 libudev0 libvorbis0a libvorbisenc2 libxml2
libxml2-utils linux-libc-dev mesa-common-dev mindi mondo multiarch-support
mysql-client mysql-client-5.1 mysql-client-core-5.1 mysql-common
mysql-server mysql-server-5.1 mysql-server-core-5.1 openssl php-pear php5
php5-cgi php5-cli php5-common php5-dev php5-gd php5-mysql python-httplib2
python-pam python-pkg-resources ruby1.8 tzdata udev update-manager-core

Rsync sous windows

Rsync sous windows

Problématique

Je désire synchroniser mon disque distant  (m) vers un répertoire de destination local (c). Il s’agit d’un profil firefox.
Remarque  : si j’effectue également l’opération dans l’autre sens, je me retrouve avec une solution cloud de type dropbox. Mon profil Firefox étant centralisé sur le serveur et distribuable sur plusieurs machines distantes, les modifications sont dans synchronisées sur le serveur et redistribuées.
Je ne souhaites pas utiliser de couche ssh. Mon volume local et mon volume distant seront des volumes samba (smb) montés localement.

 

Production : solution choisie

Installation du client

Nom = cwRsync 3.1.0
Détail :
cwRsync
Rsync
Cygwin
OpenSSH
puTTY
licence = GNU
Emplacement = C:\Program Files\cwRsync
Espace = 6 Mo

Exemple de code réalisé pour la synchronisation (serveur→client) de firefox.

REM  --- Sync Server->LOCAL -----
Set CHEMINPATH="c:\Program Files\cwRsync\bin\"
REM les données du serveurs sont montées sur un lecteur "m"
set SERVER=/cygdrive/m/FIREFOX
Set LOCAL="/cygdrive/c/Documents and Settings/%USERNAME%/Local Settings/Application Data/Mozilla/Firefox/"
rem Set LOCAL=/cygdrive/c/tmp/

REM -----------------------------
rem arguments
rem r = recursif
rem t = préserver ler les dates des fichiers
rem u = mise à jour uniquement
rem p = préserve les permissions
rem o = préserve le propriétaire
rem g = préserve le groupe
rem l = copie les liens symboliques comme liens symboliques
rem i = affiche un résumé des changements pour chaque mise à jour
rem --delete-after = efface après transfert, pas avant
rem --chmod=ugo=rwX = préserve les droit conforme à l'original sur la copie
rem --progress = montre l'avancement pendant le transfert
rem --delete = efface les fichiers qui n'existent pas chez l'émetteur
rem pour les test -n
rem ------------------------------

%CHEMINPATH%rsync.exe -rutpgoli --delete-after --chmod=ugo=rwX --progress %SERVER%/* %LOCAL%

Inventaire

Pour changer un petit bout de script pour ce qui deviendra un agent d’inventaire. Le but recherché est de connaitre les machines utilisées régulièrement par plusieurs personnes différentes.
Il remonte le nom netbios de la machine, l’adresse IP, le login du User ainsi que la date. Les informations sont ensuite enregistrées dans une base de données. L’ensemble du logiciel en Windev sera bientôt disponible…

sNomNetbios est une chaîne
sNomNetbios = SysEnvironnement("COMPUTERNAME")
sNomNetbios = ExtraitChaîne(sNomNetbios,2,"=")

sIP est  une chaîne
sIP = NetAdresseIP()

sLogin est une chaîne
// Récupère la variable
sLogin = SysEnvironnement("USERNAME")
// Extrait la valeur de la variable
sLogin = ExtraitChaîne(sLogin, 2, "=")

sDate est une chaîne
sDate = DateDuJour()
sDate += HeureSys()

Script VBS de changement automatique des machines d’une OU à l’autre

Script VBS de changement automatique des machines d’une OU à l’autre dans un environnement Active Directory.

Exemple :j’ai une OU nom_prod et une autre OU nom. Je souhaite qu’à intervalle régulier (scheduller) mes machines glissent d’une OU à l’autre. Je le fais de manière dynamique car j’ai plusieurs OU du même type (nom1_prod, nom2_prod…) allant de pair avec d’autre OU (nom1, nom2…).

Il y a donc abstraction du nom des OU.
Il y a abstraction de l’emplacement de l’OU. L’OU « Salles » est recherchée et la règle de déplacement des objets est appliquée pour tous les OU filles de celle-ci.
Il y a vérification de l’existence d’un binôme nom et nom_prod.

Remarque : j’ai laissé les wscript.echo commenté au fin de débogage…

 

'On Error Resume Next

Dim oWshShell
Dim OUNameRequest
Dim strComputerName
Dim objNewOU
Dim objMoveComputer
Dim strSourceOU
Dim strDestinationOU
Dim objNetwork
Dim computerName
Dim ou
Dim OULdapName
Dim strCNOU
Dim strTemp
Dim strOU
Dim strOUProd
Dim objOUAllComputer

Set oWshShell = CreateObject("WScript.Shell")
'OUNameRequest = oWshShell.ExpandEnvironmentStrings("%ComputerName%")
OUNameRequest = "Salles"
strComputerName = "OU="&  OUNameRequest
'wscript.echo strComputerName

computerName = OUNameRequest
WhatSearch = "organizationalUnit"
ou = getOUByComputerName(computerName, WhatSearch)
OULdapName =  strComputerName & "," & ou
strTemp = ou
'wscript.echo OULdapName
Set objOU = GetObject _
  ("LDAP://" & OULdapName)
objOU.Filter = Array("organizationalUnit")

For Each objChild In objOU
	If Not InStr(objChild.ou,"_prod") Then

		'wscript.echo objChild.ou
		AllComputer = "OU=" & objChild.ou & ","
		AllComputerOU = AllComputer & OULdapName
		'wscript.echo AllComputerOU
		OUProd = "OU=" & objChild.ou & "_prod,"
		On error resume next
		Set objOUTest = GetObject ("LDAP://" & OUProd & OULdapName)
		'wscript.echo OUProd & OULdapName
		'On error goto 0
		If ( err ) Then
		Else
		Set objOUAllComputer = GetObject("LDAP://" & AllComputerOU)
		objOUAllComputer.Filter = Array("computer")
			For Each objChildAllComputer In objOUAllComputer
				'wscript.echo objChildAllComputer.cn
				objChildAllComputerConcat = "CN=" & objChildAllComputer.cn
				'wscript.echo objChildAllComputerConcat
				'wscript.echo objChildreplace(0)
				AllComputerReplace = "OU=" & objChild.ou & "_prod,"
				'wscript.echo AllComputerReplace
				Set objNewOUAllComputer = GetObject("LDAP://"& AllComputerReplace & OULdapName)
				Set objMoveComputer = objNewOUAllComputer.MoveHere ("LDAP://"& objChildAllComputerConcat & "," & AllComputerOU, objChildAllComputerConcat)
				'wscript.echo AllComputerReplace & OULdapName
				'wscript.echo objChildAllComputerConcat & "," & AllComputerOU
			Next
		End If
	End If
Next

function getOUByComputerName(byval computerName, WhatSearch)
    ' *** Function to find ou/container of computer object from computer name ***

    DIM namingContext, ldapFilter, ou
    DIM cn, cmd, rs
    DIM objRootDSE

    ' Bind to the RootDSE to get the default naming context for
    ' the domain.  e.g. dc=wisesoft,dc=co,dc=uk
    set objRootDSE = getobject("LDAP://RootDSE")
    namingContext = objRootDSE.Get("defaultNamingContext")
    set objRootDSE = nothing

    ' Construct an ldap filter to search for a computer object
    ' anywhere in the domain with a name of the value specified.
    ldapFilter = "<LDAP://"&  namingContext&  _
     ">;(&(objectCategory="&  WhatSearch&  ")(name="&  computerName&  "))"&  _
    ";distinguishedName;subtree"

    ' Standard ADO code to query database
    set cn = createobject("ADODB.Connection")
    set cmd = createobject("ADODB.Command")

    cn.open "Provider=ADsDSOObject;"
    cmd.activeconnection = cn
    cmd.commandtext = ldapFilter

    set rs = cmd.execute

    if rs.eof<>  true and rs.bof<>  true then
        ou = rs(0)
        ou = mid(ou,instr(ou,",")+1,len(ou)-instr(ou,","))
        getOUByComputerName = ou

    end if

    rs.close
    cn.close

end function

 

envoi de mail à une liste d’utilisateur figurant sur un fichier csv avec requète sur l’AD pour obtenir l’adresse mail

Objectif :

Voici un script d’envoi de mail à une liste d’utilisateur de l’active directory créée par le logiciel de gestion de quota Nothern-NSS.
Le but est de signaler aux utilisateurs qu’ils ont dépassé leur quota d’utilisation.
Dans ce cas précis, l’adresse mail du user figure dans le champs description de l’Active Directory.
Les données sont sous cette forme :

Le script :

function Enregistrement_Donnees_Dans_Log($Donneelog)
    {
        $Date = Get-date -f "yyyyMMdd"
        $LogFile = "C:\Temp\mon_Logs_$date.log"
        if(Test-Path $LogFile)
            {
                Add-Content $LogFile $Donneelog -encoding Unicode
            }
        else
            {
                $NouveauFichier = New-Item $LogFile -type file -force
                Add-Content $LogFile $Donneelog -encoding Unicode
            }
    }
function get-mail
    {
    Param(
    [String]$Nom = "",
    [String]$AdresseMail = "",
    [String]$cc = "admin-windows@mon.domaine.fr",
    [String]$TailleQuota = "",
    [String]$UsageQuota = "",
    [String]$PourcentageQuota = ""
    )
    $TailleQuota = $TailleQuota /1MB
    $UsageQuota = $UsageQuota /1MB
    $expediteur = "admin-windows@mon.domaine.fr"
    $destinataire = $AdresseMail
    $serveur = "mail.mon.domaine.fr"
    $objet = "[DSI]Dépassement de quota d'utilisation de votre espace disque en date du  " + [System.DateTime]::Now
    $texte = "Bonjour, vous disposez du compte numéro $Nom. `r`n
    Vous avez dépassé le quota d'utilisation de l'espace disque qui vous est alloué. `r`n
    Vous utilisez $UsageQuota MB sur votre répertoire personnel. L'utilisation maximum autorisée est de $TailleQuota MB. Soit une utilisation de $PourcentageQuota % de votre quota.`r`n
    Vous devez archiver vos données avant qu'elles soient automatiquement supprimées par le système.`r`n
    ---------------------------`r`n
    `r`n
    L'adminstrateur système
    "

    $message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
    $copiecarbone = new-object System.Net.Mail.Mailaddress $cc, "Administrateur Système"
    $message.cc.Add($copiecarbone)
    #$attachment = new-object System.Net.Mail.Attachment $fichier
    #$message.Attachments.Add($attachment)

    $SMTPclient = new-object System.Net.Mail.SmtpClient $serveur
    $SMTPclient.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials

    $SMTPclient.Send($message)
    }

function get-dn ($SAMName)
{
    $root = [ADSI]''
    $searcher = new-object     System.DirectoryServices.DirectorySearcher($root)
        $searcher.filter = "(&(objectClass=user)(sAMAccountName= $SAMName))"
        $user = $searcher.findall()
        foreach ($objResult in $user)
            {
            $objItem = $objResult.Properties; $objItem.description
            }
}

Function ListeLogin
{
  Param(
    [String]$FichierCsv = "emplacement de mon fichier.csv"
  )
$ImportCsv = Import-Csv $FichierCsv -Delimiter ';'

  foreach ($cellule in $ImportCsv)
  {
    $NomLDAP = $cellule.Object.Substring(33,8)
    $AdresseMailLDAP = get-dn $NomLDAP
    write-host $AdresseMailLDAP
    get-mail -Nom $NomLDAP -AdresseMail $AdresseMailLDAP -TailleQuota $cellule.QuotaSize -UsageQuota $cellule.Usage -PourcentageQuota $cellule.UsagePercent
  }
}
ListeLogin

 

Recherche du poids (ou taille) des répertoire en MB

Le but de ce script powershell est de « parser » les répertoires de votre arborescence afin de définir pour chaque répertoire son poids en MB. La fonction de récursivité de Windows étant limitée, une fonction Get-ChildItemToDepth est implémenté. Elle cherchera dans l’arborescence aussi profond que vous lui indiquerez grâce à la valeur passée à l’argument : « -ToDepth 2″.
Il est largement perfectible…

$Chemin = "F:\votre répertoire à scanner\"
$compteur = 0
$total = 0
$Date = Get-date -f "yyyyMMdd"
$chemin_log = "c:\temp\data_total_$Date.csv"
$tableau_csv = @()

Function Get-ChildItemToDepth {
  Param(
  [String]$Path = $PWD,
  [String]$Filter = "*",
  [Byte]$ToDepth = 255,
  [Byte]$CurrentDepth = 0,
  [Switch]$DebugMode
)
  $CurrentDepth++
  If ($DebugMode) {
    $DebugPreference = "Continue"
  }
  Get-ChildItem $Path | %{
    $_ | ?{ $_.Name -Like $Filter
    }
  If ($_.PsIsContainer) {
    If ($CurrentDepth -eq $ToDepth) {
    }
    If ($CurrentDepth -le $ToDepth) {
      Get-ChildItemToDepth -Path $_.FullName -Filter $Filter -ToDepth $ToDepth -CurrentDepth $CurrentDepth
      $concatene = $_.FullName+"\"+$Filter
      $objFSO = New-Object -ComObject Scripting.FileSystemObject
      if($objFSO.FileExists($chemin_log -eq $FALSE)){
        $compteur = $compteur+1
        $data = Get-ChildItem $concatene -recurse  | Measure-Object -property length -sum
        New-Object -TypeName PSObject -Property @{
          Path = $_.FullName
          Name = $_.Name
          Size = $data.Sum
          SizeMB = '{0:N2}' -f ($data.Sum/1mb)
          } | Export-Csv $chemin_log
        }
      else {
        $compteur = $compteur+1
        $data = Get-ChildItem $concatene -recurse | Measure-Object -property length -sum
        New-Object -TypeName PSObject -Property @{
          Path = $_.FullName
          Name = $_.Name
          Size = $data.Sum
          SizeMB = '{0:N2}' -f ($data.Sum/1mb)
          } | add-content $chemin_log
        }
      $total = $total + $colItems.sum
    }
  else {
    if ($compteur -eq 0 ){
    $total_repertoire = (Get-ChildItem $_.FullName).Count
    }
    Write-Debug $("Skipping GCI for Folder: $($_.FullName) " + `
"(Why: Current depth $CurrentDepth vs limit depth $ToDepth)")
    }
  }
}
}
Get-ChildItemToDepth $Chemin -Filter data -ToDepth 2

Configurer PowerShell dans Windows 2008 Server R2

Ajouter le rôle PowerShell avec sa dépendance .NET 3.5

2008_srv_ajout_role_1

Sélectionner la fonctionnalité “Windows Powser Shell” et cliquer sur “Suivant”, puis “Installer”

Configurer les stratégies d’exécution de Power Shell

Il existe 4 stratégies d’exécution pour Power Shell sous Windows 2008 Server :

 

  • Restricted :

 

Saisie interactive de commandes dans la console → Autorisé
Lancement de script → Interdit

 

  • AllSigned :

 

Lancement de script “signés” → Autorisé mais confirmation requise

 

  • RemoteSigned :

 

Les scripts locaux (signés ou non) → Autorisé (Les scripts téléchargés doivent être obligatoirement signés)
Pas de confirmation lors de l’exécution d’un script

 

  • Unrestricted :

Aucune restriction

Choix de stratégie

Par défaut, RemoteSigned est choisi sur ces serveurs mais la stratégie “Restricted” est en place par défaut sur un serveur Windows 2008 Server. Pour vérifier cette configuration, vous pouvez utiliser la commande “Get-ExecutionPolicy” (dans la console Power Shell).

 

Pour modifier la stratégie appliquée au serveur vous pouvez utiliser la commande “Set-ExecutionPolicy” suivi du mode désiré.

Ajouter le rôle PowerShell avec sa dépendance .NET 3.5

Disparition d’un volume au redémarrage d’un windows 2008 server

Suite à la disparition d’un volume (situé sur une baie) sur un serveur Windows 2008 R2, voici les manipulations afin qu’il soit de nouveau opérationnel. Liste des disques et passage de read only à read & write.

  1. Représenter de nouveau le volume de la baie de stockage au serveur.
  2. Lorsque c’est fait, il est possible que ce volume soit en lecture seule.
    1. diskpart (utilitaire de disque)
    2. list disk
    3. select disk 2 (selection du disque désiré)
    4. attributes disk (lecture de l’état du disk : readonly)
    5. attributes disk clear readonly (passage en read & write)
    6. attributes disk (lecture de l’état du disk : read & write)
    7. exit