r3186 - maintenance->trunk sync of changesets 3182~3185
[racktables] / upgrade.php
CommitLineData
6dc745d2 1<?php
fbbb74fb 2
90b96ff6
DO
3$relnotes = array
4(
2c9fde3a
DO
5 '0.17.0' => "LDAP options have been moved to LDAP_options array. This means, that if you were<br>" .
6 "using LDAP authentication for users in version 0.16.x, it will break right after<br>" .
aca5a846 7 "upgrade to 0.17.0. To get things working again, adjust existing secret.php file<br>" .
2c9fde3a 8 "according to secret-sample.php file provided with 0.17.0 release.<br><br>" .
204284ba 9 "Another change is the addition of support for file uploads. Files are stored<br>" .
90b96ff6 10 "in the database. There are several settings in php.ini which you may need to modify:<br>" .
4114697d
DO
11 "<ul><li>file_uploads - needs to be On</li>" .
12 "<li>upload_max_filesize - max size for uploaded files</li>" .
a476909e 13 "<li>post_max_size - max size of all form data submitted via POST (including files)</li></ul><br>" .
b82cce3f 14 "Local user accounts used to have 'enabled' flag, which allowed individual blocking and<br>" .
a476909e
DO
15 "unblocking of each. This flag was dropped in favor of existing mean of access<br>" .
16 "setup (RackCode). An unconditional denying rule is automatically added into RackCode<br>" .
17 "for such blocked account, so the effective security policy remains the same.<br>",
90b96ff6
DO
18);
19
fbbb74fb
DO
20// At the moment we assume, that for any two releases we can
21// sequentally execute all batches, that separate them, and
22// nothing will break. If this changes one day, the function
23// below will have to generate smarter upgrade paths, while
24// the upper layer will remain the same.
25// Returning an empty array means that no upgrade is necessary.
4114697d 26// Returning NULL indicates an error.
fbbb74fb
DO
27function getDBUpgradePath ($v1, $v2)
28{
a6f83a72
DO
29 $versionhistory = array
30 (
b3f866fc 31 '0.16.4',
64347dcf 32 '0.16.5',
90b96ff6 33 '0.16.6',
30d0a2a3 34 '0.17.0',
4563cecb 35 '0.17.1',
7b1a3a72 36 '0.17.2',
9e51318b 37 '0.17.3',
958ac06d 38 '0.17.4',
9f572fb5 39 '0.17.5',
63811a09 40 '0.17.6',
026a79ee 41 '0.17.7',
a6f83a72 42 );
120e9ddd
DO
43 if (!in_array ($v1, $versionhistory) or !in_array ($v2, $versionhistory))
44 return NULL;
fbbb74fb 45 $skip = TRUE;
4114697d 46 $path = NULL;
fbbb74fb
DO
47 // Now collect all versions > $v1 and <= $v2
48 foreach ($versionhistory as $v)
49 {
4114697d 50 if ($skip and $v == $v1)
fbbb74fb
DO
51 {
52 $skip = FALSE;
4114697d 53 $path = array();
fbbb74fb
DO
54 continue;
55 }
56 if ($skip)
57 continue;
58 $path[] = $v;
59 if ($v == $v2)
60 break;
61 }
62 return $path;
63}
64
90b96ff6
DO
65// Upgrade batches are named exactly as the release where they first appear.
66// That is simple, but seems sufficient for beginning.
fbbb74fb
DO
67function executeUpgradeBatch ($batchid)
68{
69 $query = array();
ca3d68bd 70 global $dbxlink;
fbbb74fb
DO
71 switch ($batchid)
72 {
64347dcf
DO
73 case '0.16.5':
74 $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')";
75 $query[] = "update Config set varvalue = '0.16.5' where varname = 'DB_VERSION'";
76 break;
90b96ff6
DO
77 case '0.16.6':
78 $query[] = "update Config set varvalue = '0.16.6' where varname = 'DB_VERSION'";
79 break;
30d0a2a3 80 case '0.17.0':
e1ae3fb4
AD
81 // create tables for storing files (requires InnoDB support)
82 if (!isInnoDBSupported ())
83 {
5d168fde 84 showFailure ("Cannot upgrade because InnoDB tables are not supported by your MySQL server. See the README for details.", __FILE__);
f3c50166 85 die;
e1ae3fb4 86 }
f76c4197
DY
87
88 $query[] = "alter table Chapter change chapter_no id int(10) unsigned NOT NULL auto_increment";
89 $query[] = "alter table Chapter change chapter_name name char(128) NOT NULL";
90 $query[] = "alter table Chapter drop key chapter_name";
91 $query[] = "alter table Chapter add UNIQUE KEY name (name)";
92 $query[] = "alter table Attribute change attr_id id int(10) unsigned NOT NULL auto_increment";
93 $query[] = "alter table Attribute change attr_type type enum('string','uint','float','dict') default NULL";
94 $query[] = "alter table Attribute change attr_name name char(64) default NULL";
95 $query[] = "alter table Attribute drop key attr_name";
96 $query[] = "alter table Attribute add UNIQUE KEY name (name)";
97 $query[] = "alter table AttributeMap change chapter_no chapter_id int(10) unsigned NOT NULL";
98 $query[] = "alter table Dictionary change chapter_no chapter_id int(10) unsigned NOT NULL";
3fb336f6 99 // Only after the above call it is Ok to use reloadDictionary()
ca3d68bd 100 $query = array_merge ($query, reloadDictionary ($batchid));
f3c50166 101 // schema changes for file management
e1ae3fb4
AD
102 $query[] = "
103CREATE TABLE `File` (
104 `id` int(10) unsigned NOT NULL auto_increment,
105 `name` char(255) NOT NULL,
106 `type` char(255) NOT NULL,
107 `size` int(10) unsigned NOT NULL,
108 `ctime` datetime NOT NULL,
109 `mtime` datetime NOT NULL,
110 `atime` datetime NOT NULL,
111 `contents` longblob NOT NULL,
112 `comment` text,
13edfa1c
AD
113 PRIMARY KEY (`id`),
114 UNIQUE KEY `name` (`name`)
e1ae3fb4
AD
115) ENGINE=InnoDB";
116 $query[] = "
117CREATE TABLE `FileLink` (
118 `id` int(10) unsigned NOT NULL auto_increment,
119 `file_id` int(10) unsigned NOT NULL,
120 `entity_type` enum('ipv4net','ipv4rspool','ipv4vs','object','rack','user') NOT NULL default 'object',
121 `entity_id` int(10) NOT NULL,
122 PRIMARY KEY (`id`),
af721881 123 UNIQUE KEY `FileLink-unique` (`file_id`,`entity_type`,`entity_id`),
e1ae3fb4
AD
124 KEY `FileLink-file_id` (`file_id`),
125 CONSTRAINT `FileLink-File_fkey` FOREIGN KEY (`file_id`) REFERENCES `File` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
126) ENGINE=InnoDB";
127 $query[] = "ALTER TABLE TagStorage MODIFY COLUMN target_realm enum('file','ipv4net','ipv4rspool','ipv4vs','object','rack','user') NOT NULL default 'object'";
f3c50166 128
f76c4197 129 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (24,'no','network security models')";
9730d09f 130 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (25,'no','wireless models')";
f76c4197
DY
131 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,1,0)";
132 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,2,24)";
133 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,3,0)";
134 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,5,0)";
135 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,14,0)";
136 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,16,0)";
137 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,17,0)";
138 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,18,0)";
139 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,20,0)";
140 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,21,0)";
141 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,22,0)";
142 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (798,24,0)";
9730d09f
DO
143 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (965,1,0)";
144 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (965,3,0)";
145 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (965,2,25)";
706ce117
DO
146 $query[] = 'alter table IPBonds rename to IPv4Allocation';
147 $query[] = 'alter table PortForwarding rename to IPv4NAT';
148 $query[] = 'alter table IPRanges rename to IPv4Network';
149 $query[] = 'alter table IPAddress rename to IPv4Address';
150 $query[] = 'alter table IPLoadBalancer rename to IPv4LB';
4114697d 151 $query[] = 'alter table IPRSPool rename to IPv4RSPool';
706ce117 152 $query[] = 'alter table IPRealServer rename to IPv4RS';
4114697d 153 $query[] = 'alter table IPVirtualService rename to IPv4VS';
120e9ddd
DO
154 $query[] = "alter table TagStorage change column target_realm entity_realm enum('file','ipv4net','ipv4vs','ipv4rspool','object','rack','user') NOT NULL default 'object'";
155 $query[] = 'alter table TagStorage change column target_id entity_id int(10) unsigned NOT NULL';
156 $query[] = 'alter table TagStorage drop key entity_tag';
157 $query[] = 'alter table TagStorage drop key target_id';
158 $query[] = 'alter table TagStorage add UNIQUE KEY `entity_tag` (`entity_realm`,`entity_id`,`tag_id`)';
159 $query[] = 'alter table TagStorage add KEY `entity_id` (`entity_id`)';
37e59768
DO
160 $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')";
161 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_ROWS','25','uint','yes','no','Rows for text file preview')";
162 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('PREVIEW_TEXT_COLS','80','uint','yes','no','Columns for text file preview')";
163 $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 164 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('VENDOR_SIEVE','','string','yes','no','Vendor sieve configuration')";
073ed463
DO
165 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4LB_LISTSRC','{\$typeid_4}','string','yes','no','List source: IPv4 load balancers')";
166 $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')";
167 $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')";
168 $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')";
169 $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 170 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('RACKS_PER_ROW','12','unit','yes','no','Racks per row')";
590e1281 171 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_PREDICATE_SIEVE','','string','yes','no','Predicate sieve regex(7)')";
5496c89f
DO
172 $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)')";
173 $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')";
174 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_SUGGEST_TAGS','yes','string','no','no','Suggest tags in list filter')";
175 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('FILTER_SUGGEST_PREDICATES','yes','string','no','no','Suggest predicates in list filter')";
176 $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
177 $query[] = "delete from Config where varname = 'USER_AUTH_SRC'";
178 $query[] = "delete from Config where varname = 'COOKIE_TTL'";
179 $query[] = "delete from Config where varname = 'rtwidth_0'";
180 $query[] = "delete from Config where varname = 'rtwidth_1'";
181 $query[] = "delete from Config where varname = 'rtwidth_2'";
c6bc0ac5
DO
182 $query[] = "delete from Config where varname = 'NAMEFUL_OBJTYPES'";
183 $query[] = "delete from Config where varname = 'REQUIRE_ASSET_TAG_FOR'";
184 $query[] = "delete from Config where varname = 'IPV4_PERFORMERS'";
185 $query[] = "delete from Config where varname = 'NATV4_PERFORMERS'";
dbb33805 186 $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
187 $result = $dbxlink->query ("select user_id, user_name, user_realname from UserAccount where user_enabled = 'no'");
188 while ($row = $result->fetch (PDO::FETCH_ASSOC))
189 $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'";
190 $query[] = "update Script set script_text = NULL where script_name = 'RackCodeCache'";
191 unset ($result);
79b8ad1e 192 $query[] = "alter table UserAccount drop column user_enabled";
f76c4197 193
10bac82a
DY
194 $query[] = "CREATE TABLE RackRow ( id int(10) unsigned NOT NULL auto_increment, name char(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM";
195
9f14a7ef
DY
196 $result = $dbxlink->query ("select dict_key, dict_value from Dictionary where chapter_no = 3");
197 while($row = $result->fetch(PDO::FETCH_NUM))
10bac82a 198 $query[] = "insert into RackRow set id=${row[0]}, name='${row[1]}'";
ee286837 199 unset ($result);
f76c4197 200 $query[] = "delete from Dictionary where chapter_id = 3";
c4d0dc30 201 $query[] = "delete from Chapter where id = 3";
9133d2c5
DO
202 $query[] = "
203CREATE TABLE `LDAPCache` (
204 `presented_username` char(64) NOT NULL,
205 `successful_hash` char(40) NOT NULL,
206 `first_success` timestamp NOT NULL default CURRENT_TIMESTAMP,
207 `last_retry` timestamp NOT NULL default '0000-00-00 00:00:00',
208 `displayed_name` char(128) default NULL,
209 `memberof` text,
210 UNIQUE KEY `presented_username` (`presented_username`),
211 KEY `scanidx` (`presented_username`,`successful_hash`)
212) ENGINE=InnoDB;";
3827da34 213 $query[] = "alter table UserAccount modify column user_password_hash char(40) NULL";
aa9a0fb4
DO
214 $query[] = 'ALTER TABLE Rack DROP COLUMN deleted';
215 $query[] = 'ALTER TABLE RackHistory DROP COLUMN deleted';
216 $query[] = 'ALTER TABLE RackObject DROP COLUMN deleted';
217 $query[] = 'ALTER TABLE RackObjectHistory DROP COLUMN deleted';
2fb9d280
DO
218 // Can't be added straight due to many duplicates, even in "dictbase" data.
219 $result = $dbxlink->query ('SELECT type1, type2, count(*) - 1 as excess FROM PortCompat GROUP BY type1, type2 HAVING excess > 0');
220 while ($row = $result->fetch (PDO::FETCH_ASSOC))
221 $query[] = "DELETE FROM PortCompat WHERE type1 = ${row['type1']} AND type2 = ${row['type2']} limit ${row['excess']}";
222 unset ($result);
223 $query[] = 'ALTER TABLE PortCompat DROP KEY type1';
67d8a969 224 $query[] = 'ALTER TABLE PortCompat ADD UNIQUE `type1_2` (type1, type2)';
f76c4197
DY
225 $query[] = "UPDATE Config SET varvalue = '0.17.0' WHERE varname = 'DB_VERSION'";
226
b3f866fc 227 break;
4563cecb 228 case '0.17.1':
8b200a9c 229 $query[] = "ALTER TABLE Dictionary DROP KEY `chap_to_key`";
ca3d68bd 230 $query = array_merge ($query, reloadDictionary ($batchid));
4563cecb
DO
231 // Token set has changed, so the cache isn't valid any more.
232 $query[] = "UPDATE Script SET script_text = NULL WHERE script_name = 'RackCodeCache'";
233 $query[] = "UPDATE Config SET varvalue = '0.17.1' WHERE varname = 'DB_VERSION'";
7d4ea62b 234 break;
7b1a3a72 235 case '0.17.2':
7b1a3a72 236 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (26,'no','fibre channel switch models')";
ca3d68bd 237 $query = array_merge ($query, reloadDictionary ($batchid));
7c537f33 238 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1055,2,26)";
49b605d9 239 $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
240 // wipe irrelevant records (ticket:250)
241 $query[] = "DELETE FROM TagStorage WHERE entity_realm = 'file' AND entity_id NOT IN (SELECT id FROM File)";
f06fe423 242 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('IPV4_ENABLE_KNIGHT','yes','string','no','no','Enable IPv4 knight feature')";
99ab184f 243 $query[] = "ALTER TABLE IPv4Network ADD COLUMN comment text AFTER name";
5163cd3a 244 $query[] = "ALTER TABLE Port ADD INDEX comment (reservation_comment)";
029a14bc
DO
245 $query[] = "ALTER TABLE Port DROP KEY l2address"; // UNIQUE
246 $query[] = "ALTER TABLE Port ADD KEY (l2address)"; // not UNIQUE
948666cc
DO
247 $query[] = "ALTER TABLE Port DROP KEY object_id";
248 $query[] = "ALTER TABLE Port ADD UNIQUE KEY per_object (object_id, name, type)";
74aee2dc
DO
249 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (20,1083)";
250 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (21,1083)";
251 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1077,1077)";
252 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1083,20)";
253 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1083,21)";
254 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1083,1083)";
1c4830dc 255 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (1087,1087)";
50e02490
DO
256 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (27,'no','PDU models')";
257 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (2,2,27)";
7b1a3a72
AD
258 $query[] = "UPDATE Config SET varvalue = '0.17.2' WHERE varname = 'DB_VERSION'";
259 break;
9e51318b
DO
260 case '0.17.3':
261 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('TAGS_TOPLIST_SIZE','50','uint','yes','no','Tags top list size')";
262 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('TAGS_QUICKLIST_SIZE','20','uint','no','no','Tags quick list size')";
263 $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, description) VALUES ('TAGS_QUICKLIST_THRESHOLD','50','uint','yes','no','Tags quick list threshold')";
87601bbc 264 $query[] = "ALTER TABLE AttributeMap MODIFY COLUMN chapter_id int(10) unsigned NULL";
7028a42c 265 $query[] = "UPDATE AttributeMap SET chapter_id = NULL WHERE attr_id IN (SELECT id FROM Attribute WHERE type != 'dict')";
a013838b
DO
266 // ticket:239
267 $query[] = 'UPDATE AttributeValue SET uint_value = 1018 WHERE uint_value = 731 AND attr_id IN (SELECT attr_id FROM AttributeMap WHERE chapter_id = 12)';
268 $query[] = 'DELETE FROM Dictionary WHERE dict_key = 731';
084aca6c
DO
269 $query = array_merge ($query, reloadDictionary ($batchid));
270 $query[] = "UPDATE Config SET vartype='uint' WHERE varname='RACKS_PER_ROW'";
f44fdef9 271 $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
272 $query[] = "UPDATE Config SET varvalue = '0.17.3' WHERE varname = 'DB_VERSION'";
273 break;
958ac06d
DO
274 case '0.17.4':
275 $query[] = "ALTER TABLE Link ENGINE=InnoDB";
276 $query[] = "ALTER TABLE Port ENGINE=InnoDB";
4d87feaf
DO
277 $query[] = "ALTER TABLE IPv4RS ENGINE=InnoDB";
278 $query[] = "ALTER TABLE IPv4RSPool ENGINE=InnoDB";
cafd4cf3
DO
279 $query[] = "ALTER TABLE AttributeValue ENGINE=InnoDB";
280 $query[] = "ALTER TABLE RackObject ENGINE=InnoDB";
281 $query[] = "ALTER TABLE IPv4NAT ENGINE=InnoDB";
282 $query[] = "ALTER TABLE IPv4LB ENGINE=InnoDB";
283 $query[] = "ALTER TABLE IPv4VS ENGINE=InnoDB";
4d87feaf 284 $query[] = "DELETE FROM IPv4RS WHERE rspool_id NOT IN (SELECT id FROM IPv4RSPool)";
958ac06d 285 $query[] = "ALTER TABLE Link ADD CONSTRAINT `Link-FK-b` FOREIGN KEY (portb) REFERENCES Port (id)";
cafd4cf3 286 $query[] = "ALTER TABLE Link ADD CONSTRAINT `Link-FK-a` FOREIGN KEY (porta) REFERENCES Port (id)";
4d87feaf 287 $query[] = "ALTER TABLE IPv4RS ADD CONSTRAINT `IPv4RS-FK` FOREIGN KEY (rspool_id) REFERENCES IPv4RSPool (id) ON DELETE CASCADE";
cafd4cf3
DO
288 $query[] = "ALTER TABLE AttributeValue ADD CONSTRAINT `AttributeValue-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id)";
289 $query[] = "ALTER TABLE IPv4NAT ADD CONSTRAINT `IPv4NAT-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id)";
290 $query[] = "ALTER TABLE Port ADD CONSTRAINT `Port-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id)";
291 $query[] = "ALTER TABLE IPv4LB ADD CONSTRAINT `IPv4LB-FK-rspool_id` FOREIGN KEY (rspool_id) REFERENCES IPv4RSPool (id)";
292 $query[] = "ALTER TABLE IPv4LB ADD CONSTRAINT `IPv4LB-FK-object_id` FOREIGN KEY (object_id) REFERENCES RackObject (id)";
293 $query[] = "ALTER TABLE IPv4LB ADD CONSTRAINT `IPv4LB-FK-vs_id` FOREIGN KEY (vs_id) REFERENCES IPv4VS (id)";
e49d8a77 294 $query = array_merge ($query, reloadDictionary ($batchid));
958ac06d
DO
295 $query[] = "UPDATE Config SET varvalue = '0.17.4' WHERE varname = 'DB_VERSION'";
296 break;
9f572fb5
DO
297 case '0.17.5':
298 $query[] = "ALTER TABLE TagTree ENGINE=InnoDB";
299 $query[] = "ALTER TABLE TagStorage ENGINE=InnoDB";
300 $query[] = "ALTER TABLE TagStorage ADD CONSTRAINT `TagStorage-FK-tag_id` FOREIGN KEY (tag_id) REFERENCES TagTree (id)";
301 $query[] = "ALTER TABLE TagTree ADD CONSTRAINT `TagTree-K-parent_id` FOREIGN KEY (parent_id) REFERENCES TagTree (id)";
2400d7ec
DO
302 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (21,1195)';
303 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (22,1196)';
304 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (23,1196)';
305 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (20,1195)';
306 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (25,1202)';
307 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (26,1202)';
308 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (27,1204)';
309 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (28,1204)';
310 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1083,1195)';
311 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1084,1084)';
312 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1195,20)';
313 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1195,21)';
314 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1195,1083)';
315 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1195,1195)';
316 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1196,22)';
317 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1196,23)';
318 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1196,1196)';
319 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1197,1197)';
320 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1198,1199)';
321 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1199,1198)';
322 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1200,1200)';
323 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1201,1201)';
324 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1202,25)';
325 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1202,26)';
326 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1202,1202)';
327 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1203,1203)';
328 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1204,27)';
329 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1204,28)';
330 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1204,1204)';
331 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1205,1205)';
332 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1206,1207)';
333 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1207,1206)';
93a83f51 334 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1316,1316)';
bdc91a5c
DO
335 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (16, 1322)';
336 $query[] = 'INSERT INTO PortCompat (type1, type2) VALUES (1322, 16)';
337 $query[] = 'DELETE FROM PortCompat WHERE type1 = 16 AND type2 = 16';
2400d7ec
DO
338 for ($i = 1209; $i <= 1300; $i++)
339 $query[] = "INSERT INTO PortCompat (type1, type2) VALUES (${i}, ${i})";
d9b88ea0 340 $query[] = "
09d6afa4 341CREATE TABLE `PortInnerInterface` (
9173281a 342 `id` int(10) unsigned NOT NULL,
d9b88ea0
DO
343 `iif_name` char(16) NOT NULL,
344 PRIMARY KEY (`id`),
9173281a 345 UNIQUE KEY `iif_name` (`iif_name`)
d9b88ea0 346) ENGINE=InnoDB";
2400d7ec
DO
347 $query[] = "INSERT INTO `PortInnerInterface` VALUES (1,'hardwired')";
348 $query[] = "INSERT INTO `PortInnerInterface` VALUES (2,'SFP-100')";
349 $query[] = "INSERT INTO `PortInnerInterface` VALUES (3,'GBIC')";
350 $query[] = "INSERT INTO `PortInnerInterface` VALUES (4,'SFP-1000')";
351 $query[] = "INSERT INTO `PortInnerInterface` VALUES (5,'XENPAK')";
352 $query[] = "INSERT INTO `PortInnerInterface` VALUES (6,'X2')";
353 $query[] = "INSERT INTO `PortInnerInterface` VALUES (7,'XPAK')";
354 $query[] = "INSERT INTO `PortInnerInterface` VALUES (8,'XFP')";
355 $query[] = "INSERT INTO `PortInnerInterface` VALUES (9,'SFP+')";
d9b88ea0 356 $query[] = "
09d6afa4 357CREATE TABLE `PortInterfaceCompat` (
d9b88ea0
DO
358 `iif_id` int(10) unsigned NOT NULL,
359 `oif_id` int(10) unsigned NOT NULL,
360 UNIQUE KEY `pair` (`iif_id`,`oif_id`),
2400d7ec 361 CONSTRAINT `PortInterfaceCompat-FK-iif_id` FOREIGN KEY (`iif_id`) REFERENCES `PortInnerInterface` (`id`)
d9b88ea0 362) ENGINE=InnoDB";
c76cfa0d
DO
363 $query[] = "ALTER TABLE Port ADD COLUMN iif_id int unsigned NOT NULL AFTER name"; // will set iif_id to 0
364 $query[] = "UPDATE Port SET iif_id = 2 WHERE type = 1208";
365 $query[] = "UPDATE Port SET iif_id = 3 WHERE type = 1078";
366 $query[] = "UPDATE Port SET iif_id = 4 WHERE type = 1077";
367 $query[] = "UPDATE Port SET iif_id = 5 WHERE type = 1079";
368 $query[] = "UPDATE Port SET iif_id = 6 WHERE type = 1080";
369 $query[] = "UPDATE Port SET iif_id = 7 WHERE type = 1081";
370 $query[] = "UPDATE Port SET iif_id = 8 WHERE type = 1082";
371 $query[] = "UPDATE Port SET iif_id = 9 WHERE type = 1084";
372 $query[] = "UPDATE Port SET iif_id = 1 WHERE iif_id = 0";
08aa3467
DO
373 $query[] = 'ALTER TABLE Port ADD UNIQUE `object_iif_oif_name` (object_id, iif_id, type, name)';
374 $query[] = 'ALTER TABLE Port DROP KEY `per_object`';
2400d7ec
DO
375 $base1000 = array (24, 34, 1202, 1203, 1204, 1205, 1206, 1207);
376 $base10000 = array (30, 35, 36, 37, 38, 39, 40);
377 $PICdata = array
378 (
bdc91a5c 379 1 => array (16, 19, 24, 29, 31, 33, 446, 681, 682, 1322),
2400d7ec
DO
380 2 => array (1208, 1195, 1196, 1197, 1198, 1199, 1200, 1201),
381 3 => array_merge (array (1078), $base1000),
382 4 => array_merge (array (1077), $base1000),
383 5 => array_merge (array (1079), $base10000),
384 6 => array_merge (array (1080), $base10000),
385 7 => array_merge (array (1081), $base10000),
386 8 => array_merge (array (1082), $base10000),
387 9 => array_merge (array (1084), $base10000),
388 );
389 // make sure all IIF/OIF pairs referenced from Port exist in PortInterfaceCompat before enabling FK
390 // iif_id doesn't exist at this point
391 $result = $dbxlink->query ('SELECT DISTINCT type FROM Port WHERE type NOT IN (1208, 1078, 1077, 1079, 1080, 1081, 1082, 1084)');
392 while ($row = $result->fetch (PDO::FETCH_ASSOC))
393 if (FALSE === array_search ($row['type'], $PICdata[1]))
394 array_push ($PICdata[1], $row['type']);
395 unset ($result);
396 foreach ($PICdata as $iif_id => $oif_ids)
397 foreach ($oif_ids as $oif_id)
398 $query[] = "INSERT INTO PortInterfaceCompat (iif_id, oif_id) VALUES (${iif_id}, ${oif_id})";
c76cfa0d 399 $query[] = "ALTER TABLE Port ADD CONSTRAINT `Port-FK-iif-oif` FOREIGN KEY (`iif_id`, `type`) REFERENCES `PortInterfaceCompat` (`iif_id`, `oif_id`)";
bdc91a5c 400 $query[] = 'UPDATE Port SET type = 1322 WHERE type = 16 AND (SELECT objtype_id FROM RackObject WHERE id = object_id) IN (2, 12)';
2400d7ec
DO
401 $query = array_merge ($query, reloadDictionary ($batchid));
402 $query[] = "DELETE FROM Config WHERE varname = 'default_port_type'";
403 $query[] = "INSERT INTO Config VALUES ('DEFAULT_PORT_IIF_ID','1','uint','no','no','Default port inner interface ID')";
404 $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 405 $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 406 $query[] = "UPDATE Chapter SET name = 'PortOuterInterface' WHERE id = 2";
fbcbb4ee
DO
407 // remap refs to duplicate records, which will be discarded (ticket:286)
408 $query[] = 'UPDATE AttributeValue SET uint_value = 147 WHERE uint_value = 1020 AND attr_id = 2';
409 $query[] = 'UPDATE AttributeValue SET uint_value = 377 WHERE uint_value = 1021 AND attr_id = 2';
e8ab58e8 410 $query[] = 'INSERT INTO AttributeMap (objtype_id, attr_id) VALUES (2, 1), (2, 3), (2, 5)';
9f572fb5
DO
411 $query[] = "UPDATE Config SET varvalue = '0.17.5' WHERE varname = 'DB_VERSION'";
412 break;
63811a09
DO
413 case '0.17.6':
414 $query[] = "INSERT INTO `Chapter` (`id`, `sticky`, `name`) VALUES (28,'no','Voice/video hardware')";
415 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1323,1,NULL)";
416 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1323,2,28)";
417 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1323,3,NULL)";
418 $query[] = "INSERT INTO `AttributeMap` (`objtype_id`, `attr_id`, `chapter_id`) VALUES (1323,5,NULL)";
cd3775e9 419 $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 420 $query = array_merge ($query, reloadDictionary ($batchid));
63811a09
DO
421 $query[] = "UPDATE Config SET varvalue = '0.17.6' WHERE varname = 'DB_VERSION'";
422 break;
026a79ee
DO
423 case '0.17.7':
424 $query[] = "UPDATE Config SET varvalue = '0.17.7' WHERE varname = 'DB_VERSION'";
425 break;
fbbb74fb 426 default:
5d168fde 427 showFailure ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined", __FILE__);
fbbb74fb
DO
428 die;
429 break;
430 }
fbbb74fb 431 $failures = array();
4114697d 432 echo "<tr><th>Executing batch '${batchid}'</th><td>";
fbbb74fb
DO
433 foreach ($query as $q)
434 {
435 $result = $dbxlink->query ($q);
4114697d 436 if ($result == NULL)
758fe24c 437 {
758fe24c
DO
438 $errorInfo = $dbxlink->errorInfo();
439 $failures[] = array ($q, $errorInfo[2]);
440 }
fbbb74fb 441 }
fbbb74fb 442 if (!count ($failures))
4114697d 443 echo "<strong><font color=green>done</font></strong>";
fbbb74fb
DO
444 else
445 {
4114697d 446 echo "<strong><font color=red>The following queries failed:</font></strong><br><pre>";
fbbb74fb
DO
447 foreach ($failures as $f)
448 {
449 list ($q, $i) = $f;
4114697d 450 echo "${q} -- ${i}\n";
fbbb74fb 451 }
4114697d 452 echo "</pre>";
fbbb74fb 453 }
4114697d 454 echo '</td></tr>';
fbbb74fb
DO
455}
456
457// ******************************************************************
458//
459// Execution starts here
460//
461// ******************************************************************
462
5d168fde
DO
463// a clone of showError() to drop dependency on interface.php
464function showFailure ($info = '', $location = 'N/A')
465{
5d168fde
DO
466 if (preg_match ('/\.php$/', $location))
467 $location = basename ($location);
468 elseif ($location != 'N/A')
469 $location = $location . '()';
470 echo "<div class=msg_error>An error has occured in [${location}]. ";
471 if (empty ($info))
472 echo 'No additional information is available.';
473 else
474 echo "Additional information:<br><p>\n<pre>\n${info}\n</pre></p>";
475 echo "This failure is most probably fatal.<br></div>\n";
476}
477
478require_once 'inc/config.php'; // for CODE_VERSION
479require_once 'inc/database.php'; // for getDatabaseVersion()
3fb336f6 480require_once 'inc/dictionary.php';
5d168fde
DO
481// Enforce default value for now, releases prior to 0.17.0 didn't support 'httpd' auth source.
482$user_auth_src = 'database';
fbbb74fb 483
80138748
DO
484if (file_exists ('inc/secret.php'))
485 require_once 'inc/secret.php';
fbbb74fb 486else
80138748
DO
487 die ("Database connection parameters are read from inc/secret.php file, " .
488 "which cannot be found.\nCopy provided inc/secret-sample.php to " .
489 "inc/secret.php and modify to your setup.\n\nThen reload the page.");
fbbb74fb
DO
490
491try
492{
493 $dbxlink = new PDO ($pdo_dsn, $db_username, $db_password);
494}
495catch (PDOException $e)
496{
497 die ("Database connection failed:\n\n" . $e->getMessage());
498}
499
fbbb74fb
DO
500// Now we need to be sure that the current user is the administrator.
501// The rest doesn't matter within this context.
fbbb74fb 502
120e9ddd 503function authenticate_admin ($username, $password)
a1f3710a 504{
43c7895d 505 global $dbxlink;
93bdb7ba 506 $hash = sha1 ($password);
120e9ddd 507 $query = "select count(*) from UserAccount where user_id = 1 and user_name = '${username}' and user_password_hash = '${hash}'";
a1f3710a
DO
508 if (($result = $dbxlink->query ($query)) == NULL)
509 die ('SQL query failed in ' . __FUNCTION__);
120e9ddd 510 $rows = $result->fetchAll (PDO::FETCH_NUM);
43c7895d 511 return $rows[0][0] == 1;
a1f3710a
DO
512}
513
204284ba 514switch ($user_auth_src)
99ee5479 515{
120e9ddd
DO
516 case 'database':
517 case 'ldap': // authenticate against DB as well
518 if
519 (
520 !isset ($_SERVER['PHP_AUTH_USER']) or
521 !strlen ($_SERVER['PHP_AUTH_USER']) or
522 !isset ($_SERVER['PHP_AUTH_PW']) or
523 !strlen ($_SERVER['PHP_AUTH_PW']) or
524 !authenticate_admin (escapeString ($_SERVER['PHP_AUTH_USER']), escapeString ($_SERVER['PHP_AUTH_PW']))
525 )
526 {
527 header ('WWW-Authenticate: Basic realm="RackTables upgrade"');
528 header ('HTTP/1.0 401 Unauthorized');
33bbd712 529 showFailure ('You must be authenticated as an administrator to complete the upgrade.', __FILE__);
120e9ddd
DO
530 die;
531 }
532 break; // cleared
533 case 'httpd':
534 if
535 (
536 !isset ($_SERVER['REMOTE_USER']) or
537 !strlen ($_SERVER['REMOTE_USER'])
538 )
539 {
33bbd712 540 showFailure ('System misconfiguration. The web-server didn\'t authenticate the user, although ought to do.');
120e9ddd
DO
541 die;
542 }
543 break; // cleared
544 default:
33bbd712 545 showFailure ('authentication source misconfiguration', __FILE__);
120e9ddd 546 die;
99ee5479 547}
fbbb74fb
DO
548
549$dbver = getDatabaseVersion();
4114697d
DO
550echo '<table border=1>';
551echo "<tr><th>Current status</th><td>Data version: ${dbver}<br>Code version: " . CODE_VERSION . "</td></tr>\n";
552
553$path = getDBUpgradePath ($dbver, CODE_VERSION);
554if ($path === NULL)
758fe24c 555{
4114697d 556 echo "<tr><th>Upgrade path</th><td><font color=red>not found</font></td></tr>\n";
d74ae24c
DO
557 echo "<tr><th>Summary</th><td>Check README for more information. RackTables releases prior to 0.16.4 ";
558 echo "must be upgraded to 0.16.4 first.</td></tr>\n";
758fe24c 559}
4114697d 560else
5f4027b8 561{
4114697d
DO
562 if (!count ($path))
563 echo "<tr><th>Summary</th><td>Come back later.</td></tr>\n";
564 else
565 {
566 echo "<tr><th>Upgrade path</th><td>${dbver} &rarr; " . implode (' &rarr; ', $path) . "</td></tr>\n";
567 foreach ($path as $batchid)
568 {
569 executeUpgradeBatch ($batchid);
570 if (isset ($relnotes[$batchid]))
571 echo "<tr><th>Release notes for ${batchid}</th><td>" . $relnotes[$batchid] . "</td></tr>\n";
572 }
790a60e8 573 echo "<tr><th>Summary</th><td>Upgrade complete, it is Ok to <a href='index.php'>enter</a> the system.</td></tr>\n";
4114697d 574 }
5f4027b8 575}
4114697d 576echo '</table>';
fbbb74fb
DO
577
578?>