El blog de Miguel Díaz
Siguiente

RoboCAUpy

Copia eficiente de archivos, toda la potencia de robocopy con una interfaz sencilla y fácil de usar. Herramienta perfecta para migraciones de equipos y copia masiva de ficheros.Saber mas

Screenshot RoboCAUpy

mRemoto

Administra remotamente equipos, controlalos gráficamente o través de la línea de comandos, envía y recibe archivos, habla con el usuario y mucho mas sin ningún tipo de configuración previa.Saber mas

Screenshot mRemoto
screenshot mRemoto

DNSPropagationChecker

Controla la propagación DNS de cualquier dominio. Con un solo clic conocerás al instante si se ha propagado en los diferentes servidores DNS existentes.Saber mas

Acortador de nombres

Detecta ficheros con nombres largos, acortalos de forma masiva y reduce el tamaño de la ruta a la cantidad de carácteres que quieras.
Saber mas

screenshot Acortador Nombres
Anterior
Domingo 21 de agosto del 2011

Recientemente he cambiado el servidor del blog y las DNS han tardado bastante mas de lo esperado en propagarse, realmente me sentia desconcertado tras las primeras 8 horas sin rastro de vida en el blog, no sabía si las IP se estaban propagando o no y realmente hacer un seguimiento con nslookup era un suplicio.

Por eso he programado DNS Propagation Checker, que básicamente nos servirá para comprobar el estado de la propagación DNS del dominio que queramos en un listado enorme (editable a través de un INI) de DNS.

La interfaz del programa es muy sencilla: introducimos el dominio y la IP a la que debe apuntar, damos a comprobar y  en unos segundos tendremos el listado de todas las DNS a donde se ha propagado.

Es importante que descomprimáis todo el contenido, ya que aparte del exe hay un .ini donde se guarda un listado importante de DNS.

Como siempre, os dejo el código fuente de la aplicación. Es necesario un proyecto con un Formulario (Form1) que contenga dos textbox (tbDominio, tbIP), dos ListBox (listDNSPropagados, lbServidoresDNS), dos botones (btComprobar, btAñadir), y otro formulario (Form2) con un textbox (TextBox1) y un boton (Button1).

Form1.vb

Imports System
Imports System.IO
Imports System.Text.RegularExpressions
'Lectura de archivos INI
Imports System.Runtime.InteropServices
Public Class DNSPropagationChecker
    'Esta funcion devueve true si la IP introducida es valida y false si no es valida
    Function compruebaIP(ByVal strFindin As String)


