This file is indexed.

/usr/share/php/Icinga/Protocol/Nrpe/Connection.php is in php-icinga 2.1.0-1ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
<?php
/* Icinga Web 2 | (c) 2013-2015 Icinga Development Team | GPLv2+ */

namespace Icinga\Protocol\Nrpe;

use Icinga\Exception\IcingaException;

class Connection
{
    protected $host;
    protected $port;
    protected $connection;
    protected $use_ssl = false;
    protected $lastReturnCode = null;

    public function __construct($host, $port = 5666)
    {
        $this->host = $host;
        $this->port = $port;
    }

    public function useSsl($use_ssl = true)
    {
        $this->use_ssl = $use_ssl;
        return $this;
    }

    public function sendCommand($command, $args = null)
    {
        if (! empty($args)) {
            $command .= '!' . implode('!', $args);
        }

        $packet = Packet::createQuery($command);
        return $this->send($packet);
    }

    public function getLastReturnCode()
    {
        return $this->lastReturnCode;
    }

    public function send(Packet $packet)
    {
        $conn = $this->connection();
        $bytes = $packet->getBinary();
        fputs($conn, $bytes, strlen($bytes));
        // TODO: Check result checksum!
        $result = fread($conn, 8192);
        if ($result === false) {
            throw new IcingaException('CHECK_NRPE: Error receiving data from daemon.');
        } elseif (strlen($result) === 0) {
            throw new IcingaException(
                'CHECK_NRPE: Received 0 bytes from daemon. Check the remote server logs for error messages'
            );
        }
        // TODO: CHECK_NRPE: Receive underflow - only %d bytes received (%d expected)
        $code = unpack('n', substr($result, 8, 2));
        $this->lastReturnCode = $code[1];
        $this->disconnect();
        return rtrim(substr($result, 10, -2));
    }

    protected function connect()
    {
        $ctx = stream_context_create();
        if ($this->use_ssl) {
            // TODO: fail if not ok:
            $res = stream_context_set_option($ctx, 'ssl', 'ciphers', 'ADH');
            $uri = sprintf('ssl://%s:%d', $this->host, $this->port);
        } else {
            $uri = sprintf('tcp://%s:%d', $this->host, $this->port);
        }
        $this->connection = @stream_socket_client(
            $uri,
            $errno,
            $errstr,
            10,
            STREAM_CLIENT_CONNECT,
            $ctx
        );
        if (! $this->connection) {
            throw new IcingaException(
                'NRPE Connection failed: %s',
                $errstr
            );
        }
    }

    protected function connection()
    {
        if ($this->connection === null) {
            $this->connect();
        }
        return $this->connection;
    }

    protected function disconnect()
    {
        if (is_resource($this->connection)) {
            fclose($this->connection);
            $this->connection = null;
        }
        return $this;
    }

    public function __destruct()
    {
        $this->disconnect();
    }
}