TFTP Service v1.0.3 (#1858)
* Added functionality to show when a devices was last provisioned Added functionality to show when a devices was last provisioned Need addition to database: v_devices table: device_provisioned_on -> datetime device_provisioned_by -> char(10) * Revert "Added functionality to show when a devices was last provisioned" This reverts commitc3e40d68fa. * Revert "Revert "Added functionality to show when a devices was last provisioned"" This reverts commit8c27a46565. * Changed field names as requested Changed field names as requested for last provisioned data * Added database fields for device provisoned functionality Added provisioned_date, provisioned_method, provisioned_ip * Added ability to search device provisioned info * Added ip tracking to device provisoned functionality Added ip tracking to device provisoned functionality and moved the code to before rendering to register the contact even on unseccessful render * Added IP address to status column * TFTP Service v1 TFTP Service v1 * Update app_config.php * TFTP Service v1.0.1 TFTP Service v1.0.1 * TFTP Service v1.0.2 * TFTP Service v1.0.2-1 Renamed file * TFTP Service 1.0.3 Bug fixes * Modified to ignore IDE files
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
FusionPBX
|
||||
Version: MPL 1.1
|
||||
|
||||
The contents of this file are subject to the Mozilla Public License Version
|
||||
1.1 (the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
http://www.mozilla.org/MPL/
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
for the specific language governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Original Code is FusionPBX
|
||||
|
||||
The Initial Developer of the Original Code is
|
||||
Sebastian Krupinski <sebastian@ksacorp.com>
|
||||
Portions created by the Initial Developer are Copyright (C) 2016
|
||||
the Initial Developer. All Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
Sebastian Krupinski <sebastian@ksacorp.com>
|
||||
*/
|
||||
|
||||
// load required files
|
||||
require_once 'tftpserver.class.php';
|
||||
|
||||
class tftpservice extends TFTPServer
|
||||
{
|
||||
private $_debug=true;
|
||||
private $_dbtype;
|
||||
private $_dbhost;
|
||||
private $_dbport;
|
||||
private $_dbname;
|
||||
private $_dbusername;
|
||||
private $_dbpassword;
|
||||
private $_fileslocation;
|
||||
|
||||
function __construct($server_url, $config)
|
||||
{
|
||||
parent::__construct($server_url);
|
||||
if (isset($config['debug'])) $this->_debug=$config['debug'];
|
||||
if (isset($config['db_type'])) $this->_dbtype=$config['db_type'];
|
||||
if (isset($config['db_host'])) $this->_dbhost=$config['db_host'];
|
||||
if (isset($config['db_port'])) $this->_dbport=$config['db_port'];
|
||||
if (isset($config['db_name'])) $this->_dbname=$config['db_name'];
|
||||
if (isset($config['db_username'])) $this->_dbusername=$config['db_username'];
|
||||
if (isset($config['db_password'])) $this->_dbpassword=$config['db_password'];
|
||||
if (isset($config['files_location'])) $this->_fileslocation=$config['files_location'];
|
||||
|
||||
if (!file_exists($_fileslocation)) {
|
||||
$_fileslocation = (strpos(PHP_OS,"WIN") !== false) ? $_SERVER["TMP"] : "/tmp";
|
||||
}
|
||||
}
|
||||
|
||||
private function log($client, $level, $message) {
|
||||
if($level!='D'||$this->_debug)
|
||||
echo
|
||||
date("H:i:s") . " " .
|
||||
$level . " " .
|
||||
$client . " " .
|
||||
$message . "\n";
|
||||
}
|
||||
|
||||
public function get($client, $filepath, $mode)
|
||||
{
|
||||
$this->log($client,"N", "Requested File ".$filepath);
|
||||
|
||||
try {
|
||||
$regex_filter='/provision\/(?<domain>\b(?:(?-)[A-Za-z0-9-\_]{1,63}(?-)\.)+[A-Za-z]{1,63}\b|\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)\/(?<mac>\b(?:[0-9a-fA-F]{2}(?:\-|\:)?){6}\b)/';
|
||||
|
||||
preg_match($regex_filter,$filepath,$regex_matches);
|
||||
|
||||
// check if filepath is in a specific format and respond acordingly
|
||||
if ($regex_matches['domain']&&$regex_matches['mac'])
|
||||
{
|
||||
// generate file from db
|
||||
$filedata = $this->generate_file($client,$regex_matches['domain'],$regex_matches['mac']);
|
||||
}
|
||||
else
|
||||
{
|
||||
// retrieve file from disk
|
||||
$filedata = $this->retrieve_file($client,$filepath);
|
||||
}
|
||||
|
||||
if($filedata !== false)
|
||||
{
|
||||
$this->log($client,"N", "Transmitting File ".$filepath);
|
||||
|
||||
return $filedata;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception $exception)
|
||||
{
|
||||
$this->log($client,"E", "Exception: ".$exception->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function generate_file($client, $domain, $mac)
|
||||
{
|
||||
// load required files
|
||||
require_once __DIR__.'/dbhelper.php';
|
||||
require_once __DIR__.'/../../../resources/functions.php';
|
||||
require_once __DIR__.'/../../../resources/classes/template.php';
|
||||
require_once __DIR__.'/../../provision/resources/classes/provision.php';
|
||||
|
||||
$this->log($client,"D", "Generating File ".$domain." ".$mac);
|
||||
|
||||
// connect to database
|
||||
$db = database::connect($this->_dbtype,$this->_dbhost,$this->_dbport,$this->_dbname,$this->_dbusername,$this->_dbpassword);
|
||||
|
||||
// get domain uuid
|
||||
$domain_uuid = database::get_value($db,'v_domains','domain_uuid','domain_name',$domain);
|
||||
|
||||
// set temporary folder for template engine
|
||||
$_SESSION['server']['temp']['dir'] = (strpos(PHP_OS,"WIN") !== false) ? $_SERVER["TMP"] : "/tmp";
|
||||
|
||||
// update device provisioned status
|
||||
$data=array('device_provisioned_date'=>date("Y-m-d H:i:s"),'device_provisioned_method'=>'tftp','device_provisioned_ip'=>$client);
|
||||
database::set_row($db,'v_devices',$data,'device_mac_address',$mac);
|
||||
|
||||
// generate file
|
||||
$prov = new provision;
|
||||
$prov->db = $db;
|
||||
$prov->domain_uuid = $domain_uuid;
|
||||
$prov->mac = $mac;
|
||||
$data = $prov->render();
|
||||
|
||||
// return data or false
|
||||
if($data === false)
|
||||
{
|
||||
$this->log($client,"W", "Generating File Failed ".$domain." ".$mac);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
public function retrieve_file($client, $path){
|
||||
|
||||
$this->log($client,"D", "Retrieve File ".$path);
|
||||
// check for reletive path directive
|
||||
if(strstr($path, "../") != false || strstr($path, "/..") != false) return false;
|
||||
// combine base and path
|
||||
$path = rtrim($this->_fileslocation,'/').'/'.ltrim($path,'/');
|
||||
if(substr($path, 0, strlen($this->_fileslocation)) != $this->_fileslocation) return false;
|
||||
// read contents
|
||||
if($this->_debug) $this->log($client,"D", "Reading File ".$path);
|
||||
$data = @file_get_contents($path);
|
||||
// return data or false
|
||||
if($data === false)
|
||||
{
|
||||
$this->log($client,"W", "Retrieving File Failed ".$path);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $data;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
Reference in New Issue
Block a user