Class: LinuxAdmin::NetworkInterfaceRH

Inherits:
NetworkInterface show all
Defined in:
lib/linux_admin/network_interface/network_interface_rh.rb

Constant Summary collapse

IFACE_DIR =
"/etc/sysconfig/network-scripts"

Instance Attribute Summary collapse

Attributes inherited from NetworkInterface

#interface

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from NetworkInterface

#address, #address6, dist_class, #gateway, #gateway6, #mac_address, #netmask, #netmask6, new, #prefix, #prefix6, #reload, #start, #stop

Constructor Details

#initialize(interface) ⇒ NetworkInterfaceRH

Returns a new instance of NetworkInterfaceRH.

Parameters:

  • interface (String)

    Name of the network interface to manage



12
13
14
15
16
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 12

def initialize(interface)
  @interface_file = self.class.path_to_interface_config_file(interface)
  super
  parse_conf
end

Instance Attribute Details

#interface_configHash<String, String> (readonly)

Returns Key value mappings in the interface file.

Returns:

  • (Hash<String, String>)

    Key value mappings in the interface file



9
10
11
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 9

def interface_config
  @interface_config
end

Class Method Details

.path_to_interface_config_file(interface) ⇒ Object



186
187
188
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 186

def self.path_to_interface_config_file(interface)
  Pathname.new(IFACE_DIR).join("ifcfg-#{interface}")
end

Instance Method Details

#address6=(address) ⇒ Object

Set the IPv6 address for this interface

Parameters:

  • address (String)

    IPv6 address including the prefix length (i.e. ‘::1/127’)

Raises:

  • ArgumentError if the address is not formatted properly



48
49
50
51
52
53
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 48

def address6=(address)
  validate_ip(address)
  @interface_config['IPV6INIT']  = 'yes'
  @interface_config['DHCPV6C']   = 'no'
  @interface_config['IPV6ADDR']  = address
end

#address=(address) ⇒ Object

Set the IPv4 address for this interface

Parameters:

  • address (String)

Raises:

  • ArgumentError if the address is not formatted properly



38
39
40
41
42
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 38

def address=(address)
  validate_ip(address)
  @interface_config["BOOTPROTO"] = "static"
  @interface_config["IPADDR"]    = address
end

#apply_static(ip, mask, gw, dns, search = nil) ⇒ Boolean

Applies the given static network configuration to the interface

Parameters:

  • ip (String)

    IPv4 address

  • mask (String)

    subnet mask

  • gw (String)

    gateway address

  • dns (Array<String>)

    list of dns servers

  • search (Array<String>) (defaults to: nil)

    list of search domains

Returns:

  • (Boolean)

    true on success, false otherwise

Raises:

  • ArgumentError if an IP is not formatted properly



132
133
134
135
136
137
138
139
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 132

def apply_static(ip, mask, gw, dns, search = nil)
  self.address      = ip
  self.netmask      = mask
  self.gateway      = gw
  self.dns          = dns
  self.search_order = search if search
  save
end

#apply_static6(ip, prefix, gw, dns, search = nil) ⇒ Boolean

Applies the given static IPv6 network configuration to the interface

Parameters:

  • ip (String)

    IPv6 address

  • prefix (Number)

    prefix length for IPv6 address

  • gw (String)

    gateway address

  • dns (Array<String>)

    list of dns servers

  • search (Array<String>) (defaults to: nil)

    list of search domains

Returns:

  • (Boolean)

    true on success, false otherwise

Raises:

  • ArgumentError if an IP is not formatted properly or interface does not start



150
151
152
153
154
155
156
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 150

def apply_static6(ip, prefix, gw, dns, search = nil)
  self.address6     = "#{ip}/#{prefix}"
  self.gateway6     = gw
  self.dns          = dns
  self.search_order = search if search
  save
end

#dns=(*servers) ⇒ Object

Sets one or both DNS servers for this network interface

Parameters:

  • servers (Array<String>)

    The DNS servers



85
86
87
88
89
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 85

def dns=(*servers)
  server1, server2 = servers.flatten
  @interface_config["DNS1"] = server1
  @interface_config["DNS2"] = server2 if server2
end

#enable_dhcpObject

Set up the interface to use DHCP Removes any previously set static IPv4 networking information



100
101
102
103
104
105
106
107
108
109
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 100

def enable_dhcp
  @interface_config["BOOTPROTO"] = "dhcp"
  @interface_config.delete("IPADDR")
  @interface_config.delete("NETMASK")
  @interface_config.delete("GATEWAY")
  @interface_config.delete("PREFIX")
  @interface_config.delete("DNS1")
  @interface_config.delete("DNS2")
  @interface_config.delete("DOMAIN")
end

#enable_dhcp6Object

Set up the interface to use DHCPv6 Removes any previously set static IPv6 networking information



113
114
115
116
117
118
119
120
121
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 113

def enable_dhcp6
  @interface_config['IPV6INIT'] = 'yes'
  @interface_config['DHCPV6C'] = 'yes'
  @interface_config.delete('IPV6ADDR')
  @interface_config.delete('IPV6_DEFAULTGW')
  @interface_config.delete("DNS1")
  @interface_config.delete("DNS2")
  @interface_config.delete("DOMAIN")
end

#gateway6=(address) ⇒ Object

Set the IPv6 gateway address for this interface

Parameters:

  • address (String)

    IPv6 address optionally including the prefix length

Raises:

  • ArgumentError if the address is not formatted properly



68
69
70
71
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 68

def gateway6=(address)
  validate_ip(address)
  @interface_config['IPV6_DEFAULTGW'] = address
end

#gateway=(address) ⇒ Object

Set the IPv4 gateway address for this interface

Parameters:

  • address (String)

Raises:

  • ArgumentError if the address is not formatted properly



59
60
61
62
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 59

def gateway=(address)
  validate_ip(address)
  @interface_config["GATEWAY"] = address
end

#netmask=(mask) ⇒ Object

Set the IPv4 sub-net mask for this interface

Parameters:

  • mask (String)

Raises:

  • ArgumentError if the mask is not formatted properly



77
78
79
80
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 77

def netmask=(mask)
  validate_ip(mask)
  @interface_config["NETMASK"] = mask
end

#parse_confObject

Parses the interface configuration file into the @interface_config hash



19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 19

def parse_conf
  @interface_config = {}

  if @interface_file.file?
    File.foreach(@interface_file) do |line|
      next if line =~ /^\s*#/

      key, value = line.split('=').collect(&:strip)
      @interface_config[key] = value
    end
  end

  @interface_config["NM_CONTROLLED"] = "no"
end

#saveBoolean

Writes the contents of @interface_config to @interface_file as ‘key`=`value` pairs and resets the interface

Returns:

  • (Boolean)

    true if the interface was successfully brought up with the new configuration, false otherwise



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 163

def save
  old_contents = @interface_file.file? ? File.read(@interface_file) : ""

  stop_success = stop
  # Stop twice because when configure both ipv4 and ipv6 as dhcp, ipv6 dhcp client will
  # exit and leave a /var/run/dhclient6-eth0.pid file. Then stop (ifdown eth0) will try
  # to kill this exited process so it returns 1. In the second call, this `.pid' file
  # has been deleted and ifdown returns 0.
  # See: https://bugzilla.redhat.com/show_bug.cgi?id=1472396
  stop_success = stop unless stop_success
  return false unless stop_success

  File.write(@interface_file, @interface_config.delete_blanks.collect { |k, v| "#{k}=#{v}" }.join("\n"))

  unless start
    File.write(@interface_file, old_contents)
    start
    return false
  end

  reload
end

#search_order=(*domains) ⇒ Object

Sets the search domain list for this network interface

Parameters:

  • domains (Array<String>)

    the list of search domains



94
95
96
# File 'lib/linux_admin/network_interface/network_interface_rh.rb', line 94

def search_order=(*domains)
  @interface_config["DOMAIN"] = "\"#{domains.flatten.join(' ')}\""
end