Example #1
0
 */
if (!class_exists('ProvisionerConfig')) {
    class ProvisionerConfig
    {
        /**
         * Setup anything required to make our provisioner class work
         */
        public static function setup()
        {
            // Register auto-loader. When classes are requested that aren't loaded, we'll find them via endpointsAutoload()
            spl_autoload_register(array('ProvisionerConfig', 'endpointsAutoload'));
        }
        public static function endpointsAutoload($class)
        {
            // If for some reason we get here and the class is already loaded, return
            if (class_exists($class, FALSE)) {
                return TRUE;
            }
            // Try to include the class
            $file = str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';
            $file = FreePBX::Endpointman()->PHONE_MODULES_PATH . $file;
            if (is_file($file)) {
                require $file;
                return TRUE;
            }
            return FALSE;
        }
    }
}
ProvisionerConfig::setup();
 /**
  * Prepare and then send the data that Provisioner expects, then take what provisioner gives us and do what it says
  * @param array $phone_info Everything from get_phone_info
  * @param bool  $reboot Reboot the Phone after write
  * @param bool  $write  Write out Directory structure.
  */
 function prepare_configs($phone_info, $reboot = TRUE, $write = TRUE)
 {
     $this->PROVISIONER_BASE = $this->PHONE_MODULES_PATH;
     //define('PROVISIONER_BASE', $this->PROVISIONER_BASE);
     if (file_exists($this->PHONE_MODULES_PATH . 'autoload.php')) {
         if (!class_exists('ProvisionerConfig')) {
             require $this->PHONE_MODULES_PATH . 'autoload.php';
         }
         //Load Provisioner
         $class = "endpoint_" . $phone_info['directory'] . "_" . $phone_info['cfg_dir'] . '_phone';
         $base_class = "endpoint_" . $phone_info['directory'] . '_base';
         $master_class = "endpoint_base";
         if (!class_exists($master_class)) {
             ProvisionerConfig::endpointsAutoload($master_class);
         }
         if (!class_exists($base_class)) {
             ProvisionerConfig::endpointsAutoload($base_class);
         }
         if (!class_exists($class)) {
             ProvisionerConfig::endpointsAutoload($class);
         }
         if (class_exists($class)) {
             $provisioner_lib = new $class();
             //Determine if global settings have been overridden
             if ($phone_info['template_id'] > 0) {
                 if (isset($phone_info['template_data_info']['global_settings_override'])) {
                     $settings = unserialize($phone_info['template_data_info']['global_settings_override']);
                 } else {
                     $settings['srvip'] = $this->configmod->get('srvip');
                     $settings['ntp'] = $this->configmod->get('ntp');
                     $settings['config_location'] = $this->configmod->get('config_location');
                     $settings['tz'] = $this->configmod->get('tz');
                 }
             } else {
                 if (isset($phone_info['global_settings_override'])) {
                     $settings = unserialize($phone_info['global_settings_override']);
                 } else {
                     $settings['srvip'] = $this->configmod->get('srvip');
                     $settings['ntp'] = $this->configmod->get('ntp');
                     $settings['config_location'] = $this->configmod->get('config_location');
                     $settings['tz'] = $this->configmod->get('tz');
                 }
             }
             //Tell the system who we are and were to find the data.
             $provisioner_lib->root_dir = $this->PHONE_MODULES_PATH;
             $provisioner_lib->engine = 'asterisk';
             $provisioner_lib->engine_location = $this->configmod->get('asterisk_location', 'asterisk');
             $provisioner_lib->system = 'unix';
             //have to because of versions less than php5.3
             $provisioner_lib->brand_name = $phone_info['directory'];
             $provisioner_lib->family_line = $phone_info['cfg_dir'];
             //Phone Model (Please reference family_data.xml in the family directory for a list of recognized models)
             //This has to match word for word. I really need to fix this....
             $provisioner_lib->model = $phone_info['model'];
             //Timezone
             try {
                 $provisioner_lib->DateTimeZone = new \DateTimeZone($settings['tz']);
             } catch (Exception $e) {
                 $this->error['parse_configs'] = 'Error Returned From Timezone Library: ' . $e->getMessage();
                 return FALSE;
             }
             $temp = "";
             $template_data = unserialize($phone_info['template_data']);
             $global_user_cfg_data = unserialize($phone_info['global_user_cfg_data']);
             if ($phone_info['template_id'] > 0) {
                 $global_custom_cfg_data = unserialize($phone_info['template_data_info']['global_custom_cfg_data']);
                 //Provide alternate Configuration file instead of the one from the hard drive
                 if (!empty($phone_info['template_data_info']['config_files_override'])) {
                     $temp = unserialize($phone_info['template_data_info']['config_files_override']);
                     foreach ($temp as $list) {
                         $sql = "SELECT original_name,data FROM endpointman_custom_configs WHERE id = " . $list;
                         //$res = sql($sql);
                         $res = sql($sql, 'getAll', DB_FETCHMODE_ASSOC);
                         if ($res->rowCount()) {
                             $data = sql($sql, 'getRow', DB_FETCHMODE_ASSOC);
                             $provisioner_lib->config_files_override[$data['original_name']] = $data['data'];
                         }
                     }
                 }
             } else {
                 $global_custom_cfg_data = unserialize($phone_info['global_custom_cfg_data']);
                 //Provide alternate Configuration file instead of the one from the hard drive
                 if (!empty($phone_info['config_files_override'])) {
                     $temp = unserialize($phone_info['config_files_override']);
                     foreach ($temp as $list) {
                         $sql = "SELECT original_name,data FROM endpointman_custom_configs WHERE id = " . $list;
                         //$res = sql($sql);
                         $res = sql($sql, 'getAll', DB_FETCHMODE_ASSOC);
                         if ($res->rowCount()) {
                             $data = sql($sql, 'getRow', DB_FETCHMODE_ASSOC);
                             $provisioner_lib->config_files_override[$data['original_name']] = $data['data'];
                         }
                     }
                 }
             }
             if (!empty($global_custom_cfg_data)) {
                 if (array_key_exists('data', $global_custom_cfg_data)) {
                     $global_custom_cfg_ari = $global_custom_cfg_data['ari'];
                     $global_custom_cfg_data = $global_custom_cfg_data['data'];
                 } else {
                     $global_custom_cfg_data = array();
                     $global_custom_cfg_ari = array();
                 }
             }
             $new_template_data = array();
             $line_ops = array();
             if (is_array($global_custom_cfg_data)) {
                 foreach ($global_custom_cfg_data as $key => $data) {
                     //TODO: clean up with reg-exp
                     $full_key = $key;
                     $key = explode('|', $key);
                     $count = count($key);
                     switch ($count) {
                         case 1:
                             if ($this->global_cfg['enable_ari'] == 1 and isset($global_custom_cfg_ari[$full_key]) and isset($global_user_cfg_data[$full_key])) {
                                 $new_template_data[$full_key] = $global_user_cfg_data[$full_key];
                             } else {
                                 $new_template_data[$full_key] = $global_custom_cfg_data[$full_key];
                             }
                             break;
                         case 2:
                             $breaks = explode('_', $key[1]);
                             if ($this->global_cfg['enable_ari'] == 1 and isset($global_custom_cfg_ari[$full_key]) and isset($global_user_cfg_data[$full_key])) {
                                 $new_template_data['loops'][$breaks[0]][$breaks[2]][$breaks[1]] = $global_user_cfg_data[$full_key];
                             } else {
                                 $new_template_data['loops'][$breaks[0]][$breaks[2]][$breaks[1]] = $global_custom_cfg_data[$full_key];
                             }
                             break;
                         case 3:
                             if ($this->global_cfg['enable_ari'] == 1 and isset($global_custom_cfg_ari[$full_key]) and isset($global_user_cfg_data[$full_key])) {
                                 $line_ops[$key[1]][$key[2]] = $global_user_cfg_data[$full_key];
                             } else {
                                 $line_ops[$key[1]][$key[2]] = $global_custom_cfg_data[$full_key];
                             }
                             break;
                     }
                 }
             }
             if (!$write) {
                 $new_template_data['provision']['type'] = 'dynamic';
                 $new_template_data['provision']['protocol'] = 'http';
                 $new_template_data['provision']['path'] = rtrim($settings['srvip'] . dirname($_SERVER['REQUEST_URI']) . '/', '/');
                 $new_template_data['provision']['encryption'] = FALSE;
             } else {
                 $new_template_data['provision']['type'] = 'file';
                 $new_template_data['provision']['protocol'] = 'tftp';
                 $new_template_data['provision']['path'] = $settings['srvip'];
                 $new_template_data['provision']['encryption'] = FALSE;
             }
             $new_template_data['ntp'] = $settings['ntp'];
             //Overwrite all specific settings variables now
             if (!empty($phone_info['specific_settings'])) {
                 $specific_settings = unserialize($phone_info['specific_settings']);
                 $specific_settings = is_array($specific_settings) ? $specific_settings : array();
             } else {
                 $specific_settings = array();
             }
             //Set Variables according to the template_data files included. We can include different template.xml files within family_data.xml also one can create
             //template_data_custom.xml which will get included or template_data_<model_name>_custom.xml which will also get included
             //line 'global' will set variables that aren't line dependant
             $provisioner_lib->settings = $new_template_data;
             //Loop through Lines!
             $li = 0;
             foreach ($phone_info['line'] as $line) {
                 $line_options = is_array($line_ops[$line['line']]) ? $line_ops[$line['line']] : array();
                 $line_statics = array('line' => $line['line'], 'username' => $line['ext'], 'authname' => $line['ext'], 'secret' => $line['secret'], 'displayname' => $line['description'], 'server_host' => $settings['srvip'], 'server_port' => '5060', 'user_extension' => $line['user_extension']);
                 $provisioner_lib->settings['line'][$li] = array_merge($line_options, $line_statics);
                 $li++;
             }
             if (array_key_exists('data', $specific_settings)) {
                 foreach ($specific_settings['data'] as $key => $data) {
                     $default_exp = preg_split("/\\|/i", $key);
                     if (isset($default_exp[2])) {
                         //lineloop
                         $var = $default_exp[2];
                         $line = $default_exp[1];
                         $loc = $this->system->arraysearchrecursive($line, $provisioner_lib->settings['line'], 'line');
                         if ($loc !== FALSE) {
                             $k = $loc[0];
                             $provisioner_lib->settings['line'][$k][$var] = $data;
                         } else {
                             //Adding a new line-ish type options
                             if (isset($specific_settings['data']['line|' . $line . '|line_enabled'])) {
                                 $lastkey = array_pop(array_keys($provisioner_lib->settings['line']));
                                 $lastkey++;
                                 $provisioner_lib->settings['line'][$lastkey]['line'] = $line;
                                 $provisioner_lib->settings['line'][$lastkey][$var] = $data;
                             }
                         }
                     } else {
                         switch ($key) {
                             case "connection_type":
                                 $provisioner_lib->settings['network'][$key] = $data;
                                 break;
                             case "ip4_address":
                                 $provisioner_lib->settings['network']['ipv4'] = $data;
                                 break;
                             case "ip6_address":
                                 $provisioner_lib->settings['network']['ipv6'] = $data;
                                 break;
                             case "subnet_mask":
                                 $provisioner_lib->settings['network']['subnet'] = $data;
                                 break;
                             case "gateway_address":
                                 $provisioner_lib->settings['network']['gateway'] = $data;
                                 break;
                             case "primary_dns":
                                 $provisioner_lib->settings['network'][$key] = $data;
                                 break;
                             default:
                                 $provisioner_lib->settings[$key] = $data;
                                 break;
                         }
                     }
                 }
             }
             $provisioner_lib->settings['mac'] = $phone_info['mac'];
             $provisioner_lib->mac = $phone_info['mac'];
             //Setting a line variable here...these aren't defined in the template_data.xml file yet. however they will still be parsed
             //and if they have defaults assigned in a future template_data.xml or in the config file using pipes (|) those will be used, pipes take precedence
             $provisioner_lib->processor_info = "EndPoint Manager Version " . $this->global_cfg['version'];
             // Because every brand is an extension (eventually) of endpoint, you know this function will exist regardless of who it is
             //Start timer
             $time_start = microtime(true);
             $provisioner_lib->debug = TRUE;
             try {
                 $returned_data = $provisioner_lib->generate_all_files();
             } catch (Exception $e) {
                 $this->error['prepare_configs'] = 'Error Returned From Provisioner Library: ' . $e->getMessage();
                 return FALSE;
             }
             //print_r($provisioner_lib->debug_return);
             //End timer
             $time_end = microtime(true);
             $time = $time_end - $time_start;
             if ($time > 360) {
                 $this->error['generate_time'] = "It took an awfully long time to generate configs...(" . round($time, 2) . " seconds)";
             }
             if ($write) {
                 $this->write_configs($provisioner_lib, $reboot, $settings['config_location'], $phone_info, $returned_data);
             } else {
                 return $returned_data;
             }
             return TRUE;
         } else {
             $this->error['parse_configs'] = "Can't Load \"" . $class . "\" Class!";
             return FALSE;
         }
     } else {
         $this->error['parse_configs'] = "Can't Load the Autoloader!";
         return FALSE;
     }
 }
 public function epm_advanced_poce_select()
 {
     if (!isset($_REQUEST['product_select'])) {
         $retarr = array("status" => false, "message" => _("No send Product Select!"));
     } elseif (!is_numeric($_REQUEST['product_select'])) {
         $retarr = array("status" => false, "message" => _("Product Select send is not number!"));
     } elseif ($_REQUEST['product_select'] < 0) {
         $retarr = array("status" => false, "message" => _("Product Select send is number not valid!"));
     } else {
         $dget['product_select'] = $_REQUEST['product_select'];
         $sql = 'SELECT * FROM `endpointman_product_list` WHERE `hidden` = 0 AND `id` = ' . $dget['product_select'];
         $product_select_info = sql($sql, 'getRow', DB_FETCHMODE_ASSOC);
         $sql = "SELECT cfg_dir,directory,config_files FROM endpointman_product_list,endpointman_brand_list WHERE endpointman_product_list.brand = endpointman_brand_list.id AND endpointman_product_list.id ='" . $dget['product_select'] . "'";
         $row = sql($sql, 'getRow', DB_FETCHMODE_ASSOC);
         $config_files = explode(",", $row['config_files']);
         $i = 0;
         if (count($config_files)) {
             foreach ($config_files as $config_files_data) {
                 //$file_list[$i]['value'] = $i;
                 $file_list[$i]['value'] = $dget['product_select'];
                 $file_list[$i]['text'] = $config_files_data;
                 $i++;
             }
         } else {
             $file_list = NULL;
         }
         $sql = "SELECT * FROM endpointman_custom_configs WHERE product_id = '" . $dget['product_select'] . "'";
         $data = sql($sql, 'getAll', DB_FETCHMODE_ASSOC);
         $i = 0;
         if (count($data)) {
             //$data = sql($sql, 'getAll', DB_FETCHMODE_ASSOC);
             foreach ($data as $row2) {
                 $sql_file_list[$i]['value'] = $row2['id'];
                 $sql_file_list[$i]['text'] = $row2['name'];
                 $sql_file_list[$i]['ref'] = $row2['original_name'];
                 $i++;
             }
         } else {
             $sql_file_list = NULL;
         }
         require_once $this->PHONE_MODULES_PATH . 'setup.php';
         $class = "endpoint_" . $row['directory'] . "_" . $row['cfg_dir'] . '_phone';
         $base_class = "endpoint_" . $row['directory'] . '_base';
         $master_class = "endpoint_base";
         /*********************************************************************************
          *** Quick Fix for FreePBX Distro
          *** I seriously want to figure out why ONLY the FreePBX Distro can't do autoloads.
          **********************************************************************************/
         if (!class_exists($master_class)) {
             ProvisionerConfig::endpointsAutoload($master_class);
         }
         if (!class_exists($base_class)) {
             ProvisionerConfig::endpointsAutoload($base_class);
         }
         if (!class_exists($class)) {
             ProvisionerConfig::endpointsAutoload($class);
         }
         //end quick fix
         $phone_config = new $class();
         //TODO: remove
         $template_file_list[0]['value'] = "template_data_custom.xml";
         $template_file_list[0]['text'] = "template_data_custom.xml";
         $sql = "SELECT id, model FROM endpointman_model_list WHERE product_id = '" . $dget['product_select'] . "' AND enabled = 1 AND hidden = 0";
         $data = sql($sql, 'getAll', DB_FETCHMODE_ASSOC);
         $i = 1;
         foreach ($data as $list) {
             //$template_file_list[$i]['value'] = "template_data_" . $list['model'] . "_custom.xml";
             $template_file_list[$i]['value'] = $list['id'];
             $template_file_list[$i]['text'] = "template_data_" . $list['model'] . "_custom.xml";
         }
         $retarr = array("status" => true, "message" => "OK", "product_select" => $dget['product_select'], "product_select_info" => $product_select_info, "file_list" => $file_list, "template_file_list" => $template_file_list, "sql_file_list" => $sql_file_list);
         unset($dget);
     }
     return $retarr;
 }
     }
     $phone_info = $endpoint->get_phone_info($row['id']);
     $class = "endpoint_" . $phone_info['directory'] . "_" . $phone_info['cfg_dir'] . '_phone';
     $base_class = "endpoint_" . $phone_info['directory'] . '_base';
     $master_class = "endpoint_base";
     /**Fix for FreePBX Distro
      * I seriously want to figure out why ONLY the FreePBX Distro can't do autoloads.
      **/
     if (!class_exists($master_class)) {
         ProvisionerConfig::endpointsAutoload($master_class);
     }
     if (!class_exists($base_class)) {
         ProvisionerConfig::endpointsAutoload($base_class);
     }
     if (!class_exists($class)) {
         ProvisionerConfig::endpointsAutoload($class);
     }
     //end quick fix
     $provisioner_lib = new $class();
     $provisioner_lib->root_dir = PHONE_MODULES_PATH;
     $provisioner_lib->engine = 'asterisk';
     $provisioner_lib->engine_location = !empty($endpoint->global_cfg['asterisk_location']) ? $endpoint->global_cfg['asterisk_location'] : 'asterisk';
     $provisioner_lib->system = 'unix';
     //have to because of versions less than php5.3
     $provisioner_lib->brand_name = $phone_info['directory'];
     $provisioner_lib->family_line = $phone_info['cfg_dir'];
     $provisioner_lib->settings['line'][0] = array('username' => $phone_info['line'][1]['ext'], 'authname' => $phone_info['line'][1]['ext']);
     $provisioner_lib->reboot();
     unset($provisioner_lib);
 }
 $endpoint->message['page:devices_manager'] = "Rebooted all " . $phone_info['name'] . " phones";