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.

171 lines
4.9 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);
4 years ago
$messages = sendsignal($post);
echo json_encode($messages);
});
function sendsignal($post) {
4 years ago
$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;
}
4 years ago
return $messages;
}
4 years ago
$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];
}
}
4 years ago
$f3->route('GET /cron', function($f3) {
$datestring = date('H').':'.date('i');
$model = new Item;
$items = $model->find(['@ontime = ? or @offtime = ?', $datestring, $datestring]);
if (!empty($items)) {
$messages = [];
foreach ($items as $item) {
if (in_array(date('l'), $item['days'])) {
if ($item['ontime'] === $datestring) { $messages = sendsignal(['item' => $item, 'action' =>$item['oncommand']]);}
if ($item['offtime'] === $datestring) { $messages = sendsignal(['item' => $item, 'action' =>$item['offcommand']]);}
}
}
foreach ($messages as $message) {
// echo date('Y.m.d'). ' ' .$datestring . ' '. $message['message'];
$logger = new Log('cron.log');
$logger->write( $message['message']);
4 years ago
}
4 years ago
}
4 years ago
});
4 years ago
$f3->run();