From d03f4de5033a3b7a202b33f3435e57c1fa89f261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Alejandro=20Anderssen=20Gonz=C3=A1lez?= Date: Mon, 4 Feb 2019 12:52:48 +0000 Subject: [PATCH] Added firewall_zone widget --- src/data/network/sysconfig_defaults.yml | 1 - src/include/network/lan/address.rb | 47 ++-------- src/lib/y2network/widgets/firewall_zone.rb | 102 +++++++++++++++++++++ src/modules/LanItems.rb | 2 + 4 files changed, 114 insertions(+), 38 deletions(-) create mode 100644 src/lib/y2network/widgets/firewall_zone.rb diff --git a/src/data/network/sysconfig_defaults.yml b/src/data/network/sysconfig_defaults.yml index 4be1ff827..afc2be93d 100644 --- a/src/data/network/sysconfig_defaults.yml +++ b/src/data/network/sysconfig_defaults.yml @@ -42,4 +42,3 @@ BONDING_MODULE_OPTS: mode=active-backup miimon=100 TUNNEL_SET_OWNER: '' TUNNEL_SET_GROUP: '' BRIDGE_PORTS: '' -ZONE: '' diff --git a/src/include/network/lan/address.rb b/src/include/network/lan/address.rb index d9072cf77..d2238e8f4 100644 --- a/src/include/network/lan/address.rb +++ b/src/include/network/lan/address.rb @@ -28,6 +28,7 @@ # require "ui/text_helpers" require "y2firewall/helpers/interfaces" +require "y2network/widgets/firewall_zone" module Yast module NetworkLanAddressInclude @@ -132,14 +133,7 @@ def initialize_network_lan_address(include_target) "opt" => [:hstretch], "help" => _("

TODO kind of vague!

