Python - [TUTORIAL] DDNS UPDATER NOIP

   
Vista:

[TUTORIAL] DDNS UPDATER NOIP

Publicado por Edgar (10 intervenciones) el 20/09/2017 22:36:15
Buenas noches a tod@s,

Hoy escribo este post para ayudar a todo el mundo que a podido estar en mi situación... Me explico mejor, desde hace un tiempo, tengo un servidor casero instalado con apache y mysql. Dicho servidor, no tiene una IP fija, por lo cual, contrate los servicios de NOIP. La verdad es que en Windows, con su programa estoy más que satisfecho, pero en linux es otra cosa... Pedí un día ayuda para cambiar unas direcciones y su respuesta fue, "tienes que desinstalar y volver a instalar el programa". La verdad es que me quede sorprendido de esta respuesta. Hoy cansado de tener que hacer dicha operación varias veces, he decidido instalar el programa suyo para una única dirección (digamos la "maestra") por si hubiera cualquier problema y todas las demás administrarlas a trabes de un programa de python y base de datos.

¿Por que almacenar las direcciones en una base de datos? Sencillo, me gusta administrar la información fácilmente y cómodamente, es decir, añadir/eliminar, activar/desactivar rápidamente las direcciones.


Sin más preamvulos, el código python:

1
2
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
import MySQLdb
import os
 
import pycurl
import urllib
import cStringIO
 
 
## DATOS NOIP ##
NOIP_USUARIO = ''  ## Usuario de NOIP.
NOIP_PASSWORD = ''  ## Password/contraseNa de usuario de NOIP.
 
NOIP_DOMURLIP = 'http://ippublica.proyectosamedida.es'  ## URL desde donde se obtiene la IP publica del router.
 
 
## DATOS MYSQL ##
MYSQL_USUARIO  = ''     ## Usuario MYSQL.
MYSQL_PASSWORD = ''  ## Password/contraseNa.
 
MYSQL_BBDD  = ''  ## Nombre de la base de datos.
MYSQL_TABLA = ''  ## Nombre de la tabla.
 
MYSQL_DIRRECION = 'localhost'  ## Direccion de donde se encuentra la base de datos.
 
 
RegistroDDNS   = []
RegistroEstado = []
EquipoRegistro = []
 
i = 0
 
 
def func_ippublica():
   response = cStringIO.StringIO()
 
 
 
   c = pycurl.Curl()
   c.setopt(pycurl.URL, NOIP_DOMURLIP)
   c.setopt(c.WRITEFUNCTION, response.write)
   c.perform()
   c.close()
 
 
   ippublica = response.getvalue()
 
 
   i = ippublica.find('->')
   f = ippublica.find('<-')
 
   ippublica = ippublica[i+2:f]
 
   print 'LA IP PUBLICA ACTUAL ES: ' + ippublica + '\n'
   return ippublica
 
 
def func_cambiarIP(DirDDNS, PublicaIP):
   response = cStringIO.StringIO()
 
   print DirDDNS + '\n'
   #print PublicaIP + '\n'
 
 
   url = 'http://' + NOIP_USUARIO + ':' + NOIP_PASSWORD + '@dynupdate.no-ip.com/nic/update?hostname=' + DirDDNS + '&myip=' + PublicaIP
 
   print url
 
 
   c = pycurl.Curl()
   c.setopt(pycurl.URL, url)
   c.setopt(c.WRITEFUNCTION, response.write)
   c.perform()
   c.close()
 
 
   respuesta = response.getvalue()
 
   print respuesta
 
 
 
# Establecemos la conexin con la base de datos
bd = MySQLdb.connect(MYSQL_DIRRECION,MYSQL_USUARIO,MYSQL_PASSWORD,MYSQL_BBDD)
 
# Preparamos el cursor que nos va a ayudar a realizar las operaciones con la base de datos
cursor = bd.cursor()
 
