Skip to content
Snippets Groups Projects
Commit f6c7a851 authored by Thibault Debatty's avatar Thibault Debatty
Browse files

started to migrate to mysql for storing data

parent 1d26d6eb
No related branches found
No related tags found
No related merge requests found
Showing
with 127 additions and 114 deletions
......@@ -11,3 +11,6 @@ Homestead.yaml
npm-debug.log
yarn-error.log
.env
monitor
monitor-*.zip
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* @property-read int $id
* @property int $time
* @property int $server_id
* @property Server $server
* @property string $data
*/
class Record extends Model
{
public $timestamps = false;
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'data' => 'array',
];
public function server()
{
return $this->belongsTo(Server::class);
}
}
......@@ -16,15 +16,17 @@ class CPUtemperature extends \App\AbstractSensor
public function report(array $records) : string
{
$record = end($records);
if (! isset($record["cpu-temperature"])) {
if (! isset($record->data["cpu-temperature"])) {
return "<p>No data available...</p>"
. "<p>Maybe <code>sensors</code> is not installed.</p>"
. "<p>You can install it with <code>sudo apt install lm-sensors</code></p>";
}
$Cores = self::parseCPUtemperature($record['cpu-temperature']);
$CPUS=self::parseCPU($record['cpu-temperature']);
$Cores = self::parseCPUtemperature($record->data['cpu-temperature']);
$CPUS = self::parseCPU($record->data['cpu-temperature']);
$return = "<table class='table table-sm'>";
$return .= "<tr><th>Name</th><th>Temperature (°C)</th><th>T°crit (°C)</th></tr>";
foreach ($CPUS as $CPU) {
$return .= "<tr><td>" . "<b>" ."CPU " . $CPU->number . "</td><td>"
. "<b>" . $CPU->value . "</td><td>" . "<b>" . $CPU->critvalue . "</td></tr>";
......@@ -42,18 +44,18 @@ class CPUtemperature extends \App\AbstractSensor
public function status(array $records) : int
{
$record = end($records);
if (! isset($record["cpu-temperature"])) {
if (! isset($record->data["cpu-temperature"])) {
return \App\Status::UNKNOWN;
}
$all_status = [];
foreach (self::parseCPU($record['cpu-temperature']) as $CPU) {
foreach (self::parseCPU($record->data['cpu-temperature']) as $CPU) {
/* @var $CPU Cpu */
$status = \App\Status::OK;
if ($CPU->value > $CPU->critvalue) {
$status = \App\Status::WARNING;
}
foreach (self::parseCPUtemperature($record['cpu-temperature']) as $Core) {
foreach (self::parseCPUtemperature($record->data['cpu-temperature']) as $Core) {
if ($Core->number == $CPU->number) {
if ($Core->value > $CPU->critvalue) {
$status = \App\Status::WARNING;
......@@ -100,7 +102,7 @@ class CPUtemperature extends \App\AbstractSensor
}
return $CPUS;
}
public function parseCPUtemperature($string) //cores (to associate with cpus only in report() )
public function parseCPUtemperature(string $string) //cores (to associate with cpus only in report() )
{
if ($string == null) {
return [];
......
......@@ -22,14 +22,7 @@ class ClientVersion extends \App\AbstractSensor
return self::$manifest;
}
$options = [
'timeout' => 5.0];
$proxy = config("app.proxy", null);
if ($proxy != null) {
$options["proxy"] = $proxy;
}
$options = ['timeout' => 5.0];
$client = new Client($options);
try {
......@@ -72,13 +65,11 @@ class ClientVersion extends \App\AbstractSensor
return "none";
}
return $last_record->version;
return $last_record->data["version"];
}
public function status(array $records) : int
{
$latest_version = "unknown";
try {
$latest_version = $this->latestVersion();
} catch (\ErrorException $ex) {
......
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace App\Sensor;
use App\Record;
/**
* Description of Reboot
*
......@@ -15,7 +11,6 @@ namespace App\Sensor;
*/
class Date extends \App\AbstractSensor
{
//put your code here
public function report(array $records) : string
{
return "<p>Time drift: " . $this->delta(end($records)) . " seconds</p>";
......@@ -35,12 +30,12 @@ class Date extends \App\AbstractSensor
return \App\Status::OK;
}
public function delta($record)
public function delta(Record $record)
{
if (! isset($record["date"])) {
if (! isset($record->data["date"])) {
return null;
}
return $record->date - $record->time;
return $record->data["date"] - $record->time;
}
}
......@@ -15,11 +15,11 @@ class Disks extends \App\AbstractSensor
public function report(array $records) : string
{
$record = end($records);
if (! isset($record['disks'])) {
if (! isset($record->data['disks'])) {
return "<p>No data available...</p>";
}
$partitions = self::parse($record->disks);
$partitions = self::parse($record->data["disks"]);
$return = "<table class='table table-sm'>";
$return .= "<tr><th></th><th></th><th>Usage</th></tr>";
foreach ($partitions as $partition) {
......@@ -34,12 +34,12 @@ class Disks extends \App\AbstractSensor
public function status(array $records) : int
{
$record = end($records);
if (! isset($record['disks'])) {
if (! isset($record->data['disks'])) {
return \App\Status::UNKNOWN;
}
$all_status = [];
foreach (self::parse($record->disks) as $partition) {
foreach (self::parse($record->data["disks"]) as $partition) {
/* @var $partition Partition */
$status = \App\Status::OK;
if ($partition->usedPercent() > 80) {
......@@ -79,7 +79,7 @@ class Disks extends \App\AbstractSensor
public static function fromRecord($record) : array
{
$partitions = self::parse($record->disks);
$partitions = self::parse($record->data["disks"]);
$time = $record->time;
foreach ($partitions as $partition) {
$partition->time = $time;
......
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace App\Sensor;
/**
......
......@@ -3,6 +3,7 @@
namespace App\Sensor;
use \App\AbstractSensor;
use \App\Record;
/**
* Description of MemInfo
......@@ -14,9 +15,8 @@ class Ifconfig extends AbstractSensor
public function report(array $records) : string
{
$record = end($records);
if (! isset($record['ifconfig'])) {
if (! isset($record->data['ifconfig'])) {
return "<p>No data available...</p>";
}
......@@ -97,9 +97,9 @@ class Ifconfig extends AbstractSensor
const RX = '/^\s+RX packets (?>\d+) bytes (\d+)/m';
const TX = '/^\s+TX packets (?>\d+) bytes (\d+)/m';
public function parseIfconfigRecord($record)
public function parseIfconfigRecord(Record $record)
{
$interfaces = $this->parseIfconfig($record->ifconfig);
$interfaces = $this->parseIfconfig($record->data["ifconfig"]);
foreach ($interfaces as $interface) {
$interface->time = $record->time;
}
......@@ -113,7 +113,7 @@ class Ifconfig extends AbstractSensor
* @param string $string
* @return \App\Sensor\NetworkInterface[]
*/
public function parseIfconfig(string $string)
public function parseIfconfig(string $string) : array
{
$allowed_prefixes = ["en", "eth", "wl", "venet"];
......
......@@ -15,11 +15,11 @@ class Inodes extends \App\AbstractSensor
public function report(array $records) : string
{
$record = end($records);
if (! isset($record['inodes'])) {
if (! isset($record->data['inodes'])) {
return "<p>No data available...</p>";
}
$disks = $this->parse($record->inodes);
$disks = $this->parse($record->data["inodes"]);
$return = "<table class='table table-sm'>";
$return .= "<tr><th></th><th></th><th>Usage</th></tr>";
foreach ($disks as $disk) {
......@@ -34,12 +34,12 @@ class Inodes extends \App\AbstractSensor
public function status(array $records) : int
{
$record = end($records);
if (! isset($record['inodes'])) {
if (! isset($record->data['inodes'])) {
return \App\Status::UNKNOWN;
}
$all_status = [];
foreach ($this->parse($record->inodes) as $disk) {
foreach ($this->parse($record->data["inodes"]) as $disk) {
/* @var $disk InodesDisk */
$status = \App\Status::OK;
if ($disk->usedPercent() > 80) {
......@@ -53,7 +53,7 @@ class Inodes extends \App\AbstractSensor
return max($all_status);
}
public function parse($string)
public function parse(string $string)
{
$values = array();
preg_match_all(self::REGEXP, $string, $values);
......
......@@ -17,14 +17,14 @@ class ListeningPorts extends \App\AbstractSensor
$record = end($records);
// "netstat-listen-tcp" "netstat-listen-udp"
if (! isset($record["netstat-listen-udp"])
&& ! isset($record["netstat-listen-tcp"])) {
if (! isset($record->data["netstat-listen-udp"])
&& ! isset($record->data["netstat-listen-tcp"])) {
return "<p>No data available...</p>";
}
$ports = array_merge(
$this->parse($record["netstat-listen-tcp"]),
$this->parse($record["netstat-listen-udp"])
$this->parse($record->data["netstat-listen-tcp"]),
$this->parse($record->data["netstat-listen-udp"])
);
usort(
......
......@@ -3,6 +3,7 @@
namespace App\Sensor;
use \App\AbstractSensor;
use \App\Status;
/**
* Description of LoadAvg
......@@ -12,18 +13,22 @@ use \App\AbstractSensor;
class LoadAvg extends AbstractSensor
{
/**
*
* @param array<Record> $records
* @return string
*/
public function report(array $records) : string
{
$record = end($records);
if (! isset($record['loadavg'])) {
if (! isset($record->data['loadavg'])) {
return "<p>No data available...</p>";
}
$field = $record->loadavg;
$current_load = $this->parse($field);
$current_load = $this->parse($record->data["loadavg"]);
return view("agent.loadavg", [
"current_load" => $current_load]);
return view(
"agent.loadavg",
["current_load" => $current_load]);
}
public function loadPoints(array $records)
......@@ -32,7 +37,7 @@ class LoadAvg extends AbstractSensor
foreach ($records as $record) {
$points[] = new Point(
$record->time * 1000,
$this->parse($record->loadavg)
$this->parse($record->data["loadavg"])
);
}
return $points;
......@@ -42,16 +47,16 @@ class LoadAvg extends AbstractSensor
{
$max = $this->server()->info()->cpuinfo()["threads"];
foreach ($records as $record) {
$load = $this->parse($record->loadavg);
$load = $this->parse($record->data["loadavg"]);
if ($load > $max) {
return \App\Status::WARNING;
return Status::WARNING;
}
}
return \App\Status::OK;
return Status::OK;
}
public function parse($string) : string
public function parse(string $string) : string
{
return current(explode(" ", $string));
}
......
......@@ -14,7 +14,6 @@ class MemInfo extends AbstractSensor
public function report(array $records) : string
{
return view("agent.meminfo", []);
}
......@@ -22,7 +21,7 @@ class MemInfo extends AbstractSensor
{
$used = [];
foreach ($records as $record) {
$meminfo = $this->parseMeminfo($record->memory);
$meminfo = $this->parseMeminfo($record->data["memory"]);
$used[] = new Point(
$record->time * 1000,
$meminfo->used() / 1000
......@@ -36,7 +35,7 @@ class MemInfo extends AbstractSensor
{
$points = [];
foreach ($records as $record) {
$meminfo = $this->parseMeminfo($record->memory);
$meminfo = $this->parseMeminfo($record->data["memory"]);
$points[] = new Point(
$record->time * 1000,
$meminfo->cached / 1000
......@@ -49,7 +48,7 @@ class MemInfo extends AbstractSensor
public function status(array $records) : int
{
foreach ($records as $record) {
$mem = $this->parseMeminfo($record->memory);
$mem = $this->parseMeminfo($record->data["memory"]);
if ($mem->usedRatio() > 0.8) {
return \App\Status::WARNING;
}
......@@ -63,7 +62,7 @@ class MemInfo extends AbstractSensor
const MEMFREE = "/^MemFree:\\s+([0-9]+) kB$/m";
const MEMCACHED = "/^Cached:\\s+([0-9]+) kB$/m";
public function parseMeminfo($string)
public function parseMeminfo(string $string) : Memory
{
return new Memory(
$this->pregMatchOne(self::MEMTOTAL, $string),
......
......@@ -25,7 +25,7 @@ class Netstat extends AbstractSensor
$reports = [];
foreach ($records as $record) {
$report = $this->parse($record['netstat-statistics']);
$report = $this->parse($record->data['netstat-statistics']);
$report->time = $record->time;
$reports[] = $report;
}
......
......@@ -14,11 +14,11 @@ class Perccli extends \App\AbstractSensor
public function report(array $records) : string
{
$record = end($records);
if (! isset($record['perccli'])) {
if (! isset($record->data['perccli'])) {
return "<p>No data available...</p>";
}
$drives = $this->parse($record->perccli);
$drives = $this->parse($record->data["perccli"]);
$return = "<table class='table table-sm'>"
. "<tr>"
. "<th>Slot</th>"
......@@ -41,11 +41,11 @@ class Perccli extends \App\AbstractSensor
public function status(array $records) : int
{
$record = end($records);
if (! isset($record['perccli'])) {
if (! isset($record->data['perccli'])) {
return \App\Status::UNKNOWN;
}
$drives = $this->parse($record->ssacli);
$drives = $this->parse($record->data["perccli"]);
foreach ($drives as $disk) {
if ($disk->status != "Onln") {
return \App\Status::WARNING;
......
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace App\Sensor;
/**
......@@ -15,7 +9,7 @@ namespace App\Sensor;
*/
class Reboot extends \App\AbstractSensor
{
//put your code here
public function report(array $records) : string
{
return "<p>Reboot required: "
......@@ -40,11 +34,11 @@ class Reboot extends \App\AbstractSensor
public function status(array $records) : int
{
$record = end($records);
if (! isset($record['reboot'])) {
if (! isset($record->data['reboot'])) {
return \App\Status::UNKNOWN;
}
if ($record->reboot) {
if ($record->data["reboot"]) {
return \App\Status::WARNING;
}
......
......@@ -20,11 +20,11 @@ class Ssacli extends \App\AbstractSensor
public function report(array $records) : string
{
$record = end($records);
if (! isset($record['ssacli'])) {
if (! isset($record->data['ssacli'])) {
return "<p>No data available...</p>";
}
$disks = $this->parse($record->ssacli);
$disks = $this->parse($record->data["ssacli"]);
$return = "<table class='table table-sm'>"
. "<tr>"
. "<th>Port</th>"
......@@ -51,11 +51,11 @@ class Ssacli extends \App\AbstractSensor
public function status(array $records) : int
{
$record = end($records);
if (! isset($record['ssacli'])) {
if (! isset($record->data['ssacli'])) {
return \App\Status::UNKNOWN;
}
$disks = $this->parse($record->ssacli);
$disks = $this->parse($record->data["ssacli"]);
foreach ($disks as $disk) {
if ($disk->status != "OK") {
return \App\Status::WARNING;
......
......@@ -15,12 +15,12 @@ class USBtemperature extends \App\AbstractSensor
public function report(array $records) : string
{
$record = end($records);
if (! isset($record["TEMPer"])) {
if (! isset($record->data["TEMPer"])) {
return "<p>No data available...</p>"
. "<p>Maybe <code>TEMPer</code> is not installed.</p>"
. "<p>You can install it following the tutorial on the Gitlab repository</p>";
}
$temper = self::parse($record['TEMPer']);
$temper = self::parse($record->data['TEMPer']);
$return= "<p>Ambient temperature (USB TEMPer) : " . $temper->temp[1] . "." . $temper->temp[2] . " °C " . "</p>";
return $return;
}
......@@ -28,11 +28,11 @@ class USBtemperature extends \App\AbstractSensor
public function status(array $records) : int
{
$record = end($records);
if (! isset($record["TEMPer"])) {
if (! isset($record->data["TEMPer"])) {
return \App\Status::UNKNOWN;
}
$status = \App\Status::OK;
$USBTemp = self::parse($record['TEMPer']);
$USBTemp = self::parse($record->data['TEMPer']);
if ((int)($USBTemp->temp[1]) > 60) {
$status = \App\Status::WARNING;
}
......
......@@ -15,21 +15,21 @@ class Updates extends \App\AbstractSensor
public function report(array $records) : string
{
$record = end($records);
if (! isset($record['updates'])) {
if (! isset($record->data['updates'])) {
return "<p>No data available...</p>";
}
return "<p>" . nl2br($record->updates) . "</p>";
return "<p>" . nl2br($record->data["updates"]) . "</p>";
}
public function status(array $records) : int
{
$record = end($records);
if (! isset($record['updates'])) {
if (! isset($record->data['updates'])) {
return \App\Status::UNKNOWN;
}
$status = $this->parse($record->updates);
$status = $this->parse($record->data["updates"]);
if ($status == null) {
return \App\Status::UNKNOWN;
}
......
......@@ -4,6 +4,9 @@ namespace App;
use Illuminate\Support\Facades\Log;
/**
* A wrapper around a sensor, used to catch possible exceptions.
*/
class SensorWrapper
{
private $sensor;
......@@ -12,7 +15,7 @@ class SensorWrapper
private $report;
private $status;
public function __construct(Sensor $sensor, array $records)
public function __construct(Sensor $sensor, $records)
{
$this->sensor = $sensor;
$this->records = $records;
......
......@@ -2,7 +2,6 @@
namespace App;
use App\Mongo;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Log;
......@@ -72,15 +71,16 @@ class Server extends Model
{
return $this->belongsTo("App\Organization");
}
public function records()
{
return $this->hasMany(Record::class);
}
public function lastRecord()
public function lastRecord() : ?Record
{
if ($this->last_record == null) {
$collection = Mongo::get()->monitoring->records;
$this->last_record = $collection->findOne(
["server_id" => $this->id],
["sort" => ["_id" => -1]]
);
$this->last_record = $this->records()->orderBy("time", "desc")->first();
}
return $this->last_record;
......@@ -88,21 +88,16 @@ class Server extends Model
/**
* Get the last day of data.
* @return array
*/
public function lastRecords1Day() : array
{
if ($this->records_1day !== null) {
return $this->records_1day;
if ($this->records_1day == null) {
$start = time() - 24 * 3600;
$this->records_1day = $this->records()->where("time", ">", $start)->get()->all();
}
$start = time() - 24 * 3600;
$this->records_1day = Mongo::get()->monitoring->records->find([
"server_id" => $this->id,
"time" => ['$gte' => $start]])
->toArray();
return $this->records_1day;
}
public function hasData() : bool
......@@ -167,10 +162,11 @@ class Server extends Model
public function getChanges($count = 10)
{
return StatusChange::getLastChangesForServer($this->id, $count);
return [];
//return StatusChange::getLastChangesForServer($this->id, $count);
}
public static function id($id) : Server
public static function id(int $id) : Server
{
return self::where("id", $id)->first();
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment