Pequeña aplicación sapea IPs en VB.NET y MongoDB

Resulta que en el trabajo me pidieron hacer un listado con todas las IPs de los PCs para usar el VNC Viewer. No eran muchos, unos 10 (en mi lugar de trabajo), y fue cosa de hacer un excel y listo.

Peeeero, resulta que aquí la red es wi-fi con un dhcp malvado… vez que reinician el router queda la escoba con el listado…

Por eso me dio por hacer una pequeñita aplicación que tomara la IP y el nombre de la máquina de la persona y la guardara en una colección😀 así de fácil.

Salto y a picar código🙂

Asumo que ya saben cómo instalar mongo (si no, lo pueden buscar atrás en los post), así que me salto esa parte.

Primero, tengo un XML con las configuraciones del servidor. Algo así:

<?xml version="1.0" encoding="utf-8" ?>
<Preferencias>
  <Servidor>192.168.2.113</Servidor>
  <Puerto>27017</Puerto>
  <Base>proexsi</Base>
</Preferencias>

Se explica bastante claro creo😀

Lo segundo es leer las configuraciones. Esto lo metí dentro de una función en mi clase que devuelve el string de conexión:

Private Function Preferencias() As String
        Try
            Dim string_preferencias As New StringBuilder
            Dim lector As XmlTextReader = New XmlTextReader("preferencias.xml")
            lector.ReadToFollowing("Servidor")
            string_preferencias.Append(lector.ReadElementContentAsString).Append(":")
            lector.ReadToFollowing("Puerto")
            string_preferencias.Append(lector.ReadElementContentAsString).Append("/")
            lector.ReadToFollowing("Base")
            string_preferencias.Append(lector.ReadElementContentAsString)
            Return "mongodb://" & string_preferencias.ToString
        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Return Nothing
        End Try
    End Function

En el constructor de mi clase funciones realizo la conexión y cosas, tomando el parámetro de la función anterior

Public Sub New()
        Try
            Dim conString As String = getPreferencias()
            obj_mongoserver = MongoServer.Create(conString)
            proexsiBD = obj_mongoserver.GetDatabase("proexsi")
            usuarios = proexsiBD.GetCollection("usuarios")
        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Me.error_ = ex.Message
            Console.ReadLine()
            Return
        End Try
    End Sub

Como ven, tengo el servidor, la bd y la colección que vamos a usar. Estos atributos los instanc(s,z)io así:

 Private datos_ips As List(Of String)
    Private obj_mongoserver As MongoServer
    Private proexsiBD As MongoDatabase
    Private usuarios As MongoCollection
    Private error_ As String = "Error"

Sigamos. Ahora leemos las IPs con el siguiente código:

Private Function IPeses() As List(Of String)
        Dim valores As New List(Of String)
        For Each tmp As IPAddress In Dns.GetHostEntry(Dns.GetHostName).AddressList
            If (tmp.ToString.Length < 15) Then
                valores.Add(Dns.GetHostName)
                valores.Add(tmp.ToString)
                Return valores
            End If
        Next
        Return Nothing
    End Function

Como leen, el Dns.GetHostEntry(“nombre_de_maquina”).AddressList devuelve un array, que desmenuzamos con un for each. El array trae la ip, y direcciones MACs. No se me ocurrió otra forma de saber si era IP o MAC😛

La función anterior, a su vez, es parámetro de otra, que se encarga de ingresar los valores en la bd. El código es así:

Private Function Ingreso(valores As List(Of String)) As Boolean
        Try
            valores.ForEach(Sub(x As String) Console.WriteLine(x))
            Console.WriteLine("----------------------------------------------------------")
            Dim usuario As New BsonDocument
            If Not existe(valores(0)) Then
                usuario("Nombre") = "usuario"
            End If
            usuario("PC") = valores(0)
            usuario("IP") = valores(1)
            Console.WriteLine(usuario.Elements.ToJson.ToString)
            Console.WriteLine("----------------------------------------------------------")

            If usuario.ElementCount = 3 Then
                usuarios.Insert(usuario)
            Else
                Dim q = Query.EQ("PC", valores(0))
                Dim u = Update.Set("IP", valores(1))
                usuarios.FindAndModify(q, Nothing, u, True)
            End If
            Return True
        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Return False
        End Try
    End Function

Aquí tenemos un insert y un update set. Básicamente revisamos si es primera vez que se registra el PC o es una actualización de IP.
La manera de crear documentos es bastante simple, y de hecho se parece al ingreso de json😀 . Una vez que lo tenemos listo, simplemente no insertamos tal cual.
Si no, hacemos una actualización de UN ATRIBUTO del documento, no el documento entero ! q es el filtro (que la máquina sea = a “Mario-PC” por ejemplo) y el valor a actualizar es la IP en la variable u. Ingresamos y se acaba el problema🙂

La última función, es para ver si el registro es nuevo o no. El código es el siguiente:

Private Function existe(pc As String) As Boolean
        Try
            Dim registros As MongoCollection(Of BsonDocument) =
                proexsiBD.GetCollection(Of BsonDocument)("usuarios")
            Dim array As New List(Of String)
            array.Add(pc)
            Dim q = Query.All("PC", BsonArray.Create(array))
            Console.WriteLine(registros.Find(q).Query)
            Console.WriteLine("----------------------------------------------------------")
            If registros.Find(q).Count = 0 Then
                Console.WriteLine("Nuevo")
                Return False
            Else
                Console.WriteLine("Existe")
                Return True
            End If
        Catch ex As Exception
            Console.WriteLine("* * * " & ex.Message & " * * *")
            Return Nothing
        End Try
    End Function

Aquí hacemos una búsqueda de todos los documentos, si el valor de PC existe en algún lado con el valor Mario-PC Si no encontramos ningún documento que contenga al PC Mario-PC, es uno nuevo. Si no, lo contrario🙂

Por último, el ejecutable de consola:

Sub Main()
        Dim c As New Controlador
        Dim flag As Boolean = c.setIngreso(c.getDatos_ips)
        If flag Then
            Console.Write("IP Actualizada")
        Else
            Console.WriteLine("x_X")
        End If
        Console.ReadLine()
    End Sub

Se instanc(s,z)ia la clase y eso sería todo🙂

Como leen, es una aplicación de consola (No necesito que el usuario interactue ni nada😯 )

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en Aplicación, MongoDB, VB, Windows. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s