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']); $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; } 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 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 /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();