From 1e07f0c93a7362110ad4a15a0c5bc137a4c71cc5 Mon Sep 17 00:00:00 2001 From: Jamie Cameron Date: Tue, 20 Jun 2023 23:00:11 -0700 Subject: [PATCH 1/2] Add MTU support --- net/nm-lib.pl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/net/nm-lib.pl b/net/nm-lib.pl index 0c221f6e5..bb76dd8ef 100644 --- a/net/nm-lib.pl +++ b/net/nm-lib.pl @@ -1,5 +1,6 @@ # Networking functions for Network Manager # XXX DNS config change +# XXX apply one interface? $nm_conn_dir = "/etc/NetworkManager/system-connections"; @@ -77,6 +78,9 @@ foreach my $f (glob("$nm_conn_dir/*.nmconnection")) { $iface->{'ether'} = &find_nm_config($cfg, "ethernet", "cloned-mac-address"); + # MTU + $iface->{'mtu'} = &find_nm_config($cfg, "ethernet", "mtu"); + push(@rv, $iface); push(@rv, @virts); } @@ -165,6 +169,9 @@ else { # Update MAC address &save_nm_config($cfg, "ethernet", "cloned-mac-address", $iface->{'ether'}); + + # Update MTU + &save_nm_config($cfg, "ethernet", "mtu", $iface->{'mtu'}); } &flush_file_lines($f); &unlock_file($f); @@ -455,6 +462,7 @@ if (!$sect) { # Find the directive my ($dir) = grep { $_->{'name'} eq $name } @{$sect->{'members'}}; +print STDERR "name=$name sect=$sect dir=$dir value=$value\n"; if ($dir && defined($value)) { # Update existing line $dir->{'value'} = $value; @@ -473,7 +481,7 @@ elsif (!$dir && defined($value)) { 'file' => $file, 'line' => $sect->{'eline'}+1, 'eline' => $sect->{'eline'}+1 }; - splice(@$lref, $sect->{'eline'}+1, $name."=".$value); + splice(@$lref, $sect->{'eline'}+1, 0, $name."=".$value); &renumber_nm_config($cfg, $sect->{'eline'}, 1); push(@{$sect->{'members'}}, $dir); } From 231df9c37f1c905f460a57495320f420ccdfb4b1 Mon Sep 17 00:00:00 2001 From: Jamie Cameron Date: Tue, 20 Jun 2023 23:07:56 -0700 Subject: [PATCH 2/2] UI to edit network manager routes --- net/nm-lib.pl | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) diff --git a/net/nm-lib.pl b/net/nm-lib.pl index bb76dd8ef..b0e2892fa 100644 --- a/net/nm-lib.pl +++ b/net/nm-lib.pl @@ -3,6 +3,7 @@ # XXX apply one interface? $nm_conn_dir = "/etc/NetworkManager/system-connections"; +$sysctl_config = "/etc/sysctl.conf"; do 'linux-lib.pl'; @@ -242,6 +243,152 @@ if (&has_command("hostnamectl")) { undef(@main::get_system_hostname); # clear cache } +# get_domainname() +sub get_domainname +{ +my $d; +&execute_command("domainname", undef, \$d, undef); +chop($d); +return $d; +} + +# save_domainname(domain) +sub save_domainname +{ +my ($domain) = @_; +&execute_command("domainname ".quotemeta($domain)); +} + +sub routing_config_files +{ +return ( $nm_conn_dir ); +} + +# routing_input() +# show default router and device +sub routing_input +{ +my ($addr, $router) = &get_default_gateway(); +my ($addr6, $router6) = &get_default_ipv6_gateway(); +my @ifaces = grep { $_->{'virtual'} eq '' } &boot_interfaces(); +my @inames = map { $_->{'name'} } @ifaces; + +# Show default gateway +print &ui_table_row($text{'routes_default'}, + &ui_radio("gateway_def", $addr ? 0 : 1, + [ [ 1, $text{'routes_none'} ], + [ 0, $text{'routes_gateway'}." ". + &ui_textbox("gateway", $addr, 15)." ". + &ui_select("gatewaydev", $router, \@inames) ] ])); + +# Show default IPv6 gateway +print &ui_table_row($text{'routes_default6'}, + &ui_radio("gateway6_def", $addr6 ? 0 : 1, + [ [ 1, $text{'routes_none'} ], + [ 0, $text{'routes_gateway'}." ". + &ui_textbox("gateway6", $addr6, 30)." ". + &ui_select("gatewaydev6", $router6, \@inames) ] ])); + +# Act as router? +my %sysctl; +&read_env_file($sysctl_config, \%sysctl); +print &ui_table_row($text{'routes_forward'}, + &ui_yesno_radio("forward", + $sysctl{'net.ipv4.ip_forward'} ? 1 : 0)); + +# Static routes +# XXX +my $rtable = &ui_columns_start([ $text{'routes_ifc'}, + $text{'routes_net'}, + $text{'routes_mask'}, + $text{'routes_gateway'} ]); +my $i = 0; +@inames = ( "", @inames ); +foreach my $b (@ifaces) { + next if (!$b->{'routes'}); + foreach my $v (@{$b->{'routes'}->{'value'}}) { + my ($net, $mask) = split(/\//, $v->{'to'}); + $mask = &prefix_to_mask($mask); + $rtable .= &ui_columns_row([ + &ui_select("dev_$i", $b->{'fullname'}, \@inames, 1, 0, 1), + &ui_textbox("net_$i", $net, 15), + &ui_textbox("mask_$i", $mask, 15), + &ui_textbox("gw_$i", $v->{'via'}, 15), + ]); + $i++; + } + } +$rtable .= &ui_columns_row([ + &ui_select("dev_$i", "", \@inames, 1, 0, 1), + &ui_textbox("net_$i", "", 15), + &ui_textbox("mask_$i", "", 15), + &ui_textbox("gw_$i", "", 15), + ]); +$rtable .= &ui_columns_end(); +print &ui_table_row($text{'routes_static'}, $rtable); +} + +# parse_routing() +# Save the form generated by routing_input +sub parse_routing +{ +# Save IPv4 address +my ($dev, $gw); +if (!$in{'gateway_def'}) { + &check_ipaddress($in{'gateway'}) || + &error(&text('routes_egateway', &html_escape($in{'gateway'}))); + $gw = $in{'gateway'}; + $dev = $in{'gatewaydev'}; + } +&set_default_gateway($gw, $dev); + +# Save IPv6 address +my ($dev6, $gw6); +if (!$in{'gateway6_def'}) { + &check_ip6address($in{'gateway6'}) || + &error(&text('routes_egateway6',&html_escape($in{'gateway6'}))); + $gw6 = $in{'gateway6'}; + $dev6 = $in{'gatewaydev6'}; + } +&set_default_ipv6_gateway($gw6, $dev6); + +# Save routing flag +my %sysctl; +&lock_file($sysctl_config); +&read_env_file($sysctl_config, \%sysctl); +$sysctl{'net.ipv4.ip_forward'} = $in{'forward'}; +&write_env_file($sysctl_config, \%sysctl); +&unlock_file($sysctl_config); + +# Save static routes +# XXX +#my @boot = &boot_interfaces(); +#foreach my $b (grep { $_->{'virtual'} eq '' } @boot) { +# my @r; +# for(my $i=0; defined($in{"dev_$i"}); $i++) { +# if ($in{"dev_$i"} eq $b->{'fullname'}) { +# &check_ipaddress($in{"net_$i"}) || +# &error(&text('routes_enet', $in{"net_$i"})); +# &check_ipaddress($in{"mask_$i"}) || +# &error(&text('routes_emask', $in{"mask_$i"})); +# my $to = $in{"net_$i"}."/". +# &mask_to_prefix($in{"mask_$i"}); +# &check_ipaddress($in{"gw_$i"}) || +# &error(&text('routes_egateway', $in{"gw_$i"})); +# push(@r, { 'to' => $to, 'via' => $in{"gw_$i"} }); +# } +# } +# if (@r) { +# $b->{'routes'} = { 'name' => 'routes', +# 'value' => \@r }; +# } +# else { +# delete($b->{'routes'}); +# } +# &save_interface($b, \@boot); +# } +} + sub supports_address6 { return 1;