Skip to content

Commit aacb57b

Browse files
Abdul KarimAbdul Karim
Abdul Karim
authored and
Abdul Karim
committed
ncm-network: dropin file support for main configuration of NetworkManager
dropin file support for main configuration of NetworkManager
1 parent 1c9024c commit aacb57b

File tree

5 files changed

+66
-43
lines changed

5 files changed

+66
-43
lines changed

ncm-network/src/main/pan/components/network/config-nmstate.pan

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ include 'components/network/config';
99
prefix "/software/components/network";
1010
"ncm-module" = "nmstate";
1111

12+
# Make sure NetworkManager does not manage resolv.conf
13+
"/system/network/main_config/dns" = "none";
14+
1215
# Add dependency that can't be added to rpm directly
1316
prefix '/software/packages';
1417
'nmstate' = dict();

ncm-network/src/main/pan/components/network/types/network/backend/nmstate.pan

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,31 @@ declaration template components/network/types/network/backend/nmstate;
55
@documentation{
66
NetworkManager device configuration for drop in config file.
77
}
8+
9+
type structure_nm_main_config = {
10+
@{Set the DNS processing mode for NetworkManager}
11+
"dns" : choice("dnsmasq", "default", "none", "systemd-resolved")
12+
@{Specify devices for which NetworkManager should not create default wired connection}
13+
"no-auto-default" ? string
14+
@{Lists system settings plugin names}
15+
"plugins" ? choice('keyfile', 'ifcfg-rh')
16+
@{append a value to a previously-set list-valued}
17+
"plugins+" ? choice('keyfile', 'ifcfg-rh')
18+
@{remove a value to a previously-set list-valued}
19+
"plugins-" ? choice('keyfile', 'ifcfg-rh')
20+
};
21+
822
type structure_nm_device_config = {
923
"keep-configuration" ? choice("yes", "no")
1024
};
1125

1226
type structure_network_backend_specific = {
13-
@{let NetworkManager manage the dns}
14-
"manage_dns" : boolean = false
1527
@{let ncm-network cleanup inactive connections}
1628
"clean_inactive_conn" : boolean = true
29+
@{NetworkManager configuration settings for device section}
1730
"device_config" ? structure_nm_device_config
31+
@{NetworkManager configuration settings for main section}
32+
"main_config" : structure_nm_main_config
1833
};
1934

2035
type structure_network_rule_backend_specific = {

ncm-network/src/main/perl/nmstate.pm

Lines changed: 43 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Readonly my $NMSTATECTL => '/usr/bin/nmstatectl';
3434
Readonly my $NMCLI_CMD => '/usr/bin/nmcli';
3535
# pick a config name for nmstate yml to configure dns-resolver: settings. if manage_dns=true
3636
Readonly my $NM_RESOLV_YML => "/etc/nmstate/resolv.yml";
37-
Readonly my $NM_DROPIN_CFG_FILE => "/etc/NetworkManager/conf.d/90-quattor.conf";
37+
Readonly my $NM_MAIN_DROPIN_CFG_FILE => "/etc/NetworkManager/conf.d/90-quattor.conf";
3838
Readonly my $NM_DEVICE_DROPIN_CFG_FILE => "/etc/NetworkManager/conf.d/89-device-quattor.conf";
3939

4040
# generate the correct fake yaml boolean value so TextRender can convert it in a yaml boolean
@@ -83,29 +83,7 @@ sub is_valid_interface
8383
};
8484
}
8585

86-
# By default, NetworkManager on Red Hat Enterprise Linux (RHEL) 8+ dynamically updates the /etc/resolv.conf
87-
# file with the DNS settings from active NetworkManager connection profiles. we manage this using ncm-resolver.
88-
# so disable this unless manage_dns = true. resolver details can be set using nmstate but not doing this now.
89-
sub disable_nm_manage_dns
90-
{
91-
my ($self, $manage_dns, $nwsrv) = @_;
92-
my @data = ('[main]');
93-
94-
if ( $manage_dns ) {
95-
# set nothing, will use default.
96-
$self->verbose("Networkmanager defaults will be used");
97-
} else {
98-
push @data, 'dns=none';
99-
$self->verbose("Configuring networkmanager not to manage dns");
100-
}
101-
my $fh = CAF::FileWriter->new($NM_DROPIN_CFG_FILE, mode => oct(444), log => $self, keeps_state => 1);
102-
print $fh join("\n", @data, '');
103-
if ($fh->close()) {
104-
$self->info("File $NM_DROPIN_CFG_FILE changed, reload network");
105-
$nwsrv->reload();
106-
};
107-
}
108-
86+
# manage NetworkManager [device] settings
10987
sub nm_create_device_config_dropin
11088
{
11189
my ($self, $nm_device_config, $nwsrv) = @_;
@@ -117,12 +95,35 @@ sub nm_create_device_config_dropin
11795
};
11896

