Quantcast
Channel: Syed Jahanzaib – Personal Blog to Share Knowledge !
Viewing all articles
Browse latest Browse all 408

Retrieve User Account Info via SMS in Radius Manager along with playSMS

$
0
0

sms

usereinfo

 


SCENARIO:

We are using DMASOFTLAB Radius Manager as our billing system and Playsms along with KANNEL sms gateway is installed on same server. We would like to a function in playsms that if user sends sms with specific keyword like `userinfo USERNAME` , then the scritp should trigger and retreieve user information & sms back to the sender in specified format.

In this example, we are using DMASOFTLAB Radius Manager as our billing system, and KANNEL along-with the playSMS is already configured and in working condition. Kannel+playSMS configuration details have already been described briefly with examples in my previous posts.

We have created an script on the billing system which fetches the user account status and other information from the MYSQL database and print them as per our defined format.

This is just for demonstration purpose. the script have lot of junk data and should be modified before production deployment. I am just sharing some thoughts and ideas only 🙂


REQUIREMENTS

  • Radius Manager 4.x Version
  • 127.0.0.1 must be added in ALLOWED NASes in all services
  • Kannel SMS gateway for IN/OUT sms
  • playSMS

SCRIPT !

Script is as follows FYR. Hope it may help someone

cat userinfo.sh

#!/bin/bash
#set -x
# Thsi script is designed SPECIFICALLY for dmasoftlab radius manager 4.1.x series
# This script check user status , Expiry Date, Service Plan, Data Used
# mainly it is designed to work with playsms , so that user sends sms , and playsms will execute this script with username
# and reply back with the information it fetches
# Designed by : Syed Jahanzaib
# aacable @ hotmail.com = https://aacable.wordpress.com
# Last Modified on 9th June, 2015
DATE=$(date '+%Y-%m-%d_____%H-%M-%S')
TMP="/tmp/userinfo_incoming_sms__$DATE.sms"
# Strip user name and card number separate oterhwise playsms will treat both variables as one
echo $1 > $TMP
USR=`cat $TMP | awk {' print $1 '}`

# MYSQL USER NAME AND PASSWORD Variables
SQLUSER="SQL_ROOT_USER"
SQLPASS="SQL_ROOT_PASSWORD"
SQLHOST="localhost"
SQLPORT="3306"
DB="radius"
export MYSQL_PWD=$SQLPASS
CMD="mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT --skip-column-names -e"

CURRENCY="MVR"
RMAUTH="/usr/local/bin/rmauth"

###################### bytes conversion formula
bytesToHuman() {
b=${1:-0}; d=''; s=0; S=(Bytes {K,M,G,T,P,E,Z,Y}iB)
while ((b > 1024)); do
d="$(printf ".%02d" $((b % 1024 * 100 / 1024)))"
b=$((b / 1024))
let s++
done
echo "$b$d ${S[$s]}"
}
#####################

# Check User Validation, if not found exit with error , else continue
FOOTER="
Powered by Syed Jahanzaib"

if [ -z "$USR" ]; then
echo -e "(Error 0) username missing,
Usage: userinfo myusername"

exit 1
fi

# Check if user in DB or not
USRVALID=`$CMD "use $DB; SELECT username FROM rm_users WHERE username = '$USR';"`
if [ -z "$USRVALID" ]; then
echo -e "(Error 1) USER NOT FOUND !"
exit 1
fi

# Check if user quota is ended or not
IS_USER_QUOTA_AVAILABLE=`$RMAUTH 127.0.0.1 $USR 1 |grep -i -c "Total traffic limit reached!"`
if [ "$IS_USER_QUOTA_AVAILABLE" -eq 1 ];then
echo "(Error 2) Account Quota limit have finished , please recharge it first!"
exit 1
fi

# Check if user is expired or not
IS_USER_EXPIRED_OR_NOT=`$RMAUTH 127.0.0.1 $USR 1 |grep -i -c "expired!"`
if [ "$IS_USER_EXPIRED_OR_NOT" -eq 1 ];then
echo "(Error 3)Your account date expired , please recharge to continue our service"
exit 1
fi

# Check if user is enabled or disabled in radius
IS_USER_ENABLED_OR_DISABLED=`$RMAUTH 127.0.0.1 $USR 1 |grep -i -c "Invalid service reference!"`
if [ "$IS_USER_ENABLED_OR_DISABLED" -eq 1 ];then
echo "(Error 4)Your account is disabled by Admin!"
exit 1
fi

# VARIABLES
TODAY=$(date +"%Y-%m-%d")
TODAYDIGIT=`echo $TODAY | sed -e 's/-//g'`
MONTH=$(date +"-%m")
CMONTH=`echo $MONTH | sed -e 's/-//g'`
CURR_MONTHYEAR=$(date +"%Y-%m")
MONTHYEAR=$(date +"%B-%Y")
ALPHAMONTHYEAR=`echo $MONTHYEAR #| sed -e 's/-//g'`
SRVEXPIRYFULL=`$CMD "use $DB; SELECT expiration FROM rm_users WHERE username = '$USR';"`
LOGOFFDATE=`$CMD "use $DB; SELECT lastlogoff FROM rm_users WHERE username = '$USR';"`
SRVID=`$CMD "use $DB; SELECT srvid from rm_users where username = '$USR';"`
SRVEXPIRY_YES_OR_NO=`$CMD "use $DB; SELECT limitexpiration FROM rm_services WHERE srvid = '$SRVID';"`
SRV_NEXT_DAILY=`$CMD "use $DB; SELECT dailynextsrvid FROM rm_services where srvid = '$SRVID'";`
SRV_NEXT_DISABLED=`$CMD "use $DB; SELECT disnextsrvid FROM rm_services where srvid = '$SRVID'";`
SRV_NEXT=`$CMD "use $DB; SELECT nextsrvid FROM rm_services where srvid = '$SRVID'";`
SRV_QUOTA_LIMIT_IN_MB=`$CMD "use $DB; SELECT trafficunitcomb FROM rm_services where srvid = '$SRVID'";`
SRV_QUOTA_LIMIT_IN_BYTES=`echo "($SRV_QUOTA_LIMIT_IN_MB)*(1024)*(1024)" |bc`
SRVPRICE=`$CMD "use $DB; SELECT unitprice FROM rm_services WHERE srvid = $SRVID;"`
TOT_DOWN_UP_CURR_MONTH_IN_BYTES=`$CMD "use $DB; SELECT ((SUM(AcctInputOctets)+SUM(AcctOutputOctets))) FROM radacct WHERE username ='$USR' AND acctstarttime LIKE '$CURR_MONTHYEAR-%' LIMIT 0 , 30;"`

TOT_USER_DOWNLOAD_SINCE_LAST_REFRESH_IN_BYTES=`$CMD "use $DB; SELECT downlimit from rm_users where username = '$USR';" |sed 's/[\._-]//g'`
TOT_USER_UPLOAD_SINCE_LAST_REFRESH_IN_BYTES=`$CMD "use $DB; SELECT uplimit from rm_users where username = '$USR';" |sed 's/[\._-]//g'`

TOT_USER_USED_DATA_SINCE_LAST_REFRESH_IN_BYTES=`echo "($TOT_USER_DOWNLOAD_SINCE_LAST_REFRESH_IN_BYTES)+($TOT_USER_UPLOAD_SINCE_LAST_REFRESH_IN_BYTES)" |bc`
TOT_USER_DOWNUP_FROM_RADACCT=`$CMD "use radius; SELECT ((SUM(AcctInputOctets)+SUM(AcctOutputOctets))) FROM radacct WHERE username = '$USR';" |sed 's/[\._-]//g'`
TOT_USER_USED_DATA_SINCE_LAST_REFRESH_IN_HUMAN_FRIENDLY_VALUE=`bytesToHuman $TOT_USER_USED_DATA_SINCE_LAST_REFRESH_IN_BYTES`

USER_QUOTA_LEFT_SINCE_LAST_REFRESH_IN_BYTES=`echo "($SRV_QUOTA_LIMIT_IN_BYTES)-($TOT_USER_USED_DATA_SINCE_LAST_REFRESH_IN_BYTES)" |bc`
USER_QUOTA_LEFT_SINCE_LAST_REFRESH_IN_HUMAN_FRIEND_VALUE=`bytesToHuman $USER_QUOTA_LEFT_SINCE_LAST_REFRESH_IN_BYTES`

PKGNAME=`$CMD "use $DB; SELECT srvname FROM rm_services WHERE srvid = '$SRVID';"`
USER_FIRSTNAME=`$CMD "use $DB; SELECT firstname FROM rm_users WHERE username = '$USR';"`
USER_LASTNAME=`$CMD "use $DB; SELECT lastname FROM rm_users WHERE username = '$USR';"`
QTL_Y_OR_NO=`$CMD "use $DB; SELECT limitcomb FROM rm_services WHERE srvid = '$SRVID';"`

#echo "Account STATUS= OK!"

echo -e "Account Registed to = $USER_FIRSTNAME $USER_LASTNAME"
echo -e "PACKAGE = $PKGNAME"
if [ "$SRVPRICE" == "0.000000" ]; then
echo -e "Service Price = n/a"
else
echo -e "Service Price = $SRVPRICE $CURRENCY"
fi

if [ "$SRVEXPIRY_YES_OR_NO" -eq 0 ]; then
echo -e "Date Expiration = Unlimited"
else
echo -e "Date Expiration = $SRVEXPIRYFULL"
fi

# Check QUOTA value if quota is enforced
if [ "$QTL_Y_OR_NO" -eq 1 ]; then
SRV_QUOTA_LIMIT_IN_HUMAN_FRIENDLY_VALUE=`bytesToHuman $SRV_QUOTA_LIMIT_IN_BYTES`
echo "Service Quota Allowed: $SRV_QUOTA_LIMIT_IN_HUMAN_FRIENDLY_VALUE"
else
echo "Quota Allowed: No Limit"
fi

# Check If next service is allowed after expiration or over quota
if [ "$SRV_NEXT_DAILY" == "-1" ] && [ "$SRV_NEXT_DISABLED" == "-1" ] && [ "$SRV_NEXT" == "-1" ]; then
NEXT_SRV_ENABLED_OR_NOT_FRIENDLY_VALUE="Not Configured"
else
NEXT_SRV_ENABLED_OR_NOT_FRIENDLY_VALUE="Yes"
fi

#if [ "$TOT_USER_DOWNUP_FROM_RADACCT" == "NULL" ]; then
#echo "Total Data Used Since Last Renewal = NULL"
#TOT_USER_DOWNUP_FROM_RADACCT="0"
#fi

# *ZAIB
if [ "$QTL_Y_OR_NO" -eq 1 ]; then

# Allah shuker - zaib
RM_CMD_FOR_USER_ACTUAL_LIVE_QUOTA_VALUE=`$CMD "use $DB; SELECT SQL_CALC_FOUND_ROWS IF (limitdl = 1, downlimit - COALESCE((SELECT SUM(acctoutputoctets) FROM radacct WHERE radacct.username = tmp.username) - (SELECT COALESCE(SUM(dlbytes), 0) FROM rm_radacct WHERE rm_radacct.username = tmp.username), 0), 0), IF (limitul = 1, uplimit - COALESCE((SELECT SUM(acctinputoctets) FROM radacct WHERE radacct.username = tmp.username) - (SELECT COALESCE(SUM(ulbytes), 0) FROM rm_radacct WHERE rm_radacct.username = tmp.username), 0), 0), IF (limitcomb =1, comblimit - COALESCE((SELECT SUM(acctinputoctets + acctoutputoctets) FROM radacct WHERE radacct.username = tmp.username) - (SELECT COALESCE(SUM(ulbytes + dlbytes), 0) FROM rm_radacct WHERE rm_radacct.username = tmp.username), 0), 0), IF (limituptime = 1, uptimelimit - COALESCE((SELECT SUM(acctsessiontime) FROM radacct WHERE radacct.username = tmp.username) - (SELECT COALESCE(SUM(acctsessiontime), 0) FROM rm_radacct WHERE rm_radacct.username = tmp.username), 0), 0) FROM ( SELECT username, firstname, lastname, address, city, zip, country, state, phone, mobile, email, company, taxid, rm_users.srvid, rm_users.downlimit, rm_users.uplimit, rm_users.comblimit, rm_users.expiration, rm_users.uptimelimit, credits, comment, enableuser, staticipcpe, staticipcm, ipmodecpe, ipmodecm, srvname, limitdl, limitul, limitcomb, limitexpiration, limituptime, createdon, verifycode, verified, selfreg, acctype, maccm, mac, groupid, contractid, contractvalid, rm_users.owner, srvtype, lastlogoff FROM rm_users JOIN rm_services USING (srvid) ORDER BY username ASC ) AS tmp WHERE 1 AND username LIKE '$USR%' AND (tmp.acctype = '0' OR tmp.acctype = '1' OR tmp.acctype = '2' OR tmp.acctype = '3' OR tmp.acctype = '4' OR tmp.acctype = '5' ) LIMIT 0, 50;" | awk '{print $3}'`
RM_CMD_FOR_USER_ACTUAL_LIVE_QUOTA_VALUE_IN_HUMAN_FRIENDLY_FORMAT=`bytesToHuman $RM_CMD_FOR_USER_ACTUAL_LIVE_QUOTA_VALUE`
IS_QUOTA_LEFT_IN_NEGATIVE=`echo $RM_CMD_FOR_USER_ACTUAL_LIVE_QUOTA_VALUE_IN_HUMAN_FRIENDLY_FORMAT | grep -i -c "-"`
RM_CMD_FOR_USER_ACTUAL_LIVE_QUOTA_NEGATIVE_VALUE_IN_BYTES_WITHOUT_DASH=`echo $RM_CMD_FOR_USER_ACTUAL_LIVE_QUOTA_VALUE_IN_HUMAN_FRIENDLY_FORMAT |sed 's/[\._-]//g'`
RM_CMD_FOR_USER_ACTUAL_LIVE_QUOTA_NEGATIVE_VALUE_IN_HUMAN_FRIENDLY_VALUE=`bytesToHuman $RM_CMD_FOR_USER_ACTUAL_LIVE_QUOTA_NEGATIVE_VALUE_IN_BYTES_WITHOUT_DASH`

if [ "$IS_QUOTA_LEFT_IN_NEGATIVE" -eq 1 ]; then
echo "Total Quote Left = - $RM_CMD_FOR_USER_ACTUAL_LIVE_QUOTA_NEGATIVE_VALUE_IN_HUMAN_FRIENDLY_VALUE"
else
echo "Total Quote Left = $RM_CMD_FOR_USER_ACTUAL_LIVE_QUOTA_VALUE_IN_HUMAN_FRIENDLY_FORMAT"
fi
fi

echo "Next Service = $NEXT_SRV_ENABLED_OR_NOT_FRIENDLY_VALUE"

# Check for NULL DATA in download section of user
if [ "$TOT_DOWN_UP_CURR_MONTH_IN_BYTES" == "NULL" ]
then
echo "Total Data Used in $ALPHAMONTHYEAR = n/a"
else
TOT_DOWN_UP_CURR_MONTH_IN_BYTES_HUMAN_FIRNEDLY_VALUE=`bytesToHuman $TOT_DOWN_UP_CURR_MONTH_IN_BYTES`
echo -e "Total Data Used in $ALPHAMONTHYEAR = $TOT_DOWN_UP_CURR_MONTH_IN_BYTES_HUMAN_FIRNEDLY_VALUE"
fi

# check last log off date and print data accordingly
if [ "$LOGOFFDATE" == "NULL" ]; then
echo -e "LAST LOGOUT = n/a"
else
echo -e "LAST LOGOUT = $LOGOFFDATE"
fi

# Check if user is ONLINE or not
ONLINE=`$CMD "use $DB; SELECT framedipaddress FROM radacct WHERE acctstoptime IS NULL AND username = '$USR';"`
#if [ "$ONLINE" -eq 0 ]; then
if [ -z "$ONLINE" ]; then
echo -e "STATUS = Offline"
else
echo -e "STATUS = Online / IP: $ONLINE"
fi
echo "$FOOTER"

2- playSMS SECTION

Now we have to add COMMAND in playSMS which will actually receive the sms and will act accordingly if found the keyword info

userinfo-playsms-=command


 3- TEST PHASE

You can test by executing the script or send sms , as per your choice.

Both methods results are as follows …

 

by CLI


./userinfo.sh XYZUSER

Account Registed to = TEST USER
PACKAGE = 10GB with 2Mbps + After quota 1mbps (30 days)
Service Price = 500.00000 PKR
Date Expiration = 2018-07-10 00:00:00
Service Quota Allowed: 10.00 GiB
Total Quote Left = 435.42 MiB
Next Service Allowed = Yes
Total Data Used in July-2018 = 2.92 GiB
LAST LOGOUT = 2018-07-08 06:44:35
STATUS = Online / IP: 10.0.0.10

 


Regard’s
SYED JAHANZAIB

 


Viewing all articles
Browse latest Browse all 408

Trending Articles