239 lines
7.2 KiB
Perl
239 lines
7.2 KiB
Perl
#!/usr/bin/perl -w
|
|
|
|
#----------------------------------------------------------------------
|
|
# Author Stephen Noble <stephen@dungog.net>
|
|
# create rsync scripts for dungog-rsync
|
|
#----------------------------------------------------------------------
|
|
|
|
package esmith;
|
|
|
|
use esmith::config;
|
|
use esmith::util;
|
|
use esmith::db;
|
|
|
|
my %conf;
|
|
tie %conf, 'esmith::config';
|
|
|
|
local %dungog;
|
|
tie %dungog, 'esmith::config', '/home/e-smith/db/dungog';
|
|
|
|
my $rsync = $ARGV [1];
|
|
die "rsync argument missing." unless defined ($rsync);
|
|
|
|
unlink ("/usr/bin/dungogrsync-$rsync");
|
|
|
|
#define some variables
|
|
my $method = db_get_prop(\%dungog, $rsync, "method") || '';
|
|
my $user = db_get_prop(\%dungog, $rsync, "user") || '';
|
|
my $options = db_get_prop(\%dungog, $rsync, "options") || '';
|
|
my $compress = db_get_prop(\%dungog, $rsync, "compress")|| '';
|
|
my $delete = db_get_prop(\%dungog, $rsync, "delete") || '';
|
|
my $noping = db_get_prop(\%dungog, $rsync, "noping") || '';
|
|
my $dbdump = db_get_prop(\%dungog, $rsync, "dbdump") || '';
|
|
my $pre = db_get_prop(\%dungog, $rsync, "pre") || '';
|
|
my $post = db_get_prop(\%dungog, $rsync, "post") || '';
|
|
my $bwlimit = db_get_prop(\%dungog, $rsync, "bwlimit") || '';
|
|
|
|
my $localdirlist1 = db_get_prop(\%dungog, "$rsync", "localdirlist") || 'none';
|
|
my @localdirlist = split(/,/, $localdirlist1);
|
|
my $localdir = $localdirlist[$#localdirlist] || '';
|
|
|
|
my $remoteserverlist1 = db_get_prop(\%dungog, "$rsync", "remoteserverlist") || 'none';
|
|
my @remoteserverlist = split(/,/, $remoteserverlist1);
|
|
my $remoteserver = $remoteserverlist[$#remoteserverlist] || '';
|
|
|
|
my $remotedirlist1 = db_get_prop(\%dungog, "$rsync", "remotedirlist") || 'none';
|
|
my @remotedirlist = split(/,/, $remotedirlist1);
|
|
my $remotedir = $remotedirlist[$#remotedirlist] || '';
|
|
|
|
my $OPTS = '$OPTS';
|
|
my $VAR = '$VAR';
|
|
my $PATH = '$PATH';
|
|
my $C = '';
|
|
my $D = '';
|
|
my $T = '';
|
|
my $ex = '';
|
|
my $in = '';
|
|
my $bw = '';
|
|
|
|
#create rsync script /usr/bin/dungogrsync-$rsync
|
|
my $fname = "/usr/bin/dungogrsync-$rsync";
|
|
open (RUN, ">$fname") || die ("Can't open $fname: $!");
|
|
|
|
print RUN "#!/bin/bash\n";
|
|
print RUN "\n";
|
|
print RUN "# rsync 'driver' script. (Uses SSH as the transport layer.)\n";
|
|
print RUN "export PATH=$PATH:/bin:/usr/bin:/usr/local/bin\n";
|
|
print RUN "\n";
|
|
|
|
my $overlap = db_get_prop(\%dungog, 'rsync', "overlap") || '';
|
|
if ($overlap ne 'allow')
|
|
{
|
|
print RUN "/bin/ps ax > /tmp/check\n";
|
|
print RUN "CHK=`/bin/cat /tmp/check | /bin/grep /usr/bin/rsync`\n";
|
|
print RUN "if ! \$CHK ; then\n";
|
|
print RUN " /bin/echo 'just ignore the warning above, it tells us'\n";
|
|
print RUN " /bin/echo 'rsync is already running, exiting...'\n";
|
|
print RUN " exit 0\n";
|
|
print RUN "fi\n";
|
|
print RUN "\n";
|
|
}
|
|
|
|
if ($pre ne '')
|
|
{
|
|
print RUN "# pre rsync command\n";
|
|
print RUN "$pre\n";
|
|
print RUN "\n";
|
|
}
|
|
|
|
if ($compress eq 'on')
|
|
{
|
|
$C = '--compress';
|
|
}
|
|
|
|
if ($delete eq 'on')
|
|
{
|
|
$D = '--delete';
|
|
}
|
|
|
|
unless ($bwlimit eq 'none')
|
|
{
|
|
$bw = "--bwlimit=$bwlimit";
|
|
}
|
|
|
|
if (-e "/opt/$rsync.ex")
|
|
{
|
|
$ex = "--exclude-from=/opt/$rsync.ex";
|
|
}
|
|
|
|
if (-e "/opt/$rsync.in")
|
|
{
|
|
$in = "--include-from=/opt/$rsync.in";
|
|
}
|
|
|
|
if ($options eq 'test')
|
|
{
|
|
$T = '--dry-run -vv';
|
|
print RUN "# For testing. Only displays what rsync 'would' do and does no actual copying.\n";
|
|
print RUN "OPTS='$T -u -a $C $D $ex $in $bw --stats --progress'\n";
|
|
}
|
|
elsif ($options eq 'verbose')
|
|
{
|
|
$T = '-v';
|
|
print RUN "# Does copy, but still gives a verbose display of what it is doing.\n";
|
|
print RUN "OPTS='$T -u -a $C $D $ex $in $bw --stats --progress'\n";
|
|
}
|
|
elsif ($options eq 'stats')
|
|
{
|
|
print RUN "# Does copy, not so verbose.\n";
|
|
print RUN "OPTS='-u -a $C $D $ex $in $bw --stats'\n";
|
|
}
|
|
elsif ($options eq 'quiet')
|
|
{
|
|
print RUN "# Copies and does no display at all.\n";
|
|
print RUN "OPTS='-u -a $C $D $ex $in $bw --quiet'\n";
|
|
}
|
|
|
|
if ($dbdump eq 'on')
|
|
{
|
|
print RUN "# dump mysql tables\n";
|
|
print RUN "/sbin/e-smith/signal-event pre-backup\n";
|
|
print RUN "\n";
|
|
}
|
|
|
|
print RUN " echo 'Begin rsync transfer.'\n";
|
|
print RUN "\n";
|
|
|
|
#senddirs','sendservers','receivedirs','receiveservers
|
|
if ($method eq 'senddirs')
|
|
{
|
|
foreach (sort @localdirlist)
|
|
{
|
|
my $remoteport = db_get_prop(\%dungog, "remoteport", $remoteserver) || '22';
|
|
|
|
# this server sends [directories to a server]\n";
|
|
print RUN " echo ''\n";
|
|
print RUN " echo 'Sending $_ to $remoteserver.'\n";
|
|
print RUN " /usr/bin/rsync $OPTS -e \"ssh -p $remoteport\" $_ $remoteserver:$remotedir\n";
|
|
print RUN "\n";
|
|
|
|
}
|
|
}
|
|
elsif ($method eq 'sendservers')
|
|
{
|
|
foreach (sort @remoteserverlist)
|
|
{
|
|
my $remoteport = db_get_prop(\%dungog, "remoteport", $_) || '22';
|
|
|
|
# this server sends [one dir to servers]\n";
|
|
print RUN " echo ''\n";
|
|
print RUN " echo 'Sending $localdir to $_.'\n";
|
|
print RUN " /usr/bin/rsync $OPTS -e \"ssh -p $remoteport\" $localdir $_:$remotedir\n";
|
|
print RUN "\n";
|
|
}
|
|
}
|
|
elsif ($method eq 'receivedirs')
|
|
{
|
|
foreach (sort @remotedirlist)
|
|
{
|
|
my $remoteport = db_get_prop(\%dungog, "remoteport", $remoteserver) || '22';
|
|
|
|
# this server receives [dirs from servers]\n";
|
|
print RUN " echo ''\n";
|
|
print RUN " echo 'Receiving $_ from $remoteserver.'\n";
|
|
print RUN " /usr/bin/rsync $OPTS -e \"ssh -p $remoteport\" $remoteserver:$_ $localdir\n";
|
|
print RUN "\n";
|
|
}
|
|
|
|
}
|
|
elsif ($method eq 'receiveservers')
|
|
{
|
|
foreach (sort @remoteserverlist)
|
|
{
|
|
my $remoteport = db_get_prop(\%dungog, "remoteport", $_) || '22';
|
|
|
|
# this server receives [one dir from servers]\n";
|
|
print RUN " echo ''\n";
|
|
print RUN " echo 'Receiving $remotedir from $_.'\n";
|
|
print RUN " /usr/bin/rsync $OPTS -e \"ssh -p $remoteport\" $_:$remotedir $localdir\$_\n";
|
|
print RUN "\n";
|
|
}
|
|
}
|
|
elsif ($method eq 'senddirs2self')
|
|
{
|
|
print RUN "# WARNING, if mounting a 2nd drive make sure you test the mount point \n";
|
|
print RUN "# mounts correctly, or you risk filling up your first drive.\n";
|
|
print RUN "# You may want to issue a pre rsync command to mount /mnt/2nddrive \n";
|
|
print RUN "# \n";
|
|
foreach (sort @localdirlist)
|
|
{
|
|
# this server sends [directories to itself]\n";
|
|
print RUN "# run rsync \n";
|
|
print RUN " echo ''\n";
|
|
print RUN " echo 'Sending $_ to $conf{DomainName}'\n";
|
|
print RUN " /usr/bin/rsync $T -u -R -a -l $ex $in --no-whole-file $D --stats $_ $remotedir\n";
|
|
print RUN "\n";
|
|
}
|
|
}
|
|
print RUN " echo 'Ending rsync transfer.'\n";
|
|
print RUN "\n";
|
|
|
|
if ($dbdump eq 'on')
|
|
{
|
|
print RUN "/sbin/e-smith/signal-event post-backup\n";
|
|
print RUN "\n";
|
|
}
|
|
|
|
if ($post ne '')
|
|
{
|
|
print RUN "# post rsync command\n";
|
|
print RUN "$post\n";
|
|
print RUN "\n";
|
|
}
|
|
|
|
close RUN;
|
|
chmod 0755, $fname;
|
|
system("/bin/chown $user $fname");
|
|
|
|
exit (0);
|