mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-25 15:20:08 +01:00
merge: branch 'lr/initrd'
https://github.com/NetworkManager/NetworkManager/pull/116
This commit is contained in:
commit
40f571cb53
230 changed files with 3433 additions and 181 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -252,6 +252,9 @@ test-*.trs
|
|||
/src/dhcp/tests/test-dhcp-options
|
||||
/src/dhcp/tests/test-dhcp-utils
|
||||
/src/dnsmasq/tests/test-dnsmasq-utils
|
||||
/src/initrd/nm-initrd-generator
|
||||
/src/initrd/tests/test-cmdline-reader
|
||||
/src/initrd/tests/test-ibft-reader
|
||||
/src/nm-iface-helper
|
||||
/src/ndisc/tests/test-ndisc-fake
|
||||
/src/ndisc/tests/test-ndisc-linux
|
||||
|
|
|
|||
266
Makefile.am
266
Makefile.am
|
|
@ -1925,6 +1925,271 @@ $(src_nm_iface_helper_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
|
|||
|
||||
###############################################################################
|
||||
|
||||
noinst_LTLIBRARIES += src/initrd/libnmi-core.la
|
||||
|
||||
src_initrd_libnmi_core_la_CPPFLAGS = \
|
||||
$(src_cppflags)
|
||||
|
||||
src_initrd_libnmi_core_la_SOURCES = \
|
||||
src/initrd/nm-initrd-generator.h \
|
||||
src/initrd/nmi-cmdline-reader.c \
|
||||
src/initrd/nmi-ibft-reader.c \
|
||||
$(NULL)
|
||||
|
||||
libexec_PROGRAMS += src/initrd/nm-initrd-generator
|
||||
|
||||
src_initrd_nm_initrd_generator_CPPFLAGS = \
|
||||
$(src_cppflags)
|
||||
|
||||
src_initrd_nm_initrd_generator_SOURCES = \
|
||||
src/initrd/nm-initrd-generator.c
|
||||
|
||||
src_initrd_nm_initrd_generator_LDADD = \
|
||||
libnm-core/libnm-core.la \
|
||||
src/initrd/libnmi-core.la \
|
||||
src/libNetworkManagerBase.la \
|
||||
$(GLIB_LIBS)
|
||||
|
||||
src_initrd_nm_initrd_generator_LDFLAGS = \
|
||||
-Wl,--version-script="$(srcdir)/linker-script-binary.ver" \
|
||||
$(SANITIZER_EXEC_LDFLAGS)
|
||||
|
||||
check_programs += src/initrd/tests/test-ibft-reader
|
||||
|
||||
src_initrd_tests_test_ibft_reader_CPPFLAGS = \
|
||||
-DNETWORKMANAGER_COMPILATION_TEST \
|
||||
-DTEST_INITRD_DIR=\"$(abs_srcdir)/src/initrd/tests\" \
|
||||
$(src_cppflags)
|
||||
|
||||
src_initrd_tests_test_ibft_reader_LDFLAGS = \
|
||||
$(CODE_COVERAGE_LDFLAGS) \
|
||||
$(SANITIZER_EXEC_LDFLAGS)
|
||||
|
||||
src_initrd_tests_test_ibft_reader_LDADD = \
|
||||
libnm-core/libnm-core.la \
|
||||
src/initrd/libnmi-core.la \
|
||||
src/libNetworkManagerTest.la \
|
||||
$(GLIB_LIBS)
|
||||
|
||||
EXTRA_DIST += \
|
||||
src/initrd/tests/sysfs/class/net/eth0/address \
|
||||
src/initrd/tests/sysfs/class/net/eth2/address \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/prefix-len \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/hostname \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/gateway \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/mac \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/vlan \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/primary-dns \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/dhcp \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/origin \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/secondary-dns \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/ip-addr \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/subnet-mask \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/index \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet0/flags \
|
||||
src/initrd/tests/sysfs/firmware/ibft/initiator/isns-server \
|
||||
src/initrd/tests/sysfs/firmware/ibft/initiator/initiator-name \
|
||||
src/initrd/tests/sysfs/firmware/ibft/initiator/pri-radius-server \
|
||||
src/initrd/tests/sysfs/firmware/ibft/initiator/slp-server \
|
||||
src/initrd/tests/sysfs/firmware/ibft/initiator/sec-radius-server \
|
||||
src/initrd/tests/sysfs/firmware/ibft/initiator/index \
|
||||
src/initrd/tests/sysfs/firmware/ibft/initiator/flags \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target0/nic-assoc \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target0/ip-addr \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target0/chap-type \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target0/index \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target0/lun \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target0/flags \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target0/port \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target2/target-name \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target2/nic-assoc \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target2/ip-addr \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target2/chap-type \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target2/index \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target2/lun \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target2/flags \
|
||||
src/initrd/tests/sysfs/firmware/ibft/target2/port \
|
||||
src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_table_id \
|
||||
src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_id \
|
||||
src/initrd/tests/sysfs/firmware/ibft/acpi_header/signature \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/prefix-len \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/hostname \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/gateway \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/mac \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/vlan \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/primary-dns \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/dhcp \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/origin \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/secondary-dns \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/ip-addr \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/subnet-mask \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/index \
|
||||
src/initrd/tests/sysfs/firmware/ibft/ethernet2/flags \
|
||||
src/initrd/tests/sysfs-bad-dns1/class/net/eth0/address \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/prefix-len \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/gateway \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/mac \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/vlan \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/primary-dns \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/origin \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/secondary-dns \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/ip-addr \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/subnet-mask \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/index \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/initiator/initiator-name \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/target-name \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/ip-addr \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/index \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/lun \
|
||||
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/port \
|
||||
src/initrd/tests/sysfs-bad-dns2/class/net/eth0/address \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/prefix-len \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/gateway \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/mac \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/vlan \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/primary-dns \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/origin \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/secondary-dns \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/ip-addr \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/subnet-mask \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/index \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/initiator/initiator-name \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/target-name \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/ip-addr \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/index \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/lun \
|
||||
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/port \
|
||||
src/initrd/tests/sysfs-bad-gateway/class/net/eth0/address \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/prefix-len \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/gateway \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/mac \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/vlan \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/primary-dns \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/origin \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/secondary-dns \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/ip-addr \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/subnet-mask \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/index \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/initiator/initiator-name \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/target-name \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/ip-addr \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/index \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/lun \
|
||||
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/port \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/prefix-len \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/gateway \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/mac \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/vlan \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/primary-dns \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/origin \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/secondary-dns \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/ip-addr \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/subnet-mask \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/index \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/initiator/initiator-name \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/target-name \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/ip-addr \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/index \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/lun \
|
||||
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/port \
|
||||
src/initrd/tests/sysfs-dhcp/class/net/eth0/address \
|
||||
src/initrd/tests/sysfs-dhcp/class/net/eth1/address \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/gateway \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/vlan \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/primary-dns \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/origin \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/secondary-dns \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/index \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/initiator/initiator-name \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/target-name \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/ip-addr \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/index \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/lun \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/port \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/gateway \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/mac \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/vlan \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/primary-dns \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/origin \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/secondary-dns \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/index \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/target-name \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/ip-addr \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/index \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/lun \
|
||||
src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/port \
|
||||
src/initrd/tests/sysfs-static/class/net/eth0/address \
|
||||
src/initrd/tests/sysfs-static/class/net/eth1/address \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/prefix-len \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/gateway \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/mac \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/vlan \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/primary-dns \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/origin \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/secondary-dns \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/ip-addr \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/subnet-mask \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/index \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/initiator/initiator-name \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/target0/target-name \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/target0/ip-addr \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/target0/index \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/target0/lun \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/target0/port \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/gateway \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/mac \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/vlan \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/primary-dns \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/origin \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/secondary-dns \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/index \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/target1/target-name \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/target1/ip-addr \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/target1/index \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/target1/lun \
|
||||
src/initrd/tests/sysfs-static/firmware/ibft/target1/port \
|
||||
src/initrd/tests/sysfs-vlan/class/net/eth0/address \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/prefix-len \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/mac \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/vlan \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/origin \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/ip-addr \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/subnet-mask \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/index \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/initiator/initiator-name \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/target0/target-name \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/target0/ip-addr \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/target0/index \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/target0/lun \
|
||||
src/initrd/tests/sysfs-vlan/firmware/ibft/target0/port \
|
||||
$(NULL)
|
||||
|
||||
check_programs += src/initrd/tests/test-cmdline-reader
|
||||
|
||||
src_initrd_tests_test_cmdline_reader_CPPFLAGS = \
|
||||
-DNETWORKMANAGER_COMPILATION_TEST \
|
||||
-DTEST_INITRD_DIR=\"$(abs_srcdir)/src/initrd/tests\" \
|
||||
$(src_cppflags)
|
||||
|
||||
src_initrd_tests_test_cmdline_reader_LDFLAGS = \
|
||||
$(CODE_COVERAGE_LDFLAGS) \
|
||||
$(SANITIZER_EXEC_LDFLAGS)
|
||||
|
||||
src_initrd_tests_test_cmdline_reader_LDADD = \
|
||||
libnm-core/libnm-core.la \
|
||||
src/initrd/libnmi-core.la \
|
||||
src/libNetworkManagerTest.la \
|
||||
$(GLIB_LIBS)
|
||||
|
||||
$(src_initrd_libnmi_core_la_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
|
||||
$(src_initrd_nm_initrd_generator_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
|
||||
$(src_initrd_tests_test_cmdline_reader_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
|
||||
$(src_initrd_tests_test_ibft_reader_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
|
||||
|
||||
###############################################################################
|
||||
|
||||
EXTRA_DIST += \
|
||||
src/org.freedesktop.NetworkManager.conf \
|
||||
src/nm-test-utils-core.h \
|
||||
|
|
@ -4615,6 +4880,7 @@ man_pages += \
|
|||
man/NetworkManager.8 \
|
||||
man/NetworkManager.conf.5 \
|
||||
man/nm-online.1 \
|
||||
man/nm-initrd-generator.8 \
|
||||
man/nmcli-examples.7 \
|
||||
man/nmcli.1 \
|
||||
man/nmtui.1
|
||||
|
|
|
|||
|
|
@ -134,8 +134,8 @@ AS_IF([test -z "$enable_ifupdown" -a -f /etc/debian_version], enable_
|
|||
# Otherwise plugins default to "no"
|
||||
AS_IF([test -z "$enable_ifcfg_rh"], enable_ifcfg_rh=no)
|
||||
AS_IF([test -z "$enable_ifupdown"], enable_ifupdown=no)
|
||||
# Enable ibft by default
|
||||
AS_IF([test -z "$enable_config_plugin_ibft"], enable_config_plugin_ibft="yes")
|
||||
# Disable obsolete ibft plugin by default
|
||||
AS_IF([test -z "$enable_config_plugin_ibft"], enable_config_plugin_ibft="no")
|
||||
# Create automake conditionals
|
||||
AM_CONDITIONAL(CONFIG_PLUGIN_IBFT, test "$enable_config_plugin_ibft" = "yes")
|
||||
AM_CONDITIONAL(CONFIG_PLUGIN_IFCFG_RH, test "$enable_ifcfg_rh" = "yes")
|
||||
|
|
|
|||
|
|
@ -553,7 +553,7 @@ intltoolize --automake --copy --force
|
|||
--enable-ppp=yes \
|
||||
%endif
|
||||
--with-dist-version=%{version}-%{release} \
|
||||
--with-config-plugins-default='ifcfg-rh,ibft' \
|
||||
--with-config-plugins-default='ifcfg-rh' \
|
||||
--with-config-dns-rc-manager-default=symlink \
|
||||
--with-config-logging-backend-default=journal \
|
||||
--enable-json-validation \
|
||||
|
|
@ -687,6 +687,7 @@ fi
|
|||
%{_libexecdir}/nm-dhcp-helper
|
||||
%{_libexecdir}/nm-dispatcher
|
||||
%{_libexecdir}/nm-iface-helper
|
||||
%{_libexecdir}/nm-initrd-generator
|
||||
%dir %{_libdir}/%{name}
|
||||
%dir %{nmplugindir}
|
||||
%{nmplugindir}/libnm-settings-plugin*.so
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@ content_files = \
|
|||
$(top_builddir)/man/nmcli.xml \
|
||||
$(top_builddir)/man/nmtui.xml \
|
||||
$(top_builddir)/man/nm-online.xml \
|
||||
$(top_builddir)/man/nm-initrd-generator.xml \
|
||||
$(top_builddir)/man/NetworkManager.xml \
|
||||
$(top_builddir)/man/NetworkManager.conf.xml \
|
||||
$(top_builddir)/man/nmcli-examples.xml \
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@
|
|||
<xi:include href="../../man/nm-settings-keyfile.xml"><xi:fallback /></xi:include>
|
||||
<xi:include href="../../man/nm-settings-ifcfg-rh.xml"><xi:fallback /></xi:include>
|
||||
<xi:include href="../../man/nm-online.xml"/>
|
||||
<xi:include href="../../man/nm-initrd-generator.xml"/>
|
||||
<xi:include href="../../man/nm-openvswitch.xml"/>
|
||||
</part>
|
||||
|
||||
|
|
|
|||
|
|
@ -2037,8 +2037,12 @@ _nm_setting_get_deprecated_virtual_interface_name (NMSetting *setting,
|
|||
{
|
||||
NMSettingConnection *s_con;
|
||||
|
||||
if (!connection)
|
||||
return NULL;
|
||||
|
||||
s_con = nm_connection_get_setting_connection (connection);
|
||||
g_return_val_if_fail (s_con != NULL, NULL);
|
||||
if (!s_con)
|
||||
return NULL;
|
||||
|
||||
if (nm_setting_connection_get_interface_name (s_con))
|
||||
return g_variant_new_string (nm_setting_connection_get_interface_name (s_con));
|
||||
|
|
|
|||
|
|
@ -379,6 +379,13 @@
|
|||
for more information on configuration file.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><arg choice='plain'><option>--configure-and-quit</option></arg><arg>initrd</arg></term>
|
||||
<listitem><para>Quit after all devices reach a stable state.
|
||||
The optional <literal>initrd</literal> parameter enables mode, where no
|
||||
processes are left running after NetworkManager stops, which is useful
|
||||
for running from an initial ramdisk on rearly boot.</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>--plugins</option></term>
|
||||
<listitem><para>List plugins used to manage system-wide
|
||||
|
|
|
|||
140
man/nm-initrd-generator.xml
Normal file
140
man/nm-initrd-generator.xml
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
<?xml version='1.0'?>
|
||||
<?xml-stylesheet type="text/xsl" href="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl"?>
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
|
||||
<!ENTITY % entities SYSTEM "common.ent" >
|
||||
%entities;
|
||||
]>
|
||||
|
||||
<!--
|
||||
nm-initrd-generator(8) manual page
|
||||
|
||||
Copyright 2018 Red Hat, Inc.
|
||||
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.1
|
||||
or any later version published by the Free Software Foundation;
|
||||
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
||||
Texts. You may obtain a copy of the GNU Free Documentation License
|
||||
from the Free Software Foundation by visiting their Web site or by
|
||||
writing to:
|
||||
|
||||
Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
-->
|
||||
|
||||
<refentry id='nm-initrd-generator'>
|
||||
|
||||
<refentryinfo>
|
||||
<title>nm-initrd-generator</title>
|
||||
<author>NetworkManager developers</author>
|
||||
</refentryinfo>
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>nm-initrd-generator</refentrytitle>
|
||||
<manvolnum>8</manvolnum>
|
||||
<refmiscinfo class="source">NetworkManager</refmiscinfo>
|
||||
<refmiscinfo class="manual">System Administration</refmiscinfo>
|
||||
<refmiscinfo class="version">&NM_VERSION;</refmiscinfo>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>nm-initrd-generator</refname>
|
||||
<refpurpose>early boot NetworkManager configuration generator</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv id='synopsis'>
|
||||
<cmdsynopsis>
|
||||
<command>nm-initrd-generator</command>
|
||||
<arg choice="opt" rep="repeat"><replaceable>OPTIONS</replaceable></arg>
|
||||
<arg choice="plain">--</arg>
|
||||
<arg choice="opt" rep="repeat"><replaceable>CMDLINE</replaceable></arg>
|
||||
</cmdsynopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1 id='description'><title>Description</title>
|
||||
<para><command>nm-initrd-generator</command> scans the command line for options
|
||||
relevant to network configuration and creates configuration files for an early
|
||||
instance of NetworkManager run from the initial ramdisk during early boot.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1 id='options'><title>Options</title>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<group choice='plain'>
|
||||
<arg choice='plain'><option>-c</option></arg>
|
||||
<arg choice='plain'><option>--connections-dir</option></arg>
|
||||
</group>
|
||||
<arg choice='plain'><replaceable>path</replaceable></arg>
|
||||
</term>
|
||||
|
||||
<listitem>
|
||||
<para>Output connection directory.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>
|
||||
<group choice='plain'>
|
||||
<arg choice='plain'><option>-d</option></arg>
|
||||
<arg choice='plain'><option>--sysfs-dir</option></arg>
|
||||
</group>
|
||||
<arg choice='plain'><replaceable>path</replaceable></arg>
|
||||
</term>
|
||||
|
||||
<listitem>
|
||||
<para>The sysfs mount point.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>
|
||||
<group choice='plain'>
|
||||
<arg choice='plain'><option>-s</option></arg>
|
||||
<arg choice='plain'><option>--stdout</option></arg>
|
||||
</group>
|
||||
</term>
|
||||
|
||||
<listitem>
|
||||
<para>Dump connections to standard output. Useful for debugging.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable>CMDLINE</replaceable></term>
|
||||
|
||||
<listitem>
|
||||
<para>The options that appear on the kernel command line. The following options are recognized:</para>
|
||||
|
||||
<simplelist>
|
||||
<member><option>ip</option></member>
|
||||
<member><option>rd.route</option></member>
|
||||
<member><option>bridge</option></member>
|
||||
<member><option>bond</option></member>
|
||||
<member><option>team</option></member>
|
||||
<member><option>vlan</option></member>
|
||||
<member><option>bootdev</option></member>
|
||||
<member><option>nameserver</option></member>
|
||||
<member><option>rd.peerdns</option></member>
|
||||
<member><option>rd.bootif</option></member>
|
||||
<member><option>BOOTIF</option></member>
|
||||
</simplelist>
|
||||
|
||||
<para>Please consult the <citerefentry><refentrytitle>dracut.cmdline</refentrytitle><manvolnum>7</manvolnum></citerefentry>
|
||||
manual for the documentation of the precise format of the values supported.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
<refsect1 id='exit_status'><title>Exit Status</title>
|
||||
<para><command>nm-initrd-generator</command> exits with status 0. It ignores unrecognized
|
||||
options and prints an error message if it encounters a malformed option.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1 id='see_also'><title>See Also</title>
|
||||
<para><link linkend='dracut.cmdline'><citerefentry><refentrytitle>dracut.cmdline</refentrytitle><manvolnum>7</manvolnum></citerefentry></link>,
|
||||
<link linkend='NetworkManager'><citerefentry><refentrytitle>NetworkManager</refentrytitle><manvolnum>8</manvolnum></citerefentry></link>.</para>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
|
|
@ -886,7 +886,6 @@ endif
|
|||
config_extra_h.set_quoted('PREFIX', nm_prefix)
|
||||
config_extra_h.set_quoted('RUNDIR', nm_pkgrundir)
|
||||
config_extra_h.set_quoted('RUNSTATEDIR', nm_runstatedir)
|
||||
config_extra_h.set_quoted('SBINDIR', nm_sbindir)
|
||||
config_extra_h.set_quoted('SYSCONFDIR', nm_sysconfdir)
|
||||
|
||||
configure_file(
|
||||
|
|
|
|||
|
|
@ -227,21 +227,12 @@ pan_connection_check_create (NMBluezDevice *self)
|
|||
NULL);
|
||||
nm_connection_add_setting (connection, setting);
|
||||
|
||||
/* Setting: IPv4 */
|
||||
setting = nm_setting_ip4_config_new ();
|
||||
g_object_set (G_OBJECT (setting),
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
|
||||
NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
|
||||
NULL);
|
||||
nm_connection_add_setting (connection, setting);
|
||||
|
||||
/* Setting: IPv6 */
|
||||
setting = nm_setting_ip6_config_new ();
|
||||
g_object_set (G_OBJECT (setting),
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO,
|
||||
NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE,
|
||||
NULL);
|
||||
nm_connection_add_setting (connection, setting);
|
||||
if (!nm_connection_normalize (connection, NULL, NULL, &error)) {
|
||||
nm_log_err (LOGD_BT, "bluez[%s] couldn't generate a connection for NAP device: %s",
|
||||
priv->path, error->message);
|
||||
g_error_free (error);
|
||||
g_return_if_reached ();
|
||||
}
|
||||
|
||||
/* Adding a new connection raises a signal which eventually calls check_emit_usable (again)
|
||||
* which then already finds the suitable connection in priv->connections. This is confusing,
|
||||
|
|
|
|||
|
|
@ -464,6 +464,7 @@ typedef struct _NMDevicePrivate {
|
|||
gulong state_sigid;
|
||||
NMDhcp4Config * config;
|
||||
char * pac_url;
|
||||
char * root_path;
|
||||
bool was_active;
|
||||
guint grace_id;
|
||||
} dhcp4;
|
||||
|
|
@ -4580,9 +4581,23 @@ nm_device_owns_iface (NMDevice *self, const char *iface)
|
|||
NMConnection *
|
||||
nm_device_new_default_connection (NMDevice *self)
|
||||
{
|
||||
if (NM_DEVICE_GET_CLASS (self)->new_default_connection)
|
||||
return NM_DEVICE_GET_CLASS (self)->new_default_connection (self);
|
||||
return NULL;
|
||||
NMConnection *connection;
|
||||
GError *error = NULL;
|
||||
|
||||
if (!NM_DEVICE_GET_CLASS (self)->new_default_connection)
|
||||
return NULL;
|
||||
|
||||
connection = NM_DEVICE_GET_CLASS (self)->new_default_connection (self);
|
||||
if (!connection)
|
||||
return NULL;
|
||||
|
||||
if (!nm_connection_normalize (connection, NULL, NULL, &error)) {
|
||||
_LOGD (LOGD_DEVICE, "device generated an invalid default connection: %s", error->message);
|
||||
g_error_free (error);
|
||||
g_return_val_if_reached (NULL);
|
||||
}
|
||||
|
||||
return connection;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -5041,11 +5056,15 @@ nm_device_removed (NMDevice *self, gboolean unconfigure_ip_config)
|
|||
nm_device_master_release_one_slave (priv->master, self, FALSE, NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED);
|
||||
}
|
||||
|
||||
if (!unconfigure_ip_config)
|
||||
return;
|
||||
|
||||
nm_device_set_ip_config (self, AF_INET, NULL, FALSE, NULL);
|
||||
nm_device_set_ip_config (self, AF_INET6, NULL, FALSE, NULL);
|
||||
if (unconfigure_ip_config) {
|
||||
nm_device_set_ip_config (self, AF_INET, NULL, FALSE, NULL);
|
||||
nm_device_set_ip_config (self, AF_INET6, NULL, FALSE, NULL);
|
||||
} else {
|
||||
if (priv->dhcp4.client)
|
||||
nm_dhcp_client_stop (priv->dhcp4.client, FALSE);
|
||||
if (priv->dhcp6.client)
|
||||
nm_dhcp_client_stop (priv->dhcp6.client, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
@ -5449,7 +5468,7 @@ nm_device_generate_connection (NMDevice *self,
|
|||
|
||||
klass->update_connection (self, connection);
|
||||
|
||||
if (!nm_connection_verify (connection, &local)) {
|
||||
if (!nm_connection_normalize (connection, NULL, NULL, error)) {
|
||||
g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED,
|
||||
"generated connection does not verify: %s",
|
||||
local->message);
|
||||
|
|
@ -6953,6 +6972,7 @@ dhcp4_cleanup (NMDevice *self, CleanupType cleanup_type, gboolean release)
|
|||
|
||||
nm_clear_g_source (&priv->dhcp4.grace_id);
|
||||
g_clear_pointer (&priv->dhcp4.pac_url, g_free);
|
||||
g_clear_pointer (&priv->dhcp4.root_path, g_free);
|
||||
|
||||
if (priv->dhcp4.client) {
|
||||
/* Stop any ongoing DHCP transaction on this device */
|
||||
|
|
@ -7326,6 +7346,9 @@ dhcp4_state_changed (NMDhcpClient *client,
|
|||
priv->dhcp4.pac_url = g_strdup (g_hash_table_lookup (options, "wpad"));
|
||||
nm_device_set_proxy_config (self, priv->dhcp4.pac_url);
|
||||
|
||||
g_free (priv->dhcp4.root_path);
|
||||
priv->dhcp4.root_path = g_strdup (g_hash_table_lookup (options, "root_path"));
|
||||
|
||||
nm_dhcp4_config_set_options (priv->dhcp4.config, options);
|
||||
_notify (self, PROP_DHCP4_CONFIG);
|
||||
|
||||
|
|
|
|||
|
|
@ -444,6 +444,7 @@ nm_dhcp_dhclient_create_config (const char *interface,
|
|||
add_request (reqs, "static-routes");
|
||||
add_request (reqs, "wpad");
|
||||
add_request (reqs, "ntp-servers");
|
||||
add_request (reqs, "root-path");
|
||||
} else {
|
||||
add_hostname6 (new_contents, hostname);
|
||||
add_request (reqs, "dhcp6.name-servers");
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@
|
|||
#include "nm-utils/nm-dedup-multi.h"
|
||||
|
||||
#include "nm-utils.h"
|
||||
#include "nm-config.h"
|
||||
#include "nm-dhcp-dhclient-utils.h"
|
||||
#include "nm-dhcp-manager.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
|
|
@ -120,8 +121,20 @@ get_dhclient_leasefile (int addr_family,
|
|||
const char *uuid,
|
||||
char **out_preferred_path)
|
||||
{
|
||||
char *rundir_path;
|
||||
char *path;
|
||||
|
||||
/* First, see if the lease file is in /run */
|
||||
rundir_path = g_strdup_printf (NMRUNDIR "/dhclient%s-%s-%s.lease",
|
||||
_addr_family_to_path_part (addr_family),
|
||||
uuid,
|
||||
iface);
|
||||
|
||||
if (g_file_test (rundir_path, G_FILE_TEST_EXISTS)) {
|
||||
NM_SET_OUT (out_preferred_path, g_strdup (rundir_path));
|
||||
return rundir_path;
|
||||
}
|
||||
|
||||
/* /var/lib/NetworkManager is the preferred leasefile path */
|
||||
path = g_strdup_printf (NMSTATEDIR "/dhclient%s-%s-%s.lease",
|
||||
_addr_family_to_path_part (addr_family),
|
||||
|
|
@ -133,6 +146,12 @@ get_dhclient_leasefile (int addr_family,
|
|||
return path;
|
||||
}
|
||||
|
||||
if (nm_config_get_configure_and_quit (nm_config_get ()) == NM_CONFIG_CONFIGURE_AND_QUIT_INITRD) {
|
||||
g_free (path);
|
||||
path = rundir_path;
|
||||
} else {
|
||||
g_free (rundir_path);
|
||||
}
|
||||
NM_SET_OUT (out_preferred_path, g_steal_pointer (&path));
|
||||
|
||||
/* If the leasefile we're looking for doesn't exist yet in the new location
|
||||
|
|
|
|||
|
|
@ -413,7 +413,7 @@ nm_dhcp_manager_init (NMDhcpManager *self)
|
|||
NM_CONFIG_KEYFILE_KEY_MAIN_DHCP,
|
||||
NM_CONFIG_GET_VALUE_STRIP | NM_CONFIG_GET_VALUE_NO_EMPTY);
|
||||
client = client_free;
|
||||
if (nm_config_get_configure_and_quit (config)) {
|
||||
if (nm_config_get_configure_and_quit (config) == NM_CONFIG_CONFIGURE_AND_QUIT_ENABLED) {
|
||||
client_factory = &_nm_dhcp_client_factory_internal;
|
||||
if (client && !nm_streq (client, client_factory->name))
|
||||
nm_log_info (LOGD_DHCP, "dhcp-init: Using internal DHCP client since configure-and-quit is set.");
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
#include "nm-utils/unaligned.h"
|
||||
|
||||
#include "nm-utils.h"
|
||||
#include "nm-config.h"
|
||||
#include "nm-dhcp-utils.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
#include "platform/nm-platform.h"
|
||||
|
|
@ -121,6 +122,7 @@ static const ReqOption dhcp4_requests[] = {
|
|||
{ SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE, REQPREFIX "rfc3442_classless_static_routes", TRUE },
|
||||
{ SD_DHCP_OPTION_PRIVATE_CLASSLESS_STATIC_ROUTE, REQPREFIX "ms_classless_static_routes", TRUE },
|
||||
{ SD_DHCP_OPTION_PRIVATE_PROXY_AUTODISCOVERY, REQPREFIX "wpad", TRUE },
|
||||
{ SD_DHCP_OPTION_ROOT_PATH, REQPREFIX "root_path", TRUE },
|
||||
|
||||
/* Internal values */
|
||||
{ SD_DHCP_OPTION_IP_ADDRESS_LEASE_TIME, REQPREFIX "expiry", FALSE },
|
||||
|
|
@ -432,6 +434,13 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx,
|
|||
add_option (options, dhcp4_requests, SD_DHCP_OPTION_NTP_SERVER, str->str);
|
||||
}
|
||||
|
||||
/* Root path */
|
||||
r = sd_dhcp_lease_get_root_path (lease, &s);
|
||||
if (r >= 0) {
|
||||
LOG_LEASE (LOGD_DHCP4, "root path '%s'", s);
|
||||
add_option (options, dhcp4_requests, SD_DHCP_OPTION_ROOT_PATH, s);
|
||||
}
|
||||
|
||||
r = sd_dhcp_lease_get_vendor_specific (lease, &data, &data_len);
|
||||
if (r >= 0)
|
||||
metered = !!memmem (data, data_len, "ANDROID_METERED", NM_STRLEN ("ANDROID_METERED"));
|
||||
|
|
@ -445,10 +454,30 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx,
|
|||
static char *
|
||||
get_leasefile_path (int addr_family, const char *iface, const char *uuid)
|
||||
{
|
||||
return g_strdup_printf (NMSTATEDIR "/internal%s-%s-%s.lease",
|
||||
addr_family == AF_INET6 ? "6" : "",
|
||||
uuid,
|
||||
iface);
|
||||
char *rundir_path;
|
||||
char *statedir_path;
|
||||
|
||||
rundir_path = g_strdup_printf (NMRUNDIR "/internal%s-%s-%s.lease",
|
||||
addr_family == AF_INET6 ? "6" : "",
|
||||
uuid,
|
||||
iface);
|
||||
|
||||
if (g_file_test (rundir_path, G_FILE_TEST_EXISTS))
|
||||
return rundir_path;
|
||||
|
||||
statedir_path = g_strdup_printf (NMSTATEDIR "/internal%s-%s-%s.lease",
|
||||
addr_family == AF_INET6 ? "6" : "",
|
||||
uuid,
|
||||
iface);
|
||||
|
||||
if ( g_file_test (statedir_path, G_FILE_TEST_EXISTS)
|
||||
|| nm_config_get_configure_and_quit (nm_config_get ()) != NM_CONFIG_CONFIGURE_AND_QUIT_INITRD) {
|
||||
g_free (rundir_path);
|
||||
return statedir_path;
|
||||
} else {
|
||||
g_free (statedir_path);
|
||||
return rundir_path;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@ static const char *orig_missing_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -132,6 +133,7 @@ static const char *override_client_id_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -161,6 +163,7 @@ static const char *quote_client_id_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -190,6 +193,7 @@ static const char *quote_client_id_expected_2 = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -219,6 +223,7 @@ static const char *hex_zero_client_id_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -248,6 +253,7 @@ static const char *ascii_client_id_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -277,6 +283,7 @@ static const char *hex_single_client_id_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -310,6 +317,7 @@ static const char *existing_hex_client_id_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -347,6 +355,7 @@ static const char *existing_escaped_client_id_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -385,6 +394,7 @@ static const char *existing_ascii_client_id_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -419,7 +429,8 @@ static const char *fqdn_expected = \
|
|||
"also request ms-classless-static-routes;\n"
|
||||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n\n";
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n\n";
|
||||
|
||||
static void
|
||||
test_fqdn (void)
|
||||
|
|
@ -455,6 +466,7 @@ static const char *fqdn_options_override_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n"
|
||||
"# FQDN options from /path/to/dhclient.conf\n"
|
||||
"send fqdn.encoded off;\n"
|
||||
|
|
@ -492,6 +504,7 @@ static const char *override_hostname_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -580,6 +593,7 @@ static const char *existing_alsoreq_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -618,6 +632,7 @@ static const char *existing_req_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -657,6 +672,7 @@ static const char *existing_multiline_alsoreq_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -890,6 +906,7 @@ static const char *interface1_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -935,6 +952,7 @@ static const char *interface2_expected = \
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
static void
|
||||
|
|
@ -1030,6 +1048,7 @@ test_structured (void)
|
|||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request ntp-servers;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
new_client_id = g_bytes_new (bytes, sizeof (bytes) - 1);
|
||||
|
|
@ -1085,6 +1104,7 @@ test_config_req_intf (void)
|
|||
"also request ms-classless-static-routes;\n"
|
||||
"also request static-routes;\n"
|
||||
"also request wpad;\n"
|
||||
"also request root-path;\n"
|
||||
"\n";
|
||||
|
||||
test_config (orig, expected,
|
||||
|
|
|
|||
|
|
@ -306,8 +306,6 @@ start_dnsmasq (NMDnsDnsmasq *self)
|
|||
const char *argv[15];
|
||||
GPid pid = 0;
|
||||
guint idx = 0;
|
||||
NMDBusManager *dbus_mgr;
|
||||
GDBusConnection *connection;
|
||||
|
||||
if (priv->running) {
|
||||
/* the dnsmasq process is running. Nothing to do. */
|
||||
|
|
@ -358,22 +356,16 @@ start_dnsmasq (NMDnsDnsmasq *self)
|
|||
return;
|
||||
}
|
||||
|
||||
dbus_mgr = nm_dbus_manager_get ();
|
||||
g_return_if_fail (dbus_mgr);
|
||||
|
||||
connection = nm_dbus_manager_get_connection (dbus_mgr);
|
||||
g_return_if_fail (connection);
|
||||
|
||||
priv->dnsmasq_cancellable = g_cancellable_new ();
|
||||
g_dbus_proxy_new (connection,
|
||||
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
||||
NULL,
|
||||
DNSMASQ_DBUS_SERVICE,
|
||||
DNSMASQ_DBUS_PATH,
|
||||
DNSMASQ_DBUS_SERVICE,
|
||||
priv->dnsmasq_cancellable,
|
||||
dnsmasq_proxy_cb,
|
||||
self);
|
||||
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
|
||||
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
||||
NULL,
|
||||
DNSMASQ_DBUS_SERVICE,
|
||||
DNSMASQ_DBUS_PATH,
|
||||
DNSMASQ_DBUS_SERVICE,
|
||||
priv->dnsmasq_cancellable,
|
||||
dnsmasq_proxy_cb,
|
||||
self);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
|
|||
|
|
@ -391,28 +391,20 @@ static void
|
|||
nm_dns_systemd_resolved_init (NMDnsSystemdResolved *self)
|
||||
{
|
||||
NMDnsSystemdResolvedPrivate *priv = NM_DNS_SYSTEMD_RESOLVED_GET_PRIVATE (self);
|
||||
NMDBusManager *dbus_mgr;
|
||||
GDBusConnection *connection;
|
||||
|
||||
c_list_init (&priv->request_queue_lst_head);
|
||||
|
||||
dbus_mgr = nm_dbus_manager_get ();
|
||||
g_return_if_fail (dbus_mgr);
|
||||
|
||||
connection = nm_dbus_manager_get_connection (dbus_mgr);
|
||||
g_return_if_fail (connection);
|
||||
|
||||
priv->init_cancellable = g_cancellable_new ();
|
||||
g_dbus_proxy_new (connection,
|
||||
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
|
||||
G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
|
||||
NULL,
|
||||
SYSTEMD_RESOLVED_DBUS_SERVICE,
|
||||
SYSTEMD_RESOLVED_DBUS_PATH,
|
||||
SYSTEMD_RESOLVED_DBUS_SERVICE ".Manager",
|
||||
priv->init_cancellable,
|
||||
resolved_proxy_created,
|
||||
self);
|
||||
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
|
||||
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
|
||||
G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
|
||||
NULL,
|
||||
SYSTEMD_RESOLVED_DBUS_SERVICE,
|
||||
SYSTEMD_RESOLVED_DBUS_PATH,
|
||||
SYSTEMD_RESOLVED_DBUS_SERVICE ".Manager",
|
||||
priv->init_cancellable,
|
||||
resolved_proxy_created,
|
||||
self);
|
||||
}
|
||||
|
||||
NMDnsPlugin *
|
||||
|
|
|
|||
138
src/initrd/nm-initrd-generator.c
Normal file
138
src/initrd/nm-initrd-generator.c
Normal file
|
|
@ -0,0 +1,138 @@
|
|||
/* NetworkManager initrd configuration generator
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 2018 Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#include "nm-default.h"
|
||||
#include "nm-core-utils.h"
|
||||
#include "nm-core-internal.h"
|
||||
#include "nm-keyfile-internal.h"
|
||||
|
||||
#include "nm-initrd-generator.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define _NMLOG(level, domain, ...) \
|
||||
nm_log ((level), (domain), NULL, NULL, \
|
||||
"initrd-generator: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__) \
|
||||
_NM_UTILS_MACRO_REST (__VA_ARGS__))
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
output_conn (gpointer key, gpointer value, gpointer user_data)
|
||||
{
|
||||
const char *basename = key;
|
||||
NMConnection *connection = value;
|
||||
char *connections_dir = user_data;
|
||||
GKeyFile *file;
|
||||
gs_free char *data = NULL;
|
||||
GError *error = NULL;
|
||||
gsize len;
|
||||
|
||||
if (!nm_connection_normalize (connection, NULL, NULL, &error)) {
|
||||
g_print ("%s\n", error->message);
|
||||
g_error_free (error);
|
||||
return;
|
||||
}
|
||||
|
||||
file = nm_keyfile_write (connection, NULL, NULL, &error);
|
||||
if (file == NULL) {
|
||||
g_print ("%s\n", error->message);
|
||||
g_error_free (error);
|
||||
return;
|
||||
}
|
||||
|
||||
data = g_key_file_to_data (file, &len, &error);
|
||||
if (!data) {
|
||||
g_print ("%s\n", error->message);
|
||||
g_error_free (error);
|
||||
} else if (connections_dir) {
|
||||
char *filename = g_build_filename (connections_dir, basename, NULL);
|
||||
|
||||
if (!nm_utils_file_set_contents (filename, data, len, 0600, &error)) {
|
||||
g_print ("%s\n", error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
g_free (filename);
|
||||
} else {
|
||||
g_print ("\n*** Connection '%s' ***\n\n%s\n", basename, data);
|
||||
}
|
||||
|
||||
g_key_file_free (file);
|
||||
}
|
||||
|
||||
#define DEFAULT_CONNECTIONS_DIR NMRUNDIR "/system-connections"
|
||||
#define DEFAULT_SYSFS_DIR "/sys"
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
GHashTable *connections;
|
||||
gs_free char *connections_dir = NULL;
|
||||
gs_free char *sysfs_dir = NULL;
|
||||
gboolean dump_to_stdout = FALSE;
|
||||
gs_strfreev char **remaining = NULL;
|
||||
GOptionEntry option_entries[] = {
|
||||
{ "connections-dir", 'c', 0, G_OPTION_ARG_FILENAME, &connections_dir, "Output connection directory", DEFAULT_CONNECTIONS_DIR },
|
||||
{ "sysfs-dir", 'd', 0, G_OPTION_ARG_FILENAME, &sysfs_dir, "The sysfs mount point", DEFAULT_SYSFS_DIR },
|
||||
{ "stdout", 's', 0, G_OPTION_ARG_NONE, &dump_to_stdout, "Dump connections to standard output", NULL },
|
||||
{ G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &remaining, NULL, NULL },
|
||||
{ NULL }
|
||||
};
|
||||
GOptionContext *option_context;
|
||||
GError *error = NULL;
|
||||
|
||||
option_context = g_option_context_new ("-- [ip=...] [rd.route=...] [bridge=...] [bond=...] [team=...] [vlan=...] "
|
||||
"[bootdev=...] [nameserver=...] [rd.peerdns=...] [rd.bootif=...] [BOOTIF=...] ... ");
|
||||
|
||||
g_option_context_set_summary (option_context, "Generate early NetworkManager configuration.");
|
||||
g_option_context_set_description (option_context,
|
||||
"This tool scans the command line for options relevant to network\n"
|
||||
"configuration and creates configuration files for an early instance\n"
|
||||
"of NetworkManager run from the initial ramdisk during early boot.");
|
||||
g_option_context_add_main_entries (option_context, option_entries, GETTEXT_PACKAGE);
|
||||
|
||||
if (!g_option_context_parse (option_context, &argc, &argv, &error)) {
|
||||
_LOGW (LOGD_CORE, "%s\n", error->message);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!remaining) {
|
||||
/* No arguments, no networking. Don't bother. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!connections_dir)
|
||||
connections_dir = g_strdup (DEFAULT_CONNECTIONS_DIR);
|
||||
if (!sysfs_dir)
|
||||
sysfs_dir = g_strdup (DEFAULT_SYSFS_DIR);
|
||||
if (dump_to_stdout)
|
||||
g_clear_pointer (&connections_dir, g_free);
|
||||
|
||||
if (connections_dir && g_mkdir_with_parents (connections_dir, 0755) != 0) {
|
||||
_LOGW (LOGD_CORE, "%s: %s\n", connections_dir, strerror (errno));
|
||||
return 1;
|
||||
}
|
||||
|
||||
connections = nmi_cmdline_reader_parse (sysfs_dir, remaining);
|
||||
g_hash_table_foreach (connections, output_conn, connections_dir);
|
||||
g_hash_table_destroy (connections);
|
||||
|
||||
return 0;
|
||||
}
|
||||
45
src/initrd/nm-initrd-generator.h
Normal file
45
src/initrd/nm-initrd-generator.h
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
/* NetworkManager initrd configuration generator
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 2014, 2018 Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#ifndef __NM_INITRD_GENERATOR_H__
|
||||
#define __NM_INITRD_GENERATOR_H__
|
||||
|
||||
#include "nm-connection.h"
|
||||
#include "nm-utils.h"
|
||||
|
||||
static inline gboolean
|
||||
guess_ip_address_family (const char *str)
|
||||
{
|
||||
if (str == NULL)
|
||||
return AF_UNSPEC;
|
||||
else if (strchr (str, '.'))
|
||||
return AF_INET;
|
||||
else if (strchr (str, ':'))
|
||||
return AF_INET6;
|
||||
else
|
||||
return AF_UNSPEC;
|
||||
}
|
||||
|
||||
GHashTable *nmi_ibft_read (const char *sysfs_dir);
|
||||
|
||||
gboolean nmi_ibft_update_connection_from_nic (NMConnection *connection, GHashTable *nic, GError **error);
|
||||
|
||||
GHashTable *nmi_cmdline_reader_parse (const char *sysfs_dir, char **argv);
|
||||
|
||||
#endif /* __NM_INITRD_GENERATOR_H__ */
|
||||
714
src/initrd/nmi-cmdline-reader.c
Normal file
714
src/initrd/nmi-cmdline-reader.c
Normal file
|
|
@ -0,0 +1,714 @@
|
|||
/* NetworkManager initrd configuration generator
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 2018 Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#include "nm-default.h"
|
||||
#include "nm-core-internal.h"
|
||||
|
||||
#include "nm-initrd-generator.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define _NMLOG(level, domain, ...) \
|
||||
nm_log ((level), (domain), NULL, NULL, \
|
||||
"cmdline-reader: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__) \
|
||||
_NM_UTILS_MACRO_REST (__VA_ARGS__))
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static NMConnection *
|
||||
get_conn (GHashTable *connections, const char *ifname, const char *type_name)
|
||||
{
|
||||
NMConnection *connection;
|
||||
NMSetting *setting;
|
||||
const char *basename = ifname ?: "default_connection";
|
||||
|
||||
connection = g_hash_table_lookup (connections, (gpointer)basename);
|
||||
|
||||
if (connection) {
|
||||
setting = (NMSetting *)nm_connection_get_setting_connection (connection);
|
||||
} else {
|
||||
connection = nm_simple_connection_new ();
|
||||
g_hash_table_insert (connections, g_strdup (basename), connection);
|
||||
|
||||
/* Start off assuming dynamic IP configurations. */
|
||||
|
||||
setting = nm_setting_ip4_config_new ();
|
||||
nm_connection_add_setting (connection, setting);
|
||||
g_object_set (setting,
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
|
||||
NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE,
|
||||
NULL);
|
||||
|
||||
setting = nm_setting_ip6_config_new ();
|
||||
nm_connection_add_setting (connection, setting);
|
||||
g_object_set (setting,
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
|
||||
NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE,
|
||||
NULL);
|
||||
|
||||
setting = nm_setting_connection_new ();
|
||||
nm_connection_add_setting (connection, setting);
|
||||
g_object_set (setting,
|
||||
NM_SETTING_CONNECTION_ID, ifname ?: "Wired Connection",
|
||||
NM_SETTING_CONNECTION_UUID, nm_utils_uuid_generate_a (),
|
||||
NM_SETTING_CONNECTION_INTERFACE_NAME, ifname,
|
||||
NULL);
|
||||
|
||||
if (!type_name)
|
||||
type_name = NM_SETTING_WIRED_SETTING_NAME;
|
||||
}
|
||||
|
||||
if (type_name) {
|
||||
g_object_set (setting, NM_SETTING_CONNECTION_TYPE, type_name, NULL);
|
||||
if (!nm_connection_get_setting_by_name (connection, type_name)) {
|
||||
setting = g_object_new (nm_setting_lookup_type (type_name), NULL);
|
||||
nm_connection_add_setting (connection, setting);
|
||||
}
|
||||
}
|
||||
|
||||
return connection;
|
||||
}
|
||||
|
||||
static char *
|
||||
get_word (char **argument, const char separator)
|
||||
{
|
||||
char *word;
|
||||
int nest = 0;
|
||||
|
||||
if (*argument == NULL)
|
||||
return NULL;
|
||||
|
||||
if (**argument == '[') {
|
||||
nest++;
|
||||
(*argument)++;
|
||||
}
|
||||
|
||||
word = *argument;
|
||||
|
||||
while (**argument != '\0') {
|
||||
if (nest && **argument == ']') {
|
||||
**argument = '\0';
|
||||
(*argument)++;
|
||||
nest--;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (nest == 0 && **argument == separator) {
|
||||
**argument = '\0';
|
||||
(*argument)++;
|
||||
break;
|
||||
}
|
||||
(*argument)++;
|
||||
}
|
||||
|
||||
return *word ? word : NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
_base_setting_set (NMConnection *connection, const char *property, const char *value)
|
||||
{
|
||||
NMSetting *setting;
|
||||
const char *type_name = nm_connection_get_connection_type (connection);
|
||||
GObjectClass *object_class = g_type_class_ref (nm_setting_lookup_type (type_name));
|
||||
GParamSpec *spec = g_object_class_find_property (object_class, property);
|
||||
|
||||
if (!spec) {
|
||||
_LOGW (LOGD_CORE, "'%s' does not support setting %s\n", type_name, property);
|
||||
return;
|
||||
}
|
||||
|
||||
setting = nm_connection_get_setting_by_name (connection, type_name);
|
||||
|
||||
if (G_IS_PARAM_SPEC_UINT (spec))
|
||||
g_object_set (setting, property, g_ascii_strtoull (value, NULL, 10), NULL);
|
||||
else if (G_IS_PARAM_SPEC_STRING (spec))
|
||||
g_object_set (setting, property, value, NULL);
|
||||
else
|
||||
_LOGW (LOGD_CORE, "Don't know how to set '%s' of %s\n", property, type_name);
|
||||
|
||||
g_type_class_unref (object_class);
|
||||
}
|
||||
|
||||
static void
|
||||
parse_ip (GHashTable *connections, const char *sysfs_dir, char *argument)
|
||||
{
|
||||
NMConnection *connection;
|
||||
NMSettingIPConfig *s_ip4 = NULL, *s_ip6 = NULL;
|
||||
gs_unref_hashtable GHashTable *ibft = NULL;
|
||||
const char *tmp;
|
||||
const char *kind = NULL;
|
||||
const char *client_ip = NULL;
|
||||
const char *peer = NULL;
|
||||
const char *gateway_ip = NULL;
|
||||
const char *netmask = NULL;
|
||||
const char *client_hostname = NULL;
|
||||
const char *ifname = NULL;
|
||||
const char *mtu = NULL;
|
||||
const char *macaddr = NULL;
|
||||
int client_ip_family = AF_UNSPEC;
|
||||
int client_ip_prefix = -1;
|
||||
const char *dns[2] = { 0, };
|
||||
int dns_addr_family[2] = { 0, };
|
||||
int i;
|
||||
GError *error = NULL;
|
||||
|
||||
if (!*argument)
|
||||
return;
|
||||
|
||||
tmp = get_word (&argument, ':');
|
||||
if (!*argument) {
|
||||
/* ip={dhcp|on|any|dhcp6|auto6|ibft} */
|
||||
kind = tmp;
|
||||
} else {
|
||||
client_ip_family = guess_ip_address_family (tmp);
|
||||
if (client_ip_family != AF_UNSPEC) {
|
||||
/* <client-IP>:[<peer>]:<gateway-IP>:<netmask>:<client_hostname>: */
|
||||
client_ip = tmp;
|
||||
peer = get_word (&argument, ':');
|
||||
gateway_ip = get_word (&argument, ':');
|
||||
netmask = get_word (&argument, ':');
|
||||
client_hostname = get_word (&argument, ':');
|
||||
ifname = get_word (&argument, ':');
|
||||
} else {
|
||||
ifname = tmp;
|
||||
}
|
||||
|
||||
/* <ifname>:{none|off|dhcp|on|any|dhcp6|auto6|ibft} */
|
||||
|
||||
kind = get_word (&argument, ':');
|
||||
|
||||
tmp = get_word (&argument, ':');
|
||||
dns_addr_family[0] = guess_ip_address_family (tmp);
|
||||
if (dns_addr_family[0] != AF_UNSPEC) {
|
||||
dns[0] = tmp;
|
||||
dns[1] = get_word (&argument, ':');
|
||||
dns_addr_family[1] = guess_ip_address_family (dns[1]);
|
||||
if (argument && *argument)
|
||||
_LOGW (LOGD_CORE, "Ignoring extra: '%s'.\n", argument);
|
||||
} else {
|
||||
mtu = tmp;
|
||||
macaddr = argument;
|
||||
}
|
||||
}
|
||||
|
||||
if (ifname == NULL && g_strcmp0 (kind, "ibft") == 0) {
|
||||
GHashTableIter iter;
|
||||
const char *mac;
|
||||
GHashTable *nic;
|
||||
const char *index;
|
||||
|
||||
/* This is the ip=ibft case. Just take all we got from iBFT
|
||||
* and don't process anything else, since there's no ifname
|
||||
* specified to apply it to. */
|
||||
if (!ibft)
|
||||
ibft = nmi_ibft_read (sysfs_dir);
|
||||
|
||||
g_hash_table_iter_init (&iter, ibft);
|
||||
while (g_hash_table_iter_next (&iter, (gpointer)&mac, (gpointer)&nic)) {
|
||||
connection = nm_simple_connection_new ();
|
||||
|
||||
index = g_hash_table_lookup (nic, "index");
|
||||
if (!index) {
|
||||
_LOGW (LOGD_CORE, "Ignoring an iBFT entry without an index\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!nmi_ibft_update_connection_from_nic (connection, nic, &error)) {
|
||||
_LOGW (LOGD_CORE, "Unable to merge iBFT configuration: %s\n", error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
|
||||
g_hash_table_insert (connections,
|
||||
g_strdup_printf ("ibft%s", index),
|
||||
connection);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Parsing done, construct the NMConnection. */
|
||||
connection = get_conn (connections, ifname, NULL);
|
||||
s_ip4 = nm_connection_get_setting_ip4_config (connection);
|
||||
s_ip6 = nm_connection_get_setting_ip6_config (connection);
|
||||
|
||||
if (netmask && *netmask) {
|
||||
NMIPAddr addr;
|
||||
|
||||
if (nm_utils_parse_inaddr_bin (AF_INET, netmask, &addr)) {
|
||||
client_ip_prefix = nm_utils_ip4_netmask_to_prefix (addr.addr4);
|
||||
} else {
|
||||
_LOGW (LOGD_CORE, "Unrecognized address: %s\n", client_ip);
|
||||
}
|
||||
}
|
||||
|
||||
/* Static IP configuration might be present. */
|
||||
if (client_ip && *client_ip) {
|
||||
NMIPAddress *address = NULL;
|
||||
NMIPAddr addr;
|
||||
|
||||
if (nm_utils_parse_inaddr_prefix_bin (client_ip_family, client_ip, &addr,
|
||||
client_ip_prefix == -1 ? &client_ip_prefix : NULL)) {
|
||||
if (client_ip_prefix == -1) {
|
||||
switch (client_ip_family) {
|
||||
case AF_INET:
|
||||
client_ip_prefix = _nm_utils_ip4_get_default_prefix (addr.addr4);
|
||||
break;
|
||||
case AF_INET6:
|
||||
client_ip_prefix = 64;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
address = nm_ip_address_new_binary (client_ip_family, &addr.addr_ptr, client_ip_prefix, &error);
|
||||
if (!address) {
|
||||
_LOGW (LOGD_CORE, "Invalid address '%s': %s\n", client_ip, error->message);
|
||||
g_clear_error (&error);
|
||||
}
|
||||
} else {
|
||||
_LOGW (LOGD_CORE, "Unrecognized address: %s\n", client_ip);
|
||||
}
|
||||
|
||||
if (address) {
|
||||
switch (client_ip_family) {
|
||||
case AF_INET:
|
||||
g_object_set (s_ip4,
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
|
||||
NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
|
||||
NULL);
|
||||
nm_setting_ip_config_add_address (s_ip4, address);
|
||||
break;
|
||||
case AF_INET6:
|
||||
g_object_set (s_ip6,
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
|
||||
NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
|
||||
NULL);
|
||||
nm_setting_ip_config_add_address (s_ip6, address);
|
||||
break;
|
||||
default:
|
||||
_LOGW (LOGD_CORE, "Unknown address family: %s\n", client_ip);
|
||||
break;
|
||||
}
|
||||
nm_ip_address_unref (address);
|
||||
}
|
||||
}
|
||||
|
||||
/* Dynamic IP configuration configured explicitly. */
|
||||
if (g_strcmp0 (kind, "none") == 0 || (g_strcmp0 (kind, "off") == 0)) {
|
||||
if (nm_setting_ip_config_get_num_addresses (s_ip6) == 0) {
|
||||
g_object_set (s_ip6,
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
|
||||
NULL);
|
||||
}
|
||||
if (nm_setting_ip_config_get_num_addresses (s_ip4) == 0) {
|
||||
g_object_set (s_ip4,
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
|
||||
NULL);
|
||||
}
|
||||
} else if (g_strcmp0 (kind, "dhcp") == 0) {
|
||||
g_object_set (s_ip4,
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO,
|
||||
NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
|
||||
NULL);
|
||||
if (nm_setting_ip_config_get_num_addresses (s_ip6) == 0) {
|
||||
g_object_set (s_ip6,
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
|
||||
NULL);
|
||||
}
|
||||
} else if (g_strcmp0 (kind, "dhcp6") == 0) {
|
||||
g_object_set (s_ip6,
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_DHCP,
|
||||
NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
|
||||
NULL);
|
||||
if (nm_setting_ip_config_get_num_addresses (s_ip4) == 0) {
|
||||
g_object_set (s_ip4,
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
|
||||
NULL);
|
||||
}
|
||||
} else if (g_strcmp0 (kind, "auto6") == 0) {
|
||||
g_object_set (s_ip4,
|
||||
NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
|
||||
NULL);
|
||||
if (nm_setting_ip_config_get_num_addresses (s_ip4) == 0) {
|
||||
g_object_set (s_ip4,
|
||||
NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
|
||||
NULL);
|
||||
}
|
||||
} else if (g_strcmp0 (kind, "ibft") == 0) {
|
||||
gs_free char *address_path = g_build_filename (sysfs_dir, "class", "net", ifname, "address", NULL);
|
||||
gs_free char *mac, *mac_up = NULL;
|
||||
GHashTable *nic = NULL;
|
||||
|
||||
if (!g_file_get_contents (address_path, &mac, NULL, &error)) {
|
||||
_LOGW (LOGD_CORE, "Can't get a MAC address for %s: %s", ifname, error->message);
|
||||
g_clear_error (&error);
|
||||
}
|
||||
|
||||
if (mac) {
|
||||
g_strchomp (mac);
|
||||
mac_up = g_ascii_strup (mac, -1);
|
||||
if (!ibft)
|
||||
ibft = nmi_ibft_read (sysfs_dir);
|
||||
nic = g_hash_table_lookup (ibft, mac_up);
|
||||
if (!nic)
|
||||
_LOGW (LOGD_CORE, "No iBFT NIC for %s (%s)\n", ifname, mac_up);
|
||||
}
|
||||
|
||||
if (nic) {
|
||||
if (!nmi_ibft_update_connection_from_nic (connection, nic, &error)) {
|
||||
_LOGW (LOGD_CORE, "Unable to merge iBFT configuration: %s\n", error->message);
|
||||
g_clear_error (&error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (peer && *peer)
|
||||
_LOGW (LOGD_CORE, "Ignoring peer: %s (not implemented)\b", peer);
|
||||
|
||||
if (gateway_ip && *gateway_ip) {
|
||||
int addr_family = guess_ip_address_family (gateway_ip);
|
||||
|
||||
if (nm_utils_ipaddr_valid (addr_family, gateway_ip)) {
|
||||
switch (addr_family) {
|
||||
case AF_INET:
|
||||
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_GATEWAY, gateway_ip, NULL);
|
||||
break;
|
||||
case AF_INET6:
|
||||
g_object_set (s_ip6, NM_SETTING_IP_CONFIG_GATEWAY, gateway_ip, NULL);
|
||||
break;
|
||||
default:
|
||||
_LOGW (LOGD_CORE, "Unknown address family: %s\n", gateway_ip);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
_LOGW (LOGD_CORE, "Invalid gateway: %s\n", gateway_ip);
|
||||
}
|
||||
}
|
||||
|
||||
if (client_hostname && *client_hostname) {
|
||||
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, client_hostname, NULL);
|
||||
g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, client_hostname, NULL);
|
||||
}
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
if (dns_addr_family[i] == AF_UNSPEC)
|
||||
break;
|
||||
if (nm_utils_ipaddr_valid (dns_addr_family[i], dns[i])) {
|
||||
switch (dns_addr_family[i]) {
|
||||
case AF_INET:
|
||||
nm_setting_ip_config_add_dns (s_ip4, dns[i]);
|
||||
break;
|
||||
case AF_INET6:
|
||||
nm_setting_ip_config_add_dns (s_ip6, dns[i]);
|
||||
break;
|
||||
default:
|
||||
_LOGW (LOGD_CORE, "Unknown address family: %s\n", dns[i]);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
_LOGW (LOGD_CORE, "Invalid name server: %s\n", dns[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (mtu && *mtu)
|
||||
_base_setting_set (connection, "mtu", mtu);
|
||||
|
||||
if (macaddr && *macaddr)
|
||||
_base_setting_set (connection, "cloned-mac-address", macaddr);
|
||||
}
|
||||
|
||||
static void
|
||||
parse_master (GHashTable *connections, char *argument, const char *type_name)
|
||||
{
|
||||
NMConnection *connection;
|
||||
NMSettingConnection *s_con;
|
||||
NMSettingBond *s_bond;
|
||||
gs_free char *master_to_free = NULL;
|
||||
const char *master;
|
||||
char *slaves;
|
||||
const char *slave;
|
||||
char *opts;
|
||||
char *opt;
|
||||
const char *opt_name;
|
||||
const char *mtu = NULL;
|
||||
|
||||
master = get_word (&argument, ':');
|
||||
if (!master)
|
||||
master = master_to_free = g_strdup_printf ("%s0", type_name);
|
||||
slaves = get_word (&argument, ':');
|
||||
|
||||
connection = get_conn (connections, master, type_name);
|
||||
s_con = nm_connection_get_setting_connection (connection);
|
||||
master = nm_setting_connection_get_uuid (s_con);
|
||||
|
||||
if (strcmp (type_name, NM_SETTING_BOND_SETTING_NAME) == 0) {
|
||||
s_bond = (NMSettingBond *)nm_connection_get_setting_by_name (connection, type_name);
|
||||
|
||||
opts = get_word (&argument, ':');
|
||||
while (opts && *opts) {
|
||||
opt = get_word (&opts, ',');
|
||||
opt_name = get_word (&opt, '=');
|
||||
nm_setting_bond_add_option (s_bond, opt_name, opt);
|
||||
}
|
||||
|
||||
mtu = get_word (&argument, ':');
|
||||
}
|
||||
|
||||
do {
|
||||
slave = get_word (&slaves, ',');
|
||||
if (slave == NULL)
|
||||
slave = "eth0";
|
||||
|
||||
connection = get_conn (connections, slave, NULL);
|
||||
s_con = nm_connection_get_setting_connection (connection);
|
||||
g_object_set (s_con,
|
||||
NM_SETTING_CONNECTION_SLAVE_TYPE, type_name,
|
||||
NM_SETTING_CONNECTION_MASTER, master,
|
||||
NULL);
|
||||
if (mtu)
|
||||
_base_setting_set (connection, "mtu", mtu);
|
||||
} while (slaves && *slaves != '\0');
|
||||
|
||||
if (argument && *argument)
|
||||
_LOGW (LOGD_CORE, "Ignoring extra: '%s'.\n", argument);
|
||||
}
|
||||
|
||||
static void
|
||||
parse_rd_route (GHashTable *connections, char *argument)
|
||||
{
|
||||
NMConnection *connection;
|
||||
const char *net;
|
||||
const char *gateway;
|
||||
const char *interface;
|
||||
int family = AF_UNSPEC;
|
||||
NMIPAddr net_addr = { 0, };
|
||||
NMIPAddr gateway_addr = { 0, };
|
||||
int net_prefix = -1;
|
||||
NMIPRoute *route;
|
||||
NMSettingIPConfig *s_ip;
|
||||
GError *error = NULL;
|
||||
|
||||
net = get_word (&argument, ':');
|
||||
gateway = get_word (&argument, ':');
|
||||
interface = get_word (&argument, ':');
|
||||
|
||||
family = guess_ip_address_family (net);
|
||||
connection = get_conn (connections, interface, NULL);
|
||||
|
||||
if (net && *net) {
|
||||
if (!nm_utils_parse_inaddr_prefix_bin (family, net, &net_addr, &net_prefix)) {
|
||||
_LOGW (LOGD_CORE, "Unrecognized address: %s\n", net);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (gateway && *net) {
|
||||
if (!nm_utils_parse_inaddr_bin (family, gateway, &gateway_addr)) {
|
||||
_LOGW (LOGD_CORE, "Unrecognized address: %s\n", gateway);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
switch (family) {
|
||||
case AF_INET:
|
||||
s_ip = nm_connection_get_setting_ip4_config (connection);
|
||||
if (net_prefix == -1)
|
||||
net_prefix = 32;
|
||||
break;
|
||||
case AF_INET6:
|
||||
s_ip = nm_connection_get_setting_ip6_config (connection);
|
||||
if (net_prefix == -1)
|
||||
net_prefix = 128;
|
||||
break;
|
||||
default:
|
||||
_LOGW (LOGD_CORE, "Unknown address family: %s\n", net);
|
||||
return;
|
||||
}
|
||||
|
||||
route = nm_ip_route_new_binary (family, &net_addr.addr_ptr, net_prefix, &gateway_addr.addr_ptr, -1, &error);
|
||||
if (!route) {
|
||||
g_warning ("Invalid route '%s via %s': %s\n", net, gateway, error->message);
|
||||
g_clear_error (&error);
|
||||
return;
|
||||
}
|
||||
|
||||
nm_setting_ip_config_add_route (s_ip, route);
|
||||
nm_ip_route_unref (route);
|
||||
}
|
||||
|
||||
static void
|
||||
parse_vlan (GHashTable *connections, char *argument)
|
||||
{
|
||||
NMConnection *connection;
|
||||
NMSettingVlan *s_vlan;
|
||||
const char *vlan;
|
||||
const char *phy;
|
||||
const char *vlanid;
|
||||
|
||||
vlan = get_word (&argument, ':');
|
||||
phy = get_word (&argument, ':');
|
||||
|
||||
for (vlanid = vlan + strlen (vlan); vlanid > vlan; vlanid--) {
|
||||
if (!g_ascii_isdigit (*(vlanid - 1)))
|
||||
break;
|
||||
}
|
||||
|
||||
connection = get_conn (connections, vlan, NM_SETTING_VLAN_SETTING_NAME);
|
||||
|
||||
s_vlan = nm_connection_get_setting_vlan (connection);
|
||||
g_object_set (s_vlan,
|
||||
NM_SETTING_VLAN_PARENT, phy,
|
||||
NM_SETTING_VLAN_ID, g_ascii_strtoull (vlanid, NULL, 10),
|
||||
NULL);
|
||||
|
||||
if (argument && *argument)
|
||||
_LOGW (LOGD_CORE, "Ignoring extra: '%s'.\n", argument);
|
||||
}
|
||||
|
||||
static void
|
||||
parse_bootdev (GHashTable *connections, char *argument)
|
||||
{
|
||||
NMConnection *connection;
|
||||
NMSettingConnection *s_con;
|
||||
|
||||
connection = get_conn (connections, NULL, NULL);
|
||||
|
||||
s_con = nm_connection_get_setting_connection (connection);
|
||||
g_object_set (s_con,
|
||||
NM_SETTING_CONNECTION_INTERFACE_NAME, argument,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
parse_nameserver (GHashTable *connections, char *argument)
|
||||
{
|
||||
NMConnection *connection;
|
||||
NMSettingIPConfig *s_ip = NULL;
|
||||
char *dns;
|
||||
|
||||
connection = get_conn (connections, NULL, NULL);
|
||||
|
||||
dns = get_word (&argument, '\0');
|
||||
|
||||
switch (guess_ip_address_family (dns)) {
|
||||
case AF_INET:
|
||||
s_ip = nm_connection_get_setting_ip4_config (connection);
|
||||
break;
|
||||
case AF_INET6:
|
||||
s_ip = nm_connection_get_setting_ip6_config (connection);
|
||||
break;
|
||||
default:
|
||||
_LOGW (LOGD_CORE, "Unknown address family: %s\n", dns);
|
||||
break;
|
||||
}
|
||||
|
||||
nm_setting_ip_config_add_dns (s_ip, dns);
|
||||
|
||||
if (argument && *argument)
|
||||
_LOGW (LOGD_CORE, "xIgnoring extra: '%s'.\n", argument);
|
||||
}
|
||||
|
||||
static void
|
||||
parse_rd_peerdns (GHashTable *connections, char *argument)
|
||||
{
|
||||
gboolean auto_dns = !_nm_utils_ascii_str_to_bool (argument, TRUE);
|
||||
NMConnection *connection;
|
||||
NMSettingIPConfig *s_ip = NULL;
|
||||
|
||||
connection = get_conn (connections, NULL, NULL);
|
||||
|
||||
s_ip = nm_connection_get_setting_ip4_config (connection);
|
||||
g_object_set (s_ip,
|
||||
NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, auto_dns,
|
||||
NULL);
|
||||
|
||||
|
||||
s_ip = nm_connection_get_setting_ip6_config (connection);
|
||||
g_object_set (s_ip,
|
||||
NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, auto_dns,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
_normalize_conn (gpointer key, gpointer value, gpointer user_data)
|
||||
{
|
||||
NMConnection *connection = value;
|
||||
|
||||
nm_connection_normalize (connection, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
GHashTable *
|
||||
nmi_cmdline_reader_parse (const char *sysfs_dir, char **argv)
|
||||
{
|
||||
GHashTable *connections;
|
||||
const char *tag;
|
||||
char *argument;
|
||||
gboolean ignore_bootif = FALSE;
|
||||
char *bootif = NULL;
|
||||
int i;
|
||||
|
||||
connections = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_object_unref);
|
||||
|
||||
for (i = 0; argv[i]; i++) {
|
||||
argument = argv[i];
|
||||
tag = get_word (&argument, '=');
|
||||
if (strcmp (tag, "ip") == 0)
|
||||
parse_ip (connections, sysfs_dir, argument);
|
||||
else if (strcmp (tag, "rd.route") == 0)
|
||||
parse_rd_route (connections, argument);
|
||||
else if (strcmp (tag, "bridge") == 0)
|
||||
parse_master (connections, argument, NM_SETTING_BRIDGE_SETTING_NAME);
|
||||
else if (strcmp (tag, "bond") == 0)
|
||||
parse_master (connections, argument, NM_SETTING_BOND_SETTING_NAME);
|
||||
else if (strcmp (tag, "team") == 0)
|
||||
parse_master (connections, argument, NM_SETTING_TEAM_SETTING_NAME);
|
||||
else if (strcmp (tag, "vlan") == 0)
|
||||
parse_vlan (connections, argument);
|
||||
else if (strcmp (tag, "bootdev") == 0)
|
||||
parse_bootdev (connections, argument);
|
||||
else if (strcmp (tag, "nameserver") == 0)
|
||||
parse_nameserver (connections, argument);
|
||||
else if (strcmp (tag, "rd.peerdns") == 0)
|
||||
parse_rd_peerdns (connections, argument);
|
||||
else if (strcmp (tag, "rd.bootif") == 0)
|
||||
ignore_bootif = !_nm_utils_ascii_str_to_bool (argument, TRUE);
|
||||
else if (strcasecmp (tag, "BOOTIF") == 0)
|
||||
bootif = argument;
|
||||
}
|
||||
|
||||
if (ignore_bootif)
|
||||
bootif = NULL;
|
||||
if (bootif) {
|
||||
NMConnection *connection;
|
||||
NMSettingWired *s_wired;
|
||||
|
||||
connection = get_conn (connections, NULL, NM_SETTING_WIRED_SETTING_NAME);
|
||||
|
||||
s_wired = nm_connection_get_setting_wired (connection);
|
||||
g_object_set (s_wired,
|
||||
NM_SETTING_WIRED_MAC_ADDRESS, bootif,
|
||||
NULL);
|
||||
}
|
||||
|
||||
g_hash_table_foreach (connections, _normalize_conn, NULL);
|
||||
|
||||
return connections;
|
||||
}
|
||||
441
src/initrd/nmi-ibft-reader.c
Normal file
441
src/initrd/nmi-ibft-reader.c
Normal file
|
|
@ -0,0 +1,441 @@
|
|||
/* NetworkManager initrd configuration generator
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright 2014 - 2018 Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#include "nm-default.h"
|
||||
|
||||
#include "nm-initrd-generator.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/inotify.h>
|
||||
#include <errno.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "nm-core-internal.h"
|
||||
#include "platform/nm-platform.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define _NMLOG(level, domain, ...) \
|
||||
nm_log ((level), (domain), NULL, NULL, \
|
||||
"ibft-reader: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__) \
|
||||
_NM_UTILS_MACRO_REST (__VA_ARGS__))
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static GHashTable *
|
||||
load_one_nic (const char *sysfs_dir, const char *dir_name)
|
||||
{
|
||||
gs_free char *nic_path = g_build_filename (sysfs_dir, dir_name, NULL);
|
||||
GDir *nic_dir;
|
||||
const char *entry_name;
|
||||
char *content;
|
||||
gs_free_error GError *error = NULL;
|
||||
GHashTable *nic;
|
||||
|
||||
g_return_val_if_fail (sysfs_dir != NULL, FALSE);
|
||||
|
||||
nic_dir = g_dir_open (nic_path, 0, &error);
|
||||
if (!nic_dir) {
|
||||
_LOGW (LOGD_CORE, "Can't open %s: %s", nic_path, error->message);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nic = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_free);
|
||||
while ((entry_name = g_dir_read_name (nic_dir))) {
|
||||
gs_free char *entry_path = g_build_filename (nic_path, entry_name, NULL);
|
||||
|
||||
if (!g_file_test (entry_path, G_FILE_TEST_IS_REGULAR))
|
||||
continue;
|
||||
|
||||
if (!g_file_get_contents (entry_path, &content, NULL, &error)) {
|
||||
_LOGW (LOGD_CORE, "Can't read %s: %s", entry_path, error->message);
|
||||
g_clear_error (&error);
|
||||
continue;
|
||||
}
|
||||
|
||||
g_strchomp (content);
|
||||
if (!g_hash_table_insert (nic, g_strdup (entry_name), content))
|
||||
_LOGW (LOGD_CORE, "Duplicate iBFT entry: %s", entry_name);
|
||||
}
|
||||
|
||||
g_dir_close (nic_dir);
|
||||
|
||||
return nic;
|
||||
}
|
||||
|
||||
GHashTable *
|
||||
nmi_ibft_read (const char *sysfs_dir)
|
||||
{
|
||||
gs_free char *ibft_path = NULL;
|
||||
GDir *ibft_dir;
|
||||
const char *dir_name;
|
||||
GHashTable *ibft, *nic;
|
||||
char *mac;
|
||||
gs_free_error GError *error = NULL;
|
||||
|
||||
g_return_val_if_fail (sysfs_dir != NULL, FALSE);
|
||||
|
||||
ibft_path = g_build_filename (sysfs_dir, "firmware", "ibft", NULL);
|
||||
|
||||
ibft = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free,
|
||||
(GDestroyNotify) g_hash_table_unref);
|
||||
|
||||
if (!g_file_test (ibft_path, G_FILE_TEST_IS_DIR))
|
||||
nm_utils_modprobe (NULL, FALSE, "iscsi_ibft", NULL);
|
||||
if (!g_file_test (ibft_path, G_FILE_TEST_IS_DIR))
|
||||
return ibft;
|
||||
|
||||
ibft_dir = g_dir_open (ibft_path, 0, &error);
|
||||
if (!ibft_dir) {
|
||||
_LOGW (LOGD_CORE, "Unable to open iBFT firmware directory: %s", error->message);
|
||||
return ibft;
|
||||
}
|
||||
|
||||
while ((dir_name = g_dir_read_name (ibft_dir))) {
|
||||
if (!g_str_has_prefix (dir_name, "ethernet"))
|
||||
continue;
|
||||
|
||||
nic = load_one_nic (ibft_path, dir_name);
|
||||
mac = g_hash_table_lookup (nic, "mac");
|
||||
|
||||
if (!mac) {
|
||||
_LOGW (LOGD_CORE, "Ignoring an iBFT record without a MAC address");
|
||||
g_hash_table_unref (nic);
|
||||
continue;
|
||||
}
|
||||
|
||||
mac = g_ascii_strup (mac, -1);
|
||||
if (!g_hash_table_insert (ibft, mac, nic))
|
||||
_LOGW (LOGD_CORE, "Duplicate iBFT record for %s", mac);
|
||||
}
|
||||
|
||||
g_dir_close (ibft_dir);
|
||||
|
||||
return ibft;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
ip_setting_add_from_block (GHashTable *nic,
|
||||
NMConnection *connection,
|
||||
GError **error)
|
||||
{
|
||||
NMSettingIPConfig *s_ip = NULL;
|
||||
NMSettingIPConfig *s_ip4 = NULL;
|
||||
NMSettingIPConfig *s_ip6 = NULL;
|
||||
NMIPAddress *addr;
|
||||
const char *s_ipaddr = NULL;
|
||||
const char *s_prefix = NULL;
|
||||
const char *s_gateway = NULL;
|
||||
const char *s_dns1 = NULL;
|
||||
const char *s_dns2 = NULL;
|
||||
const char *s_origin = NULL;
|
||||
const char *method = NULL;
|
||||
int family;
|
||||
gint64 prefix;
|
||||
|
||||
s_ipaddr = (const char *)g_hash_table_lookup (nic, "ip-addr");
|
||||
s_prefix = (const char *)g_hash_table_lookup (nic, "prefix-len");
|
||||
s_gateway = (const char *)g_hash_table_lookup (nic, "gateway");
|
||||
s_dns1 = (const char *)g_hash_table_lookup (nic, "primary-dns");
|
||||
s_dns2 = (const char *)g_hash_table_lookup (nic, "secondary-dns");
|
||||
s_origin = (const char *)g_hash_table_lookup (nic, "origin");
|
||||
|
||||
s_ip4 = nm_connection_get_setting_ip4_config (connection);
|
||||
if (!s_ip4) {
|
||||
s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new ();
|
||||
nm_connection_add_setting (connection, (NMSetting *) s_ip4);
|
||||
}
|
||||
|
||||
s_ip6 = nm_connection_get_setting_ip6_config (connection);
|
||||
if (!s_ip6) {
|
||||
s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new ();
|
||||
nm_connection_add_setting (connection, (NMSetting *) s_ip6);
|
||||
}
|
||||
|
||||
family = guess_ip_address_family (s_ipaddr);
|
||||
if (family == AF_UNSPEC)
|
||||
family = guess_ip_address_family (s_gateway);
|
||||
|
||||
switch (family) {
|
||||
case AF_INET:
|
||||
s_ip = s_ip4;
|
||||
g_object_set (s_ip6, NM_SETTING_IP_CONFIG_METHOD,
|
||||
NM_SETTING_IP6_CONFIG_METHOD_IGNORE, NULL);
|
||||
break;
|
||||
case AF_INET6:
|
||||
s_ip = s_ip6;
|
||||
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD,
|
||||
NM_SETTING_IP4_CONFIG_METHOD_DISABLED, NULL);
|
||||
break;
|
||||
default:
|
||||
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
|
||||
"iBFT: invalid IP address '%s'.",
|
||||
s_ipaddr);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ( (g_strcmp0 (s_origin, "3") == 0 && family == AF_INET)
|
||||
|| (g_strcmp0 (s_origin, "4") == 0 && family == AF_INET)) {
|
||||
method = NM_SETTING_IP4_CONFIG_METHOD_AUTO;
|
||||
} else if (g_strcmp0 (s_origin, "3") == 0 && family == AF_INET6) {
|
||||
method = NM_SETTING_IP6_CONFIG_METHOD_DHCP;
|
||||
} else if (g_strcmp0 (s_origin, "4") == 0 && family == AF_INET6) {
|
||||
method = NM_SETTING_IP6_CONFIG_METHOD_AUTO;
|
||||
} else if (family == AF_INET) {
|
||||
method = NM_SETTING_IP4_CONFIG_METHOD_MANUAL;
|
||||
} else if (family == AF_INET6) {
|
||||
method = NM_SETTING_IP6_CONFIG_METHOD_MANUAL;
|
||||
} else {
|
||||
g_return_val_if_reached (FALSE);
|
||||
}
|
||||
g_object_set (s_ip,
|
||||
NM_SETTING_IP_CONFIG_METHOD, method,
|
||||
NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE,
|
||||
NULL);
|
||||
|
||||
if (s_gateway && !nm_utils_ipaddr_valid (family, s_gateway)) {
|
||||
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
|
||||
"iBFT: invalid IP gateway '%s'.", s_gateway);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (s_dns1 && !nm_utils_ipaddr_valid (family, s_dns1)) {
|
||||
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
|
||||
"iBFT: invalid DNS1 address '%s'.", s_dns1);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (s_dns2 && !nm_utils_ipaddr_valid (family, s_dns2)) {
|
||||
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
|
||||
"iBFT: invalid DNS2 address '%s'.", s_dns2);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (s_ipaddr) {
|
||||
prefix = _nm_utils_ascii_str_to_int64 (s_prefix, 10, 0, 128, -1);
|
||||
if (prefix == -1) {
|
||||
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
|
||||
"iBFT: invalid IP prefix '%s'.", s_prefix);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
addr = nm_ip_address_new (family, s_ipaddr, prefix, error);
|
||||
if (!addr) {
|
||||
g_prefix_error (error, "iBFT: ");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
nm_setting_ip_config_add_address (s_ip, addr);
|
||||
nm_ip_address_unref (addr);
|
||||
|
||||
g_object_set (s_ip, NM_SETTING_IP_CONFIG_GATEWAY, s_gateway, NULL);
|
||||
}
|
||||
|
||||
if (s_dns1)
|
||||
nm_setting_ip_config_add_dns (s_ip, s_dns1);
|
||||
if (s_dns2)
|
||||
nm_setting_ip_config_add_dns (s_ip, s_dns2);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
connection_setting_add (GHashTable *nic,
|
||||
NMConnection *connection,
|
||||
const char *type,
|
||||
const char *prefix,
|
||||
GError **error)
|
||||
{
|
||||
NMSetting *s_con;
|
||||
char *id, *uuid;
|
||||
const char *s_index, *s_hwaddr, *s_ipaddr, *s_vlanid;
|
||||
|
||||
s_index = (const char *)g_hash_table_lookup (nic, "index");
|
||||
s_hwaddr = (const char *)g_hash_table_lookup (nic, "mac");
|
||||
s_ipaddr = (const char *)g_hash_table_lookup (nic, "ip-addr");
|
||||
s_vlanid = (const char *)g_hash_table_lookup (nic, "vlan");
|
||||
|
||||
if (!s_hwaddr) {
|
||||
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
|
||||
"iBFT: missing MAC address");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
id = g_strdup_printf ("iBFT%s%s Connection%s%s",
|
||||
prefix ? " " : "",
|
||||
prefix ? prefix : "",
|
||||
s_index ? " " : "",
|
||||
s_index ? s_index : "");
|
||||
|
||||
uuid = _nm_utils_uuid_generate_from_strings ("ibft",
|
||||
s_hwaddr,
|
||||
s_vlanid ? "V" : "v",
|
||||
s_vlanid ? s_vlanid : "",
|
||||
s_ipaddr ? "A" : "DHCP",
|
||||
s_ipaddr ? s_ipaddr : "",
|
||||
NULL);
|
||||
|
||||
s_con = (NMSetting *) nm_connection_get_setting_connection (connection);
|
||||
if (!s_con) {
|
||||
s_con = nm_setting_connection_new ();
|
||||
nm_connection_add_setting (connection, s_con);
|
||||
}
|
||||
|
||||
g_object_set (s_con,
|
||||
NM_SETTING_CONNECTION_TYPE, type,
|
||||
NM_SETTING_CONNECTION_UUID, uuid,
|
||||
NM_SETTING_CONNECTION_ID, id,
|
||||
NULL);
|
||||
|
||||
g_free (uuid);
|
||||
g_free (id);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_ibft_vlan_device (GHashTable *nic)
|
||||
{
|
||||
const char *s_vlan_id;
|
||||
|
||||
g_assert (nic);
|
||||
|
||||
s_vlan_id = (const char *)g_hash_table_lookup (nic, "vlan");
|
||||
|
||||
if (s_vlan_id) {
|
||||
/* VLAN 0 is normally a valid VLAN ID, but in the iBFT case it
|
||||
* means "no VLAN".
|
||||
*/
|
||||
if (_nm_utils_ascii_str_to_int64 (s_vlan_id, 10, 1, 4095, -1) != -1)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
vlan_setting_add_from_block (GHashTable *nic,
|
||||
NMConnection *connection,
|
||||
GError **error)
|
||||
{
|
||||
NMSetting *s_vlan = NULL;
|
||||
const char *vlan_id_str = NULL;
|
||||
gint64 vlan_id = -1;
|
||||
|
||||
g_assert (nic);
|
||||
g_assert (connection);
|
||||
|
||||
/* This won't fail since this function shouldn't be called unless the
|
||||
* iBFT VLAN ID exists and is > 0.
|
||||
*/
|
||||
vlan_id_str = (const char *)g_hash_table_lookup (nic, "vlan");
|
||||
g_assert (vlan_id_str);
|
||||
|
||||
/* VLAN 0 is normally a valid VLAN ID, but in the iBFT case it means "no VLAN" */
|
||||
vlan_id = _nm_utils_ascii_str_to_int64 (vlan_id_str, 10, 1, 4095, -1);
|
||||
if (vlan_id == -1) {
|
||||
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
|
||||
"Invalid VLAN_ID '%s'", vlan_id_str);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
s_vlan = (NMSetting *) nm_connection_get_setting_vlan (connection);
|
||||
if (!s_vlan) {
|
||||
s_vlan = nm_setting_vlan_new ();
|
||||
nm_connection_add_setting (connection, s_vlan);
|
||||
}
|
||||
|
||||
g_object_set (s_vlan, NM_SETTING_VLAN_ID, (guint32) vlan_id, NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
wired_setting_add_from_block (GHashTable *nic,
|
||||
NMConnection *connection,
|
||||
GError **error)
|
||||
{
|
||||
NMSetting *s_wired = NULL;
|
||||
const char *hwaddr = NULL;
|
||||
|
||||
g_assert (nic);
|
||||
g_assert (connection);
|
||||
|
||||
|
||||
hwaddr = (const char *)g_hash_table_lookup (nic, "mac");
|
||||
if (!hwaddr) {
|
||||
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
|
||||
"iBFT: missing MAC address");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!nm_utils_hwaddr_valid (hwaddr, ETH_ALEN)) {
|
||||
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
|
||||
"iBFT: invalid MAC address '%s'.", hwaddr);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
s_wired = (NMSetting *) nm_connection_get_setting_wired (connection);
|
||||
if (!s_wired) {
|
||||
s_wired = nm_setting_wired_new ();
|
||||
nm_connection_add_setting (connection, s_wired);
|
||||
}
|
||||
|
||||
g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS, hwaddr, NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
nmi_ibft_update_connection_from_nic (NMConnection *connection, GHashTable *nic, GError **error)
|
||||
{
|
||||
gboolean is_vlan = FALSE;
|
||||
|
||||
g_assert (nic);
|
||||
|
||||
is_vlan = is_ibft_vlan_device (nic);
|
||||
if (is_vlan && !vlan_setting_add_from_block (nic, connection, error))
|
||||
return FALSE;
|
||||
|
||||
/* Always have a wired setting; for VLAN it defines the parent */
|
||||
if (!wired_setting_add_from_block (nic, connection, error))
|
||||
return FALSE;
|
||||
|
||||
if (!ip_setting_add_from_block (nic, connection, error))
|
||||
return FALSE;
|
||||
|
||||
if (!connection_setting_add (nic,
|
||||
connection,
|
||||
is_vlan ? NM_SETTING_VLAN_SETTING_NAME : NM_SETTING_WIRED_SETTING_NAME,
|
||||
is_vlan ? "VLAN" : NULL,
|
||||
error))
|
||||
return FALSE;
|
||||
|
||||
if (!nm_connection_normalize (connection, NULL, NULL, error))
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
22
src/initrd/tests/meson.build
Normal file
22
src/initrd/tests/meson.build
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
test_unit = 'test-ibft'
|
||||
|
||||
test_ibft_dir = meson.current_source_dir()
|
||||
|
||||
cflags = [
|
||||
'-DTEST_IBFT_DIR="@0@"'.format(test_ibft_dir),
|
||||
'-DTEST_SCRATCH_DIR="@0@"'.format(test_ibft_dir)
|
||||
]
|
||||
|
||||
exe = executable(
|
||||
test_unit,
|
||||
test_unit + '.c',
|
||||
dependencies: test_nm_dep,
|
||||
c_args: cflags,
|
||||
link_with: libnmi_ibft_core
|
||||
)
|
||||
|
||||
test(
|
||||
'ibft/' + test_unit,
|
||||
test_script,
|
||||
args: test_args + [exe.full_path()]
|
||||
)
|
||||
1
src/initrd/tests/sysfs-bad-dns1/class/net/eth0/address
Normal file
1
src/initrd/tests/sysfs-bad-dns1/class/net/eth0/address
Normal file
|
|
@ -0,0 +1 @@
|
|||
00:33:21:98:b9:f0
|
||||
|
|
@ -0,0 +1 @@
|
|||
192.168.35.254
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
|
|
@ -0,0 +1 @@
|
|||
192.168.32.72
|
||||
|
|
@ -0,0 +1 @@
|
|||
00:33:21:98:b9:f0
|
||||
|
|
@ -0,0 +1 @@
|
|||
1
|
||||
|
|
@ -0,0 +1 @@
|
|||
22
|
||||
|
|
@ -0,0 +1 @@
|
|||
10000.500.250.1
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.255.3
|
||||
|
|
@ -0,0 +1 @@
|
|||
255.255.252.0
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
|
|
@ -0,0 +1 @@
|
|||
iqn.pjones6
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.52.16
|
||||
|
|
@ -0,0 +1 @@
|
|||
00000000
|
||||
|
|
@ -0,0 +1 @@
|
|||
3260
|
||||
|
|
@ -0,0 +1 @@
|
|||
iqn.0.2008-11.com.blahblah:iscsi0
|
||||
1
src/initrd/tests/sysfs-bad-dns2/class/net/eth0/address
Normal file
1
src/initrd/tests/sysfs-bad-dns2/class/net/eth0/address
Normal file
|
|
@ -0,0 +1 @@
|
|||
00:33:21:98:b9:f0
|
||||
|
|
@ -0,0 +1 @@
|
|||
192.168.35.254
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
|
|
@ -0,0 +1 @@
|
|||
192.168.32.72
|
||||
|
|
@ -0,0 +1 @@
|
|||
00:33:21:98:b9:f0
|
||||
|
|
@ -0,0 +1 @@
|
|||
1
|
||||
|
|
@ -0,0 +1 @@
|
|||
22
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.255.2
|
||||
|
|
@ -0,0 +1 @@
|
|||
blah.foo.bar.baz
|
||||
|
|
@ -0,0 +1 @@
|
|||
255.255.252.0
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
|
|
@ -0,0 +1 @@
|
|||
iqn.pjones6
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.52.16
|
||||
|
|
@ -0,0 +1 @@
|
|||
00000000
|
||||
|
|
@ -0,0 +1 @@
|
|||
3260
|
||||
|
|
@ -0,0 +1 @@
|
|||
iqn.0.2008-11.com.blahblah:iscsi0
|
||||
|
|
@ -0,0 +1 @@
|
|||
00:33:21:98:b9:f0
|
||||
|
|
@ -0,0 +1 @@
|
|||
bb.cc.dd.ee
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
|
|
@ -0,0 +1 @@
|
|||
192.168.32.72
|
||||
|
|
@ -0,0 +1 @@
|
|||
00:33:21:98:b9:f0
|
||||
|
|
@ -0,0 +1 @@
|
|||
1
|
||||
|
|
@ -0,0 +1 @@
|
|||
22
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.255.2
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.255.3
|
||||
|
|
@ -0,0 +1 @@
|
|||
255.255.252.0
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
|
|
@ -0,0 +1 @@
|
|||
iqn.pjones6
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.52.16
|
||||
|
|
@ -0,0 +1 @@
|
|||
00000000
|
||||
|
|
@ -0,0 +1 @@
|
|||
3260
|
||||
|
|
@ -0,0 +1 @@
|
|||
iqn.0.2008-11.com.blahblah:iscsi0
|
||||
1
src/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address
Normal file
1
src/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address
Normal file
|
|
@ -0,0 +1 @@
|
|||
00:33:21:98:b9:f0
|
||||
|
|
@ -0,0 +1 @@
|
|||
192.168.35.254
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
|
|
@ -0,0 +1 @@
|
|||
aa.bb.cc.dd
|
||||
|
|
@ -0,0 +1 @@
|
|||
00:33:21:98:b9:f0
|
||||
|
|
@ -0,0 +1 @@
|
|||
1
|
||||
|
|
@ -0,0 +1 @@
|
|||
22
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.255.2
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.255.3
|
||||
|
|
@ -0,0 +1 @@
|
|||
255.255.252.0
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
|
|
@ -0,0 +1 @@
|
|||
iqn.pjones6
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.52.16
|
||||
|
|
@ -0,0 +1 @@
|
|||
00000000
|
||||
|
|
@ -0,0 +1 @@
|
|||
3260
|
||||
|
|
@ -0,0 +1 @@
|
|||
iqn.0.2008-11.com.blahblah:iscsi0
|
||||
1
src/initrd/tests/sysfs-dhcp/class/net/eth0/address
Normal file
1
src/initrd/tests/sysfs-dhcp/class/net/eth0/address
Normal file
|
|
@ -0,0 +1 @@
|
|||
00:33:21:98:b9:f0
|
||||
1
src/initrd/tests/sysfs-dhcp/class/net/eth1/address
Normal file
1
src/initrd/tests/sysfs-dhcp/class/net/eth1/address
Normal file
|
|
@ -0,0 +1 @@
|
|||
00:33:21:98:b9:f1
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.52.254
|
||||
|
|
@ -0,0 +1 @@
|
|||
0
|
||||
1
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac
Normal file
1
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac
Normal file
|
|
@ -0,0 +1 @@
|
|||
00:33:21:98:b9:f0
|
||||
|
|
@ -0,0 +1 @@
|
|||
3
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.255.2
|
||||
|
|
@ -0,0 +1 @@
|
|||
10.16.255.3
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue