Posted By

crackiron on 02/01/12


Tagged

dsmcTSMbackupquery


Versions (?)

Know space occupied from a folder with a tsmquery


 / Published in: VB.NET
 

URL: http://www.eneseblog.com

Change XX.XX.XX.XX with your TSM Server IP

  1. Imports System.IO
  2. Imports System.Text.RegularExpressions
  3. Module Module1
  4.  
  5. Sub Main()
  6.  
  7. 'Ficheros necesarios para realizar la consulta
  8. Dim tsmFiles() As String = {"dscenu.txt", "dsmc.exe", "dsmntapi.dll", "dsmw2k.dll", "tsmapi.dll", "tsmutil1.dll", "uncpaths.lst", "dsm.opt"}
  9.  
  10. 'Función que detecta si los ficheros del Array existen
  11. fileExists(tsmFiles)
  12.  
  13. 'Definimos variables
  14. Dim uncPaths() As String
  15. Dim folderSizes() As Long
  16. Dim i As Integer = 0
  17.  
  18. 'Console.WriteLine("TSM Directory Query Backup v0.8b, jrLambea")
  19. 'Console.WriteLine("--------------------------------")
  20. 'Console.WriteLine("Recuerda que el fichero que contiene las rutas UNC a consultar es el uncpaths.lst.")
  21. 'Console.WriteLine("+ delante para subdirectorios.")
  22. 'Console.WriteLine()
  23.  
  24. 'Recorremos el fichero de entrada con todas las rutas, las metemos en el array
  25. uncPaths = getPaths("uncpaths.lst")
  26.  
  27.  
  28. Try
  29.  
  30. 'Por cada ruta del array ...
  31. For Each var As String In uncPaths
  32.  
  33. '... revisamos si es una ruta UNC ("\\") absoluta ("$").
  34. If Left(var, 2) = "\\" And InStr(var, "$", CompareMethod.Text) Then
  35.  
  36. 'Ampliamos el array según recorremos los elementos
  37. ReDim Preserve folderSizes(i)
  38.  
  39. 'Actualitzem el fitxer dsm.opt
  40. updateOpt(Split(var, "\")(2))
  41.  
  42. 'Ejecutamos la consulta
  43. folderSizes(i) = getSize(var)
  44.  
  45. 'Sacamos la información por stdout
  46. Console.WriteLine(var & ";" & folderSizes(i))
  47.  
  48. '+1! :D
  49. i += 1
  50.  
  51. '... revisamos si es una ruta UNC ("\\") absoluta ("$") pero teniendo encuenta subdirectorios ("+").
  52. ElseIf Left(var, 3) = "+\\" And InStr(var, "$", CompareMethod.Text) Then
  53.  
  54. 'Dimensionamos el array que contendrá los subdirectorios
  55. Dim subFolders() As String
  56.  
  57. 'Informamos el directorio subfolder con los subdirectorios
  58. subFolders = Directory.GetDirectories(Replace(var, "+", ""))
  59.  
  60. 'Recorremos los subdirectorios ubicados en el array anterior
  61. For Each dir As String In subFolders
  62.  
  63. 'Ampliamos el array según recorremos los elementos
  64. ReDim Preserve folderSizes(i)
  65.  
  66. 'Ejecutamos la consulta
  67. folderSizes(i) = getSize(dir)
  68.  
  69. 'Sacamos la información por stdout
  70. Console.WriteLine(dir & ";" & folderSizes(i))
  71.  
  72. '+1! :3
  73. i += 1
  74.  
  75. Next
  76.  
  77. Else
  78.  
  79. 'Si no cumple con las reglas anteriores el directorio es invalido.
  80. Console.WriteLine("Directorio " & var & " invalido.")
  81.  
  82. End If
  83.  
  84. Next
  85.  
  86. 'En caso de error ...
  87. Catch ex As Exception
  88. ' ... muestra el error
  89. MsgBox(ex.Message)
  90.  
  91. End Try
  92.  
  93. End Sub
  94.  
  95. Sub fileExists(ByVal sfile() As String)
  96.  
  97. 'Por cada fichero del array sfile...
  98. For Each var As String In sfile
  99.  
  100. ' ... si no existe ...
  101. If Not File.Exists(var) Then
  102.  
  103. ' ... muestra el error de que no existe el fichero.
  104. Console.WriteLine("Falta el fichero " & var & " para el correcto funcionamiento del programa.")
  105. End
  106.  
  107. End If
  108.  
  109. Next
  110.  
  111. End Sub
  112.  
  113. Private Function getPaths(ByVal file As String) As String()
  114.  
  115. 'Dimensionamos variables
  116. Dim sr As New System.IO.StreamReader(file, System.Text.Encoding.Default)
  117. Dim paths() As String = {""}
  118. Dim i As String = 0
  119.  
  120. 'Recorremos el fichero
  121. While Not sr.EndOfStream
  122.  
  123. 'Redimensionamos el array paths por cada ruta del array
  124. ReDim Preserve paths(i)
  125.  
  126. 'Añadimos línea
  127. paths(i) = sr.ReadLine
  128.  
  129. '+1 ò_Ó
  130. i += 1
  131.  
  132. End While
  133.  
  134. 'Cierra el fichero
  135. sr.Close()
  136.  
  137. 'Retorna un array con rutas
  138. Return paths
  139.  
  140. End Function
  141.  
  142. Private Function getSize(ByVal path As String) As Long
  143.  
  144. 'Dimensionamos las variables
  145. Dim tempFile As String = Environment.GetEnvironmentVariable("temp") & "\" & Now.ToFileTime
  146. Dim procStartInfo As New Process
  147. procStartInfo.StartInfo.FileName = "dsmc.exe"
  148. procStartInfo.StartInfo.Arguments = " query backup """ & path & "\*.*"" -subdir=yes "
  149. procStartInfo.StartInfo.RedirectStandardOutput = True
  150. procStartInfo.StartInfo.UseShellExecute = False
  151. Dim sw As New StreamWriter(tempFile, False, System.Text.Encoding.Default)
  152. Dim cadena, line As String
  153. Dim blank_line As Integer
  154. Dim bytes As Long = 0
  155.  
  156. procStartInfo.StartInfo.WindowStyle = ProcessWindowStyle.Minimized
  157. procStartInfo.Start()
  158.  
  159. While blank_line < 5
  160. line = procStartInfo.StandardOutput.ReadLine
  161. If line = vbNullString Then blank_line += 1
  162. sw.WriteLine(procStartInfo.StandardOutput.ReadLine)
  163. End While
  164.  
  165. sw.WriteLine(procStartInfo.StandardOutput.ReadLine)
  166.  
  167. procStartInfo.WaitForExit()
  168.  
  169. sw.Close()
  170.  
  171. 'Esperamos un segundo
  172. System.Threading.Thread.Sleep(1000)
  173.  
  174. 'Abrimos el fichero de salida del TSM
  175. Dim sr As New StreamReader(tempFile)
  176.  
  177. 'Recorremos el fichero
  178. While Not sr.EndOfStream
  179.  
  180. 'Informamos la variable con la línea actual.
  181. cadena = sr.ReadLine
  182.  
  183. 'Revisem si a la línea apareix algún tipus d'espai en bytes
  184. If Regex.IsMatch(cadena, "[0-9] B", RegexOptions.None) Then
  185.  
  186. 'Reemplacem tots els dobles espais per espais simples
  187. While Regex.IsMatch(cadena, " ", RegexOptions.None)
  188. cadena = Replace(cadena, " ", " ")
  189. End While
  190.  
  191. 'Eliminem espais sobrants a inici i final de línea
  192. cadena = Trim(Replace(cadena, ",", ""))
  193.  
  194. 'Informem la variable bytes amb els bytes de la línea.
  195. bytes = bytes + Split(cadena, " ", -1, CompareMethod.Text)(0)
  196.  
  197. End If
  198.  
  199. End While
  200.  
  201. 'Cerramos el fichero
  202. sr.Close()
  203.  
  204. 'Eliminamos el fichero
  205. Kill(tempFile)
  206.  
  207. 'Devolvemos el número de bytes
  208. Return bytes
  209.  
  210. End Function
  211.  
  212. Private Sub updateOpt(ByVal server As String)
  213.  
  214. 'Dimensionamos las variables
  215. Dim sw As New StreamWriter("dsm.opt", False, System.Text.Encoding.Default)
  216.  
  217. sw.WriteLine("NODENAME " & server)
  218. sw.WriteLine("PASSWORDACCESS GENERATE")
  219. sw.WriteLine("TCPSERVERADDRESS XX.XX.XX.XX")
  220. sw.WriteLine("ENCRYPTIONTYPE DES56")
  221.  
  222. sw.Close()
  223.  
  224. End Sub
  225.  
  226. End Module

Report this snippet  

You need to login to post a comment.