zoneminder/web/includes/Storage.php

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

171 lines
5.5 KiB
PHP
Raw Normal View History

<?php
namespace ZM;
require_once('database.php');
require_once('Event.php');
require_once('Object.php');
2017-10-11 01:39:17 +08:00
class Storage extends ZM_Object {
protected static $table = 'Storage';
protected $defaults = array(
'Id' => null,
2020-07-26 02:27:09 +08:00
'Path' => array('type'=>'text','filter_regexp'=>array('/[^\w\-\.\(\)\:\/ ]/','/\/$/')),
'Name' => '',
'Type' => 'local',
'Url' => '',
'DiskSpace' => null,
'Scheme' => 'Medium',
'ServerId' => 0,
'DoDelete' => 1,
2020-03-04 23:46:16 +08:00
'Enabled' => 1,
);
public static function find($parameters = array(), $options = array()) {
return ZM_Object::_find(get_class(), $parameters, $options);
}
public static function find_one($parameters = array(), $options = array()) {
return ZM_Object::_find_one(get_class(), $parameters, $options);
}
2020-08-05 05:35:16 +08:00
public function Path($new=null) {
if ( $new ) $this->{'Path'} = $new;
2019-05-06 22:49:18 +08:00
if ( isset($this->{'Path'}) and ( $this->{'Path'} != '' ) ) {
return $this->{'Path'};
} else if ( ! isset($this->{'Id'}) ) {
$path = ZM_DIR_EVENTS;
if ( $path[0] != '/' ) {
$this->{'Path'} = ZM_PATH_WEB.'/'.ZM_DIR_EVENTS;
} else {
$this->{'Path'} = ZM_DIR_EVENTS;
}
return $this->{'Path'};
}
return $this->{'Name'};
}
2020-08-05 05:35:16 +08:00
public function Name($new=null) {
if ( $new )
$this->{'Name'} = $new;
2019-05-06 22:49:18 +08:00
if ( isset($this->{'Name'}) and ( $this->{'Name'} != '' ) ) {
return $this->{'Name'};
} else if ( ! isset($this->{'Id'}) ) {
return 'Default';
}
return $this->{'Name'};
}
public function Events() {
if ( $this->{'Id'} and ! isset($this->{'Events'}) ) {
$this->{'Events'} = Event::find(array('StorageId'=>$this->{'Id'}));
}
if ( ! isset($this->{'Events'}) ) {
$this->{'Events'} = array();
}
return $this->{'Events'};
}
public function EventCount() {
if ( (! property_exists($this, 'EventCount')) or (!$this->{'EventCount'}) ) {
$this->{'EventCount'} = dbFetchOne('SELECT COUNT(*) AS EventCount FROM Events WHERE StorageId=?', 'EventCount', array($this->Id()));
}
return $this->{'EventCount'};
}
public function disk_used_blocks() {
$df = shell_exec('df '.escapeshellarg($this->Path()));
$space = -1;
if ( preg_match('/\s(\d+)\s+\d+\s+\d+%/ms', $df, $matches) )
$space = $matches[1];
return $space;
}
public function disk_usage_percent() {
$path = $this->Path();
2017-01-31 06:24:41 +08:00
if ( ! $path ) {
Warning('Storage::disk_usage_percent: path is empty');
2017-01-31 06:24:41 +08:00
return 0;
} else if ( ! file_exists($path) ) {
2017-01-31 06:24:41 +08:00
Warning("Storage::disk_usage_percent: path $path does not exist");
return 0;
}
$total = $this->disk_total_space();
if ( ! $total ) {
2019-05-06 22:49:18 +08:00
Error('disk_total_space returned false for ' . $path);
return 0;
}
$used = $this->disk_used_space();
2019-05-06 22:49:18 +08:00
$usage = round(($used / $total) * 100);
//Debug("Used $usage = round( ( $used / $total ) * 100 )");
return $usage;
}
public function disk_total_space() {
if ( !property_exists($this, 'disk_total_space') ) {
$path = $this->Path();
if ( file_exists($path) ) {
$this->{'disk_total_space'} = disk_total_space($path);
} else {
Error("Path $path does not exist.");
$this->{'disk_total_space'} = 0;
}
}
return $this->{'disk_total_space'};
}
public function disk_used_space() {
# This isn't a function like this in php, so we have to add up the space used in each event.
if ( ( !property_exists($this, 'disk_used_space')) or !$this->{'disk_used_space'} ) {
if ( $this->Type() == 's3fs' ) {
$this->{'disk_used_space'} = $this->event_disk_space();
2017-11-27 04:12:35 +08:00
} else {
$path = $this->Path();
if ( file_exists($path) ) {
$this->{'disk_used_space'} = disk_total_space($path) - disk_free_space($path);
} else {
Error("Path $path does not exist.");
$this->{'disk_used_space'} = 0;
}
}
}
return $this->{'disk_used_space'};
} // end function disk_used_space
public function event_disk_space() {
# This isn't a function like this in php, so we have to add up the space used in each event.
if ( (! property_exists($this, 'DiskSpace')) or (!isset($this->{'DiskSpace'})) ) {
2019-05-06 22:49:18 +08:00
$used = dbFetchOne('SELECT SUM(DiskSpace) AS DiskSpace FROM Events WHERE StorageId=? AND DiskSpace IS NOT NULL', 'DiskSpace', array($this->Id()));
do {
# Do in batches of 1000 so as to not useup all ram, Event will do caching though...
$events = Event::find(array('StorageId'=>$this->Id(), 'DiskSpace'=>null), array('limit'=>1000));
foreach ( $events as $Event ) {
$Event->Storage($this); // Prevent further db hit
# DiskSpace will update the event
$used += $Event->DiskSpace();
} #end foreach
Event::clear_cache();
2019-11-21 05:30:26 +08:00
} while ( count($events) == 1000 );
$this->{'DiskSpace'} = $used;
}
return $this->{'DiskSpace'};
} // end function event_disk_space
2018-05-08 05:08:32 +08:00
2018-04-18 00:37:30 +08:00
public function Server() {
if ( ! property_exists($this, 'Server') ) {
if ( property_exists($this, 'ServerId') ) {
$this->{'Server'} = Server::find_one(array('Id'=>$this->{'ServerId'}));
if ( !$this->{'Server'} ) {
if ( $this->{'ServerId'} )
Error('No Server record found for server id ' . $this->{'ServerId'});
$this->{'Server'} = new Server();
}
} else {
$this->{'Server'} = new Server();
}
2018-04-18 00:37:30 +08:00
}
return $this->{'Server'};
}
2019-02-07 00:44:36 +08:00
2019-05-06 22:49:18 +08:00
} // end class Storage
?>