Skip to content

Commit

Permalink
Added backend for separated IPv6 enablement and some cleanup. bnc#572202
Browse files Browse the repository at this point in the history
Cleanup is related to YCP -> Ruby conversion.
  • Loading branch information
mchf committed Oct 15, 2013
1 parent 7fe6ccb commit 43ec508
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 74 deletions.
19 changes: 13 additions & 6 deletions src/include/network/services/routing.rb
Original file line number Diff line number Diff line change
Expand Up @@ -275,9 +275,7 @@ def RoutingEditDialog(id, entry, devs)

def initRouting(key)
max = 0
# integer items = 0;
table_items_orig = []
forward = Routing.Forward_v4
route_conf = deep_copy(Routing.Routes)

#reset, so that UI really reflect current state
Expand Down Expand Up @@ -321,7 +319,8 @@ def initRouting(key)
UI.ChangeWidget(:gw6, :Value, @defgw6)
UI.ChangeWidget(Id(:gw), :ValidChars, IP.ValidChars)
UI.ChangeWidget(Id(:table), :Items, @r_items)
UI.ChangeWidget(Id(:forward_v4), :Value, forward)
UI.ChangeWidget(Id(:forward_v4), :Value, Routing.Forward_v4)
UI.ChangeWidget(Id(:forward_v6), :Value, Routing.Forward_v6)
UI.SetFocus(Id(:gw))

# #178538 - disable routing dialog when NetworkManager is used
Expand Down Expand Up @@ -466,7 +465,8 @@ def storeRouting(key, event)
end

Routing.Routes = deep_copy(route_conf)
Routing.Forward_v4 = Convert.to_boolean(UI.QueryWidget(Id(:forward_v4), :Value))
Routing.Forward_v4 = UI.QueryWidget(Id(:forward_v4), :Value)
Routing.Forward_v6 = UI.QueryWidget(Id(:forward_v6), :Value)

nil
end
Expand Down Expand Up @@ -502,9 +502,16 @@ def RoutingMainDialog
# @param [String] defgw current default gw widget contents
# @return true if differ
def RoutingModified(defgw)
forward = Convert.to_boolean(UI.QueryWidget(Id(:forward_v4), :Value))
forward_v4 = UI.QueryWidget(Id(:forward_v4), :Value)
forward_v6 = UI.QueryWidget(Id(:forward_v6), :Value)

defg = Convert.to_string(UI.QueryWidget(Id(:gw), :Value))
forward != Routing.Forward_v4 || defg != defgw

return true if forward_v4 != Routing.Forward_v4
return true if forward_v6 != Routing.Forward_v6
return true if defg != defgw

false
end
end
end
146 changes: 78 additions & 68 deletions src/modules/Routing.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,20 @@

module Yast
class RoutingClass < Module

# @Orig_Routes [Array] array of hashes. Caches known routes
#
# @Orig_Forward_v4 [Boolean] current status of ipv4 forwarding
# @Orig_Forward_v6 [Boolean] current status of ipv6 forwarding
#
# @modified [Boolean] modified by AY (bnc#649494)

# "routes" file location
ROUTES_FILE = "/etc/sysconfig/network/routes"

SYSCTL_IPV4_PATH = ".etc.sysctl_conf.\"net.ipv4.ip_forward\""
SYSCTL_IPV6_PATH = ".etc.sysctl_conf.\"net.ipv6.conf.all.forwarding\""

def main
Yast.import "UI"
textdomain "network"
Expand All @@ -50,32 +64,31 @@ def main
# keys: destination, gateway, netmask, [device, [extrapara]]
@Routes = []

# modified by AY (bnc#649494)
@modified = nil
# Enable IP forwarding
# .etc.sysctl_conf."net.ipv4.ip_forward"
@Forward_v4 = false
@Forward_v6 = false

# List of available devices
@devices = []

# All routes read at the start
@Orig_Routes = nil
@Orig_Forward_v4 = nil

# "routes" file location
@routes_file = "/etc/sysconfig/network/routes"
end

# Data was modified?
# @return true if modified
def Modified
ret = @Routes != @Orig_Routes || @Forward_v4 != @Orig_Forward_v4
# probably called without Read() (bnc#649494)
if @Orig_Routes == nil && @Orig_Forward_v4 == nil && @modified != true
ret = false
end
Builtins.y2debug("ret=%1", ret)
no_orig_values = @Orig_Routes.nil?
no_orig_values &&= @Orig_Forward_v4.nil?
no_orig_values &&= @Orig_Forward_v6.nil?
no_orig_values &&= @modified != true

