r1812 + generalise tag storage and handling; prepare to introduce tags for other...
[racktables] / upgrade.php
CommitLineData
71f42cdb 1s<?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{
a6f83a72
DO
11 $versionhistory = array
12 (
13 '0.14.4',
14 '0.14.5',
15 '0.14.6',
16 '0.14.7',
17 '0.14.8',
18 '0.14.9',
2ff234d6 19 '0.14.10',
2c53a252 20 '0.14.11',
86fc1740
DO
21 '0.14.12',
22 '0.14.13'
a6f83a72 23 );
fbbb74fb
DO
24 if (!in_array ($v1, $versionhistory) || !in_array ($v2, $versionhistory))
25 {
26 showError ("An upgrade path has been requested for versions '${v1}' and '${v2}', " .
27 "and at least one of those isn't known to me.");
28 die;
29 }
30 $skip = TRUE;
31 $path = array();
32 // Now collect all versions > $v1 and <= $v2
33 foreach ($versionhistory as $v)
34 {
35 if ($v == $v1)
36 {
37 $skip = FALSE;
38 continue;
39 }
40 if ($skip)
41 continue;
42 $path[] = $v;
43 if ($v == $v2)
44 break;
45 }
46 return $path;
47}
48
49// Upgrade batches are name exactly as the release where they first appear.
50// That simple, but seems sufficient for beginning.
51function executeUpgradeBatch ($batchid)
52{
53 $query = array();
ce109ff2 54 global $dbxlink;
fbbb74fb
DO
55 switch ($batchid)
56 {
57 case '0.14.5':
58 // We can't realiably distinguish between 0.14.4 and 0.14.5, but
59 // luckily the SQL statements below can be safely executed for both.
60
61
62 // This has to be checked once more to be sure IPAddress allocation
63 // conventions are correct.
64 $query[] = "delete from IPAddress where name = '' and reserved = 'no'";
65
66 // In the 0.14.4 release we had AUTO_INCREMENT low in the dictionary and auth
67 // data tables, thus causing new user's data to take primary keys equal to
68 // the values of shipped data in future releases. Let's shift user's data
69 // up and keep DB consistent.
70 $query[] = "alter table Attribute AUTO_INCREMENT = 10000";
71 $query[] = "alter table Chapter AUTO_INCREMENT = 10000";
72 $query[] = "alter table Dictionary AUTO_INCREMENT = 10000";
73 $query[] = "alter table UserAccount AUTO_INCREMENT = 10000";
74 $query[] = "update UserAccount set user_id = user_id + 10000 where user_id between 2 and 10000";
75 $query[] = "update UserPermission set user_id = user_id + 10000 where user_id between 2 and 10000";
76 $query[] = "update Attribute set attr_id = attr_id + 10000 where attr_id between 25 and 10000";
77 $query[] = "update AttributeMap set attr_id = attr_id + 10000 where attr_id between 25 and 10000";
78 $query[] = "update Chapter set chapter_no = chapter_no + 10000 where chapter_no between 21 and 10000";
79 $query[] = "update AttributeMap set chapter_no = chapter_no + 10000 where chapter_no between 21 and 10000";
80 break; // --------------------------------------------
81 case '0.14.6':
82 // This version features new dictionary entries, the correction above should allow us
83 // inject them w/o a problem.
84 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,25,'FreeBSD 1.x')";
85 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,26,'FreeBSD 2.x')";
86 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,27,'FreeBSD 3.x')";
87 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,28,'FreeBSD 4.x')";
88 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,29,'FreeBSD 5.x')";
89 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,30,'FreeBSD 6.x')";
90 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,31,'RHFC8')";
91 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (13,32,'ALTLinux Master 4.0')";
92 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (20,20)";
93 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (21,21)";
94 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (22,22)";
95 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (23,23)";
96 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (24,24)";
97 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (25,25)";
98 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (26,26)";
99 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (27,27)";
100 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (28,28)";
101 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,20,'KVM')";
102 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,21,'1000Base-ZX')";
103 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,22,'10GBase-ER')";
104 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,23,'10GBase-LR')";
105 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,24,'10GBase-LRM')";
106 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,25,'10GBase-ZR')";
107 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,26,'10GBase-LX4')";
108 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,27,'10GBase-CX4')";
109 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (2,28,'10GBase-Kx')";
110 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (12,114,'Cisco Catalyst 2970G-24T')";
111 $query[] = "INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) VALUES (12,115,'Cisco Catalyst 2970G-24TS')";
112 $query[] = "INSERT INTO `UserPermission` (`user_id`, `page`, `tab`, `access`) VALUES (0,'help','%','yes')";
113 // And 0.14.6 is the first release, which features Config table. Let's create
114 // and fill it with default values.
115 $query[] = "
116CREATE TABLE `Config` (
117 `varname` char(32) NOT NULL,
118 `varvalue` char(64) NOT NULL,
119 `vartype` enum('string','uint') NOT NULL default 'string',
120 `emptyok` enum('yes','no') NOT NULL default 'no',
121 `is_hidden` enum('yes','no') NOT NULL default 'yes',
122 `description` text,
123 PRIMARY KEY (`varname`)
124) ENGINE=MyISAM DEFAULT CHARSET=latin1
125 ";
126 $query[] = "INSERT INTO `Config` VALUES ('rtwidth_0','9','uint','no','yes','')";
127 $query[] = "INSERT INTO `Config` VALUES ('rtwidth_1','21','uint','no','yes','')";
128 $query[] = "INSERT INTO `Config` VALUES ('rtwidth_2','9','uint','no','yes','')";
129 $query[] = "INSERT INTO `Config` VALUES ('color_F','8fbfbf','string','no','no','HSV: 180-25-75. Free atoms, they are available for allocation to objects.')";
130 $query[] = "INSERT INTO `Config` VALUES ('color_A','bfbfbf','string','no','no','HSV: 0-0-75. Absent atoms.')";
131 $query[] = "INSERT INTO `Config` VALUES ('color_U','bf8f8f','string','no','no','HSV: 0-25-75. Unusable atoms. Some problems keep them from being free.')";
132 $query[] = "INSERT INTO `Config` VALUES ('color_T','408080','string','no','no','HSV: 180-50-50. Taken atoms, object_id should be set for such.')";
133 $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.')";
134 $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.')";
135 $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.')";
136 $query[] = "INSERT INTO `Config` VALUES ('default_port_type','11','uint','no','no','Default value for port type selects.')";
137 $query[] = "INSERT INTO `Config` VALUES ('MASSCOUNT','15','uint','no','no','Number of lines in object mass-adding form.')";
138 $query[] = "INSERT INTO `Config` VALUES ('MAXSELSIZE','30','uint','no','no','Maximum size of a SELECT HTML element.')";
139 $query[] = "INSERT INTO `Config` VALUES ('enterprise','MyCompanyName','string','no','no','Fit to your needs.')";
140 $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.')";
141 $query[] = "INSERT INTO `Config` VALUES ('ROW_SCALE','2','uint','no','no','Row-scope picture scale factor.')";
142 $query[] = "INSERT INTO `Config` VALUES ('PORTS_PER_ROW','12','uint','no','yes','Max switch port per one row on the switchvlans dynamic tab.')";
143 $query[] = "INSERT INTO `Config` VALUES ('DB_VERSION','0.14.6','string','no','yes','Database version.')";
144 break; // --------------------------------------------
803338c1 145 case '0.14.7':
ce109ff2 146 // IPAddress is hopefully fixed now finally.
803338c1 147 $query[] = "delete from IPAddress where name = '' and reserved != 'yes'";
ce109ff2
DO
148
149 // Now rebuild the dictionary into a new table with the same data,
150 // but proper indexing. We are going to convert compound index
151 // into 1-field one to employ AUTO_INCREMENT properly. This means
152 // renumbering lots of records in Dictionary and adjusting records
153 // in related tables. After that we can safely swap the tables.
9bf70f70
DO
154 $query[] = "
155CREATE TABLE `Dictionary_0_14_7_new` (
156 `chapter_no` int(10) unsigned NOT NULL,
157 `dict_key` int(10) unsigned NOT NULL auto_increment,
158 `dict_value` char(128) default NULL,
159 PRIMARY KEY (`dict_key`),
160 UNIQUE KEY `chap_to_key` (`chapter_no`,`dict_key`),
161 UNIQUE KEY `chap_to_val` (`chapter_no`,`dict_value`)
162) TYPE=MyISAM AUTO_INCREMENT=50000
163";
ce109ff2 164
758fe24c 165echo '<pre>';
ce109ff2
DO
166 // Find all chapter numbers, which will require AttributeValue adjustment.
167 $q2 = 'select distinct chapter_no from AttributeMap where chapter_no != 0';
168 $r2 = $dbxlink->query ($q2);
758fe24c
DO
169 $chaplist = array();
170 while ($row = $r2->fetch (PDO::FETCH_NUM))
171 $chaplist[] = $row[0];
ce109ff2 172 $r2->closeCursor();
758fe24c 173 unset ($r2);
ce109ff2
DO
174
175 $stock = array();
176 // Below I list the records, which are known to be the stock
177 // dictionary records of 0.14.6 release.
178 $stock[1] = array
179 (
180 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16
181 );
182 $stock[2] = array
183 (
184 3, 4, 5, 6, 7, 8, 9,
185 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
186 20, 21, 22, 23, 24, 25, 26, 27, 28
187 );
188 $stock[11] = array
189 (
190 1, 3, 4, 5, 6, 7, 8, 9,
191 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
192 21, 22, 24, 25, 26, 27, 28, 29,
193 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
194 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
195 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
196 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
197 70, 71, 72, 73, 74, 75, 76
198 );
199 $stock[12] = array
200 (
201 1, 11, 13, 14, 15, 16, 17, 18, 19, 20, 26, 29,
202 31, 32, 33, 34, 35, 36, 37, 38, 39,
203 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
204 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
205 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
206 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
207 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
208 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
209 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
db1147d2 210 110, 111, 112, 113, 114, 115
ce109ff2
DO
211 );
212 $stock[13] = array
213 (
214 1, 2, 3, 4, 5, 6, 7, 8, 9,
215 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
216 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
217 30, 31, 32
218 );
219 $stock[14] = array
220 (
221 1, 2, 9, 11, 13, 15, 19, 20, 21, 22
222 );
223 $stock[16] = array
224 (
225 1, 2, 3, 4, 5, 6, 7, 8
226 );
227 $stock[17] = array
228 (
229 1, 2, 3, 4, 5, 6, 7, 8, 9,
230 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
231 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
232 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
233 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
234 50
235 );
236 $stock[18] = array
237 (
238 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
239 );
240 $stock[19] = array
241 (
242 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
243 );
244 $stock[20] = array
245 (
246 1, 2
247 );
248
249 // Load dictionary and transform into two tree structures for
250 // stock and user record sets.
251 $dict = array();
264b07b4 252 $q3 = 'select chapter_no, dict_key, dict_value from Dictionary order by chapter_no, dict_key';
ce109ff2
DO
253 $r3 = $dbxlink->query ($q3);
254
9e7f8a4b 255 while ($row = $r3->fetch (PDO::FETCH_ASSOC))
ce109ff2
DO
256 {
257 $tree = 'user';
258 $dict_key = $row['dict_key'];
259 $chapter_no = $row['chapter_no'];
260 switch ($chapter_no)
261 {
262 case 1: // RackObjectType
263 case 2: // PortType
264 case 11: // server models
265 case 12: // network switch models
266 case 13: // server OS type
267 case 14: // network switch OS type
268 case 16: // router OS type
269 case 17: // router models
270 case 18: // disk array models
271 case 19: // tape library models
272 case 20: // Protocols
273 if (in_array ($dict_key, $stock[$chapter_no]))
274 $tree = 'stock';
275 break;
276 }
a07a39b1 277 $dict[$tree][$chapter_no][$dict_key] = array ('value' => $row['dict_value']);
ce109ff2
DO
278 }
279 $r3->closeCursor();
758fe24c 280 unset ($r3);
ce109ff2
DO
281
282
283 // Now we store stock dataset first, bump up key value and store
284 // user's data. After that we will know the new dict_key for all
285 // records.
286 // The result of both datasets processing is saved in $new_dict.
287 // Save on calling LAST_ISERT_ID() each time by keeping own key.
288 $newkey = 1;
289 $new_dict = array();
290 foreach ($dict['stock'] as $chapter_no => $words)
291 {
292 $new_dict[$chapter_no] = array();
293 foreach ($words as $dict_key => $entry)
294 {
1b5942be 295 $query[] = "insert into Dictionary_0_14_7_new (chapter_no, dict_key, dict_value) " .
ce109ff2
DO
296 "values (${chapter_no}, ${newkey}, '${entry['value']}')";
297 $new_dict[$chapter_no][$dict_key] = $entry;
298 $new_dict[$chapter_no][$dict_key]['newkey'] = $newkey;
299 $newkey++;
300 }
301 }
e7882270 302 $newkey = 50000;
ce109ff2
DO
303 foreach ($dict['user'] as $chapter_no => $words)
304 {
305 // Some chapters may appear on the user dataset only.
306 if (!isset ($new_dict[$chapter_no]))
307 $new_dict[$chapter_no] = array();
308 foreach ($words as $dict_key => $entry)
309 {
310 $query[] = "insert into Dictionary_0_14_7_new " .
311 "values (${chapter_no}, ${newkey}, '${entry['value']}')";
312 $new_dict[$chapter_no][$dict_key] = $entry;
313 $new_dict[$chapter_no][$dict_key]['newkey'] = $newkey;
314 $newkey++;
315 }
316 }
317 // The new table should now have adequate AUTO_INCREMENT w/o our care.
758fe24c
DO
318 // Install the new data.
319 $query[] = 'drop table Dictionary';
320 $query[] = 'alter table Dictionary_0_14_7_new rename to Dictionary';
ce109ff2
DO
321
322 // Now we iterate over the joint dataset, picking some chapters and
323 // performing additional processing:
324 // 1 (RackObjectType) --- adjust RackObject and regenerate AttributeMap
a07a39b1 325 // 2 (PortType) --- adjust Port and regenerate PortCompat (at a latter point)
ce109ff2
DO
326 // 3 (RackRow) --- adjust Rack
327 // 20 (Protocols) --- adjust PortForwarding
328 // All other chapters listed in $chaplist --- adjust AttributeValue
329
330 $query[] = "delete from AttributeMap";
331 foreach ($new_dict as $chapter_no => $words)
332 {
333 foreach ($words as $oldkey => $data)
334 {
335 $value = $data['value'];
336 $newkey = $data['newkey'];
264b07b4
DO
337 // Even if the key doesn't change, go on to have
338 // AttributeMap regenerated completely.
ce109ff2
DO
339 if ($chapter_no == 1)
340 {
341 $q4 = "select id from RackObject where objtype_id = ${oldkey}";
342 $r4 = $dbxlink->query ($q4);
343 while ($row = $r4->fetch (PDO::FETCH_ASSOC))
344 $query[] = "update RackObject set objtype_id = ${newkey} where id = ${row['id']} limit 1";
345 $r4->closeCursor();
264b07b4 346 unset ($r4);
ce109ff2 347
758fe24c
DO
348 $q5 = "select attr_id, chapter_no from AttributeMap where objtype_id = ${oldkey}";
349 $r5 = $dbxlink->query ($q5);
350 while ($row = $r5->fetch (PDO::FETCH_ASSOC))
ce109ff2 351 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (${newkey}, ${row['attr_id']}, ${row['chapter_no']})";
758fe24c 352 $r5->closeCursor();
264b07b4 353 unset ($r5);
ce109ff2 354 }
a07a39b1
DO
355 elseif ($chapter_no == 2)
356 {
758fe24c 357 $q46 = "select id from Port where type = ${oldkey}";
758fe24c
DO
358 $r46 = $dbxlink->query ($q46);
359 if ($r46 == NULL)
360 echo 'ERROR';
361 while ($row = $r46->fetch (PDO::FETCH_ASSOC))
a07a39b1 362 $query[] = "update Port set type = ${newkey} where id = ${row['id']} limit 1";
758fe24c 363 $r46->closeCursor();
264b07b4 364 unset ($r46);
a07a39b1 365 }
ce109ff2
DO
366 elseif ($chapter_no == 3)
367 {
758fe24c
DO
368 $q7 = "select id from Rack where row_id = ${oldkey}";
369 $r7 = $dbxlink->query ($q7);
370 while ($row = $r7->fetch (PDO::FETCH_ASSOC))
ce109ff2 371 $query[] = "update Rack set row_id = ${newkey} where id = ${row['id']} limit 1";
758fe24c 372 $r7->closeCursor();
264b07b4 373 unset ($r7);
ce109ff2 374 }
a07a39b1
DO
375 elseif ($chapter_no == 20)
376 {
264b07b4
DO
377 $q8 = "select object_id, localip, localport, remoteip, remoteport from PortForwarding where proto = ${oldkey}";
378 $r8 = $dbxlink->query ($q8);
758fe24c 379 while ($row = $r8->fetch (PDO::FETCH_ASSOC))
264b07b4
DO
380 $query[] = "update PortForwarding set proto = ${newkey} where " .
381 "object_id = ${row['object_id']} and localip = ${row['localip']} and " .
382 "localport = ${row['localport']} and remoteip = ${row['remoteip']} and " .
383 "remoteport = ${row['remoteport']} and proto = ${oldkey} limit 1";
758fe24c 384 $r8->closeCursor();
264b07b4 385 unset ($r8);
758fe24c
DO
386 }
387 elseif (in_array ($chapter_no, $chaplist))
388 {
5b1d68c5 389 $q81 = "select object_id, AttributeValue.attr_id from " .
264b07b4
DO
390 "AttributeValue natural join Attribute natural join AttributeMap " .
391 "inner join RackObject on RackObject.id = object_id and RackObject.objtype_id = AttributeMap.objtype_id " .
392 "where attr_type = 'dict' and chapter_no = ${chapter_no} and uint_value = ${oldkey}";
393 $r81 = $dbxlink->query ($q81);
394 while ($row = $r81->fetch (PDO::FETCH_ASSOC))
1b5942be
DO
395 $query[] = "update AttributeValue set uint_value = ${newkey} " .
396 "where object_id = ${row['object_id']} and attr_id = ${row['attr_id']}";
264b07b4
DO
397 $r81->closeCursor();
398 unset ($r81);
a07a39b1 399 }
ce109ff2
DO
400 }
401 }
a07a39b1 402 // Now it's possible to schedule PortCompat regeneration.
1b5942be
DO
403 // Convert the fields to unsigned on occasion.
404 $query[] = 'drop table PortCompat';
405 $query[] = 'create table PortCompat (type1 int(10) unsigned NOT NULL, type2 int(10) unsigned NOT NULL)';
758fe24c
DO
406 $q9 = "select type1, type2 from PortCompat";
407 $r9 = $dbxlink->query ($q9);
408 while ($row = $r9->fetch (PDO::FETCH_ASSOC))
a07a39b1
DO
409 {
410 $new_type1 = $new_dict[2][$row['type1']]['newkey'];
411 $new_type2 = $new_dict[2][$row['type2']]['newkey'];
412 $query[] = "insert into PortCompat (type1, type2) values (${new_type1}, ${new_type2})";
413 }
758fe24c 414 $r9->closeCursor();
264b07b4 415 unset ($r9);
758fe24c 416echo '</pre>';
a07a39b1
DO
417
418 // Give the configuration some finish
419 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_F'";
420 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_A'";
421 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_U'";
422 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_T'";
423 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_Th'";
424 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_Tw'";
425 $query[] = "update Config set is_hidden = 'yes' where varname = 'color_Thw'";
426 $query[] = "update Config set description = 'Default port type' where varname = 'default_port_type'";
427 $query[] = "update Config set description = 'Picture scale for rack row display' where varname = 'ROW_SCALE'";
428 $query[] = "update Config set description = 'Organization name' where varname = 'enterprise'";
429 $query[] = "update Config set description = 'Expect common name configured for the following object types' where varname = 'NAMEFUL_OBJTYPES'";
430 $query[] = "update Config set description = '&lt;SELECT&gt; lists height' where varname = 'MAXSELSIZE'";
431 $query[] = "update Config set description = '&quot;Fast&quot; form is this many records tall' where varname = 'MASSCOUNT'";
264b07b4 432 $query[] = "update Config set is_hidden = 'no', description = 'Ports per row in VLANs tab' where varname = 'PORTS_PER_ROW'";
a07a39b1 433 $query[] = "INSERT INTO `Config` VALUES ('IPV4_ADDRS_PER_PAGE','256','uint','no','no','IPv4 addresses per page')";
9e7f8a4b 434 $query[] = "INSERT INTO `Config` VALUES ('DEFAULT_RACK_HEIGHT','42','uint','yes','no','Default rack height')";
bd912758
DO
435 // After Dictionary transformation we ought to list 337 stock records in DB. Add more.
436 $new_words = array();
437 $new_words[338] = array (12 => 'Dell PowerConnect 2216');
438 $new_words[] = array (12 => 'Dell PowerConnect 2224');
439 $new_words[] = array (12 => 'Dell PowerConnect 2324');
440 $new_words[] = array (12 => 'Dell PowerConnect 2708');
441 $new_words[] = array (12 => 'Dell PowerConnect 2716');
442 $new_words[] = array (12 => 'Dell PowerConnect 2724');
443 $new_words[] = array (12 => 'Dell PowerConnect 2748');
444 $new_words[] = array (12 => 'Dell PowerConnect 3424');
445 $new_words[] = array (12 => 'Dell PowerConnect 3424P');
446 $new_words[] = array (12 => 'Dell PowerConnect 3448');
447 $new_words[] = array (12 => 'Dell PowerConnect 3448P');
448 $new_words[] = array (12 => 'Dell PowerConnect 5324');
449 $new_words[] = array (12 => 'Dell PowerConnect 6224');
450 $new_words[] = array (12 => 'Dell PowerConnect 6224P');
451 $new_words[] = array (12 => 'Dell PowerConnect 6224F');
452 $new_words[] = array (12 => 'Dell PowerConnect 6248');
453 $new_words[] = array (12 => 'Dell PowerConnect 6248P');
454 $new_words[] = array (11 => 'Dell PowerEdge 6850');
455 $new_words[] = array (11 => 'Dell PowerEdge 6950');
456 $new_words[] = array (11 => 'Dell PowerEdge R900');
457 $new_words[] = array (11 => 'Dell PowerEdge 4400');
458 $new_words[] = array (11 => 'Dell PowerEdge 2650');
459 $new_words[] = array (11 => 'Dell PowerEdge 2550');
460 $new_words[] = array (11 => 'Dell PowerEdge 750');
461 $new_words[] = array (11 => 'Dell PowerEdge 2450');
462 $new_words[] = array (11 => 'Dell PowerEdge 850');
463 $new_words[] = array (11 => 'Dell PowerEdge 1850');
464 $new_words[] = array (11 => 'Dell PowerEdge 860');
465 $new_words[] = array (11 => 'Dell PowerEdge 2900');
466 $new_words[] = array (11 => 'Dell PowerEdge 2970');
467 $new_words[] = array (11 => 'Dell PowerEdge SC1435');
468 $new_words[] = array (12 => 'Cisco Catalyst 6509');
469 $new_words[] = array (12 => 'Cisco ME 6524GS-8S');
470 $new_words[] = array (12 => 'Cisco ME 6524GT-8S');
471 $new_words[] = array (12 => 'Cisco Catalyst 4503-E');
472 $new_words[] = array (12 => 'Cisco Catalyst 4506-E');
473 $new_words[] = array (12 => 'Cisco Catalyst 4507R-E');
474 $new_words[] = array (12 => 'Cisco Catalyst 4510R-E');
475 $new_words[] = array (12 => 'Cisco Catalyst 3750-24TE-M');
476 $new_words[] = array (12 => 'Cisco Catalyst 4948-10GE');
477 $new_words[] = array (12 => 'Cisco ME 4924-10GE');
478 $new_words[] = array (12 => 'Cisco Catalyst 2960-24');
479 $new_words[] = array (12 => 'Cisco Catalyst 2950-24');
480 $new_words[] = array (12 => 'Cisco Catalyst 2950-12');
481 $new_words[] = array (12 => 'Cisco Catalyst 2950C-24');
482 $new_words[] = array (12 => 'Cisco Catalyst 2950G-24-DC');
483 $new_words[] = array (12 => 'Cisco Catalyst 2950SX-48');
484 $new_words[] = array (12 => 'Cisco Catalyst 2950SX-24');
485 $new_words[] = array (12 => 'Cisco Catalyst 2950T-24');
486 $new_words[] = array (12 => 'Cisco Catalyst 2950T-48');
487 $new_words[] = array (12 => 'Cisco Catalyst 2950G-12');
488 $new_words[] = array (12 => 'Cisco Catalyst 2950G-24');
489 $new_words[] = array (12 => 'Cisco Catalyst 2950G-48');
bd912758
DO
490 $new_words[] = array (12 => 'Cisco Catalyst 3508G XL');
491 $new_words[] = array (12 => 'Cisco Catalyst 3512 XL');
492 $new_words[] = array (12 => 'Cisco Catalyst 3524 XL');
493 $new_words[] = array (12 => 'Cisco Catalyst 3524 PWR XL');
494 $new_words[] = array (12 => 'Cisco Catalyst 3548 XL');
495 $new_words[] = array (12 => 'Cisco ME 2400-24TS-A');
496 $new_words[] = array (12 => 'Cisco ME 2400-24TS-D');
497 $new_words[] = array (12 => 'Cisco Catalyst 3550-12T');
498 $new_words[] = array (12 => 'Cisco Catalyst 3550-12G');
499 $new_words[] = array (12 => 'Cisco Catalyst 3550-24');
500 $new_words[] = array (12 => 'Cisco Catalyst 3550-24 FX');
501 $new_words[] = array (12 => 'Cisco Catalyst 3550-24 DC');
502 $new_words[] = array (12 => 'Cisco Catalyst 3550-24 PWR');
503 $new_words[] = array (12 => 'Cisco Catalyst 3550-48');
504 $new_words[] = array (12 => 'Cisco ME 3400G-12CS-A');
505 $new_words[] = array (12 => 'Cisco ME 3400G-12CS-D');
506 $new_words[] = array (12 => 'Cisco ME 3400G-2CS-A');
507 $new_words[] = array (12 => 'Cisco ME 3400-24TS-A');
508 $new_words[] = array (12 => 'Cisco ME 3400-24TS-D');
509 $new_words[] = array (12 => 'Cisco ME 3400-24FS-A');
7373a304
DO
510 $new_words[] = array (12 => 'Foundry FastIron GS 624XGP');
511 $new_words[] = array (12 => 'Foundry FastIron GS 624XGP-POE');
512 $new_words[] = array (12 => 'Foundry FastIron LS 624');
513 $new_words[] = array (12 => 'Foundry FastIron LS 648');
514 $new_words[] = array (12 => 'Foundry NetIron M2404F');
515 $new_words[] = array (12 => 'Foundry NetIron M2404C');
516 $new_words[] = array (17 => 'Foundry BigIron RX-32');
e7882270
DO
517 $new_words[] = array (13 => 'Debian 2.0 (hamm)');
518 $new_words[] = array (13 => 'Debian 2.1 (slink)');
519 $new_words[] = array (13 => 'Debian 2.2 (potato)');
520 $new_words[] = array (13 => 'Debian 4.0 (etch)');
521 $new_words[] = array (13 => 'ALTLinux Server 4.0');
e7882270
DO
522 $new_words[] = array (13 => 'ALTLinux Sisyphus');
523 $new_words[] = array (13 => 'openSUSE 10.0');
524 $new_words[] = array (13 => 'openSUSE 10.1');
525 $new_words[] = array (13 => 'openSUSE 10.2');
526 $new_words[] = array (13 => 'openSUSE 10.3');
527 $new_words[] = array (13 => 'Ubuntu 4.10');
528 $new_words[] = array (13 => 'Ubuntu 5.04');
529 $new_words[] = array (13 => 'Ubuntu 5.10');
530 $new_words[] = array (13 => 'Ubuntu 6.06 LTS');
531 $new_words[] = array (13 => 'Ubuntu 6.10');
532 $new_words[] = array (13 => 'Ubuntu 7.04');
533 $new_words[] = array (13 => 'Ubuntu 7.10');
534 $new_words[] = array (13 => 'Ubuntu 8.04 LTS');
535 $new_words[] = array (13 => 'RHEL5');
5f58747d
DO
536 $new_words[] = array (18 => 'Dell PowerVault 210S');
537 $new_words[] = array (18 => 'Dell PowerVault 221S');
ab0ec3ef
DO
538 $new_words[] = array (2 => 'dry contact');
539 $new_words[] = array (2 => 'unknown');
499dfa73
DO
540 // Two above records ought to take keys 439 and 440.
541 $query[] = "INSERT INTO `PortCompat` (`type1`, `type2`) VALUES (439,439)";
efb6bab4
DO
542 $new_words[] = array (13 => 'CentOS-2');
543 $new_words[] = array (13 => 'CentOS-3');
544 $new_words[] = array (13 => 'CentOS-4');
545 $new_words[] = array (13 => 'CentOS-5');
bd912758
DO
546 foreach ($new_words as $dict_key => $tmp)
547 foreach ($tmp as $chapter_no => $dict_value)
548 $query[] = 'INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) ' .
549 "VALUES (${chapter_no}, ${dict_key}, '${dict_value}')";
57913f20
DO
550 // Resetting to defaults is worse, than remapping, but better than
551 // leaving messed values.
552 $query[] = "update Config set varvalue = '24' where varname = 'default_port_type' limit 1";
ce109ff2 553 // We are done.
54c2a7a8 554 $query[] = "update Config set varvalue = '0.14.7' where varname = 'DB_VERSION'";
803338c1 555 break; // --------------------------------------------
a6305acc
DO
556 case '0.14.8':
557 $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')";
78f44cbc
DO
558 $query[] = "alter table Port modify column id int(10) unsigned NOT NULL auto_increment";
559 $query[] = "alter table Port modify column object_id int(10) unsigned NOT NULL";
560 $query[] = "alter table Port modify column type int(10) unsigned NOT NULL";
561 $query[] = "alter table Link modify column porta int(10) unsigned";
562 $query[] = "alter table Link modify column portb int(10) unsigned";
ba1c6d42
DO
563 $query[] = "alter table PortForwarding modify column object_id int(10) unsigned not null";
564 $query[] = "alter table PortForwarding modify column localport smallint(5) unsigned not null";
565 $query[] = "alter table PortForwarding modify column remoteport smallint(5) unsigned not null";
566 $query[] = "alter table IPBonds modify column object_id int(10) unsigned not null";
567 $query[] = "alter table IPRanges modify column id int(10) unsigned not null";
568 $query[] = "alter table IPRanges modify column mask int(10) unsigned not null";
78f44cbc
DO
569 $query[] = "alter table Port add index `type` (type)";
570 $query[] = "alter table PortCompat add index `type1` (type1)";
571 $query[] = "alter table PortCompat add index `type2` (type2)";
992d2ec2
DO
572 $query[] = "update Dictionary set dict_value = 'Debian 3.0 (woody)' where dict_key = 234";
573 $query[] = "update Dictionary set dict_value = 'Debian 3.1 (sarge)' where dict_key = 235";
574 $query[] = "update Dictionary set dict_value = 'Foundry BigIron 15000' where dict_key = 311";
575 $query[] = "update Dictionary set dict_value = 'RHF7' where dict_key = 232";
576 $query[] = "update Dictionary set dict_value = 'RHF8' where dict_key = 242";
c8b74094
DO
577 $query[] = "INSERT INTO `Attribute` (`attr_id`, `attr_type`, `attr_name`) VALUES (25,'string','UUID');";
578 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_no`) VALUES (4,25,0);";
ba1c6d42
DO
579 $query[] = "update Dictionary set dict_value = '[[Cisco Catalyst 2970G-24T | http://www.cisco.com/en/US/products/hw/switches/ps5206/ps5313/index.html]]' where dict_key = 210";
580 $query[] = "update Dictionary set dict_value = '[[Cisco Catalyst 2970G-24TS | http://www.cisco.com/en/US/products/hw/switches/ps5206/ps5437/index.html]]' where dict_key = 211";
78f44cbc 581 $query[] = "update Config set varvalue = '0.14.8' where varname = 'DB_VERSION'";
a6305acc 582 break; // --------------------------------------------
cf48742e
DO
583 case '0.14.9':
584 $query[] = "alter table IPRanges modify column id int(10) unsigned not null auto_increment";
0a7136d4 585 $query[] = "alter table Rack modify column height tinyint(3) unsigned not null default '42'";
86f94102 586 $query[] = "alter table Rack add column thumb_data blob after comment";
2526f63c
DO
587 $query[] = "
588CREATE TABLE `IPLoadBalancer` (
589 `object_id` int(10) unsigned default NULL,
590 `rspool_id` int(10) unsigned default NULL,
70c24883 591 `vs_id` int(10) unsigned default NULL,
2526f63c
DO
592 `vsconfig` text,
593 `rsconfig` text,
70c24883 594 UNIQUE KEY `LB-VS` (`object_id`,`vs_id`)
2526f63c
DO
595) ENGINE=MyISAM";
596 $query[] = "
597CREATE TABLE `IPRSPool` (
598 `id` int(10) unsigned NOT NULL auto_increment,
2526f63c
DO
599 `name` char(255) default NULL,
600 `vsconfig` text,
601 `rsconfig` text,
602 PRIMARY KEY (`id`)
603) ENGINE=MyISAM";
604 $query[] = "
605CREATE TABLE `IPRealServer` (
606 `id` int(10) unsigned NOT NULL auto_increment,
35b72b35 607 `inservice` enum('yes','no') NOT NULL default 'no',
2526f63c
DO
608 `rsip` int(10) unsigned default NULL,
609 `rsport` smallint(5) unsigned default NULL,
610 `rspool_id` int(10) unsigned default NULL,
611 `rsconfig` text,
70c24883
DO
612 PRIMARY KEY (`id`),
613 UNIQUE KEY `pool-endpoint` (`rspool_id`,`rsip`,`rsport`)
2526f63c
DO
614) ENGINE=MyISAM";
615 $query[] = "
616CREATE TABLE `IPVirtualService` (
617 `id` int(10) unsigned NOT NULL auto_increment,
618 `vip` int(10) unsigned default NULL,
619 `vport` smallint(5) unsigned default NULL,
620 `proto` enum('TCP','UDP') NOT NULL default 'TCP',
621 `name` char(255) default NULL,
622 `vsconfig` text,
623 `rsconfig` text,
d800a805 624 PRIMARY KEY (`id`)
2526f63c 625) ENGINE=MyISAM";
d800a805 626 $query[] = "INSERT INTO `Config` VALUES ('DEFAULT_SLB_VS_PORT','','uint','yes','no','Default port of SLB virtual service')";
73e11958 627 $query[] = "INSERT INTO `Config` VALUES ('DEFAULT_SLB_RS_PORT','','uint','yes','no','Default port of SLB real server')";
6dbdc7c7
DO
628 $query[] = "INSERT INTO `Config` VALUES ('IPV4_PERFORMERS','1,4,7,8,12,14','string','yes','no','IPv4-capable object types')";
629 $query[] = "INSERT INTO `Config` VALUES ('NATV4_PERFORMERS','4,7,8','string','yes','no','NATv4-capable object types')";
f2154c9f 630 $query[] = "INSERT INTO `Config` VALUES ('USER_AUTH_SRC','database','string','no','no','User authentication source')";
3e0fc4b6 631 $query[] = "alter table RackSpace drop column problem_id";
d800a805 632 $query[] = "update Config set varvalue = '0.14.9' where varname = 'DB_VERSION'";
cf48742e 633 break; // --------------------------------------------
a6f83a72
DO
634 case '0.14.10':
635 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('DETECT_URLS','no','string','yes','no','Detect URLs in text fields')";
f187f2ec
DO
636 $query[] = "alter table RackHistory modify column height tinyint(3) unsigned";
637 $query[] = "alter table RackHistory add column thumb_data blob after comment";
4b8d413e 638 $query[] = "INSERT INTO `Config` VALUES ('RACK_PRESELECT_THRESHOLD','1','uint','no','no','Rack pre-selection threshold')";
a6f83a72 639 $query[] = "update Config set varvalue = '0.14.10' where varname = 'DB_VERSION'";
81dbd3bc 640 break; // --------------------------------------------
2ff234d6
DO
641 case '0.14.11':
642 $new_words = array();
643 $new_words[445] = array (1 => 'KVM switch');
644 $new_words[] = array (2 => 'KVM (console)');
645 $new_words[] = array (1 => 'multiplexer');
646 $query[] = "update Dictionary set dict_value = 'network switch' where dict_key = 8";
647 $query[] = "update Dictionary set dict_value = 'KVM (host)' where dict_key = 33";
648 $query[] = "delete from PortCompat where type1 = 33 and type2 = 33";
649 $query[] = "insert into PortCompat (type1, type2) values (33, 446)";
650 $query[] = "insert into PortCompat (type1, type2) values (446, 33)";
35d3ecaf
DO
651 $query[] = "insert into Chapter (chapter_no, sticky, chapter_name) values (21, 'no', 'KVM switch models')";
652 $query[] = "insert into Chapter (chapter_no, sticky, chapter_name) values (22, 'no', 'multiplexer models')";
2ff234d6
DO
653 $query[] = "update Chapter set chapter_name = 'network switch models' where chapter_no = 12";
654 $new_words[] = array (21 => '[[Avocent DSR1021 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=2418]]');
655 $new_words[] = array (21 => '[[Avocent DSR1022 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=2498]]');
656 $new_words[] = array (21 => '[[Avocent DSR1024 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=2588]]');
657 $new_words[] = array (21 => '[[Avocent DSR1031 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=2804]]');
658 $new_words[] = array (21 => '[[Avocent DSR1020 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=2340]]');
659 $new_words[] = array (21 => '[[Avocent DSR2020 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=2884]]');
660 $new_words[] = array (21 => '[[Avocent DSR4020 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=3100]]');
661 $new_words[] = array (21 => '[[Avocent DSR8020 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=3358]]');
662 $new_words[] = array (21 => '[[Avocent DSR1030 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=2726]]');
663 $new_words[] = array (21 => '[[Avocent DSR2030 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=2988]]');
664 $new_words[] = array (21 => '[[Avocent DSR2035 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=3050]]');
665 $new_words[] = array (21 => '[[Avocent DSR4030 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=3196]]');
666 $new_words[] = array (21 => '[[Avocent DSR8030 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=3472]]');
667 $new_words[] = array (21 => '[[Avocent DSR8035 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=3580]]');
668 $new_words[] = array (21 => '[[Avocent AutoView 1415 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=1612]]');
669 $new_words[] = array (21 => '[[Avocent AutoView 1515 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=1736]]');
670 $new_words[] = array (21 => '[[Avocent AutoView 2015 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=1930]]');
671 $new_words[] = array (21 => '[[Avocent AutoView 2020 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=2012]]');
672 $new_words[] = array (21 => '[[Avocent AutoView 2030 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=2114]]');
673 $new_words[] = array (21 => '[[Avocent AutoView 3100 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=2222]]');
674 $new_words[] = array (21 => '[[Avocent AutoView 3200 | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=2266]]');
675 $new_words[] = array (21 => '[[Avocent SwitchView 1000 4-port | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=4016]]');
676 $new_words[] = array (21 => '[[Avocent SwitchView 1000 8-port | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=4094]]');
677 $new_words[] = array (21 => '[[Avocent SwitchView 1000 16-port | http://www.avocent.com/WorkArea/linkit.aspx?LinkIdentifier=id&ItemID=3934]]');
678 $new_words[] = array (22 => '[[Cronyx FMUX/S-4E1 | http://www.cronyx.ru/hardware/fmux-ring.html]]');
679 $new_words[] = array (22 => '[[Cronyx FMUX/S-4E1/ETS | http://www.cronyx.ru/hardware/fmux-ring.html]]');
680 $new_words[] = array (22 => '[[Cronyx FMUX/S-4E1/M | http://www.cronyx.ru/hardware/fmux-ring.html]]');
681 $new_words[] = array (22 => '[[Cronyx FMUX/S-8E1 | http://www.cronyx.ru/hardware/fmux-ring.html]]');
682 $new_words[] = array (22 => '[[Cronyx FMUX/S-8E1/ETS | http://www.cronyx.ru/hardware/fmux-ring.html]]');
683 $new_words[] = array (22 => '[[Cronyx FMUX/S-8E1/M | http://www.cronyx.ru/hardware/fmux-ring.html]]');
684 $new_words[] = array (22 => '[[Cronyx FMUX/S-16E1 | http://www.cronyx.ru/hardware/fmux-ring.html]]');
685 $new_words[] = array (22 => '[[Cronyx FMUX/S-16E1/ETS | http://www.cronyx.ru/hardware/fmux-ring.html]]');
686 $new_words[] = array (22 => '[[Cronyx FMUX/S-16E1/M | http://www.cronyx.ru/hardware/fmux-ring.html]]');
687 $new_words[] = array (22 => '[[Cronyx E1-XL/S | http://www.cronyx.ru/hardware/e1xl-s.html]]');
688 $new_words[] = array (22 => '[[Cronyx E1-DXC/S | http://www.cronyx.ru/hardware/e1dxc-s.html]]');
689 $new_words[] = array (22 => '[[Cronyx FMUX-4-E2 | http://www.cronyx.ru/hardware/fmux4-e2.html]]');
690 $new_words[] = array (22 => '[[Cronyx FMUX-4-E3 | http://www.cronyx.ru/hardware/fmux16-e3.html]]');
691 $new_words[] = array (22 => '[[Cronyx FMUX/SAT | http://www.cronyx.ru/hardware/fmux-sat.html]]');
692 $new_words[] = array (22 => '[[Cronyx E1-XL/S-IP | http://www.cronyx.ru/hardware/e1xl-ip.html]]');
693 $new_words[] = array (17 => '[[RAD FCD-IPM | http://www.rad.com/Article/0,6583,36426-E1_T1_or_Fractional_E1_T1_Modular_Access_Device_with_Integrated_Router,00.html]]');
694 $new_words[] = array (22 => '[[RAD FCD-E1M | http://www.rad.com/Article/0,6583,36723-E1_T1_Modular_Access_Multiplexer,00.html]]');
695 $new_words[] = array (22 => '[[RAD FCD-T1M | http://www.rad.com/Article/0,6583,36723-E1_T1_Modular_Access_Multiplexer,00.html]]');
696 $new_words[] = array (22 => '[[RAD FCD-155E | http://www.rad.com/Article/0,6583,36276-Ethernet_over_SDH_SONET_ADM,00.html]]');
697 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (445, 1, 0)";
698 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (445, 2, 21)";
699 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (445, 3, 0)";
700 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (445, 5, 0)";
701 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (445, 14, 0)";
702 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (445, 22, 0)";
703 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (447, 1, 0)";
704 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (447, 2, 22)";
705 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (447, 3, 0)";
706 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (447, 5, 0)";
707 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (447, 14, 0)";
708 $query[] = "insert into AttributeMap (objtype_id, attr_id, chapter_no) values (447, 22, 0)";
2ff234d6
DO
709 foreach ($new_words as $dict_key => $tmp)
710 foreach ($tmp as $chapter_no => $dict_value)
711 $query[] = 'INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) ' .
712 "VALUES (${chapter_no}, ${dict_key}, '${dict_value}')";
f70bed91 713 $query[] = "update Rack set thumb_data = NULL";
2ff234d6
DO
714 $query[] = "update Config set varvalue = '0.14.11' where varname = 'DB_VERSION'";
715 break; // --------------------------------------------
7e7a8387 716 case '0.14.12':
2c53a252 717 $query[] = "INSERT INTO `Config` VALUES ('DEFAULT_IPV4_RS_INSERVICE','no','string','no','no','Inservice status for new SLB real servers')";
a52b9eb1 718 $query[] = "INSERT INTO `Config` VALUES ('AUTOPORTS_CONFIG','4 = 1*33*kvm + 2*24*eth%u;15 = 1*446*kvm','string','yes','no','AutoPorts configuration')";
a477e405 719 $query[] = "INSERT INTO `Config` VALUES ('DEFAULT_OBJECT_TYPE','4','uint','yes','no','Default object type for new objects')";
684bbcac
DO
720 $query[] = "insert into Chapter (chapter_no, sticky, chapter_name) values (23, 'no', 'console models')";
721 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_no`) VALUES (15, 2, 23)";
b83abd29 722 $query[] = "alter table Dictionary modify column dict_value char(255)";
03350e39 723 $new_words[491] = array (21 => '[[Aten CS78 | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=20070319151852001&layerid=subClass2]]');
684bbcac
DO
724 $new_words[] = array (21 => '[[Aten ACS1208A | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=20050224111025006&layerid=subClass2]]');
725 $new_words[] = array (21 => '[[Aten ACS1216A | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=20050224111953008&layerid=subClass2]]');
726 $new_words[] = array (21 => '[[Aten CS1754 | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=20050217161051008&layerid=subClass2]]');
727 $new_words[] = array (21 => '[[Aten CS1758 | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=20050224093143008&layerid=subClass2]]');
728 $new_words[] = array (21 => '[[Aten CS9134 | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20070130133658002&pid=20050217172845005&layerid=subClass2]]');
729 $new_words[] = array (21 => '[[Aten CS9138 | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=20050224094519006&layerid=subClass2]]');
730 $new_words[] = array (21 => '[[Aten CS1708 | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=2005022410563008&layerid=subClass2]]');
731 $new_words[] = array (21 => '[[Aten CS1716 | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=20050224110022008&layerid=subClass2]]');
732 $new_words[] = array (21 => '[[Aten CS1004 | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=20050224100546008&layerid=subClass2]]');
733 $new_words[] = array (21 => '[[Aten CS228 | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=20050224114323008&layerid=subClass2]]');
734 $new_words[] = array (21 => '[[Aten CS428 | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=20050224114721008&layerid=subClass2]]');
735 $new_words[] = array (21 => '[[Aten CS138A | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=20050224111458007&layerid=subClass2]]');
736 $new_words[] = array (21 => '[[Aten CS88A | http://www.aten.com/products/productItem.php?pcid=20070130111936003&psid=20070130133658002&pid=2005022411042006&layerid=subClass2]]');
737 $new_words[] = array (21 => '[[Aten KM0832 | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131626002&pid=20060628154826001&layerid=subClass1]]');
738 $new_words[] = array (21 => '[[Aten KM0216 | http://www.aten.com/products/productItem.php?pcid=2006041110563001&psid=20060411131626002&pid=20060417153950007&layerid=subClass1]]');
739 $new_words[] = array (21 => '[[Aten KM0432 | http://www.aten.com/products/productItem.php?pcid=2006041110563001&psid=20060411131626002&pid=2006041715359007&layerid=subClass1]]');
740 $new_words[] = array (21 => '[[Aten KH1508 | http://www.aten.com/products/productItem.php?pcid=2006041110563001&psid=20060411130954001&pid=20061101174038001&layerid=subClass1]]');
741 $new_words[] = array (21 => '[[Aten KH1516 | http://www.aten.com/products/productItem.php?pcid=2006041110563001&psid=20060411130954001&pid=20061101175320001&layerid=subClass1]]');
742 $new_words[] = array (21 => '[[Aten KH0116 | http://www.aten.com/products/productItem.php?pcid=2006041110563001&psid=20060411130954001&pid=20060411145734003&layerid=subClass1]]');
743 $new_words[] = array (21 => '[[Aten KH98 | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=2007012911116003&pid=20061221104352001&layerid=subClass1]]');
744 $new_words[] = array (23 => '[[Aten KL1100 | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131050002&pid=20071225113046001&layerid=subClass1]]');
745 $new_words[] = array (23 => '[[Aten KL1508 | http://www.aten.com/products/productItem.php?pcid=2006041110563001&psid=20060411131050002&pid=20070710020717009&layerid=subClass1]]');
746 $new_words[] = array (23 => '[[Aten KL1516 | http://www.aten.com/products/productItem.php?pcid=2006041110563001&psid=20060411131050002&pid=20070716232614001&layerid=subClass1]]');
747 $new_words[] = array (23 => '[[Aten KL9108 | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131050002&pid=20060811153413009&layerid=subClass1]]');
748 $new_words[] = array (23 => '[[Aten KL9116 | http://www.aten.com/products/productItem.php?pcid=2006041110563001&psid=20060411131050002&pid=2006081115384001&layerid=subClass1]]');
749 $new_words[] = array (23 => '[[Aten KL3116 | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131050002&pid=20060913162532009&layerid=subClass1]]');
750 $new_words[] = array (23 => '[[Aten KL1116 | http://www.aten.com/products/productItem.php?pcid=2006041110563001&psid=20060411131050002&pid=20060420101520005&layerid=subClass1]]');
751 $new_words[] = array (23 => '[[Aten CS1208DL | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131050002&pid=2005022413505007&layerid=subClass1]]');
752 $new_words[] = array (23 => '[[Aten CS1216DL | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131050002&pid=2005022413505007&layerid=subClass1]]');
753 $new_words[] = array (23 => '[[Aten CS1200L | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131050002&pid=20050224140854008&layerid=subClass1]]');
754 $new_words[] = array (23 => '[[Aten CL1758 | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131050002&pid=20051229164553003&layerid=subClass1]]');
755 $new_words[] = array (23 => '[[Aten CL1208 | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131050002&pid=2005072215482&layerid=subClass1]]');
756 $new_words[] = array (23 => '[[Aten CL1216 | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131050002&pid=2005072215482&layerid=subClass1]]');
757 $new_words[] = array (23 => '[[Aten CL1200 | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131050002&pid=20050722165040002&layerid=subClass1]]');
758 $new_words[] = array (23 => '[[Aten ACS1208AL | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131050002&pid=2005022413597003&layerid=subClass1]]');
759 $new_words[] = array (23 => '[[Aten ACS1216AL | http://www.aten.com/products/productItem.php?pcid=2005010513171002&psid=20060411131050002&pid=2005022413597003&layerid=subClass1]]');
b922bd97
DO
760 $new_words[] = array (22 => '[[Tainet MUXpro 8216 | http://www.tainet.net/Product/muxpro820_8216.htm]]');
761 $new_words[] = array (22 => '[[Tainet Mercury 3600+ | http://www.tainet.net/Product/mercury.htm]]');
762 $new_words[] = array (22 => '[[Tainet Mercury 3820 | http://www.tainet.net/Product/mercury.htm]]');
763 $new_words[] = array (22 => '[[Tainet Mercury 3630 | http://www.tainet.net/Product/mercury.htm]]');
764 $new_words[] = array (22 => '[[Tainet Mercury 3630E | http://www.tainet.net/Product/mercury.htm]]');
765 $new_words[] = array (22 => '[[Tainet DSD-08A | http://www.tainet.net/Product/dsd08a.htm]]');
7fc5565c 766 $new_words[] = array (11 => '[[HP ProLiant DL160 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-3328421-3580694.html]]');
7eee4cc8
DO
767 $new_words[] = array (11 => '[[HP ProLiant DL180 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-3328421-3580698.html]]');
768 $new_words[] = array (11 => '[[HP ProLiant DL185 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-3328421-3579900.html]]');
769 $new_words[] = array (11 => '[[HP ProLiant DL365 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-241475-3186080.html]]');
770 $new_words[] = array (11 => '[[HP ProLiant DL320s | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-241475-3232017.html]]');
771 $new_words[] = array (11 => '[[HP ProLiant DL320p | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-241475-3579703.html]]');
772 $new_words[] = array (11 => '[[HP ProLiant ML115 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-241434-241646-3328424-3330535.html]]');
773 $old_words = array();
774 $old_words[487] = '[[RAD FCD-IPM | http://www.rad.com/Article/0,6583,36426-E1_T1_or_Fractional_E1_T1_Modular_Access_Device_with_Integrated_Router,00.html]]';
775 $old_words[484] = '[[Cronyx FMUX-16-E3 | http://www.cronyx.ru/hardware/fmux16-e3.html]]';
776 $old_words[101] = '[[HP ProLiant DL140 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-3328421-1842838.html]]';
777 $old_words[102] = '[[HP ProLiant DL145 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-3328421-3219755.html]]';
778 $old_words[103] = '[[HP ProLiant DL320 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-241475-3201178.html]]';
779 $old_words[104] = '[[HP ProLiant DL360 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-241475-1121486.html]]';
780 $old_words[105] = '[[HP ProLiant DL380 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-241475-1121516.html]]';
781 $old_words[106] = '[[HP ProLiant DL385 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-241475-3219233.html]]';
782 $old_words[107] = '[[HP ProLiant DL580 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-3328422-3454575.html]]';
783 $old_words[108] = '[[HP ProLiant DL585 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-3328412-241644-3328422-3219717.html]]';
784 $old_words[109] = '[[HP ProLiant ML110 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-241434-241646-3328424-3577708.html]]';
785 $old_words[110] = '[[HP ProLiant ML150 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-241434-241646-3328424-3580609.html]]';
786 $old_words[111] = '[[HP ProLiant ML310 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-241434-241646-241477-3580655.html]]';
787 $old_words[112] = '[[HP ProLiant ML350 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-241434-241646-241477-1121586.html]]';
788 $old_words[113] = '[[HP ProLiant ML370 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-241434-241646-241477-1121474.html]]';
789 $old_words[114] = '[[HP ProLiant ML570 | http://h10010.www1.hp.com/wwpc/us/en/en/WF05a/15351-15351-241434-241646-3328425-1842779.html]]';
790 foreach ($old_words as $dict_key => $dict_value)
48b11d4d 791 $query[] = "update Dictionary set dict_value = '${dict_value}' where dict_key = ${dict_key} limit 1";
f084b5c1
DO
792 foreach ($new_words as $dict_key => $tmp)
793 foreach ($tmp as $chapter_no => $dict_value)
794 $query[] = 'INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) ' .
795 "VALUES (${chapter_no}, ${dict_key}, '${dict_value}')";
48329bfb 796 $query[] = "alter database character set utf8";
b83abd29 797 $query[] = "update Config set varvalue = '0.14.12' where varname = 'DB_VERSION'";
7e7a8387 798 break; // --------------------------------------------
86fc1740 799 case '0.14.13':
757e1414
DO
800 $new_words[541] = array (12 => '[[Force10^S2410CP | http://www.force10networks.com/products/s2410.asp]]');
801 $new_words[] = array (12 => '[[Force10^S50N | http://www.force10networks.com/products/s50n.asp]]');
802 $new_words[] = array (12 => '[[Force10^S50V | http://www.force10networks.com/products/s50v.asp]]');
803 $new_words[] = array (12 => '[[Force10^S25P | http://www.force10networks.com/products/s25p.asp]]');
804 $new_words[] = array (12 => '[[Force10^C150| http://www.force10networks.com/products/cseries.asp]]');
805 $new_words[] = array (12 => '[[Force10^C300| http://www.force10networks.com/products/cseries.asp]]');
806 $new_words[] = array (12 => '[[Force10^E300 | http://www.force10networks.com/products/eseries.asp]]');
807 $new_words[] = array (12 => '[[Force10^E600 | http://www.force10networks.com/products/eseries.asp]]');
808 $new_words[] = array (12 => '[[Force10^E1200 | http://www.force10networks.com/products/eseries.asp]]');
809 $new_words[] = array (12 => '[[NETGEAR^JGS524F | http://www.netgear.com/Products/Switches/UnmanagedSwitches/JGS524F.aspx]]');
810 $new_words[] = array (12 => '[[NETGEAR^JGS516 | http://www.netgear.com/Products/Switches/UnmanagedSwitches/JGS516.aspx]]');
811 $new_words[] = array (12 => '[[NETGEAR^JFS524 | http://www.netgear.com/Products/Switches/UnmanagedSwitches/JFS524.aspx]]');
812 $new_words[] = array (12 => '[[NETGEAR^JFS524F | http://www.netgear.com/Products/Switches/UnmanagedSwitches/JFS524F.aspx]]');
813 $new_words[] = array (12 => '[[NETGEAR^JGS524 | http://www.netgear.com/Products/Switches/UnmanagedSwitches/JGS524.aspx]]');
814 $new_words[] = array (12 => '[[NETGEAR^FS524 | http://www.netgear.com/Products/Switches/UnmanagedSwitches/FS524.aspx]]');
815 $new_words[] = array (12 => '[[NETGEAR^JFS516 | http://www.netgear.com/Products/Switches/UnmanagedSwitches/JFS516.aspx]]');
816 $new_words[] = array (12 => '[[NETGEAR^GSM7224R | http://www.netgear.com/Products/Switches/Layer2ManagedSwitches/GSM7224R.aspx]]');
817 $new_words[] = array (12 => '[[NETGEAR^GSM7248 | http://www.netgear.com/Products/Switches/Layer2ManagedSwitches/GSM7248.aspx]]');
818 $new_words[] = array (12 => '[[NETGEAR^GSM7212 | http://www.netgear.com/Products/Switches/Layer2ManagedSwitches/GSM7212.aspx]]');
819 $new_words[] = array (12 => '[[NETGEAR^FSM726S | http://www.netgear.com/Products/Switches/Layer2ManagedSwitches/FSM726S.aspx]]');
820 $new_words[] = array (12 => '[[NETGEAR^GSM7248R | http://www.netgear.com/Products/Switches/Layer2ManagedSwitches/GSM7248R.aspx]]');
821 $new_words[] = array (12 => '[[NETGEAR^GSM7224 | http://www.netgear.com/Products/Switches/Layer2ManagedSwitches/GSM7224.aspx]]');
822 $new_words[] = array (12 => '[[NETGEAR^FSM750S | http://www.netgear.com/Products/Switches/Layer2ManagedSwitches/FSM750S.aspx]]');
823 $new_words[] = array (12 => '[[NETGEAR^FSM726 | http://www.netgear.com/Products/Switches/Layer2ManagedSwitches/FSM726.aspx]]');
824 $new_words[] = array (12 => '[[NETGEAR^GS724TP | http://www.netgear.com/Products/Switches/SmartSwitches/GS724TP.aspx]]');
825 $new_words[] = array (12 => '[[NETGEAR^GS748TS | http://www.netgear.com/Products/Switches/SmartSwitches/GS748TS.aspx]]');
826 $new_words[] = array (12 => '[[NETGEAR^GS724T | http://www.netgear.com/Products/Switches/SmartSwitches/GS724T.aspx]]');
827 $new_words[] = array (12 => '[[NETGEAR^FS728TP | http://www.netgear.com/Products/Switches/SmartSwitches/FS728TP.aspx]]');
828 $new_words[] = array (12 => '[[NETGEAR^FS752TS | http://www.netgear.com/Products/Switches/SmartSwitches/FS752TS.aspx]]');
829 $new_words[] = array (12 => '[[NETGEAR^FS728TS | http://www.netgear.com/Products/Switches/SmartSwitches/FS728TS.aspx]]');
830 $new_words[] = array (12 => '[[NETGEAR^FS726T | http://www.netgear.com/Products/Switches/SmartSwitches/FS726T.aspx]]');
831 $new_words[] = array (12 => '[[NETGEAR^GS748TP | http://www.netgear.com/Products/Switches/SmartSwitches/GS748TP.aspx]]');
832 $new_words[] = array (12 => '[[NETGEAR^GS724TS | http://www.netgear.com/Products/Switches/SmartSwitches/GS724TS.aspx]]');
833 $new_words[] = array (12 => '[[NETGEAR^GS748T | http://www.netgear.com/Products/Switches/SmartSwitches/GS748T.aspx]]');
834 $new_words[] = array (12 => '[[NETGEAR^GS716T | http://www.netgear.com/Products/Switches/SmartSwitches/GS716T.aspx]]');
835 $new_words[] = array (12 => '[[NETGEAR^FS752TPS | http://www.netgear.com/Products/Switches/SmartSwitches/FS752TPS.aspx]]');
836 $new_words[] = array (12 => '[[NETGEAR^FS750T2 | http://www.netgear.com/Products/Switches/SmartSwitches/FS750T2.aspx]]');
837 $new_words[] = array (12 => '[[NETGEAR^FS726TP | http://www.netgear.com/Products/Switches/SmartSwitches/FS726TP.aspx]]');
838 $new_words[] = array (12 => '[[NETGEAR^FSM7328PS | http://www.netgear.com/Products/Switches/Layer3ManagedSwitches/FSM7328PS.aspx]]');
839 $new_words[] = array (12 => '[[NETGEAR^GSM7352S | http://www.netgear.com/Products/Switches/Layer3ManagedSwitches/GSM7352S.aspx]]');
840 $new_words[] = array (12 => '[[NETGEAR^GSM7324 | http://www.netgear.com/Products/Switches/Layer3ManagedSwitches/GSM7324.aspx]]');
841 $new_words[] = array (12 => '[[NETGEAR^FSM7326P | http://www.netgear.com/Products/Switches/Layer3ManagedSwitches/FSM7326P.aspx]]');
842 $new_words[] = array (12 => '[[NETGEAR^FSM7352PS | http://www.netgear.com/Products/Switches/Layer3ManagedSwitches/FSM7352PS.aspx]]');
843 $new_words[] = array (12 => '[[NETGEAR^GSM7328FS | http://www.netgear.com/Products/Switches/Layer3ManagedSwitches/GSM7328FS.aspx]]');
844 $new_words[] = array (12 => '[[NETGEAR^GSM7328S | http://www.netgear.com/Products/Switches/Layer3ManagedSwitches/GSM7328S.aspx]]');
845 $new_words[] = array (12 => '[[NETGEAR^GSM7312 | http://www.netgear.com/Products/Switches/Layer3ManagedSwitches/GSM7312.aspx]]');
846 $new_words[] = array (12 => '[[NETGEAR^FSM7328S | http://www.netgear.com/Products/Switches/Layer3ManagedSwitches/FSM7328S.aspx]]');
847 $new_words[] = array (12 => '[[NETGEAR^FSM7352S | http://www.netgear.com/Products/Switches/Layer3ManagedSwitches/FSM7352S.aspx]]');
848 $new_words[] = array (12 => '[[D-Link^DES-6500 | http://www.dlink.com/products/?sec=0&pid=341]]');
849 $new_words[] = array (12 => '[[D-Link^DWS-3227 | http://www.dlink.com/products/?sec=0&pid=506]]');
850 $new_words[] = array (12 => '[[D-Link^DWS-3227P | http://www.dlink.com/products/?sec=0&pid=507]]');
851 $new_words[] = array (12 => '[[D-Link^DWS-3250 | http://www.dlink.com/products/?sec=0&pid=468]]');
852 $new_words[] = array (12 => '[[D-Link^DWS-1008 | http://www.dlink.com/products/?sec=0&pid=434]]');
853 $new_words[] = array (12 => '[[D-Link^DGS-3612G | http://www.dlink.com/products/?sec=0&pid=557]]');
854 $new_words[] = array (12 => '[[D-Link^DGS-3627 | http://www.dlink.com/products/?sec=0&pid=639]]');
855 $new_words[] = array (12 => '[[D-Link^DGS-3650 | http://www.dlink.com/products/?sec=0&pid=640]]');
856 $new_words[] = array (12 => '[[D-Link^DGS-3324SR | http://www.dlink.com/products/?sec=0&pid=294]]');
857 $new_words[] = array (12 => '[[D-Link^DGS-3324SRi | http://www.dlink.com/products/?sec=0&pid=309]]');
858 $new_words[] = array (12 => '[[D-Link^DXS-3326GSR | http://www.dlink.com/products/?sec=0&pid=339]]');
859 $new_words[] = array (12 => '[[D-Link^DXS-3350SR | http://www.dlink.com/products/?sec=0&pid=340]]');
860 $new_words[] = array (12 => '[[D-Link^DES-3828 | http://www.dlink.com/products/?sec=0&pid=439]]');
861 $new_words[] = array (12 => '[[D-Link^DES-3828P | http://www.dlink.com/products/?sec=0&pid=440]]');
862 $new_words[] = array (12 => '[[D-Link^DGS-3100-24 | http://www.dlink.com/products/?sec=0&pid=635]]');
863 $new_words[] = array (12 => '[[D-Link^DGS-3100-24P | http://www.dlink.com/products/?sec=0&pid=636]]');
864 $new_words[] = array (12 => '[[D-Link^DGS-3100-48 | http://www.dlink.com/products/?sec=0&pid=637]]');
865 $new_words[] = array (12 => '[[D-Link^DGS-3100-48P | http://www.dlink.com/products/?sec=0&pid=638]]');
866 $new_words[] = array (12 => '[[D-Link^DXS-3227 | http://www.dlink.com/products/?sec=0&pid=483]]');
867 $new_words[] = array (12 => '[[D-Link^DXS-3227P | http://www.dlink.com/products/?sec=0&pid=497]]');
868 $new_words[] = array (12 => '[[D-Link^DXS-3250 | http://www.dlink.com/products/?sec=0&pid=443]]');
869 $new_words[] = array (12 => '[[D-Link^DGS-3024 | http://www.dlink.com/products/?sec=0&pid=404]]');
870 $new_words[] = array (12 => '[[D-Link^DGS-3224TGR | http://www.dlink.com/products/?sec=0&pid=269]]');
871 $new_words[] = array (12 => '[[D-Link^DGS-3048 | http://www.dlink.com/products/?sec=0&pid=496]]');
872 $new_words[] = array (12 => '[[D-Link^DES-3228PA | http://www.dlink.com/products/?sec=0&pid=644]]');
873 $new_words[] = array (12 => '[[D-Link^DES-3028 | http://www.dlink.com/products/?sec=0&pid=630]]');
874 $new_words[] = array (12 => '[[D-Link^DES-3028P | http://www.dlink.com/products/?sec=0&pid=631]]');
875 $new_words[] = array (12 => '[[D-Link^DES-3052 | http://www.dlink.com/products/?sec=0&pid=632]]');
876 $new_words[] = array (12 => '[[D-Link^DES-3052P | http://www.dlink.com/products/?sec=0&pid=633]]');
877 $new_words[] = array (12 => '[[D-Link^DES-3010FA | http://www.dlink.com/products/?sec=0&pid=423]]');
878 $new_words[] = array (12 => '[[D-Link^DES-3010GA | http://www.dlink.com/products/?sec=0&pid=424]]');
879 $new_words[] = array (12 => '[[D-Link^DES-3010PA | http://www.dlink.com/products/?sec=0&pid=469]]');
880 $new_words[] = array (12 => '[[D-Link^DES-3226L | http://www.dlink.com/products/?sec=0&pid=298]]');
881 $new_words[] = array (12 => '[[D-Link^DES-3526 | http://www.dlink.com/products/?sec=0&pid=330]]');
882 $new_words[] = array (12 => '[[D-Link^DES-3550 | http://www.dlink.com/products/?sec=0&pid=331]]');
883 $new_words[] = array (12 => '[[D-Link^DGS-1216T | http://www.dlink.com/products/?sec=0&pid=324]]');
884 $new_words[] = array (12 => '[[D-Link^DGS-1224T | http://www.dlink.com/products/?sec=0&pid=329]]');
885 $new_words[] = array (12 => '[[D-Link^DGS-1248T | http://www.dlink.com/products/?sec=0&pid=367]]');
886 $new_words[] = array (12 => '[[D-Link^DES-1316 | http://www.dlink.com/products/?sec=0&pid=353]]');
887 $new_words[] = array (12 => '[[D-Link^DES-1228 | http://www.dlink.com/products/?sec=0&pid=540]]');
888 $new_words[] = array (12 => '[[D-Link^DES-1228P | http://www.dlink.com/products/?sec=0&pid=541]]');
889 $new_words[] = array (12 => '[[D-Link^DES-1252 | http://www.dlink.com/products/?sec=0&pid=555]]');
890 $new_words[] = array (12 => '[[D-Link^DGS-1016D | http://www.dlink.com/products/?sec=0&pid=337]]');
891 $new_words[] = array (12 => '[[D-Link^DGS-1024D | http://www.dlink.com/products/?sec=0&pid=338]]');
892 $new_words[] = array (12 => '[[D-Link^DSS-24+ | http://www.dlink.com/products/?sec=0&pid=73]]');
893 $new_words[] = array (12 => '[[D-Link^DES-1024D | http://www.dlink.com/products/?sec=0&pid=75]]');
894 $new_words[] = array (12 => '[[D-Link^DES-1026G | http://www.dlink.com/products/?sec=0&pid=76]]');
895 $new_words[] = array (21 => '[[D-Link^DKVM-16 | http://www.dlink.com/products/?sec=0&pid=228]]');
896 $new_words[] = array (21 => '[[D-Link^DKVM-8E | http://www.dlink.com/products/?sec=0&pid=161]]');
897 $new_words[] = array (22 => '[[Raisecom^RC702 | http://www.raisecom-international.com/p/RC702.htm]]');
898 $new_words[] = array (22 => '[[Raisecom^RC702-GE | http://www.raisecom-international.com/p/RC702GE.htm]]');
899 $new_words[] = array (22 => '[[Raisecom^ISCOM4300 | http://www.raisecom-international.com/p/ISCOM4300.htm]]');
900 $new_words[] = array (22 => '[[Raisecom^RC953-FE4E1 | http://www.raisecom-international.com/p/RC953FE4E1.htm]]');
901 $new_words[] = array (22 => '[[Raisecom^RC953-FX4E1 | http://www.raisecom-international.com/p/RC953FE4E1.htm]]');
902 $new_words[] = array (22 => '[[Raisecom^RC953-FE8E1 | http://www.raisecom-international.com/p/RC953FE4E1.htm]]');
903 $new_words[] = array (22 => '[[Raisecom^RC953-FX8E1 | http://www.raisecom-international.com/p/RC953FE4E1.htm]]');
904 $new_words[] = array (22 => '[[Raisecom^RC953-8FE16E1 | http://www.raisecom-international.com/p/RC9538FE16E1.htm]]');
905 $new_words[] = array (22 => '[[Raisecom^RC953E-3FE16E1 | http://www.raisecom-international.com/p/RC953E-3FE16E1.htm]]');
906 $new_words[] = array (22 => '[[Raisecom^RC953-GESTM1 | http://www.raisecom-international.com/p/RC957.htm]]');
907 $new_words[] = array (22 => '[[Raisecom^OPCOM3100-155 | http://www.raisecom-international.com/p/OPCOM3100.htm]]');
908 $new_words[] = array (22 => '[[Raisecom^OPCOM3101-155 | http://www.raisecom-international.com/p/OPCOM3101.htm]]');
909 $new_words[] = array (22 => '[[Raisecom^RC831-120 | http://www.raisecom-international.com/p/RC831.htm]]');
910 $new_words[] = array (22 => '[[Raisecom^RC831-120-BL | http://www.raisecom-international.com/p/RC831.htm]]');
911 $new_words[] = array (22 => '[[Raisecom^RC831-240 | http://www.raisecom-international.com/p/RC831.htm]]');
912 $new_words[] = array (22 => '[[Raisecom^RC831-240E | http://www.raisecom-international.com/p/RC831.htm]]');
913 $new_words[] = array (22 => '[[Raisecom^RCMS2801-480GE-BL | http://www.raisecom-international.com/p/RCMS280X.htm]]');
914 $new_words[] = array (22 => '[[Raisecom^RCMS2801-120FE | http://www.raisecom-international.com/p/RCMS2801.htm]]');
915 $new_words[] = array (22 => '[[Raisecom^RCMS2801-120FE-BL | http://www.raisecom-international.com/p/RCMS2801.htm]]');
916 $new_words[] = array (22 => '[[Raisecom^RCMS2801-240FE | http://www.raisecom-international.com/p/RCMS2801.htm]]');
917 $new_words[] = array (22 => '[[Raisecom^RCMS2801-240FE-BL | http://www.raisecom-international.com/p/RCMS2801.htm]]');
918 $new_words[] = array (22 => '[[Raisecom^RCMS2801-240EFE | http://www.raisecom-international.com/p/RCMS2801.htm]]');
919 $new_words[] = array (22 => '[[Raisecom^RCMS2811-120FE | http://www.raisecom-international.com/p/RCMS2811.htm]]');
920 $new_words[] = array (22 => '[[Raisecom^RCMS2811-240FE | http://www.raisecom-international.com/p/RCMS2811.htm]]');
921 $new_words[] = array (22 => '[[Raisecom^RCMS2811-240FE-BL | http://www.raisecom-international.com/p/RCMS2811.htm]]');
922 $new_words[] = array (22 => '[[Raisecom^RCMS2811-480FE | http://www.raisecom-international.com/p/RCMS2811.htm]]');
923 $new_words[] = array (22 => '[[Raisecom^RCMS2811-480FE-BL | http://www.raisecom-international.com/p/RCMS2811.htm]]');
924 $new_words[] = array (22 => '[[Raisecom^RCMS2811-240EFE | http://www.raisecom-international.com/p/RCMS2811-240EFE.htm]]');
925 $new_words[] = array (22 => '[[Raisecom^RCMS2104-120 | http://www.raisecom-international.com/p/RCMS2000120.htm]]');
926 $new_words[] = array (22 => '[[Raisecom^RCMS2304-120 | http://www.raisecom-international.com/p/RCMS2000120.htm]]');
927 $new_words[] = array (22 => '[[Raisecom^RCMS2504-120 | http://www.raisecom-international.com/p/RCMS2000120.htm]]');
928 $new_words[] = array (22 => '[[Raisecom^RCMS2104-240 | http://www.raisecom-international.com/p/RCMS2000120.htm]]');
929 $new_words[] = array (22 => '[[Raisecom^RCMS2304-240 | http://www.raisecom-international.com/p/RCMS2000120.htm]]');
930 $new_words[] = array (22 => '[[Raisecom^RCMS2504-240 | http://www.raisecom-international.com/p/RCMS2000120.htm]]');
931 $new_words[] = array (22 => '[[Raisecom^RC801-120B | http://www.raisecom-international.com/p/RC800120.htm]]');
932 $new_words[] = array (22 => '[[Raisecom^RC801-240B | http://www.raisecom-international.com/p/RC800120.htm]]');
933 $new_words[] = array (22 => '[[Raisecom^RC801-480B | http://www.raisecom-international.com/p/RC800120.htm]]');
934 $new_words[] = array (22 => '[[Raisecom^RC803-120B | http://www.raisecom-international.com/p/RC800120.htm]]');
935 $new_words[] = array (22 => '[[Raisecom^RC803-240B | http://www.raisecom-international.com/p/RC800120.htm]]');
936 $new_words[] = array (22 => '[[Raisecom^RC803-480B | http://www.raisecom-international.com/p/RC800120.htm]]');
937 $new_words[] = array (22 => '[[Raisecom^RC805-120B | http://www.raisecom-international.com/p/RC800120.htm]]');
938 $new_words[] = array (22 => '[[Raisecom^RC805-240B | http://www.raisecom-international.com/p/RC800120.htm]]');
939 $new_words[] = array (22 => '[[Raisecom^RC805-480B | http://www.raisecom-international.com/p/RC800120.htm]]');
940 $new_words[] = array (2 => 'async serial^DB-9'); // 681
941 $new_words[] = array (2 => 'async serial^DB-25'); // 682
942 $new_words[] = array (12 => '[[Force10^S2410P | http://www.force10networks.com/products/s2410.asp]]');
943 $new_words[] = array (12 => '[[Extreme Networks^Summit X150-24t | http://www.extremenetworks.com/products/summit-x150.aspx]]');
944 $new_words[] = array (12 => '[[Extreme Networks^Summit X150-48t | http://www.extremenetworks.com/products/summit-x150.aspx]]');
945 $new_words[] = array (12 => '[[Extreme Networks^Summit X150-24p | http://www.extremenetworks.com/products/summit-x150.aspx]]');
946 $new_words[] = array (12 => '[[Extreme Networks^Summit X250e-24t | http://www.extremenetworks.com/products/summit-x250e.aspx]]');
947 $new_words[] = array (12 => '[[Extreme Networks^Summit X250e-48t | http://www.extremenetworks.com/products/summit-x250e.aspx]]');
948 $new_words[] = array (12 => '[[Extreme Networks^Summit X250e-24p | http://www.extremenetworks.com/products/summit-x250e.aspx]]');
949 $new_words[] = array (12 => '[[Extreme Networks^Summit X250e-48p | http://www.extremenetworks.com/products/summit-x250e.aspx]]');
950 $new_words[] = array (12 => '[[Extreme Networks^Summit X250e-24x | http://www.extremenetworks.com/products/summit-x250e.aspx]]');
951 $new_words[] = array (12 => '[[Extreme Networks^Summit X450-24t | http://www.extremenetworks.com/products/summit-x450.aspx]]');
952 $new_words[] = array (12 => '[[Extreme Networks^Summit X450-24x | http://www.extremenetworks.com/products/summit-x450.aspx]]');
953 $new_words[] = array (12 => '[[Extreme Networks^Summit X450a-24t | http://www.extremenetworks.com/products/summit-x450a.aspx]]');
954 $new_words[] = array (12 => '[[Extreme Networks^Summit X450a-48t | http://www.extremenetworks.com/products/summit-x450a.aspx]]');
955 $new_words[] = array (12 => '[[Extreme Networks^Summit X450a-24x | http://www.extremenetworks.com/products/summit-x450a.aspx]]');
956 $new_words[] = array (12 => '[[Extreme Networks^Summit X450e-24p | http://www.extremenetworks.com/products/summit-x450e.aspx]]');
957 $new_words[] = array (12 => '[[Extreme Networks^Summit X450e-48p | http://www.extremenetworks.com/products/summit-x450e.aspx]]');
958 $new_words[] = array (12 => '[[Extreme Networks^Summit 200-24fx | http://www.extremenetworks.com/products/summit-200.aspx]]');
959 $new_words[] = array (12 => '[[Extreme Networks^Summit 200-24 | http://www.extremenetworks.com/products/summit-200.aspx]]');
960 $new_words[] = array (12 => '[[Extreme Networks^Summit 200-48 | http://www.extremenetworks.com/products/summit-200.aspx]]');
961 $new_words[] = array (12 => '[[Extreme Networks^Summit 300-24 | http://www.extremenetworks.com/products/summit-300.aspx]]');
962 $new_words[] = array (12 => '[[Extreme Networks^Summit 300-48 | http://www.extremenetworks.com/products/summit-300.aspx]]');
963 $new_words[] = array (12 => '[[Extreme Networks^Summit 400-24p | http://www.extremenetworks.com/products/summit-400-24p.aspx]]');
964 $new_words[] = array (12 => '[[Extreme Networks^Summit 400-24t | http://www.extremenetworks.com/products/summit-400-24t.aspx]]');
965 $new_words[] = array (12 => '[[Extreme Networks^Summit 400-48t | http://www.extremenetworks.com/products/summit-400-48t.aspx]]');
966 $new_words[] = array (12 => '[[Extreme Networks^Summit48si | http://www.extremenetworks.com/products/summit-48si.aspx]]');
967 $new_words[] = array (12 => '[[Extreme Networks^Alpine 3804 | http://www.extremenetworks.com/products/Alpine-3800.aspx]]');
968 $new_words[] = array (12 => '[[Extreme Networks^Alpine 3808 | http://www.extremenetworks.com/products/Alpine-3800.aspx]]');
969 $new_words[] = array (12 => '[[Extreme Networks^BlackDiamond 6808 | http://www.extremenetworks.com/products/blackdiamond-6800.aspx]]');
970 $new_words[] = array (12 => '[[Extreme Networks^BlackDiamond 8806 | http://www.extremenetworks.com/products/blackdiamond-8800.aspx]]');
971 $new_words[] = array (12 => '[[Extreme Networks^BlackDiamond 8810 | http://www.extremenetworks.com/products/blackdiamond-8800.aspx]]');
972 $new_words[] = array (12 => '[[Extreme Networks^BlackDiamond 10808 | http://www.extremenetworks.com/products/blackdiamond-10808.aspx]]');
973 $new_words[] = array (12 => '[[Extreme Networks^BlackDiamond 12802R | http://www.extremenetworks.com/products/blackdiamond-12800r.aspx]]');
974 $new_words[] = array (12 => '[[Extreme Networks^BlackDiamond 12804R | http://www.extremenetworks.com/products/blackdiamond-12800r.aspx]]');
975 $new_words[] = array (12 => '[[Extreme Networks^BlackDiamond 12804C | http://www.extremenetworks.com/products/blackdiamond-12804c.aspx]]');
976 $new_words[] = array (17 => '[[Cisco^ASR 1002 | http://cisco.com/en/US/products/ps9436/index.html]]');
977 $new_words[] = array (17 => '[[Cisco^ASR 1004 | http://cisco.com/en/US/products/ps9437/index.html]]');
978 $new_words[] = array (17 => '[[Cisco^ASR 1006 | http://cisco.com/en/US/products/ps9438/index.html]]');
979 $new_words[] = array (13 => '[[BSD^OpenBSD 3.3 | http://openbsd.org/33.html]]');
980 $new_words[] = array (13 => '[[BSD^OpenBSD 3.4 | http://openbsd.org/34.html]]');
981 $new_words[] = array (13 => '[[BSD^OpenBSD 3.5 | http://openbsd.org/35.html]]');
982 $new_words[] = array (13 => '[[BSD^OpenBSD 3.6 | http://openbsd.org/36.html]]');
983 $new_words[] = array (13 => '[[BSD^OpenBSD 3.7 | http://openbsd.org/37.html]]');
984 $new_words[] = array (13 => '[[BSD^OpenBSD 3.8 | http://openbsd.org/38.html]]');
985 $new_words[] = array (13 => '[[BSD^OpenBSD 3.9 | http://openbsd.org/39.html]]');
986 $new_words[] = array (13 => '[[BSD^OpenBSD 4.0 | http://openbsd.org/40.html]]');
987 $new_words[] = array (13 => '[[BSD^OpenBSD 4.1 | http://openbsd.org/41.html]]');
988 $new_words[] = array (13 => '[[BSD^OpenBSD 4.2 | http://openbsd.org/42.html]]');
989 $new_words[] = array (13 => '[[BSD^OpenBSD 4.3 | http://openbsd.org/43.html]]');
9d26ec21
DO
990 $new_words[] = array (12 => '[[Cisco Catalyst^4900M | http://www.cisco.com/en/US/products/ps9310/index.html]]');
991 $new_words[] = array (13 => '[[BSD^FreeBSD 7.x | http://www.freebsd.org/releases/7.0R/announce.html]]');
94de55aa
DO
992 $new_words[] = array (13 => '[[BSD^NetBSD 2.0 | http://netbsd.org/releases/formal-2.0/]]');
993 $new_words[] = array (13 => '[[BSD^NetBSD 2.1 | http://netbsd.org/releases/formal-2.0/NetBSD-2.1.html]]');
994 $new_words[] = array (13 => '[[BSD^NetBSD 3.0 | http://netbsd.org/releases/formal-3/]]');
995 $new_words[] = array (13 => '[[BSD^NetBSD 3.1 | http://netbsd.org/releases/formal-3/NetBSD-3.1.html]]');
996 $new_words[] = array (13 => '[[BSD^NetBSD 4.0 | http://netbsd.org/releases/formal-4/NetBSD-4.0.html]]');
c2a4889d
DO
997 $new_words[] = array (12 => '[[3Com Baseline^2016 | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C16470B]]');
998 $new_words[] = array (12 => '[[3Com Baseline^2024 | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C16471B]]');
999 $new_words[] = array (12 => '[[3Com Baseline^2126-G | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C16472]]');
1000 $new_words[] = array (12 => '[[3Com Baseline^2816 | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C16478]]');
1001 $new_words[] = array (12 => '[[3Com Baseline^2824 | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C16479]]');
1002 $new_words[] = array (12 => '[[3Com Baseline^2226 Plus | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C16475CS]]');
1003 $new_words[] = array (12 => '[[3Com Baseline^2426-PWR Plus | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C16491]]');
1004 $new_words[] = array (12 => '[[3Com Baseline^2250 Plus | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C16476CS]]');
1005 $new_words[] = array (12 => '[[3Com Baseline^2916-SFP Plus | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CBLSG16]]');
1006 $new_words[] = array (12 => '[[3Com Baseline^2924-SFP Plus | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CBLSG24]]');
1007 $new_words[] = array (12 => '[[3Com Baseline^2924-PWR Plus | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CBLSG24PWR]]');
1008 $new_words[] = array (12 => '[[3Com Baseline^2948-SFP Plus | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CBLSG48]]');
1009 $new_words[] = array (12 => '[[3Com^3870 24-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17450-91]]');
1010 $new_words[] = array (12 => '[[3Com^3870 48-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17451-91]]');
1011 $new_words[] = array (12 => '[[3Com^4200 26-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&sku=3C17300A&pathtype=purchase]]');
1012 $new_words[] = array (12 => '[[3Com^4200 28-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&sku=3C17304A&pathtype=purchase]]');
1013 $new_words[] = array (12 => '[[3Com^4200 50-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&sku=3C17302A&pathtype=purchase]]');
1014 $new_words[] = array (12 => '[[3Com^4200G 12-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&sku=3CR17660-91&pathtype=purchase]]');
1015 $new_words[] = array (12 => '[[3Com^4200G 24-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&sku=3CR17661-91&pathtype=purchase]]');
1016 $new_words[] = array (12 => '[[3Com^4200G PWR 24-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&sku=3CR17671-91&pathtype=purchase]]');
1017 $new_words[] = array (12 => '[[3Com^4200G 48-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&sku=3CR17662-91&pathtype=purchase]]');
1018 $new_words[] = array (12 => '[[3Com^4210 26-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17333-91]]');
1019 $new_words[] = array (12 => '[[3Com^4210 52-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17334-91]]');
1020 $new_words[] = array (12 => '[[3Com^4210 26-port PWR | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17343-91]]');
1021 $new_words[] = array (12 => '[[3Com SuperStack^SS3 4400 48-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C17204-US]]');
1022 $new_words[] = array (12 => '[[3Com SuperStack^SS3 4400 24-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C17203-US]]');
1023 $new_words[] = array (12 => '[[3Com SuperStack^SS3 4400 PWR | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C17205-US]]');
1024 $new_words[] = array (12 => '[[3Com SuperStack^SS3 4400 SE 24-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C17206-US]]');
1025 $new_words[] = array (12 => '[[3Com^4500 26-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17561-91]]');
1026 $new_words[] = array (12 => '[[3Com^4500 50-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17562-91]]');
1027 $new_words[] = array (12 => '[[3Com^4500 PWR 26-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17571-91]]');
1028 $new_words[] = array (12 => '[[3Com^4500 PWR 50-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17572-91]]');
1029 $new_words[] = array (12 => '[[3Com^4500G 24-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17761-91]]');
1030 $new_words[] = array (12 => '[[3Com^4500G 48-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17762-91]]');
1031 $new_words[] = array (12 => '[[3Com^4500G PWR 24-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17771-91]]');
1032 $new_words[] = array (12 => '[[3Com^4500G PWR 48-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17772-91]]');
1033 $new_words[] = array (12 => '[[3Com^5500-EI 28-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17161-91]]');
1034 $new_words[] = array (12 => '[[3Com^5500-EI 52-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17162-91]]');
1035 $new_words[] = array (12 => '[[3Com^5500-EI 28-port PWR | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17171-91]]');
1036 $new_words[] = array (12 => '[[3Com^5500-EI 52-port PWR | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17172-91]]');
1037 $new_words[] = array (12 => '[[3Com^5500-EI 28-port FX | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17181-91]]');
1038 $new_words[] = array (12 => '[[3Com^5500G-EI 24-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17250-91]]');
1039 $new_words[] = array (12 => '[[3Com^5500G-EI 48-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17251-91]]');
1040 $new_words[] = array (12 => '[[3Com^5500G-EI PWR 24-port | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17252-91]]');
1041 $new_words[] = array (12 => '[[3Com^5500G-EI 48-port PWR | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17253-91]]');
1042 $new_words[] = array (12 => '[[3Com^5500G-EI 24-port SFP | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3CR17258-91]]');
1043 $new_words[] = array (12 => '[[3Com^7754 | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C16894]]');
1044 $new_words[] = array (12 => '[[3Com^7757 | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C16895]]');
1045 $new_words[] = array (12 => '[[3Com^7758 | http://www.3com.com/products/en_US/detail.jsp?tab=features&pathtype=purchase&sku=3C16896]]');
1046 $new_words[] = array (12 => '[[3Com^8807 | http://www.3com.com/products/en_US/detail.jsp?tab=features&sku=3C17502A&pathtype=purchase]]');
1047 $new_words[] = array (12 => '[[3Com^8810 | http://www.3com.com/products/en_US/detail.jsp?tab=features&sku=3C17501A&pathtype=purchase]]');
1048 $new_words[] = array (12 => '[[3Com^8814 | http://www.3com.com/products/en_US/detail.jsp?tab=features&sku=3C17500A&pathtype=purchase]]');
757e1414 1049 $query[] = "update Dictionary set dict_value = 'async serial^RJ-45' where dict_key = 29";
d8515eff
DO
1050 $query[] = "insert into PortCompat (type1, type2) values (29, 681)";
1051 $query[] = "insert into PortCompat (type1, type2) values (29, 682)";
1052 $query[] = "insert into PortCompat (type1, type2) values (681, 29)";
1053 $query[] = "insert into PortCompat (type1, type2) values (681, 681)";
1054 $query[] = "insert into PortCompat (type1, type2) values (681, 682)";
1055 $query[] = "insert into PortCompat (type1, type2) values (682, 29)";
1056 $query[] = "insert into PortCompat (type1, type2) values (682, 681)";
1057 $query[] = "insert into PortCompat (type1, type2) values (682, 682)";
71f42cdb
DO
1058 $query[] =
1059"
f9bc186f
DO
1060CREATE TABLE `TagStorage` (
1061 `target_realm` enum('object','ipv4net','rack','ipv4vs','ipv4rspool') NOT NULL default 'object',
1062 `target_id` int(10) unsigned NOT NULL,
71f42cdb 1063 `tag_id` int(10) unsigned default NULL,
f9bc186f
DO
1064 UNIQUE KEY `entity_tag` (`target_realm`,`target_id`,`tag_id`),
1065 KEY `target_id` (`target_id`)
71f42cdb
DO
1066) TYPE=MyISAM;
1067";
1068 $query[] =
1069"
1070CREATE TABLE `TagTree` (
1071 `id` int(10) unsigned NOT NULL auto_increment,
1072 `parent_id` int(10) unsigned default NULL,
1073 `tag` char(255) default NULL,
1074 PRIMARY KEY (`id`),
1075 UNIQUE KEY `tag` (`tag`)
1076) TYPE=MyISAM;
1077";
9d26ec21
DO
1078 $old_words[43] = 'IBM xSeries^305';
1079 $old_words[44] = 'IBM xSeries^306';
1080 $old_words[45] = 'IBM xSeries^306m';
1081 $old_words[46] = 'IBM xSeries^326m';
1082 $old_words[47] = 'IBM xSeries^330';
1083 $old_words[48] = 'IBM xSeries^335';
1084 $old_words[54] = 'IBM xSeries^346';
1085 $old_words[59] = 'IBM xSeries^326';
1086 $old_words[68] = 'IBM xSeries^3250';
1087 $old_words[69] = 'IBM xSeries^3455';
1088 $old_words[70] = 'IBM xSeries^3550';
1089 $old_words[71] = 'IBM xSeries^3650';
1090 $old_words[72] = 'IBM xSeries^3655';
1091 $old_words[73] = 'IBM xSeries^3650 T';
1092 $old_words[74] = 'IBM xSeries^3755';
1093 $old_words[75] = 'IBM xSeries^3850';
1094
1095 $old_words[92] = 'IBM pSeries^185';
1096 $old_words[93] = 'IBM pSeries^505';
1097 $old_words[94] = 'IBM pSeries^505Q';
1098 $old_words[95] = 'IBM pSeries^510';
1099 $old_words[96] = 'IBM pSeries^510Q';
1100 $old_words[97] = 'IBM pSeries^520';
1101 $old_words[98] = 'IBM pSeries^520Q';
1102 $old_words[99] = 'IBM pSeries^550';
1103 $old_words[100] = 'IBM pSeries^550Q';
1104
1105 $old_words[212] = 'Linux^RHFC1';
1106 $old_words[213] = 'Linux^RHFC2';
1107 $old_words[214] = 'Linux^RHFC3';
1108 $old_words[215] = 'Linux^RHFC4';
1109 $old_words[216] = 'Linux^RHFC5';
1110 $old_words[217] = 'Linux^RHFC6';
1111 $old_words[232] = 'Linux^RHF7';
1112 $old_words[242] = 'Linux^RHF8';
1113 $old_words[225] = 'Linux^RHEL1';
1114 $old_words[226] = 'Linux^RHEL2';
1115 $old_words[227] = 'Linux^RHEL3';
1116 $old_words[228] = 'Linux^RHEL4';
1117 $old_words[436] = 'Linux^RHEL5';
1118
1119 $old_words[229] = 'Linux^ALTLinux Master 2.0';
1120 $old_words[230] = 'Linux^ALTLinux Master 2.2';
1121 $old_words[231] = 'Linux^ALTLinux Master 2.4';
1122 $old_words[243] = 'Linux^ALTLinux Master 4.0';
1123 $old_words[231] = 'Linux^ALTLinux Master 2.4';
1124 $old_words[422] = 'Linux^ALTLinux Server 4.0';
1125 $old_words[423] = 'Linux^ALTLinux Sisyphus';
1126
1127 $old_words[233] = 'Linux^SLES10';
1128 $old_words[424] = 'Linux^openSUSE 10.0';
1129 $old_words[425] = 'Linux^openSUSE 10.1';
1130 $old_words[426] = 'Linux^openSUSE 10.2';
1131 $old_words[427] = 'Linux^openSUSE 10.3';
1132
1133 $old_words[428] = 'Linux^Ubuntu 4.10';
1134 $old_words[429] = 'Linux^Ubuntu 5.04';
1135 $old_words[430] = 'Linux^Ubuntu 5.10';
1136 $old_words[431] = 'Linux^Ubuntu 6.06 LTS';
1137 $old_words[432] = 'Linux^Ubuntu 6.10';
1138 $old_words[433] = 'Linux^Ubuntu 7.04';
1139 $old_words[434] = 'Linux^Ubuntu 7.10';
1140 $old_words[435] = 'Linux^Ubuntu 8.04 LTS';
1141
1142 $old_words[418] = 'Linux^Debian 2.0 (hamm)';
1143 $old_words[419] = 'Linux^Debian 2.1 (slink)';
1144 $old_words[420] = 'Linux^Debian 2.2 (potato)';
1145 $old_words[234] = 'Linux^Debian 3.0 (woody)';
1146 $old_words[235] = 'Linux^Debian 3.1 (sarge)';
1147 $old_words[421] = 'Linux^Debian 4.0 (etch)';
1148
1149 $old_words[236] = 'BSD^FreeBSD 1.x';
1150 $old_words[237] = 'BSD^FreeBSD 2.x';
1151 $old_words[238] = 'BSD^FreeBSD 3.x';
1152 $old_words[239] = 'BSD^FreeBSD 4.x';
1153 $old_words[240] = 'BSD^FreeBSD 5.x';
1154 $old_words[241] = 'BSD^FreeBSD 6.x';
1155 $old_words[732] = '[[BSD^FreeBSD 7.0 | http://www.freebsd.org/releases/7.0R/announce.html]]';
1156
1157 $old_words[441] = 'Linux^CentOS-2';
1158 $old_words[442] = 'Linux^CentOS-3';
1159 $old_words[443] = 'Linux^CentOS-4';
1160 $old_words[444] = 'Linux^CentOS-5';
1161
1162 $old_words[218] = 'BSD^Solaris 8';
1163 $old_words[219] = 'BSD^Solaris 9';
1164 $old_words[220] = 'BSD^Solaris 10';
1165
1166 $old_words[221] = 'Windows^2000';
1167 $old_words[222] = 'Windows^XP';
1168 $old_words[223] = 'Windows^2003';
1169 $old_words[224] = 'Windows^Vista';
1170
124fec2e
DO
1171 $old_words[49] = 'Sun^Ultra 10';
1172 $old_words[50] = 'Sun^Enterprise 420R';
1173 $old_words[51] = '[[Sun^Fire X2100 | http://www.sun.com/servers/entry/x2100/]]';
1174 $old_words[52] = '[[Sun^Fire E4900 | http://www.sun.com/servers/midrange/sunfire_e4900/index.xml]]';
1175 $old_words[53] = 'Sun^Netra X1';
1176 $old_words[57] = 'Sun^Fire V210';
1177 $old_words[58] = 'Sun^Fire V240';
1178 $old_words[60] = 'Sun^Netra t1 105';
1179 $old_words[61] = 'Sun^Enterprise 4500';
1180 $old_words[64] = 'Sun^Ultra 5';
1181 $old_words[76] = '[[Sun^Fire X4600 | http://www.sun.com/servers/x64/x4600/]]';
1182 $old_words[77] = '[[Sun^Fire X4500 | http://www.sun.com/servers/x64/x4500/]]';
1183 $old_words[78] = '[[Sun^Fire X4200 | http://www.sun.com/servers/entry/x4200/]]';
1184 $old_words[79] = '[[Sun^Fire X4100 | http://www.sun.com/servers/entry/x4100/]]';
1185 $old_words[80] = '[[Sun^Fire X2100 M2 | http://www.sun.com/servers/entry/x2100/]]';
1186 $old_words[81] = '[[Sun^Fire X2200 M2 | http://www.sun.com/servers/x64/x2200/]]';
1187 $old_words[82] = 'Sun^Fire V40z';
1188 $old_words[83] = 'Sun^Fire V125';
1189 $old_words[84] = '[[Sun^Fire V215 | http://www.sun.com/servers/entry/v215/]]';
1190 $old_words[85] = '[[Sun^Fire V245 | http://www.sun.com/servers/entry/v245/]]';
1191 $old_words[86] = '[[Sun^Fire V445 | http://www.sun.com/servers/entry/v445/]]';
1192 $old_words[87] = 'Sun^Fire V440';
1193 $old_words[88] = '[[Sun^Fire V490 | http://www.sun.com/servers/midrange/v490/]]';
1194 $old_words[89] = '[[Sun^Fire V890 | http://www.sun.com/servers/midrange/v890/]]';
1195 $old_words[90] = '[[Sun^Fire E2900 | http://www.sun.com/servers/midrange/sunfire_e2900/index.xml]]';
1196 $old_words[91] = 'Sun^Fire V1280';
1197
86fc1740
DO
1198 foreach ($new_words as $dict_key => $tmp)
1199 foreach ($tmp as $chapter_no => $dict_value)
1200 $query[] = 'INSERT INTO `Dictionary` (`chapter_no`, `dict_key`, `dict_value`) ' .
1201 "VALUES (${chapter_no}, ${dict_key}, '${dict_value}')";
9d26ec21
DO
1202 foreach ($old_words as $dict_key => $dict_value)
1203 $query[] = "update Dictionary set dict_value = '${dict_value}' where dict_key = ${dict_key} limit 1";
3526c7c6 1204 $query[] = "alter table Rack add unique name_in_row (row_id, name)";
dc327897 1205 $query[] = "delete from UserPermission where page = 'help'";
194e3748
DO
1206 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('SHOW_EXPLICIT_TAGS','yes','string','no','no','Show explicit tags')";
1207 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('SHOW_IMPLICIT_TAGS','yes','string','no','no','Show implicit tags')";
1208 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('SHOW_AUTOMATIC_TAGS','no','string','no','no','Show automatic tags')";
86fc1740
DO
1209 $query[] = "update Config set varvalue = '0.14.13' where varname = 'DB_VERSION'";
1210 break; // --------------------------------------------
1211# case '0.14.14':
80a40611
DO
1212# $query[] = "alter table Rack add column left_is_front enum ('yes', 'no') not null default 'yes' after height";
1213# $query[] = "alter table Rack add column bottom_is_unit1 enum ('yes', 'no') not null default 'yes' after left_is_front";
86fc1740 1214# $query[] = "update Config set varvalue = '0.14.14' where varname = 'DB_VERSION'";
80a40611 1215# break; // --------------------------------------------
fbbb74fb
DO
1216 default:
1217 showError ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined");
1218 die;
1219 break;
1220 }
fbbb74fb 1221 $failures = array();
ce109ff2 1222 $ndots = 0;
22e40283 1223 echo "<pre>Executing database upgrade batch '${batchid}':\n";
fbbb74fb
DO
1224 foreach ($query as $q)
1225 {
1226 $result = $dbxlink->query ($q);
1227 if ($result != NULL)
fbbb74fb 1228 echo '.';
758fe24c
DO
1229 else
1230 {
1231 echo '!';
1232 $errorInfo = $dbxlink->errorInfo();
1233 $failures[] = array ($q, $errorInfo[2]);
1234 }
1235 if (++$ndots == 50)
1236 {
1237 echo "\n";
15a50768 1238 flush();
758fe24c 1239 $ndots = 0;
fbbb74fb 1240 }
fbbb74fb
DO
1241 }
1242 echo '<br>';
1243 if (!count ($failures))
1244 echo "No errors!\n";
1245 else
1246 {
7fc5565c 1247 echo "The following queries failed:\n<font color=red>";
fbbb74fb
DO
1248 foreach ($failures as $f)
1249 {
1250 list ($q, $i) = $f;
1251 echo "${q} // ${i}\n";
1252 }
1253 }
7fc5565c 1254 echo '</font></pre>';
fbbb74fb
DO
1255}
1256
1257// ******************************************************************
1258//
1259// Execution starts here
1260//
1261// ******************************************************************
1262
1263$root = (empty($_SERVER['HTTPS'])?'http':'https').
1264 '://'.
1265 (isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:($_SERVER['SERVER_NAME'].($_SERVER['SERVER_PORT']=='80'?'':$_SERVER['SERVER_PORT']))).
54c2a7a8
DO
1266 dirname($_SERVER['PHP_SELF']);
1267if (substr ($root, -1) != '/')
1268 $root .= '/';
fbbb74fb
DO
1269
1270// The below will be necessary as long as we rely on showError()
1271require_once 'inc/interface.php';
1272
1273require_once 'inc/config.php';
1274require_once 'inc/database.php';
1275if (file_exists ('inc/secret.php'))
1276 require_once 'inc/secret.php';
1277else
1278 die ("Database connection parameters are read from inc/secret.php file, " .
1279 "which cannot be found.\nCopy provided inc/secret-sample.php to " .
1280 "inc/secret.php and modify to your setup.\n\nThen reload the page.");
1281
1282try
1283{
1284 $dbxlink = new PDO ($pdo_dsn, $db_username, $db_password);
1285}
1286catch (PDOException $e)
1287{
1288 die ("Database connection failed:\n\n" . $e->getMessage());
1289}
1290
fbbb74fb
DO
1291// Now we need to be sure that the current user is the administrator.
1292// The rest doesn't matter within this context.
1293// We still continue to use the current authenticator though, but this will
1294// last only till the UserAccounts remains the same. After that this file
1295// will have to dig into the DB for the user accounts.
1296require_once 'inc/auth.php';
1297
1298// This will not fail sanely, because getUserAccounts() depends on showError()
1299$accounts = getUserAccounts();
1300
d78fdaea
DO
1301// Only administrator is always authenticated locally, so reject others
1302// for authenticate() to succeed.
99ee5479
DO
1303
1304if
1305(
1306 !isset ($_SERVER['PHP_AUTH_USER']) or
1307 !isset ($_SERVER['PHP_AUTH_PW']) or
1308 $accounts[$_SERVER['PHP_AUTH_USER']]['user_id'] != 1 or
1309 !authenticated_via_database (escapeString ($_SERVER['PHP_AUTH_USER']), escapeString ($_SERVER['PHP_AUTH_PW']))
1310)
1311{
c0142c01
DO
1312 header ('WWW-Authenticate: Basic realm="RackTables upgrade"');
1313 header ('HTTP/1.0 401 Unauthorized');
1314 showError ('You must be authenticated as an administrator to complete the upgrade.');
99ee5479
DO
1315 die;
1316}
fbbb74fb
DO
1317
1318$dbver = getDatabaseVersion();
1319echo 'Code version == ' . CODE_VERSION;
1320echo '<br>Database version == ' . $dbver;
1321if ($dbver == CODE_VERSION)
758fe24c 1322{
fbbb74fb
DO
1323 die ("<p align=justify>Your database seems to be up-to-date. " .
1324 "Now the best thing to do would be to follow to the <a href='${root}'>main page</a> " .
1325 "and explore your data. Have a nice day.</p>");
758fe24c 1326}
fbbb74fb
DO
1327
1328foreach (getDBUpgradePath ($dbver, CODE_VERSION) as $batchid)
1329 executeUpgradeBatch ($batchid);
1330
1331echo '<br>Database version == ' . getDatabaseVersion();
1332echo "<p align=justify>Your database seems to be up-to-date. " .
1333 "Now the best thing to do would be to follow to the <a href='${root}'>main page</a> " .
1334 "and explore your data. Have a nice day.</p>";
1335
1336?>