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}