diff options
author | chris <chris@jalakai.co.uk> | 2006-07-24 20:54:04 +0200 |
---|---|---|
committer | chris <chris@jalakai.co.uk> | 2006-07-24 20:54:04 +0200 |
commit | 5cfb88156f790ba8677badc88863a85569149942 (patch) | |
tree | ae3bf378346b8bb6841b6a90a90c20873582a395 | |
parent | 11ea018f9b6b30192b2a8c08a85265bdf9d3ce21 (diff) | |
download | rpg-5cfb88156f790ba8677badc88863a85569149942.tar.gz rpg-5cfb88156f790ba8677badc88863a85569149942.tar.bz2 |
installation script
This installation script doesn't so much install DokuWiki as configure
a brand new DokuWiki installation for first use by:
- setting the Wiki name
- turning on ACL
- creating the super user
- creating the changes.log file
darcs-hash:20060724185404-9b6ab-5b9dd6d0231db6522388a860b72da608c21df691.gz
-rw-r--r-- | install.php | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/install.php b/install.php new file mode 100644 index 000000000..6f9e5823a --- /dev/null +++ b/install.php @@ -0,0 +1,410 @@ +<?php +/** + * Dokuwiki installation assistance + * + * @author Chris Smith <chris@jalakai.co.uk> + */ + +if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__)).'/'); +if(!defined('DOKU_CONF')) define('DOKU_CONF',DOKU_INC.'conf/'); +if(!defined('DOKU_LOCAL')) define('DOKU_LOCAL',DOKU_INC.'conf/'); + +if(!defined('DEBUG')) define('DEBUG', false); + +// ------------------------------------------------------------------------------------ +// important settings ... +// installation dependent local config file list +$config_files = array( + 'local' => DOKU_LOCAL.'local.php', + 'users' => DOKU_LOCAL.'users.auth.php', + 'auth' => DOKU_LOCAL.'acl.auth.php' +); + +// other installation dir/file permission requirements +$install_permissions = array( + 'data' => 'data', + 'pages' => 'data/pages', + 'attic' => 'data/attic', + 'media' => 'data/media', + 'meta' => 'data/meta', + 'cache' => 'data/cache', + 'locks' => 'data/locks', + 'changelog' => 'data/changes.log' +); + +// array use to verify unchanged dokuwiki.php files, 'version' => 'md5 hash' +$dokuwiki_php = DOKU_CONF.'dokuwiki.php'; +$dokuwiki_hash = array( + '2005-09-22' => 'e33223e957b0b0a130d0520db08f8fb7', + '2006-03-05' => '51295727f79ab9af309a2fd9e0b61acc', + '2006-03-09' => '51295727f79ab9af309a2fd9e0b61acc', +); + +// language strings + +// ------------------------------------------------------------------------------------ +// initialise variables ... + +$msg = array(); +$error = array(); +$debug = array(); +$process_form = false; + +// form variables with default values +$title = ""; +$location = true; +$data = "./data"; +$changeslog = true; +$acl = true; +$superuser = ""; +$fullname = ""; +$email = ""; + +// check for dokuwiki +// (for now assume included with Dokuwiki install & resident in dokuwiki root folder) + +// ------------------------------------------------------------------------------------ +// check for virgin dokuwiki installation +$virgin_install = true; + + // $config_files mustn't exist + foreach ($config_files as $file) { + if (@file_exists($file)) { + $virgin_install = false; + $file = str_replace($_SERVER['DOCUMENT_ROOT'],'{DOCUMENT_ROOT}', $file); + $msg[] = "<span class=\"file\">$file</span> exists"; } + } + + // main dokuwiki config file (conf/dokuwiki.php) must not have been modified + $installation_hash = md5(@file_get_contents($dokuwiki_php)); + if (!in_array($installation_hash, $dokuwiki_hash)) { + $virgin_install = false; + $msg[] = "unrecognised or modified dokuwiki.php -- hash=$installation_hash"; + } +// ------------------------------------------------------------------------------------ +// check for other basic installation & configuration details (to be nice) + +$changeslog_exists = @file_exists(DOKU_INC.'data/changes.log'); + +if (!is_writable(DOKU_CONF)) { + $file = str_replace($_SERVER['DOCUMENT_ROOT'],'{DOCUMENT_ROOT}', DOKU_CONF); + $error[] = "<span class=\"file\">$file</span> must be writable by the web server."; +} + +//------------------------------------------------------------------------------------- +// utility functions + +/** + * remove magic quotes recursivly + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +function remove_magic_quotes(&$array) { + foreach (array_keys($array) as $key) { + if (is_array($array[$key])) { + remove_magic_quotes($array[$key]); + }else { + $array[$key] = stripslashes($array[$key]); + } + } +} + +function cleanText($var, $default, $regex, $msg) { + global $error; + + $value = isset($_REQUEST[$var]) ? $_REQUEST[$var] : $default; + + if ($regex) { + if (!preg_match($regex, $value)) { + $error[] = "$var - illegal/unrecognised value"; + } + } + return $value; +} + +function fileWrite($name, $filename, $data) { + global $error; + + if (($fp = @fopen($filename, 'wb')) === false) { + $filename = str_replace($_SERVER['DOCUMENT_ROOT'],'{DOCUMENT_ROOT}', $filename); + $error[] = "Unable to create $name (<span class=\"file\">$filename</span>). You will need to check directory/file permissions and create the file manually."; + return false; + } + + if (!empty($data)) { fwrite($fp, $data); } + fclose($fp); + return true; +} + +// ------------------------------------------------------------------------------------ +// form processing ... +if (isset($_REQUEST['submit'])) { + if (!$virgin_install) { + $msg[] = "unable to apply updates, installation already modified"; + + } else { + // apply updates per form instructions + $process_form = true; + + if (get_magic_quotes_gpc()) { + if (!empty($_REQUEST)) remove_magic_quotes($_REQUEST); + } + + $title = cleanText('title', '', ''); + $location = isset($_REQUEST['location']); + $data = cleanText('data', '', ''); + $changeslog = isset($_REQUEST['changeslog']); + $acl = isset($_REQUEST['acl']); + $superuser = cleanText('superuser','','/\S+/', ); + $password = cleanText('password','','/\S+/'); + $confirm = cleanText('confirm','','/^'.preg_quote($password,'/').'$/'); + $fullname = cleanText('fullname','',''); + $email = cleanText('email','',''); + + $debug = compact('title','location','data','changeslog','acl','superuser','password','confirm'); + + if (empty($error)) { + // all incoming data is ok ... lets do ... + // create changes.log + if (!$changeslog_exists) { + $filename = realpath((empty($data) || ($data{0} != "/")) ? DOKU_INC.$data : $data).'/changes.log'; + fileWrite('changeslog',$filename, ''); + } + + // create local.php + $output = ""; + if (!empty($title)) $output .= '$conf[\'title\'] = \''.addslashes($title)."';\n"; + if (!empty($data)) $output .= '$conf[\'data\'] = \''.$data."';\n"; + if ($acl) $output .= '$conf[\'useacl\'] = 1'.";\n"; + if (!empty($superuser)) $output .= '$conf[\'superuser\'] = \''.$superuser."';\n"; + + if (!empty($output)) { + $output = '<'.'?php +/* + * Dokuwiki\'s Main Configuration File - Local Settings + * Auto-generated by install script + * Date: '.date('r').' + */'."\n".$output; + fileWrite('local configuration settings file',DOKU_LOCAL.'local.php',$output); + } + + if ($acl) { + // create users.auth.php + // --- user:MD5password:Real Name:email:groups,comma,seperated + $output = (!empty($superuser)) ? join(":",array($superuser, md5($password), $fullname, $email, 'users')) : ""; + $output = @file_get_contents(DOKU_CONF.'users.auth.php.dist')."\n$output\n"; + + fileWrite('acl user file', DOKU_LOCAL.'users.auth.php', $output); + + // create acl.auth.php + $output = @file_get_contents(DOKU_CONF.'acl.auth.php.dist'); + fileWrite('acl authorisations file', DOKU_LOCAL.'acl.auth.php', $output); + } + } + } +} +//------------------------------------------------------------------------------------- + +$show_form = !$process_form && $virgin_install && empty($error); + +?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" > +<head> +<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" /> +<title>Dokuwiki Installer</title> +<style type="text/css"> +<!--/*--><![CDATA[/*><!--*/ + +html {margin: 0; padding: 0;} +body { + width: 90%; + margin: 0 auto; + font: 84% Verdana, Helvetica, Arial, sans-serif; +} + +a { + white-space: nowrap; +} + +img { + border: none; +} + +.abbr { + border-bottom: 2px dotted #444; +} + +.alert .file { + color: #a03333; +} + +.error .file { + color: #c33; +} + +h1 img { + vertical-align: middle; +} + +form, fieldset { + margin: 1em 0; + padding: 0; + border: none; + width: 100%; +} + +ul { + font-size: 80%; +} + +form .field { + margin: 0.5em 0; +} + +label { + display: block; +} + +label span { + display: block; +} + +label input.text { + width: 95%; +} + +#instructions { + float: right; + width: 34%; +} + +#details { + float: left; + width: 58%; +} + +#process { + margin: 1.5em 0; +} + +#debug, #footer { + clear: both; +} + +#acl, #files { + border: 1px solid #ccc; + padding: 0.5em 0 1em 0; +} + +fieldset.dependent { + margin-left: 2em; +} + + +/*]]>*/--> +</style> +<script type="text/javascript"> +<!--//--><![CDATA[//><!-- + + +//--><!]]> +</script> +</head> +<body> +<h1><img src="http://wiki.splitbrain.org/_media/wiki:dokuwiki-64.png" alt="" />Dokuwiki Installer</h1> +<div id="instructions"> + <p>This page assists in the installation and configuration of <a href="http://wiki.splitbrain.org">Dokuwiki</a>.</p> + <p>Dokuwiki uses ordinary files for the storage of wiki pages and other information associated with those pages + (e.g. images, search indexes, old revisions, etc). In order to operate successfully Dokuwiki <strong>must</strong> + have write access to the directories that hold those files. This installer is not capable of setting up directory + permissions, that normally needs to be done directly or if you are using hosting, through your hosting + control panel (e.g. cPanel).</p> + <p>This installer will setup your Dokuwiki configuration for <span class="abbr" title="access control list">ACL</span>, + which in turn allows administrator login and access to Dokuwiki's admin menu for installing plugins, managing + users, managing access to wiki pages and alteration of configuration settings. It isn't required for Dokuwiki to + operate, however it will make Dokuwiki easier to administer.</p> + <p>Use these links for details concerning <a href="http://wiki.splitbrain.org/wiki:installation">installation instructions</a> + and <a href="http://wiki.splitbrain.org/wiki:configuration">configuration settings</a>.</p> +</div> +<div id="details"> +<?php if (!$virgin_install) { ?> + <p>Modified installation detected.</p> + <ul class="alert"> +<?php foreach ($msg as $text) { ?> + <li><?php echo $text?></li> +<?php } ?> + </ul> + <p>For security reasons this script will only work with a new & unmodified Dokuwiki installation. + You should either re-extract the files from the downloaded package or consult the complete + <a href="http://wiki.splitbrain.org/wiki:install">Dokuwiki installation instructions</a></p> +<?php } /* end if (!virgin_install) */ ?> +<?php if (!$process_form && !empty($error)) { ?> + <p>One or more incorrect directory/file permissions were found.</p> + <ul class="error"> +<?php foreach ($error as $text) { ?> + <li><?php echo $text ?></li> +<?php } ?> + </ul> + <p>In order to complete this installation the above directories and files need to have their + permissions altered as indicated. Please correct the above problems before trying again.</p> +<?php } /* end if (!$process_form && !empty($error)) */ ?> +<?php if ($process_form) { ?> +<?php if (empty($error)) { ?> + <p>Configuration updated successfully.</p> + <p>Now that your initial dokuwiki configuration has been set you should delete this file to prevent its further use + which may damage your dokuwiki installation and/or configuration.</p> + <p>Use this link to visit your new <a href="doku.php" title="my new dokuWiki">wiki</a></p> +<?php } else { ?> + <p>The following errors were encountered ... </p> + <ul class="error"> +<?php foreach ($error as $text) { ?> + <li><?php echo $text?></li> +<?php } ?> + </ul> + <p>return to <a href="install.php">installation form</a></p> +<?php } ?> +<?php } ?> +<?php if ($show_form) { ?> + <form action="" method="post"> + <fieldset id="wiki"> + <div class="field"><label><span> Wiki Name </span><input class="text" type="text" name="title" value="<?php echo $title ?>" /></label></div> + <fieldset id="acl"> + <div class="field"><label><input class="checkbox" type="checkbox" name="acl" <?php echo(($acl ? 'checked="checked"' : ''));?> /> Enable ACL </label></div> + <fieldset class="dependent"> + <div class="field"><label><span> Superuser </span><input class="text" type="text" name="superuser" value="<?php echo $superuser ?>" /></label></div> + <div class="field"><label><span> Full name </span><input class="text" type="text" name="fullname" value="<?php echo $fullname ?>" /></label></div> + <div class="field"><label><span> Email Address </span><input class="text" type="text" name="email" value="<?php echo $email ?>" /></label></div> + <div class="field"><label><span> Superuser password </span><input class="text" type="password" name="password" /></label></div> + <div class="field"><label><span> Confirm password </span><input class="text" type="password" name="confirm" /></label></div> + </fieldset> + </fieldset> + <fieldset id="files"> + <div class="field"><label><input class="checkbox" type="checkbox" name="location" <?php echo(($location ? 'checked="checked"' : ''));?> />Use default wiki location</label></div> + <fieldset class="dependent"> + <div class="field"><label><span> Wiki Location </span><input class="text" type="text" name="data" value="<?php echo $data ?>" /></label></div> + </fieldset> + </fieldset> +<?php if (!$changeslog_exists) { ?> + <div class="field"><label><input class="checkbox" type="checkbox" name="changeslog" <?php echo(($changeslog ? 'checked="checked"' : ''));?> />Create changes.log file</label></div> +<?php } ?> + </fieldset> + <fieldset id="process"> + <input class="button" type="submit" name="submit" value="Process Configuration Changes" /> + </fieldset> + </form> +<?php } ?> +</div><!-- #details --> +<?php if (DEBUG) { ?> +<div id="debug"> + <pre> + <?php print_r($_REQUEST); print_r($debug); print_r($error); ?> + </pre> +</div> +<?php } ?> +<div id="footer"> + <a href="http://wiki.splitbrain.org"><img src="lib/tpl/default/images/button-dw.png" alt="powered by dokuwiki" /></a> + <a href="http://www.php.net"><img src="lib/tpl/default/images/button-php.gif" alt="powered by php" /></a> +</div> +</body> +</html>
\ No newline at end of file |