summaryrefslogtreecommitdiff
blob: 15e85166b3f8e0835bd5d80bdfd4d1a867ec596e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8
GNOME_ORG_MODULE="NetworkManager"
PYTHON_COMPAT=( python3_{8..11} )

inherit gnome.org linux-info meson-multilib python-any-r1 readme.gentoo-r1 systemd toolchain-funcs udev vala virtualx

DESCRIPTION="A set of co-operative tools that make networking simple and straightforward"
HOMEPAGE="https://wiki.gnome.org/Projects/NetworkManager"

LICENSE="GPL-2+ LGPL-2.1+"
SLOT="0"

IUSE="audit bluetooth +concheck connection-sharing debug dhclient dhcpcd elogind gnutls +gtk-doc +introspection iptables iwd psl libedit lto +nss nftables +modemmanager ofono ovs policykit +ppp resolvconf selinux syslog systemd teamd test +tools vala +wext +wifi"
RESTRICT="!test? ( test )"

REQUIRED_USE="
	bluetooth? ( modemmanager )
	connection-sharing? ( || ( iptables nftables ) )
	gtk-doc? ( introspection )
	iwd? ( wifi )
	vala? ( introspection )
	wext? ( wifi )
	^^ ( gnutls nss )
	?? ( elogind systemd )
	?? ( dhclient dhcpcd )
	?? ( syslog systemd )
"

KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~ia64 ~loong ~ppc ~ppc64 ~riscv ~sparc ~x86"

COMMON_DEPEND="
	sys-apps/util-linux[${MULTILIB_USEDEP}]
	elogind? ( >=sys-auth/elogind-219 )
	>=virtual/libudev-175:=[${MULTILIB_USEDEP}]
	sys-apps/dbus
	net-libs/libndp
	systemd? ( >=sys-apps/systemd-209:0= )
	>=dev-libs/glib-2.40:2[${MULTILIB_USEDEP}]
	introspection? ( >=dev-libs/gobject-introspection-0.10.3:= )
	selinux? (
		sec-policy/selinux-networkmanager
		sys-libs/libselinux
	)
	audit? ( sys-process/audit )
	teamd? (
		>=dev-libs/jansson-2.7:=
		>=net-misc/libteam-1.9
	)
	policykit? ( >=sys-auth/polkit-0.106 )
	nss? ( >=dev-libs/nss-3.11:=[${MULTILIB_USEDEP}] )
	gnutls? (
		>=net-libs/gnutls-2.12:=[${MULTILIB_USEDEP}]
	)
	ppp? ( >=net-dialup/ppp-2.4.5:=[ipv6] )
	modemmanager? (
		net-misc/mobile-broadband-provider-info
		>=net-misc/modemmanager-0.7.991:0=
	)
	bluetooth? ( >=net-wireless/bluez-5 )
	ofono? ( net-misc/ofono )
	dhclient? ( >=net-misc/dhcp-4[client] )
	dhcpcd? ( >=net-misc/dhcpcd-9.3.3 )
	ovs? ( >=dev-libs/jansson-2.7:= )
	resolvconf? ( virtual/resolvconf )
	connection-sharing? (
		net-dns/dnsmasq[dbus,dhcp]
		iptables? ( net-firewall/iptables )
		nftables? ( net-firewall/nftables )
	)
	psl? ( net-libs/libpsl )
	concheck? ( net-misc/curl )
	tools? (
		>=dev-libs/newt-0.52.15
		libedit? ( dev-libs/libedit )
		!libedit? ( sys-libs/readline:= )
	)
"
RDEPEND="${COMMON_DEPEND}
	acct-group/plugdev
	|| (
		net-misc/iputils[arping(+)]
		net-analyzer/arping
	)
	wifi? (
		!iwd? ( >=net-wireless/wpa_supplicant-0.7.3-r3[dbus] )
		iwd? ( net-wireless/iwd )
	)
"
DEPEND="${COMMON_DEPEND}
	>=sys-kernel/linux-headers-3.18
	net-libs/libndp[${MULTILIB_USEDEP}]
	ppp? ( elibc_musl? ( net-libs/ppp-defs ) )
"
BDEPEND="
	dev-util/gdbus-codegen
	dev-util/glib-utils
	gtk-doc? (
		dev-util/gtk-doc
		app-text/docbook-xml-dtd:4.1.2
	)
	>=dev-util/intltool-0.40
	>=sys-devel/gettext-0.17
	virtual/pkgconfig
	introspection? (
		$(python_gen_any_dep 'dev-python/pygobject:3[${PYTHON_USEDEP}]')
		dev-lang/perl
		dev-libs/libxslt
	)
	vala? ( $(vala_depend) )
	test? (
		>=dev-libs/jansson-2.7
		$(python_gen_any_dep '
			dev-python/dbus-python[${PYTHON_USEDEP}]
			dev-python/pygobject:3[${PYTHON_USEDEP}]')
	)
"

python_check_deps() {
	if use introspection; then
		python_has_version "dev-python/pygobject:3[${PYTHON_USEDEP}]" || return
	fi
	if use test; then
		python_has_version "dev-python/dbus-python[${PYTHON_USEDEP}]" &&
		python_has_version "dev-python/pygobject:3[${PYTHON_USEDEP}]"
	fi
}

sysfs_deprecated_check() {
	ebegin "Checking for SYSFS_DEPRECATED support"

	if { linux_chkconfig_present SYSFS_DEPRECATED_V2; }; then
		eerror "Please disable SYSFS_DEPRECATED_V2 support in your kernel config and recompile your kernel"
		eerror "or NetworkManager will not work correctly."
		eerror "See https://bugs.gentoo.org/333639 for more info."
		die "CONFIG_SYSFS_DEPRECATED_V2 support detected!"
	fi
	eend $?
}

pkg_pretend() {
	if use kernel_linux; then
		get_version
		if linux_config_exists; then
			sysfs_deprecated_check
		else
			ewarn "Was unable to determine your kernel .config"
			ewarn "Please note that if CONFIG_SYSFS_DEPRECATED_V2 is set in your kernel .config, NetworkManager will not work correctly."
			ewarn "See https://bugs.gentoo.org/333639 for more info."
		fi
	fi
}

pkg_setup() {
	if use connection-sharing; then
		if kernel_is lt 5 1; then
			CONFIG_CHECK="~NF_NAT_IPV4 ~NF_NAT_MASQUERADE_IPV4"
		else
			CONFIG_CHECK="~NF_NAT ~NF_NAT_MASQUERADE"
		fi
		linux-info_pkg_setup
	fi

	if use introspection || use test; then
		python-any-r1_pkg_setup
	fi

	# bug 809695
	if tc-is-clang && use lto; then
		eerror "Clang does not support -flto-partition"
		die "Please use gcc or turn off USE=lto flag when building with clang"
	fi
}

src_prepare() {
	DOC_CONTENTS="To modify system network connections without needing to enter the
		root password, add your user account to the 'plugdev' group."

	default
	use vala && vala_setup

	sed -i \
		-e 's#/usr/bin/sed#/bin/sed#' \
		data/84-nm-drivers.rules \
		|| die
}

meson_nm_program() {
	usex "$1" "-D${2:-$1}=$3" "-D${2:-$1}=no"
}

meson_nm_native_program() {
	multilib_native_usex "$1" "-D${2:-$1}=$3" "-D${2:-$1}=no"
}

multilib_src_configure() {
	local emesonargs=(
		--localstatedir="${EPREFIX}/var"

		-Dsystemdsystemunitdir=$(systemd_get_systemunitdir)
		-Dsystem_ca_path=/etc/ssl/certs
		-Dudev_dir=$(get_udevdir)
		-Ddbus_conf_dir=/usr/share/dbus-1/system.d
		-Dkernel_firmware_dir=/lib/firmware
		-Diptables=/sbin/iptables
		-Dnft=/sbin/nft
		-Ddnsmasq=/usr/sbin/dnsmasq
		#-Ddnssec_trigger=

		-Ddist_version=${PVR}
		$(meson_native_use_bool policykit polkit)
		$(meson_native_use_bool policykit config_auth_polkit_default)
		-Dmodify_system=true
		-Dpolkit_agent_helper_1=/usr/lib/polkit-1/polkit-agent-helper-1
		$(meson_native_use_bool selinux)
		$(meson_native_use_bool systemd systemd_journal)
		-Dhostname_persist=gentoo
		-Dlibaudit=$(multilib_native_usex audit)

		$(meson_native_use_bool wext)
		$(meson_native_use_bool wifi)
		$(meson_native_use_bool iwd)
		$(meson_native_use_bool ppp)
		-Dpppd=/usr/sbin/pppd
		$(meson_native_use_bool modemmanager modem_manager)
		$(meson_native_use_bool ofono)
		$(meson_native_use_bool concheck)
		$(meson_native_use_bool teamd teamdctl)
		$(meson_native_use_bool ovs)
		$(meson_native_use_bool tools nmcli)
		$(meson_native_use_bool tools nmtui)
		$(meson_native_use_bool tools nm_cloud_setup)
		$(meson_native_use_bool bluetooth bluez5_dun)
		-Debpf=true

		-Dconfig_wifi_backend_default=$(multilib_native_usex iwd iwd default)
		-Dconfig_plugins_default=keyfile
		-Difcfg_rh=false
		-Difupdown=false

		$(meson_nm_native_program resolvconf "" /sbin/resolvconf)
		-Dnetconfig=no
		-Dconfig_dns_rc_manager_default=auto

		$(meson_nm_program dhclient "" /sbin/dhclient)
		-Ddhcpcanon=no
		$(meson_nm_program dhcpcd "" /sbin/dhcpcd)

		$(meson_native_use_bool introspection)
		$(meson_native_use_bool vala vapi)
		$(meson_native_use_bool gtk-doc docs)
		-Dtests=$(multilib_native_usex test)
		$(meson_native_true firewalld_zone)
		-Dmore_asserts=0
		$(meson_use debug more_logging)
		-Dvalgrind=no
		-Dvalgrind_suppressions=
		-Dld_gc=false
		$(meson_native_use_bool psl libpsl)
		-Dqt=false

		$(meson_use lto b_lto)
	)

	if multilib_is_native_abi && use systemd; then
		emesonargs+=( -Dsession_tracking_consolekit=false )
		emesonargs+=( -Dsession_tracking=systemd )
		emesonargs+=( -Dsuspend_resume=systemd )
	elif multilib_is_native_abi && use elogind; then
		emesonargs+=( -Dsession_tracking_consolekit=false )
		emesonargs+=( -Dsession_tracking=elogind )
		emesonargs+=( -Dsuspend_resume=elogind )
	else
		emesonargs+=( -Dsession_tracking_consolekit=false )
		emesonargs+=( -Dsession_tracking=no )
		emesonargs+=( -Dsuspend_resume=auto )
	fi

	if multilib_is_native_abi && use syslog; then
		emesonargs+=( -Dconfig_logging_backend_default=syslog )
	elif multilib_is_native_abi && use systemd; then
		emesonargs+=( -Dconfig_logging_backend_default=journal )
	else
		emesonargs+=( -Dconfig_logging_backend_default=default )
	fi

	if multilib_is_native_abi && use dhclient; then
		emesonargs+=( -Dconfig_dhcp_default=dhclient )
	elif multilib_is_native_abi && use dhcpcd; then
		emesonargs+=( -Dconfig_dhcp_default=dhcpcd )
	else
		emesonargs+=( -Dconfig_dhcp_default=internal )
	fi

	if use nss; then
		emesonargs+=( -Dcrypto=nss )
	else
		emesonargs+=( -Dcrypto=gnutls )
	fi

	if use tools ; then
		emesonargs+=( -Dreadline=$(usex libedit libedit libreadline) )
	else
		emesonargs+=( -Dreadline=none )
	fi

	# Same hack as net-dialup/pptpd to get proper plugin dir for ppp, bug #519986
	if use ppp; then
		local PPPD_VER=`best_version net-dialup/ppp`
		PPPD_VER=${PPPD_VER#*/*-} #reduce it to ${PV}-${PR}
		PPPD_VER=${PPPD_VER%%[_-]*} # main version without beta/pre/patch/revision
		emesonargs+=( -Dpppd_plugin_dir=/usr/$(get_libdir)/pppd/${PPPD_VER} )
	fi

	meson_src_configure
}

multilib_src_test() {
	if use test && multilib_is_native_abi; then
		python_setup
		virtx meson_src_test
	fi
}

multilib_src_install() {
	meson_src_install
	if ! multilib_is_native_abi; then
		rm -r "${ED}"/{etc,usr/{bin,lib/NetworkManager,share},var} || die
	fi
}

multilib_src_install_all() {
	! use systemd && readme.gentoo_create_doc

	newinitd "${FILESDIR}/init.d.NetworkManager-r2" NetworkManager
	newconfd "${FILESDIR}/conf.d.NetworkManager" NetworkManager

	# Need to keep the /etc/NetworkManager/dispatched.d for dispatcher scripts
	keepdir /etc/NetworkManager/dispatcher.d

	# Provide openrc net dependency only when nm is connected
	exeinto /etc/NetworkManager/dispatcher.d
	newexe "${FILESDIR}/10-openrc-status-r4" 10-openrc-status
	sed -e "s:@EPREFIX@:${EPREFIX}:g" \
		-i "${ED}/etc/NetworkManager/dispatcher.d/10-openrc-status" || die

	keepdir /etc/NetworkManager/system-connections
	chmod 0600 "${ED}"/etc/NetworkManager/system-connections/.keep* # bug #383765, upstream bug #754594

	# Allow users in plugdev group to modify system connections
	insinto /usr/share/polkit-1/rules.d/
	doins "${FILESDIR}"/01-org.freedesktop.NetworkManager.settings.modify.system.rules

	insinto /usr/lib/NetworkManager/conf.d #702476
	doins "${S}"/examples/nm-conf.d/31-mac-addr-change.conf

	if use iwd; then
		# This goes to $nmlibdir/conf.d/ and $nmlibdir is '${prefix}'/lib/$PACKAGE, thus always lib, not get_libdir
		cat <<-EOF > "${ED}"/usr/lib/NetworkManager/conf.d/iwd.conf || die
		[device]
		wifi.backend=iwd
		EOF
	fi

	mv "${ED}"/usr/share/doc/{NetworkManager/examples/,${PF}} || die
	rmdir "${ED}"/usr/share/doc/NetworkManager || die

	# Empty
	rmdir "${ED}"/var{/lib{/NetworkManager,},} || die
}

pkg_postinst() {
	udev_reload

	systemd_reenable NetworkManager.service
	! use systemd && readme.gentoo_print_elog

	if [[ -e "${EROOT}/etc/NetworkManager/nm-system-settings.conf" ]]; then
		ewarn "The ${PN} system configuration file has moved to a new location."
		ewarn "You must migrate your settings from ${EROOT}/etc/NetworkManager/nm-system-settings.conf"
		ewarn "to ${EROOT}/etc/NetworkManager/NetworkManager.conf"
		ewarn
		ewarn "After doing so, you can remove ${EROOT}/etc/NetworkManager/nm-system-settings.conf"
	fi

	# NM fallbacks to plugin specified at compile time (upstream bug #738611)
	# but still show a warning to remember people to have cleaner config file
	if [[ -e "${EROOT}/etc/NetworkManager/NetworkManager.conf" ]]; then
		if grep plugins "${EROOT}/etc/NetworkManager/NetworkManager.conf" | grep -q ifnet; then
			ewarn
			ewarn "You seem to use 'ifnet' plugin in ${EROOT}/etc/NetworkManager/NetworkManager.conf"
			ewarn "Since it won't be used, you will need to stop setting ifnet plugin there."
			ewarn
		fi
	fi

	# NM shows lots of errors making nmcli almost unusable, bug #528748 upstream bug #690457
	if grep -r "psk-flags=1" "${EROOT}"/etc/NetworkManager/; then
		ewarn "You have psk-flags=1 setting in above files, you will need to"
		ewarn "either reconfigure affected networks or, at least, set the flag"
		ewarn "value to '0'."
	fi

	if use dhclient || use dhcpcd; then
		ewarn "You have enabled USE=dhclient and/or USE=dhcpcd, but NetworkManager since"
		ewarn "version 1.20 defaults to the internal DHCP client. If the internal client"
		ewarn "works for you, and you're happy with, the alternative USE flags can be"
		ewarn "disabled. If you want to use dhclient or dhcpcd, then you need to tweak"
		ewarn "the main.dhcp configuration option to use one of them instead of internal."
	fi
}

pkg_postrm() {
	udev_reload
}