Syed Jahanzaib – Personal Blog to Share Knowledge !

October 8, 2015

[For Reference] Quick Script for Mikrotik Daily Info via SMS or Email !

Filed under: Mikrotik Related — Tags: , , , , — Syed Jahanzaib / Pinochio~:) @ 1:37 PM

keep calm n coding

mikrotik status updated script via sms

Quick Note:

Scenario#1:

DUAL DSL wan links are connected with mikrotik [modems are in bridge mode], Configured as PCC along with the pppoe server. USB modem is attached with the Mikrotik via USB port. The OP need an script which can daily send sms or email specific information to admin cell, or whenever admin require on urgent basis via sending sms to mikrotik and it can return back the info to the admin cell.

 

Dirty Solution:

Following script will collect information from Mikrotik system such as active pppoe users, CPU load, dsl links status etc and send this information to admin via SMS or Email either via scheduler or as receiver command on mikrotik. [I am already using much more advance version of this script in other networks in linux system as BASH is the best ground to support scripting but since linux was not available at this spot, i had to use Mikrotik only with usb modem attached]  it can be set as receive command too so that admin can send sms to mikrotik and mikrotik will reply back the current info to the admin mobile. Sometimes its very useful for remote admins.

#SCRIPT-1

# SENDING SMS TO ADMINS FOR DAILY MORNING ALERT
# Script Designed by SYED JAHANZAIB
# aacable at hotmail dot com / https://aacable.wordpress.com
# Morning Hours / 8th Oct, 2015

# Setting various variables / jz
:local date;
:local time;
:local PPP ([/ppp active print count-only])
:local UPTIME [/system resource get uptime]
:local CPU [/system resource get cpu-load]
:set date [/system clock get date];
:set time [/system clock get time];
:global FTPIP 192.168.0.50

# Following variables are configured via other scripts which scheduled to run after very 1 minutes to update internet/media sharing server status and set these variables
# But you can run your own script here to make variable after successful or failed ping results
# Ref: https://aacable.wordpress.com/2014/06/12/mikrotik-wan-monitoring-script-with-multiple-host-check/

:local DSL1 [/system script environment get [/system script environment find name="DSL1netstatus"] value];
:local DSL2 [/system script environment get [/system script environment find name="DSL2netstatus"] value];

# Local FTP Sharing Server or any other remote host, should be set via netwatch or local script inside this script
#:local FTP [/tool netwatch get number=0 status]
# Using one liner code to get FTP ping status and store it in variable, you can use same for above dsl status as well by
# forcing routes via specific gateway
:global FTP;
:if ([/ping $FTPIP count=1] = 0) do {:put ":set FTP value=DOWN"} else={:set FTP value=UP}

# Admin SMS Number Config
:local cell1 "03333021909"

# Gmail Config
:global SYSID ([/system identity get name])
:global adminmail1 aacable@hotmail.com
:global gmailid GMAILID@gmail.com
:global gmailpwd GMAILPASSWORD
:global gmailip
:set gmailip [:resolve "smtp.gmail.com"];

# Print LOG
:log warning "INFO: Daily info for NETWORK @ $date $time\nActive PPPOE Users = $PPP\nUptime is $UPTIME\nCPU Load = $CPU\nDSL1 = $DSL1\nDSL2 = $DSL2\nFTP = $FTP\n\nPowered by J."
:log warning "Sending DAILY MORNING ALERT SMS on $cell1 ... by J."

# Sending SMS
/tool sms send port=usb3 phone-number=$cell1 message="INFO: Daily info for NETWORK @ $date $time\nActive PPPOE Users = $PPP\nUptime = $UPTIME\nCPU Load = $CPU\nDSL1 = $DSL1\nDSL2 = $DSL2\nFTP = $FTP\n\nPowered by J." channel=0

# Sending EMAIL - Use it if if required
#/tool e-mail send to=$adminmail1 password=$gmailpwd subject="INFO: Daily info for @ $date $time" body="Active PPPOE Users = $PPP\nUptime = $UPTIME\nCPU Load = $CPU\nDSL1 = $DSL1\nDSL2 = $DSL2\nFTP = $FTP\n\nPowered by J." from=$gmailid server=$gmailip start-tls=yes

 

Sample Image of SMS:

debug

sms


 

Enable Mikrotik to Receive SMS and run script

Use following command to enable SMS receiving on mikrotik.

#:delay 60
/tool sms set keep-max-sms=10 port=usb3 receive-enabled=yes secret=12345 channel 0
#:delay 3
#/tool sms set receive-enabled=no
#:delay 3
#/tool sms set receive-enabled=yes

