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