r1362 + fix Port and Link tables: use unsigned integers for foreign key reference...
[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{
8a60bcf0 11 $versionhistory = array ('0.14.4', '0.14.5', '0.14.6', '0.14.7');
fbbb74fb
DO
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.
9bf70f70
DO
142 $query[] = "
143CREATE TABLE `Dictionary_0_14_7_new` (
144 `chapter_no` int(10) unsigned NOT NULL,
145 `dict_key` int(10) unsigned NOT NULL auto_increment,
146 `dict_value` char(128) default NULL,
147 PRIMARY KEY (`dict_key`),
148 UNIQUE KEY `chap_to_key` (`chapter_no`,`dict_key`),
149 UNIQUE KEY `chap_to_val` (`chapter_no`,`dict_value`)
150) TYPE=MyISAM AUTO_INCREMENT=50000
151";
ce109ff2 152
758fe24c 153echo '<pre>';
ce109ff2
DO
154 // Find all chapter numbers, which will require AttributeValue adjustment.
155 $q2 = 'select distinct chapter_no from AttributeMap where chapter_no != 0';
156 $r2 = $dbxlink->query ($q2);
758fe24c
DO
157 $chaplist = array();
158 while ($row = $r2->fetch (PDO::FETCH_NUM))
159 $chaplist[] = $row[0];
ce109ff2 160 $r2->closeCursor();
758fe24c 161 unset ($r2);
ce109ff2
DO
162
163 $stock = array();
164 // Below I list the records, which are known to be the stock
165 // dictionary records of 0.14.6 release.
166 $stock[1] = array
167 (
168 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16
169 );
170 $stock[2] = array
171 (
172 3, 4, 5, 6, 7, 8, 9,
173 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
174 20, 21, 22, 23, 24, 25, 26, 27, 28
175 );
176 $stock[11] = array
177 (
178 1, 3, 4, 5, 6, 7, 8, 9,
179 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
180 21, 22, 24, 25, 26, 27, 28, 29,
181 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
182 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
183 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
184 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
185 70, 71, 72, 73, 74, 75, 76
186 );
187 $stock[12] = array
188 (
189 1, 11, 13, 14, 15, 16, 17, 18, 19, 20, 26, 29,
190 31, 32, 33, 34, 35, 36, 37, 38, 39,
191 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
192 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
193 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
194 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
195 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
196 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
197 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
db1147d2 198 110, 111, 112, 113, 114, 115
ce109ff2
DO
199 );
200 $stock[13] = array
201 (
202 1, 2, 3, 4, 5, 6, 7, 8, 9,
203 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
204 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
205 30, 31, 32
206 );
207 $stock[14] = array
208 (
209 1, 2, 9, 11, 13, 15, 19, 20, 21, 22
210 );
211 $stock[16] = array
212 (
213 1, 2, 3, 4, 5, 6, 7, 8
214 );
215 $stock[17] = array
216 (
217 1, 2, 3, 4, 5, 6, 7, 8, 9,
218 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
219 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
220 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
221 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
222 50
223 );
224 $stock[18] = array
225 (
226 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
227 );
228 $stock[19] = array
229 (
230 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
231 );
232 $stock[20] = array
233 (
234 1, 2
235 );
236
237 // Load dictionary and transform into two tree structures for
238 // stock and user record sets.
239 $dict = array();
264b07b4 240 $q3 = 'select chapter_no, dict_key, dict_value from Dictionary order by chapter_no, dict_key';
ce109ff2
DO
241 $r3 = $dbxlink->query ($q3);
242
9e7f8a4b 243 while ($row = $r3->fetch (PDO::FETCH_ASSOC))
ce109ff2
DO
244 {
245 $tree = 'user';
246 $dict_key = $row['dict_key'];
247 $chapter_no = $row['chapter_no'];
248 switch ($chapter_no)
249 {
250 case 1: // RackObjectType
251 case 2: // PortType
252 case 11: // server models
253 case 12: // network switch models
254 case 13: // server OS type
255 case 14: // network switch OS type
256 case 16: // router OS type
257 case 17: // router models
258 case 18: // disk array models
259 case 19: // tape library models
260 case 20: // Protocols
261 if (in_array ($dict_key, $stock[$chapter_no]))
262 $tree = 'stock';
263 break;
264 }
a07a39b1 265 $dict[$tree][$chapter_no][$dict_key] = array ('value' => $row['dict_value']);
ce109ff2
DO
266 }
267 $r3->closeCursor();
758fe24c 268 unset ($r3);
ce109ff2
DO
269
270
271 // Now we store stock dataset first, bump up key value and store
272 // user's data. After that we will know the new dict_key for all
273 // records.
274 // The result of both datasets processing is saved in $new_dict.
275 // Save on calling LAST_ISERT_ID() each time by keeping own key.
276 $newkey = 1;
277 $new_dict = array();
278 foreach ($dict['stock'] as $chapter_no => $words)
279 {
280 $new_dict[$chapter_no] = array();
281 foreach ($words as $dict_key => $entry)
282 {
1b5942be 283 $query[] = "insert into Dictionary_0_14_7_new (chapter_no, dict_key, dict_value) " .
ce109ff2
DO
284 "values (${chapter_no}, ${newkey}, '${entry['value']}')";
285 $new_dict[$chapter_no][$dict_key] = $entry;
286 $new_dict[$chapter_no][$dict_key]['newkey'] = $newkey;
287 $newkey++;
288 }
289 }
e7882270 290 $newkey = 50000;
ce109ff2
DO
291 foreach ($dict['user'] as $chapter_no => $words)
292 {
293 // Some chapters may appear on the user dataset only.
294 if (!isset ($new_dict[$chapter_no]))
295 $new_dict[$chapter_no] = array();
296 foreach ($words as $dict_key => $entry)
297 {
298 $query[] = "insert into Dictionary_0_14_7_new " .
299 "values (${chapter_no}, ${newkey}, '${entry['value']}')";
300 $new_dict[$chapter_no][$dict_key] = $entry;
301 $new_dict[$chapter_no][$dict_key]['newkey'] = $newkey;
302 $newkey++;
303 }
304 }
305 // The new table should now have adequate AUTO_INCREMENT w/o our care.
758fe24c
DO
306 // Install the new data.
307 $query[] = 'drop table Dictionary';
308 $query[] = 'alter table Dictionary_0_14_7_new rename to Dictionary';
ce109ff2
DO
309
310 // Now we iterate over the joint dataset, picking some chapters and
311 // performing additional processing:
312 // 1 (RackObjectType) --- adjust RackObject and regenerate AttributeMap
a07a39b1 313 // 2 (PortType) --- adjust Port and regenerate PortCompat (at a latter point)
ce109ff2
DO
314 // 3 (RackRow) --- adjust Rack
315 // 20 (Protocols) --- adjust PortForwarding
316 // All other chapters listed in $chaplist --- adjust AttributeValue
317
318 $query[] = "delete from AttributeMap";
319 foreach ($new_dict as $chapter_no => $words)
320 {
321 foreach ($words as $oldkey => $data)
322 {
323 $value = $data['value'];
324 $newkey = $data['newkey'];
264b07b4
DO
325 // Even if the key doesn't change, go on to have
326 // AttributeMap regenerated completely.
9bf70f70 327#echo "oldkey == ${oldkey} newkey == ${newkey} value == ${value}\n";
ce109ff2
DO
328 if ($chapter_no == 1)
329 {
330 $q4 = "select id from RackObject where objtype_id = ${oldkey}";
331 $r4 = $dbxlink->query ($q4);
332 while ($row = $r4->fetch (PDO::FETCH_ASSOC))
333 $query[] = "update RackObject set objtype_id = ${newkey} where id = ${row['id']} limit 1";
334 $r4->closeCursor();
264b07b4 335 unset ($r4);
ce109ff2 336
758fe24c
DO
337 $q5 = "select attr_id, chapter_no from AttributeMap where objtype_id = ${oldkey}";
338 $r5 = $dbxlink->query ($q5);
339 while ($row = $r5->fetch (PDO::FETCH_ASSOC))
ce109ff2 340 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (${newkey}, ${row['attr_id']}, ${row['chapter_no']})";
758fe24c 341 $r5->closeCursor();
264b07b4 342 unset ($r5);
ce109ff2 343 }
a07a39b1
DO
344 elseif ($chapter_no == 2)
345 {
758fe24c 346 $q46 = "select id from Port where type = ${oldkey}";
758fe24c
DO
347 $r46 = $dbxlink->query ($q46);
348 if ($r46 == NULL)
349 echo 'ERROR';
350 while ($row = $r46->fetch (PDO::FETCH_ASSOC))
a07a39b1 351 $query[] = "update Port set type = ${newkey} where id = ${row['id']} limit 1";
758fe24c 352 $r46->closeCursor();
264b07b4 353 unset ($r46);
a07a39b1 354 }
ce109ff2
DO
355 elseif ($chapter_no == 3)
356 {
758fe24c
DO
357 $q7 = "select id from Rack where row_id = ${oldkey}";
358 $r7 = $dbxlink->query ($q7);
359 while ($row = $r7->fetch (PDO::FETCH_ASSOC))
ce109ff2 360 $query[] = "update Rack set row_id = ${newkey} where id = ${row['id']} limit 1";
758fe24c 361 $r7->closeCursor();
264b07b4 362 unset ($r7);
ce109ff2 363 }
a07a39b1
DO
364 elseif ($chapter_no == 20)
365 {
264b07b4
DO
366 $q8 = "select object_id, localip, localport, remoteip, remoteport from PortForwarding where proto = ${oldkey}";
367 $r8 = $dbxlink->query ($q8);
758fe24c 368 while ($row = $r8->fetch (PDO::FETCH_ASSOC))
264b07b4
DO
369 $query[] = "update PortForwarding set proto = ${newkey} where " .
370 "object_id = ${row['object_id']} and localip = ${row['localip']} and " .
371 "localport = ${row['localport']} and remoteip = ${row['remoteip']} and " .
372 "remoteport = ${row['remoteport']} and proto = ${oldkey} limit 1";
758fe24c 373 $r8->closeCursor();
264b07b4 374 unset ($r8);
758fe24c
DO
375 }
376 elseif (in_array ($chapter_no, $chaplist))
377 {
5b1d68c5 378 $q81 = "select object_id, AttributeValue.attr_id from " .
264b07b4
DO
379 "AttributeValue natural join Attribute natural join AttributeMap " .
380 "inner join RackObject on RackObject.id = object_id and RackObject.objtype_id = AttributeMap.objtype_id " .
381 "where attr_type = 'dict' and chapter_no = ${chapter_no} and uint_value = ${oldkey}";
382 $r81 = $dbxlink->query ($q81);
383 while ($row = $r81->fetch (PDO::FETCH_ASSOC))
1b5942be
DO
384 $query[] = "update AttributeValue set uint_value = ${newkey} " .
385 "where object_id = ${row['object_id']} and attr_id = ${row['attr_id']}";
264b07b4
DO
386 $r81->closeCursor();
387 unset ($r81);
a07a39b1 388 }
ce109ff2
DO
389 }
390 }
a07a39b1 391 // Now it's possible to schedule PortCompat regeneration.
1b5942be
DO
392 // Convert the fields to unsigned on occasion.
393 $query[] = 'drop table PortCompat';
394 $query[] = 'create table PortCompat (type1 int(10) unsigned NOT NULL, type2 int(10) unsigned NOT NULL)';
758fe24c
DO
395 $q9 = "select type1, type2 from PortCompat";
396 $r9 = $dbxlink->query ($q9);
397 while ($row = $r9->fetch (PDO::FETCH_ASSOC))
a07a39b1
DO
398 {
399 $new_type1 = $new_dict[2][$row['type1']]['newkey'];
400 $new_type2 = $new_dict[2][$row['type2']]['newkey'];
401 $query[] = "insert into PortCompat (type1, type2) values (${new_type1}, ${new_type2})";
402 }
758fe24c 403 $r9->closeCursor();
264b07b4 404 unset ($r9);
758fe24c 405echo '</pre>';
a07a39b1
DO
406
407 // Give the configuration some finish
408 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_F'";
409 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_A'";
410 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_U'";
411 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_T'";
412 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_Th'";
413 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_Tw'";
414 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_Thw'";
415 $query[] = "update Config set description = 'Default port type' where varname = 'default_port_type'";
416 $query[] = "update Config set description = 'Picture scale for rack row display' where varname = 'ROW_SCALE'";
417 $query[] = "update Config set description = 'Organization name' where varname = 'enterprise'";
418 $query[] = "update Config set description = 'Expect common name configured for the following object types' where varname = 'NAMEFUL_OBJTYPES'";
419 $query[] = "update Config set description = '&lt;SELECT&gt; lists height' where varname = 'MAXSELSIZE'";
420 $query[] = "update Config set description = '&quot;Fast&quot; form is this many records tall' where varname = 'MASSCOUNT'";
264b07b4 421 $query[] = "update Config set is_hidden = 'no', description = 'Ports per row in VLANs tab' where varname = 'PORTS_PER_ROW'";
a07a39b1 422 $query[] = "INSERT INTO `Config` VALUES ('IPV4_ADDRS_PER_PAGE','256','uint','no','no','IPv4 addresses per page')";
9e7f8a4b 423 $query[] = "INSERT INTO `Config` VALUES ('DEFAULT_RACK_HEIGHT','42','uint','yes','no','Default rack height')";
bd912758
DO
424 // After Dictionary transformation we ought to list 337 stock records in DB. Add more.
425 $new_words = array();
426 $new_words[338] = array (12 => 'Dell PowerConnect 2216');
427 $new_words[] = array (12 => 'Dell PowerConnect 2224');
428 $new_words[] = array (12 => 'Dell PowerConnect 2324');
429 $new_words[] = array (12 => 'Dell PowerConnect 2708');
430 $new_words[] = array (12 => 'Dell PowerConnect 2716');
431 $new_words[] = array (12 => 'Dell PowerConnect 2724');
432 $new_words[] = array (12 => 'Dell PowerConnect 2748');
433 $new_words[] = array (12 => 'Dell PowerConnect 3424');
434 $new_words[] = array (12 => 'Dell PowerConnect 3424P');
435 $new_words[] = array (12 => 'Dell PowerConnect 3448');
436 $new_words[] = array (12 => 'Dell PowerConnect 3448P');
437 $new_words[] = array (12 => 'Dell PowerConnect 5324');
438 $new_words[] = array (12 => 'Dell PowerConnect 6224');
439 $new_words[] = array (12 => 'Dell PowerConnect 6224P');
440 $new_words[] = array (12 => 'Dell PowerConnect 6224F');
441 $new_words[] = array (12 => 'Dell PowerConnect 6248');
442 $new_words[] = array (12 => 'Dell PowerConnect 6248P');
443 $new_words[] = array (11 => 'Dell PowerEdge 6850');
444 $new_words[] = array (11 => 'Dell PowerEdge 6950');
445 $new_words[] = array (11 => 'Dell PowerEdge R900');
446 $new_words[] = array (11 => 'Dell PowerEdge 4400');
447 $new_words[] = array (11 => 'Dell PowerEdge 2650');
448 $new_words[] = array (11 => 'Dell PowerEdge 2550');
449 $new_words[] = array (11 => 'Dell PowerEdge 750');
450 $new_words[] = array (11 => 'Dell PowerEdge 2450');
451 $new_words[] = array (11 => 'Dell PowerEdge 850');
452 $new_words[] = array (11 => 'Dell PowerEdge 1850');
453 $new_words[] = array (11 => 'Dell PowerEdge 860');
454 $new_words[] = array (11 => 'Dell PowerEdge 2900');
455 $new_words[] = array (11 => 'Dell PowerEdge 2970');
456 $new_words[] = array (11 => 'Dell PowerEdge SC1435');
457 $new_words[] = array (12 => 'Cisco Catalyst 6509');
458 $new_words[] = array (12 => 'Cisco ME 6524GS-8S');
459 $new_words[] = array (12 => 'Cisco ME 6524GT-8S');
460 $new_words[] = array (12 => 'Cisco Catalyst 4503-E');
461 $new_words[] = array (12 => 'Cisco Catalyst 4506-E');
462 $new_words[] = array (12 => 'Cisco Catalyst 4507R-E');
463 $new_words[] = array (12 => 'Cisco Catalyst 4510R-E');
464 $new_words[] = array (12 => 'Cisco Catalyst 3750-24TE-M');
465 $new_words[] = array (12 => 'Cisco Catalyst 4948-10GE');
466 $new_words[] = array (12 => 'Cisco ME 4924-10GE');
467 $new_words[] = array (12 => 'Cisco Catalyst 2960-24');
468 $new_words[] = array (12 => 'Cisco Catalyst 2950-24');
469 $new_words[] = array (12 => 'Cisco Catalyst 2950-12');
470 $new_words[] = array (12 => 'Cisco Catalyst 2950C-24');
471 $new_words[] = array (12 => 'Cisco Catalyst 2950G-24-DC');
472 $new_words[] = array (12 => 'Cisco Catalyst 2950SX-48');
473 $new_words[] = array (12 => 'Cisco Catalyst 2950SX-24');
474 $new_words[] = array (12 => 'Cisco Catalyst 2950T-24');
475 $new_words[] = array (12 => 'Cisco Catalyst 2950T-48');
476 $new_words[] = array (12 => 'Cisco Catalyst 2950G-12');
477 $new_words[] = array (12 => 'Cisco Catalyst 2950G-24');
478 $new_words[] = array (12 => 'Cisco Catalyst 2950G-48');
bd912758
DO
479 $new_words[] = array (12 => 'Cisco Catalyst 3508G XL');
480 $new_words[] = array (12 => 'Cisco Catalyst 3512 XL');
481 $new_words[] = array (12 => 'Cisco Catalyst 3524 XL');
482 $new_words[] = array (12 => 'Cisco Catalyst 3524 PWR XL');
483 $new_words[] = array (12 => 'Cisco Catalyst 3548 XL');
484 $new_words[] = array (12 => 'Cisco ME 2400-24TS-A');
485 $new_words[] = array (12 => 'Cisco ME 2400-24TS-D');
486 $new_words[] = array (12 => 'Cisco Catalyst 3550-12T');
487 $new_words[] = array (12 => 'Cisco Catalyst 3550-12G');
488 $new_words[] = array (12 => 'Cisco Catalyst 3550-24');
489 $new_words[] = array (12 => 'Cisco Catalyst 3550-24 FX');
490 $new_words[] = array (12 => 'Cisco Catalyst 3550-24 DC');
491 $new_words[] = array (12 => 'Cisco Catalyst 3550-24 PWR');
492 $new_words[] = array (12 => 'Cisco Catalyst 3550-48');
493 $new_words[] = array (12 => 'Cisco ME 3400G-12CS-A');
494 $new_words[] = array (12 => 'Cisco ME 3400G-12CS-D');
495 $new_words[] = array (12 => 'Cisco ME 3400G-2CS-A');
496 $new_words[] = array (12 => 'Cisco ME 3400-24TS-A');
497 $new_words[] = array (12 => 'Cisco ME 3400-24TS-D');
498 $new_words[] = array (12 => 'Cisco ME 3400-24FS-A');
7373a304
DO
499 $new_words[] = array (12 => 'Foundry FastIron GS 624XGP');
500 $new_words[] = array (12 => 'Foundry FastIron GS 624XGP-POE');
501 $new_words[] = array (12 => 'Foundry FastIron LS 624');
502 $new_words[] = array (12 => 'Foundry FastIron LS 648');
503 $new_words[] = array (12 => 'Foundry NetIron M2404F');
504 $new_words[] = array (12 => 'Foundry NetIron M2404C');
505 $new_words[] = array (17 => 'Foundry BigIron RX-32');
e7882270
DO
506 $new_words[] = array (13 => 'Debian 2.0 (hamm)');
507 $new_words[] = array (13 => 'Debian 2.1 (slink)');
508 $new_words[] = array (13 => 'Debian 2.2 (potato)');
509 $new_words[] = array (13 => 'Debian 4.0 (etch)');
510 $new_words[] = array (13 => 'ALTLinux Server 4.0');
e7882270
DO
511 $new_words[] = array (13 => 'ALTLinux Sisyphus');
512 $new_words[] = array (13 => 'openSUSE 10.0');
513 $new_words[] = array (13 => 'openSUSE 10.1');
514 $new_words[] = array (13 => 'openSUSE 10.2');
515 $new_words[] = array (13 => 'openSUSE 10.3');
516 $new_words[] = array (13 => 'Ubuntu 4.10');
517 $new_words[] = array (13 => 'Ubuntu 5.04');
518 $new_words[] = array (13 => 'Ubuntu 5.10');
519 $new_words[] = array (13 => 'Ubuntu 6.06 LTS');
520 $new_words[] = array (13 => 'Ubuntu 6.10');
521 $new_words[] = array (13 => 'Ubuntu 7.04');
522 $new_words[] = array (13 => 'Ubuntu 7.10');
523 $new_words[] = array (13 => 'Ubuntu 8.04 LTS');
524 $new_words[] = array (13 => 'RHEL5');
5f58747d
DO
525 $new_words[] = array (18 => 'Dell PowerVault 210S');
526 $new_words[] = array (18 => 'Dell PowerVault 221S');
ab0ec3ef
DO
527 $new_words[] = array (2 => 'dry contact');
528 $new_words[] = array (2 => 'unknown');
499dfa73
DO
529 // Two above records ought to take keys 439 and 440.
530 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (439,439)";
efb6bab4
DO
531 $new_words[] = array (13 => 'CentOS-2');
532 $new_words[] = array (13 => 'CentOS-3');
533 $new_words[] = array (13 => 'CentOS-4');
534 $new_words[] = array (13 => 'CentOS-5');
ce109ff2 535
bd912758
DO
536
537
538 foreach ($new_words as $dict_key => $tmp)
539 foreach ($tmp as $chapter_no => $dict_value)
540 $query[] = 'INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) ' .
541 "VALUES (${chapter_no}, ${dict_key}, '${dict_value}')";
57913f20
DO
542 // Resetting to defaults is worse, than remapping, but better than
543 // leaving messed values.
544 $query[] = "update Config set varvalue = '24' where varname = 'default_port_type' limit 1";
ce109ff2 545 // We are done.
54c2a7a8 546 $query[] = "update Config set varvalue = '0.14.7' where varname = 'DB_VERSION'";
803338c1 547 break; // --------------------------------------------
a6305acc
DO
548 case '0.14.8':
549 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('REQUIRE_ASSET_TAG_FOR','4,7,8','string','yes','no','Require asset tag for the following object types')";
550 break; // --------------------------------------------
fbbb74fb
DO
551 default:
552 showError ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined");
553 die;
554 break;
555 }
fbbb74fb 556 $failures = array();
ce109ff2 557 $ndots = 0;
9bf70f70 558 echo "<pre>Executing database upgrade batch '${batchid}:\n";
fbbb74fb
DO
559 foreach ($query as $q)
560 {
561 $result = $dbxlink->query ($q);
562 if ($result != NULL)
fbbb74fb 563 echo '.';
758fe24c
DO
564 else
565 {
566 echo '!';
567 $errorInfo = $dbxlink->errorInfo();
568 $failures[] = array ($q, $errorInfo[2]);
569 }
570 if (++$ndots == 50)
571 {
572 echo "\n";
15a50768 573 flush();
758fe24c 574 $ndots = 0;
fbbb74fb 575 }
fbbb74fb
DO
576 }
577 echo '<br>';
578 if (!count ($failures))
579 echo "No errors!\n";
580 else
581 {
582 echo "The following queries failed:\n";
583 foreach ($failures as $f)
584 {
585 list ($q, $i) = $f;
586 echo "${q} // ${i}\n";
587 }
588 }
589 echo '</pre>';
590}
591
592// ******************************************************************
593//
594// Execution starts here
595//
596// ******************************************************************
597
598$root = (empty($_SERVER['HTTPS'])?'http':'https').
599 '://'.
600 (isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:($_SERVER['SERVER_NAME'].($_SERVER['SERVER_PORT']=='80'?'':$_SERVER['SERVER_PORT']))).
54c2a7a8
DO
601 dirname($_SERVER['PHP_SELF']);
602if (substr ($root, -1) != '/')
603 $root .= '/';
fbbb74fb
DO
604
605// The below will be necessary as long as we rely on showError()
606require_once 'inc/interface.php';
607
608require_once 'inc/config.php';
609require_once 'inc/database.php';
610if (file_exists ('inc/secret.php'))
611 require_once 'inc/secret.php';
612else
613 die ("Database connection parameters are read from inc/secret.php file, " .
614 "which cannot be found.\nCopy provided inc/secret-sample.php to " .
615 "inc/secret.php and modify to your setup.\n\nThen reload the page.");
616
617try
618{
619 $dbxlink = new PDO ($pdo_dsn, $db_username, $db_password);
620}
621catch (PDOException $e)
622{
623 die ("Database connection failed:\n\n" . $e->getMessage());
624}
625
626if (isset ($_SERVER['PHP_AUTH_USER']))
627 $_SERVER['PHP_AUTH_USER'] = escapeString ($_SERVER['PHP_AUTH_USER']);
628if (isset ($_SERVER['PHP_AUTH_PW']))
629 $_SERVER['PHP_AUTH_PW'] = escapeString ($_SERVER['PHP_AUTH_PW']);
630
631// Now we need to be sure that the current user is the administrator.
632// The rest doesn't matter within this context.
633// We still continue to use the current authenticator though, but this will
634// last only till the UserAccounts remains the same. After that this file
635// will have to dig into the DB for the user accounts.
636require_once 'inc/auth.php';
637
638// This will not fail sanely, because getUserAccounts() depends on showError()
639$accounts = getUserAccounts();
640
641// Auth prompt risk being a little broken here due to config cache absence.
642$configCache = array();
643authenticate();
644if ($accounts[$_SERVER['PHP_AUTH_USER']]['user_id'] != 1)
645 die ('You are not allowed to upgrade the database. Ask your RackTables administrator to do this.');
646
647$dbver = getDatabaseVersion();
648echo 'Code version == ' . CODE_VERSION;
649echo '<br>Database version == ' . $dbver;
650if ($dbver == CODE_VERSION)
758fe24c 651{
fbbb74fb
DO
652 die ("<p align=justify>Your database seems to be up-to-date. " .
653 "Now the best thing to do would be to follow to the <a href='${root}'>main page</a> " .
654 "and explore your data. Have a nice day.</p>");
758fe24c 655}
fbbb74fb
DO
656
657foreach (getDBUpgradePath ($dbver, CODE_VERSION) as $batchid)
658 executeUpgradeBatch ($batchid);
659
660echo '<br>Database version == ' . getDatabaseVersion();
661echo "<p align=justify>Your database seems to be up-to-date. " .
662 "Now the best thing to do would be to follow to the <a href='${root}'>main page</a> " .
663 "and explore your data. Have a nice day.</p>";
664
665?>