Skip to content
Snippets Groups Projects
Server.php 6.14 KiB
Newer Older
Tibo's avatar
Tibo committed
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Server extends Model
{

    protected $fillable = ["token"];

Tibo's avatar
Tibo committed
    /**
     * Last record from this server (used for caching).
     * @var String
     */
    private $last_record = null;

    static $sensors = [
        \App\Sensor\LoadAvg::class,
Tibo's avatar
Tibo committed
        \App\Sensor\MemInfo::class,
        \App\Sensor\Ifconfig::class,
        \App\Sensor\Reboot::class,
Tibo's avatar
Tibo committed
        \App\Sensor\Updates::class,
Tibo's avatar
Tibo committed
        \App\Sensor\Disks::class,
Tibo's avatar
Tibo committed
        \App\Sensor\Inodes::class,
Tibo's avatar
Tibo committed
        \App\Sensor\Ssacli::class,
        \App\Sensor\Date::class,
Tibo's avatar
Tibo committed
        \App\Sensor\ClientVersion::class,
        \App\Sensor\Heartbeat::class
Tibo's avatar
Tibo committed
    public function __construct(array $attributes = array()) {
        $attributes["token"] = str_random(32);
        parent::__construct($attributes);
    }

    public function organization() {
        return $this->belongsTo("App\Organization");
    }
Tibo's avatar
Tibo committed

    public function lastRecord() {
Tibo's avatar
Tibo committed
        if ($this->last_record == null) {

            $collection = \Mongo::get()->monitoring->records;
            $this->last_record =  $collection->findOne(
                    ["server_id" => $this->id],
                    ["sort" => ["_id" => -1]]);
        }

        return $this->last_record;
Tibo's avatar
Tibo committed
    }

Tibo's avatar
Tibo committed
    /**
     * Return the last record if it contains the field $field,
     * otherwise return null.
     * @param string $field
     * @return string
     */
    public function lastRecordContaining(string $field) {
Tibo's avatar
Tibo committed
        if (isset($this->lastRecord()->$field)) {
Tibo's avatar
Tibo committed
            return $this->lastRecord();
        }

        return null;
Tibo's avatar
Tibo committed
    }

Tibo's avatar
Tibo committed
    /**
     *
Tibo's avatar
Tibo committed
     * @return \Carbon\Carbon
Tibo's avatar
Tibo committed
     */
Tibo's avatar
Tibo committed
    public function lastRecordTime() {
        $last_record = $this->lastRecord();
        if ($last_record === null) {
            return \Carbon\Carbon::createFromTimestamp(0);
        }

        return \Carbon\Carbon::createFromTimestamp($last_record->time);
Tibo's avatar
Tibo committed
    }

    public function clientVersion() {
        $last_record = $this->lastRecord();
        if ($last_record == null) {
            return "none";
        }

        return $last_record->version;
Tibo's avatar
Tibo committed
    }
Tibo's avatar
Tibo committed

Tibo's avatar
Tibo committed
    /**
     * Get integer status of server.
     * @return int
     */
Tibo's avatar
Tibo committed
    public function status() {
Tibo's avatar
Tibo committed
        return max($this->statusArray());
    }

Tibo's avatar
Tibo committed
    public function statusBadge() {
        return AbstractSensor::getBadgeForStatus($this->status());
    }

Tibo's avatar
Tibo committed
    public function statusArray() {
        $status_array = [];
Tibo's avatar
Tibo committed
        foreach ($this->getSensors() as $sensor) {
Tibo's avatar
Tibo committed
            $status_array[\get_class($sensor)] = $sensor->status();
Tibo's avatar
Tibo committed
        }
Tibo's avatar
Tibo committed
        return $status_array;
Tibo's avatar
Tibo committed
    }

Tibo's avatar
Tibo committed
    public function getSensorsNOK() {
        $sensorsNOK = [];
        foreach ($this->getSensors() as $sensor) {
            if ($sensor->status() > 0) {
                $sensorsNOK[] = $sensor;
            }
        }
        return $sensorsNOK;
    }

Tibo's avatar
Tibo committed
    public function statusString() {
        switch ($this->status()) {
            case 0:
                return "OK";
            case 10:
                return "WARNING";
            case 20:
                return "ERROR";
            default:
                return "Unknown";
        }
Tibo's avatar
Tibo committed
    }
Tibo's avatar
Tibo committed
    public function getBadge() {
        return AbstractSensor::getBadgeForStatus($this->status());
    }

Tibo's avatar
Tibo committed
    public function color() {
        return AbstractSensor::getColorForStatus($this->status());
    }

    public function getSensors() {

        $sensors = [];
        foreach (self::$sensors as $sensor) {
            $sensors[] = new $sensor($this);
        }
        return $sensors;
    }
Tibo's avatar
Tibo committed


    public function cpuinfo() {
Tibo's avatar
Tibo committed
        $record = $this->lastRecordContaining("cpu");
        if ($record == null) {
Tibo's avatar
Tibo committed
            return null;
Tibo's avatar
Tibo committed
        }

Tibo's avatar
Tibo committed
        return $this->parseCpuinfo($record->cpu);
Tibo's avatar
Tibo committed
    }

    const CPU_INFO = "/^model name	: (.+)$/m";
    public function parseCpuinfo($string) {
        $matches = array();
        preg_match_all(self::CPU_INFO, $string, $matches);

        $result["threads"] = count($matches[0]);
Tibo's avatar
Tibo committed
        $result["cpu"] = $matches[1][0];
Tibo's avatar
Tibo committed
        return $result;
    }

    public function meminfo() {
Tibo's avatar
Tibo committed
        return round($this->memoryTotal() / 1000 / 1000) . " GB";
    }

    /**
     *
     * @return int total memory (in KB)
     */
    public function memoryTotal() {
Tibo's avatar
Tibo committed
        $record = $this->lastRecordContaining("memory");
        if ($record == null) {
Tibo's avatar
Tibo committed
            return null;
Tibo's avatar
Tibo committed
        }

Tibo's avatar
Tibo committed
        return $this->parseMeminfo($record->memory);
Tibo's avatar
Tibo committed
    }

    const MEMINFO = "/^MemTotal:\\s+([0-9]+) kB$/m";
    public function parseMeminfo($string) {
        $matches = array();
        preg_match(self::MEMINFO, $string, $matches);
        $total = $matches[1];
        return $total;
    }

    public function lsb() {

        $record = $this->lastRecordContaining("lsb");
        if ($record == null) {
            return "";
        }

        return $this->parseLsb($record->lsb);
    }

    const LSB = "/^Description:	(.+)$/m";
    public function parseLsb($string) {
        $matches = [];
        preg_match(self::LSB, $string, $matches);
        return $matches[1];



    const REGEX_MANUFACTURER = "/^\s*Manufacturer: (.*)$/m";
    public function parseManufacturer($string) {
        $matches = [];
        preg_match(self::REGEX_MANUFACTURER, $string, $matches);
        return $matches[1];
    }

    public function manufacturer() {
        $record = $this->lastRecordContaining("system");
        if ($record == null) {
            return "Unknown";
        }

        return $this->parseManufacturer($record->system);
    }

    const REGEX_PRODUCT_NAME = "/^\s*Product Name: (.*)$/m";
    public function parseProductName($string) {
        $matches = [];
        preg_match(self::REGEX_PRODUCT_NAME, $string, $matches);
        return $matches[1];
    }

    public function productName() {
        $record = $this->lastRecordContaining("system");
        if ($record == null) {
            return "";
        }

        return $this->parseProductName($record->system);
Tibo's avatar
Tibo committed

    public function getChanges($count = 10) {
        return \App\StatusChange::getLastChangesForServer($this->id, $count);
    }
Tibo's avatar
Tibo committed

    public static function id($id) : Server {
        return self::where("id", $id)->first();
    }
Tibo's avatar
Tibo committed
}