From your mobile you can send following message to run script on remote mikrotik.

:cmd 12345 script test

 

Explanation:

  • :cmd to let mikrotik know that its command
  • 12345 is secret which you configured in /tool > sms,kind of password / authentication
  • script to let mikrotik know that its script related command  and
  • test is script name you want to run.

More references for mikrotik base sms are available at https://aacable.wordpress.com/tag/mikrotik-sms/

 


#SCRIPT-2

Another mature version where we are using 2 mikrotik as NAS and freeradius as billing.

#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Script by Syed Jahanzaib / aacable@hotmail.com
# https://aacable.wordpress.com
# This script can inquire some specific Information from mikrotik and other server
# and send to admins via SMS
# Version 2.0 -
# Created in year 2013
# Last modified 20-NOV-2018
# set -x
logger DAILY_9_am_sms_executed
#ntpdate -u 91.189.91.157
UPTIME=`uptime | sed -e 's/^.*up //' -e 's/[^0-9:].*//' | sed 's/:/*60+/g'`
DATE=`date`
COMPANY="ZAIBB"
SQLUSER="root"
SQLPASS="SQLPASSWORD"
DB_RADIUS="radius"
RADIUS_SRV="freeradius"
MYSQL_SRV="mysql"
SQL_ACCOUNTING_TABLE="radacct"
export MYSQL_PWD=$SQLPASS
TMP="/tmp/dailysms.txt"
> $TMP
# snmp must be enabled on both NAS
MIKROTIK1="1.2.3.4"
MIKROTIK2="5.6.7.8"
SERVICE="freeradius"
SNMPCOM="PUBLIC"
# KANNEL SECTION
KURL="127.0.0.1:13013"
KPASS="kannel_pass"

CELL1="03333021909"

# Check if Mikrotik 1 is accessibel or not, if not then update status
if [[ $(ping -q -c 2 $MIKROTIK1) == @(*100% packet loss*) ]]; then
MIKROTIK1_STATUS="DOWN"
echo -e "ALERT ..... MIKROTIK $MIKROTIK1 is DOWN"
else
MIKROTIK1_STATUS="OK"
echo -e "-Mikroik $MIKROTIK1 PING OK, Proceeding further ..."
fi

# Check if Mikrotik 2 is accessibel or not, if not then update status
if [[ $(ping -q -c 2 $MIKROTIK2) == @(*100% packet loss*) ]]; then
MIKROTIK2_STATUS="DOWN"
echo -e "ALERT ..... MIKROTIK $MIKROTIK2 is DOWN"
else
MIKROTIK2_STATUS="OK"
echo -e "-Mikroik $MIKROTIK2 PING OK, Proceeding further ..."
fi

# Check if $DB (in this case radius ) is accessible or not, if NOT, then update status
DB_RESULT=`mysql --skip-column-names -e "SHOW DATABASES LIKE '$DB_RADIUS'"`
if [ "$DB_RESULT" == "$DB_RADIUS" ]; then
DB_RADIUS_RESULT="UP"
echo "-$DB_RADIUS database exist OK. Proceeding further ..."
else
DB_RADIUS_RESULT="DOWN"
echo "-$DB_RADIUS database does not exist!"
fi

# Check if SRV (in this case MYSQL) is running or not, if NOT, update status
MYSQL_SRVSTATUS=$(pgrep $MYSQL_SRV | wc -l);
if [ "$MYSQL_SRVSTATUS" -ne 1 ];
then
echo "-$MYSQL_SRV is down. Pleasec check your $RADIUS_SRV service first"
MYSQL_STATUS="DOWN"
else
MYSQL_STATUS="UP"
echo "-$MYSQL_SRV is accessible OK. Proceeding further ..."
fi

# Check if SRV (in this case FREERADIUS) is running or not, if NOT, then update status
RADIUS_SRVSTATUS=$(pgrep $RADIUS_SRV | wc -l);
if [ "$RADIUS_SRVSTATUS" -ne 1 ];
then
echo "-$RADIUS_SRV is down. Pleasec check your $RADIUS_SRV service first"
FR_STATUS="DOWN"
else
FR_STATUS="UP"
echo "-$RADIUS_SRV is accessible OK. Proceeding further ..."
fi

PPP1=`snmpwalk -Oqv -v1 -c $SNMPCOM $MIKROTIK1 1.3.6.1.4.1.9.9.150.1.1.1.0`
PPP2=`snmpwalk -Oqv -v1 -c $SNMPCOM $MIKROTIK2 1.3.6.1.4.1.9.9.150.1.1.1.0`

SESSIONS=`mysql --skip-column-names -e "use $DB_RADIUS; SELECT username FROM $SQL_ACCOUNTING_TABLE WHERE acctstoptime IS NULL;" |wc -l`

# Print total and each vlan users
MSG="$COMPANY - Daily INFO SMS
@ $DATE

$MIKROTIK1 ping = $MIKROTIK1_STATUS
$MIKROTIK2 ping = $MIKROTIK2_STATUS
Radius Online = $SESSIONS
CCR $MIKROTIK1 PPP Users = $PPP1
CCR $MIKROTIK2 PPP Users = $PPP2
Radius = $FR_STATUS
MYSQL = $MYSQL_STATUS
DB = $DB_RADIUS_RESULT"
echo "$MSG" > $TMP
cat $TMP

# Finally SEND SMS
#curl "http://$KURL/cgi-bin/sendsms?username=kannel&password=$KPASS&to=$CELL1" -G --data-urlencode text@$TMP

# THE END

Regard’s
Syed Jahanzaib!

October 1, 2015

Prevent your mobile SIM getting blocked by Mobile Operator dueto bulk SMS Sending

Filed under: Linux Related, Radius Manager — Tags: , , , — Syed Jahanzaib / Pinochio~:) @ 10:34 AM

sim

From ISP perspective, sending notifications for different events like expiry alerts, quota warning alerts, service disruption alert, welcome messages, password recovery via sms, etc etc to users is generally a good idea and becoming essential part of services. To send SMS in a proper way, its recommended get 3rd party SMS gateway services so that SMS goes by your company name and there should be no legal issue. but for smaller networks with lesser number of users, hiring 3rd party services is not financially suitable.

For a smaller network you can simply add any GSM Modem (example huawei or Teltonika) and use any local mobile operator SIM to send / receive SMS from your billing system because in our country SMS packages are dirt cheap. Ufone provides 100,000 SMS package in just 8$ per year, other operator’s packages are also cheap.  You can install KANNEL sms gateway in your linux system and use it to send SMS in automated way using your billing or any other customized method. BUT the issue is if you send bulk SMS in single go, there are strong chances that your SIM may get blocked by the operator because there are some official and un official restrictions imposed by either Operator or Telecom authorities like some sources states that

SIM gets blocked If you cross 200 SMS limit in 15 minutes and some mobile operator blocks SIM if you send 500 sms in 1 hour.

Ref: http://www.web.pk/2014/pta-devised-a-policy-to-stop-bulk-sms/

 

Solution:

[Suitable for SOHO]

If you are using KANNEL, and sending SMS using BASH scripts, add delay by using “sleep 20” (20 seconds delay) in the loop section so that there should be at least 10 or 20 seconds delay in between each sms sending. After adding 20 seconds delay to the code, only 3 SMS will go out per minute. You can adjust and fine tune this delay as per your requirements.
Example:

https://aacable.wordpress.com/2015/06/18/freeradiusmysql-account-expiry-sms-notification-script-using-itelservices-net-bulk-sms-gateway/

 

OR if you are using Radius Manager , then edit its sms gateway API php file and add the sleep delay as showed in the image below …

api-code

Now try to send Bulk SMS using RM ACP Panel, and you will see the delay in logs as well. : )~

delay-20-sec


 

Note:

In KANNEL there is an option ‘throughput‘ via which per sms sending can be controlled but for somehow it didn’t worked for ever. Therefore I used delay codes in the scripts or at the processing of submitting code.
I posted this issue at various forums but yet couldn’t found any solution on howto to add DELAY for outgoing sms  in KANNEL configuration. If any one knows the working solution. Kindly do let me know 🙂
Also share your experiences on how your SIM got blocked, what are other operators SMS sending limits? PTA limits etc.


 

Some Reference URLS for KANNEL

https://aacable.wordpress.com/2012/11/26/howto-configure-your-local-http-gateway-using-kannel-on-ubuntu/
https://aacable.wordpress.com/2015/06/18/freeradiusmysql-account-expiry-sms-notification-script-using-itelservices-net-bulk-sms-gateway/
https://aacable.wordpress.com/2012/11/26/dmasoftlab-radius-manager-sms-notification-configuration/
https://aacable.wordpress.com/tag/send-sms-to-users/

 

 

Regard’s
Syed Jahanzaib