File vaultwarden.spec of Package vaultwarden

%define pkg_name vaultwarden

Name:      %{pkg_name}
Version:   1.34.3
Release:   0
License:   AGPL-3.0
Summary:   Unofficial Bitwarden compatible server written in Rust
Url:       https://github.com/dani-garcia/vaultwarden
Group:     Applications/System
Source0:   %{pkg_name}-%{version}.tar.gz
Source1:   vendor.tar.xz
Source2:   rust-1.89.0-x86_64-unknown-linux-gnu.tar.gz
Source10:  %{pkg_name}.service
Source11:  %{pkg_name}.logrotate
Source100: %{pkg_name}.cfg
Patch0:    default-webvault-path.patch

BuildRequires: systemd
BuildRequires: tar
BuildRequires: sed
BuildRequires: git
BuildRequires: pkgconfig(openssl)
%if 0%{?fedora} || 0%{?rhel_version} > 700 || 0%{?centos_version} > 700
BuildRequires: sqlite-devel
BuildRequires: mariadb-connector-c-devel
BuildRequires: libpq-devel
%endif
%if 0%{?centos_version} == 700 || 0%{?rhel_version} == 700
BuildRequires: sqlite-devel
BuildRequires: mariadb-devel
%endif
%if 0%{?sle_version} || 0%{?suse_version}
BuildRequires: sqlite3-devel
BuildRequires: libmariadb-devel
BuildRequires: libpqxx-devel
%endif
%if 0%{?centos_version} == 700
BuildRequires: libpqxx-devel
%endif
%if 0%{?sle_version} || 0%{?rhel_version} == 700
BuildRequires: postgresql-devel
%endif

%if 0%{?fedora} || 0%{?rhel_version} || 0%{?centos_version}
Requires(pre): shadow-utils
%else
Requires(pre): shadow
%endif
Requires: systemd
%if 0%{?fedora} || 0%{?rhel_version} > 700 || 0%{?centos_version} > 700
Requires: mariadb-connector-c
Requires: libpq
%endif
%if 0%{?centos_version} == 700 || 0%{?rhel_version} == 700
Requires: postgresql-libs
Requires: mariadb-libs
%endif
%if 0%{?sle_version} || 0%{?suse_version}
Requires: libmariadb3
Requires: libpq5
%endif


Conflicts:  bitwarden
Conflicts:  bitwarden-rs
%if ! 0%{?rhel_version} == 700 && ! 0%{?centos_version} == 700
Recommends: %{pkg_name}-webvault
Suggests:   logrotate
Provides:   bitwarden
Provides:   bitwarden-rs
%endif

BuildRoot: %{_tmppath}/%{pkg_name}-%{version}-%{release}-root
%{?systemd_ordering}

%description
Alternative implementation of the Bitwarden server API written in Rust and compatible with upstream Bitwarden clients, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal.

%prep
%{__tar} -xf %{SOURCE0} --strip-components 1
%{__tar} -xf %{SOURCE1}
%{__tar} -xf %{SOURCE2}

%{__sed} -i 's#<sed-target-1>#%{_datarootdir}/%{pkg_name}/web-vault#' %{PATCH0}
%patch -P 0 -p 1

%build
./rust*/install.sh --components=cargo,rustc,rust-std-x86_64-unknown-linux-gnu --disable-ldconfig --prefix=%{_builddir}/rust
export PATH=%{_builddir}/rust/bin:$PATH
export VW_VERSION=%{version}
cargo build --features sqlite,mysql,postgresql --offline --release --target-dir %{_builddir}/%{pkg_name}-%{version}/target

%{__sed} -i 's#<sed-target-1>#%{_bindir}#' %{SOURCE10}
%{__sed} -i 's#<sed-target-2>#%{_sysconfdir}/%{pkg_name}#' %{SOURCE10}
%{__sed} -i 's#<sed-target-3>#%{_sharedstatedir}/%{pkg_name}#' %{SOURCE10}
%{__sed} -i 's#<sed-target-4>#%{_sysconfdir}/%{pkg_name}#' %{SOURCE10}
%{__sed} -i 's#<sed-target-1>#%{_localstatedir}/log/%{pkg_name}#' %{SOURCE11}
%{__sed} -i 's#<sed-target-1>#%{_sharedstatedir}/%{pkg_name}#' %{SOURCE100}
%{__sed} -i 's#<sed-target-2>#%{_datarootdir}/%{pkg_name}/web-vault#' %{SOURCE100}
%{__sed} -i 's#<sed-target-3>#%{_localstatedir}/log/%{pkg_name}#' %{SOURCE100}

%install
install -m 755 -d %{buildroot}%{_bindir}
install -m 750 -d %{buildroot}%{_sharedstatedir}/%{pkg_name}
install -m 750 -d %{buildroot}%{_localstatedir}/log/%{pkg_name}
install -m 755 -d %{buildroot}%{_sbindir}
install -m 750 -d %{buildroot}%{_sysconfdir}/%{pkg_name}

install -D -m 750 %{_builddir}/%{pkg_name}-%{version}/target/release/%{pkg_name} %{buildroot}%{_bindir}/%{pkg_name}
install -D -m 644 %{SOURCE10} %{buildroot}%{_unitdir}/%{pkg_name}.service
install -D -m 644 %{SOURCE11} %{buildroot}%{_sysconfdir}/logrotate.d/%{pkg_name}
install -D -m 640 %{SOURCE100} %{buildroot}%{_sysconfdir}/%{pkg_name}/%{pkg_name}.cfg

%{__ln_s} -f %{_sbindir}/service %{buildroot}%{_sbindir}/rc%{pkg_name}

%check


%pre
%systemd_pre %{pkg_name}.service
getent group %{pkg_name} >/dev/null || groupadd -r %{pkg_name}
getent passwd %{pkg_name} >/dev/null || useradd -r -g %{pkg_name} -d %{_sharedstatedir}/%{pkg_name} -s /sbin/nologin -c "user for %{pkg_name}" %{pkg_name}
exit 0

%preun
%systemd_preun %{pkg_name}.service

%post
%systemd_post %{pkg_name}.service
systemctl enable %{pkg_name}.service
systemctl start %{pkg_name}.service

%postun
%systemd_postun %{pkg_name}.service

%files
%defattr(-,root,root,-)
%{_unitdir}/%{pkg_name}.service
%{_sbindir}/rc%{pkg_name}
%config(noreplace) %{_sysconfdir}/logrotate.d/%{pkg_name}
%dir %attr(750,%{pkg_name},%{pkg_name}) %{_sysconfdir}/%{pkg_name}
%config(noreplace) %attr(-,%{pkg_name},%{pkg_name}) %{_sysconfdir}/%{pkg_name}/*
%dir %attr(750,%{pkg_name},%{pkg_name}) %{_sharedstatedir}/%{pkg_name}/
%dir %attr(750,%{pkg_name},%{pkg_name}) %{_localstatedir}/log/%{pkg_name}/
%attr(550,%{pkg_name},%{pkg_name}) %{_bindir}/%{pkg_name}
openSUSE Build Service is sponsored by