Continuación Form1.vb

        Dim myRegex As New Regex("^(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d)$")
        If myRegex.IsMatch(strFindin) Then
            compruebaIP = True
        Else
            compruebaIP = False
        End If
    End Function
    Private Sub DNSPropagationChecker_Load() Handles MyBase.Load
        'Comprueba que el INI exista, si no existe lo crea con los servidores de Google de ejemplo.
        If System.IO.File.Exists(Application.StartupPath & "/dnspropagationchecker.ini") = False Then
            Dim Ini As CIniClass
            Ini = New CIniClass
            Ini.Archivo = Application.StartupPath & "/dnspropagationchecker.ini"
            Ini.GrabaIni("DNS", "SERVIDOR1", "8.8.8.8")
            Ini.GrabaIni("DNS", "SERVIDOR2", "8.8.4.4")
        End If
        Try
            cargaListadoDNS()
        Catch ex As Exception
            MsgBox("No se ha podido cargar dnspropagationchecker.ini")
            End
        End Try
    End Sub
    Private Sub btComprobar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btComprobar.Click
        Dim cantidadDNS As Integer = 1
        Dim contador As Integer = 0
        'Comprueba que haya puesto un dominio
        tbDominio.Text = tbDominio.Text.Replace(" ", "")
        tbIP.Text = tbIP.Text.Replace(" ", "")
        listDNSPropagados.Items.Clear()
        If tbDominio.Text = "" Then
            MsgBox("Debe introducir un nombre de dominio", MsgBoxStyle.Information)
            Exit Sub
        End If
        'Comprueba que haya puesto una IP valida
        If compruebaIP(tbIP.Text) = False Then
            MsgBox("Debe introducir una IP válida", MsgBoxStyle.Information)
            Exit Sub
        End If
        'Si se ha elegido el servidor Todos, guarda en el array todos los DNS. Si solo elige uno
        'Crea un array valor 0 y mete el servidor DNS concreto
        If lbServidoresDNS.SelectedIndex = 0 Then
            cantidadDNS = lbServidoresDNS.Items.Count() - 1
        End If
        Dim arrayDNS(cantidadDNS - 1) As String
        If lbServidoresDNS.SelectedIndex = 0 Then
            While contador                 arrayDNS(contador) = lbServidoresDNS.Items(contador + 1).ToString
                contador += 1
            End While
        Else
            arrayDNS(0) = lbServidoresDNS.Items(lbServidoresDNS.SelectedIndex).ToString
        End If
        'Desactiva los controles
        tbDominio.Enabled = False
        lbIP.Enabled = False
        lbServidoresDNS.Enabled = False
        btComprobar.Text = "Comprobando..."
        btComprobar.Enabled = False
        lbDNSPropagados.Visible = True
        listDNSPropagados.Visible = True
        'Prepara el proceso nslookup para que no se muestre la ventana de DOS
        Dim proceso As New Process
        proceso.StartInfo.RedirectStandardOutput = True
        proceso.StartInfo.FileName = "nslookup.exe"
        proceso.StartInfo.UseShellExecute = False
        proceso.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
        proceso.StartInfo.CreateNoWindow = True
        'Lo lanza contra cada servidor DNS recorriendo el array
        contador = 0
        While contador < arrayDNS.Length             proceso.StartInfo.Arguments = "-retry=1 -timeout=1 " & tbDominio.Text & " " & arrayDNS(contador)             proceso.Start()             Dim sr As IO.StreamReader = proceso.StandardOutput             Dim sb As New System.Text.StringBuilder("")             Dim sinput As String = ""             Do Until sinput = "-1"                 Dim resultado As String = sr.ReadLine                 'En caso de que devuelva algo con la IP buena, lo declara propagado                 If InStr(resultado, tbIP.Text) Then                     listDNSPropagados.Items.Add(arrayDNS(contador))                 ElseIf InStr(resultado, "timeout") Then                     sinput = "-1"                     proceso.Close()                 Else                     sinput = sr.Read()                 End If             Loop             contador += 1         End While         If listDNSPropagados.Items.Count = 0 Then             listDNSPropagados.Items.Add("Aún no se ha propagado en ningun servidor DNS seleccionado")         End If         'Reactiva los controles         tbDominio.Enabled = True         lbIP.Enabled = True         lbServidoresDNS.Enabled = True         btComprobar.Text = "Comprobar propagacion"         btComprobar.Enabled = True     End Sub     'Esta funcion devueve true si la IP introducida es valida y false si no es valida     Function compruebaIP(ByVal strFindin As String)         Dim myRegex As New Regex("^(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d)$")         If myRegex.IsMatch(strFindin) Then             compruebaIP = True         Else             compruebaIP = False         End If     End Function     Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked         System.Diagnostics.Process.Start("http://www.blogdemigueldiaz.com/?proyecto=DNSPropagationChecker")     End Sub     Public Class CIniClass         Private m_Ini As String         Private Declare Function GetPrivateProfileStringKey Lib "kernel32" Alias _         "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal _         lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString _         As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer         Private Declare Function WritePrivateProfileString Lib "kernel32" Alias _         "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal _         lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer         Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer         Property Archivo() As String             Get                 Archivo = m_Ini             End Get             Set(ByVal value As String)                 m_Ini = value             End Set         End Property         'Leer una llave de un archivo .ini         Public Function LeeIni(ByVal Seccion As String, ByVal Llave As String) As String             Dim Est As String = New String(Chr(0), 255)             Dim i As Long = GetPrivateProfileString(Seccion, Llave, "", Est, Len(Est), Archivo)             If i > 0 Then
                LeeIni = Est.Split(Chr(0))(0)
            Else
                LeeIni = ""
            End If
        End Function
        Public Sub GrabaIni(ByVal Seccion As String, ByVal Llave As String, ByVal Valor As String)
            Dim lret As Long
            lret = WritePrivateProfileString(Seccion, Llave, Valor, m_Ini)
        End Sub
    End Class
    Private Sub btAñadir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAñadir.Click
        Form2.cantidadElementos = lbServidoresDNS.Items.Count()
        Form2.Show()
    End Sub
    Public Sub cargaListadoDNS()
        lbServidoresDNS.Items.Clear()
        lbServidoresDNS.Items.Add("Todos")
        Dim Ini As CIniClass
        Ini = New CIniClass
        Ini.Archivo = Application.StartupPath & "/dnspropagationchecker.ini"
        Dim contador As Integer = 1
        Dim servidor As String = "-1"
        While servidor <> ""
            servidor = Ini.LeeIni("DNS", "SERVIDOR" & contador)
            If servidor <> "" Then
                lbServidoresDNS.Items.Add(servidor)
            End If
            contador += 1
        End While
        lbServidoresDNS.SelectedIndex = 0
    End Sub
End Class

Form2.vb

Public Class Form2
    Public cantidadElementos As Integer = 0
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  'Guarda el DNS en el .ini
        If DNSPropagationChecker.compruebaIP(TextBox1.Text) = True Then
            Dim Ini As CIniClass
            Ini = New CIniClass
            Ini.Archivo = Application.StartupPath & "/dnspropagationchecker.ini"
            Ini.GrabaIni("DNS", "SERVIDOR" & cantidadElementos, TextBox1.Text)
            DNSPropagationChecker.cargaListadoDNS()
            Me.Close()
        Else
            MsgBox("Esa no es una IP Valida", MsgBoxStyle.Information)
        End If
    End Sub
    Public Class CIniClass
        Private m_Ini As String
        Private Declare Function GetPrivateProfileStringKey Lib "kernel32" Alias _
        "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal _
        lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString _
        As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
        Private Declare Function WritePrivateProfileString Lib "kernel32" Alias _
        "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal _
        lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer
        Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
        Property Archivo() As String
            Get
                Archivo = m_Ini
            End Get
            Set(ByVal value As String)
                m_Ini = value
            End Set
        End Property
        'grabar una llave a un archivo ini
        Public Sub GrabaIni(ByVal Seccion As String, ByVal Llave As String, ByVal Valor As String)
            Dim lret As Long
            lret = WritePrivateProfileString(Seccion, Llave, Valor, m_Ini)
        End Sub
    End Class
End Class
  • Tweet

Acerca de Miguel Díaz

Informático, enamorado de la programación, diseño Web y el deporte.
Categorías: Diseño Web, DNSPropagationChecker, Internet, Programación, Proyectos, Servidores, Utilidades. Etiquetas: , , , , , , , .

Un comentario en Comprobar el estado de la propagación DNS – DNSPropagationChecker

  1.  Álex Navarro dice:

    Muy instructivo, como siempre.

    Sigue así chavalote!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Blog de Miguel Díaz
Diseño Web por Miguel Díaz.