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
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							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();
 | |
| 
 |