summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2019-03-21 13:48:57 +0100
committerSimon Rettberg2019-03-21 13:48:57 +0100
commit84c110647b84fc29fb8443d088c710ba8ecf42fe (patch)
tree953f30dfbb2fcb0f5ad1ec4c7f68f667bdded94f
parent[serversetup-bwlp-ipxe] Fix stdbootentry edit; fix duplicate id in html (diff)
downloadslx-admin-84c110647b84fc29fb8443d088c710ba8ecf42fe.tar.gz
slx-admin-84c110647b84fc29fb8443d088c710ba8ecf42fe.tar.xz
slx-admin-84c110647b84fc29fb8443d088c710ba8ecf42fe.zip
[sysconfig] Remember last modified date, show as tooltip
-rw-r--r--modules-available/sysconfig/inc/configmodule.inc.php26
-rw-r--r--modules-available/sysconfig/inc/configtgz.inc.php10
-rw-r--r--modules-available/sysconfig/install.inc.php57
-rw-r--r--modules-available/sysconfig/page.inc.php17
-rw-r--r--modules-available/sysconfig/templates/list-configs.html2
-rw-r--r--modules-available/sysconfig/templates/list-modules.html4
6 files changed, 81 insertions, 35 deletions
diff --git a/modules-available/sysconfig/inc/configmodule.inc.php b/modules-available/sysconfig/inc/configmodule.inc.php
index b6db9c4f..cc6b31f5 100644
--- a/modules-available/sysconfig/inc/configmodule.inc.php
+++ b/modules-available/sysconfig/inc/configmodule.inc.php
@@ -15,6 +15,10 @@ abstract class ConfigModule
private $moduleArchive = false;
private $moduleTitle = false;
private $moduleStatus = false;
+ /**
+ * @var int
+ */
+ private $dateline = 0;
private $currentVersion = 0;
/**
* @var false|array Data of module, false if not initialized
@@ -110,6 +114,7 @@ abstract class ConfigModule
$instance->moduleId = $dbRow['moduleid'];
$instance->moduleTitle = $dbRow['title'];
$instance->moduleStatus = $dbRow['status'];
+ $instance->dateline = $dbRow['dateline'];
if ($instance->moduleVersion() > $instance->currentVersion) {
$instance->markFailed();
}
@@ -140,9 +145,9 @@ abstract class ConfigModule
public static function getAll($moduleType = false)
{
if ($moduleType === false) {
- $ret = Database::simpleQuery("SELECT moduleid, title, moduletype, filepath, contents, version, status FROM configtgz_module");
+ $ret = Database::simpleQuery("SELECT moduleid, title, moduletype, filepath, contents, version, status, dateline FROM configtgz_module");
} else {
- $ret = Database::simpleQuery("SELECT moduleid, title, moduletype, filepath, contents, version, status FROM configtgz_module "
+ $ret = Database::simpleQuery("SELECT moduleid, title, moduletype, filepath, contents, version, status, dateline FROM configtgz_module "
. " WHERE moduletype = :moduletype", array('moduletype' => $moduleType));
}
if ($ret === false)
@@ -290,13 +295,14 @@ abstract class ConfigModule
return false;
$this->moduleTitle = $title;
// Insert
- Database::exec("INSERT INTO configtgz_module (title, moduletype, filepath, contents, version, status) "
- . " VALUES (:title, :type, '', :contents, :version, :status)", array(
+ Database::exec("INSERT INTO configtgz_module (title, moduletype, filepath, contents, version, status, dateline) "
+ . " VALUES (:title, :type, '', :contents, :version, :status, :now)", array(
'title' => $title,
'type' => $this->moduleType(),
'contents' => json_encode($this->moduleData),
'version' => 0,
- 'status' => 'MISSING'
+ 'status' => 'MISSING',
+ 'now' => time(),
));
$this->moduleId = Database::lastInsertId();
if (!is_numeric($this->moduleId))
@@ -324,12 +330,13 @@ abstract class ConfigModule
if (!$this->validateConfig())
return false;
// Update
- Database::exec("UPDATE configtgz_module SET title = :title, contents = :contents, status = :status "
+ Database::exec("UPDATE configtgz_module SET title = :title, contents = :contents, status = :status, dateline = :now "
. " WHERE moduleid = :moduleid LIMIT 1", array(
'moduleid' => $this->moduleId,
'title' => $title,
'contents' => json_encode($this->moduleData),
- 'status' => 'OUTDATED'
+ 'status' => 'OUTDATED',
+ 'now' => time(),
));
return true;
}
@@ -463,6 +470,11 @@ abstract class ConfigModule
)) !== false;
}
+ public function dateline_s()
+ {
+ return Util::prettyTime($this->dateline);
+ }
+
################# Callbacks ##############
/**
diff --git a/modules-available/sysconfig/inc/configtgz.inc.php b/modules-available/sysconfig/inc/configtgz.inc.php
index 7b042cdb..374cb5e0 100644
--- a/modules-available/sysconfig/inc/configtgz.inc.php
+++ b/modules-available/sysconfig/inc/configtgz.inc.php
@@ -75,10 +75,11 @@ class ConfigTgz
$this->modules[] = $row;
}
// Update name
- Database::exec("UPDATE configtgz SET title = :title, status = :status WHERE configid = :configid LIMIT 1", array(
+ Database::exec("UPDATE configtgz SET title = :title, status = :status, dateline = :now WHERE configid = :configid LIMIT 1", array(
'configid' => $this->configId,
'title' => $title,
- 'status' => 'OUTDATED'
+ 'status' => 'OUTDATED',
+ 'now' => time(),
));
return true;
}
@@ -277,10 +278,11 @@ class ConfigTgz
do {
$instance->file = CONFIG_TGZ_LIST_DIR . '/config-' . Util::sanitizeFilename($instance->configTitle) . '-' . mt_rand() . '-' . time() . '.tgz';
} while (file_exists($instance->file));
- Database::exec("INSERT INTO configtgz (title, filepath, status) VALUES (:title, :filepath, :status)", array(
+ Database::exec("INSERT INTO configtgz (title, filepath, status, dateline) VALUES (:title, :filepath, :status, :now)", array(
'title' => $instance->configTitle,
'filepath' => $instance->file,
- 'status' => 'MISSING'
+ 'status' => 'MISSING',
+ 'now' => time(),
));
$instance->configId = Database::lastInsertId();
$instance->modules = array();
diff --git a/modules-available/sysconfig/install.inc.php b/modules-available/sysconfig/install.inc.php
index 3e99b777..f402f217 100644
--- a/modules-available/sysconfig/install.inc.php
+++ b/modules-available/sysconfig/install.inc.php
@@ -1,16 +1,17 @@
<?php
-$res = array();
+$update = array();
-$res[] = tableCreate('configtgz', "
+$update[] = tableCreate('configtgz', "
`configid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) NOT NULL,
`filepath` varchar(255) NOT NULL,
`status` enum('OK','OUTDATED','MISSING') NOT NULL DEFAULT 'MISSING',
+ `dateline` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`configid`)
");
-$res[] = tableCreate('configtgz_module', "
+$update[] = tableCreate('configtgz_module', "
`moduleid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) NOT NULL,
`moduletype` varchar(16) NOT NULL,
@@ -18,19 +19,20 @@ $res[] = tableCreate('configtgz_module', "
`contents` text NOT NULL,
`version` int(10) unsigned NOT NULL DEFAULT '0',
`status` enum('OK','MISSING','OUTDATED') NOT NULL DEFAULT 'MISSING',
+ `dateline` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`moduleid`),
KEY `title` (`title`),
KEY `moduletype` (`moduletype`,`title`)
");
-$res[] = tableCreate('configtgz_x_module', "
+$update[] = tableCreate('configtgz_x_module', "
`configid` int(10) unsigned NOT NULL,
`moduleid` int(10) unsigned NOT NULL,
PRIMARY KEY (`configid`,`moduleid`),
KEY `moduleid` (`moduleid`)
");
-$res[] = tableCreate('configtgz_location', "
+$update[] = tableCreate('configtgz_location', "
`locationid` int(11) NOT NULL,
`configid` int(10) unsigned NOT NULL,
PRIMARY KEY (`locationid`),
@@ -38,13 +40,13 @@ $res[] = tableCreate('configtgz_location', "
");
// Constraints
-if (in_array(UPDATE_DONE, $res)) {
+if (in_array(UPDATE_DONE, $update)) {
// To self
- $res[] = tableAddConstraint('configtgz_x_module', 'configid', 'configtgz', 'configid',
+ $update[] = tableAddConstraint('configtgz_x_module', 'configid', 'configtgz', 'configid',
'');
- $res[] = tableAddConstraint('configtgz_x_module', 'moduleid', 'configtgz_module', 'moduleid',
+ $update[] = tableAddConstraint('configtgz_x_module', 'moduleid', 'configtgz_module', 'moduleid',
'');
- $res[] = tableAddConstraint('configtgz_location', 'configid', 'configtgz', 'configid',
+ $update[] = tableAddConstraint('configtgz_location', 'configid', 'configtgz', 'configid',
'ON DELETE CASCADE ON UPDATE CASCADE');
}
@@ -65,22 +67,49 @@ if (!tableHasColumn('configtgz_module', 'version')) {
if (Database::exec("ALTER TABLE `configtgz_module` ADD `version` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'") === false) {
finalResponse(UPDATE_FAILED, 'Could not add version to configtgz_module: ' . Database::lastError());
}
- $res[] = UPDATE_DONE;
+ $update[] = UPDATE_DONE;
}
if (!tableHasColumn('configtgz_module', 'status')) {
if (Database::exec("ALTER TABLE `configtgz_module` ADD `status` ENUM( 'OK', 'MISSING', 'OUTDATED' ) NOT NULL DEFAULT 'MISSING'") === false) {
finalResponse(UPDATE_FAILED, 'Could not add status to configtgz_module: ' . Database::lastError());
}
- $res[] = UPDATE_DONE;
+ $update[] = UPDATE_DONE;
}
if (!tableHasColumn('configtgz', 'status')) {
if (Database::exec("ALTER TABLE `configtgz` ADD `status` ENUM( 'OK', 'OUTDATED', 'MISSING' ) NOT NULL DEFAULT 'MISSING'") === false) {
finalResponse(UPDATE_FAILED, 'Could not add status to configtgz: ' . Database::lastError());
}
- $res[] = UPDATE_DONE;
+ $update[] = UPDATE_DONE;
+}
+if (!tableHasColumn('dateline', 'configtgz_module')) {
+ if (Database::exec("ALTER TABLE `configtgz_module` ADD `dateline` int(10) unsigned NOT NULL DEFAULT '0'") === false) {
+ finalResponse(UPDATE_FAILED, 'Could not add dateline to configtgz_module: ' . Database::lastError());
+ }
+ $update[] = UPDATE_DONE;
+ // Infer from module's filemtime
+ $res = Database::simpleQuery('SELECT moduleid, filepath FROM configtgz_module');
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ Database::exec('UPDATE configtgz_module SET dateline = :mtime WHERE moduleid = :moduleid',
+ ['moduleid' => $row['moduleid'], 'mtime' => filemtime($row['filepath'])]);
+ }
+}
+if (!tableHasColumn('dateline', 'configtgz')) {
+ if (Database::exec("ALTER TABLE `configtgz` ADD `dateline` int(10) unsigned NOT NULL DEFAULT '0'") === false) {
+ finalResponse(UPDATE_FAILED, 'Could not add dateline to configtgz: ' . Database::lastError());
+ }
+ $update[] = UPDATE_DONE;
+ // Infer from latest module (since module injection by slx-admin modules would alter the timestamp)
+ $res = Database::simpleQuery('SELECT c.configid, Max(m.dateline) AS dateline FROM configtgz c
+ INNER JOIN configtgz_x_module cxm USING (configid)
+ INNER JOIN configtgz_module m USING (moduleid)
+ GROUP BY configid');
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ Database::exec('UPDATE configtgz SET dateline = :mtime WHERE configid = :configid',
+ ['configid' => $row['configid'], 'mtime' => $row['dateline']]);
+ }
}
-// ----- rebuild AD configs ------
+// ----- rebuild configs ------
// TEMPORARY HACK; Rebuild configs.. move somewhere else?
Module::isAvailable('sysconfig');
$list = ConfigModule::getAll();
@@ -95,4 +124,4 @@ if ($list === false) {
}
// Create response for browser
-responseFromArray($res);
+responseFromArray($update);
diff --git a/modules-available/sysconfig/page.inc.php b/modules-available/sysconfig/page.inc.php
index 515d432c..05a83924 100644
--- a/modules-available/sysconfig/page.inc.php
+++ b/modules-available/sysconfig/page.inc.php
@@ -213,13 +213,13 @@ class Page_SysConfig extends Page
private function listConfigs()
{
// Configs
- $res = Database::simpleQuery("SELECT c.configid, c.title, c.filepath, c.status,"
- . " GROUP_CONCAT(DISTINCT cl.locationid) AS loclist, GROUP_CONCAT(cxm.moduleid) AS modlist"
- . " FROM configtgz c"
- . " LEFT JOIN configtgz_x_module cxm USING (configid)"
- . " LEFT JOIN configtgz_location cl ON (c.configid = cl.configid)"
- . " GROUP BY configid"
- . " ORDER BY title ASC");
+ $res = Database::simpleQuery("SELECT c.configid, c.title, c.filepath, c.status, c.dateline,
+ GROUP_CONCAT(DISTINCT cl.locationid) AS loclist, GROUP_CONCAT(cxm.moduleid) AS modlist
+ FROM configtgz c
+ LEFT JOIN configtgz_x_module cxm USING (configid)
+ LEFT JOIN configtgz_location cl ON (c.configid = cl.configid)
+ GROUP BY configid
+ ORDER BY title ASC");
$configs = array();
if ($this->currentLoc !== 0) {
$locationName = $this->locations[$this->currentLoc]['locationname'];
@@ -254,7 +254,8 @@ class Page_SysConfig extends Page
'loclist' => $row['loclist'],
'readableLocList' => $this->getLocationNames($this->locations, $locList),
'locationCount' => $locCount,
- 'needrebuild' => ($row['status'] !== 'OK')
+ 'needrebuild' => ($row['status'] !== 'OK'),
+ 'dateline_s' => Util::prettyTime($row['dateline']),
);
}
$data = array(
diff --git a/modules-available/sysconfig/templates/list-configs.html b/modules-available/sysconfig/templates/list-configs.html
index 4db7b9b2..fe882c43 100644
--- a/modules-available/sysconfig/templates/list-configs.html
+++ b/modules-available/sysconfig/templates/list-configs.html
@@ -21,7 +21,7 @@
<table id="conftable" class="slx-table table-hover" style="width:100%">
{{#configs}}
<tr>
- <td data-id="{{configid}}" data-modlist="{{modlist}}" class="confrow slx-pointer" width="100%">
+ <td data-id="{{configid}}" data-modlist="{{modlist}}" class="confrow slx-pointer" width="100%" title="{{dateline_s}}">
<table class="slx-ellipsis"><tr><td>{{config}}</td></tr></table>
</td>
<td>
diff --git a/modules-available/sysconfig/templates/list-modules.html b/modules-available/sysconfig/templates/list-modules.html
index c657eae8..c9400696 100644
--- a/modules-available/sysconfig/templates/list-modules.html
+++ b/modules-available/sysconfig/templates/list-modules.html
@@ -12,7 +12,9 @@
{{#modules}}
<tr>
<td class="badge text-nowrap">{{moduleType}}</td>
- <td data-id="{{id}}" class="modrow slx-pointer" width="100%"><table class="slx-ellipsis"><tr><td>{{title}}</td></tr></table></td>
+ <td data-id="{{id}}" class="modrow slx-pointer" width="100%" title="{{dateline_s}}">
+ <table class="slx-ellipsis"><tr><td>{{title}}</td></tr></table>
+ </td>
<td class="text-nowrap">
{{#allowDownload}}
<button class="btn btn-default btn-xs" name="list" value="{{id}}" title="{{lang_show}}"><span class="glyphicon glyphicon-eye-open"></span></button>