Changelog:
- Removed bug , when user have not used any data or account is new, script returns NULL errors
- Added Online / Offline Status
1- TASK
The task was to provide user a method to inquire his/her account information via sending SMS in specific format to the Billing system.
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 :)
Script is as follows FYR. Hope it may help someone :$
cat userinfo.sh
#!/bin/bash # Script to check Radius Manager Status , Expiry Date, Service Plan, Data Used # Syed Jahanzaib # aacable @ hotmail.com # https://aacable.wordpress.com # Modified on 3rd June, 2015 # MYSQL USER NAME AND PASSOWRD Variables SQLUSER="root" SQLPASS="zaib1234" CURRENCY="PKR" # Check User Validation, if not found exit with error , else continue echo USRVALID=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT * FROM radius.rm_users WHERE rm_users.username = '$1';"` if [ "$USRVALID" == "" ]; then echo -e "USER NOT FOUND !" else ###################### # ACCOUNT EXPIRY CHECK ###################### TODAY=$(date +"%Y-%m-%d") TODAYDIGIT=`echo $TODAY | sed -e 's/-//g'` MONTH=$(date +"-%m") CMONTH=`echo $MONTH | sed -e 's/-//g'` MONTHYEAR=$(date +"%B-%Y") ALPHAMONTHYEAR=`echo $MONTHYEAR #| sed -e 's/-//g'` SRVEXPIRYFULL=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT expiration FROM radius.rm_users WHERE username = '$1';" |awk 'FNR == 2'` SRVEXPIRY=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT expiration FROM radius.rm_users WHERE username = '$1';" |awk 'FNR == 2' | sed 's/00:.*//' | sed -e 's/-//g'` LOGOFFDATE=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT lastlogoff FROM radius.rm_users WHERE username = '$1';" |awk 'FNR == 2 {print $1,$2}'` if [ $SRVEXPIRY -eq $TODAYDIGIT ] then echo "Account have been EXPIRED TODAY! Last LOGOUT date was $LOGOFFDATE" elif [ $SRVEXPIRY -lt $TODAYDIGIT ] then echo "ACCOUNT WAS EXPIRED on $SRVEXPIRYFULL ! Last LOGOUT date was $LOGOFFDATE" else echo -e "Radius Manager User Information Sample:" echo "Account STATUS= OK!" ############### # Check Account Expiry Date EXPIRY=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT expiration FROM radius.rm_users WHERE username = '$1';" |awk 'FNR == 2'` #SRVLIMIT=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT comblimit FROM radius.rm_users WHERE username = '$1';" |awk 'FNR == 2'` #Get ACcounting Data for the Current Month Only DOWNDATA=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT SUM(allbytesdl) - COALESCE(SUM(specbytesdl), 0), SUM(allbytesul) - COALESCE(SUM(specbytesul), 0), SUM(alltime) - COALESCE(SUM(spectime), 0) FROM ( SELECT acctoutputoctets AS allbytesdl, SUM(dlbytes) AS specbytesdl, acctinputoctets AS allbytesul, SUM(ulbytes) AS specbytesul, radacct.acctsessiontime AS alltime, SUM(rm_radacct.acctsessiontime) AS spectime FROM radacct LEFT JOIN rm_radacct ON rm_radacct.radacctid = radacct.radacctid WHERE radacct.username LIKE '$1' AND radacct.acctstarttime > '2015-$CMONTH%' AND radacct.framedipaddress LIKE '%' AND radacct.callingstationid LIKE '%' GROUP BY radacct.radacctid ) AS tmp;" |awk 'FNR == 2 {print $1}'` # Check for NULL DATA in download section of user if [ "$DOWNDATA" == "NULL" ] then # echo "NOT USED NO DOWN DATA FOUND" #Print Service ID for SPECIFIC_USER via CLI SRVID=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT srvid FROM radius.rm_users WHERE rm_users.username = '$1';" |awk 'FNR == 2 {print $1}'` #Print SPECIFIC Service PRICE value via CLI SRVPRICE=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT unitprice FROM radius.rm_services WHERE rm_services.srvid = $SRVID;" |awk 'FNR == 2 {print $1}' | cut -f1 -d"."` # Print Package Name of current service via CLI PKGNAME=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT srvname FROM radius.rm_services WHERE rm_services.srvid = '$SRVID';" |awk 'FNR == 2'` # Acount Registration FIRST n LAST NAME USERFLNAME=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT firstname,lastname FROM radius.rm_users WHERE rm_users.username = '$1';" |awk 'FNR == 2 {print $1,$2,$3}';` # Now spit out (echo) all the data gathered by above junk commands echo -e "Account Registed to = $USERFLNAME" echo -e "User Package = $PKGNAME" echo -e "Service Price = $SRVPRICE $CURRENCY" echo -e "Total Data Used in $ALPHAMONTHYEAR = Not Used" echo -e "Expiration Date: $EXPIRY" echo -e "Last Logout date was $LOGOFFDATE" else UPDATA=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT SUM(allbytesdl) - COALESCE(SUM(specbytesdl), 0), SUM(allbytesul) - COALESCE(SUM(specbytesul), 0), SUM(alltime) - COALESCE(SUM(spectime), 0) FROM ( SELECT acctoutputoctets AS allbytesdl, SUM(dlbytes) AS specbytesdl, acctinputoctets AS allbytesul, SUM(ulbytes) AS specbytesul, radacct.acctsessiontime AS alltime, SUM(rm_radacct.acctsessiontime) AS spectime FROM radacct LEFT JOIN rm_radacct ON rm_radacct.radacctid = radacct.radacctid WHERE radacct.username LIKE '$1' AND radacct.acctstarttime > '2015-$CMONTH%' AND radacct.framedipaddress LIKE '%' AND radacct.callingstationid LIKE '%' GROUP BY radacct.radacctid ) AS tmp;" |awk 'FNR == 2 {print $2}'` TOTCOMBINED=`echo "($DOWNDATA+$UPDATA)/(1024)/(1024)" |bc` #Print Service ID for SPECIFIC_USER via CLI SRVID=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT srvid FROM radius.rm_users WHERE rm_users.username = '$1';" |awk 'FNR == 2 {print $1}'` #Print SPECIFIC Service PRICE value via CLI SRVPRICE=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT unitprice FROM radius.rm_services WHERE rm_services.srvid = $SRVID;" |awk 'FNR == 2 {print $1}' | cut -f1 -d"."` # Print Package Name of current service via CLI PKGNAME=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT srvname FROM radius.rm_services WHERE rm_services.srvid = '$SRVID';" |awk 'FNR == 2'` # Acount Registration FIRST n LAST NAME USERFLNAME=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT firstname,lastname FROM radius.rm_users WHERE rm_users.username = '$1';" |awk 'FNR == 2 {print $1,$2}';` # Now spit out (echo) all the data gathered by above junk commands echo -e "Account Registed to = $USERFLNAME" echo -e "User Package = $PKGNAME" echo -e "Service Price = $SRVPRICE $CURRENCY" echo -e "Total Data Used in $ALPHAMONTHYEAR = $TOTCOMBINED MB" echo -e "Expiration Date: $EXPIRY" echo -e "Last Logout date was $LOGOFFDATE" # Check User Current Online Status ONLINE=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT framedipaddress FROM radacct WHERE AcctStopTime IS NULL AND UserName = '$1';"` if [ "$ONLINE" == "" ]; then echo -e "Current Online Status = OFFLINE" else echo -e "Current Online Status = ONLINE" fi fi fi fi
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
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
by SMS
Another Version of GETUSERINFO with VLAN connected users numbers
Another Version of GETUSERINFO with more details like current ONLINE STATUS, and QUOTA assigned, used and left counters.
As showed in the below image …
root@rm:/var/lib/playsms/sms_command/1# cat userinfo.sh #!/bin/bash # Script to check Radius Manager Status , Expiry Date, Service Plan, Data Used # Syed Jahanzaib # aacable @ hotmail.com # https://aacable.wordpress.com # Modified on 9th June, 2015 # MYSQL USER NAME AND PASSWORD Variables SQLUSER="root" SQLPASS="sqlapssword" SQLHOST="localhost" SQLPORT="3306" CURRENCY="PKR" # Check User Validation, if not found exit with error , else continue echo USRVALID=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT * FROM radius.rm_users WHERE rm_users.username = '$1';"` if [ "$USRVALID" == "" ]; then echo -e "USER NOT FOUND !" else ###################### # ACCOUNT EXPIRY CHECK ###################### TODAY=$(date +"%Y-%m-%d") TODAYDIGIT=`echo $TODAY | sed -e 's/-//g'` MONTH=$(date +"-%m") CMONTH=`echo $MONTH | sed -e 's/-//g'` MONTHYEAR=$(date +"%B-%Y") ALPHAMONTHYEAR=`echo $MONTHYEAR #| sed -e 's/-//g'` SRVEXPIRYFULL=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT expiration FROM radius.rm_users WHERE username = '$1';" |awk 'FNR == 2'` SRVEXPIRY=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT expiration FROM radius.rm_users WHERE username = '$1';" |awk 'FNR == 2' | sed 's/00:.*//' | sed -e 's/-//g'` LOGOFFDATE=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT lastlogoff FROM radius.rm_users WHERE username = '$1';" |awk 'FNR == 2 {print $1,$2}'` if [ $SRVEXPIRY -eq $TODAYDIGIT ] then echo "Account have been EXPIRED TODAY! Last LOGOUT date was $LOGOFFDATE" elif [ $SRVEXPIRY -lt $TODAYDIGIT ] then echo "ACCOUNT WAS EXPIRED on $SRVEXPIRYFULL ! Last LOGOUT date was $LOGOFFDATE" else echo -e "Radius Manager User Information Sample:" echo "Account STATUS= OK!" ############### # Check Account Expiry Date EXPIRY=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT expiration FROM radius.rm_users WHERE username = '$1';" |awk 'FNR == 2'` #SRVLIMIT=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT comblimit FROM radius.rm_users WHERE username = '$1';" |awk 'FNR == 2'` #Get ACcounting Data for the Current Month Only DOWNDATA=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT SUM(allbytesdl) - COALESCE(SUM(specbytesdl), 0), SUM(allbytesul) - COALESCE(SUM(specbytesul), 0), SUM(alltime) - COALESCE(SUM(spectime), 0) FROM ( SELECT acctoutputoctets AS allbytesdl, SUM(dlbytes) AS specbytesdl, acctinputoctets AS allbytesul, SUM(ulbytes) AS specbytesul, radacct.acctsessiontime AS alltime, SUM(rm_radacct.acctsessiontime) AS spectime FROM radacct LEFT JOIN rm_radacct ON rm_radacct.radacctid = radacct.radacctid WHERE radacct.username LIKE '$1' AND radacct.acctstarttime > '2015-$CMONTH%' AND radacct.framedipaddress LIKE '%' AND radacct.callingstationid LIKE '%' GROUP BY radacct.radacctid ) AS tmp;" |awk 'FNR == 2 {print $1}'` # Check for NULL DATA in download section of user if [ "$DOWNDATA" == "NULL" ] then # echo "NOT USED NO DOWN DATA FOUND" #UPDATA=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT SUM(allbytesdl) - COALESCE(SUM(specbytesdl), 0), SUM(allbytesul) - COALESCE(SUM(specbytesul), 0), SUM(alltime) - COALESCE(SUM(spectime), 0$ CURRENCY="PKR" #Print Service ID for SPECIFIC_USER via CLI SRVID=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT srvid FROM radius.rm_users WHERE rm_users.username = '$1';" |awk 'FNR == 2 {print $1}'` #Print SPECIFIC Service PRICE value via CLI SRVPRICE=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT unitprice FROM radius.rm_services WHERE rm_services.srvid = $SRVID;" |awk 'FNR == 2 {print $1}' | cut -f1 -d"."` # Print Package Name of current service via CLI PKGNAME=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT srvname FROM radius.rm_services WHERE rm_services.srvid = '$SRVID';" |awk 'FNR == 2'` # Acount Registration FIRST n LAST NAME USERFLNAME=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT firstname,lastname FROM radius.rm_users WHERE rm_users.username = '$1';" |awk 'FNR == 2 {print $1,$2,$3}';` # Now spit out (echo) all the data gathered by above junk commands echo -e "Account Registed to = $USERFLNAME" echo -e "User Package = $PKGNAME" echo -e "Service Price = $SRVPRICE $CURRENCY" echo -e "Total Data Used in $ALPHAMONTHYEAR = Not Used" echo -e "Expiration Date: $EXPIRY" echo -e "Last Logout date was $LOGOFFDATE" #echo -e "Service Quota Limit = $SRVLIMITMB MB" #echo -e "Downloaded Data = $DOWNDATAUSED - MB" #echo -e "Uploaded Data = $UPDATAUP - MB" else UPDATA=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT SUM(allbytesdl) - COALESCE(SUM(specbytesdl), 0), SUM(allbytesul) - COALESCE(SUM(specbytesul), 0), SUM(alltime) - COALESCE(SUM(spectime), 0) FROM ( SELECT acctoutputoctets AS allbytesdl, SUM(dlbytes) AS specbytesdl, acctinputoctets AS allbytesul, SUM(ulbytes) AS specbytesul, radacct.acctsessiontime AS alltime, SUM(rm_radacct.acctsessiontime) AS spectime FROM radacct LEFT JOIN rm_radacct ON rm_radacct.radacctid = radacct.radacctid WHERE radacct.username LIKE '$1' AND radacct.acctstarttime > '2015-$CMONTH%' AND radacct.framedipaddress LIKE '%' AND radacct.callingstationid LIKE '%' GROUP BY radacct.radacctid ) AS tmp;" |awk 'FNR == 2 {print $2}'` TOTCOMBINED=`echo "($DOWNDATA+$UPDATA)/(1024)/(1024)" |bc` TOTCOMBINED2=`echo "($TOTCOMBINED)/(1024)" |bc` #SRVLIMITMB=`echo "($SRVLIMIT)/(1024)/(1024)" |bc` #DOWNDATAUSED=`echo "($DOWNDATA)/(1024)/(1024)" |bc` #UPDATAUP=`echo "($UPDATA)/(1024)/(1024)" |bc` #Print Service ID for SPECIFIC_USER via CLI SRVID=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT srvid FROM radius.rm_users WHERE rm_users.username = '$1';" |awk 'FNR == 2 {print $1}'` #Print SPECIFIC Service PRICE value via CLI SRVPRICE=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT unitprice FROM radius.rm_services WHERE rm_services.srvid = $SRVID;" |awk 'FNR == 2 {print $1}' | cut -f1 -d"."` # Print Package Name of current service via CLI PKGNAME=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT srvname FROM radius.rm_services WHERE rm_services.srvid = '$SRVID';" |awk 'FNR == 2'` # Print Service Download Limit QUOTA - TOTAL QUOTA=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT trafficunitcomb FROM radius.rm_services WHERE rm_services.srvid = '$SRVID';" |awk 'FNR == 2'` # Acount Registration FIRST n LAST NAME USERFLNAME=`mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST --port=$SQLPORT -e "use radius; SELECT firstname,lastname FROM radius.rm_users WHERE rm_users.username = '$1';" |awk 'FNR == 2 {print $1,$2}';` # Now spit out (echo) all the data gathered by above junk commands echo -e "Account Registed to = $USERFLNAME" echo -e "User Package = $PKGNAME" echo -e "Service Price = $SRVPRICE $CURRENCY" echo -e "Total Quota Allowed = $QUOTA MB" echo -e "Total Data Used in $ALPHAMONTHYEAR = $TOTCOMBINED MB" QUOTALEFT=`echo "( $QUOTA)-($TOTCOMBINED)" |bc` echo -e "Total Quota LEFT = $QUOTALEFT MB" echo -e "Expiration Date: $EXPIRY" echo -e "Last Logout date was $LOGOFFDATE" # Check User Current Online Status ONLINE=`mysql -u$SQLUSER -p$SQLPASS -e "use radius; SELECT framedipaddress FROM radacct WHERE AcctStopTime IS NULL AND UserName = '$1';"` if [ "$ONLINE" == "" ]; then echo -e "Current Online Status = OFFLINE" else echo -e "Current Online Status = ONLINE" fi fi fi fi
Regard’s
SYED JAHANZAIB
Filed under: Linux Related, Radius Manager
