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
)


