Está en la página 1de 23

UNIVERSIDAD TECNOLOGICA DE

HONDURAS
Campus Choluteca

Asignatura:
Telecomunicaciones

Trabajo:
Manual Técnico

Catedrático:
Master Norman A. Cubilla

Alumna:
Elda Margoth Quiroz Sandoval
201710110334

Fecha:
27 de noviembre de 2019
PROCESO PARA INTERCONECTAR UBUNTU SERVER VÍA
SHELL SCRIPTING Y UN ROUTER MIKROTIK VIRTUALIZADO

Lo primero que hicimos fue crear dos máquinas virtuales en VirtualBox, una que se
llama MK2 que es el router Mikrotik y la segunda maquina se llama ApServer que
sería el Ubuntu. Después de instalarlas, actualizamos, instalamos el entorno gráfico,
vimos como conectarnos remotamente, generamos un certificado de seguridad entre
el servidor y el sistema operativo Mikrotik y creamos un usuario.

Después de hacer lo antes mencionado procedemos a encender las máquinas


virtuales MK2 y ApServer. Y lo primero que muestra la máquina virtual ApServer
es el usuario que asignamos que es uth y también pide la contraseña que en mi caso
es del 1 al 8.

Aquí podemos ver el entorno gráfico de nuestra máquina virtual ApServer.


Aquí tenemos la otra máquina virtual MK2 que sería el MikroTik, también nos pide
usuario y contraseña que en mi caso sería admin y la contraseña del 1 al 8.

Nos vamos para el programa WinBox para verificar el usuario y la IP que hemos
configurado. También podemos ver las interfaces que hemos configurado. Mediante
WinBox podemos accesar remotamente al sistema operativo del MikroTik.

sudo su
Ahora vamos a accesar a Mikrotik desde la consola de Ubuntu server. Lo que
hacemos es ubicarnos en la maquina ApServer y abrir una terminal y ejecutamos los
siguientes comandos:

Este comando permite


pasarnos de una sesión de
invitado a súper usuario.
ifconfig
Después visualizamos la IP con el siguiente comando:

Este comando sirve para ver la IP que hemos asignado. En mi caso la IP local seria la
192.168.0.30.

Hacemos un ping para ver si


tenemos conexión con el router virtualizado de MikroTik, con el siguiente comando:

ping 192.168.0.40

Como podemos ver en la siguiente imagen si hay interconexión entre ellas, desde el
server hay comunicación en el MikroTik.

Lo siguiente que hacemos es crear un


usuario desde WinBox, ese usuario lo
vamos a llamar uth que va a ser el usuario
que nos va a permitir conectarnos a
nuestro equipo, entrar vía WinBox en la
aplicación hecha en Python para programar
equipos de telecomunicación.
Luego de crear un usuario en el MikroTik hay una sección que se llama SSH Keys
que es protocolo de conexión remota muy demandado por su suficiente robustez.
Dentro de esta opción nosotros vamos a importar ya que vamos a generar llaves del
usuario uth desde el servidor. Para lograr eso ejecutamos en siguiente comando:

ssh-keygen –t rsa

Con este comando generamos una clave pública y privadas y un par de llaves.

cd /root/.ssh

Con esto entramos al directorio y vemos las llaves que se han generado.
Ahora vamos a copiar las llaves que hemos generado con los siguientes comandos.
scp id_rsa uth@192.168.0.40:/
scp id_rsa.pub uth@192.168.0.40:/

Vamos a importar las llaves desde el WinBox.


Después de hacer los pasos anteriores vamos a probar si nos podemos conectar al
MikroTik desde la terminal de Ubuntu con el siguiente comando:

ssh uth@192.168.0.40

Al ejecutar el comando anterior nos pide la contraseña de acceso para entrar al


MikroTik.

Continuamos haciendo la cadena de conexión que es compuesta el protocolo sshpass


que nos permite definir quién es el usuario remoto, el password remoto y la IP
remota. Lo que se abre en comillas es lo que se va a ejecutar en el equipo remoto.

sshpass –p “12345678” ssh –l uth 192.168.0.40 “ip address print”

Vamos a instalar el servicio


xrdp que es el que me permite
accesar remotamente a
nivel de escritorio, lo
haremos con el siguiente
comando:
sudo apt-get install xrdp

Creamos un archivo shell scripting que se llama add.sh con el siguiente comando.

pico add.sh

Ahora vamos a instalar Python


para proceder a programar la interfaz desde donde vamos agregar direcciones IP. Lo
haremos con el siguiente comando:

sudo apt-get install python

Después instalamos las librerías graficas de Python, con el siguiente comando:

sudo apt-get install python-tk

También vamos a descargar el idle para empezar a programar en Python.

sudo apt-get install idle

Para llamar el editor de Python ejecutamos el siguiente comando:

idle
Programa add.py
Cuando estamos en el editor de Python abrimos un nuevo archivo con el nombre add.py
que será donde vamos a programar la interfaz con botones, cajas de texto y etiquetas

Lo primero que hacemos en Python es comentar el nombre de la clase con el #

# Developer: UTH Telecomunicaciones


# Program name: add.py

Lo siguiente que hicimos es llamar las librerías para instalarlas

from Tkinter import *

Lo que hace es importar todas las librerías Tkinter ya que por eso le ponemos un *.

import ttk

Esta librería es para manejar el entorno gráfico.

import os

Se utiliza para interactuar con el sistema, que básicamente es una interfaz para sistema
operativo del ordenador que ejecuta el programa.

import subprocess

El módulo estándar subprocess permite invocar procesos desde Python y comunicarse


con ellos.

import tkFont

Esta librería sirve para utilizar tipos de fuente en el programa.

import tkMessageBox

Sirve para generar un mensaje de dialogo. Un cuadro de diálogo es una ventana con un
título, un mensaje, un ícono y uno o más botones. Se emplea para informar al usuario
sobre alguna cuestión o bien exhortarlo a tomar una decisión.

import time

El módulo time de la biblioteca estándar de Python proporciona un conjunto de


funciones para trabajar con fechas y/o horas.

import ScrolledText
Proporciona una clase del mismo nombre que implementa un widget de texto básico que
tiene una barra de desplazamiento vertical configurada para hacer "lo correcto".

Después creamos la ventana realizando el

v0=Tk()

Esto nos permite hacer referencia de la creación de la ventana en Python.

v0.tittle(“Adding Ip in Mikrotik”)

Sirve para colocar un título a la ventana que estamos creando en Python.

v0.geometry (“460x648+0+0”)

Sirve para darle el tamaño que deseamos a nuestra ventana de Python.

v0.config(bg=”white”, highlightbackground=”Teal”, highlightcolor=”Teal”)

Sirve para cambiar las propiedades del color de fondo y agregar borde a la ventana.

v0.mainloop

Es una estructura cíclica, esto hace que los objetos se muestren permanentemente al
usuario, es una función reservada.

#ZONA DE FUNCIONES
Aquí definimos todas las funciones que necesitamos y asi los botones puedan
realizar las distintas acciones asignadas.

def clean ():


address.set('')
interface.set('')
comment.set('')
flag.set('')
agregar1.set('')
flag_update.set('')

Este código sirve para limpiar todas las cajas de texto que hemos llenado con
información.

def cancelar ():


v0.destroy()

Esta función sirve para cerrar la venta v0.

def agregar ():

# Aquí declaramos todas las Variables y les pasamos el valor de la caja de texto.
ad=address.get()
inter=interface.get()
comm=comment.get()

# Aqui declaramos las Constantes que son las que conforman la cadena.
enc="#!/bin/bash"
sshpass="sshpass -p \"12345678\" ssh -l uth 192.168.0.40"
tab=" "
addres="ip address add address="
interf="interface="
c="comm="
cs="'"

# crear cadena

cadena1=(str(sshpass)+''+str(tab)+''+str(cs)+''+str(addres)+''+str(ad)+''+str(tab)+''
+str(interf)+''+str(inter)+''+str(tab)+''+str(c)+''+''+str(comm)+str(cs))

# Asignar full provilegios al programa add.sh mediante el comando chmod -R 777

os.system("sudo chmod -R 777 /home/uth/add.sh")

# Apertura del archivo o programa add.sh


pf=open(r'/home/uth/add.sh','w')
pf.write(enc) #insertar encabezado en la primera linea del archivo add.sh
pf.write("\n") #insertar un enter o retorno de carro en el archivo
pf.write(cadena1) # Insertar la cadena en el archivo
pf.write("\n") # insertar un enter o retorno de carro
pf. close() #cierre del archivo

time.sleep(0.1) #Tiempo que permite cerrar la operación


#ejecutar programa
os.system("sudo /./home/uth/add.sh")

#Llamando la función clean


clean()

Este código es el que permite agregar una nueva dirección IP a través de la función que
hemos definido, ya que utilizamos el archivo add.sh que donde se guardara la cadena
para que haya conexión entre la aplicación y el router MikroTik. El numeral sirve para
poner comentarios al código.

def borrar ():

#Aquí declaramos todas las Variables y les pasamos el valor de la caja de texto.
f=flag.get()

# Aquí declaramos las Constantes que son las que conforman la cadena.

enc="#!/bin/bash"
sshpass="sshpass -p \"12345678\" ssh -l uth 192.168.0.40"
tab=" "
remove="ip address remove"
cs="'"

# Crear cadena

cadena2=(str(sshpass)+''+str(tab)+''+str(cs)+''+str(remove)+''+str(tab)+
''+str(f)+''+str(cs))

# Asignar full privilegios al programa delete.sh mediante el comando chmod -R 777

os.system("sudo chmod -R 777 /home/uth/delete.sh")

# Apertura del programa o archivo delete.sh

pf2=open(r'/home/uth/delete.sh','w')
pf2.write(enc) # Insertar encabezado en la primera línea del archivo delete.sh
pf2.write("\n") # Insertar un enter o retorno de carro en el archivo
pf2.write(cadena2) # Insertar la cadena en el archivo
pf2.write("\n") # Insertar un enter o retorno de carro
pf2.close() # Cierre del archivo
time.sleep(0.1) # Tiempo que permite cerrar la operación y luego ejecutar

# Ejecutar programa o script delete.sh desde Python

os. system ("sudo /./home/uth/delete.sh")

# Llamando la funcion clean


clean()
Este código permite borrar las direcciones IP a través de una caja de texto que sería el
flag o id para poder eliminar la address, la cadena la mandamos a guardar a al archivo
delete.sh que es el que permite la conexión entre la función eliminar y el router
Mikrotik, para que al momento de borrar una dirección IP se actualice en el router.

def actualizar ():

#Aquí declaramos todas las Variables y les pasamos el valor de la caja de texto.
id_ip=flag_update.get ()
ad=address.get ()
inter=interface.get ()
comm=comment.get ()

# Aquí declaramos las Constantes que son las que conforman la cadena.

enc="#!/bin/bash"
sshpass="sshpass -p \"12345678\" ssh -l uth 192.168.0.40"

# crear cadena

cadena1='{} "ip address set {} address= {} interface= {} comm= {}"'.format


(sshpass, id_ip, ad, inter, comm)
print(cadena1)

# Asignar full privilegios al programa add.sh mediante el comando chmod -R 777

os.system("sudo chmod -R 777 /home/uth/update_ip.sh")

# Apertura del archivo o programa add.sh


pf=open(r'/home/uth/update_ip.sh','w')
pf.write(enc) #insertar encabezado en la primera línea del archivo update_ip.sh
pf.write("\n") #insertar un enter o retorno de carro en el archivo
pf.write(cadena1) # Insertar la cadena en el archivo
pf.write("\n") # insertar un enter o retorno de carro
pf.close() #cierre del archivo

time.sleep(0.1) #Tiempo que permite cerrar la operación

#ejecutar programa
os.system("sudo /./home/uth/update_ip.sh")

#Llamando la funcion clean


clean()

Con este código podemos actualizar las direcciones ip que están agregadas en el router
mikrotik. Para ello necesitamos una caja de texto que funciona como un flag donde
ponemos el numero o id de la dirección ip y al presionar actualizar se refresca con la
nueva información ingresada.
def consultar ():

#Lo primero que hacemos es un string de conexión, comandada por el sshpass,


el usuario, contraseña y la dirección, utilizamos una tubería para que genere
un dato en memoria, esta información la generamos en un archivo de texto.

os.system('sshpass -p "12345678" ssh -l uth 192.168.0.40 "ip address print"


> ipaddress.txt')

#Con la siguiente línea de código vamos a construir un objeto, y en la ruta de


directorio que hemos escrito vamos a visualizar la salida con el comando cat
que hace mostrar el contenido en la variable contenido. También habilitamos
la lectura.

contenido=subprocess.check_output("cat /home/uth/ipaddress.txt", shell=True)

#Esto es para crear la textarea y la vamos a imprimir en la ventana principal,


también le damos las dimensiones.

textarea=ScrolledText.ScrolledText(v0, width=55, height=15)

#Esto es para darle una posición a la TextArea.

textarea.place(x=10, y=185)

#Esto es para inserter la infomacion que está en la variable contenido en la


TextArea.

textarea.insert(INSERT,contenido)

#Esto es para que la ventana se refresque asignándole un tiempo es especifico.

v0.after(1000,consultar)

#Esto es para que cargue en la ventana principal, sin necesidad de dar clic a un botón.

consultar()

Este código lo que hace es consultar las direcciones IP disponibles en router, esto se
hace por medio de una TextArea en donde se va a imprimir la información que se ha
guardado en el archivo de texto.
def consultar2 ():

#Hacemos un string de conexión, comandada por el sshpass, el usuario,


contraseña y la dirección, utilizamos una tubería para que genere un dato
en memoria, esta información la generamos en un archivo de texto.

os.system('sshpass -p "12345678" ssh -l uth 192.168.0.40 "system identity print"


> nombre.txt')

#Con la siguiente línea de código vamos a construir un objeto, y en la ruta de


directorio que hemos escrito vamos a visualizar la salida con el comando cat
que hace mostrar el contenido en la variable contenido. También habilitamos
la lectura.

contenido2=subprocess.check_output("cat /home/uth/nombre.txt", shell=True)

#Aquí declaramos una variable de tipo StringVar.

nombre=StringVar ()

#Esto sirve para crear la caja de texto vacía.


.
textbox=Entry(v0,textvariable=nombre, width=20).place(x=10, y=490)

#Sirve para establecer o asignar la información de la cadena.

nombre.set(contenido2)

#Esto es para que la ventana se refresque asignándole un tiempo es especifico.

v0.after(1000,consultar2)

#Esto es para que cargue en la ventana principal, sin necesidad de dar clic a un botón.

consultar2()

Este código sirve para mandar a imprimir el nombre de router en una caja de texto, sin
necesidad de darle clic a un botón.

Ilustración 2:Ejemplo de caja de texto donde se imprime el nombre de router.

def consultar3 ():

#Hacemos un string de conexión, comandada por el sshpass, el usuario,


contraseña y la dirección, utilizamos una tubería para que genere un dato
en memoria, esta información la generamos en un archivo de texto.

os.system('sshpass -p "12345678" ssh -l uth 192.168.0.40 "system identity print"


> nombre.txt')

#Con la siguiente línea de código vamos a construir un objeto, y en la ruta de


directorio que hemos escrito vamos a visualizar la salida con el comando cat
que hace mostrar el contenido en la variable contenido. También habilitamos
la lectura.

contenido3=subprocess.check_output("cat /home/uth/nombre.txt", shell=True)

#aquí le ponemos los distintos atributos que queremos que tenga la etiqueta.

fuente=tkFont.Font(family="Times bold", size=14)

#aquí creamos una variable de tipo StringVar.

limpiar=StringVar()

#aquí le ponemos espacios a la etiqueta.


limpiar=" "

#aquí le ponemos los atributos y la posición de esa etiqueta.

label=Label(v0,text=limpiar, font=fuente, bg="white").place(x=10, y=515)

#aquí es para pasarle la información que está en el contenido3.

label=Label(v0,text=contenido3, bg="white",
font="Times 14 bold", fg="Teal").place(x=10, y=515)

#Esto es para que la ventana se refresque asignándole un tiempo es especifico.

v0.after(1000, consultar3)

#Esto es para que cargue en la ventana principal, sin necesidad de dar clic a un botón.

consultar3()

Este código sirve para mandar a imprimir el nombre de router en una etiqueta sin
necesidad de darle clic a un botón.

Ilustración 3:Ejemplo de la etiqueta donde se imprime el nombre de router.

def aplicar ():

#Aquí declaramos todas las Variables y les pasamos el valor de la caja de texto.

name=agregar1.get ()

if not name == '':

# Aquí declaramos las Constantes que son las que conforman la cadena.
enc="#!/bin/bash"
sshpass="sshpass -p \"12345678\" ssh -l uth 192.168.0.40"

# Crear cadena
comando = '{} \"system identity set name= {} \"\n'.format(sshpass, name)

#Asignar full privilegios al programa add.sh mediante el comando chmod -R


777

os.system("sudo chmod -R 777 /home/uth/pantalla.sh")

# Apertura del archivo o programa add.sh


pf=open(r'/home/uth/pantalla.sh','w')
pf.write(enc) #insertar encabezado en la primera línea del archivo add.sh
pf.write("\n") # insertar un enter o retorno de carro
pf.write(comando) # Insertar la cadena en el archivo
pf.close() #cierre del archivo

time.sleep(0.1) #Tiempo que permite cerrar la operación

#ejecutar programa
os.system("sudo /./home/uth/pantalla.sh")

#Llamando la función clean


clean()

else:
tkMessageBox.showinfo(message="Campo Vacio")

Este código permite cambiar el nombre de router Mikrotik a través de la función que
llamamos con un botón y escribiendo el nombre en la caja de texto que definimos.

#CREAR EL TITULO DE LA VENTANA

Le ponemos un título a la ventana, en mi caso le puse UTH MIKROTIK, utilizando


una label a la cual le puse distintos atributos como el color, el tipo de fuente y la
posición.

label_titulo=Label(v0,text="UTH MIKROTIK”, font="Times 13 bold", bg="white",


fg="Teal”).place(x=100, y=10)

#FRAME
También puse un frame que lo utilice para ajuntar en un solo cuadro la caja de texto
y las label que utilice para cambiarle nombre a la Mikrotik.

v0, highlightbackground="DarkCyan", highlightcolor="DarkCyan", highlightthickness=2,


relief=tk.FLAT, bd=20, background="white")

Lo que hice aquí fue colocar un borde en la ventana y darle un color, un grosor al
borde, le cambié el color de fondo y le di un relieve.

tk. Label (frame, bg="white").pack(expand=True)


frame.pack(expand=True, fill="both", padx=20, pady=10)
frame.place(width=430, height=150, x=3, y=425)

Estas líneas de código lo que hacen es modificar el tamaño de la label, darle color y
posicionarla en la ventana v0.

#ETIQUETAS
Despues de crear los botones continuamos programando los demás elementos que
serán necesarios para la funcionalidad de la aplicación, ahora vamos a ver el código
para crear las Label o etiquetas.

label_address=Label(v0,text="Address:”, font="Times 13 bold",


bg="white").place(x=10,y=50)

Esta etiqueta es para identificar el nombre de la caja de texto que en este caso sería la de
Address.

label_interface=Label(v0,text="Interface:”, font="Times 13 bold",


bg="white").place(x=10,y=50)

Esta etiqueta es para identificar el nombre de la caja de texto que en este caso sería la de
Interface.

label_comment=Label(v0,text="Comment:”, font="Times 13 bold",


bg="white").place(x=10,y=50)

Esta etiqueta es para identificar el nombre de la caja de texto que en este caso sería la de
el comentario que lleva la dirección IP ingresada.
label_identity=Label(v0,text="Identity:”, font="Times 13 bold",
bg="white").place(x=10,y=50)

Esta etiqueta es para identificar el nombre de la caja de texto que necesitamos para
cambiar el nombre del router Mikrotik que en este caso sería la de el Identity.

label_address=Label(v0,text="CAMBIAR NOMBRE",font="Times 13 bold", bg="Teal",


fg="white").place(x=3,y=425)

Esta etiqueta la utilice como título para dividir la textArea de la caja de texto de cambiar
el nombre.

En todas las Label utilice parámetros para cambiar las propiedades como ser el tipo de
fuente, el tamaño de la letra, el color y la posición donde estará ubicado

Ilustración 4: Ejemplo de las etiquetas

#DECLARACION DE VARIABLES COMO GLOBALES Y STRINGVAR

global address
global interface
global comment
global flag
global agregar1
global flag update

address=StringVar()

interface=StringVar()

comment=StringVar()

flag=StringVar()

agregar1=StringVar()

flag_update=StringVar()
Aquí declaramos las variables que vamos a utilizar para pasar el valor de las cajas de
textos al router Mikrotik.

# CAJAS DE TEXTO

txt_address=Entry(v0,textvariable=address,width=20).place(x=100,y=50)

En esta caja de texto ingresamos la dirección IP que queremos agregar al router


mikrotik.

txt_interface=Entry(v0,textvariable=interface,width=20).place(x=100,y=80)

En esta caja de texto ingresamos la interface en que queremos que este nuestra address
que hemos ingresado en la caja de texto anterior.

txt_comment=Entry(v0,textvariable=comment,width=20).place(x=100,y=110)

Aquí va el comentario acompañado de la address, dirección ip la interface que fue


ingresada en las cajas de texto anteriores.

txt_agregar1=Entry(v0,textvariable=agregar1,width=20).place(x=100,y=460)

En esta caja de texto ponemos el nombre que queremos cambiarle al route Mikrotik.

txt_flag=Entry(v0,textvariable=flag,width=2).place(x=300,y=85)

Aquí va el numero o id de la address que queremos borrar.

txt_flag_update=Entry(v0,textvariable=flag_update,width=2).place(x=300,y=115)

Aquí va el numero o id de la address que queremos actualizar.

Ilustración 5:Ejemplo de una caja de texto

#BOTONES

Ahora vamos a crear los botones que serán necesario para llevar a cabo la aplicación
que permita agregar, eliminar, consultar y actualizar IP Address. También vamos
utilizar un botón para poder cambiar el nombre del Router MikrotiK. El código que
realizamos para crear los botones es el siguiente:

btn_add=Button(v0,text="Add",command=agregar, bd=2,bg="white",
highlightbackground="Teal", highlightthickness=2,font="Times 11 bold").place(x=330,y=50,
height=27, width=80)

Este botón es el de agregar, que mediante la función que definimos arriba permite que al
presionar el botón se guarde la información contenida en las cajas de texto.

btn_add=Button(v0,text="Delete",command=borrar, bd=2,bg="white", highlightbackground="Teal",


highlightthickness=2,font="Times 11 bold").place(x=330,y=80, height=27, width=80)

Este botón es el de borrar, que a través de la función que hemos definido permite borrar
las direcciones IP mediante una caja de texto que funciona como un flag en el cual se
coloca el numero o id de la dirección IP que se desea eliminar.

btn_add=Button(v0,text="Actualizar”,command=actualizar, bd=2,bg="white",
highlightbackground="Teal", highlightthickness=2,font="Times 11 bold").place(x=330,y=50,
height=27, width=80)

Este botón es el de actualizar, permite actualizar las direcciones IP a través de una


función donde están todas las instrucciones para realizar dicha operación, este botón
también contiene una caja de texto que funciona como flag, ya que permite actualizar
las direcciones IP según el numero o id que se ingrese.

btn_add=Button(v0,text="Apply”, command=aplicar, bd=2,bg="white", highlightbackground="Teal",


highlightthickness=2,font="Times 11 bold").place(x=330,y=50, height=27, width=80)

Este botón de aplicar permite cambiar el nombre del router mikrotik median la función
que hemos definido donde están todas las instrucciones.

btn_cancelar=Button(v0, command=cancelar,image=imgBoton, bd=2,bg="white",


highlightbackground="Teal", highlightthickness=2,font="Times 11 bold").place(x=390,y=590)

Este botón es de cancelar que permite cerrar la ventana, gracias a la función que
declaramos que contiene el código necesario para realizar dicha instrucción.

En el código de cada botón, también agregamos parámetros para cambiar el color, el


tipo de fuente, el borde de los botones, la posición donde se ubicarán y el tamaño de
cada uno.

Ilustración 6: Ejemplo de botones


#PONERLE IMAGEN A LOS
BOTONES
imgBoton=PhotoImage(file="q.png",height=33,width=35)

En una variable pasamos el parámetro para ingresar la ruta donde tenemos la imagen
que queremos en el botón.

Ilustración 7: Ejemplo de botón con imagen

ARCHIVOS .SH
Para crear un archivo .sh lo hacemos desde la terminal de ubutu con el siguiente
comando.

Este archivo se crea para agregar direcciones IP al router mikrotik.

pico add.sh

S
e crea el siguiente archivo para eliminar las direcciones IP disponibles en el router.

pico delete.sh
Este archivo se crea para cambiarle el nombre al router mikrotik.

pico pantalla.sh
E

ste archivo lo cree para actualizar las direcciones IP de router mikrotik.

pico update_ip.sh

IMÁGEN DE LA APLICACION

También podría gustarte