1#!/bin/bash
2# Setup development environment for RPM based systems such as Red Hat, Centos, Fedora, openSUSE
3#
4# Wireshark - Network traffic analyzer
5# By Gerald Combs <gerald@wireshark.org>
6# Copyright 1998 Gerald Combs
7#
8# SPDX-License-Identifier: GPL-2.0-or-later
9#
10# We drag in tools that might not be needed by all users; it's easier
11# that way.
12#
13
14if [ "$1" = "--help" ]
15then
16	echo "\nUtility to setup a rpm-based system for Wireshark Development.\n"
17	echo "The basic usage installs the needed software\n\n"
18	echo "Usage: $0 [--install-optional] [...other options...]\n"
19	echo "\t--install-optional: install optional software as well"
20	echo "\t--install-rpm-deps: install packages required to build the .rpm file\\n"
21	echo "\t[other]: other options are passed as-is to the packet manager\n"
22	exit 1
23fi
24
25# Check if the user is root
26if [ $(id -u) -ne 0 ]
27then
28	echo "You must be root."
29	exit 1
30fi
31
32ADDITIONAL=0
33RPMDEPS=0
34for arg; do
35	case $arg in
36		--install-optional)
37			ADDITIONAL=1
38			;;
39		--install-rpm-deps)
40			RPMDEPS=1
41			;;
42		*)
43			OPTIONS="$OPTIONS $arg"
44			;;
45	esac
46done
47
48BASIC_LIST="cmake \
49	gcc \
50	gcc-c++ \
51	flex \
52	python3 \
53	perl \
54	desktop-file-utils \
55	git \
56	glib2-devel \
57	libpcap-devel \
58	zlib-devel \
59	libgcrypt-devel"
60
61ADDITIONAL_LIST="libcap-devel \
62	libssh-devel \
63	krb5-devel \
64	perl-Parse-Yapp \
65	snappy-devel \
66	minizip-devel \
67	lz4 \
68	libxml2-devel \
69	spandsp-devel \
70	systemd-devel"
71
72# Uncomment to add PNG compression utilities used by compress-pngs:
73# ADDITIONAL_LIST="$ADDITIONAL_LIST \
74#	advancecomp \
75#	optipng \
76#	oxipng \
77#	pngcrush"
78
79# XXX
80RPMDEPS_LIST="rpm-build"
81
82# Guess which package manager we will use
83for PM in zypper dnf yum ''; do
84	if type "$PM" >/dev/null 2>&1; then
85		break
86	fi
87done
88
89if [ -z $PM ]
90then
91	echo "No package managers found, exiting"
92	exit 1
93fi
94
95case $PM in
96	zypper)
97		PM_OPT="--non-interactive"
98		PM_SEARCH="search -x --provides"
99		;;
100	dnf)
101		PM_SEARCH="info"
102		;;
103	yum)
104		PM_SEARCH="info"
105		;;
106esac
107
108echo "Using $PM ($PM_SEARCH)"
109
110# Adds package $2 to list variable $1 if the package is found
111add_package() {
112	local list="$1" pkgname="$2"
113
114	# fail if the package is not known
115	$PM $PM_SEARCH "$pkgname" &> /dev/null || return 1
116
117	# package is found, append it to list
118	eval "${list}=\"\${${list}} \${pkgname}\""
119}
120
121# Adds packages $2-$n to list variable $1 if all the packages are found
122add_packages() {
123	local list="$1" pkgnames="${@:2}"
124
125	# fail if any package is not known
126	for pkgname in $pkgnames; do
127		$PM $PM_SEARCH "$pkgname" &> /dev/null || return 1
128	done
129
130	# all packages are found, append it to list
131	eval "${list}=\"\${${list}} \${pkgnames}\""
132}
133
134add_package BASIC_LIST cmake3 || add_package BASIC_LIST cmake ||
135echo "cmake is unavailable" >&2
136
137add_package BASIC_LIST glib2 || add_package BASIC_LIST libglib-2_0-0 ||
138echo "glib2 is unavailable" >&2
139
140# lua51, lua51-devel: OpenSUSE Leap 42.3 (lua would be fine too, as it installs lua52), OpenSUSE Leap 15.0 (lua installs lua53, so it wouldn't work)
141# compat-lua, compat-lua-devel: Fedora 28, Fedora 29, CentOS 8
142# lua, lua-devel: CentOS 7
143add_package BASIC_LIST lua51-devel || add_package BASIC_LIST compat-lua-devel || add_package BASIC_LIST lua-devel ||
144echo "lua devel is unavailable" >&2
145
146add_package BASIC_LIST lua51 || add_package BASIC_LIST compat-lua || add_package BASIC_LIST lua ||
147echo "lua is unavailable" >&2
148
149add_package BASIC_LIST libpcap || add_package BASIC_LIST libpcap1 ||
150echo "libpcap is unavailable" >&2
151
152add_package BASIC_LIST zlib || add_package BASIC_LIST libz1 ||
153echo "zlib is unavailable" >&2
154
155add_package BASIC_LIST c-ares-devel || add_package BASIC_LIST libcares-devel ||
156echo "libcares-devel is unavailable" >&2
157
158# qt5-linguist: CentOS, Fedora
159# libqt5-linguist-devel: OpenSUSE
160add_package BASIC_LIST qt5-linguist ||
161add_package BASIC_LIST libqt5-linguist-devel ||
162echo "Qt5 linguist is unavailable" >&2
163
164# qt5-qtmultimedia: CentOS, Fedora, pulls in qt5-qtbase-devel (big dependency list!)
165# libqt5-qtmultimedia-devel: OpenSUSE, pulls in Core, Gui, Multimedia, Network, Widgets
166# OpenSUSE additionally has a separate Qt5PrintSupport package.
167add_package BASIC_LIST qt5-qtmultimedia-devel ||
168add_packages BASIC_LIST libqt5-qtmultimedia-devel libQt5PrintSupport-devel ||
169echo "Qt5 is unavailable" >&2
170
171# This in only required (and available) on OpenSUSE
172add_package BASIC_LIST update-desktop-files ||
173echo "update-desktop-files is unavailable" >&2
174
175add_package BASIC_LIST perl-podlators ||
176echo "perl-podlators unavailable" >&2
177
178# rubygem-asciidoctor.noarch: Centos 7, Fedora
179# ruby2.5-rubygem-asciidoctor: openSUSE 15.2
180# You will get nothing and you will like it: CentOS 8
181add_package RPMDEPS_LIST rubygem-asciidoctor.noarch || add_package RPMDEPS_LIST ruby2.5-rubygem-asciidoctor ||
182echo "asciidoctor is unavailable" >&2
183
184
185# libcap: CentOS 7, Fedora 28, Fedora 29
186# libcap2: OpenSUSE Leap 42.3, OpenSUSE Leap 15.0
187add_package ADDITIONAL_LIST libcap || add_package ADDITIONAL_LIST libcap2 ||
188echo "libcap is unavailable" >&2
189
190add_package ADDITIONAL_LIST nghttp2-devel || add_package ADDITIONAL_LIST libnghttp2-devel ||
191echo "nghttp2 is unavailable" >&2
192
193add_package ADDITIONAL_LIST snappy || add_package ADDITIONAL_LIST libsnappy1 ||
194echo "snappy is unavailable" >&2
195
196add_package ADDITIONAL_LIST libzstd-devel || echo "zstd is unavailable" >&2
197
198add_package ADDITIONAL_LIST lz4-devel || add_package ADDITIONAL_LIST liblz4-devel ||
199echo "lz4 devel is unavailable" >&2
200
201add_package ADDITIONAL_LIST libcap-progs || echo "cap progs are unavailable" >&2
202
203add_package ADDITIONAL_LIST libmaxminddb-devel ||
204echo "MaxMind DB devel is unavailable" >&2
205
206add_package ADDITIONAL_LIST gnutls-devel || add_package ADDITIONAL_LIST libgnutls-devel ||
207echo "gnutls devel is unavailable" >&2
208
209add_package ADDITIONAL_LIST gettext-devel || add_package ADDITIONAL_LIST gettext-tools ||
210echo "Gettext devel is unavailable" >&2
211
212add_package ADDITIONAL_LIST perl-Pod-Html ||
213echo "perl-Pod-Html is unavailable" >&2
214
215add_package ADDITIONAL_LIST ninja || add_package ADDITIONAL_LIST ninja-build ||
216echo "ninja is unavailable" >&2
217
218add_package ADDITIONAL_LIST libxslt || add_package ADDITIONAL_LIST libxslt1 ||
219echo "xslt is unavailable" >&2
220
221add_package ADDITIONAL_LIST brotli-devel || add_packages ADDITIONAL_LIST libbrotli-devel libbrotlidec1 ||
222echo "brotli is unavailable" >&2
223
224add_package ADDITIONAL_LIST git-review ||
225echo "git-review is unavailabe" >&2
226
227add_package ADDITIONAL_LIST speexdsp-devel || add_package ADDITIONAL_LIST speex-devel ||
228echo "speex is unavailable" >&2
229
230add_package ADDITIONAL_LIST libnl3-devel || add_package ADDITIONAL_LIST libnl-devel ||
231echo "libnl3/libnl are unavailable" >&2
232
233add_package ADDITIONAL_LIST ilbc-devel ||
234echo "ilbc is unavailable" >&2
235
236# opus-devel: RHEL/CentOS, Fedora
237# libopus-devel: OpenSUSE
238add_package ADDITIONAL_LIST opus-devel || add_package ADDITIONAL_LIST libopus-devel ||
239echo "opus is unavailable" >&2
240
241add_package ADDITIONAL_LIST bcg729-devel ||
242echo "bcg729 is unavailable" >&2
243
244# RHEL 8 / CentOS 8 are missing the -devel packages for sbc and libsmi due to
245# RH deciding not to ship all -devel packages.
246# https://wiki.centos.org/FAQ/CentOS8/UnshippedPackages
247# There are CentOS bugs filed to add them to the Devel repository and eventually
248# RHEL 8 CRB / CentOS PowerTools, but make them optional for now.
249# https://bugs.centos.org/view.php?id=16504
250# https://bugs.centos.org/view.php?id=17824
251add_package ADDITIONAL_LIST sbc-devel ||
252echo "sbc is unavailable"
253
254add_package ADDITIONAL_LIST libsmi-devel ||
255echo "libsmi is unavailable"
256
257ACTUAL_LIST=$BASIC_LIST
258
259# Now arrange for optional support libraries
260if [ $ADDITIONAL -ne 0 ]
261then
262	ACTUAL_LIST="$ACTUAL_LIST $ADDITIONAL_LIST"
263fi
264
265if [ $RPMDEPS -ne 0 ]
266then
267	ACTUAL_LIST="$ACTUAL_LIST $RPMDEPS_LIST"
268fi
269
270$PM $PM_OPT install $ACTUAL_LIST $OPTIONS
271
272if [ $ADDITIONAL -eq 0 ]
273then
274	echo -e "\n*** Optional packages not installed. Rerun with --install-optional to have them.\n"
275fi
276
277if [ $RPMDEPS -eq 0 ]
278then
279	printf "\n*** RPM packages build deps not installed. Rerun with --install-rpm-deps to have them.\n"
280fi
281