MANUAL: Mikrotik, colección de scripting

Script para generar ficheros de backup (.rsc y .backup) y enviar por email a nuestra cuenta. Se puede programar en "scheduler" con la frecuencia que deseemos.

Bash:
:local sysname [/system identity get name]
:local textfilename
:local backupfilename
:local time [/system clock get time]
:local date [/system clock get date]
:local newdate "";
:for i from=0 to=([:len $date]-1) do={ :local tmp [:pick $date $i];
:if ($tmp !="/") do={ :set newdate "$newdate$tmp" }
:if ($tmp ="/") do={}
}
#check for spaces in system identity to replace with underscores
:if ([:find $sysname " "] !=0) do={
:local name $sysname;
:local newname "";
:for i from=0 to=([:len $name]-1) do={ :local tmp [:pick $name $i];
:if ($tmp !=" ") do={ :set newname "$newname$tmp" }
:if ($tmp =" ") do={ :set newname "$newname_" }
}
:set sysname $newname;
}
:set textfilename ($"newdate" . "-" . $"sysname" . ".rsc")
:set backupfilename ($"newdate" . "-" . $"sysname" . ".backup")
:execute [/export file=$"textfilename"]
:execute [/system backup save name=$"backupfilename"]

#Allow time for export to complete
:delay 2s

#email copies
:log info "Se han enviado correos de backups"

# START Send Email Module for .RSC
    :local SendTo "destinatario@gmail.com";
    :local Subject "\F0\9F\92\BE [Config Backup] $sysname $time";
    :local MessageText "Realizado backup tipo *.rsc";
    :local FileName "$textfilename";
    :local SendEmail [:parse [/system script get SendEmailFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
# END Send Email Module for .RSC

#Send as different subjects to force GMail to treat as new message thread.
:local time [/system clock get time]
:delay 2s

# START Send Email Module for .BACKUP
    :local SendTo "destinatario@gmail.com";
    :local Subject "\F0\9F\92\BE [Config Backup] $sysname $time";
    :local MessageText "Realizado backup *.backup";
    :local FileName "$backupfilename";
    :local SendEmail [:parse [/system script get SendEmailFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
# END Send Email Module for .BACKUP

#Allow time to send
:delay 10s

#delete copies
/file remove $textfilename
/file remove $backupfilename

# START Send Telegram Module
    :local DeviceName [/system identity get name];
    :local MessageText "\F0\9F\92\BE <b>$DeviceName:</b> Config Backups OK $TelegramMessageText";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module

Y para "rizar el rizo" los correos adjuntos que cumpla alguna condición en GMAIL podemos guardarlos automáticamente en Google Drive y de esta forma los tendremos a buen recaudo. Yo los almaceno durante 30 días y luego los borro una vez que empieza el nuevo mes.

Tenéis la info del proceso aquí: https://www.solvetic.com/tutoriales/article/1661-guardar-correos-gmail-automaticamente-google-drive/

Editado 09/dic/2021: Script compatible con versión 7.1

Bash:
:local sysname [/system identity get name]
:local textfilename
:local backupfilename
:local time [/system clock get time]
:local date [/system clock get date]
:local newdate "";
:for i from=0 to=([:len $date]-1) do={ :local tmp [:pick $date $i];
:if ($tmp !="/") do={ :set newdate "$newdate$tmp" }
:if ($tmp ="/") do={}
}
#check for spaces in system identity to replace with underscores
:if ([:find $sysname " "] !=0) do={
:local name $sysname;
:local newname "";
:for i from=0 to=([:len $name]-1) do={ :local tmp [:pick $name $i];
:if ($tmp !=" ") do={ :set newname "$newname$tmp" }
:if ($tmp =" ") do={ :set newname "$newname_" }
}
:set sysname $newname;
}
:set textfilename ($"newdate" . "-" . $"sysname" . ".rsc")
:set backupfilename ($"newdate" . "-" . $"sysname" . ".backup")
:execute [/export file=$"textfilename"]
:execute [/system backup save name=$"backupfilename"]

#Allow time for export to complete
:delay 2s

#email copies
:log info "Se han enviado correos de backups"

# START Send Email .RSC
/tool e-mail send to="destinatario@gmail.com" subject="\F0\9F\92\BE [Config Backup] $sysname $mydatetime" body="Backup realizado *.rsc" file="$textfilename";
# END Send Email .RSC

#Send as different subjects to force GMail to treat as new message thread.
:local time [/system clock get time]
:delay 2s

# START Send Email .BACKUP
/tool e-mail send to="destinatario@gmail.com" subject="\F0\9F\92\BE [Config Backup] $sysname $mydatetime" body="Backup realizado *.backup" file="$backupfilename";
# END Send Email .BACKUP

#Allow time to send
:delay 10s

#delete copies
/file remove $textfilename
/file remove $backupfilename

# START Send Telegram Module
    :local DeviceName [/system identity get name];
    :local MessageText "\F0\9F\92\BE <b>$DeviceName:</b> Config Backups OK $TelegramMessageText";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
#END Send Telegram Module

Editado 31/ene/2022: Envío de backups a servidor FTP

Bash:
# FTP Config
# Definición de variables
:local ftpserver "XXX.XXX.XXX.XXX" # Ip de tu servidor FTP
:local username "username"
:local password "MyS3cuR3P@ssWorD"
:local port 2132 # es aconsejable cambiar el puerto a otro menos conocido

# Sustituir los módulos Email por estos

# START Send .RSC to FTP Server
/tool fetch address=$ftpserver mode=ftp user=$username password=$password \
    src-path=$textfilename dst-path=$textfilename upload=yes port=$port;
:log info "Backup FTP: Enviado $textfilename via FTP"
# END Send .RSC to FTP Server

:delay 5s

# START Send .BACKUP to FTP Server
tool fetch address=$ftpserver mode=ftp user=$username password=$password \
    src-path=$backupfilename dst-path=$backupfilename upload=yes port=$port;
:log info "Backup FTP: Enviado $backupfilename via FTP"
# END Send .BACKUP to FTP Server
Hola, todavia no hay forma de enviarlos a Telegram? sigue siendo solo al mail?
 
Buenas a todos,
que scripts más chulos que hay por aquí. Me encanta esta sección.

Me gustaría preguntaros si tenéis algún manual para aprender el formato y así poder consultar y realizar scripts.

Saludos!
 
Hola @puntshow!

Estos scripts que hemos compartido en este hilo es fruto de una ardua tarea de recopilación y adaptación a necesidades concretas para automatizar tareas, estar informados sobre eventos específicos mediante alertas, mantenimiento del router, etc.

Manual "desde cero" no lo he visto como tal. Si dominas la lengua de Shakespeare, en la wiki de Mikrotik tienes bastante información para iniciarte en el mundillo del scripting: https://wiki.mikrotik.com/wiki/Manual:Scripting
Aunque ya te adelanto, que hay que tener una pequeña base de programación.

Si te animas, te aconsejo que antes leas un poco sobre como declarar variables locales y globales, como hacer llamadas a las mismas, condicionales, bucles, etc. Aquí te dejo un pdf que te puede iluminar bastante:
https://mum.mikrotik.com/presentations/ES15/presentation_2840_1446471715.pdf

Mi consejo (es lo que hice yo) es que utilices un editor de código que formatee coloreando la sintaxis con lo cual se hace más entendible (mi editor es Visual Studio Code aunque hay varios y gratuitos por la red).

1647712527076.png


Una vez lo tengas instalado y funcionando con formato RouterOS (*.rsc) puedes ir trabajando sobre scripts ya realizados y los adaptas según tus necesidades. Puedes probar desde Winbox (System -> Scripts) o desde la propia terminal metiendo el código del script entre llaves { }.

S@lu2.
 
¡Hola!

Estoy intentando hacer funcionar un script que coja los sms y los mande a un correo (por Telegram ya lo doy por imposible). No consigo hacerlo funcionar. ¿Alguien sabe que estoy haciendo mal (soy novato total)?:

Código:
# Script to forward SMS from GSM Modem Inbox to Email #

# Note: The SMS is removed from the inbox after being sent to Email, #

# even if the Email fails to be sent #

# Remember to set up /Tools/SMS with the USB port of your #

# Modem and the info channel. Put anything in secret and #

# make sure Receive Enabled is ticked #

# Tested on Rb751U RouterOS v5.12 with Huawei E367 #

# Peter James 2012-04-04 #



:local EmailAddress "DIRECCIONCORREO";

:local smsPhone;

:local smsTimeStamp;

:local smsMessage;

:local smsContent;


# Get System Identity #

:local SystemID [/system identity get name];


:log info "SMS to Email script started";


# Set Receive Enabled, in case it was cleared by a router reboot #

/tool sms set receive-enabled=yes;


delay 2;


# loop through all the messages in the inbox #

:foreach i in=[/tool sms inbox find] do={


:set smsPhone [/tool sms inbox get $i phone];

:set smsTimeStamp [/tool sms inbox get $i timestamp];

:set smsMessage [/tool sms inbox get $i message];


:set smsContent "Router ID: $SystemID\nSMS Received from: $smsPhone\nDate&Time: $smsTimeStamp\nMessage: $smsMessage";


:log info $smsContent;


//tool e-mail send to="DIRECCIONCORREO" subject="$SystemID GSM Modem SMS Received" to=$EmailAddress body="$smsContent";


# Now remove the SMS from the inbox #

/tool sms inbox remove $i;


delay 10;


}


# clear Receive Enabled, so info channel can be used by other scripts #

/tool sms set receive-enabled=no;


:log info "SMS to Email script complete";


Muchas gracias. Saludos.

NOTA: puedo mandar correos sin problemas con:

Código:
Bash:

/tool e-mail send to="destino@gmail.com" subject="\F0\9F\9F\A2 $DeviceName [$Date $Time] \
    Test message subject" body="test message body" file="";
 
Última edición:
¡Hola!

Estoy intentando hacer funcionar un script que coja los sms y los mande a un correo (por Telegram ya lo doy por imposible). No consigo hacerlo funcionar. ¿Alguien sabe que estoy haciendo mal (soy novato total)?:

Código:
# Script to forward SMS from GSM Modem Inbox to Email #

# Note: The SMS is removed from the inbox after being sent to Email, #

# even if the Email fails to be sent #

# Remember to set up /Tools/SMS with the USB port of your #

# Modem and the info channel. Put anything in secret and #

# make sure Receive Enabled is ticked #

# Tested on Rb751U RouterOS v5.12 with Huawei E367 #

# Peter James 2012-04-04 #



:local EmailAddress "DIRECCIONCORREO";

:local smsPhone;

:local smsTimeStamp;

:local smsMessage;

:local smsContent;


# Get System Identity #

:local SystemID [/system identity get name];


:log info "SMS to Email script started";


# Set Receive Enabled, in case it was cleared by a router reboot #

/tool sms set receive-enabled=yes;


delay 2;


# loop through all the messages in the inbox #

:foreach i in=[/tool sms inbox find] do={


:set smsPhone [/tool sms inbox get $i phone];

:set smsTimeStamp [/tool sms inbox get $i timestamp];

:set smsMessage [/tool sms inbox get $i message];


:set smsContent "Router ID: $SystemID\nSMS Received from: $smsPhone\nDate&Time: $smsTimeStamp\nMessage: $smsMessage";


:log info $smsContent;


//tool e-mail send to="DIRECCIONCORREO" subject="$SystemID GSM Modem SMS Received" to=$EmailAddress body="$smsContent";


# Now remove the SMS from the inbox #

/tool sms inbox remove $i;


delay 10;


}


# clear Receive Enabled, so info channel can be used by other scripts #

/tool sms set receive-enabled=no;


:log info "SMS to Email script complete";


Muchas gracias. Saludos.

NOTA: puedo mandar correos sin problemas con:

Código:
Bash:

/tool e-mail send to="destino@gmail.com" subject="\F0\9F\9F\A2 $DeviceName [$Date $Time] \
    Test message subject" body="test message body" file="";
Buenos días,

Aunque no tengo modem/router LTE para probar los SMS, mira a ver si este código te puede ayudar.

Entiendo que antes de nada, la recepción de los SMS lo tienes bien configurado y activado.

Bash:
:log info "SMS script started";
:local smsPhone;
:local smsMessage;
:local smsContent;

:foreach i in=[/tool sms inbox find message=""] do={
    /tool sms inbox remove $i
}

:foreach i in=[/tool sms inbox find] do={
    :set smsPhone [/tool sms inbox get $i phone];
    :set smsMessage [/tool sms inbox get $i message];
    :set smsContent "$smsPhone $smsMessage";
    
# send by telegram
    /tool fetch url="https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/sendmessage?chat_id=-XXXXXXXXX&text=$smsContent";
    :delay 3s;
    
# send e-mail
    /tool e-mail send to=your@domain.com subject="SMS $smsPhone" body=$smsContent;
    :delay 3s

    /tool sms inbox remove $i;
}
:log info "SMS script complete";

El tema de Telegram funciona bien siempre que tus datos del bot y chat_id los tengas operativos, en el hilo hay bastante información sobre esto para que pruebes antes.

Suerte!
 
Buenos días,

Aunque no tengo modem/router LTE para probar los SMS, mira a ver si este código te puede ayudar.

Entiendo que antes de nada, la recepción de los SMS lo tienes bien configurado y activado.

Bash:
:log info "SMS script started";
:local smsPhone;
:local smsMessage;
:local smsContent;

:foreach i in=[/tool sms inbox find message=""] do={
    /tool sms inbox remove $i
}

:foreach i in=[/tool sms inbox find] do={
    :set smsPhone [/tool sms inbox get $i phone];
    :set smsMessage [/tool sms inbox get $i message];
    :set smsContent "$smsPhone $smsMessage";
   
# send by telegram
    /tool fetch url="https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/sendmessage?chat_id=-XXXXXXXXX&text=$smsContent";
    :delay 3s;
   
# send e-mail
    /tool e-mail send to=your@domain.com subject="SMS $smsPhone" body=$smsContent;
    :delay 3s

    /tool sms inbox remove $i;
}
:log info "SMS script complete";

El tema de Telegram funciona bien siempre que tus datos del bot y chat_id los tengas operativos, en el hilo hay bastante información sobre esto para que pruebes antes.

Suerte!
Buenos días,

Aunque no tengo modem/router LTE para probar los SMS, mira a ver si este código te puede ayudar.

Entiendo que antes de nada, la recepción de los SMS lo tienes bien configurado y activado.

Bash:
:log info "SMS script started";
:local smsPhone;
:local smsMessage;
:local smsContent;

:foreach i in=[/tool sms inbox find message=""] do={
    /tool sms inbox remove $i
}

:foreach i in=[/tool sms inbox find] do={
    :set smsPhone [/tool sms inbox get $i phone];
    :set smsMessage [/tool sms inbox get $i message];
    :set smsContent "$smsPhone $smsMessage";
   
# send by telegram
    /tool fetch url="https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/sendmessage?chat_id=-XXXXXXXXX&text=$smsContent";
    :delay 3s;
   
# send e-mail
    /tool e-mail send to=your@domain.com subject="SMS $smsPhone" body=$smsContent;
    :delay 3s

    /tool sms inbox remove $i;
}
:log info "SMS script complete";

El tema de Telegram funciona bien siempre que tus datos del bot y chat_id los tengas operativos, en el hilo hay bastante información sobre esto para que pruebes antes.

Suerte!
Buenas!

A ver... Flipante el nivel del foro! Muchas gracias @diamuxin . Funciona tanto el mail como el sms. Pues tela, pq busque bien y no encontraba la solución. En el foro oficial, hay unos cuantos hilos NO resueltos de SMS to Telegram. La única solución que parece que funcionaba es la que daba uno, creo que ruso, pero era complicado para mi: varios sripts (mínimo 3 para tema de SMS) con dependencias entre ellos (creo que por conversiones de texto ruso). Además los scripts se cargaban y se actualizan online... Vamos, que con lo poco que controlo, ni loco! Vete a saber que te pueden meter en un día cualquiera...

Dudas:
1) ¿Vale la pena cargar la parte del Telegram con el módulo MyTGBotSendMessage? ¿O lo dejo "autónomo"?
2) He puesto que se vaya cargando cada 10seg, para que no tarden mucho a llegar los SMS. ¿Puedo estropear el router con tantas peticiones (por uso de la memoria)?

Otra vez muchas gracias!

Saludos
 
Buenas!

A ver... Flipante el nivel del foro! Muchas gracias @diamuxin . Funciona tanto el mail como el sms. Pues tela, pq busque bien y no encontraba la solución. En el foro oficial, hay unos cuantos hilos NO resueltos de SMS to Telegram. La única solución que parece que funcionaba es la que daba uno, creo que ruso, pero era complicado para mi: varios sripts (mínimo 3 para tema de SMS) con dependencias entre ellos (creo que por conversiones de texto ruso). Además los scripts se cargaban y se actualizan online... Vamos, que con lo poco que controlo, ni loco! Vete a saber que te pueden meter en un día cualquiera...

Me alegro que ya lo tengas funcionando!

Dudas:
1) ¿Vale la pena cargar la parte del Telegram con el módulo MyTGBotSendMessage? ¿O lo dejo "autónomo"?

Realmente son dos formas de llegar al mismo sitio, escoge la que mas te guste. Al principio empecé usando el módulo Telegram y ya por inercia lo sigo utilizando, para mi está el código más limpio y estructurado. Pero ambas formas funcionan igual.

2) He puesto que se vaya cargando cada 10seg, para que no tarden mucho a llegar los SMS. ¿Puedo estropear el router con tantas peticiones (por uso de la memoria)?

No te preocupes por eso, yo tengo algún script programado así y nunca he tenido problemas.

S@lu2.
 
Hola @EL DONCITO 2022 y bienvenido!

En este hilo, si miras el índice ya hay un script que informa sobre el estado de la CPU pero el caso que planteas sería algo así:

1. Creas un nuevo script introduciendo en el terminal este comando:

Código:
/system script
add dont-require-permissions=no name=cpu-check policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
    source=" "

2. Luego en Winbox te vas a System -> Scripts y abres el script recién creado "cpu-check" y pegas en el campo "Source" el siguiente contenido:

Código:
# Name : Average CPU Load
# Set up the scheduler to run this at a 5 second intervals (Sample Rate)
# Set info logs to echo to Terminal in System Logging

:local cpuload 0
:global cpuarray
:local arraylen 0
:local arraypos 0
:local arraytot 0
:global avgcpuload 0
:global highavgcpuload

# arraysize is the number of cpu-Load samples to keep
# Experiment with this value to incease or decrease the number of samples
# The greater the value the longer the time that the cpu-load average is calculated for.
:local arraysize 20

# Get cpu-load samples, limit cpuarray to array size
:set cpuload [/system resource get cpu-load]
:set cpuarray ( [:toarray $cpuload] + $cpuarray )
:set cpuarray [:pick $cpuarray 0 $arraysize]

# add up all values in array
:set arraypos 0
:set arraylen [:len $cpuarray]
:while ($arraypos < $arraylen) do={
:set arraytot ($arraytot + [:pick $cpuarray $arraypos] );
:set arraypos ($arraypos +1)}

# divide sum of array values by the number of values in cpuarray
:set avgcpuload ($arraytot / [:len $cpuarray])
:if ([:len $highavgcpuload] = 0) do={:set highavgcpuload $avgcpuload}
:if ([$highavgcpuload] < [$avgcpuload]) do={:set highavgcpuload $avgcpuload}

# Display results in Terminal window
:log info ("CPU Load Captures:")
:log info $cpuarray
:log info ("Array Total: $arraytot")
:log info ("Array size: $arraysize")
:log info ("CPU Load - Avg: $avgcpuload High: $highavgcpuload")

:if ($avgcpuload >= 80)  do={ 
:log info "Reset now!"
:delay 2s
/system reboot; 
}

3. Creas desde la terminal la tarea para que se ejecute cada minuto por ejemplo, esto ya lo modificas a tu gusto desde System->Scheduler:

Código:
/system scheduler
add interval=1m name=cpu-check on-event=cpu-check policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
    start-date=mar/28/2022 start-time=21:00:00

Este script controlará si el uso se mantiene al 80 % durante más de 20 segundos, en ese caso reseteará el equipo. Aunque, ¿no sería mejor solventar el motivo por el cual el equipo consume tantos recursos?

S@lu2.
 
Os muestro un script basado en los de @diamuxin y modificado por mí para comprobar el buen funcionamiento de la "IPTV-pululante".

En este caso lo que comprobamos es que el tunel EoIP esté funcionando y si no es así lo único que hacemos es deshabilitar y habilitar Wireguard para que vuelva a levantar todo: Wireguard StS + EoIP.

Ponemos en marcha un scheduler cada cierto tiempo (15 minutos por ejemplo) para que compruebe que el tunnel EoIP está funcionando (RS).

En este ejemplo sólo utilizo el módulo de Telegram para que nos avise, de todas formas se puede añadir el módulo de email para hacer una notificación a nuestra cuenta de correo.

Image-2022-04-07.jpeg

Con los HGU de por medio creo que es recomendable tener algún tipo de comprobación para avisarnos de algún contratiempo.

Se puede instalar en ambos extremos, tanto en el lado de "Paco" como en el de "Pepe".

Saludos.

Código:
{
:local wgInterface "wireguard-sts-iptv"
:local eoipInterface "eoip-iptv"
:local deviceName [/system identity get name]

:if ( [/interface eoip get $eoipInterface running]=false ) do={

    :log error "EoIP-IPTV interface is down";
    :log info "Reconnecting tunnel wireguard...";

    # START Send Telegram Module
    :local MessageText "\E2\9A\A0 <b>$deviceName:</b>%0A%0Aeoip-iptv interface is DOWN.";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    # END Send Telegram Module

    # Reset wireguard interface
    /interface/wireguard/disable $wgInterface
    :delay 5
    /interface/wireguard/enable $wgInterface
 
    # Reset EoIP interface
    #:delay 10
    #/interface/disable $eoipInterface
    #:delay 5
    #/interface/enable $eoipInterface

    # Damos un margen de tiempo para hacer de nuevo una comprobación
    :delay 60
    :if ( [/interface eoip get $eoipInterface running]=true ) do={
    # START Send Telegram Module
    :local MessageText "\F0\9F\91\8D <b>$deviceName:</b>%0A%0Aeoip-iptv interface is UP.";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    # END Send Telegram Module

    :log info "Wireguard and EoIP-IPTV interfaces are connected"
}

} else={
:log info "eoip-iptv interface is up"
}

}
 
Última edición:
Os muestro un script basado en los de @diamuxin y modificado por mí para comprobar el buen funcionamiento de la "IPTV-pululante".

En este caso lo que comprobamos es que el tunel EoIP esté funcionando y si no es así lo único que hacemos es deshabilitar y habilitar Wireguard para que vuelva a levantar todo: Wireguard StS + EoIP.

Ponemos en marcha un scheduler cada cierto tiempo (15 minutos por ejemplo) para que compruebe que el tunnel EoIP está funcionando (RS).

En este ejemplo sólo utilizo el módulo de Telegram para que nos avise, de todas formas se puede añadir el módulo de email para hacer una notificación a nuestra cuenta de correo.

Ver el adjunto 93894

Con los HGU de por medio creo que es recomendable tener algún tipo de comprobación para avisarnos de algún contratiempo.

Yo lo tengo en marcha tanto en el lado de "Paco" como en el de "Pepe".

Saludos.

Código:
{
:local wgInterface "wireguard-sts-iptv"
:local eoipInterface "eoip-iptv"
:local deviceName [/system identity get name]

:if ( [/interface eoip get $eoipInterface running]=false ) do={

    :log error "EoIP-IPTV interface is down";
    :log info "Reconnecting tunnel wireguard...";

    # START Send Telegram Module
    :local MessageText "\E2\9A\A0 <b>$deviceName:</b>%0A%0Aeoip-iptv interface is DOWN.";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    # END Send Telegram Module

    # Reset wireguard interface
    /interface/wireguard/disable $wgInterface
    :delay 5
    /interface/wireguard/enable $wgInterface
 
    # Reset EoIP interface
    #:delay 10
    #/interface/disable $eoipInterface
    #:delay 5
    #/interface/enable $eoipInterface

    # Damos un margen de tiempo para hacer de nuevo una comprobación
    :delay 60
    :if ( [/interface eoip get $eoipInterface running]=true ) do={
    # START Send Telegram Module
    :local MessageText "\F0\9F\91\8D <b>$deviceName:</b>%0A%0Aeoip-iptv interface is UP.";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    # END Send Telegram Module

    :log info "Wireguard and EoIP-IPTV interfaces are connected"
}

} else={
:log info "eoip-iptv interface is up"
}

}
@stargate4you, muy buena idea meter la comprobación del estado de la interfaz EoIP una vez reseteado el túnel wireguard! ;)(y)

S@lu2.
 
@stargate4you, muy buena idea meter la comprobación del estado de la interfaz EoIP una vez reseteado el túnel wireguard! ;)(y)

S@lu2.
Si no queréis usar un scheduler, el Netwatch hace algo parecido. Le das una ip y un tiempo de prueba y cada X tiempo comprueba esa IP. Y tiene dos eventos (on up y on down) donde puedes ejecutar los scripts que quieras.

Saludos!
 
Si no queréis usar un scheduler, el Netwatch hace algo parecido. Le das una ip y un tiempo de prueba y cada X tiempo comprueba esa IP. Y tiene dos eventos (on up y on down) donde puedes ejecutar los scripts que quieras.

Saludos!
Si, también lo estoy usando para otros menesteres, gracias.

S@lu2.
 
Muy buenas,

Añadida modificación del script: Notificar las conexiones al servidor DHCP vía telegram

Esta modificación permite conocer a qué interfaz wireless se ha conectado un host a nuestro DHCP. Muy útil si quieres saber a dónde te has conectado en casa/oficina cuando tienes varios APs gestionados por CAPsMAN.

Para ello coteja las direcciones MAC obtenidas por DHCP al conectarse mediante la variable $leaseActMAC y la compara con la MAC de Registration Table (CAPsMAN) y si coincide pedimos el valor de la interfaz wireless a la que se ha conectado.

Bash:
/ip dhcp-server lease
:if ($leaseBound = 1) do={
    :do {
        # Variables
        :local Comment [/ip dhcp-server lease get value-name=comment number=[/ip dhcp-server lease find address=$leaseActIP]]
        :local interFace [/caps-man/registration-table get [find where mac-address=$leaseActMAC] interface]
    
        # START Send Telegram Module
        :local MessageText "\E2\84\B9 <b>Despacho: Info DHCP</b> %0D%0A Nombre: $"lease-hostname" %0D%0A IP: $leaseActIP %0D%0A MAC: $leaseActMAC %0D%0A Radio: $interFace %0D%0A Comentario: $Comment";
        :local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]];
        $SendTelegramMessage MessageText=$MessageText;
        # END Send Telegram Module
    
        :log info "Enviada alerta DHCP de $"lease-hostname" $leaseActMAC"
    } on-error={:log error "Fallo de notificación a Telegram"}
}

Resultado:

Ver el adjunto 92199

S@lu2.
Buenas, funciona perfecto menos con un dispositivo, no se si será por el nombre que es muy largo o por el _ que lleva, que podrá ser?errorscript.png
 
Buenas, funciona perfecto menos con un dispositivo, no se si será por el nombre que es muy largo o por el _ que lleva, que podrá ser?Ver el adjunto 94977
Hola, pues no se me ocurre por qué te ocurre eso con el Huawei.
Intenta si puedes cambiar el "host-name" de ese dispositivo a otro más corto y prueba a conectarte de nuevo.

