diff --git a/src/lib/cfa/nm_connection.rb b/src/lib/cfa/nm_connection.rb index 9cc100e70..b7156bf74 100644 --- a/src/lib/cfa/nm_connection.rb +++ b/src/lib/cfa/nm_connection.rb @@ -32,18 +32,14 @@ class NmConnection < BaseModel "bridge", "connection", "ethernet", "ipv4", "ipv6", "vlan", "wifi", "wifi_security" ].freeze - # @return [String] file path - attr_reader :path - # Constructor # # @param path [String] File path # @param file_handler [.read, .write] Object to read/write the file. def initialize(path, file_handler: nil) - @path = path # FIXME: The Networkmanager lense writes the values surrounded by double # quotes which is not valid - super(AugeasParser.new("Puppet.lns"), @path, file_handler: file_handler) + super(AugeasParser.new("Puppet.lns"), path, file_handler: file_handler) end # Returns the augeas tree for the given section diff --git a/src/lib/y2network/network_manager/config_writer.rb b/src/lib/y2network/network_manager/config_writer.rb index 1a500402c..5a88ce476 100644 --- a/src/lib/y2network/network_manager/config_writer.rb +++ b/src/lib/y2network/network_manager/config_writer.rb @@ -35,9 +35,18 @@ class ConfigWriter < Y2Network::ConfigWriter def write_connections(config, _old_config) writer = Y2Network::NetworkManager::ConnectionConfigWriter.new config.connections.each do |conn| - writer.write(conn, nil) # FIXME + writer.write(conn, nil, routes_for(conn, config.routing.routes)) # FIXME end end + + # Finds routes for a given connection + # + # @param conn [ConnectionConfig::Base] Connection configuration + # @param routes [Array] List of routes to search in + # @return [Array] List of routes for the given connection + def routes_for(conn, routes) + routes.select { |r| r.interface&.name == conn.name } + end end end end diff --git a/src/lib/y2network/network_manager/connection_config_writer.rb b/src/lib/y2network/network_manager/connection_config_writer.rb index ddb762f71..1a3c677e6 100644 --- a/src/lib/y2network/network_manager/connection_config_writer.rb +++ b/src/lib/y2network/network_manager/connection_config_writer.rb @@ -17,9 +17,12 @@ # To contact SUSE LLC about this file by physical or electronic mail, you may # find current contact information at www.suse.com. +require "yast" require "cfa/nm_connection" require "pathname" +Yast.import "Installation" + module Y2Network module NetworkManager class ConnectionConfigWriter @@ -28,7 +31,13 @@ class ConnectionConfigWriter SYSTEM_CONNECTIONS_PATH = Pathname.new("/etc/NetworkManager/system-connections").freeze FILE_EXT = ".nmconnection".freeze - def write(conn, old_conn = nil) + # @param conn [ConnectionConfig::Base] Connection configuration to be + # written + # @param old_conn [ConnectionConfig::Base] Original connection + # configuration + # @param routes [Array] routes associated with the connection to be + # written + def write(conn, old_conn = nil, routes = []) return if conn == old_conn path = SYSTEM_CONNECTIONS_PATH.join(conn.name).sub_ext(FILE_EXT) @@ -38,15 +47,20 @@ def write(conn, old_conn = nil) ensure_permissions(path) unless ::File.exist?(path) - handler_class.new(file).write(conn) + handler_class.new(file).write(conn, routes) file.save end private + # Convenience method to ensure the new configuration file permissions + # + # @param path [Pathname] connection configuration file path def ensure_permissions(path) - ::FileUtils.touch(path) - ::File.chmod(0o600, path) + final_path = ::File.join(Yast::WFM.scr_root, path) + + ::FileUtils.touch(final_path) + ::File.chmod(0o600, final_path) end # Returns the class to handle a given interface type diff --git a/src/lib/y2network/network_manager/connection_config_writers/base.rb b/src/lib/y2network/network_manager/connection_config_writers/base.rb index 1b6274f85..1f3483623 100644 --- a/src/lib/y2network/network_manager/connection_config_writers/base.rb +++ b/src/lib/y2network/network_manager/connection_config_writers/base.rb @@ -40,23 +40,39 @@ def initialize(file) # Writes connection information to the interface configuration file # # @param conn [Y2Network::ConnectionConfig::Base] Connection to take settings from - def write(conn) + # @param routes [] routes associated with the connection + def write(conn, routes = []) file.connection["id"] = conn.name file.connection["autoconnect"] = "false" if ["manual", "off"].include? conn.startmode.name file.connection["permissions"] = nil file.connection["interface-name"] = conn.interface file.connection["zone"] = conn.firewall_zone unless ["", nil].include? conn.firewall_zone - conn.bootproto.dhcp? ? configure_dhcp(conn) : add_ips(conn) + conn.bootproto.dhcp? ? configure_dhcp(conn) : configure_ips(conn) + configure_routes(routes) update_file(conn) end private + # Convenience method to write routing configuration associated with the + # connection config to be written + # + # @param routes [] routes associated with the connection + def configure_routes(routes) + routes.select(&:default?).each { |r| configure_gateway(r) } + end + + # @param route [Y2Network::Route] route to be written + def configure_gateway(route) + section = route.gateway.ipv4? ? file.ipv4 : file.ipv6 + section["gateway"] = route.gateway.to_s + end + # FIXME: Gateway is missing # Convenience method for writing the static IP configuration # # @param conn [Y2Network::ConnectionConfig::Base] Connection to take settings from - def add_ips(conn) + def configure_ips(conn) ips_to_add = conn.ip_aliases.clone ips_to_add.append(conn.ip) if conn.ip ipv4 = ips_to_add.select { |i| i&.address&.ipv4? }.map { |i| i.address.to_s } diff --git a/src/lib/y2network/wicked/config_writer.rb b/src/lib/y2network/wicked/config_writer.rb index 8c23cb60b..25f5c591d 100644 --- a/src/lib/y2network/wicked/config_writer.rb +++ b/src/lib/y2network/wicked/config_writer.rb @@ -107,7 +107,7 @@ def find_routes_for_iface(iface, routes) # # @param iface [Interface,nil] Interface to search routes for; nil will # return the global routes file - # @return [Y2Network::ConfigWriters::RoutesFile] + # @return [CFA::RoutesFile] def routes_file_for(iface) return CFA::RoutesFile.new unless iface diff --git a/test/y2network/network_manager/config_writer_test.rb b/test/y2network/network_manager/config_writer_test.rb index a8fcc5b4f..d064252ad 100644 --- a/test/y2network/network_manager/config_writer_test.rb +++ b/test/y2network/network_manager/config_writer_test.rb @@ -71,7 +71,7 @@ end it "writes connections configuration" do - expect(conn_config_writer).to receive(:write).with(eth0_conn, nil) + expect(conn_config_writer).to receive(:write).with(eth0_conn, nil, []) writer.write(config) end end diff --git a/test/y2network/network_manager/connection_config_writer_test.rb b/test/y2network/network_manager/connection_config_writer_test.rb index 5e68bc846..5f22e6cbc 100644 --- a/test/y2network/network_manager/connection_config_writer_test.rb +++ b/test/y2network/network_manager/connection_config_writer_test.rb @@ -54,7 +54,7 @@ let(:path) { "/etc/NetworkManager/system-connections/eth0.nmconnection" } let(:file) do - instance_double(CFA::NmConnection, save: nil, path: path) + instance_double(CFA::NmConnection, save: nil) end describe "#write" do @@ -75,7 +75,7 @@ it "uses the appropiate handler" do expect(writer).to receive(:require).and_return(handler) - expect(handler).to receive(:write).with(conn) + expect(handler).to receive(:write).with(conn, []) writer.write(conn) end