Eine Installation auf einem Server kann etwas schwierig werden, wenn man keinen Shell-Zugang hat.
Die Alternative die TYPO3-Archive vor dem FTP-Upload auszupacken ist zwar möglich aber recht (zeit)aufwändig.
Meist besteht aber die Möglichkeit innerhalb einer PHP-Datei Betriebssystem-Kommandos auszuführen. Daher bin ich auf folgende PHP-Datei für einen UNIX-Server gekommen:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <title>expand TYPO3</title> <style type="text/css"> <!-- /* ... Hier werden die Formate definiert ... */ .navi { border:1px solid #333; position:fixed; bottom:0px; right:0px; background-color:#ddd; width:325px; font-family:sans-serif; padding:5px;} .navi .version-div { font-size:12px; } .navi .button { float:right; } .navi table { border-collapse:collapse; } .navi td { text-align:left; border:1px solid #ffffff; font-size:10px; padding-left:22px; text-indent:-22px; } .navi td input { vertical-align: text-bottom; } .alert { background-color:orange; } #countdown { float:right;} form { margin:0; } --> </style> <script type="text/javascript"> function countdown() { var countdowndiv = document.getElementById('countdown'); var restzeit = parseInt(countdowndiv.firstChild.data); if (0 < restzeit) { restzeit--; if (restzeit == 30) { var navidiv = document.getElementById('navi'); navidiv.className = 'navi alert'; } countdowndiv.firstChild.data = ' '+restzeit; window.setTimeout('countdown()',1000); } else { alert('['+restzeit+']') } } window.setTimeout('countdown()',1000); </script> </head> <body> <?PHP define('NL',"\n"); define('VERSIONCACHE', 'version.info'); define('ACCESS_FILE', 'ACCESS'); define('ACCESS_TIME', 600); $content = ''; global $nextaction; global $text; global $versioninfo; function do_exec($s) { echo '<span style="border:1px solid #cccccc">'.$s.'</span><br /><pre>'; $output=shell_exec($s.' 2>&1;echo exitvalue=$?'); //$output=shell_exec($s.';echo exitvalue=$?'); $exitvaluepos = strpos($output,'exitvalue='); $exitvalue = intval(substr($output,$exitvaluepos+10)); echo str_replace(array('<','>'),array('<','>'),$output); echo '</pre><hr />'; return $exitvalue; } function err_msg($s) { return '<span style="color:white; background-color:red;">'.$s.'</span><br />'; } function show_option($i,$s) { global $nextaction; return '<option value="'.$i.'"'.($i==$nextaction?' selected="selected"':'').'>'.$s.'</option>'; } function checkAccess() { $retval = false; $directory = scandir('.'); //echo '<h2>dir:</h2><pre>'.print_r($directory,true).'</pre>'; if (count($directory) < 4) { $filewritten = file_put_contents(ACCESS_FILE,time()); $retval = true; } else { $accessStat = stat(ACCESS_FILE); if (time() < $accessStat['mtime']+ACCESS_TIME) { $filewritten = file_put_contents(ACCESS_FILE,time()); $retval = true; } else { //echo '<pre>'.print_r(array('filestat'=>$accessStat,'now'=>time(),'chk'=>$accessStat['mtime']+ACCESS_TIME),true).'</pre>'; } } if ($filewritten === FALSE) { echo '<div class="alert">Access file '.ACCESS_FILE.' could not been written!</div>'; } return $retval; } define('ACTION_TEST' ,0); define('ACTION_GETPACKAGE' ,1); define('ACTION_MD5PACKAGE' ,2); define('ACTION_EXTRACTPACKAGE' ,3); define('ACTION_MOVEPACKAGEUP' ,4); define('ACTION_LINKSOURCE' ,10); define('ACTION_LINKSOURCEUP' ,11); define('ACTION_REMOVE_TEMPFILES' ,20); define('ACTION_CHMOD' ,21); define('ACTION_INIT' ,22); define('ACTION_COPY_INDEXPHP' ,23); define('ACTION_ENABLEINSTALLTOOL' ,30); define('ACTION_REMOVE_PACKAGE' ,40); define('ACTION_REMOVE_ACCESS' ,41); define('ACTION_LS' ,100); define('ACTION_INFO' ,101); define('ACTION_VERSIONINFO' ,102); $text[ACTION_TEST] = 'test for writing'; $text[ACTION_GETPACKAGE] = 'get selected package'; $text[ACTION_MD5PACKAGE] = 'check MD5-Hash'; $text[ACTION_EXTRACTPACKAGE] = 'extrakt selected package'; $text[ACTION_MOVEPACKAGEUP] = 'move selected package into parentdir'; $text[ACTION_LINKSOURCE] = 'build new link to source'; $text[ACTION_LINKSOURCEUP] = 'build new link to source in parentdir'; $text[ACTION_REMOVE_TEMPFILES] = 'remove ConfigurationCaches'; $text[ACTION_CHMOD] = 'change file/dir-attributes to group-writable'; $text[ACTION_INIT] = 'init some values'; $text[ACTION_COPY_INDEXPHP] = 'copy index.php'; $text[ACTION_ENABLEINSTALLTOOL] = 'enable install-tool'; $text[ACTION_REMOVE_PACKAGE] = 'remove this package'; $text[ACTION_REMOVE_ACCESS] = 'remove Acess file'; $text[ACTION_LS] = 'ls -al'; $text[ACTION_INFO] = 'phpinfo'; $text[ACTION_VERSIONINFO] = 'get available TYPO3 versions'; function show_radio($grpname,$i) { global $nextaction; global $text; $s = $text[$i]; return '<label><input type="radio" name="'.$grpname.'" id='.$grpname.'_'.$i.'" value="'.$i.'"'.($i==$nextaction?' checked="checked"':'').' />'.$s.'</label>'; } function get_version_infos() { global $versioninfo; if (!file_exists(VERSIONCACHE) || filemtime(VERSIONCACHE) < time()-60*60) { $json = file_get_contents('http://get.typo3.org/json'); file_put_contents(VERSIONCACHE,$json); } else { $json = file_get_contents(VERSIONCACHE); } $versioninfo = json_decode($json,true); } function make_version_select($version) { global $versioninfo; if ($versioninfo) { $retval = '<select name="version">'.PHP_EOL; if (!$version) { $version = $versioninfo['latest_stable']; } foreach ($versioninfo as $key => $value) { if (is_array($value)) { $retval .= ' <optgroup label="'.$key.'">'.PHP_EOL; foreach ($value['releases'] as $subversion => $subvalues) { if (is_array($subvalues)) { $retval .= ' <option value="'.$subversion.'"'.($subversion==$version?' selected="selected"':'').'>'.$subversion.' ('.$subvalues['type'].')</option>'.PHP_EOL; } } $retval .= ' </optgroup>'.PHP_EOL; } else { // latest_... } } $retval .= '</select>'.PHP_EOL; } else { // no versionsinfos available: make a normal input-field: $retval = '<input name="version" value="'.$version.'" />'; } return $retval; } function make_package_select($version,$package) { // global $versioninfo; // $packageinfo = $versioninfo[substr($version,0,3)]['releases'][$version]; // if ($versioninfo) { $retval = '<select name="package">'.PHP_EOL; $retval .= ' <option value=""></option>'.PHP_EOL; $retval .= ' <option value="typo3_src"' .($package=='typo3_src' ?' selected="selected"':'').'>Source</option>'.PHP_EOL; $retval .= ' <option value="blankpackage"' .($package=='blankpackage' ?' selected="selected"':'').'>Blank Package</option>'.PHP_EOL; $retval .= ' <option value="dummy"' .($package=='dummy' ?' selected="selected"':'').'>Dummy</option>'.PHP_EOL; $retval .= ' <option value="introductionpackage"'.($package=='introductionpackage'?' selected="selected"':'').'>Introduction Package</option>'.PHP_EOL; $retval .= ' <option value="governmentpackage"' .($package=='governmentpackage' ?' selected="selected"':'').'>Government Package</option>'.PHP_EOL; $retval .= '</select>'.PHP_EOL; // } else { // $retval = 'please select a version first'.PHP_EOL; // } return $retval; } function get_package($version,$package) { if ($version && $package) { $fileExt = '.tar.gz'; $filename = $package.'-'.$version.$fileExt; if (!file_exists($filename)) { $retval = do_exec('wget http://prdownloads.sourceforge.net/typo3/'.$filename); if ($retval == 8) { $retval = do_exec('wget http://dl1.typo3.org/TYPO3_'.$version.'/'.$filename); if ($retval == 8 && $package=='typo3_src') { $retval = do_exec('wget http://get.typo3.org/'.$version.' -O '.$filename); } } } else { $retval .= $filename.' already available<br>'.NL; } } return $retval; } function showNavigation($current,$version,$package) { $retval = '<div class="navi" id="navi">'.NL .'<form method="POST">'.NL .'<div class="button"><input type="submit" value=" execute "/></div>'.NL .'<div class="version-div"><label for="version">Version: </label>'.make_version_select($version).'</div>'.NL .'<div id="countdown">'.ACCESS_TIME.'</div>'.NL .'<div class="version-div"><label for="package">Package: </label>'.make_package_select($version,$package).'</div>'.NL .'<table class="radioboxes">'.NL .'<tr>' .'<td>'.show_radio('rad',ACTION_GETPACKAGE).'</td>' .'<td>'.show_radio('rad',ACTION_MD5PACKAGE).'</td>' .'</tr>'.NL.'<tr>' .'<td>'.show_radio('rad',ACTION_EXTRACTPACKAGE).'</td>' .'<td>'.show_radio('rad',ACTION_MOVEPACKAGEUP).'</td>' .'</tr>'.NL.'<tr>' .'<td>'.show_radio('rad',ACTION_LINKSOURCE).'</td>' .'<td>'.show_radio('rad',ACTION_LINKSOURCEUP).'</td>' .'</tr>'.NL.'<tr>' .'<td>'.show_radio('rad',ACTION_REMOVE_TEMPFILES).'</td>' .'<td>'.'</td>' .'</tr>'.NL.'<tr>' .'<td>'.show_radio('rad',ACTION_CHMOD).'</td>' .'<td>'.show_radio('rad',ACTION_INIT).'</td>' .'</tr>'.NL.'<tr>' .'<td>'.show_radio('rad',ACTION_ENABLEINSTALLTOOL).'</td>' .'<td>'.show_radio('rad',ACTION_COPY_INDEXPHP).'</td>' .'</tr>'.NL.'<tr>' .'<td>'.show_radio('rad',ACTION_REMOVE_PACKAGE).'</td>' .'<td>'.show_radio('rad',ACTION_REMOVE_ACCESS).'</td>' .'</tr>'.NL.'<tr>' .'<td>'.show_radio('rad',ACTION_VERSIONINFO).'</td>' .'<td>'.show_radio('rad',ACTION_INFO).'</td>' .'</tr>'.NL.'<tr>' .'<td>'.show_radio('rad',ACTION_LS).'</td>' .'<td>'.show_radio('rad',ACTION_TEST).'</td>' .'</tr>'.NL.'</table>'.NL . '</form>'.NL . '</div>'.NL ; return $retval; } if (!checkAccess()) { die('you are not allowed to access!'); } get_version_infos(); $action = intval($_POST['rad']); $package = $_POST['package']; $version_a = explode('.',$_POST['version']); $version = intval($version_a[0]).'.'.intval($version_a[1]).'.'.$version_a[2]; if ($version == '0.0.') { $content .= 'please insert a (valid) TYPO3-version<br>'; } $nextaction = $action; switch ($action) { case ACTION_GETPACKAGE: if ($package) { $content .= get_package($version,$package); $nextaction = ACTION_MD5PACKAGE; } else { $content .= 'please select a package first'; } break; case ACTION_MD5PACKAGE: // display md5-hashes for check on correct archives $content .= err_msg('compare to <a href="http://wiki.typo3.org/index.php/TYPO3_'.$version.'#MD5_checksums">correct md5-values</a>'); if ($package=='typo3_src') { $packageinfo = $versioninfo[substr($version,0,3)]['releases'][$version]; $content .= '<br />MD5: '.$packageinfo['checksums']['tar']['md5']; } do_exec('md5sum *.gz'); $nextaction = ACTION_EXTRACTPACKAGE; break; case ACTION_EXTRACTPACKAGE: // extract package if ($package) { do_exec('tar -zxvf '.$package.'-'.$version.'.tar.gz'); $nextaction = ACTION_LINKSOURCE; } else { $content .= 'please select a package first'; } break; case ACTION_MOVEPACKAGEUP: if ($package) { if ($package == 'typo3_src') { do_exec('mv typo3_src-'.$version.' ..'); $nextaction = ACTION_LINKSOURCEUP; } else { // get content from subdir into current dir do_exec('mv '.$package.'-'.$version.'/* .'); // remove empty directory do_exec('rmdir '.$package.'-'.$version); $nextaction = ACTION_LINKSOURCE; } } else { $content .= 'please select a package first'; } break; case ACTION_LINKSOURCE: // make new symlink for sources do_exec('rm typo3_src'); do_exec('ln -s typo3_src-'.$version.' typo3_src'); if (is_dir('t3lib')) { do_exec('rmdir t3lib'); do_exec('mv t3lib t3lib_old'); } if ( (intval($version_a[0]) < 6) ||((intval($version_a[0]) == 6) && (intval($version_a[1]) < 2 )) ) { do_exec('ln -s typo3_src/t3lib t3lib'); } if ( (intval($version_a[0]) > 6) ||((intval($version_a[0]) == 6) && (intval($version_a[1]) > 1 )) ) { do_exec('ln -s typo3_src/index.php index.php'); } do_exec('rmdir typo3'); do_exec('mv typo3 typo3_old'); do_exec('ln -s typo3_src/typo3 typo3'); $nextaction = ACTION_REMOVE_TEMPFILES; break; case ACTION_LINKSOURCEUP: // make new symlink for sources do_exec('rm typo3_src'); do_exec('ln -s ../typo3_src-'.$version.' typo3_src'); if (is_dir('t3lib')) { do_exec('rmdir t3lib'); do_exec('mv t3lib t3lib_old'); } if ( (intval($version_a[0]) < 6) ||((intval($version_a[0]) == 6) && (intval($version_a[1]) < 2 )) ) { do_exec('ln -s typo3_src/t3lib t3lib'); } if ( (intval($version_a[0]) > 6) ||((intval($version_a[0]) == 6) && (intval($version_a[1]) > 1 )) ) { do_exec('ln -s typo3_src/index.php index.php'); } do_exec('rmdir typo3'); do_exec('mv typo3 typo3_old'); do_exec('ln -s typo3_src/typo3 typo3'); $nextaction = ACTION_REMOVE_TEMPFILES; break; case ACTION_REMOVE_TEMPFILES: do_Exec('rm typoconf/temp*'); do_Exec('rm -r typo3temp/Cache/*'); $nextaction = ACTION_CHMOD; break; case ACTION_CHMOD: // change access-rights ... // .. for all directories //$content .= err_msg('directoryCreateMask im InstallTool setzen!'); do_exec('find . -type d -exec chmod 775 \'{}\' \;'); // .. for all files //$content .= err_msg('fileCreateMask im InstallTool setzen!'); do_exec('find . -type f -exec chmod 664 \'{}\' \;'); // enhance localconf.php for appropriate values: if (file_exists('typo3conf/localconf.php')) { $localconffile = file_get_contents('typo3conf/localconf.php'); $localconffile = str_replace('?'.'>','$TYPO3_CONF_VARS[\'BE\'][\'fileCreateMask\'] = \'664\';'.NL .'$TYPO3_CONF_VARS[\'BE\'][\'folderCreateMask\'] = \'775\';'.NL .'?'.'>',$localconffile); file_put_contents('typo3conf/localconf.php', $localconffile); } $nextaction = ACTION_ENABLEINSTALLTOOL; break; case ACTION_INIT: if (file_exists('typo3conf/localconf.php')) { $localconffile = file_get_contents('typo3conf/localconf.php'); $localconffile = str_replace('?'.'>','$TYPO3_CONF_VARS[\'SYS\'][\'UTF8filesystem\'] = \'1\';'.NL .(intval($version_a[0])==4 && intval($version_a[1])<5 ? '$TYPO3_CONF_VARS[\'SYS\'][\'setDBinit\'] = \'set names utf8\';'.NL .'$TYPO3_CONF_VARS[\'BE\'][\'forceCharset\'] = \'utf-8\';'.NL : '') .'$TYPO3_CONF_VARS[\'GFX\'][\'TTFdpi\'] = \'96\';'.NL .'$TYPO3_CONF_VARS[\'SYS\'][\'t3lib_cs_convMethod\'] = \'mbstring\';'.NL .'?'.'>',$localconffile); file_put_contents('typo3conf/localconf.php', $localconffile); } $nextaction = ACTION_ENABLEINSTALLTOOL; break; case ACTION_COPY_INDEXPHP: do_exec('rm index.php'); do_exec('cp typo3_src/index.php index.php'); do_exec('ls -la'); $nextaction = ACTION_LS; break; case ACTION_ENABLEINSTALLTOOL: if (is_dir('typo3conf')) { // next step will be to use install-tool: so grant access: do_exec('touch typo3conf/ENABLE_INSTALL_TOOL'); // show links to install-tool and 1-2-3-Install $content .= '<a href="typo3/install/index.php" target="install">Install-Tool</a><br>'; $content .= '<a href="typo3/install/index.php?mode=123&step=1&password=joh316" target="install">1-2-3-Install</a>'; } else { // assume > 6.2 // enable install-wizard: do_exec('touch INSTALL'); $content .= '<a href="index.php" target="install">Install-Wizard</a><br>'; } break; case ACTION_REMOVE_PACKAGE: do_exec('rm '.$package.'-'.$version.'.tar.gz'); $nextaction = ACTION_REMOVE_ACCESS; break; case ACTION_REMOVE_ACCESS: do_exec('rm ACCESS'); $nextaction = ACTION_LS; break; case ACTION_LS: do_exec('ls -la'); $nextaction = ACTION_LS; break; case ACTION_INFO: phpinfo(); $nextaction = ACTION_LS; break; case ACTION_VERSIONINFO: $json = file_get_contents('http://get.typo3.org/json'); file_put_contents(VERSIONCACHE,$json); $versioninfo = json_decode($json,true); $content .= '<pre>'.print_r($versioninfo,true).'</pre>'; $nextaction = ACTION_LS; break; case ACTION_TEST: default: // check for correct permissions. try to create a testfile. do_exec('echo test > testfile'); if (!file_exists('testfile')) { echo err_msg('can\'t create file in current directory<br>missing permissions?'); // show user data do_exec('id'); // show rights of current directory do_exec('ls -la'); $nextaction = ACTION_TEST; } else { // remove testfile do_exec('rm testfile'); $content .= 'writing possible, please proceed<br>'; $nextaction = ACTION_GETPACKAGE; } break; } $content .= showNavigation($nextaction,$version,$package); echo '<hr>'.$content; ?> </body> </html>
Für eine TYPO3-Installation muss man nur diese PHP-Datei (zb. als unpack.php) auf den Server kopieren. Dann ruft man diese PHP-Datei auf (z.B. www.meinedomain.tld/unpack.php), die zuerst die Schreibrechte überprüft, dann die beiden Archive holt und anschließend auspackt. Und damit man mit der Konfiguration direkt loslegen kann gibt es am Ende der PHP-Datei einen direkten Link zum Install-Tool und zum 1-2-3-Install.