Merge remote-tracking branch 'origin/master'

This commit is contained in:
iliajie
2023-06-21 12:42:21 +03:00

View File

@@ -1,7 +1,9 @@
# Networking functions for Network Manager
# XXX DNS config change
# XXX apply one interface?
$nm_conn_dir = "/etc/NetworkManager/system-connections";
$sysctl_config = "/etc/sysctl.conf";
do 'linux-lib.pl';
@@ -77,6 +79,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 +170,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);
@@ -235,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;
@@ -455,6 +609,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 +628,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);
}