") }, - "FWZONE" => { - "widget" => :combobox, - # Combo Box label - "label" => _("Assign Interface to Firewall &Zone"), - "opt" => [:hstretch], - "help" => Ops.get_string(@help, "fwzone", ""), - "init" => fun_ref(method(:InitFwZone), "void (string)") - }, + "FWZONE" => firewall_zone.cwm_definition, "MANDATORY" => { "widget" => :checkbox, # check box label @@ -1046,31 +1040,6 @@ def ValidateBootproto(_key, _event) true end - # Initialize value of firewall zone widget - # (disables it when firewalld is not installed) - # @param _key [String] id of the widget - def InitFwZone(_key) - if firewalld.installed? - UI.ChangeWidget( - Id("FWZONE"), - :Value, - current_zone - ) - else - UI.ChangeWidget(Id("FWZONE"), :Enabled, false) - end - - nil - end - - def current_zone - ifcfg_zone = NetworkInterfaces.Current["ZONE"] - return ifcfg_zone if ifcfg_zone - zone = interface_zone(LanItems.device) - return if zone.nil? - zone.name - end - # @param [Array] types network card types # @return their descriptions for CWM def BuildTypesListCWM(types) @@ -1288,8 +1257,6 @@ def AddressDialog ] ) - wd["FWZONE"]["items"] = firewall_zones - if LanItems.GetCurrentType == "ib" wd["IPOIB_MODE"] = ipoib_mode_widget wd["MTU"]["items"] = ipoib_mtu_items @@ -1298,6 +1265,7 @@ def AddressDialog end @settings["IFCFG"] = LanItems.device if LanItems.operation != :add + firewall_zone.value = @settings["FWZONE"] functions = { "init" => fun_ref(method(:InitAddrWidget), "void (string)"), @@ -1366,8 +1334,8 @@ def AddressDialog if ret != :back && ret != :abort # general tab LanItems.startmode = Ops.get_string(@settings, "STARTMODE", "") - LanItems.firewall_zone = @settings.fetch("FWZONE", "") LanItems.mtu = Ops.get_string(@settings, "MTU", "") + LanItems.firewall_zone = firewall_zone.value # address tab bootproto = @settings.fetch("BOOTPROTO", "") @@ -1435,8 +1403,8 @@ def initialize_address_settings "STARTMODE" => LanItems.startmode, "IFPLUGD_PRIORITY" => LanItems.ifplugd_priority, # problems when renaming the interface? - "FWZONE" => current_zone, "MTU" => LanItems.mtu, + "FWZONE" => LanItems.firewall_zone, # address tab: "BOOTPROTO" => LanItems.bootproto, "IPADDR" => LanItems.ipaddr, @@ -1558,6 +1526,10 @@ def initial_hostname(ipaddr) String.FirstChunk(Ops.get(host_list, 0, ""), " \t") end + def firewall_zone + @fw_zone ||= Y2Network::Widgets::FirewallZone.new + end + # Return a list of items for ComboBox with all the known firewalld zones # and also an empty string option for the default zone. # @@ -1565,6 +1537,7 @@ def initial_hostname(ipaddr) # known zones def firewall_zones zones = [["", _("Automatically Assigned Zone")]] + if firewalld.installed? firewalld.zones.each { |z| zones << [z.name, z.short] } else diff --git a/src/lib/y2network/widgets/firewall_zone.rb b/src/lib/y2network/widgets/firewall_zone.rb new file mode 100644 index 000000000..504afe502 --- /dev/null +++ b/src/lib/y2network/widgets/firewall_zone.rb @@ -0,0 +1,102 @@ +require "cwm" +require "y2firewall/firewalld" +require "y2firewall/helpers/interfaces" + +module Y2Network + module Widgets + class FirewallZone < ::CWM::CustomWidget + include Y2Firewall::Helpers::Interfaces + + def initialize + textdomain "network" + @value = nil + end + + def label + _("Assign Interface to Firewall &Zone") + end + + def init + log.info("Y en el init vale #{@value}") + Yast::UI.ChangeWidget(Id(:zones), :Items, firewall_zones) + self.value = @value + enable_zones(managed?) + end + + def contents + VBox( + Left(manage_widget), + Left(zones_widget) + ) + end + + def handle(event) + enable_zones(managed?) if event["ID"] == :manage_zone + + nil + end + + def value=(name) + @value = name + Yast::UI.ChangeWidget(Id(:manage_zone), :Value, !!name) + return if name.nil? + select_zone(name) + end + + def value + return @value unless Yast::UI.WidgetExists(Id(:manage_zone)) + + managed? ? zone : nil + end + + def store + @value = value + end + + private + + def manage_widget + Yast::UI.CheckBox(Id(:manage_zone), Opt(:notify), _("Manage interface ZONE")) + end + + def managed? + v = Yast::UI.QueryWidget(Id(:manage_zone), :Value) + log.info("El valor es #{v} para managed?") + v + end + + def zones_widget + ComboBox(Id(:zones), Opt(:notify, :hstretch), _("ZONE")) + end + + def select_zone(zone) + Yast::UI.ChangeWidget(Id(:zones), :Value, zone) + end + + def zone + Yast::UI.QueryWidget(Id(:zones), :Value) + end + + def enable_zones(value) + Yast::UI.ChangeWidget(Id(:zones), :Enabled, value) + end + + # Return a list of items for ComboBox with all the known firewalld zones + # and also an empty string option for the default zone. + # + # @return [Array >] list of names an description of + # known zones + def firewall_zones + zones = [["", _("Default")]] + + if firewalld.installed? + firewalld.zones.each { |z| zones << [z.name, z.short] } + else + zones = [["", _("Firewall is not installed.")]] + end + + zones.map { |z| Item(Id(z[0]), z[1]) } + end + end + end +end diff --git a/src/modules/LanItems.rb b/src/modules/LanItems.rb index 3d33f9956..d8c29aec5 100644 --- a/src/modules/LanItems.rb +++ b/src/modules/LanItems.rb @@ -125,6 +125,7 @@ def main @wl_key = [] @wl_default_key = 0 @wl_nick = "" + @firewall_zone = nil # FIXME: We should unify bridge_ports and bond_slaves variables @@ -1715,6 +1716,7 @@ def SetDeviceVars(devmap, defaults) @prefix = d["PREFIXLEN"] @remoteip = d["REMOTE_IPADDR"] @netmask = d["NETMASK"] + @firewall_zone = d["ZONE"] @set_default_route = case d["DHCLIENT_SET_DEFAULT_ROUTE"] when "yes" then true when "no" then false