Files
quantenzitrone e739993fea storebackup: enable strictDeps, split phases
the result only changes in the outpath (creating diff in all wrapped binaries)
and in some of the shebangs due to relying on patchShebangs instead of manually
patching them with sed
2026-07-20 20:18:39 +02:00

157 lines
3.9 KiB
Nix

{
lib,
stdenv,
which,
coreutils,
perl,
fetchurl,
makeWrapper,
diffutils,
writeScriptBin,
bzip2,
runtimeShellPackage,
}:
# quick usage:
# storeBackup.pl --sourceDir /home/user --backupDir /tmp/my_backup_destination
# Its slow the first time because it compresses all files bigger than 1k (default setting)
# The backup tool is bookkeeping which files got compressed
# btrfs warning: you may run out of hardlinks soon
# known impurity: test cases seem to bu using /tmp/storeBackup.lock ..
let
dummyMount = writeScriptBin "mount" "#!${stdenv.shell}";
perl' = perl.withPackages (p: [ p.DBFile ]);
in
stdenv.mkDerivation (finalAttrs: {
version = "3.5.2";
pname = "storebackup";
__structuredAttrs = true;
enableParallelBuilding = true;
strictDeps = true;
nativeBuildInputs = [ makeWrapper ];
nativeInstallCheckInputs = [
diffutils
perl'
];
buildInputs = [
perl'
which
bzip2
runtimeShellPackage
];
src = fetchurl {
url = "mirror://savannah/storebackup/storeBackup-${finalAttrs.version}.tar.bz2";
hash = "sha256-Ki1DT2zypFFiiMVd9Y8eSX7T+yr8moWMoALmAexjqWU=";
};
patches = [
# https://www.openwall.com/lists/oss-security/2020/01/20/3
./CVE-2020-7040.patch
];
installPhase = ''
runHook preInstall
mkdir -p $out/scripts
mv * $out
mv $out/_ATTENTION_ $out/doc
mv $out/{correct.sh,cron-storebackup} $out/scripts
runHook postInstall
'';
preFixup = ''
find $out -name "*.pl" -print0 | xargs --null sed -i \
-e 's@/bin/pwd@${coreutils}/bin/pwd@g' \
-e 's@/bin/sync@${coreutils}/bin/sync@g'
for p in $out/bin/*
do wrapProgram "$p" --prefix PATH ":" "${
lib.makeBinPath [
which
bzip2
]
}"
done
'';
doInstallCheck = true;
installCheckPhase = ''
runHook preInstallCheck
# do a dummy test ensuring this works
PATH=$PATH:${dummyMount}/bin
export USER=test
export HOME=$(mktemp -d)
{ # simple sanity test, test backup/restore of simple store paths
mkdir backup
backupRestore(){
source="$2"
echo =========
echo RUNNING TEST "$1" source: "$source"
mkdir restored
$out/bin/storeBackup.pl --sourceDir "$source" --backupDir backup
latestBackup=backup/default/$(ls -1 backup/default | sort | tail -n 1)
$out/bin/storeBackupRecover.pl -b "$latestBackup" -t restored -r /
diff -r "$source" restored
# storeBackupCheckSource should return 0
$out/bin/storeBackupCheckSource.pl -s "$source" -b "$latestBackup"
# storeBackupCheckSource should return not 0 when using different source
! $out/bin/storeBackupCheckSource.pl -s $TMP -b "$latestBackup"
# storeBackupCheckBackup should return 0
$out/bin/storeBackupCheckBackup.pl -c "$latestBackup"
chmod -R +w restored
rm -fr restored
}
testDir=$HOME/testDir
mkdir $testDir
echo X > $testDir/X
ln -s ./X $testDir/Y
backupRestore 'test 1: backup, restore' $testDir
# test huge blocks, according to docs files bigger than 100MB get split
# into pieces
dd if=/dev/urandom bs=100M of=block-1 count=1
dd if=/dev/urandom bs=100M of=block-2 count=1
cat block-1 block-2 > $testDir/block
backupRestore 'test 1 with huge block' $testDir
cat block-2 block-1 > $testDir/block
backupRestore 'test 1 with huge block reversed' $testDir
backupRestore 'test 2: backup, restore' $out
backupRestore 'test 3: backup, restore' $out
backupRestore 'test 4: backup diffutils to same backup locations, restore' ${diffutils}
}
runHook postInstallCheck
'';
meta = {
description = "Backup suite that stores files on other disks";
homepage = "https://savannah.nongnu.org/projects/storebackup";
license = lib.licenses.gpl3Plus;
maintainers = [ ];
platforms = lib.platforms.linux;
};
})