#!/usr/bin/perl -w
#
# $Id: CloneCentralDatabases.pl,v 1.1 2008/02/21 00:21:28 kawas Exp $
# $Source: /home/repository/moby/moby-live/Perl/MOBY-Server/share/scripts/CloneCentralDatabases.pl,v $
#
use strict;
use Getopt::Std;
use MOBY::Client::Central;
use MOBY::Config;
my $master_central;
#
# Split up text in 2 pieces to prevent CVS from filling in the id and source strings overhere.
#
my $cvs_id1 = '$I';
my $cvs_id2 = 'd$';
my $cvs_source1 = '$S';
my $cvs_source2 = 'ource$';
#
# Official MOBY Central. (Currently down)
#
my $master_central_uri = 'http://moby.ucalgary.ca/MOBY/Central';
my $master_central_url = 'http://moby.ucalgary.ca/moby/MOBY-Central.pl';
#
# Get options.
#
my %opts;
getopts('mc:p:', \%opts);
unless ($opts{'m'}) {
_Usage();
}
unless ($opts{'p'}) {
print "\nPassword missing. Please specify -p [password]\n";
_Usage();
}
my $mysql_rootpwd = $opts{'p'};
if ($opts{'c'}) {
($master_central_uri, $master_central_url) = split '@', $opts{'c'};
}
_ExistsLocalCentralConfig();
print "Fetching data from MOBY Central:\n\t$master_central_uri @ $master_central_url\n";
print "to rebuild the local MOBY Central clone/mirror configuration.\n";
# Set this to wherever your MOBY Central is.
$master_central = MOBY::Client::Central->new(
Registries => {
mobycentral => {
URL => $master_central_url,
URI => $master_central_uri
}
}
);
#
# Create or cleanup the SQL dump dir.
#
my $dumpdir = './sqldump/';
if (-e $dumpdir && -d $dumpdir) {
print "SQL dump directory $dumpdir exists.\n";
#
# Find old SQL dump files.
#
opendir (DUMPDIR, $dumpdir) or die "Couldn't open SQL dump directory: $!\n";
my @sqlfiles = grep { /.+\.sql/i } readdir DUMPDIR;
closedir DUMPDIR;
#
# Remove old SQL dumps.
#
if (scalar(@sqlfiles)) {
print "Removing old SQL dumps...\n";
foreach my $file (@sqlfiles) {
my $path = $dumpdir .+ $file;
print "\tRemoving $path...";
unlink $path or die "\n\tCould not unlink $path: $!\n";
print " done.\n";
}
} else {
print "Can not remove old SQL dumps: No old SQL dumps found.\n";
}
} else {
print "Creating SQL dump directory $dumpdir...";
mkdir $dumpdir,0755 or die "\n\tCouldn't create SQL dump directory $dumpdir: $!\n";
print " done.\n";
}
#
# Fetch MOBY Central data.
#
print "MOBY Central Data Dump:\n";
# A simple MOBY_Central call to get a complete dump of registered stuff.
my ($mobycentral, $mobyobject, $mobyservice, $mobynamespace, $mobyrelationship) = $master_central->MOBY::Client::Central::DUMP();
#my ($mobycentral, $mobyobject, $mobyservice, $mobynamespace, $mobyrelationship) = $central->MOBY::Client::Central::DUMP(['mobycentral']);
_DumpSQL('mobycentral', $mobycentral);
_DumpSQL('mobyobject', $mobyobject);
_DumpSQL('mobyservice', $mobyservice);
_DumpSQL('mobynamespace', $mobynamespace);
_DumpSQL('mobyrelationship', $mobyrelationship);
#
# Create new MOBY Central.
#
print "Creating MOBY Central clone/mirror:\n";
my $config = MOBY::Config->new();
my @dbsections = ('mobycentral', 'mobyobject', 'mobyservice', 'mobynamespace', 'mobyrelationship');
my $data;
$data .= "--\n";
$data .= "-- $cvs_id1$cvs_id2\n";
$data .= "-- $cvs_source1$cvs_source2\n";
$data .= "--\n\n";
foreach my $dbsection (@dbsections) {
my $dbname = ${${$config}{$dbsection}}{'dbname'};
my $username = ${${$config}{$dbsection}}{'username'};
my $password = ${${$config}{$dbsection}}{'password'};
$data .= "DELETE FROM mysql.user WHERE user=\"$username\"\;\n";
$data .= "DROP DATABASE IF EXISTS $dbname\;\n";
$data .= "FLUSH PRIVILEGES\;\n";
$data .= "CREATE DATABASE IF NOT EXISTS $dbname\;\n";
$data .= "USE $dbname\;\n";
$data .= "GRANT ALL PRIVILEGES ON $dbname.* TO \"$username\"\@\"localhost\" identified by \"$password\"\;\n";
$data .= "FLUSH PRIVILEGES\;\n";
}
$data .= "FLUSH PRIVILEGES\;\n";
$data .= "FLUSH PRIVILEGES\;\n";
$data .= "FLUSH PRIVILEGES\;\n";
my $sqlfile = $dumpdir .+ 'createdatabases.sql';
open (SQLSAVE,">>$sqlfile") or die "\tERROR: can't open output file $sqlfile: $!\n";
print SQLSAVE $data or die "\tERROR: can't save output to file $sqlfile: $!\n";
print "\tCreated script to create MySQL databases.\n";
close SQLSAVE;
system("mysql -u root --password=$mysql_rootpwd < $sqlfile") == 0 or die "\n\tCan't create databases using sql file $sqlfile: $?\n";
foreach my $dbsection (@dbsections) {
my $dbname = ${${$config}{$dbsection}}{'dbname'};
my $username = ${${$config}{$dbsection}}{'username'};
my $password = ${${$config}{$dbsection}}{'password'};
my $host = ${${$config}{$dbsection}}{'url'};
my $port = ${${$config}{$dbsection}}{'port'};
_LoadSQL($dbsection, $dbname, $username, $password, $host, $port);
}
print "Finished!\n";
#
# Subs.
#
sub _DumpSQL {
my ($db, $data) = @_;
print "\tDumping $db...";
my $pathto = $dumpdir .+ $db .+ '.sql';
open (SQLSAVE,">>$pathto") or die "\n\tERROR: can't open output file $pathto: $!";
print SQLSAVE "--\n" or die "\n\tERROR: can't save output to file $pathto: $!";
print SQLSAVE "-- $cvs_id1$cvs_id2\n" or die "\n\tERROR: can't save output to file $pathto: $!";
print SQLSAVE "-- $cvs_source1$cvs_source2\n" or die "\n\tERROR: can't save output to file $pathto: $!";
print SQLSAVE "--\n\n" or die "\n\tERROR: can't save output to file $pathto: $!";
print SQLSAVE $data or die "\n\tERROR: can't save output to file $pathto: $!";
print " saved $db to $dumpdir\n";
close SQLSAVE;
if (-z $pathto) {
die "\tERROR: database dump $pathto for $db is empty.\n";
}
}
sub _LoadSQL {
my ($dbsection, $dbname, $username, $password, $host, $port) = @_;
print "\tLoading data for $dbsection...";
my $sqlfilepath = $dumpdir .+ $dbsection .+ '.sql';
system("mysql -h $host -P $port -u $username --password=$password $dbname<$sqlfilepath") == 0 or die "\n\tCan't load data for $dbname: $!";
print " done\n";
}
sub _ExistsLocalCentralConfig {
my $confile = $ENV{MOBY_CENTRAL_CONFIG};
unless ($confile) {
print "ERROR: MOBY_CENTRAL_CONFIG env var not set.\n\n";
print " A MOBY Central is a combination of scripts accessed through a webserver\n";
print " and some MySQL databases. This script will take care of the databases part\n";
print " provided that you have already installed the scripts and configured your\n";
print " webserver.\n";
exit;
}
unless (-e $confile && -r $confile) {
exit "ERROR: MOBY_CENTRAL_CONFIG env var pointing to a missing or unreadable file.\n";
} else {
print "Found MOBY Central config file for local mirror/clone at:\n\t$confile\n"
}
}
sub _Usage {
print "\n";
print "Options: -m Mirror = clone = create a local MOBY Central mirror/clone from scratch.\n";
print " -c [central] Central from which to fetch data. [central] is in format:\n";
print " [centralURI]@[centralURL]\n";
print " Default central is:\n";
print " $master_central_uri\@$master_central_url\n";
print " Edit this script to change the default MOBY Central.\n";
print " -p [password] MySQL root password required for creating the MOBY Central databases.\n";
print "\n";
print "WARNING: This script will overwrite an existing local MOBY Central clone/mirror!\n";
print " Note that the local MOBY Central config (SOAP endpoint) might point to\n";
print " MySQL databases on a different machine.\n";
print "\n";
_ExistsLocalCentralConfig();
print "Local MOBY Central config points to SQL databases:\n";
my $config = MOBY::Config->new() or die "\tcan't find local MOBY Central config\n";
my @dbsections = ('mobycentral', 'mobyobject', 'mobyservice', 'mobynamespace', 'mobyrelationship');
foreach my $dbsection (@dbsections) {
my $dbname = ${${$config}{$dbsection}}{'dbname'};
my $host = ${${$config}{$dbsection}}{'url'};
my $port = ${${$config}{$dbsection}}{'port'};
print "\tdbname: $dbname\n";
print "\t host: $host\n";
print "\t port: $port\n";
}
print "\n";
exit;
}