Jump to content

Нужна помощь с уведомлениями по переходу роутера на резерв и обратно


Recommended Posts

Приветствую!

Приобрёл UltraII - сказать, что я в восторге - это ничего не сказать. Резервирование интернета выполнено так, как я и мечтать не мог. 

В итоге у меня: 1. Основная линия от провайдера, 2. Wifi от соседа. 3. 4G модем. 

К сожалению, провайдерская линия не самая надёжная, поэтому нередки переключения на резервные каналы. В такие моменты хотелось бы иметь уведомления, чтобы не попасть на деньги за трафик на резервных лимитных каналах. Поэтому очень нужен скрипт, который бы отправлял на почту сообщения о переключении на резерв и обратно, с указанием текущего канала в заголовке письма. Я в свою очередь через гейт email-push делаю форвард такого письма себе на смартфон и вижу в заголовке пуш сообщения, на какой канал переключился роутер. 

Знаний и умений у меня хвалило бы только на внесение собственных данных в готовый скрипт по инструкции. 

В связи с этим прошу помощи в создании подобного решения. Уверен, оно пригодится многим. В идеале, чтобы для него не нужна была отдельная флешка, а хранилось бы оно в памяти роутера. Такое решение было у меня на асусе, и работало неплохо. Если нужно как база - готов предоставить исходник. 

Основные задачи:

1. При переключении на резервный канал присылается email сообщение с заголовком "Роутер "routername" перешел на  "название канала".

В тексте письма - новый ip адрес роутера.

2. При переключении на основной канал присылается email сообщение с заголовком "Роутер "routername" перешел на  "название канала".

В тексте письма - новый ip адрес роутера.

3. При перезагрузке роутера приходило сообщение о выходе онлайн с учётом таймаута получения точного времени (чтобы скрипт не уходил в цикл, был уже такой опыт). 

 

Если кто-то готов помочь с подобным скриптом и инструкцией по его установке и настройке для чайников - я был бы очень благодарен. 

Заранее понимаю, что 90% этого форума отправят меня изучать мануалы, похожие кейсы (про смс уведомления видел) и т.д., поэтому если нет желания помочь - просто спасибо, что прочитали сообщение.  

Link to comment
Share on other sites

1 минуту назад, r13 сказал:

Без флешки на текущий момент точно никак.

На асусе у меня было через wan-start вот таким образом

Неужели на keenetic аналогично нельзя сделать? 

Link to comment
Share on other sites

5 минут назад, Andrew Voronkov сказал:

На асусе у меня было через wan-start вот таким образом

Неужели на keenetic аналогично нельзя сделать? 

Не, никаких внешних скриптов нет, все расширения только через opkg на флешке.

Зато в opkg как раз есть нужные вам хуки вызываемые при изменении wan интерфейса, и нет необходимости гонять скрипт в бекграунде.

Edited by r13
Link to comment
Share on other sites

1 минуту назад, r13 сказал:

Не, никаких внешних скриптов нет, все расширения только через opkg на флешке.

Ну пусть так, главное, чтобы помогли с расширением..

Тем более второй слот usb свободен пока что. Хотя думаю 4G модем другого оператора воткнуть еще одним резервом. Тогда хаб поставлю. 

Link to comment
Share on other sites

1 минуту назад, arbayten сказал:

как вариант - триал https://sendgrid.com/pricing/ и curl на хуке: https://sendgrid.com/solutions/email-api/

Это как-то очень сложно, при наличии собственного адреса на gmail, через который можно спокойно слать письма. У меня так уже год работало на асусе. 

Link to comment
Share on other sites

19 минут назад, Andrew Voronkov сказал:

Это как-то очень сложно, при наличии собственного адреса на gmail, через который можно спокойно слать письма. У меня так уже год работало на асусе. 

раз у гугла есть соответствующий api, то конечно справитесь

Link to comment
Share on other sites

7 минут назад, arbayten сказал:

раз у гугла есть соответствующий api, то конечно справитесь

то есть по вашему мнению функции отправки почты (которая на моем прошлом роутере решалась несколькими строчками кода) в кинетике нет вообще? 

Вот скрипт, если что: 

#!/bin/sh

#bof
# dev options, uncomment when so desired
#set -x
#set -v

# Author: thelonelycoder
# http://www.snbforums.com/members/thelonelycoder.25480/

# Script version: 1.7
# Release date June 28 2017



### About this script ###
# This scipt sends a notification email with the currently used WAN type
# and IP address whenever the WAN comes up. The Syslog is notified of this event as well.
# This works with a standard single as well as dual-WAN setup.
# For the second WAN type, USB, Android and all LAN-ports are supported.


### How to use this script ###
# 1. Change credentials and settings in the User settings part below

# 2. Place this script in /jffs/scripts and name it wan_connect_notification
# You should now have this script at this location:
# /jffs/scripts/wan_connect_notification

# 3. Set script executable (0755)
# Enter this in terminal, without the leading #:
# chmod a+rx /jffs/scripts/*

# 4. Place a file link in /jffs/scripts/wan-start to run it whenever the WAN state changes
# Open wan-start and place the following line in the file at the bottom, without the leading #
# but leave the comment part in (# WAN ...):
# /jffs/scripts/wan_connect_notification # WAN change notification email



### User settings, must be set correctly to work ###

# Email settings (mail envelope) #
FROM_ADDRESS="you@gmail.com"
TO_NAME="Your Name"
TO_ADDRESS="you@gmail.com"

# Email credentials #
USERNAME="you@gmail.com"
PASSWORD="gmail-password"

# Server settings #
SMTP="smtp.gmail.com"
PORT="465"

# Set encryption type: SSL = smtps (default), TLS = smtp
SMTP_ENCRYPT=smtps

# FROM Name in email (router model is auto-added after 'Router')
FROM_NAME="Router"

# NTP timeout
# Seconds to wait until native ntp client has synchronised time after booting.
# Don's set this too low. Default is 15
NTP_TIMEOUT=15

# Maximum number of cycles to run to detect WAN new type
# default is 60, which is about 60 seconds
WAN_WAIT_CYCLES=60

# Wait time for WAN IP assignment #
# set this higher if it takes longer for the IP assignment after WAN type change
# default is PING_TIMEOUT=2 and PING_COUNT=50
# Wait time is PING_TIMEOUT * PING_COUNT: 2 * 50 = 100 seconds
PING_TIMEOUT=2
PING_COUNT=50

# Ping IP, default is Google's DNS: 8.8.8.8
# reliable alternative: Level 3 DNS: 209.244.0.3
PING_IP=8.8.8.8

# Wait time until lock file is removed
# This prevents to send duplicate emails when wan-start is ran multiple times.
# Do not set this too high, recommended is 5-20 seconds, default is 10
LOCK_FILE_REMOVE_WAIT=10

# Auto-reboot feature
# This reboots the router once if the WAN does not restore fully for some reason.
# The reboot is issued when all the timeout's above are reached, with this formula:
# NTP_TIMEOUT + WAN_WAIT_CYCLES + (PING_TIMEOUT * PING_COUNT)
# Default setting is off (no rebooting), to activate, set to on
REBOOT_ROUTER_WHEN_NO_WAN=off




###########################

### DO NOT CHANGE BELOW ###

# Set environment PATH to system binaries
export PATH=/sbin:/bin:/usr/sbin:/usr/bin$PATH

# This script's name
SCRIPT_NAME=wan_connect_notification

# Prevent more than one instance of this script
LOCK_FILE=/tmp/$SCRIPT_NAME.lock

# Function write lockfile(s), remove it if older than setting
check_lockfile(){
if [ -f "$1" ];then
	if [ "$3" == "wanlock" ] && [ -d "/proc/$(cat $LOCK_FILE)" ];then
		logger "$SCRIPT_NAME: Prevented second instance of this script, lockfile exists. via $0"
		exit 1
	fi
	FILE_TIMESTAMP=$(date +%s -r $1)
	FILE_TIMESTAMP_WAIT=$((FILE_TIMESTAMP + $2))
	# compare timestamp of file to (date + wait time)
	if [ "$FILE_TIMESTAMP_WAIT" -le "$(date +"%s")" ];then
		# lockfile is expired, overwrite it
		echo "$$" >$1
	else
		# lock file not expired, exit script
		if [ "$3" == "rebootlock" ];then
			logger "$SCRIPT_NAME: Not rebooting router again, lockfile of previous reboot exists. via $0"
		else
			logger "$SCRIPT_NAME: Prevented second instance of this script, lockfile exists. via $0"
		fi
		exit 1
	fi
else
	# write lockfile if not foud
	echo "$$" >$1
fi
}

# Run lockfile function for this files lock
check_lockfile $LOCK_FILE $LOCK_FILE_REMOVE_WAIT wanlock

# NTP cycles start count
NTP_UP_CYCLES=0

# Wait until NTP is set
while [ "$(nvram get ntp_ready)" != "1" ] && [ "$NTP_UP_CYCLES" -le "$NTP_TIMEOUT" ];do
	NTP_UP_CYCLES=$((NTP_UP_CYCLES+1))
	sleep 1
done

# Report if timeout is reached
if [ "$NTP_UP_CYCLES" == "$((NTP_TIMEOUT+1))" ];then
	NTP_TIMEOUT_REACHED="(Timeout is $NTP_TIMEOUT, NTP is not set)"
	logger "$SCRIPT_NAME: NTP was not set. Timeout of $NTP_TIMEOUT reached. via $0"
else
	NTP_TIMEOUT_REACHED=
fi

# Function detect WAN type in use
detect_wan_type(){

# Set to empty first
WAN_IP=0
WAN_OK=0

if [ "$(nvram get link_wan)" == 1 ];then
	# WAN is up
	WAN_TYPE="Primary WAN"
	WAN_IP=$(nvram get wan0_ipaddr)
	WAN_OK=1
elif [ $(nvram get link_wan1) == 1 ];then
	# WAN1 is up
	WAN_TYPE="Secondary WAN"
	WAN_IP=$(nvram get wan1_ipaddr)
	WAN_OK=1
fi
}

# Count wait cycles start count
WAIT_CYCLES=0

# Run detect WAN type function
detect_wan_type

# Rerun detect WAN type function if none is registered
while [ "$WAN_OK" == "0" ] && [ "$WAN_IP" == "0" ];do
	sleep 1
	detect_wan_type
	WAIT_CYCLES=$(($WAIT_CYCLES + 1))
	echo -e "\nWaiting for WAN type and IP registering, cycle $WAIT_CYCLES"
	if [ "$WAIT_CYCLES" -eq "$WAN_WAIT_CYCLES" ];then
		logger "$SCRIPT_NAME: Wait cycles reached after $WAIT_CYCLES attempt(s) via $0"
		echo -e "\n$SCRIPT_NAME: Wait cycles reached after $WAIT_CYCLES attempt(s) via $0\n"
		if [ "$REBOOT_ROUTER_WHEN_NO_WAN" == "off" ];then
			exit 1
		fi
	fi
done

# Preserve ping variables for output before while loop runs
WAIT_TIME=$(($PING_TIMEOUT * $PING_COUNT))
TIMEOUT=$PING_TIMEOUT
COUNT=$PING_COUNT

# Print to teminal if run from it (test feature)
echo -e "\nPinging IP $PING_IP $PING_COUNT times for a total of $WAIT_TIME seconds...\n"

# Ping cycles counter start count
PING_CYCLES=0

# Ping until success (WAN is connected) using wait time settings
# then only continue if succeeded
while [ $PING_COUNT -ne 0 ];do
    ping -c 1 -W $PING_TIMEOUT $PING_IP
    rc=$?
    if [ $rc -eq 0 ];then
        PING_COUNT=1
	else
		sleep $PING_TIMEOUT
    fi
    PING_COUNT=$(($PING_COUNT - 1))
	PING_CYCLES=$(($PING_CYCLES + 1))
done

# Reboot lock file (used if enabled)
REBOOT_LOCK_FILE=/jffs/scripts/wan_connect_notification-reboot.lock

# Ping messages to syslog and email
if [ $rc -eq 0 ] ; then
    MESSAGE1="$SCRIPT_NAME script stats:"
	MESSAGE2="Ping cycles = $PING_CYCLES, actual wait time until WAN up = $(($PING_CYCLES * $PING_TIMEOUT)) seconds."
	logger "$SCRIPT_NAME: WAN connection restored. Ping cycles = $PING_CYCLES, Actual time = $(($PING_CYCLES * $PING_TIMEOUT)), via $0"
	echo -e "\n$MESSAGE1\n$MESSAGE2\n"
else
    echo -e "\n$SCRIPT_NAME script error message:"
	echo -e "WAN up wait time timeout:\n Increase PING_TIMEOUT and/or PING_COUNT.\n"
	logger "$SCRIPT_NAME: WAN up wait time timeout: Increase PING_TIMEOUT and/or PING_COUNT, via $0"

	# reboot when no WAN if enabled
	if [ "$REBOOT_ROUTER_WHEN_NO_WAN" == "on" ];then

		# Run lockfile function for this file's lock
		check_lockfile $REBOOT_LOCK_FILE 400 rebootlock

		# if check_lockfile allows it, continue
		logger "$SCRIPT_NAME: No WAN type registered, rebooting router, via $0"
		echo "$SCRIPT_NAME: No WAN type registered, rebooting router"
		# rebooting router now
		sleep 5
		reboot
		exit 1
	else
		rm -rf $REBOOT_LOCK_FILE
		exit 1
	fi
fi


# Get the router uptime in human readable format
ROUTER_UPTIME=$(awk '{printf("%d days %02d hours %02d minutes %02d seconds\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' /proc/uptime)

# Check if WebUI login IP address is stored in NVRAM
if [ "$(nvram get login_ip_str)" == "" ];then
	LOGIN_IP="none recorded"
else
	LOGIN_IP=$(nvram get login_ip_str)
fi

# Get ODM PID if found, else use productid as router model
if [[ -z "$(nvram get odmpid)" ]];then
	ROUTER_MODEL=$(nvram get productid)
