Newer
Older
ubFramework / Provisioning / docroot / getData_Working.php
@Christopher W. Olsen Christopher W. Olsen on 10 Dec 2017 35 KB iSinc
<?php

/*
 * *****************************************************************************************
 * Copyright (c) 2013, 2014 Christopher W. Olsen <cwolsen@ubixtechnologies.com>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this list of
 * conditions, the following disclaimer and the list of authors. Redistributions in binary
 * form must reproduce the above copyright notice, this list of conditions, the following
 * disclaimer and the list of authors in the documentation and/or other materials provided
 * with the distribution. Neither the name of the uBix Cube Project nor the names of its
 * contributors may be used to endorse or promote products derived from this software
 * without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $Id: getData.php 1715 2014-07-16 04:58:08Z reddawg $
 *
 * ***************************************************************************************
 */

/* Main include info */
ini_set ( 'include_path', $_SERVER ['DOCUMENT_ROOT'] . "/include/" );
include ("config.php");

/* Initialize Our Device Global */
$cDev = new VoIP_Device ();

/* Main defines */
$data ['tpl']->define ( array (
    "conf_file" => "error.tpl" 
) );

if (strstr ( $_SERVER ['REMOTE_ADDR'], "207.38.206.18" )) {
  exit ();
}

/* Here we need to determine what type of device is querying the provisioning system */
$devAgent = explode ( ' ', $_SERVER ['HTTP_USER_AGENT'] );

switch ($devAgent [0]) {
  case 'FileTransport' :
    $eC = count ( $devAgent );
    
    /* By Default Will Consider It A Cold Boot Unless We Determine Non Boot Loader Requested Information */
    $cDev->bootStatus = 'Cold';
    $cDev->bootStatus = 'Probe';
    
    /* The Second Part Of The Agent Is Uniform Through All Polycom UC Firmware */
    preg_match ( "/((?:[a-zA-Z][a-zA-Z]+))-((?:[a-zA-Z][a-zA-Z]+))_(\d+)-((?:[a-zA-Z][a-zA-Z]+))\/((?:[\w\.\-]+)+)/", $devAgent [1], $dI );
    
    $cDev->deviceFamily = $dI [1];
    $cDev->model = $dI [2];
    $cDev->modelNo = $dI [3];
    $cDev->userAgent = $dI [4];
    $cDev->firmware = $dI [5];
    
    shell_exec ( "cat <<EOF >> /tmp/Polycom.log\ncDev: " . json_encode ( $dI ) . "\nEOF\n" );
    
    for($i = 2; $i <= $eC; $i ++) {
      if ($devAgent [$i] [0] == '(') {
        /* Get Devices Serial Number AKA MAC */
        preg_match ( "/\(((?:[a-zA-Z][a-zA-Z]+)):((?:[\w\.\-]+)+)\)/", $devAgent [$i], $dI );
        shell_exec ( "cat <<EOF >> /tmp/Polycom.log\ncHave SERIAL: " . json_encode ( $dI ) . "\nEOF\n" );
      }
      else {
        /* Get Loader Type Boot/App */
        preg_match ( "/((?:[a-zA-Z][a-zA-Z]+))\/((?:[a-zA-Z][a-zA-Z]+))/", $devAgent [$i], $dI );
        shell_exec ( "cat <<EOF >> /tmp/Polycom.log\ncHave Application: " . json_encode ( $dI ) . "\nEOF\n" );
        if ($dI [1] == 'Application')
          $cDev->bootStatus = 'Warm';
        
        $cDev->appType = $dI [2];
      }
    }
    break;
  default :
    system ( "echo 'Unsupported Device' >> /tmp/AGENT.log" );
    exit ();
}

system ( "echo 'cDev[" . $data ['mode'] . "]: " . json_encode ( $cDev ) . "' >> /tmp/AGENT.log" );

/* Break The Request File Into Parts */
$cFile = explode ( "-", $data ['file'] );

switch ($data ['type']) {
  case 'xml' :
    switch ($cFile [1]) {
      case 'directory' :
        Polycom_Device::loadDirectory ( $data, $cFile [0] );
        break;
      default :
        script404 ();
    }
    break;
  case 'ug' :
    if (($cDev->appType == "Application" && $cDev->firmware [0] == '3') || ($cDev->appType == "Updater" && $cDev->firmware [0] == '4')) {
      system ( "echo 'UG: " . $data ['mode'] . "-" . $cDev->firmware . "' >> /tmp/AGENT.log" );
      if ($cFile [0] == "000000000000") {
        print ("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<APPLICATION APP_FILE_PATH=\"firmware/Polycom/4.0.9/sip.ld\" CONFIG_FILES=\"\" MISC_FILES=\"\" LOG_FILE_DIRECTORY=\"http://prov.spherepbx.com/logs/\" OVERRIDES_DIRECTORY=\"\" CONTACTS_DIRECTORY=\"\" LICENSE_DIRECTORY=\"\" />") ;
        exit ();
      }
      else
        script404 ();
    }
    else {
      print ("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<APPLICATION APP_FILE_PATH=\"firmware/Polycom/4.0.9/sip.ld\" CONFIG_FILES=\"http://prov.spherepbx.com/ns/completed.cfg, http://prov.spherepbx.com/" . $cFile [0] . ".cfg\" MISC_FILES=\"\" LOG_FILE_DIRECTORY=\"http://prov.spherepbx.com/logs/\" OVERRIDES_DIRECTORY=\"\" CONTACTS_DIRECTORY=\"\" LICENSE_DIRECTORY=\"\" />") ;
      exit ();
    }
    break;
  case 'dg' :
    if (($cDev->appType == "Application" && $cDev->firmware [0] == '4') || ($cDev->appType == "Updater" && $cDev->firmware [0] == '5')) {
      system ( "echo 'DG: " . $data ['mode'] . "-" . $cDev->firmware . "' >> /tmp/AGENT.log" );
      if ($cFile [0] == "000000000000") {
        print ("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<APPLICATION APP_FILE_PATH=\"sip.ld\" CONFIG_FILES=\"\" MISC_FILES=\"\" LOG_FILE_DIRECTORY=\"http://prov.spherepbx.com/logs/\" OVERRIDES_DIRECTORY=\"\" CONTACTS_DIRECTORY=\"\" LICENSE_DIRECTORY=\"\" />") ;
        exit ();
      }
      else
        script404 ();
    }
    else {
      print ("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<APPLICATION APP_FILE_PATH=\"sip.ld\" CONFIG_FILES=\"http://prov.spherepbx.com/ns/completed.cfg, http://prov.spherepbx.com/" . $cFile [0] . ".cfg\" MISC_FILES=\"\" LOG_FILE_DIRECTORY=\"http://prov.spherepbx.com/logs/\" OVERRIDES_DIRECTORY=\"\" CONTACTS_DIRECTORY=\"\" LICENSE_DIRECTORY=\"\" />") ;
      exit ();
    }
    break;
  case 'cfg' :
    Polycom_Device::loadConfig ( $data, $cFile );
    break;
  case 'cfg-old' :
    $cFile = explode ( "-", $data ['file'] );
    
    if (count ( $cFile ) == 1)
      $cFile [1] = "mac";
    
    if ($cFile [0] == "00000000000000")
      script404 ();
    
    $query = "UPDATE voip_devices SET last_config = " . time () . ", last_ip = '" . $_SERVER ['REMOTE_ADDR'] . "' WHERE mac = '" . $cFile [0] . "'";
    $data ['ubix_db']->query ( $query );
    $query = "SELECT * FROM voip_devices vd LEFT JOIN voip_device_types vdt ON vd.vdtid=vdt.vdtid WHERE mac = '" . $cFile [0] . "'";
    $result = $data ['ubix_db']->query ( $query );
    if ($result === false)
      script404 ();
    else
      $qData = $result->fetch_assoc ();
      
      // MrOlsen (2015-12-10) NOTICE: Temp
    $frm = $qData ['firmware'];
    
    $result->free ();
    
    /* Make Sure We're Running The Expected Firmware Before Continuing */
    if (strstr ( $qData ['firmware'], "_4" )) {
      if (($cDev->appType == 'Updater' && $cDev->firmware [0] != '5') || ($cDev->appType == "Application" && $cDev->firmware [0] != '4') || ($cDev->appType == "Unknown" && $cDev->firmware [0] == '3')) {
        system ( "echo 'Test for UG: " . $qData ['firmware'] . "' >> /tmp/AGENT.log" );
        print ("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<APPLICATION APP_FILE_PATH=\"http://prov.spherepbx.com/firmware/Polycom/sip_333/sip.ld\" CONFIG_FILES=\"http://prov.spherepbx.com/ns/upgrade.cfg\" MISC_FILES=\"\" LOG_FILE_DIRECTORY=\"http://prov.spherepbx.com/logs/\" OVERRIDES_DIRECTORY=\"\" CONTACTS_DIRECTORY=\"\" LICENSE_DIRECTORY=\"\" />") ;
        exit ();
      }
    }
    else if (strstr ( $qData ['firmware'], "_3" )) {
      if (($cDev->appType == 'Updater' && $cDev->firmware [0] != '4') || ($cDev->appType == "Application" && $cDev->firmware [0] != '3')) {
        system ( "echo 'Test for DG: " . $qData ['firmware'] . "' >> /tmp/AGENT.log" );
        print ("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<APPLICATION APP_FILE_PATH=\"http://prov.spherepbx.com/firmware/Polycom/4.0.9/sip.ld\" CONFIG_FILES=\"http://prov.spherepbx.com/ns/downgrade.cfg\" MISC_FILES=\"\" LOG_FILE_DIRECTORY=\"http://prov.spherepbx.com/logs/\" OVERRIDES_DIRECTORY=\"\" CONTACTS_DIRECTORY=\"\" LICENSE_DIRECTORY=\"\" />") ;
        exit ();
      }
    }
    
    switch ($cFile [1]) {
      case 'reg' :
      case 'sip' :
        system ( "echo 'MrOlsen - Start' >> /tmp/AGENT.log" );
        $data ['tpl']->define ( array (
            "conf_file" => $qData ['firmware'] . "/000000000000-" . $cFile [1] . ".tpl" 
        ) );
        
        $query = "SELECT extensions, server_primary, server_port_primary, transport_primary, server_backup, server_port_backup, transport_backup, dialplan, dialplan_timeout FROM voip_devices WHERE mac = '" . $cFile [0] . "'";
        
        system ( 'echo "TPL: ' . $qData ['firmware'] . ', Query:[' . $data ['ubix_db']->real_escape_string ( $query ) . '"] >> /tmp/AGENT.log' );
        
        $result = $data ['ubix_db']->query ( $query );
        $qData = $result->fetch_assoc ();
        $result->free ();
        
        $extensions = json_decode ( $qData ['extensions'], true );
        
        $data ['tpl']->assign ( "SERVER_PRIMARY", $qData ['server_primary'] );
        $data ['tpl']->assign ( "TRANSPORT_PRIMARY", $qData ['transport_primary'] );
        $data ['tpl']->assign ( "SERVER_BACKUP", $qData ['server_backup'] );
        $data ['tpl']->assign ( "TRANSPORT_BACKUP", $qData ['transport_backup'] );
        
        $ext = "";
        $i = 1;
        $reg = "";
        $mwi = "";
        
        foreach ( $extensions as $key => $val ) {
          // system('echo "Kev: ' . $key . ', Val: ' . $val . '" >> /tmp/AGENT.log');
          if ($val ['extension'] != "") {
            
            // MrOlsen Temp 04-30-2015
            if (isset ( $val ['primary_server'] ))
              $val ['server_primary'] = $val ['primary_server'];
            if (isset ( $val ['primary_port'] ))
              $val ['server_port_primary'] = $val ['primary_port'];
            if (isset ( $val ['primary_transport'] ))
              $val ['transport_primary'] = $val ['primary_transport'];
            
            if (isset ( $val ['backup_server'] ))
              $val ['server_backup'] = $val ['backup_server'];
            if (isset ( $val ['backup_port'] ))
              $val ['server_port_backup'] = $val ['backup_port'];
            if (isset ( $val ['backup_transport'] ))
              $val ['transport_backup'] = $val ['backup_transport'];
            
            if ($val ['extension'] != '9999') {
              if (strstr ( $_SERVER ['REMOTE_ADDR'], "10.0.0" ))
                $query = "UPDATE sippeers SET permit = '69.126.26.10', deny = '0.0.0.0' WHERE name = '" . $val ['extension'] . "'";
              else {
                $query = "UPDATE sippeers SET permit = '" . $_SERVER ['REMOTE_ADDR'] . "', deny = '0.0.0.0' WHERE name = '" . $val ['extension'] . "'";
              }
              $data ['voip_db']->query ( $query );
            }
            
            $query = "SELECT name, secret, accountcode, callerid FROM sippeers WHERE name = '" . $val ['extension'] . "'";
            $result = $data ['voip_db']->query ( $query );
            
            if ($val ['line_keys'] == "") {
              $LKS = "";
              $CPK = "";
            }
            else if ($val ['line_keys'] == 1) {
              $LKS = 1;
              $CPK = 4;
            }
            else {
              $LKS = $val ['line_keys'];
              $CPK = 1;
            }
            
            if ($result->num_rows > 0) {
              $eRow = $result->fetch_row ();
              
              $ext = substr ( $eRow [0], strlen ( $eRow [2] ) );
              $user = $eRow [0];
              $pass = $eRow [1];
              
              $callerid = explode ( "<", $eRow [3] );
              
              $dN = $callerid [0];
              
              if ($val ['label'] != '')
                $label = $val ['label'];
              else
                $label = strtoupper ( $eRow [2] ) . " " . substr ( $callerid [1], 0, - 1 );
              
              $dN = $label;
              
              $result->free ();
            }
            else if (isset ( $val ['secret'] )) {
              $ext = $val ['extension'];
              $user = $val ['extension'];
              $pass = $val ['secret'];
              
              if ($val ['label'] != '') {
                $label = $val ['label'];
                $dN = $val ['label'];
              }
              else {
                $label = $val ['extension'];
                $dN = $val ['extension'];
              }
            }
            else {
              $ext = "9999";
              $user = "9999";
              $dN = "9999";
              $label = "9999";
              $pass = "1981";
            }
            
            if (! isset ( $val ['server_port_primary'] ))
              $val ['server_port_primary'] = "5060";
            
            if (! isset ( $val ['server_port_backup'] ))
              $val ['server_port_backup'] = "5060";
            
            if (! isset ( $val ['primary_transport'] ))
              $val ['primary_transport'] = "UDPonly";
            
            if (! isset ( $val ['backup_transport'] ))
              $val ['backup_transport'] = "UDPOnly";
            
            $rG = "1";
          }
          else {
            $ext = "";
            $user = "";
            $dN = "";
            $label = "";
            $pass = "";
            $val ['server_port_primary'] = "5060";
            $val ['server_port_backup'] = "5060";
            $val ['transport_primary'] = "UDPOnly";
            $val ['transport_backup'] = "UDPOnly";
            $val ['server_primary'] = "";
            $val ['server_backup'] = "";
            $rG = "";
          }
          
          if ($user != "" && $pass != "") {
            
            // MrOlsen(2015-12-20) NOTE: Forced Backup
            // $val['server_backup'] = "Failover.SpherePBX.com";
            
            // if (isset ( $polyMatrix [$dI [3]] [$dI [4]] ['reg'] )) {
            system ( "echo 'FW: " . $frm . "' >> /tmp/AGENT.log" );
            if ($frm == 'sip_409') {
              
              $rI = new Polycom_Firmware_409 ();
              // system ( "echo 'PWND: " . $cDev->model . " - " . $cDev->modelNo . "<" . json_encode($rI->regInfo) . ">' >> /tmp/AGENT.log" );
              
              // $rI->regInfo = $polyMatrix [$dI [3]] [$dI [4]] ['reg'];
              $rI->regInfo ['displayName'] = $dN;
              $rI->regInfo ['address'] = $user;
              $rI->regInfo ['label'] = $label;
              $rI->regInfo ['auth.userId'] = $user;
              $rI->regInfo ['auth.password'] = $pass;
              $rI->regInfo ['lineKeys'] = $LKS;
              $rI->regInfo ['callsPerLineKey'] = $CPK;
              $rI->regInfo ['server.1.address'] = $val ['server_primary'];
              $rI->regInfo ['server.1.port'] = $val ['server_port_primary'];
              $rI->regInfo ['server.1.transport'] = $val ['primary_transport'];
              $rI->regInfo ['server.2.address'] = $val ['server_backup'];
              $rI->regInfo ['server.1.register'] = $rG;
              $rI->regInfo ['server.2.register'] = "1"; // MrOlsen (2015-12-10) TEMP $rG;
              $rI->regInfo ['server.2.port'] = $val ['server_port_backup'];
              $rI->regInfo ['server.2.transport'] = $val ['backup_transport'];
              
              foreach ( $rI->regInfo as $rKey => $rVal ) {
                $reg .= 'reg.' . $i . '.' . $rKey . '="' . $rVal . '" ';
              }
              system ( "echo 'PWND.2: " . $cDev->model . " - " . $cDev->modelNo . "<" . json_encode ( $rI->regInfo ) . ">" . $reg . "' >> /tmp/AGENT.log" );
            }
            else {
              $reg .= "reg.$i.displayName=\"" . $dN . "\" reg.$i.address=\"" . $user . "\" reg.$i.label=\"" . $label . "\" reg.$i.auth.userId=\"" . $user . "\" reg.$i.auth.password=\"" . $pass . "\" reg.$i.lineKeys=\"$LKS\" reg.$i.callsPerLineKey=\"$CPK\" reg.$i.server.1.address=\"" . $val ['server_primary'] . "\" reg.$i.server.1.port=\"" . $val ['server_port_primary'] . "\" reg.$i.server.1.transport=\"" . $val ['transport_primary'] . "\" reg.$i.server.2.address=\"" . $val ['server_backup'] . "\" reg.$i.server.1.register=\"" . $rG . "\" reg.$i.server.1.expires=\"60\" reg.$i.server.2.register=\"$rG\" reg.$i.server.2.expires=\"60\" reg.$i.server.2.port=\"" . $val ['server_port_backup'] . "\" reg.$i.server.2.transport=\"" . $val ['transport_backup'] . "\" reg.$i.auth.domain=\"\" reg.$i.outboundProxy.address=\"\" ";
            }
            
            // $mwi .= "msg.mwi.$i.callBackMode=\"contact\" msg.mwi.$i.subscribe=\"" . $val ['server_primary'] . "\" msg.mwi.$i.callBack=\"*98\" ";
            $mwi .= "msg.mwi.$i.callBackMode=\"contact\" msg.mwi.$i.subscribe=\"" . $user . "\" msg.mwi.$i.callBack=\"*98\" ";
          }
          
          $i ++;
        }
        
        $data ['tpl']->assign ( "DIALPLAN", $qData ['dialplan'] );
        $data ['tpl']->assign ( "DIALPLAN_TIMEOUT", $qData ['dialplan_timeout'] );
        
        $data ['tpl']->assign ( "REG", $reg );
        
        system ( "echo 'Reg: " . $data ['ubix_db']->real_escape_string ( $reg ) . "' >> /tmp/AGENT.log" );
        $data ['tpl']->assign ( "MWI", $mwi );
        system ( "echo 'MWI: " . $data ['ubix_db']->real_escape_string ( $mwi ) . "' >> /tmp/AGENT.log" );
        system ( "echo 'MrOlsen - END' >> /tmp/AGENT.log" );
        
        break;
      case 'mac' :
        $data ['tpl']->define ( array (
            "conf_file" => "000000000000.tpl" 
        ) );
        system ( "echo 'PMM: " . $cDev->model . " - " . $cDev->modelNo . "' >> /tmp/AGENT.log" );
        
        // if (isset ( $polyMatrix [$cDev->model] [$cDev->model_no] ['firmware'] ) && strstr ( $qData ['firmware'], "_4" )) {
        if (strstr ( $qData ['firmware'], "_409" )) {
          // $data ['tpl']->assign ( "FIRMWARE", "http://prov.spherepbx.com/firmware/" . $qData ['manufacturer'] . "/" . $polyMatrix [$dI [3]] [$dI [4]] ['firmware'] . "/sip.ld" );
          $data ['tpl']->assign ( "FIRMWARE", "http://prov.spherepbx.com/firmware/" . $qData ['manufacturer'] . "/4.0.9/sip.ld" );
          // $defDir = "http://prov.spherepbx.com/defaults/" . $qData ['manufacturer'] . "/" . $polyMatrix [$cDev ['model']] [$cDev ['model_no']] ['firmware'];
          $defDir = "http://prov.spherepbx.com/defaults/" . $qData ['manufacturer'] . "/4.0.9";
          $data ['tpl']->assign ( "CONFIG_FILES", $defDir . "/applications.cfg, " . $defDir . "/device.cfg, " . $defDir . "/features.cfg, " . $defDir . "/sip.cfg, /" . $cFile [0] . "-reg.cfg" );
        }
        else {
          $data ['tpl']->assign ( "FIRMWARE", "http://prov.spherepbx.com/firmware/" . $qData ['manufacturer'] . "/" . $qData ['firmware'] . "/sip.ld" );
          $data ['tpl']->assign ( "CONFIG_FILES", "http://prov.spherepbx.com/defaults/" . $qData ['firmware'] . "/device-ubix.cfg, " . $cFile [0] . "-sip.cfg, http://prov.spherepbx.com/defaults/" . $qData ['firmware'] . "/features-ubix.cfg" );
        }
        $data ['tpl']->assign ( "MISC_FILES", "" ); // "/firmware" . $qData['manufacturer'] . "/" . $qData['firmware'] . "/misc/");
        break;
      case 'web' :
        $query = "SELECT cfg FROM voip_device_configs WHERE mac = '" . $cFile [0] . "' AND cfg_type = 'web'";
        $res = $data ['ubix_db']->query ( $query );
        $wD = $res->fetch_row ();
        if ($res->num_rows == 0) {
          script404 ();
          
          print ("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<WEB_CONFIG>\n<OVERRIDES />\n</WEB_CONFIG>\n") ;
        }
        else {
          $res->free ();
          print ($wD [0]) ;
        }
        exit ();
        break;
      case 'phone' :
        $query = "SELECT cfg FROM voip_device_configs WHERE mac = '" . $cFile [0] . "' AND cfg_type = 'phone'";
        $res = $data ['ubix_db']->query ( $query );
        $wD = $res->fetch_row ();
        if ($res->num_rows == 0) {
          print ("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<PHONE_CONFIG>\n<OVERRIDES />\n</PHONE_CONFIG>\n") ;
          script404 ();
        }
        else {
          $res->free ();
          print ($wD [0]) ;
        }
        exit ();
        break;
      case 'license' :
        $query = "SELECT cfg FROM voip_device_configs WHERE mac = '" . $cFile [0] . "' AND cfg_type = 'license'";
        $res = $data ['ubix_db']->query ( $query );
        $wD = $res->fetch_row ();
        if ($res->num_rows == 0)
          script404 ();
        else {
          $res->free ();
          print ($wD [0]) ;
        }
        exit ();
        break;
      default :
        script404 ();
        break;
    } /*
       * END * *
       * switch
       */
    
    break;
  default :
    script404 ();
} /* END switch */

exit ();

/*
 * Parse
 * and * print
 */
$data ['tpl']->parse ( "CONF_FILE", array (
    "conf_file" 
) );
$data ['tpl']->FastPrint ( "CONF_FILE" );

system ( 'echo "TPL: ' . $qData ['firmware'] . ', Query:[' . $data ['ubix_db']->real_escape_string ( $data ['tpl']->fetch ( "CONF_FILE" ) ) . '"] >> /tmp/CONF_FILE.log' );

function script404($message = '404 Not Found') {

  header ( $_SERVER ["SERVER_PROTOCOL"] . " " . $message );
  exit ( 0 );

}

class Polycom_Device {

  /* Firmware Matchup */
  public $polyMatrix = Array ();

  /*
   * 'SPIP' => Array (
   * // '301' => '3.1.8',
   * // '320' => '3.3.5',
   * // '330' => '3.3.5',
   * '321' => Array (
   * 'boot_major' => Array (
   * '4' => '3.3.3',
   * '5' => '4.0.9'
   * )
   * ),
   * '331' => Array (
   * 'firmware' => '4.0.9',
   * 'reg' => '',
   * 'boot_major' => Array (
   * '4' => '3.3.3',
   * '5' => '4.0.9'
   * )
   * ),
   * '335' => Array (
   * 'firmware' => '4.0.9',
   * 'reg' => '',
   * 'boot_major' => Array (
   * '4' => '3.3.3',
   * '5' => '4.0.9'
   * )
   * ),
   * // '430' => '3.2.7',
   * '450' => Array (
   * 'firmware' => '4.0.9',
   * 'reg' => '',
   * 'boot_major' => Array (
   * '4' => '3.3.3',
   * '5' => '4.0.9'
   * )
   * ),
   * // '501' => '3.1.8',
   * '550' => Array (
   * 'firmware' => '4.0.9',
   * 'reg' => '',
   * 'boot_major' => Array (
   * '4' => '3.3.3',
   * '5' => '4.0.9'
   * )
   * ),
   * '560' => Array (
   * 'firmware' => '4.0.9',
   * 'reg' => '',
   * 'boot_major' => Array (
   * '4' => '3.3.3',
   * '5' => '4.0.9'
   * )
   * ),
   * // '600' => '3.1.8',
   * // '601' => '3.1.8',
   * '650' => Array (
   * 'firmware' => '4.0.9',
   * 'reg' => '',
   * 'boot_major' => Array (
   * '4' => '3.3.3',
   * '5' => '4.0.9'
   * )
   * ),
   * '670' => Array (
   * 'firmware' => '4.0.9',
   * 'reg' => '',
   * 'boot_major' => Array (
   * '4' => '3.3.3',
   * '5' => '4.0.9'
   * )
   * )
   * )
   * );
   */
  
  /*
   * public function __construct() {
   *
   * foreach ( Polycom_Firmware_409::devices as $key => $val ) {
   * foreach ( $val as $sval )
   * $this->polyMatrix [$key] = $sval;
   * }
   *
   * }
   */
  public function loadDirectory($data, $mac) {

    $query = "SELECT directory FROM voip_device_directories WHERE mac = '" . $mac . "'";
    $query = "SELECT cfg FROM voip_device_configs WHERE mac = '" . $mac . "' AND cfg_type = 'directory'";
    $res = $data ['ubix_db']->query ( $query );
    if ($res->num_rows == 0)
      script404 ();
    else {
      $dD = $res->fetch_row ();
      print $dD [0];
      $res->free ();
    }
  
  }

  public function loadConfig(&$data, $cFile) {

    global $dev;
    
    /* See What Type Of File We're Looking For */
    if (count ( $cFile ) == 1) {
      $cFile [1] = "mac";
    }
    
    /* Return 404 If Request Probe */
    if ($cFile [0] == "00000000000000") {
      script404 ();
    }
    
    $query = "UPDATE voip_devices SET last_config = " . time () . ", last_ip = '" . $_SERVER ['REMOTE_ADDR'] . "' WHERE mac = '" . $cFile [0] . "'";
    $data ['ubix_db']->query ( $query );
    
    $query = "SELECT * FROM voip_devices vd LEFT JOIN voip_device_types vdt ON vd.vdtid=vdt.vdtid WHERE mac = '" . $cFile [0] . "'";
    $result = $data ['ubix_db']->query ( $query );
    
    if ($result === false) {
      script404 ();
    }
    else {
      $qData = $result->fetch_assoc ();
    }
    
    $result->free ();
    
    switch ($cFile [1]) {
      case 'reg' :
      case 'sip' :
        $data ['tpl']->define ( array (
            "conf_file" => $qData ['firmware'] . "/000000000000-" . $cFile [1] . ".tpl" 
        ) );
        
        $query = "SELECT extensions, server_primary, server_port_primary, transport_primary, server_backup, server_port_backup, transport_backup, dialplan, dialplan_timeout FROM voip_devices WHERE mac = '" . $cFile [0] . "'";
        
        $result = $data ['ubix_db']->query ( $query );
        $qData = $result->fetch_assoc ();
        $result->free ();
        
        // This is temporary, we're not going to provide these in the future
        $data ['tpl']->assign ( "SERVER_PRIMARY", "SPBX-VS001.SpherePBX.com" );
        $data ['tpl']->assign ( "TRANSPORT_PRIMARY", "UDPOnly" );
        $data ['tpl']->assign ( "SERVER_BACKUP", "SPBX-VS002.SpherePBX.com" );
        $data ['tpl']->assign ( "TRANSPORT_BACKUP", "UDPOnly" );
        
        // Populate Extensions
        $extensions = json_decode ( $qData ['extensions'], true );
        
        $ext = "";
        $i = 1;
        $reg = "";
        $mwi = "";
        
        foreach ( $extensions as $key => $val ) {
          if ($val ['extension'] != "") {
            
            if (! isset ( $val ['server_host_primary'] ))
              $val ['server_host_primary'] = "SPBX-VS001.SpherePBX.com";
            
            if (! isset ( $val ['server_port_primary'] ))
              $val ['server_port_primary'] = "5060";
            
            if (isset ( $val ['server_transport_primary'] ))
              $val ['server_transport_primary'] = "UDPOnly";
            
            if (! isset ( $val ['server_host_backup'] ))
              $val ['server_host_backup'] = "SPBX-VS002.SpherePBX.com";
            
            if (! isset ( $val ['server_port_backup'] ))
              $val ['server_port_backup'] = "5060";
            
            if (isset ( $val ['server_transport_backup'] ))
              $val ['server_transport_backup'] = "UDPOnly";
            
            if ($val ['extension'] != '9999') {
              if (strstr ( $_SERVER ['REMOTE_ADDR'], "10.0.0" ))
                $query = "UPDATE sippeers SET permit = '69.126.26.10', deny = '0.0.0.0' WHERE name = '" . $val ['extension'] . "'";
              else {
                $query = "UPDATE sippeers SET permit = '" . $_SERVER ['REMOTE_ADDR'] . "', deny = '0.0.0.0' WHERE name = '" . $val ['extension'] . "'";
              }
              $data ['voip_db']->query ( $query );
            }
            
            $query = "SELECT name, secret, accountcode, callerid FROM sippeers WHERE name = '" . $val ['extension'] . "'";
            $result = $data ['voip_db']->query ( $query );
            
            if ($val ['line_keys'] == "") {
              $LKS = 1;
              $CPK = 2;
            }
            else if ($val ['line_keys'] == 1) {
              $LKS = 1;
              $CPK = 4;
            }
            else {
              $LKS = $val ['line_keys'];
              $CPK = 1;
            }
            
            if ($result->num_rows > 0) {
              $eRow = $result->fetch_row ();
              
              $ext = substr ( $eRow [0], strlen ( $eRow [2] ) );
              $user = $eRow [0];
              $pass = $eRow [1];
              
              $callerid = explode ( "<", $eRow [3] );
              
              $dN = $callerid [0];
              
              if ($val ['label'] != '')
                $label = $val ['label'];
              else
                $label = strtoupper ( $eRow [2] ) . " " . substr ( $callerid [1], 0, - 1 );
              
              $dN = $label;
              
              $result->free ();
            }
            else if (isset ( $val ['secret'] )) {
              $ext = $val ['extension'];
              $user = $val ['extension'];
              $pass = $val ['secret'];
              
              if ($val ['label'] != '') {
                $label = $val ['label'];
                $dN = $val ['label'];
              }
              else {
                $label = $val ['extension'];
                $dN = $val ['extension'];
              }
            }
            else {
              $ext = "9999";
              $user = "9999";
              $dN = "9999";
              $label = "9999";
              $pass = "1981";
            }
            
            $rG = "1";
          }
          else {
            $ext = "";
            $user = "";
            $dN = "";
            $label = "";
            $pass = "";
            $rG = "";
          }
          
          if ($user != "" && $pass != "") {
            
            if ($frm == 'sip_409') {
              
              $rI = new Polycom_Firmware_409 ();
              // system ( "echo 'PWND: " . $cDev->model . " - " . $cDev->modelNo . "<" . json_encode($rI->regInfo) . ">' >> /tmp/AGENT.log" );
              
              // $rI->regInfo = $polyMatrix [$dI [3]] [$dI [4]] ['reg'];
              $rI->regInfo ['displayName'] = $dN;
              $rI->regInfo ['address'] = $user;
              $rI->regInfo ['label'] = $label;
              $rI->regInfo ['auth.userId'] = $user;
              $rI->regInfo ['auth.password'] = $pass;
              $rI->regInfo ['lineKeys'] = $LKS;
              $rI->regInfo ['callsPerLineKey'] = $CPK;
              $rI->regInfo ['server.1.address'] = $val ['server_host_primary'];
              $rI->regInfo ['server.1.port'] = $val ['server_port_primary'];
              $rI->regInfo ['server.1.transport'] = $val ['server_transport_primary'];
              $rI->regInfo ['server.2.address'] = $val ['server_host_backup'];
              $rI->regInfo ['server.1.register'] = $rG;
              $rI->regInfo ['server.2.register'] = "1";
              $rI->regInfo ['server.2.port'] = $val ['server_port_backup'];
              $rI->regInfo ['server.2.transport'] = $val ['server_transport_backup'];
              
              foreach ( $rI->regInfo as $rKey => $rVal ) {
                $reg .= 'reg.' . $i . '.' . $rKey . '="' . $rVal . '" ';
              }
              system ( "echo 'PWND.2: " . $cDev->model . " - " . $cDev->modelNo . "<" . json_encode ( $rI->regInfo ) . ">" . $reg . "' >> /tmp/AGENT.log" );
            }
            else {
              $reg .= "reg.$i.displayName=\"" . $dN . "\" reg.$i.address=\"" . $user . "\" reg.$i.label=\"" . $label . "\" reg.$i.auth.userId=\"" . $user . "\" reg.$i.auth.password=\"" . $pass . "\" reg.$i.lineKeys=\"$LKS\" reg.$i.callsPerLineKey=\"$CPK\" reg.$i.server.1.address=\"" . $val ['server_host_primary'] . "\" reg.$i.server.1.port=\"" . $val ['server_port_primary'] . "\" reg.$i.server.1.transport=\"" . $val ['server_transport_primary'] . "\" reg.$i.server.2.address=\"" . $val ['server_host_backup'] . "\" reg.$i.server.1.register=\"" . $rG . "\" reg.$i.server.1.expires=\"60\" reg.$i.server.2.register=\"$rG\" reg.$i.server.2.expires=\"60\" reg.$i.server.2.port=\"" . $val ['server_port_backup'] . "\" reg.$i.server.2.transport=\"" . $val ['server_transport_backup'] . "\" reg.$i.auth.domain=\"\" reg.$i.outboundProxy.address=\"\" ";
            }
            
            // $mwi .= "msg.mwi.$i.callBackMode=\"contact\" msg.mwi.$i.subscribe=\"" . $val ['server_primary'] . "\" msg.mwi.$i.callBack=\"*98\" ";
            $mwi .= "msg.mwi.$i.callBackMode=\"contact\" msg.mwi.$i.subscribe=\"" . $user . "\" msg.mwi.$i.callBack=\"*98\" ";
          }
          
          $i ++;
        }
        
        $data ['tpl']->assign ( "DIALPLAN", $qData ['dialplan'] );
        $data ['tpl']->assign ( "DIALPLAN_TIMEOUT", $qData ['dialplan_timeout'] );
        
        $data ['tpl']->assign ( "REG", $reg );
        
        system ( "echo 'Reg: " . $data ['ubix_db']->real_escape_string ( $reg ) . "' >> /tmp/AGENT.log" );
        $data ['tpl']->assign ( "MWI", $mwi );
        system ( "echo 'MWI: " . $data ['ubix_db']->real_escape_string ( $mwi ) . "' >> /tmp/AGENT.log" );
        system ( "echo 'MrOlsen - END' >> /tmp/AGENT.log" );
    }
  
  }

}

class Polycom_Firmware_409 {

  /* Default Regstation Info */
  public $regInfo = array (
      'acd-agent-available' => "0",
      'acd-login-logout' => "0",
      'auth.domain' => "",
      'auth.optimizedInFailover' => "0",
      'auth.useLoginCredentials' => "0",
      'bargeInEnabled' => "0",
      'csta' => "0",
      'fwd.busy.contact' => "",
      'fwd.busy.status' => "0",
      'fwd.noanswer.contact' => "",
      'fwd.noanswer.ringCount' => "9",
      'fwd.noanswer.status' => "0",
      'lcs' => "0",
      'musicOnHold.uri' => "",
      'outboundProxy.failOver.failBack.timeout' => "3600",
      'outboundProxy.failOver.failRegistrationOn' => "1",
      'outboundProxy.failOver.onlySignalWithRegistered' => "1",
      'outboundProxy.failOver.reRegisterOn' => "0",
      'outboundProxy.port' => "0",
      'outboundProxy.transport' => "DNSnaptr",
      'outboundProxy.address' => "",
      'protocol' => "",
      'ringType' => "default",
      'serverFeatureControl.activateCodeSequence.cf.always' => "",
      'serverFeatureControl.activateCodeSequence.cf.busy' => "",
      'serverFeatureControl.activateCodeSequence.cf.noanswer' => "",
      'serverFeatureControl.activateCodeSequence.dnd' => "",
      'serverFeatureControl.cf' => "0",
      'serverFeatureControl.deActivateCodeSequence.cf.always' => "",
      'serverFeatureControl.deActivateCodeSequence.cf.busy' => "",
      'serverFeatureControl.deActivateCodeSequence.cf.noanswer' => "",
      'serverFeatureControl.deActivateCodeSequence.dnd' => "",
      'serverFeatureControl.dnd' => "0",
      'serverFeatureControl.signalingMethod' => "subscribeAsFeatureEvent",
      'serverFeatureControl.subscribeToUri' => "",
      'telephony' => "1",
      'teluri' => "0",
      'thirdPartyName' => "",
      'type' => "private",
      'useCompleteUriForRetrieve' => "1",
      'useLocalTargetUriForLegacyPickup' => "0",
      'server.1.expires' => "300",
      'server.1.expires.lineSeize' => "30",
      'server.1.expires.overlap' => "60",
      'server.1.lcs' => "0",
      'server.1.retryMaxCount' => "3",
      'server.1.retryTimeOut' => "0",
      'server.1.specialInterop' => "standard",
      'server.2.expires' => "300",
      'server.2.expires.lineSeize' => "30",
      'server.2.expires.overlap' => "60",
      'server.2.lcs' => "0",
      'server.2.retryMaxCount' => "3",
      'server.2.retryTimeOut' => "0",
      'server.2.specialInterop' => "standard",
      'displayName' => "",
      'address' => "",
      'label' => "",
      'auth.userId' => "",
      'auth.password' => "",
      'lineKeys' => "1",
      'callsPerLineKey' => "1",
      'server.1.address' => "",
      'server.1.port' => "5060",
      'server.1.transport' => "DNSnaptr",
      'server.2.address' => "",
      'server.1.register' => "0",
      'server.2.register' => "0",
      'server.2.port' => "5060",
      'server.2.transport' => "DNSnaptr" 
  );

  public static $version = '4.0.9';

  public static $boot_major = '5';

  public static $devices = Array (
      'SPIP' => Array (
          '321',
          '331',
          '335',
          '450',
          '550',
          '560',
          '650',
          '670' 
      ) 
  );

  public function reg() {

    return ($this->regInfo);
  
  }

}

class VoIP_Device {

  public $deviceFamily;

  public $model;

  public $modelNo;

  public $firmware;

  public $bootStatus;

  public $userAgent;

  public $deviceSerial;

  public $appType;

}

?>