11997
$self->verbose("setting device configuration dropin");
98+
99+
my $fh = CAF::FileWriter->new($NM_DEVICE_DROPIN_CFG_FILE, mode => oct(444), log => $self);
100+
print $fh join("\n", @data, '');
101+
if ($fh->close()) {
102+
$self->info("File $NM_DEVICE_DROPIN_CFG_FILE changed, reload network");
103+
$nwsrv->reload();
104+
};
120105
}
121-
my $fh = CAF::FileWriter->new($NM_DEVICE_DROPIN_CFG_FILE, mode => oct(444), log => $self);
122-
print $fh join("\n", @data, '');
123-
if ($fh->close()) {
124-
$self->info("File $NM_DEVICE_DROPIN_CFG_FILE changed, reload network");
125-
$nwsrv->reload();
106+
}
107+
108+
# manage NetworkManager [main] settings
109+
sub nm_create_main_config_dropin
110+
{
111+
my ($self, $nm_main_config, $nwsrv) = @_;
112+
my @data = ('[main]');
113+
114+
if ( scalar keys %$nm_main_config gt 0 ) {
115+
foreach my $key (sort keys %$nm_main_config){
116+
push @data, $key."=".$nm_main_config->{$key};
117+
};
118+
119+
$self->verbose("setting NetworkManager main configuration dropin");
120+
121+
my $fh = CAF::FileWriter->new($NM_MAIN_DROPIN_CFG_FILE, mode => oct(444), log => $self);
122+
print $fh join("\n", @data, '');
123+
if ($fh->close()) {
124+
$self->info("File $NM_MAIN_DROPIN_CFG_FILE changed, reload network");
125+
$nwsrv->reload();
126+
};
126127
};
127128
}
128129

@@ -865,7 +866,11 @@ sub Configure
865866
my $nwtree = $config->getTree($NETWORK_PATH);
866867

867868
my $hostname = $nwtree->{realhostname} || "$nwtree->{hostname}.$nwtree->{domainname}";
868-
my $manage_dns = $nwtree->{manage_dns} || 0;
869+
# NetworkManager main configuration
870+
my $nm_main_cfg = $nwtree->{main_config};
871+
# set to none if main_config/dns is not defined.
872+
my $main_cfg_dns = $nm_main_cfg->{dns} || 'none';
873+
my $manage_dns = ($main_cfg_dns eq 'none') ? 0 : 1;
869874
my $dgw = $nwtree->{default_gateway};
870875
if (!$dgw) {
871876
$self->warn ("No default gateway configured");
@@ -949,17 +954,19 @@ sub Configure
949954
# 3. (re)start things
950955
my $nwsrv = CAF::Service->new(['NetworkManager'], log => $self);
951956

957+
if ( scalar keys %$nm_main_cfg gt 0 ) {
958+
$self->nm_create_main_config_dropin($nm_main_cfg, $nwsrv);
959+
} else {
960+
$self->cleanup($NM_MAIN_DROPIN_CFG_FILE);
961+
}
952962
# NetworkManager device configuration, if defined.
953963
my $nm_device_cfg = $nwtree->{device_config};
954-
if ($nm_device_cfg){
964+
if (scalar keys %$nm_device_cfg gt 0){
955965
$self->nm_create_device_config_dropin($nm_device_cfg, $nwsrv);
956966
} else {
957967
$self->cleanup($NM_DEVICE_DROPIN_CFG_FILE);
958968
}
959-
960-
# NetworkManager manages dns by default, but we manage dns with e.g. ncm-resolver, new option to enable/disable it.
961-
$self->disable_nm_manage_dns($manage_dns, $nwsrv);
962-
969+
963970
my $dnsconfig = $self->generate_nm_resolver_config($nwtree, $manage_dns);
964971
$exifiles->{$NM_RESOLV_YML} = $self->nmstate_file_dump($NM_RESOLV_YML, $dnsconfig);
965972
# nmstate files are applied uinsg nmstate apply via this component. We don't want nmstate svc to manage it.
@@ -985,7 +992,7 @@ sub Configure
985992

986993
# Save/Restore last known working (i.e. initial) /etc/resolv.conf
987994
# if nm is allowed to manage dns, then this should be allowed to have changed
988-
if (!$manage_dns) {
995+
if (! $manage_dns) {
989996
$resolv_conf_fh->close();
990997
}
991998

ncm-network/src/test/perl/nmstate_simple.t

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Readonly my $RESOLV => <<EOF;
3737
managed by something else
3838
EOF
3939

40-
Readonly my $NODNS => <<EOF;
40+
Readonly my $MAIN_CONFIG => <<EOF;
4141
[main]
4242
dns=none
4343
EOF
@@ -88,13 +88,12 @@ command_history_reset();
8888
is($cmp->Configure($cfg), 1, "Component runs correctly with a test profile");
8989

9090
my $fh;
91-
9291
# resolv.conf is unchanged
9392
is(get_file_contents("/etc/resolv.conf"), $RESOLV, "Exact network config");
9493

9594
# set nm config to disable dns mgmt
96-
is(get_file_contents("/etc/NetworkManager/conf.d/90-quattor.conf"), $NODNS, "disable NM dns mgmt");
97-
is(get_file_contents("/etc/NetworkManager/conf.d/89-device-quattor.conf"), $DEVICE_CONFIG, "networkmanager config for device");
95+
is(get_file_contents("/etc/NetworkManager/conf.d/90-quattor.conf"), $MAIN_CONFIG, "NetworkManager config for main");
96+
is(get_file_contents("/etc/NetworkManager/conf.d/89-device-quattor.conf"), $DEVICE_CONFIG, "NetworkManager config for device");
9897

9998
# unconfigure nmstate yml is removed
10099
ok(!$cmp->file_exists("/etc/nmstate/toremove0.yml"), "unconfigured yml nmstate is removed");

ncm-network/src/test/resources/nmstate_simple.pan

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ include 'simple_base_profile';
66
"/hardware/cards/nic/eth0/hwaddr" = "6e:a5:1b:55:77:0a";
77

88
"/system/network/device_config/keep-configuration" = "no";
9-
109
# the next include is mainly to the profile, it is not used in the tests
1110
# (unless the component gets specific schema things)
1211
include 'components/network/config-nmstate';

0 commit comments

Comments
 (0)