r3628 getDomainVLANs(): rewrite query to simplify it for the server
[racktables] / upgrade.php
CommitLineData
6dc745d2 1<?php
fbbb74fb 2
90b96ff6
DO
3$relnotes = array
4(
2c9fde3a
DO
5 '0.17.0' => "LDAP options have been moved to LDAP_options array. This means, that if you were<br>" .
6 "using LDAP authentication for users in version 0.16.x, it will break right after<br>" .
aca5a846 7 "upgrade to 0.17.0. To get things working again, adjust existing secret.php file<br>" .
2c9fde3a 8 "according to secret-sample.php file provided with 0.17.0 release.<br><br>" .
204284ba 9 "Another change is the addition of support for file uploads. Files are stored<br>" .
90b96ff6 10 "in the database. There are several settings in php.ini which you may need to modify:<br>" .
4114697d
DO
11 "<ul><li>file_uploads - needs to be On</li>" .
12 "<li>upload_max_filesize - max size for uploaded files</li>" .
a476909e 13 "<li>post_max_size - max size of all form data submitted via POST (including files)</li></ul><br>" .
b82cce3f 14 "Local user accounts used to have 'enabled' flag, which allowed individual blocking and<br>" .
a476909e
DO
15 "unblocking of each. This flag was dropped in favor of existing mean of access<br>" .
16 "setup (RackCode). An unconditional denying rule is automatically added into RackCode<br>" .
17 "for such blocked account, so the effective security policy remains the same.<br>",
90b96ff6
DO
18);
19
fbbb74fb
DO
20// At the moment we assume, that for any two releases we can
21// sequentally execute all batches, that separate them, and
22// nothing will break. If this changes one day, the function
23// below will have to generate smarter upgrade paths, while
24// the upper layer will remain the same.
25// Returning an empty array means that no upgrade is necessary.
4114697d 26// Returning NULL indicates an error.
fbbb74fb
DO
27function getDBUpgradePath ($v1, $v2)
28{
a6f83a72
DO
29 $versionhistory = array
30 (
b3f866fc 31 '0.16.4',
64347dcf 32 '0.16.5',
90b96ff6 33 '0.16.6',
30d0a2a3 34 '0.17.0',
4563cecb 35 '0.17.1',
7b1a3a72 36 '0.17.2',
9e51318b 37 '0.17.3',
958ac06d 38 '0.17.4',
9f572fb5 39 '0.17.5',
63811a09 40 '0.17.6',
026a79ee 41 '0.17.7',
3540d15c 42 '0.17.8',
1e81ad97 43 '0.17.9',
f32167d2 44 '0.17.10',
9013f05b 45 '0.18.0',
a6f83a72 46 );
120e9ddd
DO
47 if (!in_array ($v1, $versionhistory) or !in_array ($v2, $versionhistory))
48 return NULL;
fbbb74fb 49 $skip = TRUE;
4114697d 50 $path = NULL;
fbbb74fb
DO
51 // Now collect all versions > $v1 and <= $v2
52 foreach ($versionhistory as $v)
53 {
4114697d 54 if ($skip and $v == $v1)
fbbb74fb
DO
55 {
56 $skip = FALSE;
4114697d 57 $path = array();
fbbb74fb
DO
58 continue;
59 }
60 if ($skip)
61 continue;
62 $path[] = $v;
63 if ($v == $v2)
64 break;
65 }
66 return $path;
67}
68
90b96ff6
DO
69// Upgrade batches are named exactly as the release where they first appear.
70// That is simple, but seems sufficient for beginning.
fbbb74fb
DO
71function executeUpgradeBatch ($batchid)
72{
73 $query = array();
ca3d68bd 74 global $dbxlink;
fbbb74fb
DO
75 switch ($batchid)
76 {
64347dcf
DO
77 case '0.16.5':
78 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4_TREE_SHOW_USAGE','yes','string','no','no','Show address usage in IPv4 tree')";
79 $query[] = "update Config set varvalue = '0.16.5' where varname = 'DB_VERSION'";
80 break;
90b96ff6
DO
81 case '0.16.6':
82 $query[] = "update Config set varvalue = '0.16.6' where varname = 'DB_VERSION'";
83 break;
30d0a2a3 84 case '0.17.0':
e1ae3fb4
AD
85 // create tables for storing files (requires InnoDB support)
86 if (!isInnoDBSupported ())
87 {
5d168fde 88 showFailure ("Cannot upgrade because InnoDB tables are not supported by your MySQL server. See the README for details.", __FILE__);
f3c50166 89 die;
e1ae3fb4 90 }
f76c4197
DY
91
92 $query[] = "alter table Chapter change chapter_no id int(10) unsigned NOT NULL auto_increment";
93 $query[] = "alter table Chapter change chapter_name name char(128) NOT NULL";
94 $query[] = "alter table Chapter drop key chapter_name";
95 $query[] = "alter table Chapter add UNIQUE KEY name (name)";
96 $query[] = "alter table Attribute change attr_id id int(10) unsigned NOT NULL auto_increment";
97 $query[] = "alter table Attribute change attr_type type enum('string','uint','float','dict') default NULL";
98 $query[] = "alter table Attribute change attr_name name char(64) default NULL";
99 $query[] = "alter table Attribute drop key attr_name";
100 $query[] = "alter table Attribute add UNIQUE KEY name (name)";
101 $query[] = "alter table AttributeMap change chapter_no chapter_id int(10) unsigned NOT NULL";
102 $query[] = "alter table Dictionary change chapter_no chapter_id int(10) unsigned NOT NULL";
3fb336f6 103 // Only after the above call it is Ok to use reloadDictionary()
ca3d68bd 104 $query = array_merge ($query, reloadDictionary ($batchid));
f3c50166 105 // schema changes for file management
e1ae3fb4
AD
106 $query[] = "
107CREATE TABLE `File` (
108 `id` int(10) unsigned NOT NULL auto_increment,
109 `name` char(255) NOT NULL,
110 `type` char(255) NOT NULL,
111 `size` int(10) unsigned NOT NULL,
112 `ctime` datetime NOT NULL,
113 `mtime` datetime NOT NULL,
114 `atime` datetime NOT NULL,
115 `contents` longblob NOT NULL,
116 `comment` text,
13edfa1c
AD
117 PRIMARY KEY (`id`),
118 UNIQUE KEY `name` (`name`)
e1ae3fb4
AD
119) ENGINE=InnoDB";
120 $query[] = "
121CREATE TABLE `FileLink` (
122 `id` int(10) unsigned NOT NULL auto_increment,
123 `file_id` int(10) unsigned NOT NULL,
124 `entity_type` enum('ipv4net','ipv4rspool','ipv4vs','object','rack','user') NOT NULL default 'object',
125 `entity_id` int(10) NOT NULL,
126 PRIMARY KEY (`id`),
af721881 127 UNIQUE KEY `FileLink-unique` (`file_id`,`entity_type`,`entity_id`),
e1ae3fb4
AD
128 KEY `FileLink-file_id` (`file_id`),
129 CONSTRAINT `FileLink-File_fkey` FOREIGN KEY (`file_id`) REFERENCES `File` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
130) ENGINE=InnoDB";
131 $query[] = "ALTER TABLE TagStorage MODIFY COLUMN target_realm enum('file','ipv4net','ipv4rspool','ipv4vs','object','rack','user') NOT NULL default 'object'";
f3c50166 132
f76c4197 133 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (24,'no','network security models')";
9730d09f 134 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (25,'no','wireless models')";
f76c4197
DY
135 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,1,0)";
136 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,2,24)";
137 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,3,0)";
138 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,5,0)";
139 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,14,0)";
140 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,16,0)";
141 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,17,0)";
142 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,18,0)";
143 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,20,0)";
144 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,21,0)";
145 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,22,0)";
146 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,24,0)";
9730d09f
DO
147 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (965,1,0)";
148 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (965,3,0)";
149 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (965,2,25)";
706ce117
DO
150 $query[] = 'alter table IPBonds rename to IPv4Allocation';
151 $query[] = 'alter table PortForwarding rename to IPv4NAT';
152 $query[] = 'alter table IPRanges rename to IPv4Network';
153 $query[] = 'alter table IPAddress rename to IPv4Address';
154 $query[] = 'alter table IPLoadBalancer rename to IPv4LB';
4114697d 155 $query[] = 'alter table IPRSPool rename to IPv4RSPool';
706ce117 156 $query[] = 'alter table IPRealServer rename to IPv4RS';
4114697d 157 $query[] = 'alter table IPVirtualService rename to IPv4VS';
120e9ddd
DO
158 $query[] = "alter table TagStorage change column target_realm entity_realm enum('file','ipv4net','ipv4vs','ipv4rspool','object','rack','user') NOT NULL default 'object'";
159 $query[] = 'alter table TagStorage change column target_id entity_id int(10) unsigned NOT NULL';
160 $query[] = 'alter table TagStorage drop key entity_tag';
161 $query[] = 'alter table TagStorage drop key target_id';
162 $query[] = 'alter table TagStorage add UNIQUE KEY `entity_tag` (`entity_realm`,`entity_id`,`tag_id`)';
163 $query[] = 'alter table TagStorage add KEY `entity_id` (`entity_id`)';
37e59768
DO
164 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_MAXCHARS','10240','uint','yes','no','Max chars for text file preview')";
165 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_ROWS','25','uint','yes','no','Rows for text file preview')";
166 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_COLS','80','uint','yes','no','Columns for text file preview')";
167 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_IMAGE_MAXPXS','320','uint','yes','no','Max pixels per axis for image file preview')";
f3d274bf 168 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('VENDOR_SIEVE','','string','yes','no','Vendor sieve configuration')";
073ed463
DO
169 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4LB_LISTSRC','{\$typeid_4}','string','yes','no','List source: IPv4 load balancers')";
170 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4OBJ_LISTSRC','{\$typeid_4} or {\$typeid_7} or {\$typeid_8} or {\$typeid_12} or {\$typeid_445} or {\$typeid_447}','string','yes','no','List source: IPv4-enabled objects')";
171 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4NAT_LISTSRC','{\$typeid_4} or {\$typeid_7} or {\$typeid_8}','string','yes','no','List source: IPv4 NAT performers')";
172 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('ASSETWARN_LISTSRC','{\$typeid_4} or {\$typeid_7} or {\$typeid_8}','string','yes','no','List source: object, for which asset tag should be set')";
173 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('NAMEWARN_LISTSRC','{\$typeid_4} or {\$typeid_7} or {\$typeid_8}','string','yes','no','List source: object, for which common name should be set')";
f5883ec1 174 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('RACKS_PER_ROW','12','unit','yes','no','Racks per row')";
590e1281 175 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_PREDICATE_SIEVE','','string','yes','no','Predicate sieve regex(7)')";
5496c89f
DO
176 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_DEFAULT_ANDOR','or','string','no','no','Default list filter boolean operation (or/and)')";
177 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_SUGGEST_ANDOR','yes','string','no','no','Suggest and/or selector in list filter')";
178 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_SUGGEST_TAGS','yes','string','no','no','Suggest tags in list filter')";
179 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_SUGGEST_PREDICATES','yes','string','no','no','Suggest predicates in list filter')";
180 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_SUGGEST_EXTRA','no','string','no','no','Suggest extra expression in list filter')";
529eac25
DO
181 $query[] = "delete from Config where varname = 'USER_AUTH_SRC'";
182 $query[] = "delete from Config where varname = 'COOKIE_TTL'";
183 $query[] = "delete from Config where varname = 'rtwidth_0'";
184 $query[] = "delete from Config where varname = 'rtwidth_1'";
185 $query[] = "delete from Config where varname = 'rtwidth_2'";
c6bc0ac5
DO
186 $query[] = "delete from Config where varname = 'NAMEFUL_OBJTYPES'";
187 $query[] = "delete from Config where varname = 'REQUIRE_ASSET_TAG_FOR'";
188 $query[] = "delete from Config where varname = 'IPV4_PERFORMERS'";
189 $query[] = "delete from Config where varname = 'NATV4_PERFORMERS'";
dbb33805 190 $query[] = "alter table TagTree add column valid_realm set('file','ipv4net','ipv4vs','ipv4rspool','object','rack','user') not null default 'file,ipv4net,ipv4vs,ipv4rspool,object,rack,user' after parent_id";
a476909e
DO
191 $result = $dbxlink->query ("select user_id, user_name, user_realname from UserAccount where user_enabled = 'no'");
192 while ($row = $result->fetch (PDO::FETCH_ASSOC))
193 $query[] = "update Script set script_text = concat('deny {\$userid_${row['user_id']}} # ${row['user_name']} (${row['user_realname']})\n', script_text) where script_name = 'RackCode'";
194 $query[] = "update Script set script_text = NULL where script_name = 'RackCodeCache'";
195 unset ($result);
79b8ad1e 196 $query[] = "alter table UserAccount drop column user_enabled";
f76c4197 197
10bac82a
DY
198 $query[] = "CREATE TABLE RackRow ( id int(10) unsigned NOT NULL auto_increment, name char(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM";
199
9f14a7ef
DY
200 $result = $dbxlink->query ("select dict_key, dict_value from Dictionary where chapter_no = 3");
201 while($row = $result->fetch(PDO::FETCH_NUM))
10bac82a 202 $query[] = "insert into RackRow set id=${row[0]}, name='${row[1]}'";
ee286837 203 unset ($result);
f76c4197 204 $query[] = "delete from Dictionary where chapter_id = 3";
c4d0dc30 205 $query[] = "delete from Chapter where id = 3";
9133d2c5
DO
206 $query[] = "
207CREATE TABLE `LDAPCache` (
208 `presented_username` char(64) NOT NULL,
209 `successful_hash` char(40) NOT NULL,
210 `first_success` timestamp NOT NULL default CURRENT_TIMESTAMP,
211 `last_retry` timestamp NOT NULL default '0000-00-00 00:00:00',
212 `displayed_name` char(128) default NULL,
213 `memberof` text,
214 UNIQUE KEY `presented_username` (`presented_username`),
215 KEY `scanidx` (`presented_username`,`successful_hash`)
216) ENGINE=InnoDB;";
3827da34 217 $query[] = "alter table UserAccount modify column user_password_hash char(40) NULL";
aa9a0fb4
DO
218 $query[] = 'ALTER TABLE Rack DROP COLUMN deleted';
219 $query[] = 'ALTER TABLE RackHistory DROP COLUMN deleted';
220 $query[] = 'ALTER TABLE RackObject DROP COLUMN deleted';
221 $query[] = 'ALTER TABLE RackObjectHistory DROP COLUMN deleted';
2fb9d280
DO
222 // Can't be added straight due to many duplicates, even in "dictbase" data.
223 $result = $dbxlink->query ('SELECT type1, type2, count(*) - 1 as excess FROM PortCompat GROUP BY type1, type2 HAVING excess > 0');
224 while ($row = $result->fetch (PDO::FETCH_ASSOC))
225 $query[] = "DELETE FROM PortCompat WHERE type1 = ${row['type1']} AND type2 = ${row['type2']} limit ${row['excess']}";
226 unset ($result);
227 $query[] = 'ALTER TABLE PortCompat DROP KEY type1';
67d8a969 228 $query[] = 'ALTER TABLE PortCompat ADD UNIQUE `type1_2` (type1, type2)';
f76c4197
DY
229 $query[] = "UPDATE Config SET varvalue = '0.17.0' WHERE varname = 'DB_VERSION'";
230
b3f866fc 231 break;
4563cecb 232 case '0.17.1':
8b200a9c 233 $query[] = "ALTER TABLE Dictionary DROP KEY `chap_to_key`";
ca3d68bd 234 $query = array_merge ($query, reloadDictionary ($batchid));
4563cecb
DO
235 // Token set has changed, so the cache isn't valid any more.
236 $query[] = "UPDATE Script SET script_text = NULL WHERE script_name = 'RackCodeCache'";
237 $query[] = "UPDATE Config SET varvalue = '0.17.1' WHERE varname = 'DB_VERSION'";
7d4ea62b 238 break;
7b1a3a72 239 case '0.17.2':
7b1a3a72 240 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (26,'no','fibre channel switch models')";
ca3d68bd 241 $query = array_merge ($query, reloadDictionary ($batchid));
7c537f33 242 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1055,2,26)";
49b605d9 243 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('DEFAULT_SNMP_COMMUNITY','public','string','no','no','Default SNMP Community string')";
29c3a4d8
DO
244 // wipe irrelevant records (ticket:250)
245 $query[] = "DELETE FROM TagStorage WHERE entity_realm = 'file' AND entity_id NOT IN (SELECT id FROM File)";
f06fe423 246 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4_ENABLE_KNIGHT','yes','string','no','no','Enable IPv4 knight feature')";
99ab184f 247 $query[] = "ALTER TABLE IPv4Network ADD COLUMN comment text AFTER name";
5163cd3a 248 $query[] = "ALTER TABLE Port ADD INDEX comment (reservation_comment)";
029a14bc
DO
249 $query[] = "ALTER TABLE Port DROP KEY l2address"; // UNIQUE
250 $query[] = "ALTER TABLE Port ADD KEY (l2address)"; // not UNIQUE
948666cc
DO
251 $query[] = "ALTER TABLE Port DROP KEY object_id";
252 $query[] = "ALTER TABLE Port ADD UNIQUE KEY per_object (object_id, name, type)";
74aee2dc
DO
253 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (20,1083)";
254 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (21,1083)";
255 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1077,1077)";
256 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1083,20)";
257 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1083,21)";
258 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1083,1083)";
1c4830dc 259 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1087,1087)";
50e02490
DO
260 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (27,'no','PDU models')";
261 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (2,2,27)";
7b1a3a72
AD
262 $query[] = "UPDATE Config SET varvalue = '0.17.2' WHERE varname = 'DB_VERSION'";
263 break;
9e51318b
DO
264 case '0.17.3':
265 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('TAGS_TOPLIST_SIZE','50','uint','yes','no','Tags top list size')";
266 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('TAGS_QUICKLIST_SIZE','20','uint','no','no','Tags quick list size')";
267 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('TAGS_QUICKLIST_THRESHOLD','50','uint','yes','no','Tags quick list threshold')";
87601bbc 268 $query[] = "ALTER TABLE AttributeMap MODIFY COLUMN chapter_id int(10) unsigned NULL";
7028a42c 269 $query[] = "UPDATE AttributeMap SET chapter_id = NULL WHERE attr_id IN (SELECT id FROM Attribute WHERE type != 'dict')";
a013838b
DO
270 // ticket:239
271 $query[] = 'UPDATE AttributeValue SET uint_value = 1018 WHERE uint_value = 731 AND attr_id IN (SELECT attr_id FROM AttributeMap WHERE chapter_id = 12)';
272 $query[] = 'DELETE FROM Dictionary WHERE dict_key = 731';
084aca6c
DO
273 $query = array_merge ($query, reloadDictionary ($batchid));
274 $query[] = "UPDATE Config SET vartype='uint' WHERE varname='RACKS_PER_ROW'";
f44fdef9 275 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('ENABLE_MULTIPORT_FORM','no','string','no','no','Enable \"Add/update multiple ports\" form')";
9e51318b
DO
276 $query[] = "UPDATE Config SET varvalue = '0.17.3' WHERE varname = 'DB_VERSION'";
277 break;
958ac06d
DO
278 case '0.17.4':
279 $query[] = "ALTER TABLE Link ENGINE=InnoDB";
280 $query[] = "ALTER TABLE Port ENGINE=InnoDB";
4d87feaf
DO
281 $query[] = "ALTER TABLE IPv4RS ENGINE=InnoDB";
282 $query[] = "ALTER TABLE IPv4RSPool ENGINE=InnoDB";
cafd4cf3
DO
283 $query[] = "ALTER TABLE AttributeValue ENGINE=InnoDB";
284 $query[] = "ALTER TABLE RackObject ENGINE=InnoDB";
285 $query[] = "ALTER TABLE IPv4NAT ENGINE=InnoDB";
286 $query[] = "ALTER TABLE IPv4LB ENGINE=InnoDB";
287 $query[] = "ALTER TABLE IPv4VS ENGINE=InnoDB";
4d87feaf 288 $query[] = "DELETE FROM IPv4RS WHERE rspool_id NOT IN (SELECT id FROM IPv4RSPool)";
958ac06d 289 $query[] = "ALTER TABLE Link ADD CONSTRAINT `Link-FK-b` FOREIGN KEY (portb) REFERENCES Port (id)";
cafd4cf3 290 $query[] = "ALTER TABLE Link ADD CONSTRAINT `Link-FK-a` FOREIGN KEY (porta) REFERENCES Port (id)";
4d87feaf 291 $query[] = "ALTER TABLE IPv4RS ADD CONSTRAINT `IPv4RS-FK` FOREIGN KEY (rspool_id) REFERENCES IPv4RSPool (id) ON DELETE CASCADE";
cafd4cf3
DO
292 $query[] = "ALTER TABLE AttributeValue ADD CONSTRAINT `AttributeValue-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id)";
293 $query[] = "ALTER TABLE IPv4NAT ADD CONSTRAINT `IPv4NAT-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id)";
294 $query[] = "ALTER TABLE Port ADD CONSTRAINT `Port-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id)";
295 $query[] = "ALTER TABLE IPv4LB ADD CONSTRAINT `IPv4LB-FK-rspool_id` FOREIGN KEY (rspool_id) REFERENCES IPv4RSPool (id)";
296 $query[] = "ALTER TABLE IPv4LB ADD CONSTRAINT `IPv4LB-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id)";
297 $query[] = "ALTER TABLE IPv4LB ADD CONSTRAINT `IPv4LB-FK-vs_id` FOREIGN KEY (vs_id) REFERENCES IPv4VS (id)";
e49d8a77 298 $query = array_merge ($query, reloadDictionary ($batchid));
958ac06d
DO
299 $query[] = "UPDATE Config SET varvalue = '0.17.4' WHERE varname = 'DB_VERSION'";
300 break;
9f572fb5
DO
301 case '0.17.5':
302 $query[] = "ALTER TABLE TagTree ENGINE=InnoDB";
303 $query[] = "ALTER TABLE TagStorage ENGINE=InnoDB";
304 $query[] = "ALTER TABLE TagStorage ADD CONSTRAINT `TagStorage-FK-tag_id` FOREIGN KEY (tag_id) REFERENCES TagTree (id)";
305 $query[] = "ALTER TABLE TagTree ADD CONSTRAINT `TagTree-K-parent_id` FOREIGN KEY (parent_id) REFERENCES TagTree (id)";
2400d7ec
DO
306 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (21,1195)';
307 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (22,1196)';
308 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (23,1196)';
309 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (20,1195)';
310 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (25,1202)';
311 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (26,1202)';
312 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (27,1204)';
313 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (28,1204)';
314 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1083,1195)';
315 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1084,1084)';
316 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1195,20)';
317 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1195,21)';
318 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1195,1083)';
319 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1195,1195)';
320 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1196,22)';
321 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1196,23)';
322 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1196,1196)';
323 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1197,1197)';
324 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1198,1199)';
325 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1199,1198)';
326 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1200,1200)';
327 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1201,1201)';
328 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1202,25)';
329 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1202,26)';
330 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1202,1202)';
331 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1203,1203)';
332 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1204,27)';
333 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1204,28)';
334 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1204,1204)';
335 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1205,1205)';
336 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1206,1207)';
337 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1207,1206)';
93a83f51 338 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1316,1316)';
bdc91a5c
DO
339 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (16, 1322)';
340 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1322, 16)';
341 $query[] = 'DELETE FROM PortCompat WHERE type1 = 16 AND type2 = 16';
2400d7ec
DO
342 for ($i = 1209; $i <= 1300; $i++)
343 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (${i}, ${i})";
d9b88ea0 344 $query[] = "
09d6afa4 345CREATE TABLE `PortInnerInterface` (
9173281a 346 `id` int(10) unsigned NOT NULL,
d9b88ea0
DO
347 `iif_name` char(16) NOT NULL,
348 PRIMARY KEY (`id`),
9173281a 349 UNIQUE KEY `iif_name` (`iif_name`)
d9b88ea0 350) ENGINE=InnoDB";
2400d7ec
DO
351 $query[] = "INSERT INTO `PortInnerInterface` VALUES (1,'hardwired')";
352 $query[] = "INSERT INTO `PortInnerInterface` VALUES (2,'SFP-100')";
353 $query[] = "INSERT INTO `PortInnerInterface` VALUES (3,'GBIC')";
354 $query[] = "INSERT INTO `PortInnerInterface` VALUES (4,'SFP-1000')";
355 $query[] = "INSERT INTO `PortInnerInterface` VALUES (5,'XENPAK')";
356 $query[] = "INSERT INTO `PortInnerInterface` VALUES (6,'X2')";
357 $query[] = "INSERT INTO `PortInnerInterface` VALUES (7,'XPAK')";
358 $query[] = "INSERT INTO `PortInnerInterface` VALUES (8,'XFP')";
359 $query[] = "INSERT INTO `PortInnerInterface` VALUES (9,'SFP+')";
d9b88ea0 360 $query[] = "
09d6afa4 361CREATE TABLE `PortInterfaceCompat` (
d9b88ea0
DO
362 `iif_id` int(10) unsigned NOT NULL,
363 `oif_id` int(10) unsigned NOT NULL,
364 UNIQUE KEY `pair` (`iif_id`,`oif_id`),
2400d7ec 365 CONSTRAINT `PortInterfaceCompat-FK-iif_id` FOREIGN KEY (`iif_id`) REFERENCES `PortInnerInterface` (`id`)
d9b88ea0 366) ENGINE=InnoDB";
c76cfa0d
DO
367 $query[] = "ALTER TABLE Port ADD COLUMN iif_id int unsigned NOT NULL AFTER name"; // will set iif_id to 0
368 $query[] = "UPDATE Port SET iif_id = 2 WHERE type = 1208";
369 $query[] = "UPDATE Port SET iif_id = 3 WHERE type = 1078";
370 $query[] = "UPDATE Port SET iif_id = 4 WHERE type = 1077";
371 $query[] = "UPDATE Port SET iif_id = 5 WHERE type = 1079";
372 $query[] = "UPDATE Port SET iif_id = 6 WHERE type = 1080";
373 $query[] = "UPDATE Port SET iif_id = 7 WHERE type = 1081";
374 $query[] = "UPDATE Port SET iif_id = 8 WHERE type = 1082";
375 $query[] = "UPDATE Port SET iif_id = 9 WHERE type = 1084";
376 $query[] = "UPDATE Port SET iif_id = 1 WHERE iif_id = 0";
08aa3467
DO
377 $query[] = 'ALTER TABLE Port ADD UNIQUE `object_iif_oif_name` (object_id, iif_id, type, name)';
378 $query[] = 'ALTER TABLE Port DROP KEY `per_object`';
2400d7ec
DO
379 $base1000 = array (24, 34, 1202, 1203, 1204, 1205, 1206, 1207);
380 $base10000 = array (30, 35, 36, 37, 38, 39, 40);
381 $PICdata = array
382 (
bdc91a5c 383 1 => array (16, 19, 24, 29, 31, 33, 446, 681, 682, 1322),
2400d7ec
DO
384 2 => array (1208, 1195, 1196, 1197, 1198, 1199, 1200, 1201),
385 3 => array_merge (array (1078), $base1000),
386 4 => array_merge (array (1077), $base1000),
387 5 => array_merge (array (1079), $base10000),
388 6 => array_merge (array (1080), $base10000),
389 7 => array_merge (array (1081), $base10000),
390 8 => array_merge (array (1082), $base10000),
391 9 => array_merge (array (1084), $base10000),
392 );
393 // make sure all IIF/OIF pairs referenced from Port exist in PortInterfaceCompat before enabling FK
394 // iif_id doesn't exist at this point
395 $result = $dbxlink->query ('SELECT DISTINCT type FROM Port WHERE type NOT IN (1208, 1078, 1077, 1079, 1080, 1081, 1082, 1084)');
396 while ($row = $result->fetch (PDO::FETCH_ASSOC))
397 if (FALSE === array_search ($row['type'], $PICdata[1]))
398 array_push ($PICdata[1], $row['type']);
399 unset ($result);
400 foreach ($PICdata as $iif_id => $oif_ids)
401 foreach ($oif_ids as $oif_id)
402 $query[] = "INSERT INTO PortInterfaceCompat (iif_id, oif_id) VALUES (${iif_id}, ${oif_id})";
c76cfa0d 403 $query[] = "ALTER TABLE Port ADD CONSTRAINT `Port-FK-iif-oif` FOREIGN KEY (`iif_id`, `type`) REFERENCES `PortInterfaceCompat` (`iif_id`, `oif_id`)";
bdc91a5c 404 $query[] = 'UPDATE Port SET type = 1322 WHERE type = 16 AND (SELECT objtype_id FROM RackObject WHERE id = object_id) IN (2, 12)';
2400d7ec
DO
405 $query = array_merge ($query, reloadDictionary ($batchid));
406 $query[] = "DELETE FROM Config WHERE varname = 'default_port_type'";
407 $query[] = "INSERT INTO Config VALUES ('DEFAULT_PORT_IIF_ID','1','uint','no','no','Default port inner interface ID')";
408 $query[] = "INSERT INTO Config VALUES ('DEFAULT_PORT_OIF_IDS','1=24; 3=1078; 4=1077; 5=1079; 6=1080; 8=1082; 9=1084','string','no','no','Default port outer interface IDs')";
4a47d34b 409 $query[] = "INSERT INTO Config VALUES ('IPV4_TREE_RTR_AS_CELL','yes','string','no','no','Show full router info for each network in IPv4 tree view')";
93a83f51 410 $query[] = "UPDATE Chapter SET name = 'PortOuterInterface' WHERE id = 2";
fbcbb4ee
DO
411 // remap refs to duplicate records, which will be discarded (ticket:286)
412 $query[] = 'UPDATE AttributeValue SET uint_value = 147 WHERE uint_value = 1020 AND attr_id = 2';
413 $query[] = 'UPDATE AttributeValue SET uint_value = 377 WHERE uint_value = 1021 AND attr_id = 2';
e8ab58e8 414 $query[] = 'INSERT INTO AttributeMap (objtype_id, attr_id) VALUES (2, 1), (2, 3), (2, 5)';
9f572fb5
DO
415 $query[] = "UPDATE Config SET varvalue = '0.17.5' WHERE varname = 'DB_VERSION'";
416 break;
63811a09
DO
417 case '0.17.6':
418 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (28,'no','Voice/video hardware')";
419 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1323,1,NULL)";
420 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1323,2,28)";
421 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1323,3,NULL)";
422 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1323,5,NULL)";
cd3775e9 423 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PROXIMITY_RANGE','0','uint','yes','no','Proximity range (0 is current rack only)')";
5c3bc8de 424 $query = array_merge ($query, reloadDictionary ($batchid));
63811a09
DO
425 $query[] = "UPDATE Config SET varvalue = '0.17.6' WHERE varname = 'DB_VERSION'";
426 break;
026a79ee
DO
427 case '0.17.7':
428 $query[] = "UPDATE Config SET varvalue = '0.17.7' WHERE varname = 'DB_VERSION'";
429 break;
3540d15c 430 case '0.17.8':
1e81ad97
DO
431 $query = array_merge ($query, reloadDictionary ($batchid));
432 $query[] = "ALTER TABLE TagTree DROP COLUMN valid_realm";
433 $query[] = "UPDATE Config SET varvalue = '0.17.8' WHERE varname = 'DB_VERSION'";
434 break;
435 case '0.17.9':
45833307 436 $query[] = "ALTER table Config add `is_userdefined` enum('yes','no') NOT NULL default 'no' AFTER `is_hidden`";
3540d15c
DY
437 $query[] = "
438CREATE TABLE `UserConfig` (
439 `varname` char(32) NOT NULL,
440 `varvalue` char(255) NOT NULL,
441 `user` char(64) NOT NULL,
442 UNIQUE KEY `user_varname` (`user`,`varname`)
443) TYPE=InnoDB";
1e81ad97
DO
444 $query[] = "UPDATE Config SET is_userdefined = 'yes' WHERE varname IN
445(
446'MASSCOUNT',
447'MAXSELSIZE',
448'ROW_SCALE',
449'PORTS_PER_ROW',
450'IPV4_ADDRS_PER_PAGE',
451'DEFAULT_RACK_HEIGHT',
452'DEFAULT_SLB_VS_PORT',
453'DEFAULT_SLB_RS_PORT',
454'DETECT_URLS',
455'RACK_PRESELECT_THRESHOLD',
456'DEFAULT_IPV4_RS_INSERVICE',
457'DEFAULT_OBJECT_TYPE',
458'SHOW_EXPLICIT_TAGS',
459'SHOW_IMPLICIT_TAGS',
460'SHOW_AUTOMATIC_TAGS',
461'IPV4_AUTO_RELEASE',
462'SHOW_LAST_TAB',
463'EXT_IPV4_VIEW',
464'TREE_THRESHOLD',
465'ADDNEW_AT_TOP',
466'IPV4_TREE_SHOW_USAGE',
467'PREVIEW_TEXT_MAXCHARS',
468'PREVIEW_TEXT_ROWS',
469'PREVIEW_TEXT_COLS',
470'PREVIEW_IMAGE_MAXPXS',
471'VENDOR_SIEVE',
472'RACKS_PER_ROW'
473)";
ca4eb604 474 $query[] = "INSERT INTO Config VLAUES ('IPV4_TREE_SHOW_VLAN','yes','string','no','no','yes','Show VLAN for each network in IPv4 tree')";
9013f05b
DO
475 $query[] = "UPDATE Config SET varvalue = '0.17.9' WHERE varname = 'DB_VERSION'";
476 break;
f32167d2
DO
477 case '0.17.10':
478 $query = array_merge ($query, reloadDictionary ($batchid));
4368cc45 479 $query[] = "ALTER TABLE MountOperation ADD KEY (object_id)";
2926b1cb 480 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('STATIC_FILTER','yes','string','no','no','yes','Enable Filter Caching');";
f32167d2 481 $query[] = "UPDATE Config SET varvalue = '0.17.10' WHERE varname = 'DB_VERSION'";
a1fc539a
RF
482 case '0.17.11':
483 $query = array_merge ($query, reloadDictionary ($batchid));
484 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('ENABLE_BULKPORT_FORM','yes','string','no','no','yes','Enable \"Bulk Port\" form');";
485 $query[] = "UPDATE Config SET varvalue = '0.17.11' WHERE varname = 'DB_VERSION'";
a0cb8451 486 $query[] = "DELETE attributevalue FROM attributevalue join attribute where attributevalue.attr_id = attribute.id and attribute.`type` = 'dict' and attributevalue.uint_value = 0;";
9013f05b 487 case '0.18.0':
ad9da675 488 $query = array_merge ($query, reloadDictionary ($batchid));
8bb69a06
DO
489 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('VLANSWITCH_LISTSRC', '', 'string', 'yes', 'no', 'yes', 'List of VLAN running switches')";
490 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('VLANIPV4NET_LISTSRC', '', 'string', 'yes', 'no', 'yes', 'List of VLAN-based IPv4 networks')";
491 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('DEFAULT_VDOM_ID','','uint','yes','no','yes','Default VLAN domain ID')";
492 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('DEFAULT_VST_ID','','uint','yes','no','yes','Default VLAN switch template ID')";
37cb9e18
DO
493 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('8021Q_DEPLOY_MINAGE','300','uint','no','no','no','802.1Q deploy minimum age')";
494 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('8021Q_DEPLOY_MAXAGE','3600','uint','no','no','no','802.1Q deploy maximum age')";
495 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('8021Q_DEPLOY_RETRY','10800','uint','no','no','no','802.1Q deploy retry timer')";
407ed7bb 496 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('8021Q_WRI_AFTER_CONFT','no','string','no','no','no','802.1Q: save device configuration after deploy')";
4492050b 497 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('8021Q_INSTANT_DEPLOY','no','string','no','no','yes','802.1Q: instant deploy')";
1768cc35 498 $query[] = "ALTER TABLE IPv4Network ENGINE=InnoDB";
d1e2dafb 499 // FIXME: add tables CachedPAV, CachedPNV, CachedPVM, PortAllowedVLAN, PortNativeVLAN, PortVLANMode, VLANDescription, VLANDomain, VLANIPv4, VLANSTRule, VLANSwitch, VLANSwitchTemplate, VLANValidID
fa11e5c7
DO
500 for ($i = 1; $i <= 4094; $i++)
501 usePreparedInsertBlade ('VLANValidID', array ('vlan_id' => $i));
9013f05b 502 $query[] = "UPDATE Config SET varvalue = '0.18.0' WHERE varname = 'DB_VERSION'";
fbbb74fb 503 default:
5d168fde 504 showFailure ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined", __FILE__);
fbbb74fb
DO
505 die;
506 break;
507 }
fbbb74fb 508 $failures = array();
4114697d 509 echo "<tr><th>Executing batch '${batchid}'</th><td>";
fbbb74fb
DO
510 foreach ($query as $q)
511 {
512 $result = $dbxlink->query ($q);
4114697d 513 if ($result == NULL)
758fe24c 514 {
758fe24c
DO
515 $errorInfo = $dbxlink->errorInfo();
516 $failures[] = array ($q, $errorInfo[2]);
517 }
fbbb74fb 518 }
fbbb74fb 519 if (!count ($failures))
4114697d 520 echo "<strong><font color=green>done</font></strong>";
fbbb74fb
DO
521 else
522 {
4114697d 523 echo "<strong><font color=red>The following queries failed:</font></strong><br><pre>";
fbbb74fb
DO
524 foreach ($failures as $f)
525 {
526 list ($q, $i) = $f;
4114697d 527 echo "${q} -- ${i}\n";
fbbb74fb 528 }
4114697d 529 echo "</pre>";
fbbb74fb 530 }
4114697d 531 echo '</td></tr>';
fbbb74fb
DO
532}
533
534// ******************************************************************
535//
536// Execution starts here
537//
538// ******************************************************************
539
5d168fde
DO
540// a clone of showError() to drop dependency on interface.php
541function showFailure ($info = '', $location = 'N/A')
542{
5d168fde
DO
543 if (preg_match ('/\.php$/', $location))
544 $location = basename ($location);
545 elseif ($location != 'N/A')
546 $location = $location . '()';
547 echo "<div class=msg_error>An error has occured in [${location}]. ";
548 if (empty ($info))
549 echo 'No additional information is available.';
550 else
551 echo "Additional information:<br><p>\n<pre>\n${info}\n</pre></p>";
552 echo "This failure is most probably fatal.<br></div>\n";
553}
554
555require_once 'inc/config.php'; // for CODE_VERSION
556require_once 'inc/database.php'; // for getDatabaseVersion()
3fb336f6 557require_once 'inc/dictionary.php';
5d168fde
DO
558// Enforce default value for now, releases prior to 0.17.0 didn't support 'httpd' auth source.
559$user_auth_src = 'database';
fbbb74fb 560
80138748
DO
561if (file_exists ('inc/secret.php'))
562 require_once 'inc/secret.php';
fbbb74fb 563else
80138748
DO
564 die ("Database connection parameters are read from inc/secret.php file, " .
565 "which cannot be found.\nCopy provided inc/secret-sample.php to " .
566 "inc/secret.php and modify to your setup.\n\nThen reload the page.");
fbbb74fb
DO
567
568try
569{
570 $dbxlink = new PDO ($pdo_dsn, $db_username, $db_password);
571}
572catch (PDOException $e)
573{
574 die ("Database connection failed:\n\n" . $e->getMessage());
575}
576
fbbb74fb
DO
577// Now we need to be sure that the current user is the administrator.
578// The rest doesn't matter within this context.
fbbb74fb 579
120e9ddd 580function authenticate_admin ($username, $password)
a1f3710a 581{
43c7895d 582 global $dbxlink;
93bdb7ba 583 $hash = sha1 ($password);
120e9ddd 584 $query = "select count(*) from UserAccount where user_id = 1 and user_name = '${username}' and user_password_hash = '${hash}'";
a1f3710a
DO
585 if (($result = $dbxlink->query ($query)) == NULL)
586 die ('SQL query failed in ' . __FUNCTION__);
120e9ddd 587 $rows = $result->fetchAll (PDO::FETCH_NUM);
43c7895d 588 return $rows[0][0] == 1;
a1f3710a
DO
589}
590
204284ba 591switch ($user_auth_src)
99ee5479 592{
120e9ddd
DO
593 case 'database':
594 case 'ldap': // authenticate against DB as well
595 if
596 (
597 !isset ($_SERVER['PHP_AUTH_USER']) or
598 !strlen ($_SERVER['PHP_AUTH_USER']) or
599 !isset ($_SERVER['PHP_AUTH_PW']) or
600 !strlen ($_SERVER['PHP_AUTH_PW']) or
601 !authenticate_admin (escapeString ($_SERVER['PHP_AUTH_USER']), escapeString ($_SERVER['PHP_AUTH_PW']))
602 )
603 {
604 header ('WWW-Authenticate: Basic realm="RackTables upgrade"');
605 header ('HTTP/1.0 401 Unauthorized');
33bbd712 606 showFailure ('You must be authenticated as an administrator to complete the upgrade.', __FILE__);
120e9ddd
DO
607 die;
608 }
609 break; // cleared
610 case 'httpd':
611 if
612 (
613 !isset ($_SERVER['REMOTE_USER']) or
614 !strlen ($_SERVER['REMOTE_USER'])
615 )
616 {
33bbd712 617 showFailure ('System misconfiguration. The web-server didn\'t authenticate the user, although ought to do.');
120e9ddd
DO
618 die;
619 }
620 break; // cleared
621 default:
33bbd712 622 showFailure ('authentication source misconfiguration', __FILE__);
120e9ddd 623 die;
99ee5479 624}
fbbb74fb
DO
625
626$dbver = getDatabaseVersion();
4114697d
DO
627echo '<table border=1>';
628echo "<tr><th>Current status</th><td>Data version: ${dbver}<br>Code version: " . CODE_VERSION . "</td></tr>\n";
629
630$path = getDBUpgradePath ($dbver, CODE_VERSION);
631if ($path === NULL)
758fe24c 632{
4114697d 633 echo "<tr><th>Upgrade path</th><td><font color=red>not found</font></td></tr>\n";
d74ae24c
DO
634 echo "<tr><th>Summary</th><td>Check README for more information. RackTables releases prior to 0.16.4 ";
635 echo "must be upgraded to 0.16.4 first.</td></tr>\n";
758fe24c 636}
4114697d 637else
5f4027b8 638{
4114697d
DO
639 if (!count ($path))
640 echo "<tr><th>Summary</th><td>Come back later.</td></tr>\n";
641 else
642 {
643 echo "<tr><th>Upgrade path</th><td>${dbver} &rarr; " . implode (' &rarr; ', $path) . "</td></tr>\n";
644 foreach ($path as $batchid)
645 {
646 executeUpgradeBatch ($batchid);
647 if (isset ($relnotes[$batchid]))
648 echo "<tr><th>Release notes for ${batchid}</th><td>" . $relnotes[$batchid] . "</td></tr>\n";
649 }
790a60e8 650 echo "<tr><th>Summary</th><td>Upgrade complete, it is Ok to <a href='index.php'>enter</a> the system.</td></tr>\n";
4114697d 651 }
5f4027b8 652}
4114697d 653echo '</table>';
fbbb74fb
DO
654
655?>