else
	ROUTER_MODEL=$(nvram get odmpid)
fi

# Assemble the message
echo "From: \"$FROM_NAME $ROUTER_MODEL\" <$FROM_ADDRESS>" >/tmp/wanmail.txt
echo "To: \"$TO_NAME\" <$TO_ADDRESS>" >>/tmp/wanmail.txt
echo "Subject: $ROUTER_MODEL is now on $WAN_TYPE" >>/tmp/wanmail.txt
echo "Date: $(date -R)" >>/tmp/wanmail.txt
echo "" >>/tmp/wanmail.txt
echo "  There's been a WAN type change on the router on $(date -R)." >>/tmp/wanmail.txt
echo "" >>/tmp/wanmail.txt
echo "  Router $ROUTER_MODEL is now connected through $WAN_TYPE" >>/tmp/wanmail.txt
echo "  The WAN IP is: $WAN_IP" >>/tmp/wanmail.txt
# If reboot router is yes, add message to mail after reboot, remove the REBOOT_LOCK_FILE
if [ -f "$REBOOT_LOCK_FILE" ];then
	echo "" >>/tmp/wanmail.txt
	echo "  Router has been rebooted once to restore WAN connection." >>/tmp/wanmail.txt
	logger "$SCRIPT_NAME: Router has been rebooted once to restore WAN connection, via $0"
	rm -rf $REBOOT_LOCK_FILE
fi
echo "" >>/tmp/wanmail.txt
echo "  Router uptime: $ROUTER_UPTIME" >>/tmp/wanmail.txt
echo "  The LAN IP is: $(nvram get lan_ipaddr)" >>/tmp/wanmail.txt
echo "  Last WebUI login IP address: $LOGIN_IP" >>/tmp/wanmail.txt
echo "" >>/tmp/wanmail.txt
echo "  $MESSAGE1" >>/tmp/wanmail.txt
echo "  Seconds until NTP updated: $NTP_UP_CYCLES $NTP_TIMEOUT_REACHED" >>/tmp/wanmail.txt
echo "  $MESSAGE2" >>/tmp/wanmail.txt
echo "  WAN IP register wait cycles: $WAIT_CYCLES" >>/tmp/wanmail.txt
echo "" >>/tmp/wanmail.txt
echo "  --- " >>/tmp/wanmail.txt
echo "  Your friendly router." >>/tmp/wanmail.txt

# Send with curl
curl --url $SMTP_ENCRYPT://$SMTP:$PORT \
  --mail-from "$FROM_ADDRESS" --mail-rcpt "$TO_ADDRESS" \
  --upload-file /tmp/wanmail.txt \
  --ssl-reqd \
  --user "$USERNAME:$PASSWORD" --insecure

# Remove temp file
rm -rf /tmp/wanmail.txt

# Notify Syslog of the event
logger "$SCRIPT_NAME: WAN type change detected, notification sent to $TO_ADDRESS via $0"

# Remove the $SCRIPT_NAME.lock
sleep $LOCK_FILE_REMOVE_WAIT
rm -rf $LOCK_FILE

#eof

 

Edited by Andrew Voronkov
Link to comment
Share on other sites

1 минуту назад, Andrew Voronkov сказал:

то есть по вашему мнению функции отправки почты (которая на моем прошлом роутере решалась несколькими строчками кода) в кинетике нет вообще? 

Вот скрипт, если что?

если поставите и настроите smtp, да так, чтобы выхлоп в спам не попадал, то, наверное, сможете адаптировать и эту простыню.

либо, очень сложный вариант, - посмотреть как люди запускают скрипты, когда дергается wan (например, когда белый ip себе выбивают), посмотреть что нужно для запуска curl и если нужно только уведомление, то реализовать все в один вызов с передачей значения $interface (и даже не придется ломать голову над тонкостями хождения почты по паутине), либо опять же адаптировать простыню выше под сборку нужных данных.

Link to comment
Share on other sites

1. sms

Цитата

Отправить один текст на один или несколько номеров, указанных через запятую:


https://sms.ru/sms/send?api_id=[зарегистрируйтесь, чтобы получить api_id]&to=79255070602,74993221627&msg=hello+world&json=1

Отправить разный текст на разные номера:


https://sms.ru/sms/send?api_id=[зарегистрируйтесь, чтобы получить api_id]&to[79255070602]=hello+world&to[74993221627]=hello+world&json=1

описание  http://sms.ru/api/send 

2. sendmail включенный в busybox, в entware по моему нет

3. как выше

Цитата

echo -e "Subject:  ххххх" | curl --url "smtps://smtp.gmail.com:465" --ssl-reqd --mail-from $USER  --mail-rcpt $RECIPIENT --user "$USER:$PASS" --insecure

 

Edited by vasek00
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...