return false if no_orig_values

ret = @Routes != @Orig_Routes
ret ||= @Forward_v4 != @Orig_Forward_v4
ret ||= @Forward_v6 != @Orig_Forward_v6

Builtins.y2debug("Routing#modified: #{ret}")
ret
end

Expand Down Expand Up @@ -115,27 +128,33 @@ def RemoveDefaultGw
def ReadIPForwarding
if SuSEFirewall.IsEnabled
@Forward_v4 = SuSEFirewall.GetSupportRoute
# FIXME: missing support for setting IPv6 forwarding enablement in
# SuSEFirewall module and in SuSEFirewall2 at all
else
@Forward_v4 = SCR.Read(path(".etc.sysctl_conf.\"net.ipv4.ip_forward\"")) == "1"
@Forward_v4 = SCR.Read(path(SYSCTL_IPV4_PATH)) == "1"
@Forward_v6 = SCR.Read(path(SYSCTL_IPV6_PATH)) == "1"
end

nil
end

def WriteIPForwarding
if SuSEFirewall.IsEnabled
# FIXME: missing support for setting IPv6 forwarding enablement in
# SuSEFirewall module and in SuSEFirewall2 at all
SuSEFirewall.SetSupportRoute(@Forward_v4)
else
SCR.Write(
path(".etc.sysctl_conf.\"net.ipv4.ip_forward\""),
path(SYSCTL_IPV4_PATH),
@Forward_v4 ? "1" : "0"
)
SCR.Write(
path(".etc.sysctl_conf.\"net.ipv6.conf.all.forwarding\""),
@Forward_v4 ? "1" : "0"
path(SYSCTL_IPV6_PATH),
@Forward_v6 ? "1" : "0"
)
SCR.Write(path(".etc.sysctl_conf"), nil)
end

