2008-12-15 02:31:01 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This static publisher can be used to deploy static content to multiple hosts, by generating the cache files locally and then rsyncing then to
|
|
|
|
* each destination box. This can be used to set up a load-balanced collection of static servers.
|
2009-02-04 21:18:12 +01:00
|
|
|
*
|
|
|
|
* @see http://doc.silverstripe.com/doku.php?id=staticpublisher
|
|
|
|
*
|
|
|
|
* @package cms
|
|
|
|
* @subpackage publishers
|
2008-12-15 02:31:01 +01:00
|
|
|
*/
|
|
|
|
class RsyncMultiHostPublisher extends FilesystemPublisher {
|
|
|
|
/**
|
2013-03-18 11:47:15 +01:00
|
|
|
* @config
|
2008-12-15 02:31:01 +01:00
|
|
|
* Array of rsync targets to publish to. These can either be local file names, or scp-style targets, in the form "user@server:path"
|
|
|
|
*/
|
2013-03-18 11:47:15 +01:00
|
|
|
private static $targets = array();
|
2008-12-15 02:31:01 +01:00
|
|
|
|
2013-03-18 11:47:15 +01:00
|
|
|
/**
|
|
|
|
* @config
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
private static $excluded_folders = array();
|
2010-10-15 03:38:38 +02:00
|
|
|
|
2008-12-15 02:31:01 +01:00
|
|
|
/**
|
|
|
|
* Set the targets to publish to.
|
2009-02-04 21:18:12 +01:00
|
|
|
* If target is an scp-style remote path, no password is accepted - we assume key-based authentication to be set up on the application server
|
|
|
|
* initiating the publication.
|
2013-03-18 11:47:15 +01:00
|
|
|
*
|
|
|
|
* @deprecated 3.2 Use the "RsyncMultiHostPublisher.targets" config setting instead
|
2008-12-15 02:31:01 +01:00
|
|
|
* @param $targets An array of targets to publish to. These can either be local file names, or scp-style targets, in the form "user@server:path"
|
|
|
|
*/
|
2012-09-19 12:07:46 +02:00
|
|
|
static public function set_targets($targets) {
|
2013-03-18 11:47:15 +01:00
|
|
|
Deprecation::notice('3.2', 'Use the "RsyncMultiHostPublisher.targets" config setting instead');
|
|
|
|
Config::inst()->update('RsyncMultiHostPublisher', 'targets', $targets);
|
2008-12-15 02:31:01 +01:00
|
|
|
}
|
2010-10-15 03:38:38 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Specify folders to exclude from the rsync
|
|
|
|
* For example, you could exclude assets.
|
2013-03-18 11:47:15 +01:00
|
|
|
*
|
|
|
|
* @deprecated 3.2 Use the "RsyncMultiHostPublisher.excluded_folders" config setting instead
|
2010-10-15 03:38:38 +02:00
|
|
|
*/
|
2012-09-19 12:07:46 +02:00
|
|
|
static public function set_excluded_folders($folders) {
|
2013-03-18 11:47:15 +01:00
|
|
|
Deprecation::notice('3.2', 'Use the "RsyncMultiHostPublisher.excluded_folders" config setting instead');
|
|
|
|
Config::inst()->update('RsyncMultiHostPublisher', 'excluded_folders', $folders);
|
2010-10-15 03:38:38 +02:00
|
|
|
}
|
2008-12-15 02:31:01 +01:00
|
|
|
|
2012-09-19 12:07:46 +02:00
|
|
|
public function publishPages($urls) {
|
2008-12-15 02:31:01 +01:00
|
|
|
parent::publishPages($urls);
|
|
|
|
$base = Director::baseFolder();
|
2012-04-12 10:36:25 +02:00
|
|
|
$framework = FRAMEWORK_DIR;
|
2008-12-15 02:31:01 +01:00
|
|
|
|
|
|
|
// Get variable that can turn off the rsync component of publication
|
|
|
|
if(isset($_GET['norsync']) && $_GET['norsync']) return;
|
|
|
|
|
2010-10-15 03:38:38 +02:00
|
|
|
$extraArg = "";
|
2013-03-18 11:47:15 +01:00
|
|
|
if($this->config()->excluded_folders) foreach($this->config()->excluded_folders as $folder) {
|
2010-10-15 03:38:38 +02:00
|
|
|
$extraArg .= " --exclude " . escapeshellarg($folder);
|
|
|
|
}
|
|
|
|
|
2013-03-18 11:47:15 +01:00
|
|
|
foreach((array)$this->config()->targets as $target) {
|
2008-12-15 02:31:01 +01:00
|
|
|
// Transfer non-PHP content from everything to the target; that will ensure that we have all the JS/CSS/etc
|
2010-10-15 03:38:38 +02:00
|
|
|
$rsyncOutput = `cd $base; rsync -av -e ssh --exclude /.htaccess --exclude /web.config --exclude '*.php' --exclude '*.svn' --exclude '*.git' --exclude '*~' $extraArg --delete . $target`;
|
2008-12-15 02:31:01 +01:00
|
|
|
// Then transfer "safe" PHP from the cache/ directory
|
2010-10-15 03:38:38 +02:00
|
|
|
$rsyncOutput .= `cd $base; rsync -av -e ssh --exclude '*.svn' --exclude '*~' $extraArg --delete cache $target`;
|
2012-04-12 10:36:25 +02:00
|
|
|
// Transfer framework/static-main.php to the target
|
|
|
|
$rsyncOutput .= `cd $base; rsync -av -e ssh --delete $framework/static-main.php $target/$framework`;
|
2013-03-18 11:47:15 +01:00
|
|
|
if(Config::inst()->get('StaticPublisher', 'echo_progress')) echo $rsyncOutput;
|
2008-12-15 02:31:01 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|