diff --git a/frontend/css/cvm.css b/frontend/css/cvm.css
index 1fd4cd5..c340c15 100644
--- a/frontend/css/cvm.css
+++ b/frontend/css/cvm.css
@@ -93,6 +93,11 @@ table.userinfo th
width: 180px;
}
+table.nodeinfo th
+{
+ width: 180px;
+}
+
table.userlist td
{
padding-bottom: 4px;
diff --git a/frontend/locales/english.lng b/frontend/locales/english.lng
index 27573b0..1d7095a 100644
--- a/frontend/locales/english.lng
+++ b/frontend/locales/english.lng
@@ -32,6 +32,7 @@ title-admin-userlist; User overview
title-admin-containerlist; Container overview
title-admin-nodelist; Node overview
title-admin-userinfo; User lookup
+title-admin-nodeinfo; Node lookup
title-admin-overview; Administrative overview
title-admin-vps-suspend; Suspend container
title-admin-vps-unsuspend; Unsuspend container
@@ -39,6 +40,7 @@ title-admin-vps-transfer; Transfer container ownership
title-admin-vps-terminate; Terminate container
header-admin-user-containers; Containers owned by this user
+header-admin-node-containers; Containers on this node
header-vps-admin; Administrative tasks
button-login; Login
@@ -106,6 +108,7 @@ list-column-disk; Disk space
list-column-ram; RAM
list-column-template; Template
list-column-location; Physical location
+list-column-nodeid; Node ID
list-status-running; Running
list-status-stopped; Stopped
list-status-suspended; Suspended
diff --git a/frontend/module.admin.node.php b/frontend/module.admin.node.php
new file mode 100644
index 0000000..9de4efe
--- /dev/null
+++ b/frontend/module.admin.node.php
@@ -0,0 +1,54 @@
+uParameters[1]);
+
+ if($result = mysql_query_cached("SELECT * FROM containers WHERE `NodeId` = '{$sNode->sId}'"))
+ {
+ foreach($result->data as $row)
+ {
+ $sContainer = new Container($row);
+
+ $sContainerList[] = array(
+ 'id' => $sContainer->sId,
+ 'hostname' => $sContainer->sHostname,
+ 'node' => $sContainer->sNode->sName,
+ 'node-hostname' => $sContainer->sNode->sHostname,
+ 'template' => $sContainer->sTemplate->sName,
+ 'diskspace' => number_format($sContainer->sDiskSpace / 1024),
+ 'diskspace-unit' => "GB",
+ 'guaranteed-ram' => $sContainer->sGuaranteedRam,
+ 'guaranteed-ram-unit' => "MB",
+ 'status' => $sContainer->sStatusText,
+ 'virtualization-type' => $sContainer->sVirtualizationType
+ );
+ }
+ }
+
+ $sPageContents = Templater::AdvancedParse("admin.node", $locale->strings, array(
+ 'id' => $sNode->sId,
+ 'hostname' => $sNode->sHostname,
+ 'location' => $sNode->sPhysicalLocation,
+ 'containers' => $sContainerList
+ ));
+}
+catch (NotFoundException $e)
+{
+ $err = new CPHPErrorHandler(CPHP_ERRORHANDLER_TYPE_ERROR, $locale->strings['error-admin-node-title'], $locale->strings['error-admin-node-text']);
+ $sPageContents .= $err->Render();
+}
+
diff --git a/frontend/rewrite.php b/frontend/rewrite.php
index 100049b..97d896d 100644
--- a/frontend/rewrite.php
+++ b/frontend/rewrite.php
@@ -129,6 +129,12 @@ try
'auth_error' => "error.access.php",
'_menu' => "admin"
),
+ '^/admin/node/([0-9]+)/?$' => array(
+ 'target' => "module.admin.node.php",
+ 'authenticator' => "authenticator.admin.php",
+ 'auth_error' => "error.access.php",
+ '_menu' => "admin"
+ ),
'^/admin/container/([0-9]+)/suspend/?$' => array(
'target' => "module.admin.container.suspend.php",
'authenticator' => "authenticator.admin.php",
diff --git a/frontend/templates/admin.node.tpl b/frontend/templates/admin.node.tpl
new file mode 100644
index 0000000..bd83073
--- /dev/null
+++ b/frontend/templates/admin.node.tpl
@@ -0,0 +1,68 @@
+
{%!title-admin-nodeinfo}
+
+
+
+ {%!list-column-nodeid} |
+ {%?id} |
+
+
+ {%!list-column-hostname} |
+ {%?hostname} |
+
+
+ {%!list-column-location} |
+ {%?location} |
+
+
+
+{%!header-admin-node-containers}
+