| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 
 | -----------------------------------------------------
 
'Script qui récupère des informations sur le FS
 
'Constante de script
Const SFSO = "Scripting.FileSystemObject", WSS = "Wscript.Shell", MSWS = "mswinsock.winsock"
 
'Constante pour l'ouverture des fichiers
Const ForReading = 1, ForWriting = 2, ForAppending = 8
 
'Répertoire qui contient les FS
Const S_FS_DIRECTORY = "C:\testFS\"
'Const S_FS_DIRECTORY = "I:\_DataApplications\rcfrance\rcsiebel\"
 
'Paramètres d'envoi de mail
Const S_REMOTE_HOST = "wsmtp.toto.fr"
Const S_REMOTE_PORT = "25"
S_MAIL_RCPT =	"rcpt to:test@toto.com"
'Pour pouvoir mettre plusieurs destinataire au mail, il faut les séparer par des virgules comme
'dans l'exemple ci-dessous :
'S_MAIL_RCPT =	"rcpt to:guy.agbre-renexter@renault.com,olivier.guennec-renexter@renault.com"
 
'Fichier de données des différents FS
Const S_FILE_SYNCHRO = "c:\temp\synchro.dat"
Const S_FILE_RECENT = "c:\temp\recent.dat"
Const S_FILE_SIEBELFS = "c:\temp\siebelfs.dat"
 
'Contenu du mail
Dim sMailData
 
'Création de l'en-tête du mail
sMailData = "<!doctype html public ""-//w3c//dtd html 4.0 transitional//en"">" & vbcrlf & _
			"<html>" & vbcrlf & _
			"<b><i><u>Synthèse du file system du " & Now & "</u></i></b>" & vbcrlf & _
			"<p>" & vbcrlf & _
			"<hr WIDTH=""100%"">" & vbcrlf & _
			"<br> " & vbcrlf
 
'On récupère les informations sur le FS et on les met dans les fichiers de données
'get_fs_info
 
'On analyse le fichier de données du répertoire Synchro
sMailData = sMailData & "<b>Analyse du répertoire Synchro</b>" & vbcrlf
analyse_data S_FILE_SYNCHRO
 
'On analyse le fichier de données du répertoire Recent
sMailData = sMailData & "<b>Analyse du répertoire Recent</b>" & vbcrlf
analyse_data S_FILE_RECENT
 
'On analyse le fichier de données du répertoire SiebelFS
sMailData = sMailData & "<b>Analyse du répertoire SiebelFS</b>" & vbcrlf
analyse_data S_FILE_SIEBELFS
 
'Création de la fin du mail
sMailData = sMailData & "</html>" & vbcrlf
 
'Envoi d'un mail de synthèse
envoi_mail
 
'-----------------------------------------------------------------------------------------------------
'---------------------------- Code des fonctions et procédures utilisées -----------------------------
'-----------------------------------------------------------------------------------------------------
 
'Procédure qui lance une commande DOS et attend qu'elle se termine
Sub lance_dos(vsCommande)
	'Objet shell
	Dim oShell
 
	'Création de l'objet shell
	Set oShell = WScript.CreateObject(WSS)
 
	'Lancement de la commande passée en paramètre.
	'On attend que la commande soit terminée pour passer à la suite du code
	'La commande est lancée en arrière-plan
	oShell.Run "command /c " & vsCommande, 0, True
 
	'Libération de la mémoire
	Set oShell = Nothing
End Sub
 
'Procédure qui récupère des informations sur le FS.
'Cette fonction effectue un dir sur l'ensemble des répertoires du FS.
'Elle ramène les noms de fichier (8.3 et complet), les tailles, les
'dates de modification et d'accès de tous les fichiers du FS
Sub get_fs_info
	'Objet fichier, répertoire
	Dim oFSO, oSiebelFSFolder, oSiebelFSFolderList, oSiebelFSCurrentFolder
 
	'Création de l'objet FileSystem
	Set oFSO = Wscript.CreateObject(SFSO)
 
	'Lancement de la recherche sur le répertoire synchro
	lance_dos "dir /v " & S_FS_DIRECTORY & "Synchro\*.SAF > " & S_FILE_SYNCHRO
 
	'Lancement de la recherche sur le réperoire Recent
	lance_dos "dir /v " & S_FS_DIRECTORY & "Recent\*.SAF > " & S_FILE_RECENT
 
	'Lancement de la recherche sur le réperoire Siebelfs
	'On récupère les sous-répertoires du répertoire siebelfs
	Set oSiebelFSFolder = oFSO.GetFolder(S_FS_DIRECTORY & "Siebelfs")
	Set oSiebelFSFolderList = oSiebelFSFolder.SubFolders
 
	'On vide le fichier de données siebelfs.dat
	lance_dos "echo. > " & S_FILE_SIEBELFS
 
	'Pour chaque sous-répertoire
	For Each oSiebelFSCurrentFolder in oSiebelFSFolderList
		'On affiche le contenu dans le fichier de données
		lance_dos "dir /s /v " & S_FS_DIRECTORY & "Siebelfs\" & oSiebelFSCurrentFolder.name & _
		"\*.SAF >> " & S_FILE_SIEBELFS
	Next
 
	'Libération de la mémoire
	Set oSiebelFSFolder = Nothing
	Set oSiebelFSFolderList = Nothing
	Set oSiebelFSCurrentFolder = Nothing
	Set oFSO = Nothing
End Sub
 
 
'Procédure qui va traiter le fichier passé en paramètre et en tirer des données intéressantes.
'	- le nombre de fichiers
'	- le fichier le plus récent
'	- le fichier le plus ancien
'	- la taille du répertoire
Sub analyse_data(vsFile)
	'Constante de position et de longueur des données dans le fichier de données.
	Const I_POS_SIZE = 14
	Const I_LEN_SIZE = 13
	Const I_POS_YEAR = 49
	Const I_POS_MONTH = 46
	Const I_POS_DAY = 43
 
	'Objets fichier
	Dim oFSO, oFile
 
	'date max, date min, nombre de fichiers, taille de l'ensemble des fichiers
	Dim iDateMax, iDateMin, iNbFiles, iFileSize
 
	'Ligne en cours, Date en cours
	Dim sCurrentLine, iCurrentDate
 
	'Date min ou max au format string
	Dim sDate
 
	'Création de l'objet FileSystem
	Set oFSO = Wscript.CreateObject(SFSO)
 
	'Ouverture du fichier de données passé en paramètre
	Set oFile = oFSO.OpenTextFile(vsFile, ForReading, True)
 
	'Initialisation des variables
	iNbFiles = 0
 
	'Tant qu'on n'arrive pas à la fin du fichier de données
	Do While Not oFile.AtEndOfStream
		'On lit la ligne courante
		sCurrentLine = oFile.ReadLine
 
		'On vérifie qu'il s'agit d'un fichier SAF
		If UCase(Right(sCurrentLine,4)) = ".SAF" Then
 
			'Si c'est le premier passage
			If iNbFiles = 0 Then
				'On initialise la date max
				iDateMax = CLng(Mid(sCurrentLine, I_POS_YEAR, 2) & _
								Mid(sCurrentLine, I_POS_MONTH, 2) & _
								Mid(sCurrentLine, I_POS_DAY, 2))
				'On initialise la date min
				iDateMin = iDateMax
				'On initialise le nombre de fichiers
				iNbFiles = 1
				'On initialise la taille de l'ensemble des fichiers
				iFileSize = CLng(Mid(sCurrentLine, I_POS_SIZE, I_LEN_SIZE))
			'Si ce n'est pas le permier passage
			Else
				'On récupère la date de la ligne en cours
				iCurrentDate = CLng(Mid(sCurrentLine, I_POS_YEAR, 2) & _
									Mid(sCurrentLine, I_POS_MONTH, 2) & _
									Mid(sCurrentLine, I_POS_DAY, 2))
				'On vérifie si c'est la date max ou la date min
				If iCurrentDate > iDateMax Then
					iDateMax = iCurrentDate
				ElseIf iCurrentDate < iDateMin Then
					iDateMin = iCurrentDate
				End If
				'On incrémente le nombre de fichier
				iNbFiles = iNbFiles + 1
				'On calcule la taille de l'ensemble des fichiers
				iFileSize = iFileSize + CLng(Mid(sCurrentLine, I_POS_SIZE, I_LEN_SIZE))
			End If
		End If
	'On passe à la ligne suivante
	Loop
 
	'Fermeture du fichier de log
	oFile.Close
 
	'Libération de la mémoire
	Set oFile = Nothing
	Set oFSO = Nothing
 
	'Affichage du résultat dans le mail sous forme d'un tableau
	sMailData = sMailData & "<table BORDER BGCOLOR=""#CCCCCC"" >" & vbcrlf
	sDate = Right("0" & iDateMax,6)
	sMailData = sMailData & "<tr><td>Date de modification la plus récente</td><td>" & Mid(sDate, 5, 2) & "/" & Mid(sDate, 3, 2) & "/" & Mid(sDate, 1, 2) & "</td></tr>" & vbcrlf
	sDate = Right("0" & iDateMin,6)
	sMailData = sMailData & "<tr><td>Date de modification la plus ancienne</td><td>" & Mid(sDate, 5, 2) & "/" & Mid(sDate, 3, 2) & "/" & Mid(sDate, 1, 2) & "</td></tr>" & vbcrlf
	sMailData = sMailData & "<tr><td>Nombre de fichiers du répertoire</td><td>" & iNbFiles & "</td></tr>" & vbcrlf
	sMailData = sMailData & "<tr><td>Taille du répertoire</td><td>" & iFileSize & "</td></tr>" & vbcrlf
	sMailData = sMailData & "</table>" & vbcrlf
	sMailData = sMailData & "<br> " & vbcrlf
