File dd_rescue.spec of Package dd_rescue

#
# spec file for package ddrescue (Version 1.99_0.3.0)
#
# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
# package are under the same license as the package itself.
#
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#

Name:           dd_rescue
%define	ddrescuever 1.99.21
%define ddrhelpver 0.3.0
Version:        1.99_0.3.0
Release:        8
License:        GPL-2.0+
Group:          System/Base
# ddrescue was last used in openSUSE 11.4 (version 1.14_0.0.6)
Provides:       ddrescue = %{version}
Obsoletes:	ddrescue < %{version}
Autoreqprov:    on
Requires:       bc
%if 0%{?suse_version} >= 1100
Recommends:	libfallocate0
Recommends:	dd_rescue-lzo
Recommends:	dd_rescue-lzma
Recommends:	dd_rescue-crypt
%endif
BuildRequires:	autoconf
BuildRequires:	libfallocate-devel 
BuildRequires:	libattr-devel
%if 0%{?rhel_version} < 800 && 0%{?centos_version} < 800 && 0%{?suse_version} < 1600
BuildRequires:	python
%else
%if 0%{?suse_version} >= 1600
BuildRequires:  python3
%endif
%endif
# dd_rhelp.test needs a few more
BuildRequires:	bc
BuildRequires:	util-linux
BuildRequires:	grep
BuildRequires:	openssl
%if 0%{?suse_version} > 0
BuildRequires:	libopenssl-devel
%else
BuildRequires:	openssl-devel
%endif
#%if 0%{?rhel_version} != 600
BuildRequires:	lzo-devel
#%endif
%if 0%{?suse_version} > 1210
BuildRequires:	lzop
%endif
%if 0%{?fedora_version} >= 19
BuildRequires:	lzop strace
%define ext_man .gz
%endif
BuildRequires:	xz-devel
%if 0%{?rhel_version} == 600 
# || 0%{?fedora_version} > 10
BuildRequires:  -libcom_err2
BuildRequires:  -libext2fs2
BuildRequires:	-e2fsprogs
%endif
Summary:        Data Recovery and Data Protection Tool
Url:		http://www.garloff.de/kurt/linux/ddrescue/
Source0:         http://www.garloff.de/kurt/linux/ddrescue/%{name}-%{ddrescuever}.tar.bz2
Source1:        http://garloff.de/ku3t/linux/ddrescue/%{name}-%{ddrescuever}.tar.bz2.asc
Source2:        %{name}.keyring
Source10:       dd_rhelp-%{ddrhelpver}.tar.gz
Source99:       %{name}.changes
Patch4:		dd_rhelp_EOF.diff
Patch5:		dd_rhelp_Summary.diff
Patch6:		dd_rhelp.test.diff
Patch7:		dd_r_version.diff
BuildRoot:      %{_tmppath}/%{name}-%{version}-build

%description
dd_rescue helps when the situation is desperate: your disk has crashed 
and you try to copy it over to another one. While standard Unix tools 
like cp, cat, and dd will abort on every I/O error, dd_rescue does not.
It optimizes copying by using large blocks as long as no errors occur
and falls back to smaller blocks. It supports reverse direction copying
(to approach a bad spot from the top), sparse copying, preallocating
space, splice zerocopy, and bypassing the kernel pagecache with O_DIRECT.

dd_rescue also has some data protection functionality by (multiply)
overwriting files (or disks) with fast random numbers.

dd_rescue supports plugins; currently a hash, an lzo, an lzma and a crypt
plugin exist, supporting on the fly hash/HMAC calculation/validation, lzo
de/compression and de/encryption. The lzo plugin is packaged in the 
dd_rescue-lzo, the crypt plugin in the dd_rescue-crypt subpackage,
lzma ends up in the dd_rescue-lzma subpackage.

This RPM also bundles a helper script dd_rhelp from Lab Valentin that
intelligently controls dd_rescue to first copy all blocks from areas 
that work and only then tries to approach the bad spots from both 
sides.

Authors:
--------
    Kurt Garloff <kurt@garloff.de>
    Lab Valentin <vaab@free.fr>

%package crypt 
Summary: En/Decryption plugin for dd_rescue
Group: System/Base
Requires: dd_rescue = %{version}

%description crypt
This plugin allows you do de/encrypt files during recovery copying
with dd_rescue using the AES family of algorithms. The plugin
supports various numbers of bits and rounds and uses the x86 AESNI
and ARMv8 AES CPU crypto support if available.

The plugin does offer a variety of options to handle the keys
and IVs including the generating keys from password and salt. 

Authors:
--------
    Kurt Garloff <kurt@garloff.de>

%package lzo
Summary: LZO de/compression plugin for dd_rescue
Group: System/Base
Requires: dd_rescue = %{version}

%description lzo
This plugin allows you do de/compress files during recovery copying
with dd_rescue using the lzo family of algorithms. lzo algorithms
are very fast to decompress and most algorithms are very fast to
compress as well -- at the expense of somewhat worse compression than
zlib's deflate.

The plugin does offer a variety of options to handle corrupted .lzo
files with some grace; it does skip over bad blocks (if the block
headers are still intact) by default, but does offer an option (nodiscard)
to allow to attempt decompression on faulty input, hoping to produce
some usable bytes. It can also search for valid block headers after
synchronization has been lost due to a corrupt one.

The plugin also handles sparse files (files with holes) and supports
appending to .lzo files, so it fits neatly into dd_rescue.

Some fuzz testing has been applied to the plugin's decompression routines,
though more will have to be done to feel confident about feeding untrusted
data to the decompressor; the plugin is still young and might expose bugs.

