3 // This file is part of Moodle - http://moodle.org/
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
19 * This file is executed right after the install.xml
23 * @copyright 2009 Petr Skoda (http://skodak.org)
24 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27 defined('MOODLE_INTERNAL') || die();
29 function xmldb_main_install() {
30 global $CFG, $DB, $SITE, $OUTPUT;
32 /// Make sure system context exists
33 $syscontext = context_system::instance(0, MUST_EXIST, false);
34 if ($syscontext->id != SYSCONTEXTID) {
35 throw new moodle_exception('generalexceptionmessage', 'error', '', 'Unexpected new system context id!');
39 /// Create site course
40 if ($DB->record_exists('course', array())) {
41 throw new moodle_exception('generalexceptionmessage', 'error', '', 'Can not create frontpage course, courses already exist.');
43 $newsite = new stdClass();
44 $newsite->fullname = '';
45 $newsite->shortname = '';
46 $newsite->summary = NULL;
47 $newsite->newsitems = 3;
48 $newsite->numsections = 0;
49 $newsite->category = 0;
50 $newsite->format = 'site'; // Only for this course
51 $newsite->timecreated = time();
52 $newsite->timemodified = $newsite->timecreated;
54 if (defined('SITEID')) {
55 $newsite->id = SITEID;
56 $DB->import_record('course', $newsite);
57 $DB->get_manager()->reset_sequence('course');
59 $newsite->id = $DB->insert_record('course', $newsite);
60 define('SITEID', $newsite->id);
63 if ($newsite->id != $SITE->id) {
64 throw new moodle_exception('generalexceptionmessage', 'error', '', 'Unexpected new site course id!');
66 // Make sure site course context exists
67 context_course::instance($SITE->id);
68 // Update the global frontpage cache
69 $SITE = $DB->get_record('course', array('id'=>$newsite->id), '*', MUST_EXIST);
72 /// Create default course category
73 if ($DB->record_exists('course_categories', array())) {
74 throw new moodle_exception('generalexceptionmessage', 'error', '', 'Can not create default course category, categories already exist.');
76 $cat = new stdClass();
77 $cat->name = get_string('miscellaneous');
79 $cat->sortorder = MAX_COURSES_IN_CATEGORY;
80 $cat->timemodified = time();
81 $catid = $DB->insert_record('course_categories', $cat);
82 $DB->set_field('course_categories', 'path', '/'.$catid, array('id'=>$catid));
83 // Make sure category context exists
84 context_coursecat::instance($catid);
88 'rolesactive' => '0', // marks fully set up system
90 'auth_pop3mailbox' => 'INBOX',
91 'enrol_plugins_enabled' => 'manual,guest,self,cohort',
92 'theme' => theme_config::DEFAULT_THEME,
93 'filter_multilang_converted' => 1,
94 'siteidentifier' => random_string(32).get_host_from_url($CFG->wwwroot),
95 'backup_version' => 2008111700,
96 'backup_release' => '2.0 dev',
97 'mnet_dispatcher_mode' => 'off',
98 'sessiontimeout' => 7200, // must be present during roles installation
99 'stringfilters' => '', // These two are managed in a strange way by the filters
100 'filterall' => 0, // setting page, so have to be initialised here.
101 'texteditors' => 'tinymce,textarea',
103 foreach($defaults as $key => $value) {
104 set_config($key, $value);
109 $mnethost = new stdClass();
110 $mnethost->wwwroot = $CFG->wwwroot;
111 $mnethost->name = '';
112 $mnethost->name = '';
113 $mnethost->public_key = '';
115 if (empty($_SERVER['SERVER_ADDR'])) {
116 // SERVER_ADDR is only returned by Apache-like webservers
117 preg_match("@^(?:http[s]?://)?([A-Z0-9\-\.]+).*@i", $CFG->wwwroot, $matches);
118 $my_hostname = $matches[1];
119 $my_ip = gethostbyname($my_hostname); // Returns unmodified hostname on failure. DOH!
120 if ($my_ip == $my_hostname) {
121 $mnethost->ip_address = 'UNKNOWN';
123 $mnethost->ip_address = $my_ip;
126 $mnethost->ip_address = $_SERVER['SERVER_ADDR'];
129 $mnetid = $DB->insert_record('mnet_host', $mnethost);
130 set_config('mnet_localhost_id', $mnetid);
132 // Initial insert of mnet applications info
133 $mnet_app = new stdClass();
134 $mnet_app->name = 'moodle';
135 $mnet_app->display_name = 'Moodle';
136 $mnet_app->xmlrpc_server_url = '/mnet/xmlrpc/server.php';
137 $mnet_app->sso_land_url = '/auth/mnet/land.php';
138 $mnet_app->sso_jump_url = '/auth/mnet/jump.php';
139 $moodleapplicationid = $DB->insert_record('mnet_application', $mnet_app);
141 $mnet_app = new stdClass();
142 $mnet_app->name = 'mahara';
143 $mnet_app->display_name = 'Mahara';
144 $mnet_app->xmlrpc_server_url = '/api/xmlrpc/server.php';
145 $mnet_app->sso_land_url = '/auth/xmlrpc/land.php';
146 $mnet_app->sso_jump_url = '/auth/xmlrpc/jump.php';
147 $DB->insert_record('mnet_application', $mnet_app);
149 // Set up the probably-to-be-removed-soon 'All hosts' record
150 $mnetallhosts = new stdClass();
151 $mnetallhosts->wwwroot = '';
152 $mnetallhosts->ip_address = '';
153 $mnetallhosts->public_key = '';
154 $mnetallhosts->public_key_expires = 0;
155 $mnetallhosts->last_connect_time = 0;
156 $mnetallhosts->last_log_id = 0;
157 $mnetallhosts->deleted = 0;
158 $mnetallhosts->name = 'All Hosts';
159 $mnetallhosts->applicationid = $moodleapplicationid;
160 $mnetallhosts->id = $DB->insert_record('mnet_host', $mnetallhosts, true);
161 set_config('mnet_all_hosts_id', $mnetallhosts->id);
163 /// Create guest record - do not assign any role, guest user gets the default guest role automatically on the fly
164 if ($DB->record_exists('user', array())) {
165 throw new moodle_exception('generalexceptionmessage', 'error', '', 'Can not create default users, users already exist.');
167 $guest = new stdClass();
168 $guest->auth = 'manual';
169 $guest->username = 'guest';
170 $guest->password = hash_internal_user_password('guest');
171 $guest->firstname = get_string('guestuser');
172 $guest->lastname = ' ';
173 $guest->email = 'root@localhost';
174 $guest->description = get_string('guestuserinfo');
175 $guest->mnethostid = $CFG->mnet_localhost_id;
176 $guest->confirmed = 1;
177 $guest->lang = $CFG->lang;
178 $guest->timemodified= time();
179 $guest->id = $DB->insert_record('user', $guest);
180 if ($guest->id != 1) {
181 echo $OUTPUT->notification('Unexpected id generated for the Guest account. Your database configuration or clustering setup may not be fully supported', 'notifyproblem');
184 set_config('siteguest', $guest->id);
185 // Make sure user context exists
186 context_user::instance($guest->id);
189 /// Now create admin user
190 $admin = new stdClass();
191 $admin->auth = 'manual';
192 $admin->firstname = get_string('admin');
193 $admin->lastname = get_string('user');
194 $admin->username = 'admin';
195 $admin->password = 'adminsetuppending';
197 $admin->confirmed = 1;
198 $admin->mnethostid = $CFG->mnet_localhost_id;
199 $admin->lang = $CFG->lang;
200 $admin->maildisplay = 1;
201 $admin->timemodified = time();
202 $admin->lastip = CLI_SCRIPT ? '0.0.0.0' : getremoteaddr(); // installation hijacking prevention
203 $admin->id = $DB->insert_record('user', $admin);
205 if ($admin->id != 2) {
206 echo $OUTPUT->notification('Unexpected id generated for the Admin account. Your database configuration or clustering setup may not be fully supported', 'notifyproblem');
208 if ($admin->id != ($guest->id + 1)) {
209 echo $OUTPUT->notification('Nonconsecutive id generated for the Admin account. Your database configuration or clustering setup may not be fully supported.', 'notifyproblem');
212 /// Store list of admins
213 set_config('siteadmins', $admin->id);
214 // Make sure user context exists
215 context_user::instance($admin->id);
218 /// Install the roles system.
219 $managerrole = create_role(get_string('manager', 'role'), 'manager', get_string('managerdescription', 'role'), 'manager');
220 $coursecreatorrole = create_role(get_string('coursecreators'), 'coursecreator', get_string('coursecreatorsdescription'), 'coursecreator');
221 $editteacherrole = create_role(get_string('defaultcourseteacher'), 'editingteacher', get_string('defaultcourseteacherdescription'), 'editingteacher');
222 $noneditteacherrole = create_role(get_string('noneditingteacher'), 'teacher', get_string('noneditingteacherdescription'), 'teacher');
223 $studentrole = create_role(get_string('defaultcoursestudent'), 'student', get_string('defaultcoursestudentdescription'), 'student');
224 $guestrole = create_role(get_string('guest'), 'guest', get_string('guestdescription'), 'guest');
225 $userrole = create_role(get_string('authenticateduser'), 'user', get_string('authenticateduserdescription'), 'user');
226 $frontpagerole = create_role(get_string('frontpageuser', 'role'), 'frontpage', get_string('frontpageuserdescription', 'role'), 'frontpage');
228 /// Now is the correct moment to install capabilities - after creation of legacy roles, but before assigning of roles
229 update_capabilities('moodle');
231 /// Default allow assign
232 $defaultallowassigns = array(
233 array($managerrole, $managerrole),
234 array($managerrole, $coursecreatorrole),
235 array($managerrole, $editteacherrole),
236 array($managerrole, $noneditteacherrole),
237 array($managerrole, $studentrole),
239 array($editteacherrole, $noneditteacherrole),
240 array($editteacherrole, $studentrole),
242 foreach ($defaultallowassigns as $allow) {
243 list($fromroleid, $toroleid) = $allow;
244 allow_assign($fromroleid, $toroleid);
247 /// Default allow override
248 $defaultallowoverrides = array(
249 array($managerrole, $managerrole),
250 array($managerrole, $coursecreatorrole),
251 array($managerrole, $editteacherrole),
252 array($managerrole, $noneditteacherrole),
253 array($managerrole, $studentrole),
254 array($managerrole, $guestrole),
255 array($managerrole, $userrole),
256 array($managerrole, $frontpagerole),
258 array($editteacherrole, $noneditteacherrole),
259 array($editteacherrole, $studentrole),
260 array($editteacherrole, $guestrole),
262 foreach ($defaultallowoverrides as $allow) {
263 list($fromroleid, $toroleid) = $allow;
264 allow_override($fromroleid, $toroleid); // There is a rant about this in MDL-15841.
267 /// Default allow switch.
268 $defaultallowswitch = array(
269 array($managerrole, $editteacherrole),
270 array($managerrole, $noneditteacherrole),
271 array($managerrole, $studentrole),
272 array($managerrole, $guestrole),
274 array($editteacherrole, $noneditteacherrole),
275 array($editteacherrole, $studentrole),
276 array($editteacherrole, $guestrole),
278 array($noneditteacherrole, $studentrole),
279 array($noneditteacherrole, $guestrole),
281 foreach ($defaultallowswitch as $allow) {
282 list($fromroleid, $toroleid) = $allow;
283 allow_switch($fromroleid, $toroleid);
286 /// Set up the context levels where you can assign each role.
287 set_role_contextlevels($managerrole, get_default_contextlevels('manager'));
288 set_role_contextlevels($coursecreatorrole, get_default_contextlevels('coursecreator'));
289 set_role_contextlevels($editteacherrole, get_default_contextlevels('editingteacher'));
290 set_role_contextlevels($noneditteacherrole, get_default_contextlevels('teacher'));
291 set_role_contextlevels($studentrole, get_default_contextlevels('student'));
292 set_role_contextlevels($guestrole, get_default_contextlevels('guest'));
293 set_role_contextlevels($userrole, get_default_contextlevels('user'));
296 set_config('themerev', 1);
299 require_once($CFG->libdir . '/licenselib.php');
300 license_manager::install_licenses();
302 // Init profile pages defaults
303 if ($DB->record_exists('my_pages', array())) {
304 throw new moodle_exception('generalexceptionmessage', 'error', '', 'Can not create default profile pages, records already exist.');
306 $mypage = new stdClass();
307 $mypage->userid = NULL;
308 $mypage->name = '__default';
309 $mypage->private = 0;
310 $mypage->sortorder = 0;
311 $DB->insert_record('my_pages', $mypage);
312 $mypage->private = 1;
313 $DB->insert_record('my_pages', $mypage);