Last active
January 1, 2022 23:09
-
-
Save geek-at/f4534066bebff3fd67022d8295e5f3e0 to your computer and use it in GitHub Desktop.
PHP script to receive all zfs snapshot of dataset from remote machine to local
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
$remoteIP = $argv[1]; | |
$remoteDataset = $argv[2]; | |
$localDataset = $argv[3]; | |
if($argc!=4) exit('usage: php sync.php <remote ip> <remote dataset> <local dataset>'.PHP_EOL); | |
$cmd_zfs = "zfs list -t snapshot $remoteDataset | cut -d ' ' -f 1 | cut -d '@' -f 2 | tail -n +2"; | |
$cmd_zfs_local = "zfs list -t snapshot $localDataset | cut -d ' ' -f 1 | cut -d '@' -f 2 | tail -n +2"; | |
$cmd_ssh = "ssh $remoteIP $cmd_zfs"; | |
$remotesnapshots = []; | |
exec($cmd_ssh,$remotesnapshots); | |
$localsnapshots = []; | |
exec($cmd_zfs_local,$localsnapshots); | |
$tosync = array_diff($remotesnapshots,$localsnapshots); | |
if(count($tosync)<1) exit("[i] Nothing to sync. Exiting\n"); | |
$snapshot = end($tosync); | |
$lastincommon = getLastInCommon($remotesnapshots,$localsnapshots,$snapshot); | |
if(!$lastincommon) | |
{ | |
echo "[i] Don't have any snapshots of that dataset yet. I'll sync initial\n"; | |
$firstsnap = $remotesnapshots[0]; | |
$synccmd = "ssh $remoteIP zfs send -w $remoteDataset@$firstsnap | zfs receive -F $localDataset"; | |
echo "$synccmd\n"; | |
system($synccmd); | |
exit(); | |
} | |
echo "[i] Syncing from $lastincommon to $snapshot\n"; | |
$synccmd = "ssh $remoteIP zfs send -w -I $remoteDataset@$lastincommon $remoteDataset@$snapshot | zfs receive -F $localDataset"; | |
echo "$synccmd\n"; | |
system($synccmd); | |
function getLastInCommon($remote,$local,$target) | |
{ | |
$incommon = []; | |
foreach($remote as $key=>$rsnap) | |
{ | |
foreach($local as $lkey=>$lsnap) | |
{ | |
if($rsnap == $lsnap) | |
$incommon[] = $rsnap; | |
if($lsnap==$target) break; | |
} | |
} | |
return end($incommon); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment