Skip to content

Commit 3167cf9

Browse files
committed
Add uptime to server details page
1 parent c24beb4 commit 3167cf9

File tree

4 files changed

+69
-4
lines changed

4 files changed

+69
-4
lines changed

src/controllers/Server/View.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use \BNETDocs\Libraries\Packet;
1010
use \BNETDocs\Libraries\Router;
1111
use \BNETDocs\Libraries\Server;
12+
use \BNETDocs\Libraries\ServerMetric;
1213
use \BNETDocs\Libraries\ServerType;
1314
use \BNETDocs\Libraries\UserSession;
1415
use \BNETDocs\Models\Server\View as ServerViewModel;
@@ -48,6 +49,10 @@ public function run(Router &$router) {
4849
$model->server_type = null;
4950
}
5051

52+
if ($model->server) {
53+
$model->server_uptime = ServerMetric::getUptime($this->server_id);
54+
}
55+
5156
ob_start();
5257
$view->render($model);
5358
$router->setResponseCode(($model->server ? 200 : 404));

src/libraries/ServerMetric.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
namespace BNETDocs\Libraries;
4+
5+
use \BNETDocs\Libraries\Server;
6+
use \CarlBennett\MVC\Libraries\Common;
7+
use \CarlBennett\MVC\Libraries\Database;
8+
use \CarlBennett\MVC\Libraries\DatabaseDriver;
9+
use \DateTime;
10+
use \DateTimeZone;
11+
use \PDO;
12+
use \PDOException;
13+
14+
class ServerMetric {
15+
16+
const CACHE_UPTIME_TTL = 300;
17+
18+
public static function &getUptime($server_id) {
19+
$cache_key = "bnetdocs-servermetric-uptime-" . (int) $server_id;
20+
$cache_val = Common::$cache->get($cache_key);
21+
//if ($cache_val !== false) return unserialize($cache_val);
22+
if (!isset(Common::$database)) {
23+
Common::$database = DatabaseDriver::getDatabaseObject();
24+
}
25+
$stmt = Common::$database->prepare("
26+
SELECT
27+
MIN(`metric_datetime`) AS `lbound`,
28+
MAX(`metric_datetime`) AS `ubound`
29+
FROM `server_metrics`
30+
WHERE `server_id` = :server_id AND `metric_datetime` >= (
31+
SELECT `metric_datetime`
32+
FROM `server_metrics`
33+
WHERE `server_id` = :server_id AND NOT (`metric_flags` & "
34+
. Server::STATUS_ONLINE . ")
35+
ORDER BY `metric_datetime` DESC LIMIT 1
36+
);
37+
");
38+
$stmt->bindParam(":server_id", $server_id, PDO::PARAM_INT);
39+
$stmt->execute();
40+
$obj = $stmt->fetch(PDO::FETCH_OBJ);
41+
$stmt->closeCursor();
42+
43+
$tz = new DateTimeZone("UTC");
44+
$lbound = new DateTime($obj->lbound, $tz);
45+
$ubound = new DateTime($obj->ubound, $tz);
46+
$range = $ubound->diff($lbound);
47+
48+
Common::$cache->set($cache_key, serialize($range), self::CACHE_UPTIME_TTL);
49+
return $range;
50+
}
51+
52+
}

src/models/Server/View.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@ class View extends Model {
99
public $server;
1010
public $server_id;
1111
public $server_type;
12+
public $server_uptime;
1213
public $user_session;
1314

1415
public function __construct() {
1516
parent::__construct();
16-
$this->server = null;
17-
$this->server_id = null;
18-
$this->server_type = null;
19-
$this->user_session = null;
17+
$this->server = null;
18+
$this->server_id = null;
19+
$this->server_type = null;
20+
$this->server_uptime = null;
21+
$this->user_session = null;
2022
}
2123

2224
}

src/templates/Server/View.phtml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ $object_user = ($object ? $object->getUser() : null);
1515
$object_user_avatar = ($object_user ? $object_user->getAvatarURI(22) : null);
1616
$object_user_url = ($object_user ? $object_user->getURI() : null);
1717

18+
$object_uptime = Common::intervalToString(
19+
$this->getContext()->server_uptime,
20+
"0 seconds"
21+
);
22+
1823
$title = ($object ? $object->getName() : "Server Not Found");
1924
$description = ($object ? "The BNETDocs Status Page for " . $object->getName()
2025
: "The requested server does not exist or could not be found.");
@@ -57,6 +62,7 @@ require("./header.inc.phtml");
5762
<tr><th>Owner</th><td><?php if ($object_user) { ?><a href="<?php echo $object_user_url; ?>"><img class="avatar" src="<?php echo $object_user_avatar; ?>"/> <?php echo filter_var($object_user->getName(), FILTER_SANITIZE_FULL_SPECIAL_CHARS); ?></a><?php } else { echo "Anonymous"; } ?></td></tr>
5863
<tr><th>Type</th><td><?php echo filter_var($object_type->getLabel(), FILTER_SANITIZE_FULL_SPECIAL_CHARS); ?></td></tr>
5964
<tr><th>Current Status:</th><td><?php echo $object_status; ?></td></tr>
65+
<tr><th>Uptime:</th><td><?php echo $object_uptime; ?></td></tr>
6066
</tbody></table>
6167
</section>
6268
</article>

0 commit comments

Comments
 (0)