Siempre puedes probar a recrear el script de forma manual a través del terminal. Es decir, lo generas en "System->scripts" y luego lo ejecutas desde la terminal: /system/script run nombre_script si hay algún error te va a avisar por donde pueden ir los tiros.

S@lu2.
 
Hola!

El propósito de este hilo es hacer una colección de scripting. Id añadiendo posts al hilo y yo intentaré mantener un índice en este primer post que enlace con ellos. De esta manera, nos aseguramos de que es un hilo colaborativo y de que, al mismo tiempo, no tenemos que andar copiando y pegando código de un sitio a otro haciéndolo inmanejable.

Índice


Correcciones V7



Saludos!
Script para actualizar dirección IP en el servicio de OpenDNS (usado para filtrado de contenido Web):

Código:
# Datos de acceso a OpenDNS
:local odnsuser "email@dominio.algo"
:local odnspass "P455w0rd"

#Nombre de la red como aparece en el dashboard de OpenDNS
:local odnshost "Hogar"

# Conexion en el enrutador MK que toma la IP publica cambiante
:local inetinterface "pppoe-out1"

:global previousIP;

:log info "Fetching current IP"

# Obtiene la IP publica usando el servicio DNS-O-Matic
/tool fetch url="http://myip.dnsomatic.com/" mode=http dst-path=mypublicip.txt

# Lee la IP publica en la variable currentIP
:local currentIP [/file get mypublicip.txt contents]

:log info "Fetched current IP as $currentIP"

# Verifica si la IP ha cambiado para ejecutarse
:if ($currentIP != $previousIP) do={
:log info "OpenDNS: Update needed"
:set previousIP $currentIP

# URL actualizado. Note el "|3F" hexadecimal requerido para obtener el signo de interrogacion en el URL
:local url "https://updates.opendns.com/nic/update\3Fhostname=$odnshost"
:log info "OpenDNS: Sending update for $odnshost"

/tool fetch url=($url) user=$odnsuser password=$odnspass mode=http dst-path=("/net_odns.txt")

:delay 2;

:local odnsReply [/file get net_odns.txt contents];

:log info "Actualización OpenDNS completada."

:log info "La respuesta OpenDNS fue: $odnsReply";

} else={

:log info "OpenDNS: La dirección IP anterior: $previousIP and la dirección IP actual son iguales, no es necesario actualizar"
}
 
Script para actualizar dirección IP en el servicio de OpenDNS (usado para filtrado de contenido Web):

Código:
# Datos de acceso a OpenDNS
:local odnsuser "email@dominio.algo"
:local odnspass "P455w0rd"

#Nombre de la red como aparece en el dashboard de OpenDNS
:local odnshost "Hogar"

# Conexion en el enrutador MK que toma la IP publica cambiante
:local inetinterface "pppoe-out1"

:global previousIP;

:log info "Fetching current IP"

# Obtiene la IP publica usando el servicio DNS-O-Matic
/tool fetch url="http://myip.dnsomatic.com/" mode=http dst-path=mypublicip.txt

# Lee la IP publica en la variable currentIP
:local currentIP [/file get mypublicip.txt contents]

:log info "Fetched current IP as $currentIP"

# Verifica si la IP ha cambiado para ejecutarse
:if ($currentIP != $previousIP) do={
:log info "OpenDNS: Update needed"
:set previousIP $currentIP

# URL actualizado. Note el "|3F" hexadecimal requerido para obtener el signo de interrogacion en el URL
:local url "https://updates.opendns.com/nic/update\3Fhostname=$odnshost"
:log info "OpenDNS: Sending update for $odnshost"

/tool fetch url=($url) user=$odnsuser password=$odnspass mode=http dst-path=("/net_odns.txt")

:delay 2;

:local odnsReply [/file get net_odns.txt contents];

:log info "Actualización OpenDNS completada."

:log info "La respuesta OpenDNS fue: $odnsReply";

} else={

:log info "OpenDNS: La dirección IP anterior: $previousIP and la dirección IP actual son iguales, no es necesario actualizar"
}
Indexado!
 
Arriba