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.
 
 
 
 

194 lines
5.5 KiB

<?php
// Kickstart the framework
// $f3=require('lib/base.php');
require_once './vendor/autoload.php';
date_default_timezone_set('Europe/Budapest');
$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);
$messages = sendsignal($post);
echo json_encode($messages);
});
function sendsignal($post) {
$iparray = preg_split('/\r\n|\r|\n/', $post['item']['ip']);
$macArray = preg_split('/\r\n|\r|\n/', $post['item']['macAddress']);
$label = $post['label'];
$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':
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);
}
}
break;
default:
array_push($messages, ['success' => false, 'message' => 'No channel set for these equipments']);
break;
}
return $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 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 . ')'];
}
function wol($macAddress, $broadcastIP) {
$f = new \Phpwol\Factory();
$magicPacket = $f->magicPacket();
$result = $magicPacket->send($macAddress, $broadcastIP);
if ($result) {
return ['success' => true, 'message' => 'Successful Wake On Lan for ' . $macAddress];
} else {
return ['success' => false, 'message' => 'Unsuccessful WOL for MAC address ' . $macAddress];
}
}
$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']);
}
}
});
$f3->run();