SCR.Execute(
path(".target.bash"),
Builtins.sformat(
Expand All @@ -147,7 +166,7 @@ def WriteIPForwarding
path(".target.bash"),
Builtins.sformat(
"echo %1 > /proc/sys/net/ipv6/conf/all/forwarding",
@Forward_v4 ? 1 : 0
@Forward_v6 ? 1 : 0
)
)

Expand All @@ -159,7 +178,7 @@ def WriteIPForwarding
# @return true if success
def Read
# read route.conf
if Ops.greater_than(SCR.Read(path(".target.size"), @routes_file), 0)
if Ops.greater_than(SCR.Read(path(".target.size"), ROUTES_FILE), 0)
@Routes = Convert.convert(
SCR.Read(path(".routes")),
:from => "any",
Expand All @@ -171,12 +190,14 @@ def Read

ReadIPForwarding()

Builtins.y2debug("Routes=%1", @Routes)
Builtins.y2debug("Forward_v4=%1", @Forward_v4)
Builtins.y2debug("Routes=#{@Routes}")
Builtins.y2debug("Forward_v4=#{@Forward_v4}")
Builtins.y2debug("Forward_v6=#{@Forward_v6}")

# save routes to check for changes later
@Orig_Routes = Builtins.eval(@Routes)
@Orig_Forward_v4 = Builtins.eval(@Forward_v4)
@Orig_Routes = deep_copy(@Routes)
@Orig_Forward_v4 = deep_copy(@Forward_v4)
@Orig_Forward_v6 = deep_copy(@Forward_v6)

# read available devices
NetworkInterfaces.Read
Expand Down Expand Up @@ -225,25 +246,19 @@ def Write
ProgressNextStage(_("Writing routing settings..."))

# create if not exists, otherwise backup
if Ops.less_than(SCR.Read(path(".target.size"), @routes_file), 0)
SCR.Write(path(".target.string"), @routes_file, "")
if Ops.less_than(SCR.Read(path(".target.size"), ROUTES_FILE), 0)
SCR.Write(path(".target.string"), ROUTES_FILE, "")
else
SCR.Execute(
path(".target.bash"),
Ops.add(
Ops.add(
Ops.add(Ops.add("/bin/cp ", @routes_file), " "),
@routes_file
),
".YaST2save"
)
"/bin/cp #{ROUTES_FILE} #{ROUTES_FILE}.YaST2save"
)
end

ret = false
if @Routes == []
# workaround bug [#4476]
ret = SCR.Write(path(".target.string"), @routes_file, "")
ret = SCR.Write(path(".target.string"), ROUTES_FILE, "")
else
# update the routes config
ret = SCR.Write(path(".routes"), @Routes)
Expand All @@ -265,11 +280,17 @@ def Write
# @return true if success
def Import(settings)
settings = deep_copy(settings)
@Routes = Builtins.eval(Ops.get_list(settings, "routes", []))

@Routes = deep_copy(Ops.get_list(settings, "routes", []))
@Forward_v4 = Ops.get_boolean(settings, "ip_forward", false)
# FIXME:
# This one is for backward compatibility only.
# Separated option for IPv6 forwarding enablement in AutoYast has to be introduced
@Forward_v6 = @Forward_v4

@Orig_Routes = nil
@Orig_Forward_v4 = nil
@Orig_Forward_v6 = nil

@modified = true

Expand All @@ -280,11 +301,13 @@ def Import(settings)
# @return autoinstallation settings
def Export
exproute = {}
if Ops.greater_than(Builtins.size(Builtins.eval(@Routes)), 0)
Ops.set(exproute, "routes", Builtins.eval(@Routes))
end
Ops.set(exproute, "ip_forward", @Forward_v4)
deep_copy(exproute)

exproute[ "routes"] = deep_copy(@Routes) unless @Routes.empty?
exproute[ "ip_forward"] = @Forward_v4
# FIXME:
# Separated option for IPv6 forwarding enablement in AutoYast has to be introduced

exproute
end

# Get the current devices list
Expand Down Expand Up @@ -319,49 +342,36 @@ def SetDevices(devs)
end

# Create routing text summary
# @return summary text
# @returns [String] summary text
def Summary
return "" if Ops.less_than(Builtins.size(@Routes), 1)
return "" if @Routes.nil? || @Routes.empty?

Yast.import "Summary"
summary = ""

gw = GetGateway()
gwhost = NetHwDetection.ResolveIP(gw)
gw = Ops.add(Ops.add(Ops.add(gw, " ("), gwhost), ")") if gwhost != ""

if gw != ""
# Summary text
summary = Summary.AddListItem(
summary,
Builtins.sformat(_("Gateway: %1"), gw)
)
# summary = add(summary, Summary::Device(sformat(_("Gateway: %1"), gw), ""));
end
gw = "#{gw} (#{gwhost})" unless gwhost.empty?

if @Forward_v4 == true
# Summary text
summary = Summary.AddListItem(summary, _("IP Forwarding for IPv4: on"))
else
# summary = add(summary, Summary::Device(_("IP Forwarding: on"), ""));
# Summary text
summary = Summary.AddListItem( summary, _("Gateway: %s") % gw) unless gw.empty?

# Summary text
summary = Summary.AddListItem(summary, _("IP Forwarding for IPv4: off"))
end
# summary = add(summary, Summary::Device(_("IP Forwarding: off"), ""));
on_off = @Forward_v4 ? "on" : "off"
# Summary text
summary = Summary.AddListItem(summary, _("IP Forwarding for IPv4: %s") % on_off)

if @Routes != []
# Summary text
# summary = add(summary, Summary::Device(sformat(_("Routes: %1"), Routes), ""));
Builtins.y2debug("not adding Routes to summary")
end
on_off = @Forward_v6 ? "on" : "off"
# Summary text
summary = Summary.AddListItem(summary, _("IP Forwarding for IPv6: %s") % on_off)

return "" if Ops.less_than(Builtins.size(summary), 1)
Ops.add(Ops.add("<ul>", summary), "</ul>")
return "" if summary.empty?

"<ul>#{summary}</ul>"
end

publish :variable => :Routes, :type => "list <map>"
publish :variable => :Forward_v4, :type => "boolean"
publish :variable => :Forward_v6, :type => "boolean"
publish :function => :Modified, :type => "boolean ()"
publish :function => :ReadFromGateway, :type => "boolean (string)"
publish :function => :RemoveDefaultGw, :type => "void ()"
Expand Down

0 comments on commit 43ec508

Please sign in to comment.