Commit | Line | Data |
---|---|---|
0e7f2155 | 1 | <?php |
5b4523dc DO |
2 | |
3 | // This draft doesn't do anything useful at the moment. When it is finished, | |
4 | // the README will be updated accordingly. | |
5 | ||
0e7f2155 DO |
6 | $stepfunc[1] = 'not_already_installed'; |
7 | $stepfunc[2] = 'platform_is_ok'; | |
8 | $stepfunc[3] = 'init_config'; | |
96e102b2 DO |
9 | $stepfunc[4] = 'init_database_static'; |
10 | $stepfunc[5] = 'init_database_dynamic'; | |
11 | $stepfunc[6] = 'congrats'; | |
12 | $dbxlink = NULL; | |
0e7f2155 DO |
13 | |
14 | if (isset ($_REQUEST['step'])) | |
15 | $step = $_REQUEST['step']; | |
16 | else | |
17 | $step = 1; | |
18 | ||
19 | if ($step > count ($stepfunc)) | |
20 | { | |
21 | require 'inc/init.php'; | |
22 | global $root; | |
23 | header ("Location: " . $root); | |
24 | exit; | |
25 | } | |
26 | $title = "RackTables installation: step ${step} of " . count ($stepfunc); | |
27 | ?> | |
f48dc2cc DO |
28 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
29 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | |
0e7f2155 | 30 | <head><title><?php echo $title; ?></title> |
21fd978f | 31 | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
f48dc2cc DO |
32 | <link rel=stylesheet type='text/css' href=pi.css /> |
33 | </head> | |
34 | <body> | |
0e7f2155 | 35 | <center> |
f48dc2cc | 36 | <?php |
f92287f4 DO |
37 | echo "<h1>${title}</h1><p>"; |
38 | ||
39 | echo "</p><form method=post>\n"; | |
40 | $testres = $stepfunc[$step] (); | |
41 | if ($testres) | |
42 | { | |
43 | $next_step = $step + 1; | |
44 | echo "<input type=submit value='proceed'>"; | |
45 | } | |
46 | else | |
47 | { | |
48 | $next_step = $step; | |
49 | echo "<input type=submit value='retry'>"; | |
50 | } | |
51 | echo "<input type=hidden name=step value='${next_step}'>\n"; | |
52 | ||
53 | ?> | |
54 | </form> | |
55 | </center> | |
56 | </body> | |
57 | </html> | |
58 | ||
59 | <?php | |
0e7f2155 DO |
60 | // Check if the software is already installed. |
61 | function not_already_installed() | |
f48dc2cc | 62 | { |
ac2cd32b | 63 | @include ('inc/secret.php'); |
f92287f4 DO |
64 | if (isset ($pdo_dsn)) |
65 | { | |
66 | echo 'Your configuration file exists and seems to hold necessary data already.<br>'; | |
67 | return FALSE; | |
68 | } | |
69 | else | |
70 | { | |
43f06d53 | 71 | echo 'There seem to be no existing installation here, I am going to setup one now.<br>'; |
f92287f4 DO |
72 | return TRUE; |
73 | } | |
f48dc2cc DO |
74 | } |
75 | ||
0e7f2155 DO |
76 | // Check for PHP extensions. |
77 | function platform_is_ok () | |
f48dc2cc | 78 | { |
0e7f2155 DO |
79 | $nerrs = 0; |
80 | echo "<table border=1><tr><th>check item</th><th>result</th></tr>\n"; | |
81 | ||
82 | echo '<tr><td>PDO extension</td>'; | |
83 | if (class_exists ('PDO')) | |
84 | echo '<td class=msg_success>Ok'; | |
85 | else | |
f48dc2cc | 86 | { |
0e7f2155 DO |
87 | echo '<td class=msg_error>not found'; |
88 | $nerrs++; | |
89 | } | |
90 | echo '</td></tr>'; | |
f48dc2cc | 91 | |
0e7f2155 DO |
92 | echo '<tr><td>PDO-MySQL</td>'; |
93 | if (defined ('PDO::MYSQL_ATTR_READ_DEFAULT_FILE')) | |
94 | echo '<td class=msg_success>Ok'; | |
95 | else | |
96 | { | |
97 | echo '<td class=msg_error>not found'; | |
98 | $nerrs++; | |
99 | } | |
100 | echo '</td></tr>'; | |
f48dc2cc | 101 | |
0e7f2155 DO |
102 | echo '<tr><td>hash functions</td>'; |
103 | if (function_exists ('hash_algos')) | |
104 | echo '<td class=msg_success>Ok'; | |
105 | else | |
106 | { | |
107 | echo '<td class=msg_error>not found'; | |
108 | $nerrs++; | |
109 | } | |
110 | echo '</td></tr>'; | |
f48dc2cc | 111 | |
0e7f2155 DO |
112 | echo '<tr><td>SNMP extension</td>'; |
113 | if (defined ('SNMP_NULL')) | |
114 | echo '<td class=msg_success>Ok'; | |
115 | else | |
116 | echo '<td class=msg_warning>Not found. Live SNMP tab will not function properly until the extension is installed.'; | |
117 | echo '</td></tr>'; | |
f48dc2cc | 118 | |
0e7f2155 DO |
119 | echo '<tr><td>GD functions</td>'; |
120 | if (defined ('IMG_PNG')) | |
121 | echo '<td class=msg_success>Ok'; | |
122 | else | |
123 | { | |
124 | echo '<td class=msg_error>not found'; | |
125 | $nerrs++; | |
126 | } | |
127 | echo '</td></tr>'; | |
f48dc2cc | 128 | |
01539ac3 DO |
129 | echo '<tr><td>HTTP scheme</td>'; |
130 | if (!empty($_SERVER['HTTPS'])) | |
131 | echo '<td class=msg_success>HTTPs'; | |
132 | else | |
133 | echo '<td class=msg_warning>HTTP (all your passwords will be transmitted in cleartext)'; | |
134 | echo '</td></tr>'; | |
135 | ||
9ddee5ea DO |
136 | echo '<tr><td>Multibyte string extension</td>'; |
137 | if (defined ('MB_CASE_LOWER')) | |
138 | echo '<td class=msg_success>Ok'; | |
139 | else | |
140 | { | |
141 | echo '<td class=msg_error>not found'; | |
142 | $nerrs++; | |
143 | } | |
144 | echo '</td></tr>'; | |
145 | ||
146 | echo '<tr><td>LDAP extension</td>'; | |
147 | if (defined ('LDAP_OPT_DEREF')) | |
148 | echo '<td class=msg_success>Ok'; | |
149 | else | |
150 | { | |
151 | echo '<td class=msg_warning>not found, LDAP authentication will not work'; | |
152 | } | |
153 | echo '</td></tr>'; | |
154 | ||
0e7f2155 DO |
155 | echo "</table>\n"; |
156 | return !$nerrs; | |
157 | } | |
f48dc2cc | 158 | |
0e7f2155 DO |
159 | // Check that we can write to configuration file. |
160 | // If so, ask for DB connection paramaters and test | |
161 | // the connection. Neither save the parameters nor allow | |
162 | // going further until we succeed with the given | |
163 | // credentials. | |
164 | function init_config () | |
165 | { | |
f92287f4 DO |
166 | if (!is_writable ('inc/secret.php')) |
167 | { | |
168 | echo "The inc/secret.php file is not writable by web-server. Make sure it is."; | |
169 | echo "The following commands should suffice:<pre>touch inc/secret.php\nchmod 666 inc/secret.php</pre>"; | |
170 | return FALSE; | |
171 | } | |
172 | if | |
173 | ( | |
174 | !isset ($_REQUEST['save_config']) or | |
175 | empty ($_REQUEST['mysql_host']) or | |
176 | empty ($_REQUEST['mysql_db']) or | |
177 | empty ($_REQUEST['mysql_username']) or | |
178 | empty ($_REQUEST['mysql_password']) | |
179 | ) | |
180 | { | |
181 | echo "<input type=hidden name=save_config value=1>\n"; | |
182 | echo '<table>'; | |
183 | echo "<tr><td><label for=mysql_host>MySQL host:</label></td>"; | |
184 | echo "<td><input type=text name=mysql_host id=mysql_host value=localhost></td></tr>\n"; | |
185 | echo "<tr><td><label for=mysql_host>database:</label></td>"; | |
186 | echo "<td><input type=text name=mysql_db id=mysql_db value=racktables></td></tr>\n"; | |
187 | echo "<tr><td><label for=mysql_username>username:</label></td>"; | |
188 | echo "<td><input type=text name=mysql_username></td></tr>\n"; | |
189 | echo "<tr><td><label for=mysql_password>password:</label></td>"; | |
190 | echo "<td><input type=password name=mysql_password></td></tr>\n"; | |
191 | echo '</table>'; | |
192 | return FALSE; | |
193 | } | |
194 | $pdo_dsn = 'mysql:host=' . $_REQUEST['mysql_host'] . ';dbname=' . $_REQUEST['mysql_db']; | |
195 | try | |
196 | { | |
197 | $dbxlink = new PDO ($pdo_dsn, $_REQUEST['mysql_username'], $_REQUEST['mysql_password']); | |
198 | } | |
199 | catch (PDOException $e) | |
200 | { | |
201 | echo "<input type=hidden name=save_config value=1>\n"; | |
202 | echo '<table>'; | |
203 | echo "<tr><td><label for=mysql_host>MySQL host:</label></td>"; | |
204 | echo "<td><input type=text name=mysql_host id=mysql_host value='" . $_REQUEST['mysql_host'] . "'></td></tr>\n"; | |
205 | echo "<tr><td><label for=mysql_host>database:</label></td>"; | |
206 | echo "<td><input type=text name=mysql_db id=mysql_db value='" . $_REQUEST['mysql_db'] . "'></td></tr>\n"; | |
207 | echo "<tr><td><label for=mysql_username>username:</label></td>"; | |
208 | echo "<td><input type=text name=mysql_username value='" . $_REQUEST['mysql_username'] . "'></td></tr>\n"; | |
209 | echo "<tr><td><label for=mysql_password>password:</label></td>"; | |
210 | echo "<td><input type=password name=mysql_password value='" . $_REQUEST['mysql_password'] . "'></td></tr>\n"; | |
211 | echo "<tr><td colspan=2>The above parameters did not work. Check and try again.</td></tr>\n"; | |
212 | echo '</table>'; | |
213 | return FALSE; | |
214 | } | |
215 | $conf = fopen ('inc/secret.php', 'w+'); | |
216 | if ($conf === FALSE) | |
217 | { | |
218 | echo "Error: failed to open inc/secret.php for writing"; | |
219 | return FALSE; | |
220 | } | |
221 | fwrite ($conf, "<?php\n/* This file has been generated automatically by RackTables installer.\n"); | |
222 | fwrite ($conf, " * you shouldn't normally edit it unless your database setup has changed.\n"); | |
223 | fwrite ($conf, " */\n"); | |
224 | fwrite ($conf, "\$pdo_dsn = '${pdo_dsn}';\n"); | |
225 | fwrite ($conf, "\$db_username = '" . $_REQUEST['mysql_username'] . "';\n"); | |
e0dcbf1e DO |
226 | fwrite ($conf, "\$db_password = '" . $_REQUEST['mysql_password'] . "';\n\n"); |
227 | fwrite ($conf, "// This is only necessary for 'ldap' USER_AUTH_SRC\n"); | |
228 | fwrite ($conf, "\$ldap_server = 'some.server';\n"); | |
229 | fwrite ($conf, "\$ldap_domain = 'some.domain';\n"); | |
f92287f4 DO |
230 | fwrite ($conf, "?>\n"); |
231 | fclose ($conf); | |
232 | echo "The configuration file has been written successfully.<br>"; | |
0e7f2155 | 233 | return TRUE; |
f48dc2cc DO |
234 | } |
235 | ||
96e102b2 DO |
236 | function connect_to_db () |
237 | { | |
238 | require ('inc/secret.php'); | |
239 | global $dbxlink; | |
240 | try | |
241 | { | |
242 | $dbxlink = new PDO ($pdo_dsn, $db_username, $db_password); | |
243 | } | |
244 | catch (PDOException $e) | |
245 | { | |
246 | die ('Error connecting to the database'); | |
247 | } | |
248 | } | |
249 | ||
250 | function init_database_static () | |
0e7f2155 | 251 | { |
01539ac3 DO |
252 | connect_to_db (); |
253 | global $dbxlink; | |
254 | $result = $dbxlink->query ('show tables'); | |
255 | $tables = $result->fetchAll (PDO::FETCH_NUM); | |
256 | $result->closeCursor(); | |
257 | unset ($result); | |
258 | if (count ($tables)) | |
259 | { | |
260 | echo 'Your database is already holding ' . count ($tables); | |
261 | echo ' tables, so I will stop here and let you check it yourself.<br>'; | |
262 | echo 'There is some important data there probably.<br>'; | |
263 | return FALSE; | |
264 | } | |
0e7f2155 | 265 | echo 'Initializing the database...<br>'; |
96e102b2 | 266 | echo '<table border=1>'; |
b2bdfd89 DO |
267 | echo "<tr><th>file</th><th>queries</th><th>errors</th></tr>"; |
268 | $errlist = array(); | |
f92287f4 DO |
269 | foreach (array ('structure', 'dictbase', 'dictvendors') as $part) |
270 | { | |
96e102b2 DO |
271 | $filename = "install/init-${part}.sql"; |
272 | echo "<tr><td>${filename}</td>"; | |
273 | $f = fopen ("install/init-${part}.sql", 'r'); | |
96e102b2 DO |
274 | if ($f === FALSE) |
275 | { | |
276 | echo "Failed to open install/init-${part}.sql for reading"; | |
277 | return FALSE; | |
278 | } | |
b2bdfd89 | 279 | $longq = ''; |
96e102b2 DO |
280 | while (!feof ($f)) |
281 | { | |
282 | $line = fgets ($f); | |
283 | if (ereg ('^--', $line)) | |
284 | continue; | |
b2bdfd89 | 285 | $longq .= $line; |
96e102b2 DO |
286 | } |
287 | fclose ($f); | |
b2bdfd89 DO |
288 | $nq = $nerrs = 0; |
289 | foreach (explode (";\n", $longq) as $query) | |
96e102b2 DO |
290 | { |
291 | if (empty ($query)) | |
292 | continue; | |
293 | $nq++; | |
b2bdfd89 DO |
294 | if ($dbxlink->exec ($query) === FALSE) |
295 | { | |
296 | $nerrs++; | |
297 | $errlist[] = $query; | |
298 | } | |
96e102b2 | 299 | } |
b2bdfd89 | 300 | echo "<td>${nq}</td><td>${nerrs}</td></tr>\n"; |
f92287f4 | 301 | } |
96e102b2 | 302 | echo '</table>'; |
b2bdfd89 DO |
303 | if (count ($errlist)) |
304 | { | |
305 | echo '<pre>The following queries failed:\n'; | |
306 | foreach ($errlist as $q) | |
307 | echo "${q}\n\n"; | |
308 | echo '</pre>'; | |
309 | return FALSE; | |
310 | } | |
0e7f2155 DO |
311 | return TRUE; |
312 | } | |
f48dc2cc | 313 | |
96e102b2 DO |
314 | function init_database_dynamic () |
315 | { | |
316 | connect_to_db(); | |
317 | global $dbxlink; | |
43f06d53 | 318 | if (!isset ($_REQUEST['password']) or empty ($_REQUEST['password'])) |
96e102b2 DO |
319 | { |
320 | $result = $dbxlink->query ('select count(user_id) from UserAccount where user_id = 1'); | |
321 | $row = $result->fetch (PDO::FETCH_NUM); | |
322 | $nrecs = $row[0]; | |
323 | $result->closeCursor(); | |
324 | if (!$nrecs) | |
325 | { | |
326 | echo '<table border=1>'; | |
327 | echo '<caption>Administrator password not set</caption>'; | |
328 | echo '<tr><td><input type=password name=password></td></tr>'; | |
329 | echo '</table>'; | |
330 | } | |
43f06d53 | 331 | return FALSE; |
96e102b2 DO |
332 | } |
333 | else | |
334 | { | |
43f06d53 DO |
335 | $query = "INSERT INTO `UserAccount` (`user_id`, `user_name`, `user_enabled`, `user_password_hash`, `user_realname`) " . |
336 | "VALUES (1,'admin','yes',sha1('${_REQUEST['password']}'),'RackTables Administrator')"; | |
337 | $result = $dbxlink->exec ($query); | |
338 | echo "Administrator password has been set successfully.<br>"; | |
339 | return TRUE; | |
96e102b2 | 340 | } |
96e102b2 DO |
341 | } |
342 | ||
0e7f2155 | 343 | function congrats () |
f48dc2cc | 344 | { |
01539ac3 DO |
345 | echo 'Congratulations! RackTables installation is complete. After pressing Proceed you will '; |
346 | echo 'enter the system. Authenticate with <strong>admin</strong> username.<br>'; | |
347 | echo "RackTables web-site runs some <a href='http://racktables.org/trac/wiki'>wiki</a> pages "; | |
348 | echo "and <a href='http://racktables.org/trac/report/1'>a bug tracker</a>.<br>We have also got "; | |
349 | echo "a <a href='http://www.freelists.org/list/racktables-users'>mailing list</a> for users. Have fun.<br>"; | |
0e7f2155 | 350 | return TRUE; |
f48dc2cc DO |
351 | } |
352 | ||
353 | ?> |