Commit | Line | Data |
---|---|---|
117bd748 | 1 | <?php |
5b4a78e2 | 2 | // This file is part of Moodle - http://moodle.org/ |
1caea91e | 3 | // |
5b4a78e2 PS |
4 | // Moodle is free software: you can redistribute it and/or modify |
5 | // it under the terms of the GNU General Public License as published by | |
6 | // the Free Software Foundation, either version 3 of the License, or | |
7 | // (at your option) any later version. | |
8 | // | |
9 | // Moodle is distributed in the hope that it will be useful, | |
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | // GNU General Public License for more details. | |
13 | // | |
14 | // You should have received a copy of the GNU General Public License | |
15 | // along with Moodle. If not, see <http://www.gnu.org/licenses/>. | |
16 | ||
17 | /** | |
18 | * This file is executed right after the install.xml | |
19 | * | |
39b90b51 EL |
20 | * For more information, take a look to the documentation available: |
21 | * - Upgrade API: {@link http://docs.moodle.org/dev/Upgrade_API} | |
22 | * | |
23 | * @package core_install | |
24 | * @category upgrade | |
25 | * @copyright 2009 Petr Skoda (http://skodak.org) | |
26 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | |
5b4a78e2 PS |
27 | */ |
28 | ||
29 | defined('MOODLE_INTERNAL') || die(); | |
1caea91e | 30 | |
39b90b51 EL |
31 | /** |
32 | * Main post-install tasks to be executed after the BD schema is available | |
33 | * | |
34 | * This function is automatically executed after Moodle core DB has been | |
35 | * created at initial install. It's in charge of perform the initial tasks | |
36 | * not covered by the {@link install.xml} file, like create initial users, | |
37 | * roles, templates, moving stuff from other plugins... | |
38 | * | |
39 | * Note that the function is only invoked once, at install time, so if new tasks | |
40 | * are needed in the future, they will need to be added both here (for new sites) | |
41 | * and in the corresponding {@link upgrade.php} file (for existing sites). | |
42 | * | |
43 | * All plugins within Moodle (modules, blocks, reports...) support the existence of | |
44 | * their own install.php file, using the "Frankenstyle" component name as | |
45 | * defined at {@link http://docs.moodle.org/dev/Frankenstyle}, for example: | |
46 | * - {@link xmldb_page_install()}. (modules don't require the plugintype ("mod_") to be used. | |
47 | * - {@link xmldb_enrol_meta_install()}. | |
48 | * - {@link xmldb_workshopform_accumulative_install()}. | |
49 | * - .... | |
50 | * | |
51 | * Finally, note that it's also supported to have one uninstall.php file that is | |
52 | * executed also once, each time one plugin is uninstalled (before the DB schema is | |
53 | * deleted). Those uninstall files will contain one function, using the "Frankenstyle" | |
54 | * naming conventions, like {@link xmldb_enrol_meta_uninstall()} or {@link xmldb_workshop_uninstall()}. | |
55 | */ | |
c20ce874 | 56 | function xmldb_main_install() { |
3912cdd1 | 57 | global $CFG, $DB, $SITE, $OUTPUT; |
1caea91e | 58 | |
39b90b51 | 59 | // Make sure system context exists |
e922fe23 PS |
60 | $syscontext = context_system::instance(0, MUST_EXIST, false); |
61 | if ($syscontext->id != SYSCONTEXTID) { | |
19e7a192 | 62 | throw new moodle_exception('generalexceptionmessage', 'error', '', 'Unexpected new system context id!'); |
1caea91e | 63 | } |
64 | ||
65 | ||
39b90b51 | 66 | // Create site course |
e922fe23 PS |
67 | if ($DB->record_exists('course', array())) { |
68 | throw new moodle_exception('generalexceptionmessage', 'error', '', 'Can not create frontpage course, courses already exist.'); | |
69 | } | |
365a5941 | 70 | $newsite = new stdClass(); |
19e7a192 PS |
71 | $newsite->fullname = ''; |
72 | $newsite->shortname = ''; | |
73 | $newsite->summary = NULL; | |
74 | $newsite->newsitems = 3; | |
ba0dde97 | 75 | $newsite->numsections = 1; |
19e7a192 PS |
76 | $newsite->category = 0; |
77 | $newsite->format = 'site'; // Only for this course | |
c4dd3bb8 PS |
78 | $newsite->timecreated = time(); |
79 | $newsite->timemodified = $newsite->timecreated; | |
1caea91e | 80 | |
e922fe23 PS |
81 | if (defined('SITEID')) { |
82 | $newsite->id = SITEID; | |
83 | $DB->import_record('course', $newsite); | |
84 | $DB->get_manager()->reset_sequence('course'); | |
85 | } else { | |
86 | $newsite->id = $DB->insert_record('course', $newsite); | |
87 | define('SITEID', $newsite->id); | |
88 | } | |
b5cf83f0 MG |
89 | // set the field 'numsections'. We can not use format_site::update_format_options() because |
90 | // the file is not loaded | |
91 | $DB->insert_record('course_format_options', array('courseid' => SITEID, 'format' => 'site', | |
92 | 'sectionid' => 0, 'name' => 'numsections', 'value' => $newsite->numsections)); | |
1caea91e | 93 | $SITE = get_site(); |
e922fe23 | 94 | if ($newsite->id != $SITE->id) { |
19e7a192 | 95 | throw new moodle_exception('generalexceptionmessage', 'error', '', 'Unexpected new site course id!'); |
1caea91e | 96 | } |
e922fe23 PS |
97 | // Make sure site course context exists |
98 | context_course::instance($SITE->id); | |
74df2951 | 99 | // Update the global frontpage cache |
e922fe23 | 100 | $SITE = $DB->get_record('course', array('id'=>$newsite->id), '*', MUST_EXIST); |
1caea91e | 101 | |
102 | ||
39b90b51 | 103 | // Create default course category |
e922fe23 PS |
104 | if ($DB->record_exists('course_categories', array())) { |
105 | throw new moodle_exception('generalexceptionmessage', 'error', '', 'Can not create default course category, categories already exist.'); | |
106 | } | |
107 | $cat = new stdClass(); | |
108 | $cat->name = get_string('miscellaneous'); | |
109 | $cat->depth = 1; | |
110 | $cat->sortorder = MAX_COURSES_IN_CATEGORY; | |
111 | $cat->timemodified = time(); | |
112 | $catid = $DB->insert_record('course_categories', $cat); | |
113 | $DB->set_field('course_categories', 'path', '/'.$catid, array('id'=>$catid)); | |
114 | // Make sure category context exists | |
115 | context_coursecat::instance($catid); | |
1caea91e | 116 | |
1caea91e | 117 | |
5b8fa09b | 118 | $defaults = array( |
119 | 'rolesactive' => '0', // marks fully set up system | |
120 | 'auth' => 'email', | |
121 | 'auth_pop3mailbox' => 'INBOX', | |
df997f84 | 122 | 'enrol_plugins_enabled' => 'manual,guest,self,cohort', |
5f0baa43 | 123 | 'theme' => theme_config::DEFAULT_THEME, |
5b8fa09b | 124 | 'filter_multilang_converted' => 1, |
aa282b10 | 125 | 'siteidentifier' => random_string(32).get_host_from_url($CFG->wwwroot), |
5b8fa09b | 126 | 'backup_version' => 2008111700, |
127 | 'backup_release' => '2.0 dev', | |
5b8fa09b | 128 | 'mnet_dispatcher_mode' => 'off', |
129 | 'sessiontimeout' => 7200, // must be present during roles installation | |
130 | 'stringfilters' => '', // These two are managed in a strange way by the filters | |
131 | 'filterall' => 0, // setting page, so have to be initialised here. | |
9f07f05a | 132 | 'texteditors' => 'atto,tinymce,textarea', |
146eeb76 | 133 | 'antiviruses' => '', |
6bd5ca3d | 134 | 'upgrade_minmaxgradestepignored' => 1, // New installs should not run this upgrade step. |
156d0486 | 135 | 'upgrade_extracreditweightsstepignored' => 1, // New installs should not run this upgrade step. |
4d4dcc27 | 136 | 'upgrade_calculatedgradeitemsignored' => 1, // New installs should not run this upgrade step. |
405b90bc | 137 | 'upgrade_letterboundarycourses' => 1, // New installs should not run this upgrade step. |
5b8fa09b | 138 | ); |
1caea91e | 139 | foreach($defaults as $key => $value) { |
140 | set_config($key, $value); | |
141 | } | |
142 | ||
143 | ||
39b90b51 | 144 | // Bootstrap mnet |
365a5941 | 145 | $mnethost = new stdClass(); |
1caea91e | 146 | $mnethost->wwwroot = $CFG->wwwroot; |
147 | $mnethost->name = ''; | |
148 | $mnethost->name = ''; | |
149 | $mnethost->public_key = ''; | |
150 | ||
151 | if (empty($_SERVER['SERVER_ADDR'])) { | |
152 | // SERVER_ADDR is only returned by Apache-like webservers | |
153 | preg_match("@^(?:http[s]?://)?([A-Z0-9\-\.]+).*@i", $CFG->wwwroot, $matches); | |
154 | $my_hostname = $matches[1]; | |
155 | $my_ip = gethostbyname($my_hostname); // Returns unmodified hostname on failure. DOH! | |
156 | if ($my_ip == $my_hostname) { | |
157 | $mnethost->ip_address = 'UNKNOWN'; | |
158 | } else { | |
159 | $mnethost->ip_address = $my_ip; | |
160 | } | |
161 | } else { | |
162 | $mnethost->ip_address = $_SERVER['SERVER_ADDR']; | |
163 | } | |
164 | ||
165 | $mnetid = $DB->insert_record('mnet_host', $mnethost); | |
166 | set_config('mnet_localhost_id', $mnetid); | |
167 | ||
c20ce874 | 168 | // Initial insert of mnet applications info |
365a5941 | 169 | $mnet_app = new stdClass(); |
c20ce874 | 170 | $mnet_app->name = 'moodle'; |
171 | $mnet_app->display_name = 'Moodle'; | |
172 | $mnet_app->xmlrpc_server_url = '/mnet/xmlrpc/server.php'; | |
173 | $mnet_app->sso_land_url = '/auth/mnet/land.php'; | |
0eadebb1 | 174 | $mnet_app->sso_jump_url = '/auth/mnet/jump.php'; |
6f4f82f2 | 175 | $moodleapplicationid = $DB->insert_record('mnet_application', $mnet_app); |
c20ce874 | 176 | |
365a5941 | 177 | $mnet_app = new stdClass(); |
c20ce874 | 178 | $mnet_app->name = 'mahara'; |
179 | $mnet_app->display_name = 'Mahara'; | |
180 | $mnet_app->xmlrpc_server_url = '/api/xmlrpc/server.php'; | |
181 | $mnet_app->sso_land_url = '/auth/xmlrpc/land.php'; | |
182 | $mnet_app->sso_jump_url = '/auth/xmlrpc/jump.php'; | |
183 | $DB->insert_record('mnet_application', $mnet_app); | |
184 | ||
6f4f82f2 | 185 | // Set up the probably-to-be-removed-soon 'All hosts' record |
365a5941 | 186 | $mnetallhosts = new stdClass(); |
6f4f82f2 PS |
187 | $mnetallhosts->wwwroot = ''; |
188 | $mnetallhosts->ip_address = ''; | |
189 | $mnetallhosts->public_key = ''; | |
190 | $mnetallhosts->public_key_expires = 0; | |
191 | $mnetallhosts->last_connect_time = 0; | |
192 | $mnetallhosts->last_log_id = 0; | |
193 | $mnetallhosts->deleted = 0; | |
194 | $mnetallhosts->name = 'All Hosts'; | |
195 | $mnetallhosts->applicationid = $moodleapplicationid; | |
196 | $mnetallhosts->id = $DB->insert_record('mnet_host', $mnetallhosts, true); | |
197 | set_config('mnet_all_hosts_id', $mnetallhosts->id); | |
88582df4 | 198 | |
39b90b51 | 199 | // Create guest record - do not assign any role, guest user gets the default guest role automatically on the fly |
e922fe23 PS |
200 | if ($DB->record_exists('user', array())) { |
201 | throw new moodle_exception('generalexceptionmessage', 'error', '', 'Can not create default users, users already exist.'); | |
202 | } | |
365a5941 | 203 | $guest = new stdClass(); |
88582df4 | 204 | $guest->auth = 'manual'; |
205 | $guest->username = 'guest'; | |
206 | $guest->password = hash_internal_user_password('guest'); | |
207 | $guest->firstname = get_string('guestuser'); | |
208 | $guest->lastname = ' '; | |
209 | $guest->email = 'root@localhost'; | |
210 | $guest->description = get_string('guestuserinfo'); | |
211 | $guest->mnethostid = $CFG->mnet_localhost_id; | |
212 | $guest->confirmed = 1; | |
213 | $guest->lang = $CFG->lang; | |
214 | $guest->timemodified= time(); | |
215 | $guest->id = $DB->insert_record('user', $guest); | |
19e7a192 | 216 | if ($guest->id != 1) { |
3912cdd1 | 217 | echo $OUTPUT->notification('Unexpected id generated for the Guest account. Your database configuration or clustering setup may not be fully supported', 'notifyproblem'); |
19e7a192 PS |
218 | } |
219 | // Store guest id | |
220 | set_config('siteguest', $guest->id); | |
e922fe23 PS |
221 | // Make sure user context exists |
222 | context_user::instance($guest->id); | |
88582df4 | 223 | |
224 | ||
39b90b51 | 225 | // Now create admin user |
365a5941 | 226 | $admin = new stdClass(); |
88582df4 | 227 | $admin->auth = 'manual'; |
228 | $admin->firstname = get_string('admin'); | |
229 | $admin->lastname = get_string('user'); | |
230 | $admin->username = 'admin'; | |
231 | $admin->password = 'adminsetuppending'; | |
1deff123 | 232 | $admin->email = ''; |
88582df4 | 233 | $admin->confirmed = 1; |
234 | $admin->mnethostid = $CFG->mnet_localhost_id; | |
235 | $admin->lang = $CFG->lang; | |
236 | $admin->maildisplay = 1; | |
237 | $admin->timemodified = time(); | |
aa282b10 | 238 | $admin->lastip = CLI_SCRIPT ? '0.0.0.0' : getremoteaddr(); // installation hijacking prevention |
88582df4 | 239 | $admin->id = $DB->insert_record('user', $admin); |
3912cdd1 | 240 | |
19e7a192 | 241 | if ($admin->id != 2) { |
3912cdd1 SH |
242 | echo $OUTPUT->notification('Unexpected id generated for the Admin account. Your database configuration or clustering setup may not be fully supported', 'notifyproblem'); |
243 | } | |
244 | if ($admin->id != ($guest->id + 1)) { | |
245 | echo $OUTPUT->notification('Nonconsecutive id generated for the Admin account. Your database configuration or clustering setup may not be fully supported.', 'notifyproblem'); | |
19e7a192 | 246 | } |
3912cdd1 | 247 | |
39b90b51 | 248 | // Store list of admins |
4f0c2d00 | 249 | set_config('siteadmins', $admin->id); |
e922fe23 PS |
250 | // Make sure user context exists |
251 | context_user::instance($admin->id); | |
88582df4 | 252 | |
1caea91e | 253 | |
39b90b51 | 254 | // Install the roles system. |
ff22f229 PS |
255 | $managerrole = create_role('', 'manager', '', 'manager'); |
256 | $coursecreatorrole = create_role('', 'coursecreator', '', 'coursecreator'); | |
257 | $editteacherrole = create_role('', 'editingteacher', '', 'editingteacher'); | |
258 | $noneditteacherrole = create_role('', 'teacher', '', 'teacher'); | |
259 | $studentrole = create_role('', 'student', '', 'student'); | |
260 | $guestrole = create_role('', 'guest', '', 'guest'); | |
261 | $userrole = create_role('', 'user', '', 'user'); | |
262 | $frontpagerole = create_role('', 'frontpage', '', 'frontpage'); | |
88582df4 | 263 | |
39b90b51 | 264 | // Now is the correct moment to install capabilities - after creation of legacy roles, but before assigning of roles |
88582df4 | 265 | update_capabilities('moodle'); |
266 | ||
88582df4 | 267 | |
5e72efd4 PS |
268 | // Default allow role matrices. |
269 | foreach ($DB->get_records('role') as $role) { | |
270 | foreach (array('assign', 'override', 'switch') as $type) { | |
271 | $function = 'allow_'.$type; | |
272 | $allows = get_default_role_archetype_allows($type, $role->archetype); | |
273 | foreach ($allows as $allowid) { | |
274 | $function($role->id, $allowid); | |
275 | } | |
276 | } | |
c468795c | 277 | } |
88582df4 | 278 | |
39b90b51 | 279 | // Set up the context levels where you can assign each role. |
4f0c2d00 | 280 | set_role_contextlevels($managerrole, get_default_contextlevels('manager')); |
88582df4 | 281 | set_role_contextlevels($coursecreatorrole, get_default_contextlevels('coursecreator')); |
282 | set_role_contextlevels($editteacherrole, get_default_contextlevels('editingteacher')); | |
283 | set_role_contextlevels($noneditteacherrole, get_default_contextlevels('teacher')); | |
284 | set_role_contextlevels($studentrole, get_default_contextlevels('student')); | |
285 | set_role_contextlevels($guestrole, get_default_contextlevels('guest')); | |
286 | set_role_contextlevels($userrole, get_default_contextlevels('user')); | |
ac173d3e | 287 | |
1635da56 PS |
288 | // Init theme and JS revisions |
289 | set_config('themerev', time()); | |
290 | set_config('jsrev', time()); | |
b64b465c | 291 | |
c7289da7 | 292 | // No admin setting for this any more, GD is now required, remove in Moodle 2.6. |
8aae16fb | 293 | set_config('gdversion', 2); |
c7289da7 | 294 | |
b64b465c PS |
295 | // Install licenses |
296 | require_once($CFG->libdir . '/licenselib.php'); | |
297 | license_manager::install_licenses(); | |
03d9401e | 298 | |
e922fe23 PS |
299 | // Init profile pages defaults |
300 | if ($DB->record_exists('my_pages', array())) { | |
301 | throw new moodle_exception('generalexceptionmessage', 'error', '', 'Can not create default profile pages, records already exist.'); | |
302 | } | |
365a5941 | 303 | $mypage = new stdClass(); |
03d9401e MD |
304 | $mypage->userid = NULL; |
305 | $mypage->name = '__default'; | |
306 | $mypage->private = 0; | |
307 | $mypage->sortorder = 0; | |
e922fe23 | 308 | $DB->insert_record('my_pages', $mypage); |
03d9401e | 309 | $mypage->private = 1; |
e922fe23 | 310 | $DB->insert_record('my_pages', $mypage); |
9872f0a8 TH |
311 | |
312 | // Set a sensible default sort order for the most-used question types. | |
313 | set_config('multichoice_sortorder', 1, 'question'); | |
314 | set_config('truefalse_sortorder', 2, 'question'); | |
315 | set_config('match_sortorder', 3, 'question'); | |
316 | set_config('shortanswer_sortorder', 4, 'question'); | |
317 | set_config('numerical_sortorder', 5, 'question'); | |
318 | set_config('essay_sortorder', 6, 'question'); | |
81967b54 | 319 | |
8de0b1ab | 320 | require_once($CFG->libdir . '/db/upgradelib.php'); |
81967b54 | 321 | make_default_scale(); |
8de0b1ab | 322 | make_competence_scale(); |
117bd748 | 323 | } |