Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packaging/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
*.tar.gz
*.rpm
/results_openvox-server
/puppetserver-*
42 changes: 42 additions & 0 deletions packaging/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Building RPM packaging

This layout is compatible with [fedpkg](https://pagure.io/fedpkg/).

## Creating an SRPM

First you need the source files

```sh
spectool -g openvox-server.spec
```

Then you can use fedpkg to create the SRPM:

```sh
fedpkg srpm
```

## Building locally

Using mock it's easy to build locally.

```sh
fedpkg mockbuild --enable-network
```

Now you can find your files in `results_openvox-server`.

By default the above builds using Fedora Rawhide, but the release can be specified:

```sh
fedpkg --release epel10 mockbuild --enable-network
```

## Building in COPR

This again relies on having the source present.
It is needed to enable network access during the build.

```sh
fedpkg copr-build ekohl/openvox8 -- --enable-net on
```
284 changes: 284 additions & 0 deletions packaging/openvox-server.spec
Original file line number Diff line number Diff line change
@@ -0,0 +1,284 @@
%global agentvendordir /opt/puppetlabs/puppet/lib/ruby/vendor_gems
%global serverdir /opt/puppetlabs/server
# TODO use datadir variable?
%global appdir %{serverdir}/apps/puppetserver
# TODO use name variable?
%global etcdir %{_sysconfdir}/puppetlabs/puppetserver
%global service puppetserver

%global __requires_exclude_from .+/vendored-jruby-gems/bin/.*$

Name: openvox-server
Version: 8.10.0
Release: 1%{?dist}
Summary: Server component for OpenVox agents
License: Apache-2.0
URL: https://voxpupuli.org
Source0: https://artifacts.voxpupuli.org/%{name}/%{version}/%{name}-%{version}.tar.gz
Source1: openvox-server.sysusers

BuildArch: noarch

%if 0%{?rhel} && 0%{?rhel} < 9
BuildRequires: systemd
%else
BuildRequires: systemd-rpm-macros
%endif

%if 0%{?sles_version}
BuildRequires: sysuser-tools
%sysusers_requires
%else
%{?sysusers_requires_compat}
%endif

%if 0%{?sles_version}
%global java java-11-openjdk-headless
%elif 0%{?rhel} >= 10 || 0%{?fedora}
%global java jre-21-headless
%global java_bin /usr/lib/jvm/jre-21/bin/java
%else
%if 0%{?rhel} == 7
%global java jre-11-headless
%global java_bin /usr/lib/jvm/jre-11/bin/java
%else
%global java jre-17-headless
%global java_bin /usr/lib/jvm/jre-17/bin/java
%endif
%endif
BuildRequires: %{java}

%if 0%{?amzn}
Requires: tzdata-java
%endif

Requires: %{java}
# First version to include OpenFact
Requires: openvox-agent >= 8.21.1

Provides: puppetserver
Obsoletes: puppetserver < 9

%description
Server component

%prep
# inside the tarball there's still puppetserver
%setup -n puppetserver-%{version}

%build
%if 0%{?java_bin:1}
sed -i 's|/usr/bin/java|%{java_bin}|' ext/redhat/puppetserver.service
sed -i 's|java|%{java_bin}|' ext/build-scripts/install-vendored-gems.sh
%endif

%if 0%{?sles_version}
%sysusers_generate_pre %{SOURCE1} puppet %{name}.conf
%endif

%install
# TODO: this needs internet access
DESTDIR=%{buildroot} bash ext/build-scripts/install-vendored-gems.sh

# Clean up vendored gems
rm -rf %{buildroot}%{serverdir}/data/puppetserver/vendored-jruby-gems/gems/*/.github
rm -rf %{buildroot}%{serverdir}/data/puppetserver/vendored-jruby-gems/gems/gettext-*/samples
rm -rf %{buildroot}%{serverdir}/data/puppetserver/vendored-jruby-gems/gems/locale-*/samples

# Clean up shebangs - based on brp-mangle-shebangs
%if 0%{?java_bin:1}
java_shebang=$(realpath %{java_bin})
%else
java_shebang=$(realpath /usr/bin/java)
%endif
find %{buildroot}%{serverdir} %{buildroot}%{agentvendordir} -executable -type f ! -path '*:*' ! -path $'*\n*' \
| file -N --mime-type -f - \
| grep -P ".+(?=: (text/|application/javascript))" \
| {
while IFS= read -r line; do
f=${line%%:*}

# Remove the dot
path="${f#.}"


if ! read shebang_line < "$f"; then
echo >&2 "*** WARNING: Cannot read the first line from $f, removing executable bit"
ts=$(stat -c %y "$f")
chmod -x "$f"
touch -d "$ts" "$f"
continue
fi

orig_shebang="${shebang_line#\#!}"
if [ "$orig_shebang" = "$shebang_line" ]; then
echo >&2 "*** WARNING: $f is executable but has no shebang, removing executable bit"
ts=$(stat -c %y "$f")
chmod -x "$f"
touch -d "$ts" "$f"
continue
fi

# Trim spaces
while shebang="${orig_shebang// / }"; [ "$shebang" != "$orig_shebang" ]; do
orig_shebang="$shebang"
done
# Treat "#! /path/to " as "#!/path/to"
orig_shebang="${orig_shebang# }"

shebang="$orig_shebang"

if [ -z "$shebang" ]; then
echo >&2 "*** WARNING: $f is executable but has empty shebang, removing executable bit"
ts=$(stat -c %y "$f")
chmod -x "$f"
touch -d "$ts" "$f"
continue
fi
if [ -n "${shebang##/*}" ]; then
echo >&2 "*** ERROR: $f has shebang which doesn't start with '/' ($shebang)"
continue
fi

# TODO: look at $java_shebang
#if ! { echo "$shebang" | grep -q -P "^/(?:usr/)?(?:bin|sbin)/"; }; then
# continue
#fi

# Replace "special" env shebang:
# /whatsoever/env -whatever /whatever/foo → /whatever/foo
shebang=$(echo "$shebang" | sed -r -e 's@^(.+)/env( -[^ ]+)* /(.+)$@/\3@')
# /whatsoever/env -whatever foo → /whatsoever/foo
shebang=$(echo "$shebang" | sed -r -e 's@^(.+/)env( -[^ ]+)* (.+)$@\1\3@')

if [ "$shebang" = "/usr/bin/ruby" ] ; then
shebang=/opt/puppetlabs/puppet/bin/ruby
elif [[ "$shebang" == "${java_shebang}"* ]] ; then
# Something looks for the realpath but we want to use the symlink
shebang="%{java_bin}${shebang#${java_shebang}}"
fi

if [ "#!$shebang" != "#!$orig_shebang" ]; then
echo "mangling shebang in $path from $orig_shebang to #!$shebang"
ts=$(stat -c %y "$f")
sed -i -e "1c #!$shebang" "$f"
touch -d "$ts" "$f"
fi

done
}

install -p -D -m 0644 puppet-server-release.jar %{buildroot}%{appdir}/puppet-server-release.jar
install -p -D -m 0644 ext/system-config/services.d/bootstrap.cfg %{buildroot}%{appdir}/config/services.d/bootstrap.cfg

install -p -D -m 0644 ext/ezbake.manifest %{buildroot}%{_docdir}/%{name}/ezbake.manifest

install -p -D -m 0755 ext/bin/puppetserver %{buildroot}/opt/puppetlabs/bin/puppetserver
# TODO: should rubygem-puppetserver-ca actually ship this file?
install -p -D -m 0755 ext/cli/ca %{buildroot}%{appdir}/cli/apps/ca
install -p -D -m 0755 ext/cli/irb %{buildroot}%{appdir}/cli/apps/irb
install -p -D -m 0755 ext/cli/gem %{buildroot}%{appdir}/cli/apps/gem
install -p -D -m 0755 ext/cli/prune %{buildroot}%{appdir}/cli/apps/prune
install -p -D -m 0755 ext/cli/ruby %{buildroot}%{appdir}/cli/apps/ruby

install -p -D -m 0644 %{SOURCE1} %{buildroot}%{_sysusersdir}/%{name}.conf
install -p -D -m 0644 ext/redhat/puppetserver.service %{buildroot}%{_unitdir}/%{service}.service
install -p -D -m 0644 ext/default %{buildroot}%{_sysconfdir}/sysconfig/%{service}

mkdir -p -m 0755 %{buildroot}%{etcdir}/ca
install -p -D -m 0644 ext/config/conf.d/auth.conf %{buildroot}%{etcdir}/conf.d/auth.conf
install -p -D -m 0644 ext/config/conf.d/ca.conf %{buildroot}%{etcdir}/conf.d/ca.conf
install -p -D -m 0644 ext/config/conf.d/global.conf %{buildroot}%{etcdir}/conf.d/global.conf
install -p -D -m 0644 ext/config/conf.d/metrics.conf %{buildroot}%{etcdir}/conf.d/metrics.conf
install -p -D -m 0644 ext/config/conf.d/puppetserver.conf %{buildroot}%{etcdir}/conf.d/puppetserver.conf
install -p -D -m 0644 ext/config/conf.d/web-routes.conf %{buildroot}%{etcdir}/conf.d/web-routes.conf
install -p -D -m 0644 ext/config/conf.d/webserver.conf %{buildroot}%{etcdir}/conf.d/webserver.conf

install -p -D -m 0644 ext/config/request-logging.xml %{buildroot}%{etcdir}/request-logging.xml
install -p -D -m 0644 ext/config/logback.xml %{buildroot}%{etcdir}/logback.xml

install -p -D -m 0644 ext/config/services.d/ca.cfg %{buildroot}%{etcdir}/services.d/ca.cfg

mkdir -p -m 0755 %{buildroot}%{serverdir}/data/puppetserver/{yaml,jars}

%pre
%if 0%{?rhel} >= 9 || 0%{?fedora}
%sysusers_create_compat %{SOURCE1}
%elif 0{?sles_version}
%{name}.pre
%service_add_pre %{service}.service
%else
%sysusers_create_package %{name} %{SOURCE1}
%endif

%post
%if 0%{?rhel} || 0%{?fedora}
%systemd_post %{service}.service
%elif 0{?sles_version}
%service_add_post %{service}.service
%endif

if [ "$1" = "1" ]; then
: # Null command in case additional_postinst_install is empty
#install --directory /etc/puppetlabs/puppet/ssl
#chown -R puppet:puppet /etc/puppetlabs/puppet/ssl
#find /etc/puppetlabs/puppet/ssl -type d -print0 | xargs -0 chmod 770
fi

%preun
%if 0%{?rhel} || 0%{?fedora}
%systemd_preun %{service}.service
%elif 0{?sles_version}
%service_del_preun %{service}.service
%endif

%postun
%if 0%{?rhel} || 0%{?fedora}
%systemd_postun_with_restart %{service}.service
%elif 0{?sles_version}
%service_del_postun %{service}.service
%endif

%files
# apps
/opt/puppetlabs/bin/puppetserver
%{appdir}/cli/apps

# service
%{appdir}/config/services.d/bootstrap.cfg
%{appdir}/puppet-server-release.jar

%dir %attr(0775,puppet,puppet) %{serverdir}/data
%dir %attr(0775,puppet,puppet) %{serverdir}/data/puppetserver
%dir %attr(0700,puppet,puppet) %{serverdir}/data/puppetserver/jars
%dir %attr(0750,puppet,puppet) %{serverdir}/data/puppetserver/yaml

# TODO: LICENSE
%doc %{_docdir}/%{name}/ezbake.manifest

# vendored gems
%agentvendordir
%attr(0755,puppet,puppet) %{serverdir}/data/puppetserver/vendored-jruby-gems
%exclude %{serverdir}/data/puppetserver/vendored-jruby-gems/cache

# systemd
%{_sysusersdir}/%{name}.conf
%{_unitdir}/%{service}.service
%config(noreplace) %{_sysconfdir}/sysconfig/%{service}

# configs
# TODO: why owned by puppet?
%dir %attr(0750,puppet,puppet) %{etcdir}/ca
%config(noreplace) %{etcdir}/conf.d/auth.conf
%config(noreplace) %{etcdir}/conf.d/ca.conf
%config(noreplace) %{etcdir}/conf.d/global.conf
%config(noreplace) %{etcdir}/conf.d/metrics.conf
%config(noreplace) %{etcdir}/conf.d/puppetserver.conf
%config(noreplace) %{etcdir}/conf.d/web-routes.conf
%config(noreplace) %{etcdir}/conf.d/webserver.conf
%config(noreplace) %{etcdir}/logback.xml
%config(noreplace) %{etcdir}/request-logging.xml
%config(noreplace) %{etcdir}/services.d/ca.cfg

%changelog
%autochangelog
1 change: 1 addition & 0 deletions packaging/openvox-server.sysusers
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
u puppet 52 "Puppet" /opt/puppetlabs/server/data/puppetserver /sbin/nologin
Loading