local http = require("socket.http") local ltn12 = require("ltn12") local json = require("dkjson") function Split(value, delimiter) local result = {}; for match in string.gmatch(value, "[^" .. delimiter .. "%s]+") do table.insert(result, match); end return result; end -- This functions Covert date (Thu, 13 Oct 2022 13:37:54 GMT) into 20221013_133754 function convertDatetime(dateValue) p = "%a+, (%d+) (%a+) (%d+) (%d+):(%d+):(%d+) GMT" day, month, year, hour, min, sec = dateValue:match(p) MON = { Jan = 1, Feb = 2, Mar = 3, Apr = 4, May = 5, Jun = 6, Jul = 7, Aug = 8, Sep = 9, Oct = 10, Nov = 11, Dec = 12 } month = MON[month] offset = os.time() - os.time(os.date("!*t")) converted_Datetime = os.time({ day = day, month = month, year = year, hour = hour, min = min, sec = sec }) return os.date("%Y%m%d_%H%M%S", converted_Datetime) end session:ready() local uuid = session:getVariable("uuid") local api = freeswitch.API() -- Get sata from sip_i_from variable session:consoleLog("info", "========**************** WELCOME *************=======") session:consoleLog("info", "**************** SESSION IS READY *************") session:consoleLog("info", " Fetching Sip Invite From the CUCM ") local sipFrom = session:getVariable("sip_i_from") session:consoleLog("info", " SIP-FROM " .. sipFrom ) local sipFrom = sipFrom:match("<(.-)>") or sipFrom local sipFrom_split = Split(sipFrom, ";") session:consoleLog("info", " Fetching Leg Type ") local leg_type = sipFrom_split[2] session:consoleLog("info", " Fetching Refci ") local refci = Split(sipFrom_split[3], "=")[2] local farendrefci = Split(sipFrom_split[7], "=")[2] session:consoleLog("info", " Farend refci: " .. farendrefci .. "\n") session:consoleLog("info", " Fetching Date from the Operating System ") local startDateTime = os.date("%Y-%m-%d %H:%M:%S") session:consoleLog("info", " Fetching Date from the Sip Invite ") local datefromsip = convertDatetime(session:getVariable("sip_i_Date")) session:consoleLog("info", " Fetching Call_ID ") local call_id = session:getVariable("sip_call_id") session:consoleLog("info", " Fetching CISCO GUID ") local ciscoGuid = session:getVariable("sip_i_Cisco_Guid") local calledNumber = Split(sipFrom_split[6], "=")[2] local callingNumber = Split(sipFrom_split[10], "=")[2] if tonumber(farendrefci) > tonumber(refci) then -- Swap the values local temp = calledNumber calledNumber = callingNumber callingNumber = temp end session:consoleLog("info", " CALLED NUMBER = " .. calledNumber .. "\n") session:consoleLog("info", "CALLING NUMBER: " .. callingNumber .. "\n") local startTime = os.date("%Y-%m-%dT%H:%M:%S") session:consoleLog("info", "CALL START TIME: " .. startTime .. "\n") session:consoleLog("info", " =============== CALLING THE RULE API ================== ") local url = "http://192.168.1.187:8080/vrs/recording-rules/evaluate" .. "?calledNumber=" .. calledNumber .. "&callingNumber=" .. callingNumber .. "&startTime=" .. startTime session:consoleLog("info", "Final API URL: " .. url .. "\n") local response_body = {} local res, code, headers, status = http.request{ url = url, method = "GET", sink = ltn12.sink.table(response_body) } local response_json = table.concat(response_body) session:consoleLog("info", " RULE API RESPONSE: " .. response_json .. "\n") session:consoleLog("info", "date = " .. datefromsip) local sipEventType = "SIP_INVITE" local recording_dir = '/var/vrs/recordings/cucmRecording/streams/' local filename = uuid .. ".wav" session:consoleLog("info", "========**************** IN THE LUA FILE *************=======") local recording_path = "/var/vrs/recordings/cucmRecording/streams/".. uuid ..".wav" --session:consoleLog("info", "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-starting the recording via execut=====================================") local record = "false" local api = freeswitch.API() local response = json.decode(response_json) if response and response["recordAudio"] then if response["recordAudio"] == true then -- Start recording --local uuid = session:get_uuid() record = "true" api:execute("uuid_record", uuid .. " start " .. recording_path) session:consoleLog("info", "RECORDING STARTED : " .. recording_path .. "\n") session:consoleLog("info", " SETTING RECORD TO TRUE: " .. record .."\n") else session:consoleLog("info", " RECORDING IS DISABLED BY RULE. \n") session:consoleLog("info", " SETTING RECORD TO FALSE: " .. record .."\n") end end --api:execute("uuid_record", uuid .. " start " .. recording_path) session:consoleLog("info","About to enter the loop") while session:ready() do session:sleep(1000) end session:consoleLog("info","Loop ended") local endDateTime = os.date("%Y-%m-%d %H:%M:%S") session:consoleLog("info", "Start time " .. startDateTime .. " End Time : " .. endDateTime) session:consoleLog("info", "********* PREPARING PAYLOAD FOR MIXER *************") session:consoleLog("info", "==========================================================================================") session:consoleLog("info", "SIPFROM") session:consoleLog("info", sipFrom) session:consoleLog("info", "Start Date Time") session:consoleLog("info", startDateTime) session:consoleLog("info", "End Date Time") session:consoleLog("info", endDateTime) session:consoleLog("info", "Call ID") session:consoleLog("info", call_id) session:consoleLog("info", "CISCO Guild") session:consoleLog("info", ciscoGuid) session:consoleLog("info", "Sip Event Type") session:consoleLog("info", sipEventType) session:consoleLog("info", "Recording DIR") session:consoleLog("info", recording_dir) session:consoleLog("info", "Recording file") session:consoleLog("info", recording_filename) session:consoleLog("info", "Mixed Rec Dir") session:consoleLog("info", "/var/vrs/recordings/cucmRecording/sessions/") session:consoleLog("info", "RECORD") session:consoleLog("info", record) session:consoleLog("info", "==========================================================================================") local http = require("socket.http") local ltn12 = require "ltn12" local json = require "dkjson" local req_body = { sipFrom = sipFrom, startdatetime = startDateTime, enddatetime = endDateTime, callId = call_id, ciscoGuid = ciscoGuid, sipEventType = "SIP_INVITE", recording_dir = recording_dir, recording_filename = filename, mixedRecordingDir = "/var/vrs/recordings/cucmRecording/sessions/", record = record } local req_body1 = json.encode(req_body) freeswitch.consoleLog("info", req_body1) local response_body = {} local res, code, headers, status = http.request { method = "POST", url = "http://192.168.1.187:9900/mixer/sip-data", source = ltn12.source.string(req_body1), headers = { ["content-type"] = "application/json", ["Content-Length"] = string.len(req_body1) }, sink = ltn12.sink.table(response_body) } freeswitch.consoleLog("INFO", "Data inserted into database") print("IIIIIIIIIIIIIIIIII") response = table.concat(response_body) print(response) --print(res, code, headers[2], status) if (leg_type == 'x-farend123') then local res, code, headers, status = http.request { method = "POST", url = "http://192.168.1.187:9900/mixapi", source = ltn12.source.string(req_body1), headers = { ["content-type"] = "application/json", ["Content-Length"] = string.len(req_body1) }, sink = ltn12.sink.table(response_body) } end freeswitch.consoleLog("INFO", "End of Everything")