File: //usr/local/share/hostingplatform/scripts/__snapshotHostingPackage
#!/usr/bin/env php
<?php
require_once dirname(__FILE__) . '/Utils.class.php';
require_once("/usr/local/share/hostingplatform/esrpc.php");
$server = new ESRPCConnection();
$worker = new Worker($server->get());
$server->setTarget($worker);
$server->connect();
$server->serve();
class Worker {
var $api;
var $snapshots = '/var/local/hostingplatform/snapshots';
function __construct($api) {
$this->api = $api;
}
function run($packagename) {
// Check hostingpackage existence...
if (!$this->api->__checkIfHostingPackageExists($packagename))
throw new Exception(
"Hostingpackage '$packagename' does not exist!"
);
$base = $packagename . '/' . date("Y_m_d-H_i_s");
$curr = $this->snapshots . '/' . $packagename . '/current';
$path = $this->snapshots . '/' . $base;
// Check target dir existence...
if (!is_dir($path)) {
if (!mkdir($path, 0755, true)) throw new Exception(
"Unable to create parent dir for archive " .
"'$path'"
);
}
// Find user information (for homedir)...
if (($user = posix_getpwnam($packagename)) === false) throw new Exception(
"Unable to get information for user '$packagename'!"
);
// Backup homedir
Utils::rsync($user['dir'] . '/.', $path . "/files", $curr . "/files");
foreach ($this->api->listMySQLDatabases($packagename) as $database) {
$tables = $this->api->listMySQLTables($database);
foreach($tables as $table => $table_details) {
$table_modified = (int)str_replace(":", "", str_replace("-", "", str_replace(" ", "", $table_details["modified"])));
if(!is_file($curr . "/databases/mysql/" . $database . "/" . $table . ".sql") ||
date("YmdHis",filectime($curr . "/databases/mysql/" . $database . "/" . $table . ".sql")) < $table_modified) {
Utils::dumpMySQLTable($database, $table, $path . "/databases/mysql/" . $database . "/" . $table . ".sql");
}
else {
if (!is_dir($path . "/databases/mysql/" . $database . "/")) {
if (!mkdir($path . "/databases/mysql/" . $database . "/", 0770, true)) throw new Exception(
"Unable to create parent dir for MySQL dump '" . $path . "/databases/mysql/" . $database . "/'");
}
link(
$curr . "/databases/mysql/" . $database . "/" . $table . ".sql",
$path . "/databases/mysql/" . $database . "/" . $table . ".sql"
);
}
chown($path . "/databases/mysql/" . $database . "/" . $table . ".sql", $packagename);
chgrp($path . "/databases/mysql/" . $database . "/" . $table . ".sql", $packagename);
chmod($path . "/databases/mysql/" . $database . "/" . $table . ".sql", 0770);
}
if(is_dir($path . "/databases/mysql/" . $database . "/")) {
chown($path . "/databases/mysql/" . $database . "/", $packagename);
chgrp($path . "/databases/mysql/" . $database . "/", $packagename);
chmod($path . "/databases/mysql/" . $database . "/", 0770);
}
if(is_dir($path . "/databases/mysql/")) {
chown($path . "/databases/mysql/", $packagename);
chgrp($path . "/databases/mysql/", $packagename);
chmod($path . "/databases/mysql/", 0770);
}
if(is_dir($path . "/databases/")) {
chown($path . "/databases/", $packagename);
chgrp($path . "/databases/", $packagename);
chmod($path . "/databases/", 0770);
}
}
foreach ($this->api->listPostgreSQLDatabases($packagename) as $database) {
// Find user information (for homedir)...
if (($user = posix_getpwnam($packagename)) === false) throw new Exception(
"Unable to get information for user '$packagename'!"
);
if (file_exists($user['dir'] . '/.backup-exclude-postgresql-' . $database)) continue;
Utils::dumpPostgreSQLDatabase($database, $path . "/databases/postgresql/" . $database . ".sql");
if (Utils::sameContent(
$path . "/databases/postgresql/" . $database . ".sql",
$curr . "/databases/postgresql/" . $database . ".sql"
)) {
unlink($path . "/databases/postgresql/" . $database . ".sql");
link(
$curr . "/databases/postgresql/" . $database . ".sql",
$path . "/databases/postgresql/" . $database . ".sql"
);
}
}
if (is_link($curr)) unlink($curr);
symlink($path, $curr);
return $base;
}
}