r4073 minor change in UI for recent change: VST form commit on ENTER and hints on...
[racktables] / upgrade.php
CommitLineData
6dc745d2 1<?php
fbbb74fb 2
90b96ff6
DO
3$relnotes = array
4(
5ae6d365
DO
5 '0.17.0' => <<<ENDOFTEXT
6LDAP options have been moved to LDAP_options array. This means, that if you were
7using LDAP authentication for users in version 0.16.x, it will break right after
8upgrade to 0.17.0. To get things working again, adjust existing secret.php file
9according to secret-sample.php file provided with 0.17.0 release.
10
11This release is the first to take advantage of the foreign key support
12provided by the InnoDB storage engine in MySQL. The installer and
13upgrader scripts check for InnoDB support and cannot complete without it.
14If you have trouble, the first step is to make sure the 'skip-innodb'
15option in my.cnf is commented out.
16
17Another change is the addition of support for file uploads. Files are stored
18in the database. There are several settings in php.ini which you may need to modify:
19 file_uploads - needs to be On
20 upload_max_filesize - max size for uploaded files
21 post_max_size - max size of all form data submitted via POST (including files)
22
23User accounts used to have 'enabled' flag, which allowed individual blocking and
24unblocking of each. This flag was dropped in favor of existing mean of access
25setup (RackCode). An unconditional denying rule is automatically added into RackCode
26for such blocked account, so the effective security policy remains the same.
27ENDOFTEXT
28,
1679ddbd
DO
29 '0.18.2' => <<<ENDOFTEXT
30RackTables from its version 0.18.0 and later is not compatible with
31RHEL/CentOS (at least with versions up to 5.5) Linux distributions
32in their default installation. There are yet options to work around that:
331. Install RackTables on a server with a different distribution/OS.
342. Request Linux distribution vendor to fix the bug with PCRE.
353. Repair your RHEL/CentOS installation yourself by fixing its PCRE
36RPM as explained here: http://bugs.centos.org/view.php?id=3252
37ENDOFTEXT
5ae6d365 38,
90b96ff6
DO
39);
40
fbbb74fb
DO
41// At the moment we assume, that for any two releases we can
42// sequentally execute all batches, that separate them, and
43// nothing will break. If this changes one day, the function
44// below will have to generate smarter upgrade paths, while
45// the upper layer will remain the same.
46// Returning an empty array means that no upgrade is necessary.
4114697d 47// Returning NULL indicates an error.
fbbb74fb
DO
48function getDBUpgradePath ($v1, $v2)
49{
a6f83a72
DO
50 $versionhistory = array
51 (
b3f866fc 52 '0.16.4',
64347dcf 53 '0.16.5',
90b96ff6 54 '0.16.6',
30d0a2a3 55 '0.17.0',
4563cecb 56 '0.17.1',
7b1a3a72 57 '0.17.2',
9e51318b 58 '0.17.3',
958ac06d 59 '0.17.4',
9f572fb5 60 '0.17.5',
63811a09 61 '0.17.6',
026a79ee 62 '0.17.7',
3540d15c 63 '0.17.8',
1e81ad97 64 '0.17.9',
f32167d2 65 '0.17.10',
4a4a5440 66 '0.17.11',
9013f05b 67 '0.18.0',
425fd829 68 '0.18.1',
298d2375 69 '0.18.2',
f6d1a7cc 70 '0.18.3',
1c5b7c84 71 '0.18.4',
92ee2b01 72 '0.18.5',
16825cc8 73 '0.19.0',
a6f83a72 74 );
120e9ddd
DO
75 if (!in_array ($v1, $versionhistory) or !in_array ($v2, $versionhistory))
76 return NULL;
fbbb74fb 77 $skip = TRUE;
4114697d 78 $path = NULL;
fbbb74fb
DO
79 // Now collect all versions > $v1 and <= $v2
80 foreach ($versionhistory as $v)
81 {
4114697d 82 if ($skip and $v == $v1)
fbbb74fb
DO
83 {
84 $skip = FALSE;
4114697d 85 $path = array();
fbbb74fb
DO
86 continue;
87 }
88 if ($skip)
89 continue;
90 $path[] = $v;
91 if ($v == $v2)
92 break;
93 }
94 return $path;
95}
96
90b96ff6
DO
97// Upgrade batches are named exactly as the release where they first appear.
98// That is simple, but seems sufficient for beginning.
fbbb74fb
DO
99function executeUpgradeBatch ($batchid)
100{
101 $query = array();
ca3d68bd 102 global $dbxlink;
fbbb74fb
DO
103 switch ($batchid)
104 {
64347dcf
DO
105 case '0.16.5':
106 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4_TREE_SHOW_USAGE','yes','string','no','no','Show address usage in IPv4 tree')";
107 $query[] = "update Config set varvalue = '0.16.5' where varname = 'DB_VERSION'";
108 break;
90b96ff6
DO
109 case '0.16.6':
110 $query[] = "update Config set varvalue = '0.16.6' where varname = 'DB_VERSION'";
111 break;
30d0a2a3 112 case '0.17.0':
e1ae3fb4
AD
113 // create tables for storing files (requires InnoDB support)
114 if (!isInnoDBSupported ())
115 {
5d168fde 116 showFailure ("Cannot upgrade because InnoDB tables are not supported by your MySQL server. See the README for details.", __FILE__);
f3c50166 117 die;
e1ae3fb4 118 }
f76c4197
DY
119
120 $query[] = "alter table Chapter change chapter_no id int(10) unsigned NOT NULL auto_increment";
121 $query[] = "alter table Chapter change chapter_name name char(128) NOT NULL";
122 $query[] = "alter table Chapter drop key chapter_name";
123 $query[] = "alter table Chapter add UNIQUE KEY name (name)";
124 $query[] = "alter table Attribute change attr_id id int(10) unsigned NOT NULL auto_increment";
125 $query[] = "alter table Attribute change attr_type type enum('string','uint','float','dict') default NULL";
126 $query[] = "alter table Attribute change attr_name name char(64) default NULL";
127 $query[] = "alter table Attribute drop key attr_name";
128 $query[] = "alter table Attribute add UNIQUE KEY name (name)";
129 $query[] = "alter table AttributeMap change chapter_no chapter_id int(10) unsigned NOT NULL";
130 $query[] = "alter table Dictionary change chapter_no chapter_id int(10) unsigned NOT NULL";
3fb336f6 131 // Only after the above call it is Ok to use reloadDictionary()
ca3d68bd 132 $query = array_merge ($query, reloadDictionary ($batchid));
f3c50166 133 // schema changes for file management
e1ae3fb4
AD
134 $query[] = "
135CREATE TABLE `File` (
136 `id` int(10) unsigned NOT NULL auto_increment,
137 `name` char(255) NOT NULL,
138 `type` char(255) NOT NULL,
139 `size` int(10) unsigned NOT NULL,
140 `ctime` datetime NOT NULL,
141 `mtime` datetime NOT NULL,
142 `atime` datetime NOT NULL,
143 `contents` longblob NOT NULL,
144 `comment` text,
13edfa1c
AD
145 PRIMARY KEY (`id`),
146 UNIQUE KEY `name` (`name`)
e1ae3fb4
AD
147) ENGINE=InnoDB";
148 $query[] = "
149CREATE TABLE `FileLink` (
150 `id` int(10) unsigned NOT NULL auto_increment,
151 `file_id` int(10) unsigned NOT NULL,
152 `entity_type` enum('ipv4net','ipv4rspool','ipv4vs','object','rack','user') NOT NULL default 'object',
153 `entity_id` int(10) NOT NULL,
154 PRIMARY KEY (`id`),
af721881 155 UNIQUE KEY `FileLink-unique` (`file_id`,`entity_type`,`entity_id`),
e1ae3fb4
AD
156 KEY `FileLink-file_id` (`file_id`),
157 CONSTRAINT `FileLink-File_fkey` FOREIGN KEY (`file_id`) REFERENCES `File` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
158) ENGINE=InnoDB";
159 $query[] = "ALTER TABLE TagStorage MODIFY COLUMN target_realm enum('file','ipv4net','ipv4rspool','ipv4vs','object','rack','user') NOT NULL default 'object'";
f3c50166 160
f76c4197 161 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (24,'no','network security models')";
9730d09f 162 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (25,'no','wireless models')";
f76c4197
DY
163 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,1,0)";
164 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,2,24)";
165 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,3,0)";
166 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,5,0)";
167 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,14,0)";
168 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,16,0)";
169 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,17,0)";
170 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,18,0)";
171 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,20,0)";
172 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,21,0)";
173 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,22,0)";
174 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,24,0)";
9730d09f
DO
175 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (965,1,0)";
176 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (965,3,0)";
177 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (965,2,25)";
706ce117
DO
178 $query[] = 'alter table IPBonds rename to IPv4Allocation';
179 $query[] = 'alter table PortForwarding rename to IPv4NAT';
180 $query[] = 'alter table IPRanges rename to IPv4Network';
181 $query[] = 'alter table IPAddress rename to IPv4Address';
182 $query[] = 'alter table IPLoadBalancer rename to IPv4LB';
4114697d 183 $query[] = 'alter table IPRSPool rename to IPv4RSPool';
706ce117 184 $query[] = 'alter table IPRealServer rename to IPv4RS';
4114697d 185 $query[] = 'alter table IPVirtualService rename to IPv4VS';
120e9ddd
DO
186 $query[] = "alter table TagStorage change column target_realm entity_realm enum('file','ipv4net','ipv4vs','ipv4rspool','object','rack','user') NOT NULL default 'object'";
187 $query[] = 'alter table TagStorage change column target_id entity_id int(10) unsigned NOT NULL';
188 $query[] = 'alter table TagStorage drop key entity_tag';
189 $query[] = 'alter table TagStorage drop key target_id';
190 $query[] = 'alter table TagStorage add UNIQUE KEY `entity_tag` (`entity_realm`,`entity_id`,`tag_id`)';
191 $query[] = 'alter table TagStorage add KEY `entity_id` (`entity_id`)';
37e59768
DO
192 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_MAXCHARS','10240','uint','yes','no','Max chars for text file preview')";
193 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_ROWS','25','uint','yes','no','Rows for text file preview')";
194 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_COLS','80','uint','yes','no','Columns for text file preview')";
195 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_IMAGE_MAXPXS','320','uint','yes','no','Max pixels per axis for image file preview')";
f3d274bf 196 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('VENDOR_SIEVE','','string','yes','no','Vendor sieve configuration')";
073ed463
DO
197 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4LB_LISTSRC','{\$typeid_4}','string','yes','no','List source: IPv4 load balancers')";
198 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4OBJ_LISTSRC','{\$typeid_4} or {\$typeid_7} or {\$typeid_8} or {\$typeid_12} or {\$typeid_445} or {\$typeid_447}','string','yes','no','List source: IPv4-enabled objects')";
199 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4NAT_LISTSRC','{\$typeid_4} or {\$typeid_7} or {\$typeid_8}','string','yes','no','List source: IPv4 NAT performers')";
200 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('ASSETWARN_LISTSRC','{\$typeid_4} or {\$typeid_7} or {\$typeid_8}','string','yes','no','List source: object, for which asset tag should be set')";
201 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('NAMEWARN_LISTSRC','{\$typeid_4} or {\$typeid_7} or {\$typeid_8}','string','yes','no','List source: object, for which common name should be set')";
f5883ec1 202 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('RACKS_PER_ROW','12','unit','yes','no','Racks per row')";
590e1281 203 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_PREDICATE_SIEVE','','string','yes','no','Predicate sieve regex(7)')";
5496c89f
DO
204 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_DEFAULT_ANDOR','or','string','no','no','Default list filter boolean operation (or/and)')";
205 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_SUGGEST_ANDOR','yes','string','no','no','Suggest and/or selector in list filter')";
206 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_SUGGEST_TAGS','yes','string','no','no','Suggest tags in list filter')";
207 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_SUGGEST_PREDICATES','yes','string','no','no','Suggest predicates in list filter')";
208 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_SUGGEST_EXTRA','no','string','no','no','Suggest extra expression in list filter')";
529eac25
DO
209 $query[] = "delete from Config where varname = 'USER_AUTH_SRC'";
210 $query[] = "delete from Config where varname = 'COOKIE_TTL'";
211 $query[] = "delete from Config where varname = 'rtwidth_0'";
212 $query[] = "delete from Config where varname = 'rtwidth_1'";
213 $query[] = "delete from Config where varname = 'rtwidth_2'";
c6bc0ac5
DO
214 $query[] = "delete from Config where varname = 'NAMEFUL_OBJTYPES'";
215 $query[] = "delete from Config where varname = 'REQUIRE_ASSET_TAG_FOR'";
216 $query[] = "delete from Config where varname = 'IPV4_PERFORMERS'";
217 $query[] = "delete from Config where varname = 'NATV4_PERFORMERS'";
dbb33805 218 $query[] = "alter table TagTree add column valid_realm set('file','ipv4net','ipv4vs','ipv4rspool','object','rack','user') not null default 'file,ipv4net,ipv4vs,ipv4rspool,object,rack,user' after parent_id";
a476909e
DO
219 $result = $dbxlink->query ("select user_id, user_name, user_realname from UserAccount where user_enabled = 'no'");
220 while ($row = $result->fetch (PDO::FETCH_ASSOC))
221 $query[] = "update Script set script_text = concat('deny {\$userid_${row['user_id']}} # ${row['user_name']} (${row['user_realname']})\n', script_text) where script_name = 'RackCode'";
222 $query[] = "update Script set script_text = NULL where script_name = 'RackCodeCache'";
223 unset ($result);
79b8ad1e 224 $query[] = "alter table UserAccount drop column user_enabled";
f76c4197 225
10bac82a
DY
226 $query[] = "CREATE TABLE RackRow ( id int(10) unsigned NOT NULL auto_increment, name char(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM";
227
9f14a7ef
DY
228 $result = $dbxlink->query ("select dict_key, dict_value from Dictionary where chapter_no = 3");
229 while($row = $result->fetch(PDO::FETCH_NUM))
10bac82a 230 $query[] = "insert into RackRow set id=${row[0]}, name='${row[1]}'";
ee286837 231 unset ($result);
f76c4197 232 $query[] = "delete from Dictionary where chapter_id = 3";
c4d0dc30 233 $query[] = "delete from Chapter where id = 3";
9133d2c5
DO
234 $query[] = "
235CREATE TABLE `LDAPCache` (
236 `presented_username` char(64) NOT NULL,
237 `successful_hash` char(40) NOT NULL,
238 `first_success` timestamp NOT NULL default CURRENT_TIMESTAMP,
239 `last_retry` timestamp NOT NULL default '0000-00-00 00:00:00',
240 `displayed_name` char(128) default NULL,
241 `memberof` text,
242 UNIQUE KEY `presented_username` (`presented_username`),
243 KEY `scanidx` (`presented_username`,`successful_hash`)
244) ENGINE=InnoDB;";
3827da34 245 $query[] = "alter table UserAccount modify column user_password_hash char(40) NULL";
aa9a0fb4
DO
246 $query[] = 'ALTER TABLE Rack DROP COLUMN deleted';
247 $query[] = 'ALTER TABLE RackHistory DROP COLUMN deleted';
248 $query[] = 'ALTER TABLE RackObject DROP COLUMN deleted';
249 $query[] = 'ALTER TABLE RackObjectHistory DROP COLUMN deleted';
2fb9d280
DO
250 // Can't be added straight due to many duplicates, even in "dictbase" data.
251 $result = $dbxlink->query ('SELECT type1, type2, count(*) - 1 as excess FROM PortCompat GROUP BY type1, type2 HAVING excess > 0');
252 while ($row = $result->fetch (PDO::FETCH_ASSOC))
253 $query[] = "DELETE FROM PortCompat WHERE type1 = ${row['type1']} AND type2 = ${row['type2']} limit ${row['excess']}";
254 unset ($result);
255 $query[] = 'ALTER TABLE PortCompat DROP KEY type1';
67d8a969 256 $query[] = 'ALTER TABLE PortCompat ADD UNIQUE `type1_2` (type1, type2)';
f76c4197
DY
257 $query[] = "UPDATE Config SET varvalue = '0.17.0' WHERE varname = 'DB_VERSION'";
258
b3f866fc 259 break;
4563cecb 260 case '0.17.1':
8b200a9c 261 $query[] = "ALTER TABLE Dictionary DROP KEY `chap_to_key`";
ca3d68bd 262 $query = array_merge ($query, reloadDictionary ($batchid));
4563cecb
DO
263 // Token set has changed, so the cache isn't valid any more.
264 $query[] = "UPDATE Script SET script_text = NULL WHERE script_name = 'RackCodeCache'";
265 $query[] = "UPDATE Config SET varvalue = '0.17.1' WHERE varname = 'DB_VERSION'";
7d4ea62b 266 break;
7b1a3a72 267 case '0.17.2':
7b1a3a72 268 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (26,'no','fibre channel switch models')";
ca3d68bd 269 $query = array_merge ($query, reloadDictionary ($batchid));
7c537f33 270 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1055,2,26)";
49b605d9 271 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('DEFAULT_SNMP_COMMUNITY','public','string','no','no','Default SNMP Community string')";
29c3a4d8
DO
272 // wipe irrelevant records (ticket:250)
273 $query[] = "DELETE FROM TagStorage WHERE entity_realm = 'file' AND entity_id NOT IN (SELECT id FROM File)";
f06fe423 274 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4_ENABLE_KNIGHT','yes','string','no','no','Enable IPv4 knight feature')";
99ab184f 275 $query[] = "ALTER TABLE IPv4Network ADD COLUMN comment text AFTER name";
5163cd3a 276 $query[] = "ALTER TABLE Port ADD INDEX comment (reservation_comment)";
029a14bc
DO
277 $query[] = "ALTER TABLE Port DROP KEY l2address"; // UNIQUE
278 $query[] = "ALTER TABLE Port ADD KEY (l2address)"; // not UNIQUE
948666cc
DO
279 $query[] = "ALTER TABLE Port DROP KEY object_id";
280 $query[] = "ALTER TABLE Port ADD UNIQUE KEY per_object (object_id, name, type)";
74aee2dc
DO
281 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (20,1083)";
282 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (21,1083)";
283 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1077,1077)";
284 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1083,20)";
285 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1083,21)";
286 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1083,1083)";
1c4830dc 287 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1087,1087)";
50e02490
DO
288 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (27,'no','PDU models')";
289 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (2,2,27)";
7b1a3a72
AD
290 $query[] = "UPDATE Config SET varvalue = '0.17.2' WHERE varname = 'DB_VERSION'";
291 break;
9e51318b
DO
292 case '0.17.3':
293 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('TAGS_TOPLIST_SIZE','50','uint','yes','no','Tags top list size')";
294 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('TAGS_QUICKLIST_SIZE','20','uint','no','no','Tags quick list size')";
295 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('TAGS_QUICKLIST_THRESHOLD','50','uint','yes','no','Tags quick list threshold')";
87601bbc 296 $query[] = "ALTER TABLE AttributeMap MODIFY COLUMN chapter_id int(10) unsigned NULL";
7028a42c 297 $query[] = "UPDATE AttributeMap SET chapter_id = NULL WHERE attr_id IN (SELECT id FROM Attribute WHERE type != 'dict')";
a013838b
DO
298 // ticket:239
299 $query[] = 'UPDATE AttributeValue SET uint_value = 1018 WHERE uint_value = 731 AND attr_id IN (SELECT attr_id FROM AttributeMap WHERE chapter_id = 12)';
300 $query[] = 'DELETE FROM Dictionary WHERE dict_key = 731';
084aca6c
DO
301 $query = array_merge ($query, reloadDictionary ($batchid));
302 $query[] = "UPDATE Config SET vartype='uint' WHERE varname='RACKS_PER_ROW'";
f44fdef9 303 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('ENABLE_MULTIPORT_FORM','no','string','no','no','Enable \"Add/update multiple ports\" form')";
9e51318b
DO
304 $query[] = "UPDATE Config SET varvalue = '0.17.3' WHERE varname = 'DB_VERSION'";
305 break;
958ac06d
DO
306 case '0.17.4':
307 $query[] = "ALTER TABLE Link ENGINE=InnoDB";
308 $query[] = "ALTER TABLE Port ENGINE=InnoDB";
4d87feaf
DO
309 $query[] = "ALTER TABLE IPv4RS ENGINE=InnoDB";
310 $query[] = "ALTER TABLE IPv4RSPool ENGINE=InnoDB";
cafd4cf3
DO
311 $query[] = "ALTER TABLE AttributeValue ENGINE=InnoDB";
312 $query[] = "ALTER TABLE RackObject ENGINE=InnoDB";
313 $query[] = "ALTER TABLE IPv4NAT ENGINE=InnoDB";
314 $query[] = "ALTER TABLE IPv4LB ENGINE=InnoDB";
315 $query[] = "ALTER TABLE IPv4VS ENGINE=InnoDB";
4d87feaf 316 $query[] = "DELETE FROM IPv4RS WHERE rspool_id NOT IN (SELECT id FROM IPv4RSPool)";
958ac06d 317 $query[] = "ALTER TABLE Link ADD CONSTRAINT `Link-FK-b` FOREIGN KEY (portb) REFERENCES Port (id)";
cafd4cf3 318 $query[] = "ALTER TABLE Link ADD CONSTRAINT `Link-FK-a` FOREIGN KEY (porta) REFERENCES Port (id)";
4d87feaf 319 $query[] = "ALTER TABLE IPv4RS ADD CONSTRAINT `IPv4RS-FK` FOREIGN KEY (rspool_id) REFERENCES IPv4RSPool (id) ON DELETE CASCADE";
cafd4cf3
DO
320 $query[] = "ALTER TABLE AttributeValue ADD CONSTRAINT `AttributeValue-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id)";
321 $query[] = "ALTER TABLE IPv4NAT ADD CONSTRAINT `IPv4NAT-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id)";
322 $query[] = "ALTER TABLE Port ADD CONSTRAINT `Port-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id)";
323 $query[] = "ALTER TABLE IPv4LB ADD CONSTRAINT `IPv4LB-FK-rspool_id` FOREIGN KEY (rspool_id) REFERENCES IPv4RSPool (id)";
324 $query[] = "ALTER TABLE IPv4LB ADD CONSTRAINT `IPv4LB-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id)";
325 $query[] = "ALTER TABLE IPv4LB ADD CONSTRAINT `IPv4LB-FK-vs_id` FOREIGN KEY (vs_id) REFERENCES IPv4VS (id)";
e49d8a77 326 $query = array_merge ($query, reloadDictionary ($batchid));
958ac06d
DO
327 $query[] = "UPDATE Config SET varvalue = '0.17.4' WHERE varname = 'DB_VERSION'";
328 break;
9f572fb5
DO
329 case '0.17.5':
330 $query[] = "ALTER TABLE TagTree ENGINE=InnoDB";
331 $query[] = "ALTER TABLE TagStorage ENGINE=InnoDB";
332 $query[] = "ALTER TABLE TagStorage ADD CONSTRAINT `TagStorage-FK-tag_id` FOREIGN KEY (tag_id) REFERENCES TagTree (id)";
333 $query[] = "ALTER TABLE TagTree ADD CONSTRAINT `TagTree-K-parent_id` FOREIGN KEY (parent_id) REFERENCES TagTree (id)";
2400d7ec
DO
334 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (21,1195)';
335 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (22,1196)';
336 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (23,1196)';
337 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (20,1195)';
338 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (25,1202)';
339 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (26,1202)';
340 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (27,1204)';
341 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (28,1204)';
342 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1083,1195)';
343 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1084,1084)';
344 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1195,20)';
345 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1195,21)';
346 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1195,1083)';
347 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1195,1195)';
348 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1196,22)';
349 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1196,23)';
350 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1196,1196)';
351 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1197,1197)';
352 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1198,1199)';
353 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1199,1198)';
354 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1200,1200)';
355 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1201,1201)';
356 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1202,25)';
357 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1202,26)';
358 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1202,1202)';
359 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1203,1203)';
360 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1204,27)';
361 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1204,28)';
362 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1204,1204)';
363 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1205,1205)';
364 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1206,1207)';
365 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1207,1206)';
93a83f51 366 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1316,1316)';
bdc91a5c
DO
367 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (16, 1322)';
368 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1322, 16)';
369 $query[] = 'DELETE FROM PortCompat WHERE type1 = 16 AND type2 = 16';
2400d7ec
DO
370 for ($i = 1209; $i <= 1300; $i++)
371 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (${i}, ${i})";
d9b88ea0 372 $query[] = "
09d6afa4 373CREATE TABLE `PortInnerInterface` (
9173281a 374 `id` int(10) unsigned NOT NULL,
d9b88ea0
DO
375 `iif_name` char(16) NOT NULL,
376 PRIMARY KEY (`id`),
9173281a 377 UNIQUE KEY `iif_name` (`iif_name`)
d9b88ea0 378) ENGINE=InnoDB";
2400d7ec
DO
379 $query[] = "INSERT INTO `PortInnerInterface` VALUES (1,'hardwired')";
380 $query[] = "INSERT INTO `PortInnerInterface` VALUES (2,'SFP-100')";
381 $query[] = "INSERT INTO `PortInnerInterface` VALUES (3,'GBIC')";
382 $query[] = "INSERT INTO `PortInnerInterface` VALUES (4,'SFP-1000')";
383 $query[] = "INSERT INTO `PortInnerInterface` VALUES (5,'XENPAK')";
384 $query[] = "INSERT INTO `PortInnerInterface` VALUES (6,'X2')";
385 $query[] = "INSERT INTO `PortInnerInterface` VALUES (7,'XPAK')";
386 $query[] = "INSERT INTO `PortInnerInterface` VALUES (8,'XFP')";
387 $query[] = "INSERT INTO `PortInnerInterface` VALUES (9,'SFP+')";
d9b88ea0 388 $query[] = "
09d6afa4 389CREATE TABLE `PortInterfaceCompat` (
d9b88ea0
DO
390 `iif_id` int(10) unsigned NOT NULL,
391 `oif_id` int(10) unsigned NOT NULL,
392 UNIQUE KEY `pair` (`iif_id`,`oif_id`),
2400d7ec 393 CONSTRAINT `PortInterfaceCompat-FK-iif_id` FOREIGN KEY (`iif_id`) REFERENCES `PortInnerInterface` (`id`)
d9b88ea0 394) ENGINE=InnoDB";
c76cfa0d
DO
395 $query[] = "ALTER TABLE Port ADD COLUMN iif_id int unsigned NOT NULL AFTER name"; // will set iif_id to 0
396 $query[] = "UPDATE Port SET iif_id = 2 WHERE type = 1208";
397 $query[] = "UPDATE Port SET iif_id = 3 WHERE type = 1078";
398 $query[] = "UPDATE Port SET iif_id = 4 WHERE type = 1077";
399 $query[] = "UPDATE Port SET iif_id = 5 WHERE type = 1079";
400 $query[] = "UPDATE Port SET iif_id = 6 WHERE type = 1080";
401 $query[] = "UPDATE Port SET iif_id = 7 WHERE type = 1081";
402 $query[] = "UPDATE Port SET iif_id = 8 WHERE type = 1082";
403 $query[] = "UPDATE Port SET iif_id = 9 WHERE type = 1084";
404 $query[] = "UPDATE Port SET iif_id = 1 WHERE iif_id = 0";
08aa3467
DO
405 $query[] = 'ALTER TABLE Port ADD UNIQUE `object_iif_oif_name` (object_id, iif_id, type, name)';
406 $query[] = 'ALTER TABLE Port DROP KEY `per_object`';
2400d7ec
DO
407 $base1000 = array (24, 34, 1202, 1203, 1204, 1205, 1206, 1207);
408 $base10000 = array (30, 35, 36, 37, 38, 39, 40);
409 $PICdata = array
410 (
bdc91a5c 411 1 => array (16, 19, 24, 29, 31, 33, 446, 681, 682, 1322),
2400d7ec
DO
412 2 => array (1208, 1195, 1196, 1197, 1198, 1199, 1200, 1201),
413 3 => array_merge (array (1078), $base1000),
414 4 => array_merge (array (1077), $base1000),
415 5 => array_merge (array (1079), $base10000),
416 6 => array_merge (array (1080), $base10000),
417 7 => array_merge (array (1081), $base10000),
418 8 => array_merge (array (1082), $base10000),
419 9 => array_merge (array (1084), $base10000),
420 );
421 // make sure all IIF/OIF pairs referenced from Port exist in PortInterfaceCompat before enabling FK
422 // iif_id doesn't exist at this point
423 $result = $dbxlink->query ('SELECT DISTINCT type FROM Port WHERE type NOT IN (1208, 1078, 1077, 1079, 1080, 1081, 1082, 1084)');
424 while ($row = $result->fetch (PDO::FETCH_ASSOC))
425 if (FALSE === array_search ($row['type'], $PICdata[1]))
426 array_push ($PICdata[1], $row['type']);
427 unset ($result);
428 foreach ($PICdata as $iif_id => $oif_ids)
429 foreach ($oif_ids as $oif_id)
430 $query[] = "INSERT INTO PortInterfaceCompat (iif_id, oif_id) VALUES (${iif_id}, ${oif_id})";
c76cfa0d 431 $query[] = "ALTER TABLE Port ADD CONSTRAINT `Port-FK-iif-oif` FOREIGN KEY (`iif_id`, `type`) REFERENCES `PortInterfaceCompat` (`iif_id`, `oif_id`)";
bdc91a5c 432 $query[] = 'UPDATE Port SET type = 1322 WHERE type = 16 AND (SELECT objtype_id FROM RackObject WHERE id = object_id) IN (2, 12)';
2400d7ec
DO
433 $query = array_merge ($query, reloadDictionary ($batchid));
434 $query[] = "DELETE FROM Config WHERE varname = 'default_port_type'";
435 $query[] = "INSERT INTO Config VALUES ('DEFAULT_PORT_IIF_ID','1','uint','no','no','Default port inner interface ID')";
436 $query[] = "INSERT INTO Config VALUES ('DEFAULT_PORT_OIF_IDS','1=24; 3=1078; 4=1077; 5=1079; 6=1080; 8=1082; 9=1084','string','no','no','Default port outer interface IDs')";
4a47d34b 437 $query[] = "INSERT INTO Config VALUES ('IPV4_TREE_RTR_AS_CELL','yes','string','no','no','Show full router info for each network in IPv4 tree view')";
93a83f51 438 $query[] = "UPDATE Chapter SET name = 'PortOuterInterface' WHERE id = 2";
fbcbb4ee
DO
439 // remap refs to duplicate records, which will be discarded (ticket:286)
440 $query[] = 'UPDATE AttributeValue SET uint_value = 147 WHERE uint_value = 1020 AND attr_id = 2';
441 $query[] = 'UPDATE AttributeValue SET uint_value = 377 WHERE uint_value = 1021 AND attr_id = 2';
e8ab58e8 442 $query[] = 'INSERT INTO AttributeMap (objtype_id, attr_id) VALUES (2, 1), (2, 3), (2, 5)';
9f572fb5
DO
443 $query[] = "UPDATE Config SET varvalue = '0.17.5' WHERE varname = 'DB_VERSION'";
444 break;
63811a09
DO
445 case '0.17.6':
446 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (28,'no','Voice/video hardware')";
447 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1323,1,NULL)";
448 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1323,2,28)";
449 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1323,3,NULL)";
450 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1323,5,NULL)";
cd3775e9 451 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PROXIMITY_RANGE','0','uint','yes','no','Proximity range (0 is current rack only)')";
5c3bc8de 452 $query = array_merge ($query, reloadDictionary ($batchid));
63811a09
DO
453 $query[] = "UPDATE Config SET varvalue = '0.17.6' WHERE varname = 'DB_VERSION'";
454 break;
026a79ee
DO
455 case '0.17.7':
456 $query[] = "UPDATE Config SET varvalue = '0.17.7' WHERE varname = 'DB_VERSION'";
457 break;
3540d15c 458 case '0.17.8':
1e81ad97
DO
459 $query = array_merge ($query, reloadDictionary ($batchid));
460 $query[] = "ALTER TABLE TagTree DROP COLUMN valid_realm";
461 $query[] = "UPDATE Config SET varvalue = '0.17.8' WHERE varname = 'DB_VERSION'";
462 break;
463 case '0.17.9':
45833307 464 $query[] = "ALTER table Config add `is_userdefined` enum('yes','no') NOT NULL default 'no' AFTER `is_hidden`";
3540d15c
DY
465 $query[] = "
466CREATE TABLE `UserConfig` (
467 `varname` char(32) NOT NULL,
468 `varvalue` char(255) NOT NULL,
469 `user` char(64) NOT NULL,
470 UNIQUE KEY `user_varname` (`user`,`varname`)
471) TYPE=InnoDB";
1e81ad97
DO
472 $query[] = "UPDATE Config SET is_userdefined = 'yes' WHERE varname IN
473(
474'MASSCOUNT',
475'MAXSELSIZE',
476'ROW_SCALE',
477'PORTS_PER_ROW',
478'IPV4_ADDRS_PER_PAGE',
479'DEFAULT_RACK_HEIGHT',
480'DEFAULT_SLB_VS_PORT',
481'DEFAULT_SLB_RS_PORT',
482'DETECT_URLS',
483'RACK_PRESELECT_THRESHOLD',
484'DEFAULT_IPV4_RS_INSERVICE',
485'DEFAULT_OBJECT_TYPE',
486'SHOW_EXPLICIT_TAGS',
487'SHOW_IMPLICIT_TAGS',
488'SHOW_AUTOMATIC_TAGS',
489'IPV4_AUTO_RELEASE',
490'SHOW_LAST_TAB',
491'EXT_IPV4_VIEW',
492'TREE_THRESHOLD',
493'ADDNEW_AT_TOP',
494'IPV4_TREE_SHOW_USAGE',
495'PREVIEW_TEXT_MAXCHARS',
496'PREVIEW_TEXT_ROWS',
497'PREVIEW_TEXT_COLS',
498'PREVIEW_IMAGE_MAXPXS',
499'VENDOR_SIEVE',
500'RACKS_PER_ROW'
501)";
9013f05b
DO
502 $query[] = "UPDATE Config SET varvalue = '0.17.9' WHERE varname = 'DB_VERSION'";
503 break;
f32167d2
DO
504 case '0.17.10':
505 $query = array_merge ($query, reloadDictionary ($batchid));
4368cc45 506 $query[] = "ALTER TABLE MountOperation ADD KEY (object_id)";
2926b1cb 507 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('STATIC_FILTER','yes','string','no','no','yes','Enable Filter Caching');";
f32167d2 508 $query[] = "UPDATE Config SET varvalue = '0.17.10' WHERE varname = 'DB_VERSION'";
d80036ba 509 break;
a1fc539a
RF
510 case '0.17.11':
511 $query = array_merge ($query, reloadDictionary ($batchid));
512 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('ENABLE_BULKPORT_FORM','yes','string','no','no','yes','Enable \"Bulk Port\" form');";
0f353a95 513 $query[] = "DELETE AttributeValue FROM AttributeValue JOIN Attribute where AttributeValue.attr_id = Attribute.id AND Attribute.type = 'dict' AND AttributeValue.uint_value = 0";
a1fc539a 514 $query[] = "UPDATE Config SET varvalue = '0.17.11' WHERE varname = 'DB_VERSION'";
59e0658a 515 break;
9013f05b 516 case '0.18.0':
ad9da675 517 $query = array_merge ($query, reloadDictionary ($batchid));
8bb69a06
DO
518 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('VLANSWITCH_LISTSRC', '', 'string', 'yes', 'no', 'yes', 'List of VLAN running switches')";
519 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('VLANIPV4NET_LISTSRC', '', 'string', 'yes', 'no', 'yes', 'List of VLAN-based IPv4 networks')";
520 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('DEFAULT_VDOM_ID','','uint','yes','no','yes','Default VLAN domain ID')";
521 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('DEFAULT_VST_ID','','uint','yes','no','yes','Default VLAN switch template ID')";
37cb9e18
DO
522 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('8021Q_DEPLOY_MINAGE','300','uint','no','no','no','802.1Q deploy minimum age')";
523 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('8021Q_DEPLOY_MAXAGE','3600','uint','no','no','no','802.1Q deploy maximum age')";
524 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('8021Q_DEPLOY_RETRY','10800','uint','no','no','no','802.1Q deploy retry timer')";
407ed7bb 525 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('8021Q_WRI_AFTER_CONFT','no','string','no','no','no','802.1Q: save device configuration after deploy')";
4492050b 526 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('8021Q_INSTANT_DEPLOY','no','string','no','no','yes','802.1Q: instant deploy')";
97c0a54e 527 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('IPV4_TREE_SHOW_VLAN','yes','string','no','no','yes','Show VLAN for each network in IPv4 tree')";
1768cc35 528 $query[] = "ALTER TABLE IPv4Network ENGINE=InnoDB";
22fdebff
DO
529 $query[] = "SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0";
530 $query[] = "
531CREATE TABLE `CachedPAV` (
532 `object_id` int(10) unsigned NOT NULL,
533 `port_name` char(255) NOT NULL,
534 `vlan_id` int(10) unsigned NOT NULL default '0',
535 PRIMARY KEY (`object_id`,`port_name`,`vlan_id`),
536 KEY `vlan_id` (`vlan_id`),
537 CONSTRAINT `CachedPAV-FK-object-port` FOREIGN KEY (`object_id`, `port_name`) REFERENCES `CachedPVM` (`object_id`, `port_name`) ON DELETE CASCADE,
538 CONSTRAINT `CachedPAV-FK-vlan_id` FOREIGN KEY (`vlan_id`) REFERENCES `VLANValidID` (`vlan_id`)
539) ENGINE=InnoDB
540";
541 $query[] = "
542CREATE TABLE `CachedPNV` (
543 `object_id` int(10) unsigned NOT NULL,
544 `port_name` char(255) NOT NULL,
545 `vlan_id` int(10) unsigned NOT NULL default '0',
546 PRIMARY KEY (`object_id`,`port_name`,`vlan_id`),
547 UNIQUE KEY `port_id` (`object_id`,`port_name`),
548 CONSTRAINT `CachedPNV-FK-compound` FOREIGN KEY (`object_id`, `port_name`, `vlan_id`) REFERENCES `CachedPAV` (`object_id`, `port_name`, `vlan_id`) ON DELETE CASCADE
549) ENGINE=InnoDB
550";
551 $query[] = "
552CREATE TABLE `CachedPVM` (
553 `object_id` int(10) unsigned NOT NULL,
554 `port_name` char(255) NOT NULL,
555 `vlan_mode` enum('access','trunk') NOT NULL default 'access',
556 PRIMARY KEY (`object_id`,`port_name`),
557 CONSTRAINT `CachedPVM-FK-object_id` FOREIGN KEY (`object_id`) REFERENCES `RackObject` (`id`) ON DELETE CASCADE
558) ENGINE=InnoDB
559";
560 $query[] = "
561CREATE TABLE `PortAllowedVLAN` (
562 `object_id` int(10) unsigned NOT NULL,
563 `port_name` char(255) NOT NULL,
564 `vlan_id` int(10) unsigned NOT NULL default '0',
565 PRIMARY KEY (`object_id`,`port_name`,`vlan_id`),
566 KEY `vlan_id` (`vlan_id`),
567 CONSTRAINT `PortAllowedVLAN-FK-object-port` FOREIGN KEY (`object_id`, `port_name`) REFERENCES `PortVLANMode` (`object_id`, `port_name`) ON DELETE CASCADE,
568 CONSTRAINT `PortAllowedVLAN-FK-vlan_id` FOREIGN KEY (`vlan_id`) REFERENCES `VLANValidID` (`vlan_id`)
569) ENGINE=InnoDB
570";
571 $query[] = "
572CREATE TABLE `PortNativeVLAN` (
573 `object_id` int(10) unsigned NOT NULL,
574 `port_name` char(255) NOT NULL,
575 `vlan_id` int(10) unsigned NOT NULL default '0',
576 PRIMARY KEY (`object_id`,`port_name`,`vlan_id`),
577 UNIQUE KEY `port_id` (`object_id`,`port_name`),
578 CONSTRAINT `PortNativeVLAN-FK-compound` FOREIGN KEY (`object_id`, `port_name`, `vlan_id`) REFERENCES `PortAllowedVLAN` (`object_id`, `port_name`, `vlan_id`) ON DELETE CASCADE
579) ENGINE=InnoDB
580";
581 $query[] = "
582CREATE TABLE `PortVLANMode` (
583 `object_id` int(10) unsigned NOT NULL,
584 `port_name` char(255) NOT NULL,
585 `vlan_mode` enum('access','trunk') NOT NULL default 'access',
586 PRIMARY KEY (`object_id`,`port_name`),
587 CONSTRAINT `PortVLANMode-FK-object-port` FOREIGN KEY (`object_id`, `port_name`) REFERENCES `CachedPVM` (`object_id`, `port_name`)
588) ENGINE=InnoDB
589";
590 $query[] = "
591CREATE TABLE `VLANDescription` (
592 `domain_id` int(10) unsigned NOT NULL,
593 `vlan_id` int(10) unsigned NOT NULL default '0',
594 `vlan_type` enum('ondemand','compulsory','alien') NOT NULL default 'ondemand',
595 `vlan_descr` char(255) default NULL,
596 PRIMARY KEY (`domain_id`,`vlan_id`),
597 KEY `vlan_id` (`vlan_id`),
219da133 598 CONSTRAINT `VLANDescription-FK-domain_id` FOREIGN KEY (`domain_id`) REFERENCES `VLANDomain` (`id`) ON DELETE CASCADE,
22fdebff
DO
599 CONSTRAINT `VLANDescription-FK-vlan_id` FOREIGN KEY (`vlan_id`) REFERENCES `VLANValidID` (`vlan_id`)
600) ENGINE=InnoDB
601";
602 $query[] = "
603CREATE TABLE `VLANDomain` (
604 `id` int(10) unsigned NOT NULL auto_increment,
605 `description` char(255) default NULL,
606 PRIMARY KEY (`id`),
607 UNIQUE KEY `description` (`description`)
608) ENGINE=InnoDB
609";
610 $query[] = "
611CREATE TABLE `VLANIPv4` (
612 `domain_id` int(10) unsigned NOT NULL,
613 `vlan_id` int(10) unsigned NOT NULL,
614 `ipv4net_id` int(10) unsigned NOT NULL,
615 UNIQUE KEY `network-domain` (`ipv4net_id`,`domain_id`),
616 KEY `VLANIPv4-FK-compound` (`domain_id`,`vlan_id`),
617 CONSTRAINT `VLANIPv4-FK-compound` FOREIGN KEY (`domain_id`, `vlan_id`) REFERENCES `VLANDescription` (`domain_id`, `vlan_id`) ON DELETE CASCADE,
618 CONSTRAINT `VLANIPv4-FK-ipv4net_id` FOREIGN KEY (`ipv4net_id`) REFERENCES `IPv4Network` (`id`) ON DELETE CASCADE
619) ENGINE=InnoDB
620";
621 $query[] = "
622CREATE TABLE `VLANSTRule` (
623 `vst_id` int(10) unsigned NOT NULL,
624 `rule_no` int(10) unsigned NOT NULL,
625 `port_pcre` char(255) NOT NULL,
626 `port_role` enum('access','trunk','uplink','downlink','none') NOT NULL default 'none',
627 `wrt_vlans` char(255) default NULL,
628 `description` char(255) default NULL,
629 UNIQUE KEY `vst-rule` (`vst_id`,`rule_no`),
630 CONSTRAINT `VLANSTRule-FK-vst_id` FOREIGN KEY (`vst_id`) REFERENCES `VLANSwitchTemplate` (`id`) ON DELETE CASCADE
631) ENGINE=InnoDB
632";
633 $query[] = "
634CREATE TABLE `VLANSwitch` (
635 `object_id` int(10) unsigned NOT NULL,
636 `domain_id` int(10) unsigned NOT NULL,
637 `template_id` int(10) unsigned NOT NULL,
638 `mutex_rev` int(10) unsigned NOT NULL default '0',
639 `out_of_sync` enum('yes','no') NOT NULL default 'yes',
640 `last_errno` int(10) unsigned NOT NULL default '0',
641 `last_change` timestamp NOT NULL default '0000-00-00 00:00:00',
642 `last_push_started` timestamp NOT NULL default '0000-00-00 00:00:00',
643 `last_push_finished` timestamp NOT NULL default '0000-00-00 00:00:00',
644 `last_error_ts` timestamp NOT NULL default '0000-00-00 00:00:00',
645 UNIQUE KEY `object_id` (`object_id`),
646 KEY `domain_id` (`domain_id`),
647 KEY `template_id` (`template_id`),
648 KEY `out_of_sync` (`out_of_sync`),
649 KEY `last_errno` (`last_errno`),
650 CONSTRAINT `VLANSwitch-FK-domain_id` FOREIGN KEY (`domain_id`) REFERENCES `VLANDomain` (`id`),
651 CONSTRAINT `VLANSwitch-FK-object_id` FOREIGN KEY (`object_id`) REFERENCES `RackObject` (`id`),
652 CONSTRAINT `VLANSwitch-FK-template_id` FOREIGN KEY (`template_id`) REFERENCES `VLANSwitchTemplate` (`id`)
653) ENGINE=InnoDB
654";
655 $query[] = "
656CREATE TABLE `VLANSwitchTemplate` (
657 `id` int(10) unsigned NOT NULL auto_increment,
658 `max_local_vlans` int(10) unsigned default NULL,
659 `description` char(255) default NULL,
660 PRIMARY KEY (`id`),
661 UNIQUE KEY `description` (`description`)
662) ENGINE=InnoDB
663";
664 $query[] = "
665CREATE TABLE `VLANValidID` (
666 `vlan_id` int(10) unsigned NOT NULL default '1',
667 PRIMARY KEY (`vlan_id`)
668) ENGINE=InnoDB
669";
670 $query[] = "SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS";
fa11e5c7 671 for ($i = 1; $i <= 4094; $i++)
a401a680 672 $query[] = "INSERT INTO VLANValidID (vlan_id) VALUES (${i})";
9013f05b 673 $query[] = "UPDATE Config SET varvalue = '0.18.0' WHERE varname = 'DB_VERSION'";
08d1ef24 674 break;
425fd829
DO
675 case '0.18.1':
676 $query = array_merge ($query, reloadDictionary ($batchid));
b6978d62
DO
677 $query[] = "ALTER TABLE Atom ENGINE=InnoDB";
678 $query[] = "ALTER TABLE AttributeMap ENGINE=InnoDB";
679 $query[] = "ALTER TABLE Config ENGINE=InnoDB";
680 $query[] = "ALTER TABLE IPv4Address ENGINE=InnoDB";
681 $query[] = "ALTER TABLE IPv4Allocation ENGINE=InnoDB";
682 $query[] = "ALTER TABLE Molecule ENGINE=InnoDB";
683 $query[] = "ALTER TABLE MountOperation ENGINE=InnoDB";
684 $query[] = "ALTER TABLE PortCompat ENGINE=InnoDB";
685 $query[] = "ALTER TABLE Rack ENGINE=InnoDB";
686 $query[] = "ALTER TABLE RackHistory ENGINE=InnoDB";
687 $query[] = "ALTER TABLE RackObjectHistory ENGINE=InnoDB";
688 $query[] = "ALTER TABLE RackRow ENGINE=InnoDB";
689 $query[] = "ALTER TABLE RackSpace ENGINE=InnoDB";
690 $query[] = "ALTER TABLE Script ENGINE=InnoDB";
735f169f
DO
691 $query[] = "ALTER TABLE AttributeValue DROP FOREIGN KEY `AttributeValue-FK-object_id`";
692 $query[] = "ALTER TABLE AttributeValue ADD CONSTRAINT `AttributeValue-FK-object_id` FOREIGN KEY (`object_id`) REFERENCES `RackObject` (`id`) ON DELETE CASCADE";
55267f67
DO
693 $query[] = "ALTER TABLE RackObjectHistory ADD KEY (id)";
694 $query[] = "ALTER TABLE RackObjectHistory ADD CONSTRAINT `RackObjectHistory-FK-object_id` FOREIGN KEY (id) REFERENCES `RackObject` (`id`) ON DELETE CASCADE";
f3552988 695 $query[] = "ALTER TABLE MountOperation ADD CONSTRAINT `MountOperation-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id) ON DELETE CASCADE";
f7cec175 696 $query[] = "ALTER TABLE RackSpace ADD CONSTRAINT `RackSpace-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id) ON DELETE CASCADE";
1bcfe894
DO
697 $query[] = "ALTER TABLE Link DROP FOREIGN KEY `Link-FK-a`";
698 $query[] = "ALTER TABLE Link ADD CONSTRAINT `Link-FK-a` FOREIGN KEY (`porta`) REFERENCES `Port` (`id`) ON DELETE CASCADE";
699 $query[] = "ALTER TABLE Link DROP FOREIGN KEY `Link-FK-b`";
700 $query[] = "ALTER TABLE Link ADD CONSTRAINT `Link-FK-b` FOREIGN KEY (`portb`) REFERENCES `Port` (`id`) ON DELETE CASCADE";
701 $query[] = "ALTER TABLE Port DROP FOREIGN KEY `Port-FK-object_id`";
702 $query[] = "ALTER TABLE Port ADD CONSTRAINT `Port-FK-object_id` FOREIGN KEY (`object_id`) REFERENCES `RackObject` (`id`) ON DELETE CASCADE";
e7787961
DO
703 $query[] = "ALTER TABLE AttributeMap MODIFY `chapter_id` int(10) unsigned default NULL";
704 $query[] = "ALTER TABLE IPv4Address MODIFY `ip` int(10) unsigned NOT NULL default '0'";
705 $query[] = "ALTER TABLE IPv4Address MODIFY `name` char(255) NOT NULL default ''";
706 $query[] = "ALTER TABLE IPv4Allocation MODIFY `object_id` int(10) unsigned NOT NULL default '0'";
707 $query[] = "ALTER TABLE IPv4Allocation MODIFY `ip` int(10) unsigned NOT NULL default '0'";
708 $query[] = "ALTER TABLE IPv4Allocation MODIFY `name` char(255) NOT NULL default ''";
709 $query[] = "ALTER TABLE IPv4NAT MODIFY `object_id` int(10) unsigned NOT NULL default '0'";
710 $query[] = "ALTER TABLE IPv4NAT MODIFY `proto` enum('TCP','UDP') NOT NULL default 'TCP'";
711 $query[] = "ALTER TABLE IPv4NAT MODIFY `localip` int(10) unsigned NOT NULL default '0'";
712 $query[] = "ALTER TABLE IPv4NAT MODIFY `localport` smallint(5) unsigned NOT NULL default '0'";
713 $query[] = "ALTER TABLE IPv4NAT MODIFY `remoteip` int(10) unsigned NOT NULL default '0'";
714 $query[] = "ALTER TABLE IPv4NAT MODIFY `remoteport` smallint(5) unsigned NOT NULL default '0'";
715 $query[] = "ALTER TABLE IPv4Network MODIFY `ip` int(10) unsigned NOT NULL default '0'";
716 $query[] = "ALTER TABLE IPv4Network MODIFY `mask` int(10) unsigned NOT NULL default '0'";
717 $query[] = "ALTER TABLE Link MODIFY `porta` int(10) unsigned NOT NULL default '0'";
718 $query[] = "ALTER TABLE Link MODIFY `portb` int(10) unsigned NOT NULL default '0'";
719 $query[] = "ALTER TABLE MountOperation MODIFY `object_id` int(10) unsigned NOT NULL default '0'";
720 $query[] = "ALTER TABLE MountOperation MODIFY `ctime` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP";
721 $query[] = "ALTER TABLE Port MODIFY `object_id` int(10) unsigned NOT NULL default '0'";
722 $query[] = "ALTER TABLE Port MODIFY `name` char(255) NOT NULL default ''";
723 $query[] = "ALTER TABLE Port MODIFY `type` int(10) unsigned NOT NULL default '0'";
724 $query[] = "ALTER TABLE PortCompat MODIFY `type1` int(10) unsigned NOT NULL default '0'";
725 $query[] = "ALTER TABLE PortCompat MODIFY `type2` int(10) unsigned NOT NULL default '0'";
726 $query[] = "ALTER TABLE RackHistory MODIFY `ctime` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP";
727 $query[] = "ALTER TABLE RackObjectHistory MODIFY `ctime` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP";
728 $query[] = "ALTER TABLE TagStorage MODIFY `tag_id` int(10) unsigned NOT NULL default '0'";
729 $query[] = "ALTER TABLE UserAccount MODIFY `user_name` char(64) NOT NULL default ''";
425fd829
DO
730 $query[] = "UPDATE Config SET varvalue = '0.18.1' WHERE varname = 'DB_VERSION'";
731 break;
298d2375
DO
732 case '0.18.2':
733 $query = array_merge ($query, reloadDictionary ($batchid));
734 $query[] = "ALTER TABLE Rack ADD CONSTRAINT `Rack-FK-row_id` FOREIGN KEY (row_id) REFERENCES RackRow (id)";
b504972c 735 $query[] = "ALTER TABLE RackRow ADD UNIQUE KEY `name` (name)";
b49a479e
DO
736 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('CDP_RUNNERS_LISTSRC', '', 'string', 'yes', 'no', 'no', 'List of devices running CDP')";
737 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('LLDP_RUNNERS_LISTSRC', '', 'string', 'yes', 'no', 'no', 'List of devices running LLDP')";
10eadad9 738 $query[] = "UPDATE Config SET varvalue = '0.18.2' WHERE varname = 'DB_VERSION'";
298d2375 739 break;
2582446d 740 case '0.18.3':
0891c041 741 $query = array_merge ($query, reloadDictionary ($batchid));
2582446d 742 $query[] = "UPDATE Config SET varname='8021Q_WRI_AFTER_CONFT_LISTSRC', varvalue='false', description='802.1Q: save device configuration after deploy (RackCode)' WHERE varname='8021Q_WRI_AFTER_CONFT'";
0328f6d6 743 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('HNDP_RUNNERS_LISTSRC', '', 'string', 'yes', 'no', 'no', 'List of devices running HNDP (RackCode)')";
2582446d
DO
744 $query[] = "UPDATE Config SET varvalue = '0.18.3' WHERE varname = 'DB_VERSION'";
745 break;
3a387b0d
DO
746 case '0.18.4':
747 $query = array_merge ($query, reloadDictionary ($batchid));
ec523868 748 $query[] = "ALTER TABLE VLANSTRule MODIFY port_role enum('access','trunk','anymode','uplink','downlink','none') NOT NULL default 'none'";
3a387b0d
DO
749 $query[] = "UPDATE Config SET varvalue = '0.18.4' WHERE varname = 'DB_VERSION'";
750 break;
95857b5c 751 case '0.18.5':
1f54e1ba 752 $query = array_merge ($query, reloadDictionary ($batchid));
95857b5c 753 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('SHRINK_TAG_TREE_ON_CLICK','yes','string','no','no','yes','Dynamically hide useless tags in tagtree')";
1f54e1ba 754 $query[] = "ALTER TABLE `IPv4LB` ADD COLUMN `prio` int(10) unsigned DEFAULT NULL AFTER `vs_id`";
1ebbf889 755 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('MAX_UNFILTERED_ENTITIES','0','uint','no','no','yes','Max item count to display on unfiltered result page')";
95857b5c
DO
756 $query[] = "UPDATE Config SET varvalue = '0.18.5' WHERE varname = 'DB_VERSION'";
757 break;
d3346ce2 758 case '0.19.0':
6f542dde
AD
759 if (!isInnoDBSupported ())
760 {
761 showFailure ("Cannot upgrade because triggers are not supported by your MySQL server.", __FILE__);
762 die;
763 }
764
765 // search for invalid Links
766 $result = $dbxlink->query ("SELECT * FROM Link WHERE porta=portb OR porta IN (SELECT portb FROM Link) OR portb IN (SELECT porta FROM Link);");
767 $rows = $result->fetchAll (PDO::FETCH_ASSOC);
768 if (count($rows) > 0)
769 {
770 foreach ($rows as $row)
771 $invalid_msg .= sprintf("porta: %s, portb: %s\n", $row['porta'], $row['portb']);
772 showFailure("Cannot upgrade because one or more invalid port links exist:\n{$invalid_msg}", __FILE__);
773 die;
774 }
775
d3346ce2 776 $query[] = 'ALTER TABLE `File` ADD `thumbnail` LONGBLOB NULL AFTER `atime`';
21ee3351
AA
777 $query[] = "
778CREATE TABLE `IPv6Address` (
779 `ip` binary(16) NOT NULL,
780 `name` char(255) NOT NULL default '',
781 `reserved` enum('yes','no') default NULL,
782 PRIMARY KEY (`ip`)
783) ENGINE=InnoDB
784";
785 $query[] = "
786CREATE TABLE `IPv6Allocation` (
787 `object_id` int(10) unsigned NOT NULL default '0',
788 `ip` binary(16) NOT NULL,
789 `name` char(255) NOT NULL default '',
790 `type` enum('regular','shared','virtual','router') default NULL,
8c7b7381
AA
791 PRIMARY KEY (`object_id`,`ip`),
792 CONSTRAINT `IPv6Allocation-FK-object_id` FOREIGN KEY (`object_id`) REFERENCES `RackObject` (`id`) ON DELETE CASCADE
21ee3351
AA
793) ENGINE=InnoDB
794";
795 $query[] = "
796CREATE TABLE `IPv6Network` (
797 `id` int(10) unsigned NOT NULL auto_increment,
798 `ip` binary(16) NOT NULL,
799 `mask` int(10) unsigned NOT NULL,
800 `last_ip` binary(16) NOT NULL,
801 `name` char(255) default NULL,
802 `comment` text,
803 PRIMARY KEY (`id`),
804 UNIQUE KEY `ip` (`ip`,`mask`)
805) ENGINE=InnoDB
806";
807 $query[] = "
808CREATE TABLE `VLANIPv6` (
809 `domain_id` int(10) unsigned NOT NULL,
810 `vlan_id` int(10) unsigned NOT NULL,
811 `ipv6net_id` int(10) unsigned NOT NULL,
812 UNIQUE KEY `network-domain` (`ipv6net_id`,`domain_id`),
813 KEY `VLANIPv6-FK-compound` (`domain_id`,`vlan_id`),
814 CONSTRAINT `VLANIPv6-FK-compound` FOREIGN KEY (`domain_id`, `vlan_id`) REFERENCES `VLANDescription` (`domain_id`, `vlan_id`) ON DELETE CASCADE,
815 CONSTRAINT `VLANIPv6-FK-ipv6net_id` FOREIGN KEY (`ipv6net_id`) REFERENCES `IPv6Network` (`id`) ON DELETE CASCADE
816) ENGINE=InnoDB
9a90adc4
DO
817";
818 $query[] = "
819CREATE TABLE `ObjectLog` (
820 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
821 `object_id` int(10) unsigned NOT NULL,
822 `user` char(64) NOT NULL,
823 `date` datetime NOT NULL,
824 `content` text NOT NULL,
825 PRIMARY KEY (`id`),
826 KEY `object_id` (`object_id`),
827 KEY `date` (`date`),
4cbb5c27 828 CONSTRAINT `ObjectLog-FK-object_id` FOREIGN KEY (`object_id`) REFERENCES `RackObject` (`id`) ON DELETE CASCADE
9a90adc4 829) ENGINE=InnoDB
6f542dde
AD
830";
831 $query[] = "
832CREATE TRIGGER `checkForDuplicateLinksBeforeInsert` BEFORE INSERT ON `Link`
833 FOR EACH ROW
834BEGIN
835 DECLARE count INTEGER;
836
837 IF NEW.porta = NEW.portb THEN
838 SET NEW.porta = NULL;
839 END IF;
840
841 SELECT COUNT(*) INTO count FROM Link WHERE porta IN (NEW.porta,NEW.portb) OR portb IN (NEW.porta,NEW.portb);
842
843 IF count > 0 THEN
844 SET NEW.porta = NULL;
845 END IF;
846END;
847";
848 $query[] = "
849CREATE TRIGGER `checkForDuplicateLinksBeforeUpdate` BEFORE UPDATE ON `Link`
850 FOR EACH ROW
851BEGIN
852 DECLARE count INTEGER;
853
854 IF NEW.porta = NEW.portb THEN
855 SET NEW.porta = NULL;
856 END IF;
857
858 SELECT COUNT(*) INTO count FROM Link WHERE
859 (NEW.porta IN (porta,portb) AND NEW.porta != porta) OR
860 (NEW.portb IN (porta,portb) AND NEW.portb != portb);
861
862 IF count > 0 THEN
863 SET NEW.porta = NULL;
864 END IF;
865END;
21ee3351
AA
866";
867 $query[] = "ALTER TABLE `TagStorage` CHANGE COLUMN `entity_realm` `entity_realm` ENUM('file','ipv4net','ipv4vs','ipv4rspool','object','rack','user','ipv6net') NOT NULL DEFAULT 'object' FIRST";
868 $query[] = "ALTER TABLE `FileLink` CHANGE COLUMN `entity_type` `entity_type` ENUM('ipv4net','ipv4rspool','ipv4vs','object','rack','user','ipv6net') NOT NULL DEFAULT 'object' AFTER `file_id`";
0c7c9f8b 869 $query[] = 'ALTER TABLE Link ADD COLUMN cable char(64) NULL AFTER portb';
3fb61857 870 $query[] = 'ALTER TABLE RackSpace ADD CONSTRAINT `RackSpace-FK-rack_id` FOREIGN KEY (rack_id) REFERENCES Rack (id)';
8c7b7381 871 $query[] = "ALTER TABLE `IPv4Allocation` ADD CONSTRAINT `IPv4Allocation-FK-object_id` FOREIGN KEY (`object_id`) REFERENCES `RackObject` (`id`) ON DELETE CASCADE";
61e79d63 872 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('SYNCDOMAIN_MAX_PROCESSES','0','uint','yes','no', 'How many worker proceses syncdomain cron script should create')";
09ec2e59
AA
873 $query[] = "ALTER TABLE `VLANSwitchTemplate` ADD COLUMN `mutex_rev` int(10) NOT NULL AFTER `max_local_vlans`";
874 $query[] = "ALTER TABLE `VLANSwitchTemplate` ADD COLUMN `saved_by` char(64) NOT NULL AFTER `description`";
d3346ce2
DO
875 $query[] = "UPDATE Config SET varvalue = '0.19.0' WHERE varname = 'DB_VERSION'";
876 break;
fbbb74fb 877 default:
5d168fde 878 showFailure ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined", __FILE__);
fbbb74fb
DO
879 die;
880 break;
881 }
fbbb74fb 882 $failures = array();
4114697d 883 echo "<tr><th>Executing batch '${batchid}'</th><td>";
fbbb74fb
DO
884 foreach ($query as $q)
885 {
886 $result = $dbxlink->query ($q);
4114697d 887 if ($result == NULL)
758fe24c 888 {
758fe24c
DO
889 $errorInfo = $dbxlink->errorInfo();
890 $failures[] = array ($q, $errorInfo[2]);
891 }
fbbb74fb 892 }
fbbb74fb 893 if (!count ($failures))
4114697d 894 echo "<strong><font color=green>done</font></strong>";
fbbb74fb
DO
895 else
896 {
4114697d 897 echo "<strong><font color=red>The following queries failed:</font></strong><br><pre>";
fbbb74fb
DO
898 foreach ($failures as $f)
899 {
900 list ($q, $i) = $f;
4114697d 901 echo "${q} -- ${i}\n";
fbbb74fb 902 }
4114697d 903 echo "</pre>";
fbbb74fb 904 }
4114697d 905 echo '</td></tr>';
fbbb74fb
DO
906}
907
908// ******************************************************************
909//
910// Execution starts here
911//
912// ******************************************************************
913
5d168fde
DO
914// a clone of showError() to drop dependency on interface.php
915function showFailure ($info = '', $location = 'N/A')
916{
5d168fde
DO
917 if (preg_match ('/\.php$/', $location))
918 $location = basename ($location);
919 elseif ($location != 'N/A')
920 $location = $location . '()';
921 echo "<div class=msg_error>An error has occured in [${location}]. ";
922 if (empty ($info))
923 echo 'No additional information is available.';
924 else
925 echo "Additional information:<br><p>\n<pre>\n${info}\n</pre></p>";
926 echo "This failure is most probably fatal.<br></div>\n";
927}
928
929require_once 'inc/config.php'; // for CODE_VERSION
49293c68 930require_once 'inc/database.php'; // for getDatabaseVersion()
3fb336f6 931require_once 'inc/dictionary.php';
5d168fde
DO
932// Enforce default value for now, releases prior to 0.17.0 didn't support 'httpd' auth source.
933$user_auth_src = 'database';
fbbb74fb 934
80138748
DO
935if (file_exists ('inc/secret.php'))
936 require_once 'inc/secret.php';
fbbb74fb 937else
dbbb4f96 938 die ('<center>There is no working RackTables instance here, <a href="install.php">install</a>?</center>');
fbbb74fb
DO
939
940try
941{
942 $dbxlink = new PDO ($pdo_dsn, $db_username, $db_password);
943}
944catch (PDOException $e)
945{
946 die ("Database connection failed:\n\n" . $e->getMessage());
947}
948
fbbb74fb
DO
949// Now we need to be sure that the current user is the administrator.
950// The rest doesn't matter within this context.
fbbb74fb 951
120e9ddd 952function authenticate_admin ($username, $password)
a1f3710a 953{
43c7895d 954 global $dbxlink;
4dd08c61
DO
955 $prepared = $dbxlink->prepare ('SELECT COUNT(*) FROM UserAccount WHERE user_id=1 AND user_name=? AND user_password_hash=?');
956 if (!$prepared->execute (array ($username, sha1 ($password))))
a1f3710a 957 die ('SQL query failed in ' . __FUNCTION__);
4dd08c61 958 $rows = $prepared->fetchAll (PDO::FETCH_NUM);
43c7895d 959 return $rows[0][0] == 1;
a1f3710a
DO
960}
961
204284ba 962switch ($user_auth_src)
99ee5479 963{
120e9ddd
DO
964 case 'database':
965 case 'ldap': // authenticate against DB as well
966 if
967 (
968 !isset ($_SERVER['PHP_AUTH_USER']) or
969 !strlen ($_SERVER['PHP_AUTH_USER']) or
970 !isset ($_SERVER['PHP_AUTH_PW']) or
971 !strlen ($_SERVER['PHP_AUTH_PW']) or
3737ede3 972 !authenticate_admin ($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])
120e9ddd
DO
973 )
974 {
975 header ('WWW-Authenticate: Basic realm="RackTables upgrade"');
976 header ('HTTP/1.0 401 Unauthorized');
33bbd712 977 showFailure ('You must be authenticated as an administrator to complete the upgrade.', __FILE__);
120e9ddd
DO
978 die;
979 }
980 break; // cleared
981 case 'httpd':
982 if
983 (
984 !isset ($_SERVER['REMOTE_USER']) or
985 !strlen ($_SERVER['REMOTE_USER'])
986 )
987 {
33bbd712 988 showFailure ('System misconfiguration. The web-server didn\'t authenticate the user, although ought to do.');
120e9ddd
DO
989 die;
990 }
991 break; // cleared
992 default:
33bbd712 993 showFailure ('authentication source misconfiguration', __FILE__);
120e9ddd 994 die;
99ee5479 995}
fbbb74fb 996
5f016d39
DO
997?>
998<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
999<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
2cf36003 1000<head><title>RackTables upgrade script</title>
fffc0727 1001<link rel=stylesheet type='text/css' href='pi.css' />
5f016d39
DO
1002</head>
1003<body>
1004<h1>Platform check status</h1>
1005<?php
1006
1007if (!platform_is_ok())
1008 die ('</body></html>');
1009
1010echo '<h1>Upgrade status</h1>';
fbbb74fb 1011$dbver = getDatabaseVersion();
5f016d39 1012echo '<table border=1 cellpadding=5>';
4114697d
DO
1013echo "<tr><th>Current status</th><td>Data version: ${dbver}<br>Code version: " . CODE_VERSION . "</td></tr>\n";
1014
1015$path = getDBUpgradePath ($dbver, CODE_VERSION);
1016if ($path === NULL)
758fe24c 1017{
4114697d 1018 echo "<tr><th>Upgrade path</th><td><font color=red>not found</font></td></tr>\n";
d74ae24c
DO
1019 echo "<tr><th>Summary</th><td>Check README for more information. RackTables releases prior to 0.16.4 ";
1020 echo "must be upgraded to 0.16.4 first.</td></tr>\n";
758fe24c 1021}
4114697d 1022else
5f4027b8 1023{
4114697d
DO
1024 if (!count ($path))
1025 echo "<tr><th>Summary</th><td>Come back later.</td></tr>\n";
1026 else
1027 {
1028 echo "<tr><th>Upgrade path</th><td>${dbver} &rarr; " . implode (' &rarr; ', $path) . "</td></tr>\n";
1029 foreach ($path as $batchid)
1030 {
1031 executeUpgradeBatch ($batchid);
1032 if (isset ($relnotes[$batchid]))
5ae6d365 1033 echo "<tr><th>Release notes for ${batchid}</th><td><pre>" . $relnotes[$batchid] . "</pre></td></tr>\n";
4114697d 1034 }
790a60e8 1035 echo "<tr><th>Summary</th><td>Upgrade complete, it is Ok to <a href='index.php'>enter</a> the system.</td></tr>\n";
4114697d 1036 }
5f4027b8 1037}
4114697d 1038echo '</table>';
5f016d39 1039echo '</body></html>';
fbbb74fb
DO
1040
1041?>