Class: Yast::RoutingClass

Inherits:
Module
  • Object
show all
Defined in:
../../src/modules/Routing.rb

Constant Summary

ROUTES_FILE =

“routes” file location

"/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\""

Instance Method Summary (collapse)

Instance Method Details

- (Object) Export

Dump the Routing settings to a map, for autoinstallation use.

Returns:

  • autoinstallation settings



299
300
301
302
303
304
305
306
307
# File '../../src/modules/Routing.rb', line 299

def Export
  exproute = {}

  exproute["routes"] = deep_copy(@Routes) unless @Routes.empty?
  exproute["ipv4_forward"] = @Forward_v4
  exproute["ipv6_forward"] = @Forward_v6

  exproute
end

- (Object) GetDevices

Get the current devices list

Returns:

  • devices list



311
312
313
# File '../../src/modules/Routing.rb', line 311

def GetDevices
  deep_copy(@devices)
end

- (Object) GetGateway

Get the default gateway

Returns:

  • gateway



317
318
319
320
321
322
323
324
325
# File '../../src/modules/Routing.rb', line 317

def GetGateway
  defgw = ""
  Builtins.maplist(@Routes) do |r|
    if Ops.get_string(r, "destination", "") == "default"
      defgw = Ops.get_string(r, "gateway", "")
    end
  end
  defgw
end

- (Object) Import(settings)

Get all the Routing configuration from a map. When called by routing_auto (preparing autoinstallation data) the map may be empty.

Parameters:

  • settings (Hash)

    autoinstallation settings

Returns:

  • true if success



278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
# File '../../src/modules/Routing.rb', line 278

def Import(settings)
  settings = deep_copy(settings)
  ip_forward = Ops.get_boolean(settings, "ip_forward", false)
  ipv4_forward = Ops.get_boolean(settings, "ipv4_forward", ip_forward)
  ipv6_forward = Ops.get_boolean(settings, "ipv6_forward", ip_forward)

  @Routes = deep_copy(Ops.get_list(settings, "routes", []))
  @Forward_v4 = ipv4_forward
  @Forward_v6 = ipv6_forward

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

  @modified = true

  true
end

- (Object) main



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File '../../src/modules/Routing.rb', line 50

def main
  Yast.import "UI"
  textdomain "network"

  Yast.import "NetHwDetection"
  Yast.import "NetworkInterfaces"
  Yast.import "Map"
  Yast.import "SuSEFirewall"

  Yast.include self, "network/runtime.rb"
  Yast.include self, "network/routines.rb"

  # All routes
  # list <map <string, string> >:
  # keys: destination, gateway, netmask, [device, [extrapara]]
  @Routes = []

  # Enable IP forwarding
  # .etc.sysctl_conf."net.ipv4.ip_forward"
  @Forward_v4 = false
  @Forward_v6 = false

  # List of available devices
  @devices = []
end

- (Object) Modified

Data was modified?

Returns:

  • true if modified



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File '../../src/modules/Routing.rb', line 78

def Modified
  # probably called without Read()  (bnc#649494)
  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

- (Object) Read

Read routing settings If no routes, sets a default gateway from Detection

Returns:

  • true if success



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File '../../src/modules/Routing.rb', line 176

def Read
  # read route.conf
  if Ops.greater_than(SCR.Read(path(".target.size"), ROUTES_FILE), 0)
    @Routes = Convert.convert(
      SCR.Read(path(".routes")),
      :from => "any",
      :to   => "list <map>"
    )
  else
    @Routes = []
  end

  ReadIPForwarding()

  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 = deep_copy(@Routes)
  @Orig_Forward_v4 = deep_copy(@Forward_v4)
  @Orig_Forward_v6 = deep_copy(@Forward_v6)

  # read available devices
  NetworkInterfaces.Read
  @devices = NetworkInterfaces.List("")

  if @Routes == []
    ReadFromGateway(Ops.get_string(NetHwDetection.result, "GATEWAY", ""))
  end

  true
end

- (Object) ReadFromGateway(gw)

Set the routes to contain only the default route, if it is defined. Used when there is nothing better.

Parameters:

  • gw (String)

    ip of the default gateway

Returns:

  • true if success



99
100
101
102
103
104
105
106
107
108
109
110
# File '../../src/modules/Routing.rb', line 99

def ReadFromGateway(gw)
  return false if gw == "" || gw == nil
  @Routes = [
    {
      "destination" => "default",
      "gateway"     => gw,
      "netmask"     => "-",
      "device"      => "-"
    }
  ]
  true
end

- (Object) ReadIPForwarding



128
129
130
131
132
133
134
135
136
137
138
139
# File '../../src/modules/Routing.rb', line 128

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(SYSCTL_IPV4_PATH)) == "1"
    @Forward_v6 = SCR.Read(path(SYSCTL_IPV6_PATH)) == "1"
  end

  nil
end

- (Object) RemoveDefaultGw

Remove route with default gateway from Routes list



113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File '../../src/modules/Routing.rb', line 113

def RemoveDefaultGw
  route = []
  Builtins.y2milestone(
    "Resetting default gateway - interface has been set to DHCP mode"
  )
  Builtins.foreach(@Routes) do |row|
    if Ops.get_string(row, "destination", "") != "default"
      route = Builtins.add(route, row)
    end
  end
  @Routes = deep_copy(route)

  nil
end

- (Object) SetDevices(devs)

Set the available devices list (for expert routing dialog)

Parameters:

  • devs (Array)

    new devices list

Returns:

  • true if success



330
331
332
333
334
335
336
337
338
# File '../../src/modules/Routing.rb', line 330

def SetDevices(devs)
  devs = deep_copy(devs)
  if devs == nil
    @devices = []
    return false
  end
  @devices = deep_copy(devs)
  true
end

- (Object) Summary

Create routing text summary



342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
# File '../../src/modules/Routing.rb', line 342

def Summary
  return "" if @Routes.nil? || @Routes.empty?

  Yast.import "Summary"
  summary = ""

  gw = GetGateway()
  gwhost = NetHwDetection.ResolveIP(gw)
  gw = "#{gw} (#{gwhost})" unless gwhost.empty?

  # Summary text
  summary = Summary.AddListItem(summary, _("Gateway: %s") % gw) unless gw.empty?

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

  on_off = @Forward_v6 ? "on" : "off"
  # Summary text
  summary = Summary.AddListItem(summary, _("IP Forwarding for IPv6: %s") % on_off)

  return "" if summary.empty?
  
  "<ul>#{summary}</ul>"
end

- (Object) Write

Write routing settings and apply changes

Returns:

  • true if success



212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# File '../../src/modules/Routing.rb', line 212

def Write
  Builtins.y2milestone("Writing configuration")
  if !Modified()
    Builtins.y2milestone("No changes to routing -> nothing to write")
    return true
  end

  steps = [
    # Progress stage 1
    _("Write IP forwarding settings"),
    # Progress stage 2
    _("Write routing settings")
  ]

  caption = _("Saving Routing Configuration")
  sl = 0 #100; //for testing

  Progress.New(caption, " ", Builtins.size(steps), steps, [], "")

  #Progress stage 1/2
  ProgressNextStage(_("Writing IP forwarding settings..."))

  WriteIPForwarding()
  Builtins.sleep(sl)

  # at first stop the running routes
  # FIXME SCR::Execute(.target.bash, "/etc/init.d/route stop");
  # sysconfig does not support restarting routes only,
  # so we let our caller do it together with other things

  #Progress stage 2/2
  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, "")
  else
    SCR.Execute(
      path(".target.bash"),
      "/bin/cp #{ROUTES_FILE} #{ROUTES_FILE}.YaST2save"
    )
  end

  ret = false
  if @Routes == []
    # workaround bug [#4476]
    ret = SCR.Write(path(".target.string"), ROUTES_FILE, "")
  else
    # update the routes config
    ret = SCR.Write(path(".routes"), @Routes)
  end
  Builtins.sleep(sl)
  Progress.NextStage

  # and finally set up the new routes
  # FIXME SCR::Execute(.target.bash, "/etc/init.d/route start");

  ret == true
end

- (Object) WriteIPForwarding



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File '../../src/modules/Routing.rb', line 141

def WriteIPForwarding
  forward_ipv4 = @Forward_v4 ? "1" : "0"
  forward_ipv6 = @Forward_v6 ? "1" : "0"

  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(SYSCTL_IPV4_PATH),
      forward_ipv4
    )
    SCR.Write(
      path(SYSCTL_IPV6_PATH),
      forward_ipv6
    )
    SCR.Write(path(".etc.sysctl_conf"), nil)
  end

  SCR.Execute(
    path(".target.bash"),
    "echo #{forward_ipv4} > /proc/sys/net/ipv4/ip_forward"
  )
  SCR.Execute(
    path(".target.bash"),
    "echo #{forward_ipv6} > /proc/sys/net/ipv6/conf/all/forwarding",
  )

  nil
end