Authors:
--------
    Kurt Garloff <kurt@garloff.de>

%package lzma
Summary: LZMA (xz) de/compression plugin for dd_rescue
Group: System/Base
Requires: dd_rescue = %{version}

%description lzma
This plugin allows you do de/compress files during recovery copying
with dd_rescue using the lzma compression algorithm. The lzma algorithm
is fairly slow when compressing, but achieves a good compression ratio.
Decompression is much faster.

This plugin is still new and may not be very mature yet. It may be
a bad idea to feed it with untrusted data, especially when running
with elevated privileges.

Authors:
--------
    Dmitrii Ivanov <dsivanov_9@edu.hse.ru>
    Kurt Garloff <kurt@garloff.de>

%prep
%setup -n dd_rescue-%{ddrescuever} -b10
./autogen.sh
FAKE_BUILDTIME=$(LC_ALL=C date -u -r %{SOURCE99} '+%%H:%%M')
FAKE_BUILDDATE=$(LC_ALL=C date -u -r %{SOURCE99} '+%%b %%e %%Y')
sed -i "s/__TIME__/\"$FAKE_BUILDTIME\"/g" dd_rescue.c
sed -i "s/__DATE__/\"$FAKE_BUILDDATE\"/g" dd_rescue.c
# dd_rhelp
cd ../dd_rhelp-%{ddrhelpver}
%patch -P4 -p1
%patch -P5 -p1
%patch -P6 -p1
%patch -P7 -p1
for name in FAQ NEWS README THANKS TODO ChangeLog; do
	cp -p $name ${name}.dd_rhelp
done

%build
%ifarch %arm
export RPM_OPT_FLAGS=$(echo "$RPM_OPT_FLAGS" | sed 's/\-flto[^ ]*//g')
%endif
%if 0%{?suse_version} > 0
echo "SUSE %{suse_version}"
%if %{suse_version} < 1400
export RPM_OPT_FLAGS="$RPM_OPT_FLAGS -std=gnu99"
%if %{suse_version} == 1230
export RPM_OPT_FLAGS="$RPM_OPT_FLAGS -DDO_OWN_DETECT"
%endif
%endif
%endif
%if 0%{?rhel_version} > 0 && 0%{?rhel_version} < 800
export RPM_OPT_FLAGS="$RPM_OPT_FLAGS -std=gnu99"
%endif
make %{?_smp_mflags} RPM_OPT_FLAGS="$RPM_OPT_FLAGS" LIBDIR=%{_libdir}
#cd ../dd_rhelp-%{ddrhelpver}

%install
make install DESTDIR=$RPM_BUILD_ROOT LIB=%{_lib} LIBDIR=%{_libdir} INSTASROOT= INSTALLFLAGS=
cd ../dd_rhelp-%{ddrhelpver}
#make install DESTDIR=$RPM_BUILD_ROOT bindir=/bin
install -m 0755 dd_rhelp $RPM_BUILD_ROOT/usr/bin/

%check
%ifarch %arm
export RPM_OPT_FLAGS=$(echo "$RPM_OPT_FLAGS" | sed 's/\-flto[^ ]*//g')
%endif
%if 0%{?suse_version} > 0
%if %{suse_version} < 1400
export RPM_OPT_FLAGS="$RPM_OPT_FLAGS -std=gnu99"
%if %{suse_version} == 1230
export RPM_OPT_FLAGS="$RPM_OPT_FLAGS -DDO_OWN_DETECT"
%endif
%endif
%endif
%if 0%{?rhel_version} > 0 && 0%{?rhel_version} < 800
export RPM_OPT_FLAGS="$RPM_OPT_FLAGS -std=gnu99"
%endif
make %{?_smp_mflags} RPM_OPT_FLAGS="$RPM_OPT_FLAGS" all
make RPM_OPT_FLAGS="$RPM_OPT_FLAGS" check
cd ../dd_rhelp-%{ddrhelpver}
export PATH=../dd_rescue-%{ddrescuever}:$PATH
%if 0%{?rhel_version} >= 500
alias which="type -p"
./dd_rhelp.test || true
%else
%if 0%{?suse_version} >= 1220
alias which="type -p"
./dd_rhelp.test || true
%else
./dd_rhelp.test
%endif
%endif

%files
%defattr(-,root,root)
/usr/bin/dd_rescue
/usr/bin/dd_rhelp
%{_libdir}/libddr_hash.so
%{_libdir}/libddr_MD5.so
%{_libdir}/libddr_null.so
%doc README.dd_rescue TODO
%doc ../dd_rhelp-%{ddrhelpver}/*.dd_rhelp
%doc ../dd_rhelp-%{ddrhelpver}/doc
%{_mandir}/man1/dd_rescue.1%{ext_man}

%files crypt
%defattr(-,root,root)
%{_mandir}/man1/ddr_crypt.1%{ext_man}
%{_libdir}/libddr_crypt.so
# I'd like to put those two files in dd_rescue docdir not separate
# but there does not seem to be a simple way ...
#% define %_docdir_fmt dd_rescue
%doc PADDING CRYPT_TODO

%files lzo
%defattr(-,root,root)
%{_mandir}/man1/ddr_lzo.1%{ext_man}
#%if 0%{?rhel_version} != 600
%{_libdir}/libddr_lzo.so
#%endif

%files lzma
%defattr(-,root,root)
%{_mandir}/man1/ddr_lzma.1%{ext_man}
#%if 0%{?rhel_version} != 600
%{_libdir}/libddr_lzma.so
#%endif

%changelog
* Fri Oct 15 1999 - garloff@suse.de
- Initial release: 0.98.
openSUSE Build Service is sponsored by