# Preparamos el query SQL para obtener el empleado de la BD
sql = "SELECT * FROM " + MYSQL_TABLA
try:
   # Ejecutamos el comando
   cursor.execute(sql)
   # Obtenemos todos los registros en una lista de listas
   resultados = cursor.fetchall()
   for registro in resultados:
      ID = registro[0]
 
      DDNS = registro[4]
      ESTADO = registro[5]
 
 
      # Imprimimos los resultados obtenidos
      #print "OK "
      #print ID
 
      #print DDNS
 
 
      RegistroDDNS.append(DDNS)
      RegistroEstado.append(ESTADO)
 
 
except (MySQLdb.Error, MySQLdb.Warning) as e:
   print e
 
#print RegistroDDNS
 
IP=func_ippublica()
 
 
 
 
for val in RegistroEstado:
   #print val
 
   if val == 1:
 
      func_cambiarIP(RegistroDDNS[i], IP)
 
   i+= 1

NOTAS CÓDIGO
1. "NOIP_DOMURLIP" esta variable es donde se tiene que poner la url de la web que nos dará la IP publica, en este caso he dejado la de un servidor que tengo contratado de momento (era gratuito durante 1 año XD). Pero se puede substituir por cualquier otro. Eso si, si se modifica la url hay que ir con cuidado, ya que hay que modificar el recorte de la IP (ubicados en la lineas 48 y 49). Con mi servidor, imprimo la url entre 2 flechas para que no hayan problemas.

2. Las demas variables que se tienen que modificar tienen un "##" al lado con un comentario que indica para que sirven.

3. El código, detecta si la direccion esta o no activa, por lo cual, en caso de estarlo la actualiza, y en caso de no pos no (obvio no ? :P).




CÓDIGO MYSQL:
1
2
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
-- phpMyAdmin SQL Dump
-- version 4.2.12deb2+deb8u2
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tiempo de generación: 20-09-2017 a las 22:35:02
-- Versión del servidor: 5.5.57-0+deb8u1
-- Versión de PHP: 5.6.30-0+deb8u1
 
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
 
--
-- Base de datos: `PANEL`
--
CREATE DATABASE IF NOT EXISTS `PANEL` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `PANEL`;
 
-- --------------------------------------------------------
 
--
-- Estructura de tabla para la tabla `DirecionesDDNS`
--
 
CREATE TABLE IF NOT EXISTS `DirecionesDDNS` (
`ID` int(11) NOT NULL,
  `FECHA_REGISTRO` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `REGISTRADO_POR` varchar(32) DEFAULT NULL,
  `Descripcion` varchar(255) DEFAULT NULL,
  `DDNS` varchar(50) NOT NULL,
  `ESTADO` tinyint(1) DEFAULT '1',
  `UltimaConexion` datetime DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
--
-- Índices para tablas volcadas
--
 
--
-- Indices de la tabla `DirecionesDDNS`
--
ALTER TABLE `DirecionesDDNS`
 ADD PRIMARY KEY (`ID`), ADD UNIQUE KEY `DDNS` (`DDNS`);
 
--
-- AUTO_INCREMENT de las tablas volcadas
--
 
--
-- AUTO_INCREMENT de la tabla `DirecionesDDNS`
--
ALTER TABLE `DirecionesDDNS`
MODIFY `ID` int(255) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1;

NOTAS CÓDIGO
Es importante que la columna "ESTADO" este en "1", para que así, luego el programa compruebe la IP.




Bueno, pos eso es todo. Espero que sirva de ayuda a todos los que algún día buscamos/necesitamos de algo parecido. Por supuesto, el código queda a libre uso y modificación, ya que soy un novato que ha echo lo que a podido como a podido.


NOTAS FINALES:
Este pequeño programa a sido probado tanto en Debian 8 como en una raspberry con Raspbian.

ES IMPORTANTE TENER INSTALADO:
1. PyCurl: sudo apt-get install python-pycurl
2. MYSQLdb: sudo apt-get install python-mysqldb
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
2
Responder
Imágen de perfil de xve

[TUTORIAL] DDNS UPDATER NOIP

Publicado por xve (1600 intervenciones) el 21/09/2017 07:42:38
Excelente Edgar!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

[TUTORIAL] DDNS UPDATER NOIP

Publicado por Edgar (10 intervenciones) el 23/09/2017 12:03:53
Gracias xve, se hace lo que se puede.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad