mirror of
				https://github.com/Icinga/icingaweb2.git
				synced 2025-10-31 19:34:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			69 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Icinga\Protocol\Nrpe;
 | |
| 
 | |
| class Packet
 | |
| {
 | |
|     const QUERY    = 0x01;
 | |
|     const RESPONSE = 0x02;
 | |
| 
 | |
|     protected $version = 0x02;
 | |
|     protected $type;
 | |
|     protected $body;
 | |
|     protected static $randomBytes;
 | |
| 
 | |
|     public function __construct($type, $body)
 | |
|     {
 | |
|         $this->type = $type;
 | |
|         $this->body = $body;
 | |
|         $this->regenerateRandomBytes();
 | |
|     }
 | |
| 
 | |
|     // TODO: renew "from time to time" to allow long-running daemons
 | |
|     protected function regenerateRandomBytes()
 | |
|     {
 | |
|         self::$randomBytes = '';
 | |
|         for ($i = 0; $i < 4096; $i++) {
 | |
|             self::$randomBytes .= pack('N', mt_rand());
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static function createQuery($body)
 | |
|     {
 | |
|         $packet = new Packet(self::QUERY, $body);
 | |
|         return $packet;
 | |
|     }
 | |
| 
 | |
|     protected function getFillString($length)
 | |
|     {
 | |
|         $max = strlen(self::$randomBytes) - $length;
 | |
|         return substr(self::$randomBytes, rand(0, $max), $length);
 | |
|     }
 | |
| 
 | |
|     // TODO: WTF is SR? And 2324?
 | |
|     public function getBinary()
 | |
|     {
 | |
|         $version  = pack('n', $this->version);
 | |
|         $type     = pack('n', $this->type);
 | |
|         $dummycrc = "\x00\x00\x00\x00";
 | |
|         $result   = "\x00\x00";
 | |
|         $result   = pack('n', 2324);
 | |
|         $body     = $this->body
 | |
|                   . "\x00"
 | |
|                   . $this->getFillString(1023 - strlen($this->body))
 | |
|                   . 'SR';
 | |
| 
 | |
|         $crc = pack(
 | |
|             'N',
 | |
|             crc32($version . $type . $dummycrc . $result . $body)
 | |
|         );
 | |
|         $bytes = $version . $type . $crc . $result . $body;
 | |
|         return $bytes;
 | |
|     }
 | |
| 
 | |
|     public function __toString()
 | |
|     {
 | |
|         return $this->body;
 | |
|     }
 | |
| }
 |