IZcontrol is a server side application that makes it possible to easily control remote appliances over the network using telnet, UDP and other protocols.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
4.7 KiB

4 years ago
<?php
// Kickstart the framework
// $f3=require('lib/base.php');
require_once './vendor/autoload.php';
$f3 = \Base::instance();
$f3->set('DB',new DB\Jig('data/'));
$db=new \DB\Jig('data/');
class Item extends \DB\Jig\Mapper {
public function __construct() {
parent::__construct( \Base::instance()->get('DB'), 'items' );
}
}
$f3->set('DEBUG',1);
if ((float)PCRE_VERSION<8.0)
trigger_error('PCRE version is out of date');
// Load configuration
$f3->config('config.ini');
$f3->route('GET /',
function($f3) {
$f3->set('template', 'home.htm');
echo View::instance()->render('layout.htm');
}
);
$f3->route('GET /admin',
function($f3) {
$f3->set('template', 'home.htm');
$f3->set('admin', true);
echo View::instance()->render('layout.htm');
}
);
$f3->route('GET /add',
function($f3) {
$f3->set('template', 'add.htm');
echo View::instance()->render('layout.htm');
}
);
$f3->route('POST /add',
function($f3) use ($db) {
$item =new Item;
$item->copyFrom(json_decode($f3->get('BODY')));
$item->save();
}
);
$f3->route('GET /api/items',
function($f3) {
$item = new Item;
$items = $item->find();
$list = array_map([$item, 'cast'],$items);
echo json_encode($list);
}
);
$f3->route('POST /sendsignal', function($f3) {
$post = json_decode($f3->get('BODY'), true);
// print_r($post);
// die;
$iparray = preg_split('/\r\n|\r|\n/', $post['item']['ip']);
$messages = [];
switch ($post['item']['channel']) {
case 'telnet':
foreach ($iparray as $ip) {
$result = telnet($ip, $post['item']['port'], $post['action']);
array_push($messages, $result);
}
break;
case 'udp':
foreach ($iparray as $ip) {
$result = udp($ip, $post['item']['port'], $post['action']);
array_push($messages, $result);
}
break;
case 'wol':
foreach ($iparray as $ip) {
$result = wol($post['item']['macAddress'], $post['item']['broadcastIP']);
array_push($messages, $result);
}
break;
default:
array_push($messages, ['success' => false, 'message' => 'No channel set for these equipments']);
break;
}
echo json_encode($messages);
});
$f3->route('POST /del', function ($f3) {
$item = new Item;
$target = json_decode($f3->get('BODY'), true);
$items = $item->load(['@name = ?', $target['name']]);
$items->erase();
echo json_encode(['success' => true, 'message' => 'Deleted']);
});
function telnet($ip, $port, $action) {
try {
$factory = new \Socket\Raw\Factory();
$socket = $factory->createClient($ip . ':' . $port, 2);
$client = \Graze\TelnetClient\TelnetClient::factory();
$client->setSocket($socket);
// $dsn = '192.168.0.100:23';
$client->setLineEnding(null);
$client->setPrompt("Optoma_PJ>");
$client->setPromptError("F");
try {
$conn = $client->connect($ip . ':' . $port);
$client->setReadTimeout(1);
$response = $client->execute($action . "\r");
return ['success' => true, 'message' => 'successfully sent command to ' . $ip];
} catch (Exception $e) {
return ['success' => false, 'message' => $e->getMessage() . $ip];
}
} catch (Exception $e) {
return ['success' => false, 'message' => $e->getMessage() . ' ' . $ip];
}
}
function udp($ip, $port, $action) {
if ($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) {
socket_sendto($socket, $action, strlen($action), 0, $ip, $port);
return ['success' => true, 'message' => 'UDP successful'];
} else {
return ['success' => false, 'message' => 'UDP not sent...'];
}
}
function wol($macAddress, $broadcastIP) {
$f = new \Phpwol\Factory();
$magicPacket = $f->magicPacket();
if ($result = $magicPacket->send($macAddress, $broadcastIP)) {
return ['success' => true, 'message' => 'Successful Wake On Lan'];
} else {
return ['success' => false, 'message' => 'Unsuccessful WOL for IP ' . $macAddress];
}
}
$f3->route('GET /optomaon',
function($f3) {
$client = \Graze\TelnetClient\TelnetClient::factory();
$dsn = '192.168.0.100:23';
$client->setLineEnding(null);
$client->setPrompt("Optoma_PJ>");
$client->setPromptError("F");
$conn = $client->connect($dsn);
$client->setReadTimeout(1);
$response = $client->execute("~0000 1\r");
print_r($response);
});
function getItems($db) {
return $db->read('items');
}
function setItems($db) {
$items = $db->read('items');
}
$f3->route('GET /userref',
function($f3) {
$f3->set('content','userref.htm');
echo View::instance()->render('layout.htm');
}
);
$f3->run();