r1316 + added an URL line
[racktables] / upgrade.php
CommitLineData
b325120a 1<?php
fbbb74fb
DO
2
3// At the moment we assume, that for any two releases we can
4// sequentally execute all batches, that separate them, and
5// nothing will break. If this changes one day, the function
6// below will have to generate smarter upgrade paths, while
7// the upper layer will remain the same.
8// Returning an empty array means that no upgrade is necessary.
9function getDBUpgradePath ($v1, $v2)
10{
11 $versionhistory = array ('0.14.4', '0.14.5', '0.14.6');
12 if (!in_array ($v1, $versionhistory) || !in_array ($v2, $versionhistory))
13 {
14 showError ("An upgrade path has been requested for versions '${v1}' and '${v2}', " .
15 "and at least one of those isn't known to me.");
16 die;
17 }
18 $skip = TRUE;
19 $path = array();
20 // Now collect all versions > $v1 and <= $v2
21 foreach ($versionhistory as $v)
22 {
23 if ($v == $v1)
24 {
25 $skip = FALSE;
26 continue;
27 }
28 if ($skip)
29 continue;
30 $path[] = $v;
31 if ($v == $v2)
32 break;
33 }
34 return $path;
35}
36
37// Upgrade batches are name exactly as the release where they first appear.
38// That simple, but seems sufficient for beginning.
39function executeUpgradeBatch ($batchid)
40{
41 $query = array();
ce109ff2 42 global $dbxlink;
fbbb74fb
DO
43 switch ($batchid)
44 {
45 case '0.14.5':
46 // We can't realiably distinguish between 0.14.4 and 0.14.5, but
47 // luckily the SQL statements below can be safely executed for both.
48
49
50 // This has to be checked once more to be sure IPAddress allocation
51 // conventions are correct.
52 $query[] = "delete from IPAddress where name = '' and reserved = 'no'";
53
54 // In the 0.14.4 release we had AUTO_INCREMENT low in the dictionary and auth
55 // data tables, thus causing new user's data to take primary keys equal to
56 // the values of shipped data in future releases. Let's shift user's data
57 // up and keep DB consistent.
58 $query[] = "alter table Attribute AUTO_INCREMENT = 10000";
59 $query[] = "alter table Chapter AUTO_INCREMENT = 10000";
60 $query[] = "alter table Dictionary AUTO_INCREMENT = 10000";
61 $query[] = "alter table UserAccount AUTO_INCREMENT = 10000";
62 $query[] = "update UserAccount set user_id = user_id + 10000 where user_id between 2 and 10000";
63 $query[] = "update UserPermission set user_id = user_id + 10000 where user_id between 2 and 10000";
64 $query[] = "update Attribute set attr_id = attr_id + 10000 where attr_id between 25 and 10000";
65 $query[] = "update AttributeMap set attr_id = attr_id + 10000 where attr_id between 25 and 10000";
66 $query[] = "update Chapter set chapter_no = chapter_no + 10000 where chapter_no between 21 and 10000";
67 $query[] = "update AttributeMap set chapter_no = chapter_no + 10000 where chapter_no between 21 and 10000";
68 break; // --------------------------------------------
69 case '0.14.6':
70 // This version features new dictionary entries, the correction above should allow us
71 // inject them w/o a problem.
72 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,25,'FreeBSD 1.x')";
73 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,26,'FreeBSD 2.x')";
74 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,27,'FreeBSD 3.x')";
75 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,28,'FreeBSD 4.x')";
76 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,29,'FreeBSD 5.x')";
77 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,30,'FreeBSD 6.x')";
78 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,31,'RHFC8')";
79 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,32,'ALTLinux Master 4.0')";
80 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (20,20)";
81 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (21,21)";
82 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (22,22)";
83 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (23,23)";
84 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (24,24)";
85 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (25,25)";
86 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (26,26)";
87 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (27,27)";
88 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (28,28)";
89 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,20,'KVM')";
90 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,21,'1000Base-ZX')";
91 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,22,'10GBase-ER')";
92 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,23,'10GBase-LR')";
93 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,24,'10GBase-LRM')";
94 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,25,'10GBase-ZR')";
95 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,26,'10GBase-LX4')";
96 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,27,'10GBase-CX4')";
97 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,28,'10GBase-Kx')";
98 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (12,114,'Cisco Catalyst 2970G-24T')";
99 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (12,115,'Cisco Catalyst 2970G-24TS')";
100 $query[] = "INSERT INTO `UserPermission` (`user_id`, `page`, `tab`, `access`) VALUES (0,'help','%','yes')";
101 // And 0.14.6 is the first release, which features Config table. Let's create
102 // and fill it with default values.
103 $query[] = "
104CREATE TABLE `Config` (
105 `varname` char(32) NOT NULL,
106 `varvalue` char(64) NOT NULL,
107 `vartype` enum('string','uint') NOT NULL default 'string',
108 `emptyok` enum('yes','no') NOT NULL default 'no',
109 `is_hidden` enum('yes','no') NOT NULL default 'yes',
110 `description` text,
111 PRIMARY KEY (`varname`)
112) ENGINE=MyISAM DEFAULT CHARSET=latin1
113 ";
114 $query[] = "INSERT INTO `Config` VALUES ('rtwidth_0','9','uint','no','yes','')";
115 $query[] = "INSERT INTO `Config` VALUES ('rtwidth_1','21','uint','no','yes','')";
116 $query[] = "INSERT INTO `Config` VALUES ('rtwidth_2','9','uint','no','yes','')";
117 $query[] = "INSERT INTO `Config` VALUES ('color_F','8fbfbf','string','no','no','HSV: 180-25-75. Free atoms, they are available for allocation to objects.')";
118 $query[] = "INSERT INTO `Config` VALUES ('color_A','bfbfbf','string','no','no','HSV: 0-0-75. Absent atoms.')";
119 $query[] = "INSERT INTO `Config` VALUES ('color_U','bf8f8f','string','no','no','HSV: 0-25-75. Unusable atoms. Some problems keep them from being free.')";
120 $query[] = "INSERT INTO `Config` VALUES ('color_T','408080','string','no','no','HSV: 180-50-50. Taken atoms, object_id should be set for such.')";
121 $query[] = "INSERT INTO `Config` VALUES ('color_Th','80ffff','string','no','no','HSV: 180-50-100. Taken atoms with highlight. They are not stored in the database and are only used for highlighting.')";
122 $query[] = "INSERT INTO `Config` VALUES ('color_Tw','804040','string','no','no','HSV: 0-50-50. Taken atoms with object problem. This is detected at runtime.')";
123 $query[] = "INSERT INTO `Config` VALUES ('color_Thw','ff8080','string','no','no','HSV: 0-50-100. An object can be both current and problematic. We run highlightObject() first and markupObjectProblems() second.')";
124 $query[] = "INSERT INTO `Config` VALUES ('default_port_type','11','uint','no','no','Default value for port type selects.')";
125 $query[] = "INSERT INTO `Config` VALUES ('MASSCOUNT','15','uint','no','no','Number of lines in object mass-adding form.')";
126 $query[] = "INSERT INTO `Config` VALUES ('MAXSELSIZE','30','uint','no','no','Maximum size of a SELECT HTML element.')";
127 $query[] = "INSERT INTO `Config` VALUES ('enterprise','MyCompanyName','string','no','no','Fit to your needs.')";
128 $query[] = "INSERT INTO `Config` VALUES ('NAMEFUL_OBJTYPES','4,7,8','string','yes','no','These are the object types, which assume a common name to be normally configured. If a name is absent for an object of one of such types, HTML output is corrected to accent this misconfiguration.')";
129 $query[] = "INSERT INTO `Config` VALUES ('ROW_SCALE','2','uint','no','no','Row-scope picture scale factor.')";
130 $query[] = "INSERT INTO `Config` VALUES ('PORTS_PER_ROW','12','uint','no','yes','Max switch port per one row on the switchvlans dynamic tab.')";
131 $query[] = "INSERT INTO `Config` VALUES ('DB_VERSION','0.14.6','string','no','yes','Database version.')";
132 break; // --------------------------------------------
803338c1 133 case '0.14.7':
ce109ff2 134 // IPAddress is hopefully fixed now finally.
803338c1 135 $query[] = "delete from IPAddress where name = '' and reserved != 'yes'";
ce109ff2
DO
136
137 // Now rebuild the dictionary into a new table with the same data,
138 // but proper indexing. We are going to convert compound index
139 // into 1-field one to employ AUTO_INCREMENT properly. This means
140 // renumbering lots of records in Dictionary and adjusting records
141 // in related tables. After that we can safely swap the tables.
142 $query[] = 'create table Dictionary_0_14_7_new (chapter_no int(10) unsigned NOT NULL, dict_key int(10) unsigned NOT NULL auto_increment PRIMARY KEY, dict_value char(128) default NULL)';
ce109ff2 143
758fe24c 144echo '<pre>';
ce109ff2
DO
145 // Find all chapter numbers, which will require AttributeValue adjustment.
146 $q2 = 'select distinct chapter_no from AttributeMap where chapter_no != 0';
147 $r2 = $dbxlink->query ($q2);
758fe24c
DO
148 $chaplist = array();
149 while ($row = $r2->fetch (PDO::FETCH_NUM))
150 $chaplist[] = $row[0];
151print_r ($chaplist);
ce109ff2 152 $r2->closeCursor();
758fe24c 153 unset ($r2);
ce109ff2
DO
154
155 $stock = array();
156 // Below I list the records, which are known to be the stock
157 // dictionary records of 0.14.6 release.
158 $stock[1] = array
159 (
160 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16
161 );
162 $stock[2] = array
163 (
164 3, 4, 5, 6, 7, 8, 9,
165 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
166 20, 21, 22, 23, 24, 25, 26, 27, 28
167 );
168 $stock[11] = array
169 (
170 1, 3, 4, 5, 6, 7, 8, 9,
171 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
172 21, 22, 24, 25, 26, 27, 28, 29,
173 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
174 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
175 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
176 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
177 70, 71, 72, 73, 74, 75, 76
178 );
179 $stock[12] = array
180 (
181 1, 11, 13, 14, 15, 16, 17, 18, 19, 20, 26, 29,
182 31, 32, 33, 34, 35, 36, 37, 38, 39,
183 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
184 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
185 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
186 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
187 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
188 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
189 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
190 110, 111, 112, 113
191 );
192 $stock[13] = array
193 (
194 1, 2, 3, 4, 5, 6, 7, 8, 9,
195 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
196 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
197 30, 31, 32
198 );
199 $stock[14] = array
200 (
201 1, 2, 9, 11, 13, 15, 19, 20, 21, 22
202 );
203 $stock[16] = array
204 (
205 1, 2, 3, 4, 5, 6, 7, 8
206 );
207 $stock[17] = array
208 (
209 1, 2, 3, 4, 5, 6, 7, 8, 9,
210 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
211 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
212 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
213 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
214 50
215 );
216 $stock[18] = array
217 (
218 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
219 );
220 $stock[19] = array
221 (
222 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
223 );
224 $stock[20] = array
225 (
226 1, 2
227 );
228
229 // Load dictionary and transform into two tree structures for
230 // stock and user record sets.
231 $dict = array();
264b07b4 232 $q3 = 'select chapter_no, dict_key, dict_value from Dictionary order by chapter_no, dict_key';
ce109ff2
DO
233 $r3 = $dbxlink->query ($q3);
234
9e7f8a4b 235 while ($row = $r3->fetch (PDO::FETCH_ASSOC))
ce109ff2
DO
236 {
237 $tree = 'user';
238 $dict_key = $row['dict_key'];
239 $chapter_no = $row['chapter_no'];
240 switch ($chapter_no)
241 {
242 case 1: // RackObjectType
243 case 2: // PortType
244 case 11: // server models
245 case 12: // network switch models
246 case 13: // server OS type
247 case 14: // network switch OS type
248 case 16: // router OS type
249 case 17: // router models
250 case 18: // disk array models
251 case 19: // tape library models
252 case 20: // Protocols
253 if (in_array ($dict_key, $stock[$chapter_no]))
254 $tree = 'stock';
255 break;
256 }
a07a39b1 257 $dict[$tree][$chapter_no][$dict_key] = array ('value' => $row['dict_value']);
ce109ff2
DO
258 }
259 $r3->closeCursor();
758fe24c 260 unset ($r3);
ce109ff2
DO
261
262
263 // Now we store stock dataset first, bump up key value and store
264 // user's data. After that we will know the new dict_key for all
265 // records.
266 // The result of both datasets processing is saved in $new_dict.
267 // Save on calling LAST_ISERT_ID() each time by keeping own key.
268 $newkey = 1;
269 $new_dict = array();
270 foreach ($dict['stock'] as $chapter_no => $words)
271 {
272 $new_dict[$chapter_no] = array();
273 foreach ($words as $dict_key => $entry)
274 {
1b5942be 275 $query[] = "insert into Dictionary_0_14_7_new (chapter_no, dict_key, dict_value) " .
ce109ff2
DO
276 "values (${chapter_no}, ${newkey}, '${entry['value']}')";
277 $new_dict[$chapter_no][$dict_key] = $entry;
278 $new_dict[$chapter_no][$dict_key]['newkey'] = $newkey;
279 $newkey++;
280 }
281 }
282 $newkey = 10000;
283 foreach ($dict['user'] as $chapter_no => $words)
284 {
285 // Some chapters may appear on the user dataset only.
286 if (!isset ($new_dict[$chapter_no]))
287 $new_dict[$chapter_no] = array();
288 foreach ($words as $dict_key => $entry)
289 {
290 $query[] = "insert into Dictionary_0_14_7_new " .
291 "values (${chapter_no}, ${newkey}, '${entry['value']}')";
292 $new_dict[$chapter_no][$dict_key] = $entry;
293 $new_dict[$chapter_no][$dict_key]['newkey'] = $newkey;
294 $newkey++;
295 }
296 }
297 // The new table should now have adequate AUTO_INCREMENT w/o our care.
758fe24c
DO
298 // Install the new data.
299 $query[] = 'drop table Dictionary';
300 $query[] = 'alter table Dictionary_0_14_7_new rename to Dictionary';
ce109ff2
DO
301
302 // Now we iterate over the joint dataset, picking some chapters and
303 // performing additional processing:
304 // 1 (RackObjectType) --- adjust RackObject and regenerate AttributeMap
a07a39b1 305 // 2 (PortType) --- adjust Port and regenerate PortCompat (at a latter point)
ce109ff2
DO
306 // 3 (RackRow) --- adjust Rack
307 // 20 (Protocols) --- adjust PortForwarding
308 // All other chapters listed in $chaplist --- adjust AttributeValue
309
310 $query[] = "delete from AttributeMap";
311 foreach ($new_dict as $chapter_no => $words)
312 {
758fe24c 313echo "Processing chapter ${chapter_no}\n";
ce109ff2
DO
314 foreach ($words as $oldkey => $data)
315 {
316 $value = $data['value'];
317 $newkey = $data['newkey'];
264b07b4
DO
318 // Even if the key doesn't change, go on to have
319 // AttributeMap regenerated completely.
758fe24c 320echo "oldkey == ${oldkey} newkey == ${newkey} value == ${value}\n";
ce109ff2
DO
321 if ($chapter_no == 1)
322 {
323 $q4 = "select id from RackObject where objtype_id = ${oldkey}";
324 $r4 = $dbxlink->query ($q4);
325 while ($row = $r4->fetch (PDO::FETCH_ASSOC))
326 $query[] = "update RackObject set objtype_id = ${newkey} where id = ${row['id']} limit 1";
327 $r4->closeCursor();
264b07b4 328 unset ($r4);
ce109ff2 329
758fe24c
DO
330 $q5 = "select attr_id, chapter_no from AttributeMap where objtype_id = ${oldkey}";
331 $r5 = $dbxlink->query ($q5);
332 while ($row = $r5->fetch (PDO::FETCH_ASSOC))
ce109ff2 333 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (${newkey}, ${row['attr_id']}, ${row['chapter_no']})";
758fe24c 334 $r5->closeCursor();
264b07b4 335 unset ($r5);
ce109ff2 336 }
a07a39b1
DO
337 elseif ($chapter_no == 2)
338 {
758fe24c 339 $q46 = "select id from Port where type = ${oldkey}";
758fe24c
DO
340 $r46 = $dbxlink->query ($q46);
341 if ($r46 == NULL)
342 echo 'ERROR';
343 while ($row = $r46->fetch (PDO::FETCH_ASSOC))
a07a39b1 344 $query[] = "update Port set type = ${newkey} where id = ${row['id']} limit 1";
758fe24c 345 $r46->closeCursor();
264b07b4 346 unset ($r46);
a07a39b1 347 }
ce109ff2
DO
348 elseif ($chapter_no == 3)
349 {
758fe24c
DO
350 $q7 = "select id from Rack where row_id = ${oldkey}";
351 $r7 = $dbxlink->query ($q7);
352 while ($row = $r7->fetch (PDO::FETCH_ASSOC))
ce109ff2 353 $query[] = "update Rack set row_id = ${newkey} where id = ${row['id']} limit 1";
758fe24c 354 $r7->closeCursor();
264b07b4 355 unset ($r7);
ce109ff2 356 }
a07a39b1
DO
357 elseif ($chapter_no == 20)
358 {
264b07b4
DO
359 $q8 = "select object_id, localip, localport, remoteip, remoteport from PortForwarding where proto = ${oldkey}";
360 $r8 = $dbxlink->query ($q8);
758fe24c 361 while ($row = $r8->fetch (PDO::FETCH_ASSOC))
264b07b4
DO
362 $query[] = "update PortForwarding set proto = ${newkey} where " .
363 "object_id = ${row['object_id']} and localip = ${row['localip']} and " .
364 "localport = ${row['localport']} and remoteip = ${row['remoteip']} and " .
365 "remoteport = ${row['remoteport']} and proto = ${oldkey} limit 1";
758fe24c 366 $r8->closeCursor();
264b07b4 367 unset ($r8);
758fe24c
DO
368 }
369 elseif (in_array ($chapter_no, $chaplist))
370 {
264b07b4
DO
371 $q81 = "select object_id, attr_id from " .
372 "AttributeValue natural join Attribute natural join AttributeMap " .
373 "inner join RackObject on RackObject.id = object_id and RackObject.objtype_id = AttributeMap.objtype_id " .
374 "where attr_type = 'dict' and chapter_no = ${chapter_no} and uint_value = ${oldkey}";
375 $r81 = $dbxlink->query ($q81);
376 while ($row = $r81->fetch (PDO::FETCH_ASSOC))
1b5942be
DO
377 $query[] = "update AttributeValue set uint_value = ${newkey} " .
378 "where object_id = ${row['object_id']} and attr_id = ${row['attr_id']}";
264b07b4
DO
379 $r81->closeCursor();
380 unset ($r81);
a07a39b1 381 }
ce109ff2
DO
382 }
383 }
a07a39b1 384 // Now it's possible to schedule PortCompat regeneration.
1b5942be
DO
385 // Convert the fields to unsigned on occasion.
386 $query[] = 'drop table PortCompat';
387 $query[] = 'create table PortCompat (type1 int(10) unsigned NOT NULL, type2 int(10) unsigned NOT NULL)';
758fe24c
DO
388 $q9 = "select type1, type2 from PortCompat";
389 $r9 = $dbxlink->query ($q9);
390 while ($row = $r9->fetch (PDO::FETCH_ASSOC))
a07a39b1
DO
391 {
392 $new_type1 = $new_dict[2][$row['type1']]['newkey'];
393 $new_type2 = $new_dict[2][$row['type2']]['newkey'];
394 $query[] = "insert into PortCompat (type1, type2) values (${new_type1}, ${new_type2})";
395 }
758fe24c 396 $r9->closeCursor();
264b07b4 397 unset ($r9);
758fe24c 398echo '</pre>';
a07a39b1
DO
399
400 // Give the configuration some finish
401 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_F'";
402 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_A'";
403 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_U'";
404 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_T'";
405 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_Th'";
406 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_Tw'";
407 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_Thw'";
408 $query[] = "update Config set description = 'Default port type' where varname = 'default_port_type'";
409 $query[] = "update Config set description = 'Picture scale for rack row display' where varname = 'ROW_SCALE'";
410 $query[] = "update Config set description = 'Organization name' where varname = 'enterprise'";
411 $query[] = "update Config set description = 'Expect common name configured for the following object types' where varname = 'NAMEFUL_OBJTYPES'";
412 $query[] = "update Config set description = '&lt;SELECT&gt; lists height' where varname = 'MAXSELSIZE'";
413 $query[] = "update Config set description = '&quot;Fast&quot; form is this many records tall' where varname = 'MASSCOUNT'";
264b07b4 414 $query[] = "update Config set is_hidden = 'no', description = 'Ports per row in VLANs tab' where varname = 'PORTS_PER_ROW'";
a07a39b1 415 $query[] = "INSERT INTO `Config` VALUES ('IPV4_ADDRS_PER_PAGE','256','uint','no','no','IPv4 addresses per page')";
9e7f8a4b 416 $query[] = "INSERT INTO `Config` VALUES ('DEFAULT_RACK_HEIGHT','42','uint','yes','no','Default rack height')";
ce109ff2
DO
417
418 // We are done.
758fe24c 419# $query[] = "update Config set varvalue = '0.14.7' where varname = 'DB_VERSION'";
803338c1 420 break; // --------------------------------------------
fbbb74fb
DO
421 default:
422 showError ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined");
423 die;
424 break;
425 }
fbbb74fb 426 $failures = array();
ce109ff2 427 $ndots = 0;
fbbb74fb 428 echo "<pre>Executing database upgrade batch '${batchid}: ";
758fe24c 429print_r ($query);
fbbb74fb
DO
430 foreach ($query as $q)
431 {
432 $result = $dbxlink->query ($q);
433 if ($result != NULL)
fbbb74fb 434 echo '.';
758fe24c
DO
435 else
436 {
437 echo '!';
438 $errorInfo = $dbxlink->errorInfo();
439 $failures[] = array ($q, $errorInfo[2]);
440 }
441 if (++$ndots == 50)
442 {
443 echo "\n";
444 $ndots = 0;
fbbb74fb 445 }
fbbb74fb
DO
446 }
447 echo '<br>';
448 if (!count ($failures))
449 echo "No errors!\n";
450 else
451 {
452 echo "The following queries failed:\n";
453 foreach ($failures as $f)
454 {
455 list ($q, $i) = $f;
456 echo "${q} // ${i}\n";
457 }
458 }
459 echo '</pre>';
460}
461
462// ******************************************************************
463//
464// Execution starts here
465//
466// ******************************************************************
467
468$root = (empty($_SERVER['HTTPS'])?'http':'https').
469 '://'.
470 (isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:($_SERVER['SERVER_NAME'].($_SERVER['SERVER_PORT']=='80'?'':$_SERVER['SERVER_PORT']))).
471 dirname($_SERVER['PHP_SELF']).'/';
472
473// The below will be necessary as long as we rely on showError()
474require_once 'inc/interface.php';
475
476require_once 'inc/config.php';
477require_once 'inc/database.php';
478if (file_exists ('inc/secret.php'))
479 require_once 'inc/secret.php';
480else
481 die ("Database connection parameters are read from inc/secret.php file, " .
482 "which cannot be found.\nCopy provided inc/secret-sample.php to " .
483 "inc/secret.php and modify to your setup.\n\nThen reload the page.");
484
485try
486{
487 $dbxlink = new PDO ($pdo_dsn, $db_username, $db_password);
488}
489catch (PDOException $e)
490{
491 die ("Database connection failed:\n\n" . $e->getMessage());
492}
493
494if (isset ($_SERVER['PHP_AUTH_USER']))
495 $_SERVER['PHP_AUTH_USER'] = escapeString ($_SERVER['PHP_AUTH_USER']);
496if (isset ($_SERVER['PHP_AUTH_PW']))
497 $_SERVER['PHP_AUTH_PW'] = escapeString ($_SERVER['PHP_AUTH_PW']);
498
499// Now we need to be sure that the current user is the administrator.
500// The rest doesn't matter within this context.
501// We still continue to use the current authenticator though, but this will
502// last only till the UserAccounts remains the same. After that this file
503// will have to dig into the DB for the user accounts.
504require_once 'inc/auth.php';
505
506// This will not fail sanely, because getUserAccounts() depends on showError()
507$accounts = getUserAccounts();
508
509// Auth prompt risk being a little broken here due to config cache absence.
510$configCache = array();
511authenticate();
512if ($accounts[$_SERVER['PHP_AUTH_USER']]['user_id'] != 1)
513 die ('You are not allowed to upgrade the database. Ask your RackTables administrator to do this.');
514
515$dbver = getDatabaseVersion();
516echo 'Code version == ' . CODE_VERSION;
517echo '<br>Database version == ' . $dbver;
518if ($dbver == CODE_VERSION)
758fe24c
DO
519{
520 executeUpgradeBatch ('0.14.7');
fbbb74fb
DO
521 die ("<p align=justify>Your database seems to be up-to-date. " .
522 "Now the best thing to do would be to follow to the <a href='${root}'>main page</a> " .
523 "and explore your data. Have a nice day.</p>");
758fe24c 524}
fbbb74fb
DO
525
526foreach (getDBUpgradePath ($dbver, CODE_VERSION) as $batchid)
527 executeUpgradeBatch ($batchid);
528
529echo '<br>Database version == ' . getDatabaseVersion();
530echo "<p align=justify>Your database seems to be up-to-date. " .
531 "Now the best thing to do would be to follow to the <a href='${root}'>main page</a> " .
532 "and explore your data. Have a nice day.</p>";
533
534?>