From: <lph...@us...> - 2009-05-18 15:55:20
|
Revision: 18887 http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=18887&view=rev Author: lphuberdeau Date: 2009-05-18 15:55:09 +0000 (Mon, 18 May 2009) Log Message: ----------- [MOD] Preparing for FTP support Modified Paths: -------------- trim/scripts/addinstance.php trim/src/accesslib.php trim/src/appinfo/tikiwiki.php trim/src/databaselib.php trim/src/env_setup.php trim/src/instancelib.php Added Paths: ----------- trim/scripts/checkversion.php trim/src/ftplib.php Modified: trim/scripts/addinstance.php =================================================================== --- trim/scripts/addinstance.php 2009-05-18 15:19:05 UTC (rev 18886) +++ trim/scripts/addinstance.php 2009-05-18 15:55:09 UTC (rev 18887) @@ -6,11 +6,17 @@ include dirname(__FILE__) . "/../src/env_setup.php"; include dirname(__FILE__) . "/../src/dbsetup.php"; -$user = $host = ''; +$type = $user = $host = $pass = ''; +while( ! in_array( $type, array( 'ftp', 'ssh' ) ) ) { + $type = readline( "Connection type [ssh|ftp] : " ); +} + while( empty( $host ) ) - $host = readline( "SSH host name : " ); + $host = readline( "Host name : " ); while( empty( $user ) ) - $user = readline( "SSH user : " ); + $user = readline( "User : " ); +while( $type == 'ftp' && empty( $pass ) ) + $pass = readline( "Password : " ); $name = $contact = $webroot = $tempdir = $weburl = ''; @@ -48,7 +54,7 @@ $instance->save(); echo color("Instance information saved.\n", 'green'); -$access = $instance->registerAccessMethod( 'ssh', $host, $user ); +$access = $instance->registerAccessMethod( $type, $host, $user, $pass ); if( ! $access ) { Added: trim/scripts/checkversion.php =================================================================== --- trim/scripts/checkversion.php (rev 0) +++ trim/scripts/checkversion.php 2009-05-18 15:55:09 UTC (rev 18887) @@ -0,0 +1,5 @@ +<?php + +echo phpversion(); + +?> Modified: trim/src/accesslib.php =================================================================== --- trim/src/accesslib.php 2009-05-18 15:19:05 UTC (rev 18886) +++ trim/src/accesslib.php 2009-05-18 15:55:09 UTC (rev 18887) @@ -19,6 +19,8 @@ return 'Access_SSH'; elseif( $type == 'ssh::nokey' ) return 'Access_SSH'; + elseif( $type == 'ftp' ) + return 'Access_FTP'; else die( "Unknown type: $type\n" ); } // }}} @@ -97,6 +99,8 @@ abstract function deleteFile( $filename ); abstract function localizeFolder( $remoteLocation, $localMirror ); + + abstract function replicateRemotely( $localLocation, $remoteMirror ); } interface ShellPrompt { @@ -325,7 +329,91 @@ $host = new SSH_Host( $this->host, $this->user ); $host->rsync( $remoteLocation, $localMirror ); } // }}} + + function replicateRemotely( $localLocation, $remoteMirror ) // {{{ + { + // TODO + die( 'Not implemented yet.' ); + } // }}} } +class Access_FTP extends Access +{ + function __construct( Instance $instance ) + { + parent::__construct( $instance, 'ftp' ); + } + function firstConnect() + { + $conn = new FTP_Host( $this->host, $this->user, $this->password ); + + return $conn->connect(); + } + + function getInterpreterPath() + { + $result = $this->runPHP( dirname(__FILE__) . '/../scripts/checkversion.php' ); + + if( preg_match( '/^[5-9]\./', $result ) ) { + return 'mod_php'; + } + } + + function fileExists( $filename ) + { + $ftp = new FTP_Host( $this->host, $this->user, $this->password ); + return $ftp->fileExists( $filename ); + } + + function fileGetContents( $filename ) + { + $ftp = new FTP_Host( $this->host, $this->user, $this->password ); + return $ftp->getContent( $filename ); + } + + function fileModificationDate( $filename ) + { + } + + function runPHP( $localFile ) // {{{ + { + $host = new FTP_Host( $this->host, $this->user, $this->password ); + + $remoteName = 'trim_' . md5( $localFile ) . '.php'; + $remoteFile = $this->instance->getWebPath( $remoteName ); + + $host->sendFile( $localFile, $remoteFile ); + $output = file_get_contents( $this->instance->getWebUrl( $remoteName ) ); + + $host->removeFile( $remoteFile ); + + return $output; + } // }}} + + function downloadFile( $filename ) + { + } + + function uploadFile( $filename, $remoteLocation ) + { + } + + function deleteFile( $filename ) + { + if( $filename{0} != '/' ) + $filename = $this->instance->getWebPath( $filename ); + + $host->removeFile( $remoteFile ); + } + + function localizeFolder( $remoteLocation, $localMirror ) + { + } + + function replicateRemotely( $localLocation, $remoteMirror ) // {{{ + { + } // }}} +} + ?> Modified: trim/src/appinfo/tikiwiki.php =================================================================== --- trim/src/appinfo/tikiwiki.php 2009-05-18 15:19:05 UTC (rev 18886) +++ trim/src/appinfo/tikiwiki.php 2009-05-18 15:55:09 UTC (rev 18887) @@ -73,11 +73,16 @@ function install( Version $version ) // {{{ { $access = $this->instance->getBestAccess( 'scripting' ); - if( ! $access instanceof ShellPrompt ) - die( "Requires shell access to the server.\n" ); + if( $access instanceof ShellPrompt ) { + $access->shellExec( + $this->getExtractCommand( $version, $this->instance->webroot ) ); + } else { + // TODO : Untested + $folder = cache_folder( $this, $version ); + $this->extractTo( $version, $folder ); - $access->shellExec( - $this->getExtractCommand( $version, $this->instance->webroot ) ); + $access->replicateRemotely( $folder, $this->instance->webroot ); + } $this->branch = $version->branch; $this->installType = $version->type; @@ -256,6 +261,7 @@ function performActualUpdate( Version $version ) // {{{ { + // FIXME : Not FTP compatible switch( $this->getInstallType() ) { case 'svn': @@ -311,6 +317,7 @@ function fixPermissions() // {{{ { + // FIXME : Not FTP compatible $access = $this->instance->getBestAccess( 'scripting' ); $filename = $this->instance->getWorkPath( 'setup.sh' ); @@ -372,6 +379,7 @@ $access = $this->instance->getBestAccess( 'filetransfer' ); $access->uploadFile( $tmp, 'db/local.php' ); + // FIXME : Not FTP compatible if( $access->fileExists( 'installer/shell.php' ) ) { $access = $this->instance->getBestAccess( 'scripting' ); @@ -408,6 +416,7 @@ $access = $this->instance->getBestAccess( 'scripting' ); $root = $this->instance->webroot; + // FIXME : Not FTP compatible (arguments) $access->runPHP( dirname(__FILE__) . '/../../scripts/run_sql_file.php', escapeshellarg( $root ) . ' ' . escapeshellarg( $remoteFile ) ); } // }}} @@ -415,6 +424,7 @@ { $path = $this->instance->getWebPath( 'templates_c/*.php' ); + // FIXME : Not FTP compatible if( ( $access = $this->instance->getBestAccess('scripting') ) instanceof ShellPrompt ) { $access->shellExec( "rm " . $path ); } Modified: trim/src/databaselib.php =================================================================== --- trim/src/databaselib.php 2009-05-18 15:19:05 UTC (rev 18886) +++ trim/src/databaselib.php 2009-05-18 15:55:09 UTC (rev 18887) @@ -33,6 +33,7 @@ private function locateExtensions() // {{{ { + // FIXME : Not FTP compatible $access = $this->instance->getBestAccess( 'scripting' ); $content = $access->shellExec( "{$this->instance->phpexec} -m 2>&1" ); $content = str_replace( "\r", '', $content ); @@ -116,12 +117,14 @@ function createDatabase( Instance $instance, $name ) // {{{ { + // FIXME : Not safemode compatible $access = $instance->getBestAccess( 'scripting' ); $access->shellExec( "mysqladmin {$this->args} create $name" ); } // }}} function createUser( Instance $instance, $username, $password ) // {{{ { + // FIXME : Not FTP compatible $u = mysql_real_escape_string( $username ); $p = mysql_real_escape_string( $password ); $query = escapeshellarg( "CREATE USER '$u'@'{$this->host}' IDENTIFIED BY '$p';" ); @@ -132,6 +135,7 @@ function grantRights( Instance $instance, $username, $database ) // {{{ { + // FIXME : Not FTP compatible $u = mysql_real_escape_string( $username ); $d = mysql_real_escape_string( $database ); $query = escapeshellarg( "GRANT ALL ON `$d`.* TO '$u'@'{$this->host}';" ); @@ -142,6 +146,7 @@ function finalize( Instance $instance ) // {{{ { + // FIXME : Not FTP compatible $access = $instance->getBestAccess( 'scripting' ); $access->shellExec( "mysqladmin {$this->args} reload" ); } // }}} Modified: trim/src/env_setup.php =================================================================== --- trim/src/env_setup.php 2009-05-18 15:19:05 UTC (rev 18886) +++ trim/src/env_setup.php 2009-05-18 15:55:09 UTC (rev 18887) @@ -33,6 +33,7 @@ function warning( $text ) { echo color( $text, 'yellow' ) . "\n"; } function error( $text ) { echo color( $text, 'red' ) . "\n"; } +include dirname(__FILE__) . "/ftplib.php"; include dirname(__FILE__) . "/sshlib.php"; include dirname(__FILE__) . "/accesslib.php"; include dirname(__FILE__) . "/instancelib.php"; Added: trim/src/ftplib.php =================================================================== --- trim/src/ftplib.php (rev 0) +++ trim/src/ftplib.php 2009-05-18 15:55:09 UTC (rev 18887) @@ -0,0 +1,82 @@ +<?php + +class FTP_Host +{ + private $host; + private $user; + private $pass; + private $conn; + + function __construct( $host, $user, $pass ) // {{{ + { + $this->host = $host; + $this->user = $user; + $this->pass = $pass; + } // }}} + + function __destruct() // {{{ + { + if( $this->conn ) { + ftp_close( $this->conn ); + } + } // }}} + + function connect() // {{{ + { + if( $this->conn ) + return; + + $conn = ftp_connect( $this->host, 21, 15 ); + if( $conn ) { + if( ftp_login( $conn, $this->user, $this->pass ) ) { + $this->conn = $conn; + return true; + } + } + + return false; + } // }}} + + function fileExists( $filename ) // {{{ + { + $this->connect(); + + $dir = dirname( $filename ); + $base = basename( $filename ); + + $list = ftp_nlist( $this->conn, $dir ); + + return in_array( $base, $list ); + } // }}} + + function getContent( $filename ) // {{{ + { + $this->connect(); + + $fp = tmpfile(); + if( ftp_fget( $this->conn, $fp, $filename, FTP_ASCII ) ) { + $content = ''; + rewind( $fp ); + while( ! feof( $fp ) ) { + $content .= fread( $fp, 8192 ); + } + + return $content; + } + } // }}} + + function sendFile( $localFile, $remoteFile ) // {{{ + { + $this->connect(); + ftp_put( $this->conn, $remoteFile, $localFile, FTP_ASCII ); + ftp_chmod( $this->conn, 0644, $remoteFile ); + } // }}} + + function removeFile( $remoteFile ) // {{{ + { + $this->connect(); + ftp_delete( $this->conn, $remoteFile ); + } // }}} +} + +?> Modified: trim/src/instancelib.php =================================================================== --- trim/src/instancelib.php 2009-05-18 15:19:05 UTC (rev 18886) +++ trim/src/instancelib.php 2009-05-18 15:55:09 UTC (rev 18887) @@ -114,14 +114,16 @@ query( "DELETE FROM version WHERE instance_id = :id", array( ':id' => $this->id ) ); } // }}} - function registerAccessMethod( $type, $host, $user ) // {{{ + function registerAccessMethod( $type, $host, $user, $password = null ) // {{{ { - if( ! in_array( $type, array( 'ssh' ) ) ) - die( "Unsupported access method.\n" ); + if( ! $class = Access::getClassFor( $type ) ) { + return; + } - $access = new Access_SSH( $this ); + $access = new $class( $this ); $access->host = $host; $access->user = $user; + $access->password = $password; if( $access->firstConnect() ) { @@ -144,6 +146,16 @@ return reset( $this->access ); } // }}} + function getWebUrl( $relativePath ) // {{{ + { + $weburl = rtrim( $this->weburl, '/' ); + + $path = "$weburl/$relativePath"; + $path = str_replace( '/./', '/', $path ); + + return $path; + } // }}} + function getWebPath( $relativePath ) // {{{ { $path = "{$this->webroot}/$relativePath"; @@ -297,6 +309,7 @@ function lock() // {{{ { + // FIXME : Not FTP compatible $access = $this->getBestAccess( 'scripting' ); if( ! $ok = $access instanceof ShellPrompt ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |