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.

195 lines
5.5 KiB

4 years ago
<?php
// Kickstart the framework
// $f3=require('lib/base.php');
require_once './vendor/autoload.php';
4 years ago
date_default_timezone_set('Europe/Budapest');
4 years ago
$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']);
4 years ago
$macArray = preg_split('/\r\n|\r|\n/', $post['item']['macAddress']);
$label = $post['label'];
4 years ago
$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':
4 years ago
if ($label === 'on') {
foreach ($macArray as $mac) {
$result = wol($mac, $post['item']['broadcastIP']);
array_push($messages, $result);
}
} else {
foreach ($iparray as $ip) {
$result = shutdown($ip);
array_push($messages, $result);
}
4 years ago
}
4 years ago
4 years ago
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...'];
}
}
4 years ago
function shutdown($ip) {
$ipdata = explode('@', $ip);
$username = explode(':', $ipdata[0])[0];
$password = explode(':', $ipdata[0])[1];
$ipaddress = $ipdata[1];
$output = shell_exec("net rpc shutdown -f -t 0 -C 'message' -U ". $username . "%" . $password ." -I " . $ipaddress);
return ['success' => true, 'message' => $output . '(' . $ipaddress . ')'];
}
4 years ago
function wol($macAddress, $broadcastIP) {
$f = new \Phpwol\Factory();
$magicPacket = $f->magicPacket();
4 years ago
$result = $magicPacket->send($macAddress, $broadcastIP);
if ($result) {
return ['success' => true, 'message' => 'Successful Wake On Lan for ' . $macAddress];
4 years ago
} else {
4 years ago
return ['success' => false, 'message' => 'Unsuccessful WOL for MAC address ' . $macAddress];
4 years ago
}
}
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();