_settings_err('Failed to assign nobody account to phone ' . $mac); } } # get host for user # $host = @gs_prov_get_host_for_user_id($db, $user_id); if (!$host) { _settings_err('Failed to find host.'); } $pbx = $host; # $host might be changed if SBC configured # who is logged in at that phone? # $user = @gs_prov_get_user_info($db, $user_id); if (!is_array($user)) { _settings_err('DB error.'); } # store the current firmware version in the database: # @$db->execute('UPDATE `phones` SET ' . '`firmware_cur`=\'' . $db->escape($fw_vers_nrml) . '\' ' . 'WHERE `mac_addr`=\'' . $db->escape($mac) . '\''); # firmware update # $firmware_prefix = ''; if (!gs_get_conf('GS_GRANDSTREAM_PROV_FW_UPDATE')) { gs_log(GS_LOG_DEBUG, 'Grandstream firmware update not enabled'); } elseif (in_array($phone_model, array('bt200', 'bt201', 'gxp280', 'gxp1200', 'gxp2000', 'gxp2010', 'gxp2020', 'gxv3000', 'gxv3005'), true)) { # get phone_id $phone_id = (int) $db->executeGetOne('SELECT `id` FROM `phones` WHERE `mac_addr`=\'' . $db->escape($mac) . '\''); # do we have to update to a default version? # $fw_was_upgraded_manually = (int) $db->executeGetOne('SELECT `fw_manual_update` ' . 'FROM `phones` ' . 'WHERE `id`=' . $phone_id);
if (!is_array($users[$i])) { _settings_err('DB error.'); } $user['id'] = $users[$i]['id']; $users[$i]['name'] = $user['name']; $users[$i]['mailbox'] = $user['mailbox']; $users[$i]['secret'] = $user['secret']; $users[$i]['nobody_index'] = $user['nobody_index']; $users[$i]['user'] = $user['user']; $users[$i]['firstname'] = $user['firstname']; $users[$i]['lastname'] = $user['lastname']; # get host for user # $users[$i]['host'] = @gs_prov_get_host_for_user_id($db, $user['id']); if (!$users[$i]['host']) { _settings_err('Failed to find host.'); } $pbx = $users[$i]['host']; # $host might be changed if SBC configured # store the current firmware version in the database: # @$db->execute('UPDATE `phones` SET ' . '`firmware_cur`=\'' . $db->escape($fw_vers_nrml) . '\' ' . 'WHERE `mac_addr`=\'' . $db->escape($mac_addr) . '\''); # store the user's current IP address in the database: # @$db->execute('UPDATE `users` SET ' . '`current_ip`=\'' . $db->escape($requester['phone_ip']) . '\' ' . 'WHERE `id`=\'' . (int) $user['id'] . '\''); # get SIP proxy to be set as the phone's outbound proxy # $sip_proxy_and_sbc = gs_prov_get_wan_outbound_proxy($db, $requester['phone_ip'], $user['id']); if ($sip_proxy_and_sbc['sip_server_from_wan'] != '') { $users[$i]['host'] = $sip_proxy_and_sbc['sip_server_from_wan']; }
$user_id = @gs_prov_assign_default_nobody($db, $mac, null); if ($user_id < 1) { _settings_err("Failed to assign nobody account to phone " . $mac); } } //--- get host for user $host = @gs_prov_get_host_for_user_id($db, $user_id); if (!$host) { _settings_err("Failed to find host."); } $pbx = $host; //--- $host might be changed if SBC configured //--- who is logged in at that phone? $user = @gs_prov_get_user_info($db, $user_id); if (!is_array($user)) { _settings_err("DB error."); } //--- get polycom'ized language string from user lang pref $user_polycomlang = @_polycom_astlang_to_polycomlang($user['language']); //--- store the current phonetype and firmware version in the database: @$db->execute("UPDATE `phones` SET " . "`firmware_cur`='" . $db->escape($fw_vers) . "', " . "`type`='" . $db->escape($phone_type) . "' " . "WHERE `mac_addr`='" . $db->escape($mac) . "'"); //--- store the user's current IP address in the database: if (!@gs_prov_update_user_ip($db, $user_id, $requester["phone_ip"])) { gs_log(GS_LOG_WARNING, "Failed to store current IP addr of user ID " . $user_id); } //--- get callwaiting state $callwaiting = (int) $db->executeGetOne("SELECT `active` FROM `callwaiting` WHERE `user_id`=" . $user_id); //--- get SIP proxy to be set as the phone's outbound proxy $sip_proxy_and_sbc = gs_prov_get_wan_outbound_proxy($db, $requester["phone_ip"], $user_id); if ($sip_proxy_and_sbc["sip_server_from_wan"] != "") { $host = $sip_proxy_and_sbc["sip_server_from_wan"];
if (hexDec(subStr($mac, 0, 2)) % 2 == 1) { gs_log(GS_LOG_NOTICE, "Snom M9 provisioning: Invalid MAC address \"{$mac}\" (multicast address)"); # don't explain this to the users _settings_err('No! See log for details.'); } if ($mac === '000000000000') { gs_log(GS_LOG_NOTICE, "Snom M9 provisioning: Invalid MAC address \"{$mac}\" (huh?)"); # don't explain this to the users _settings_err('No! See log for details.'); } # make sure the phone is a Snom-M9: # if (subStr($mac, 0, 6) !== '000413' && subStr($mac, 0, 6) !== '00087B') { gs_log(GS_LOG_NOTICE, "Snom M9 provisioning: MAC address \"{$mac}\" is not a Snom M9 phone"); # don't explain this to the users _settings_err('No! See log for details.'); } $ua = trim(@$_SERVER['HTTP_USER_AGENT']); if (preg_match('/^Mozilla\\/\\d\\.\\d\\s*\\(compatible;\\s*/i', $ua, $m)) { $ua = rTrim(subStr($ua, strLen($m[0])), ' )'); } gs_log(GS_LOG_DEBUG, "Snom model {$ua} found."); if (preg_match('/snom m9/i', $ua, $m)) { $phone_model = 'm9'; } else { $phone_model = 'unknown'; } $phone_type = 'snom-' . $phone_model; # e.g. "snom-m9" # to be used when auto-adding the phone gs_log(GS_LOG_DEBUG, "Snom phone \"{$mac}\" asks for settings (UA: ...\"{$ua}\") - model: {$phone_model}");
if (subStr($mac, 0, 6) !== '000413') { gs_log(GS_LOG_NOTICE, "Snom M9 provisioning: MAC address \"{$mac}\" is not a Snom M9 phone"); # don't explain this to the users _settings_err('No! See log for details.'); } $ua = trim(@$_SERVER['HTTP_USER_AGENT']); if (!preg_match('/^Mozilla/i', $ua) || !preg_match('/snom\\sm9/i', $ua)) { gs_log(GS_LOG_WARNING, "Phone with MAC \"{$mac}\" (Snom) has invalid User-Agent (\"" . $ua . "\")"); # don't explain this to the users //_settings_err( 'No! See log for details.' ); } # connect to DB $db = gs_db_slave_connect(); if (!$db) { gs_log(GS_LOG_WARNING, "Snom M9 phone asks for phonebook - Could not connect to DB"); _settings_err('Could not connect to DB.'); } ob_start(); echo '<?', 'xml version="1.0" encoding="utf-8"?', '>', "\n"; echo '<tbook complete="true">', "\n"; $pb_entrys = 1; for ($i = 1; $i <= gs_get_conf('GS_SNOM_PROV_M9_ACCOUNTS'); ++$i) { # create virtual mac address $mac_addr = $i > 1 ? $mac . '-' . $i : $mac; # get user_id $user_id = (int) $db->executeGetOne('SELECT `u`.`id` FROM `users` `u` JOIN `phones` `p` ON (`p`.`user_id`=`u`.`id`) WHERE `u`.`current_ip`=\'' . $db->escape($requester['phone_ip']) . '\' AND