Commit | Line | Data |
---|---|---|
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. | |
9 | function 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. | |
39 | function 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[] = " | |
104 | CREATE 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[] = " |
143 | CREATE 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 | 153 | echo '<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 | 405 | echo '</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 = '<SELECT> lists height' where varname = 'MAXSELSIZE'"; | |
420 | $query[] = "update Config set description = '"Fast" 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; // -------------------------------------------- |
fbbb74fb DO |
548 | default: |
549 | showError ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined"); | |
550 | die; | |
551 | break; | |
552 | } | |
fbbb74fb | 553 | $failures = array(); |
ce109ff2 | 554 | $ndots = 0; |
9bf70f70 | 555 | echo "<pre>Executing database upgrade batch '${batchid}:\n"; |
fbbb74fb DO |
556 | foreach ($query as $q) |
557 | { | |
558 | $result = $dbxlink->query ($q); | |
559 | if ($result != NULL) | |
fbbb74fb | 560 | echo '.'; |
758fe24c DO |
561 | else |
562 | { | |
563 | echo '!'; | |
564 | $errorInfo = $dbxlink->errorInfo(); | |
565 | $failures[] = array ($q, $errorInfo[2]); | |
566 | } | |
567 | if (++$ndots == 50) | |
568 | { | |
569 | echo "\n"; | |
15a50768 | 570 | flush(); |
758fe24c | 571 | $ndots = 0; |
fbbb74fb | 572 | } |
fbbb74fb DO |
573 | } |
574 | echo '<br>'; | |
575 | if (!count ($failures)) | |
576 | echo "No errors!\n"; | |
577 | else | |
578 | { | |
579 | echo "The following queries failed:\n"; | |
580 | foreach ($failures as $f) | |
581 | { | |
582 | list ($q, $i) = $f; | |
583 | echo "${q} // ${i}\n"; | |
584 | } | |
585 | } | |
586 | echo '</pre>'; | |
587 | } | |
588 | ||
589 | // ****************************************************************** | |
590 | // | |
591 | // Execution starts here | |
592 | // | |
593 | // ****************************************************************** | |
594 | ||
595 | $root = (empty($_SERVER['HTTPS'])?'http':'https'). | |
596 | '://'. | |
597 | (isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:($_SERVER['SERVER_NAME'].($_SERVER['SERVER_PORT']=='80'?'':$_SERVER['SERVER_PORT']))). | |
54c2a7a8 DO |
598 | dirname($_SERVER['PHP_SELF']); |
599 | if (substr ($root, -1) != '/') | |
600 | $root .= '/'; | |
fbbb74fb DO |
601 | |
602 | // The below will be necessary as long as we rely on showError() | |
603 | require_once 'inc/interface.php'; | |
604 | ||
605 | require_once 'inc/config.php'; | |
606 | require_once 'inc/database.php'; | |
607 | if (file_exists ('inc/secret.php')) | |
608 | require_once 'inc/secret.php'; | |
609 | else | |
610 | die ("Database connection parameters are read from inc/secret.php file, " . | |
611 | "which cannot be found.\nCopy provided inc/secret-sample.php to " . | |
612 | "inc/secret.php and modify to your setup.\n\nThen reload the page."); | |
613 | ||
614 | try | |
615 | { | |
616 | $dbxlink = new PDO ($pdo_dsn, $db_username, $db_password); | |
617 | } | |
618 | catch (PDOException $e) | |
619 | { | |
620 | die ("Database connection failed:\n\n" . $e->getMessage()); | |
621 | } | |
622 | ||
623 | if (isset ($_SERVER['PHP_AUTH_USER'])) | |
624 | $_SERVER['PHP_AUTH_USER'] = escapeString ($_SERVER['PHP_AUTH_USER']); | |
625 | if (isset ($_SERVER['PHP_AUTH_PW'])) | |
626 | $_SERVER['PHP_AUTH_PW'] = escapeString ($_SERVER['PHP_AUTH_PW']); | |
627 | ||
628 | // Now we need to be sure that the current user is the administrator. | |
629 | // The rest doesn't matter within this context. | |
630 | // We still continue to use the current authenticator though, but this will | |
631 | // last only till the UserAccounts remains the same. After that this file | |
632 | // will have to dig into the DB for the user accounts. | |
633 | require_once 'inc/auth.php'; | |
634 | ||
635 | // This will not fail sanely, because getUserAccounts() depends on showError() | |
636 | $accounts = getUserAccounts(); | |
637 | ||
638 | // Auth prompt risk being a little broken here due to config cache absence. | |
639 | $configCache = array(); | |
640 | authenticate(); | |
641 | if ($accounts[$_SERVER['PHP_AUTH_USER']]['user_id'] != 1) | |
642 | die ('You are not allowed to upgrade the database. Ask your RackTables administrator to do this.'); | |
643 | ||
644 | $dbver = getDatabaseVersion(); | |
645 | echo 'Code version == ' . CODE_VERSION; | |
646 | echo '<br>Database version == ' . $dbver; | |
647 | if ($dbver == CODE_VERSION) | |
758fe24c | 648 | { |
fbbb74fb DO |
649 | die ("<p align=justify>Your database seems to be up-to-date. " . |
650 | "Now the best thing to do would be to follow to the <a href='${root}'>main page</a> " . | |
651 | "and explore your data. Have a nice day.</p>"); | |
758fe24c | 652 | } |
fbbb74fb DO |
653 | |
654 | foreach (getDBUpgradePath ($dbver, CODE_VERSION) as $batchid) | |
655 | executeUpgradeBatch ($batchid); | |
656 | ||
657 | echo '<br>Database version == ' . getDatabaseVersion(); | |
658 | echo "<p align=justify>Your database seems to be up-to-date. " . | |
659 | "Now the best thing to do would be to follow to the <a href='${root}'>main page</a> " . | |
660 | "and explore your data. Have a nice day.</p>"; | |
661 | ||
662 | ?> |