-- -- call_block-FS -- Version: MPL 1.1 -- -- The contents of this file are subject to the Mozilla Public License Version -- 1.1 (the "License"); you may not use this file except in compliance with -- the License. You may obtain a copy of the License at -- http://www.mozilla.org/MPL/ -- -- Software distributed under the License is distributed on an "AS IS" basis, -- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -- for the specific language governing rights and limitations under the -- License. -- -- The Original Code is call_block-FS -- -- The Initial Developer of the Original Code is -- Gerrit Visser -- Copyright (C) 2011 -- the Initial Developer. All Rights Reserved. -- -- Contributor(s): -- Gerrit Visser -- Mark J Crane --[[ This module provides for Blacklisting of phone numbers. Essentially these are numbers that you do not want to hear from again! To call this script and pass it arguments: 1. On the command line, e.g. in a FS incoming dialplan: This method causes the script to get its manadatory arguments directly from the Session ]] --[[ Change Log: 15 Jun, 2011: initial release > FusionPBX 15 Jun, 2011: Added loglevel parameter and logger function to simplify control of debug output 4 May, 2012: tested with FusionPBX V3 4 May, 2012: added per_tenant capability (domain based) 12 Jun, 2013: update the database connection, change table name from v_callblock to v_call_block 14 Jun, 2013: Change Voicemail option to use Transfer, avoids mod_voicemail dependency 27 Sep, 2013: Changed the name of the fields to conform with the table name ]] -- Command line parameters local params = { cmd = "", cid_num = string.gsub(tostring(session:getVariable("caller_id_number")), "+", ""), cid_name = session:getVariable("caller_id_name"), domain = session:getVariable("domain"), userid = "", -- session:getVariable("id") loglevel = "W" -- Warning, Debug, Info } -- local storage local sql = nil --define the logger function local function logger(level, log, data) -- output data to console 'log' if debug level is on if string.find(params["loglevel"], level) then freeswitch.consoleLog(log, "[Call Block]: " .. data .. "\n") end end --connect to the database dofile(scripts_dir.."/resources/functions/database_handle.lua"); dbh = database_handle('system'); --log if not connect if dbh:connected() == false then logger("W", "NOTICE", "db was not connected") end -- We have a single command letter -- Use session variables logger("D", "NOTICE", "params default from session, count " .. string.format("%d", #argv[1]) .. " \n") params["cmd"] = argv[1] -- ensure that we have a fresh status on exit session:setVariable("call_block", "") --send to the log logger("D", "NOTICE", "params are: " .. string.format("'%s', '%s', '%s', '%s'", params["cid_num"], params["cid_name"], params["userid"], params["domain"])); --Check if number is in call_block list -- If it is, then increment the counter and block the call if (params["cmd"] == "C") then sql = "SELECT * FROM v_call_block as c " sql = sql .. "JOIN v_domains as d ON c.domain_uuid=d.domain_uuid " sql = sql .. "WHERE c.call_block_number = '" .. params["cid_num"] .. "' AND d.domain_name = '" .. params["domain"] .."'" status = dbh:query(sql, function(rows) found_cid_num = rows["call_block_number"] found_uuid = rows["call_block_uuid"] found_enabled = rows["call_block_enabled"] found_action = rows["call_block_action"] found_count = rows["call_block_count"] end) -- dbh:affected_rows() doesn't do anything if using core:db so this is the workaround: if found_cid_num then -- caller id exists if (found_enabled == "true") then details = {} k = 0 for v in string.gmatch(found_action, "[%w%.]+") do details[k] = v --logger("W", "INFO", "Details: " .. details[k]) k = k + 1 end dbh:query("UPDATE v_call_block SET call_block_count = " .. found_count + 1 .. " WHERE call_block_uuid = '" .. found_uuid .. "'") session:setVariable("call_block", "block") logger("W", "NOTICE", "number " .. params["cid_num"] .. " blocked with " .. found_count .. " previous hits, domain: " .. params["domain"]) if (found_action == "Reject") then session:hangup("CALL_REJECTED") end if (found_action == "Busy") then session:hangup("USER_BUSY") end if (details[0] =="Voicemail") then session:setAutoHangup(false) session:execute("transfer", "*99" .. details[2] .. " XML " .. details[1]) end end end end