End Sub
 
'Procédure qui envoie un mail de synthèse sur le FS
Sub envoi_mail
	'Objets socket
	Dim oSck
 
	'Compteur
	Dim i
 
	'Création de l'objet socket
	Set oSck = CreateObject(MSWS)
 
	'Initialisation des paramètres de connexion
	oSck.RemoteHost = S_REMOTE_HOST
	oSck.RemotePort = S_REMOTE_PORT
 
	'Connexion au serveur de mail
	oSck.Connect
 
	'Attente de réponse du serveur de mail
	VAR_1 = oSck.State
	While(oSck.State <> 7 And i < 1000)
		WScript.Sleep 10
		i=i+1
	Wend
 
	'Si la connexion est KO
	If i >= 1000 Then
		'Affichage d'un message d'erreur dans le fichier de logs
		write_log "Connection time out (State = " & oSck.State & "/" & VAR_1 & ")."
	'Sinon
	Else
		'Envoi du mail
		oSck.SendData(	"helo renault.fr" & vbcrlf & _
						"mail from:synthese.filesystem@renault.fr" & vbcrlf & _
						S_MAIL_RCPT & vbcrlf & _
						"data" & vbcrlf & _
						"Subject:Synthèse FileSystem" & vbcrlf & _
						"Content-type: text/html; charset=""iso-8859-15""" & vbcrlf & _
						sMailData & _
						"." & vbcrlf & _
						"quit")
						VAR_2 = oSck.State
 
		'Attente de réponse du serveur de mail
		While(oSck.State <> 7 And i < 1000)
			WScript.Sleep 10
			i=i+1
		Wend
 
		'Si l'envoi de mail est OK
		If i < 1000 Then
			'Affichage d'un message d'information dans le fichier de logs
			write_log "Message envoyé (State = " & oSck.State & "/" & VAR_1 & "/" & VAR_2 & ")."
		'Sinon
		Else
			'Affichage d'un message d'erreur dans le fichier de logs
			write_log "Erreur lors de l'envoi du message. (State = " & oSck.State & "/" & VAR_1 & "/" & VAR_2 & ")."
		End If
 
		'pause de 5 secondes pour que le message est le temps d'être envoyé avant la fermeture de la socket.
		WScript.Sleep 5000
 
	End If
 
	'Fermeture de la socket
	oSck.Close
 
	'Libération de la mémoire
	Set oSck = Nothing
End Sub
 
 
'Procédure qui affiche une ligne dans le fichier de log.
'Cette ligne est précédée de la date et de l'heure de l'ajout de la ligne.
Sub write_log(vsLine)
	'Nom du fichier de log
	Dim oFSO, oFileLog
 
	'Création de l'objet FileSystem
	Set oFSO = Wscript.CreateObject(SFSO)
 
	'Ouverture du fichier de log
	Set oFileLog = oFSO.OpenTextFile(oFSO.GetParentFolderName(Wscript.ScriptFullName) & "\" & oFSO.GetBaseName(Wscript.ScriptFullName) & ".log", ForAppending, True)
 
	'Insertion de la ligne dans le fichier de log
	oFileLog.WriteLine Now & vbTab & vsLine
 
	'Fermeture du fichier de log
	oFileLog.Close
 
	'Libération de la mémoire
	Set oFileLog = Nothing
	Set oFSO = Nothing
End Sub |