summaryrefslogtreecommitdiffstats
path: root/modules-available/sysconfig/install.inc.php
blob: ace5361b2e0e49dc5beee15417ef0f2a4f06c1af (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php

$update = array();

$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',
	`warnings` TEXT NOT NULL DEFAULT NULL,
	`dateline` int(10) unsigned NOT NULL DEFAULT '0',
	PRIMARY KEY (`configid`)
");

$update[] = tableCreate('configtgz_module', "
	`moduleid` int(10) unsigned NOT NULL AUTO_INCREMENT,
	`title` varchar(200) NOT NULL,
	`moduletype` varchar(16) NOT NULL,
	`filepath` varchar(250) NOT NULL,
	`contents` longblob 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`)
");

$update[] = tableCreate('configtgz_x_module', "
	`configid` int(10) unsigned NOT NULL,
	`moduleid` int(10) unsigned NOT NULL,
	PRIMARY KEY (`configid`,`moduleid`),
	KEY `moduleid` (`moduleid`)
");

$update[] = tableCreate('configtgz_location', "
	`locationid` int(11) NOT NULL,
	`configid` int(10) unsigned NOT NULL,
	PRIMARY KEY (`locationid`),
	KEY `configid` (`configid`)
");

// Constraints
$update[] = tableAddConstraint('configtgz_x_module', 'configid', 'configtgz', 'configid',
	'ON DELETE CASCADE ON UPDATE CASCADE');
$update[] = tableAddConstraint('configtgz_x_module', 'moduleid', 'configtgz_module', 'moduleid',
	'ON DELETE CASCADE ON UPDATE CASCADE');
$update[] = tableAddConstraint('configtgz_location', 'configid', 'configtgz', 'configid',
	'ON DELETE CASCADE ON UPDATE CASCADE');
// No constraint to location table since we use locationid 0 for global (NULL would require special handling for UPDATE)

// Update path

// #######################
// ##### 2014-12-12
// Rename config modules
Database::exec("UPDATE configtgz_module SET moduletype = 'Branding' WHERE moduletype = 'BRANDING'");
Database::exec("UPDATE configtgz_module SET moduletype = 'AdAuth' WHERE moduletype = 'AD_AUTH'");
Database::exec("UPDATE configtgz_module SET moduletype = 'CustomModule' WHERE moduletype = 'custom'");

// #######################
// ##### 2015-01-16
// Extend config module db tables
tableDropColumn('configtgz_module', 'haschanged');
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());
	}
	$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());
	}
	$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());
	}
	$update[] = UPDATE_DONE;
}
if (!tableHasColumn('configtgz_module', 'dateline')) {
	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('configtgz', 'dateline')) {
	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']]);
	}
}

// 2020-01-16: Change contents column type
Database::exec("ALTER TABLE `configtgz_module` CHANGE `contents` `contents` LONGBLOB NOT NULL");

// 2020-11-02: Add warnings column
if (!tableHasColumn('configtgz', 'warnings')) {
	if (Database::exec("ALTER TABLE `configtgz` ADD `warnings` TEXT NULL DEFAULT NULL") === false) {
		finalResponse(UPDATE_FAILED, 'Could not add warnings to configtgz: ' . Database::lastError());
	}
	$update[] = UPDATE_DONE;
}

// ----- rebuild configs ------
// TEMPORARY HACK; Rebuild configs.. move somewhere else?
Module::isAvailable('sysconfig');
$list = ConfigModule::getAll();
if ($list === false) {
	EventLog::warning('Could not regenerate AD/LDAP configs - please do so manually');
} else {
	foreach ($list as $ad) {
		if ($ad->needRebuild()) {
			$ad->generate(false);
		}
	}
}

// Create response for browser
responseFromArray($update);