function cidlookup_get_config($engine) { // TODO: discuss if mysql and http lookup should be implemented in dialplan or in an external AGI global $ext; // is this the best way to pass this? global $asterisk_conf; global $version; switch ($engine) { case "asterisk": $sources = cidlookup_list(true); if (is_array($sources)) { foreach ($sources as $item) { // Search for number in the cache, if found lookupcidnum and return if ($item['cidlookup_id'] != 0) { if ($item['cache'] == 1 && $item['sourcetype'] != 'internal') { $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_gotoif('$[${DB_EXISTS(cidname/${CALLERID(num)})} = 1]', 'cidlookup,cidlookup_return,1')); } } switch ($item['sourcetype']) { case "internal": $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_lookupcidname('')); break; case "enum": $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_setvar('CALLERID(name)', '${TXTCIDNAME(${CALLERID(num)})}')); break; case "http": if (!empty($item['http_username']) && !empty($item['http_password'])) { $auth = sprintf('%s:%s@', $item['http_username'], urlencode($item['http_password'])); } else { $auth = ''; } if (!empty($item['http_port'])) { $host = sprintf('%s:%d', $item['http_host'], $item['http_port']); } else { $host = $item['http_host'] . ':80'; } if (substr($item['http_path'], 0, 1) == '/') { $path = substr($item['http_path'], 1); } else { $path = $item['http_path']; } $query = str_replace('[NUMBER]', '${CALLERID(num)}', $item['http_query']); $url = sprintf('http://%s%s/%s?%s', $auth, $host, $path, $query); $curl = sprintf('${CURL(%s)}', $url); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_setvar('CALLERID(name)', $curl)); break; case "mysql": if (version_compare($version, "1.6", "lt")) { //Escaping MySQL query - thanks to http://www.asteriskgui.com/index.php?get=utilities-mysqlscape $replacements = array('\\' => '\\\\', '"' => '\\"', '\'' => '\\\'', ' ' => '\\ ', ',' => '\\,', '(' => '\\(', ')' => '\\)', '.' => '\\.', '|' => '\\|'); $query = str_replace(array_keys($replacements), array_values($replacements), $item['mysql_query']); } else { $query = $item['mysql_query']; } $query = str_replace('[NUMBER]', '${CALLERID(num)}', $query); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_mysql_connect('connid', $item['mysql_host'], $item['mysql_username'], $item['mysql_password'], $item['mysql_dbname'])); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_mysql_query('resultid', 'connid', $query)); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_mysql_fetch('fetchid', 'resultid', 'CALLERID(name)')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_mysql_clear('resultid')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_mysql_disconnect('connid')); break; // TODO: implement SugarCRM lookup, look at code snippet at http://nerdvittles.com/index.php?p=82 // TODO: implement SugarCRM lookup, look at code snippet at http://nerdvittles.com/index.php?p=82 case "sugarcrm": $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_noop('SugarCRM not yet implemented')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_return('')); break; } // Put numbers in the cache if ($item['cidlookup_id'] != 0) { if ($item['cache'] == 1 && $item['sourcetype'] != 'internal') { $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_db_put('cidname', '${CALLERID(num)}', '${CALLERID(name)}')); } $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_return('')); } } $ext->add('cidlookup', 'cidlookup_return', '', new ext_lookupcidname('')); $ext->add('cidlookup', 'cidlookup_return', '', new ext_return('')); } break; } }
<?php // License for all code of this FreePBX module can be found in the license file inside the module directory // Copyright 2015 Sangoma Technologies. $cidsources = cidlookup_list(); $srow = ""; foreach ($cidsources as $source) { $srow .= '<tr>'; $srow .= '<td>' . $source['description'] . '</td>'; $srow .= '<td>' . $source['sourcetype']; if ($source['sourcetype'] == 'opencnam' && !empty($source['opencnam_account_sid']) && !empty($source['opencnam_auth_token'])) { $srow .= " Pro "; } $srow .= '</td>'; $srow .= '<td><a href="?display=cidlookup&view=form&itemid=' . $source['cidlookup_id'] . '&extdisplay=' . $source['cidlookup_id'] . '"><i class="fa fa-edit"></i></a>'; $srow .= ' '; $srow .= '<a href="config.php?display=cidlookup&view=form&itemid=' . $source['cidlookup_id'] . '&action=delete"><i class="fa fa-trash"></i></a>'; $srow .= '</td></tr>'; } ?> <div id="toolbar-all"> <a href="config.php?display=cidlookup&view=form" class="btn btn-default" ><i class="fa fa-plus"></i> <?php echo _("Add CIDLookup Source"); ?> </a> </div> <table id="cidlookupgrid" data-cache="false" data-toolbar="#toolbar-all" data-toggle="table"
function cidlookup_get_config($engine) { // TODO: discuss if mysql and http lookup should be implemented in dialplan or in an external AGI global $ext; // is this the best way to pass this? global $asterisk_conf; global $version; switch ($engine) { case "asterisk": $sources = cidlookup_list(true); if (is_array($sources)) { $ast_ge_162 = version_compare($version, '1.6.2', 'ge'); foreach ($sources as $item) { // Search for number in the cache, if found lookupcidnum and return if ($item['cidlookup_id'] != 0) { if ($item['cache'] == 1 && $item['sourcetype'] != 'internal' && $item['sourcetype'] != 'opencnam') { $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_gotoif('$[${DB_EXISTS(cidname/${CALLERID(num)})} = 1]', 'cidlookup,cidlookup_return,1')); } } switch ($item['sourcetype']) { case "internal": $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_lookupcidname('')); break; case "enum": $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_setvar('CALLERID(name)', '${TXTCIDNAME(${CALLERID(num)})}')); break; case "opencnam": if (!empty($item['opencnam_account_sid']) && !empty($item['opencnam_auth_token'])) { $auth = sprintf('%s:%s@', urlencode($item['opencnam_account_sid']), urlencode($item['opencnam_auth_token'])); } else { $auth = ''; } $url = sprintf('https://%sapi.opencnam.com/v2/phone/${CALLERID(num)}?format=pbx&ref=freepbx', $auth); $curl = sprintf('${CURL(%s)}', $url); // Hardcode for now, add configuration option in future. Setting 7 =~ 1 ring // if ($ast_ge_162) { $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_set('CURLOPT(httptimeout)', '7')); } $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_set('CALLERID(name)', $curl)); // If the user is using the OpenCNAM Hobbyist Tier, // track hourly query stats--this allows us to alert // the user if they go past their free usage limits // and need to upgrade their OpenCNAM plan. if (!$auth) { $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_set('current_hour', '${STRFTIME(,,%Y-%m-%d %H)}')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_set('last_query_hour', '${DB(cidlookup/opencnam_last_query_hour)}')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_set('total_hourly_queries', '${DB(cidlookup/opencnam_total_hourly_queries)}')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_execif('$["${last_query_hour}" != "${current_hour}"]', 'Set', 'DB(cidlookup/opencnam_total_hourly_queries)=0')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_execif('$["${total_hourly_queries}" = ""]', 'Set', 'DB(cidlookup/opencnam_total_hourly_queries)=0')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_set('DB(cidlookup/opencnam_total_hourly_queries)', '${MATH(${DB(cidlookup/opencnam_total_hourly_queries)}+1,i)}')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_execif('$[${DB(cidlookup/opencnam_total_hourly_queries)} >= 60]', 'System', '${ASTVARLIBDIR}/bin/opencnam-alert.php')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_set('DB(cidlookup/opencnam_last_query_hour)', '${current_hour}')); } break; case "https": case "http": if (!empty($item['http_username']) && !empty($item['http_password'])) { $auth = sprintf('%s:%s@', $item['http_username'], urlencode($item['http_password'])); } else { $auth = ''; } if (!empty($item['http_port'])) { $host = sprintf('%s:%d', $item['http_host'], $item['http_port']); } else { $host = $item['http_host'] . ':80'; } if (substr($item['http_path'], 0, 1) == '/') { $path = substr($item['http_path'], 1); } else { $path = $item['http_path']; } $tempst = array('[NUMBER]', '[NAME]', '[LANGUAGE]'); $values = array('${CALLERID(num)}', '${CALLERID(name)}', '${CHANNEL(language)}'); $query = str_replace($tempst, $values, $item['http_query']); $url = sprintf('%s://%s%s/%s?%s', $item['sourcetype'], $auth, $host, $path, $query); $curl = sprintf('${CURL(%s)}', $url); // Hardcode for now, add configuration option in future. Setting 7 =~ 1 ring // if ($ast_ge_162) { $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_set('CURLOPT(httptimeout)', '7')); } $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_set('CALLERID(name)', $curl)); break; case "mysql": if (version_compare($version, "1.6", "lt")) { //Escaping MySQL query - thanks to http://www.asteriskgui.com/index.php?get=utilities-mysqlscape $replacements = array('\\' => '\\\\', '"' => '\\"', '\'' => '\\\'', ' ' => '\\ ', ',' => '\\,', '(' => '\\(', ')' => '\\)', '.' => '\\.', '|' => '\\|'); $query = str_replace(array_keys($replacements), array_values($replacements), $item['mysql_query']); } else { $query = $item['mysql_query']; } $query = str_replace('[NUMBER]', '${CALLERID(num)}', $query); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_mysql_connect('connid', $item['mysql_host'], $item['mysql_username'], $item['mysql_password'], $item['mysql_dbname'], $item['mysql_charset'])); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_mysql_query('resultid', 'connid', $query)); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_mysql_fetch('fetchid', 'resultid', 'CALLERID(name)')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_mysql_clear('resultid')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_mysql_disconnect('connid')); break; // TODO: implement SugarCRM lookup, look at code snippet at http://nerdvittles.com/index.php?p=82 // TODO: implement SugarCRM lookup, look at code snippet at http://nerdvittles.com/index.php?p=82 case "sugarcrm": $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_noop('SugarCRM not yet implemented')); $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_return('')); break; } // Put numbers in the cache if ($item['cidlookup_id'] != 0) { if ($item['cache'] == 1 && $item['sourcetype'] != 'internal') { $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_db_put('cidname', '${CALLERID(num)}', '${CALLERID(name)}')); } $ext->add('cidlookup', 'cidlookup_' . $item['cidlookup_id'], '', new ext_return('')); } } $ext->add('cidlookup', 'cidlookup_return', '', new ext_lookupcidname('')); $ext->add('cidlookup', 'cidlookup_return', '', new ext_return('')); } break; } }