linux_admin 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/linux_admin/network_interface.rb +47 -14
- data/lib/linux_admin/network_interface/network_interface_rh.rb +51 -1
- data/lib/linux_admin/service/sys_v_init_service.rb +4 -0
- data/lib/linux_admin/service/systemd_service.rb +39 -15
- data/lib/linux_admin/version.rb +1 -1
- data/spec/network_interface/network_interface_rh_spec.rb +47 -2
- data/spec/network_interface_spec.rb +60 -1
- data/spec/service/systemd_service_spec.rb +37 -23
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45fe746b6f6401803b85ca5775c961a0fff87538
|
4
|
+
data.tar.gz: 748af8054c1540f1337541dbf02f9626a9d91ed8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d31d976370bf3df926f66b0b075a2a3234b3f373faf4309eba1d1920163239e901297a9e846406e4c3e70429fcbb2c54feb01daef4cacc73e189468ad697ff0
|
7
|
+
data.tar.gz: e49ec88d3c04c0e2d56a75ec02d9814b9866e1c3144941160c390cd55182548959e3aaa8306ffbd07a6f51d1ed76a00ec5228ecce0dd052d265775e2989f4aef
|
@@ -51,11 +51,10 @@ module LinuxAdmin
|
|
51
51
|
|
52
52
|
@network_conf[:mac] = parse_ip_output(ip_output, %r{link/ether}, 1)
|
53
53
|
|
54
|
-
|
55
|
-
|
54
|
+
[4, 6].each do |version|
|
55
|
+
@network_conf["gateway#{version}".to_sym] = parse_ip_output(ip_route(version), /^default/, 2)
|
56
|
+
end
|
56
57
|
true
|
57
|
-
rescue AwesomeSpawn::CommandResultError => e
|
58
|
-
raise NetworkInterfaceError.new(e.message, e.result)
|
59
58
|
end
|
60
59
|
|
61
60
|
# Retrieve the IPv4 address assigned to the interface
|
@@ -91,7 +90,7 @@ module LinuxAdmin
|
|
91
90
|
#
|
92
91
|
# @return [String] IPv4 netmask
|
93
92
|
def netmask
|
94
|
-
@network_conf[:mask]
|
93
|
+
@network_conf[:mask] ||= IPAddr.new('255.255.255.255').mask(prefix).to_s if prefix
|
95
94
|
end
|
96
95
|
|
97
96
|
# Retrieve the IPv6 sub-net mask assigned to the interface
|
@@ -99,10 +98,26 @@ module LinuxAdmin
|
|
99
98
|
# @return [String] IPv6 netmask
|
100
99
|
# @raise [ArgumentError] if the given scope is not `:global` or `:link`
|
101
100
|
def netmask6(scope = :global)
|
102
|
-
if
|
103
|
-
@network_conf[:
|
104
|
-
|
105
|
-
|
101
|
+
if [:global, :link].include?(scope)
|
102
|
+
@network_conf["mask6_#{scope}".to_sym] ||= IPAddr.new('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff').mask(prefix6(scope)).to_s if prefix6(scope)
|
103
|
+
else
|
104
|
+
raise ArgumentError, "Unrecognized address scope #{scope}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# Retrieve the IPv4 sub-net prefix length assigned to the interface
|
109
|
+
#
|
110
|
+
# @return [Numeric] IPv4 prefix length
|
111
|
+
def prefix
|
112
|
+
@network_conf[:prefix]
|
113
|
+
end
|
114
|
+
|
115
|
+
# Retrieve the IPv6 sub-net prefix length assigned to the interface
|
116
|
+
#
|
117
|
+
# @return [Numeric] IPv6 prefix length
|
118
|
+
def prefix6(scope = :global)
|
119
|
+
if [:global, :link].include?(scope)
|
120
|
+
@network_conf["prefix6_#{scope}".to_sym]
|
106
121
|
else
|
107
122
|
raise ArgumentError, "Unrecognized address scope #{scope}"
|
108
123
|
end
|
@@ -112,7 +127,14 @@ module LinuxAdmin
|
|
112
127
|
#
|
113
128
|
# @return [String] IPv4 gateway address
|
114
129
|
def gateway
|
115
|
-
@network_conf[:
|
130
|
+
@network_conf[:gateway4]
|
131
|
+
end
|
132
|
+
|
133
|
+
# Retrieve the IPv6 default gateway associated with the interface
|
134
|
+
#
|
135
|
+
# @return [String] IPv6 gateway address
|
136
|
+
def gateway6
|
137
|
+
@network_conf[:gateway6]
|
116
138
|
end
|
117
139
|
|
118
140
|
# Brings up the network interface
|
@@ -152,6 +174,17 @@ module LinuxAdmin
|
|
152
174
|
raise NetworkInterfaceError.new(e.message, e.result)
|
153
175
|
end
|
154
176
|
|
177
|
+
# Runs the command `ip -[4/6] route` and returns the output
|
178
|
+
#
|
179
|
+
# @param version [Fixnum] Version of IP protocol (4 or 6)
|
180
|
+
# @return [String] The command output
|
181
|
+
# @raise [NetworkInterfaceError] if the command fails
|
182
|
+
def ip_route(version)
|
183
|
+
Common.run!(Common.cmd("ip"), :params => ["-#{version}", 'route']).output
|
184
|
+
rescue AwesomeSpawn::CommandResultError => e
|
185
|
+
raise NetworkInterfaceError.new(e.message, e.result)
|
186
|
+
end
|
187
|
+
|
155
188
|
# Parses the IPv4 information from the output of `ip addr show <device>`
|
156
189
|
#
|
157
190
|
# @param ip_output [String] The command output
|
@@ -159,8 +192,9 @@ module LinuxAdmin
|
|
159
192
|
cidr_ip = parse_ip_output(ip_output, /inet /, 1)
|
160
193
|
return unless cidr_ip
|
161
194
|
|
162
|
-
|
163
|
-
@network_conf[:
|
195
|
+
parts = cidr_ip.split('/')
|
196
|
+
@network_conf[:address] = parts[0]
|
197
|
+
@network_conf[:prefix] = parts[1].to_i
|
164
198
|
end
|
165
199
|
|
166
200
|
# Parses the IPv6 information from the output of `ip addr show <device>`
|
@@ -168,13 +202,12 @@ module LinuxAdmin
|
|
168
202
|
# @param ip_output [String] The command output
|
169
203
|
# @param scope [Symbol] The IPv6 scope (either `:global` or `:local`)
|
170
204
|
def parse_ip6(ip_output, scope)
|
171
|
-
mask_addr = IPAddr.new('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
|
172
205
|
cidr_ip = parse_ip_output(ip_output, /inet6 .* scope #{scope}/, 1)
|
173
206
|
return unless cidr_ip
|
174
207
|
|
175
208
|
parts = cidr_ip.split('/')
|
176
209
|
@network_conf["address6_#{scope}".to_sym] = parts[0]
|
177
|
-
@network_conf["
|
210
|
+
@network_conf["prefix6_#{scope}".to_sym] = parts[1].to_i
|
178
211
|
end
|
179
212
|
end
|
180
213
|
end
|
@@ -39,6 +39,18 @@ module LinuxAdmin
|
|
39
39
|
@interface_config["IPADDR"] = address
|
40
40
|
end
|
41
41
|
|
42
|
+
# Set the IPv6 address for this interface
|
43
|
+
#
|
44
|
+
# @param address [String] IPv6 address including the prefix length (i.e. '::1/127')
|
45
|
+
# @raise ArgumentError if the address is not formatted properly
|
46
|
+
def address6=(address)
|
47
|
+
validate_ip(address)
|
48
|
+
@interface_config['BOOTPROTO'] = 'static'
|
49
|
+
@interface_config['IPV6INIT'] = 'yes'
|
50
|
+
@interface_config['DHCPV6C'] = 'no'
|
51
|
+
@interface_config['IPV6ADDR'] = address
|
52
|
+
end
|
53
|
+
|
42
54
|
# Set the IPv4 gateway address for this interface
|
43
55
|
#
|
44
56
|
# @param address [String]
|
@@ -48,6 +60,15 @@ module LinuxAdmin
|
|
48
60
|
@interface_config["GATEWAY"] = address
|
49
61
|
end
|
50
62
|
|
63
|
+
# Set the IPv6 gateway address for this interface
|
64
|
+
#
|
65
|
+
# @param address [String] IPv6 address optionally including the prefix length
|
66
|
+
# @raise ArgumentError if the address is not formatted properly
|
67
|
+
def gateway6=(address)
|
68
|
+
validate_ip(address)
|
69
|
+
@interface_config['IPV6_DEFAULTGW'] = address
|
70
|
+
end
|
71
|
+
|
51
72
|
# Set the IPv4 sub-net mask for this interface
|
52
73
|
#
|
53
74
|
# @param mask [String]
|
@@ -74,7 +95,7 @@ module LinuxAdmin
|
|
74
95
|
end
|
75
96
|
|
76
97
|
# Set up the interface to use DHCP
|
77
|
-
# Removes any previously set static networking information
|
98
|
+
# Removes any previously set static IPv4 networking information
|
78
99
|
def enable_dhcp
|
79
100
|
@interface_config["BOOTPROTO"] = "dhcp"
|
80
101
|
@interface_config.delete("IPADDR")
|
@@ -86,6 +107,18 @@ module LinuxAdmin
|
|
86
107
|
@interface_config.delete("DOMAIN")
|
87
108
|
end
|
88
109
|
|
110
|
+
# Set up the interface to use DHCPv6
|
111
|
+
# Removes any previously set static IPv6 networking information
|
112
|
+
def enable_dhcp6
|
113
|
+
@interface_config['IPV6INIT'] = 'yes'
|
114
|
+
@interface_config['DHCPV6C'] = 'yes'
|
115
|
+
@interface_config.delete('IPV6ADDR')
|
116
|
+
@interface_config.delete('IPV6_DEFAULTGW')
|
117
|
+
@interface_config.delete("DNS1")
|
118
|
+
@interface_config.delete("DNS2")
|
119
|
+
@interface_config.delete("DOMAIN")
|
120
|
+
end
|
121
|
+
|
89
122
|
# Applies the given static network configuration to the interface
|
90
123
|
#
|
91
124
|
# @param ip [String] IPv4 address
|
@@ -104,6 +137,23 @@ module LinuxAdmin
|
|
104
137
|
save
|
105
138
|
end
|
106
139
|
|
140
|
+
# Applies the given static IPv6 network configuration to the interface
|
141
|
+
#
|
142
|
+
# @param ip [String] IPv6 address
|
143
|
+
# @param prefix [Number] prefix length for IPv6 address
|
144
|
+
# @param gw [String] gateway address
|
145
|
+
# @param dns [Array<String>] list of dns servers
|
146
|
+
# @param search [Array<String>] list of search domains
|
147
|
+
# @return [Boolean] true on success, false otherwise
|
148
|
+
# @raise ArgumentError if an IP is not formatted properly or interface does not start
|
149
|
+
def apply_static6(ip, prefix, gw, dns, search = nil)
|
150
|
+
self.address6 = "#{ip}/#{prefix}"
|
151
|
+
self.gateway6 = gw
|
152
|
+
self.dns = dns
|
153
|
+
self.search_order = search if search
|
154
|
+
save
|
155
|
+
end
|
156
|
+
|
107
157
|
# Writes the contents of @interface_config to @interface_file as `key`=`value` pairs
|
108
158
|
# and resets the interface
|
109
159
|
#
|
@@ -1,38 +1,31 @@
|
|
1
1
|
module LinuxAdmin
|
2
2
|
class SystemdService < Service
|
3
3
|
def running?
|
4
|
-
Common.run(
|
5
|
-
:params => {nil => ["status", name]}).exit_status == 0
|
4
|
+
Common.run(command_path, :params => ["status", name]).success?
|
6
5
|
end
|
7
6
|
|
8
7
|
def enable
|
9
|
-
Common.run!(
|
10
|
-
:params => {nil => ["enable", name]})
|
8
|
+
Common.run!(command_path, :params => ["enable", name])
|
11
9
|
self
|
12
10
|
end
|
13
11
|
|
14
12
|
def disable
|
15
|
-
Common.run!(
|
16
|
-
:params => {nil => ["disable", name]})
|
13
|
+
Common.run!(command_path, :params => ["disable", name])
|
17
14
|
self
|
18
15
|
end
|
19
16
|
|
20
17
|
def start
|
21
|
-
Common.run!(
|
22
|
-
:params => {nil => ["start", name]})
|
18
|
+
Common.run!(command_path, :params => ["start", name])
|
23
19
|
self
|
24
20
|
end
|
25
21
|
|
26
22
|
def stop
|
27
|
-
Common.run!(
|
28
|
-
:params => {nil => ["stop", name]})
|
23
|
+
Common.run!(command_path, :params => ["stop", name])
|
29
24
|
self
|
30
25
|
end
|
31
26
|
|
32
27
|
def restart
|
33
|
-
status =
|
34
|
-
Common.run(Common.cmd(:systemctl),
|
35
|
-
:params => {nil => ["restart", name]}).exit_status
|
28
|
+
status = Common.run(command_path, :params => ["restart", name]).exit_status
|
36
29
|
|
37
30
|
# attempt to manually stop/start if restart fails
|
38
31
|
if status != 0
|
@@ -44,12 +37,43 @@ module LinuxAdmin
|
|
44
37
|
end
|
45
38
|
|
46
39
|
def reload
|
47
|
-
Common.run!(
|
40
|
+
Common.run!(command_path, :params => ["reload", name])
|
48
41
|
self
|
49
42
|
end
|
50
43
|
|
51
44
|
def status
|
52
|
-
Common.run(
|
45
|
+
Common.run(command_path, :params => ["status", name]).output
|
46
|
+
end
|
47
|
+
|
48
|
+
def show
|
49
|
+
output = Common.run!(command_path, :params => ["show", name]).output
|
50
|
+
output.split("\n").each_with_object({}) do |line, h|
|
51
|
+
k, v = line.split("=", 2)
|
52
|
+
h[k] = cast_show_value(k, v)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def command_path
|
59
|
+
Common.cmd(:systemctl)
|
60
|
+
end
|
61
|
+
|
62
|
+
def cast_show_value(key, value)
|
63
|
+
return value.to_i if value =~ /^\d+$/
|
64
|
+
|
65
|
+
case key
|
66
|
+
when /^.*Timestamp$/
|
67
|
+
Time.parse(value)
|
68
|
+
when /Exec(Start|Stop)/
|
69
|
+
parse_exec_value(value)
|
70
|
+
else
|
71
|
+
value
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def parse_exec_value(value)
|
76
|
+
value[1..-2].strip.split(" ; ").map { |s| s.split("=", 2) }.to_h
|
53
77
|
end
|
54
78
|
end
|
55
79
|
end
|
data/lib/linux_admin/version.rb
CHANGED
@@ -40,14 +40,14 @@ EOF
|
|
40
40
|
subject(:dhcp_interface) do
|
41
41
|
allow(File).to receive(:exist?).and_return(true)
|
42
42
|
stub_foreach_to_string(ifcfg_file_dhcp)
|
43
|
-
allow(AwesomeSpawn).to receive(:run!).
|
43
|
+
allow(AwesomeSpawn).to receive(:run!).exactly(4).times.and_return(result("", 0))
|
44
44
|
described_class.new(device_name)
|
45
45
|
end
|
46
46
|
|
47
47
|
subject(:static_interface) do
|
48
48
|
allow(File).to receive(:exist?).and_return(true)
|
49
49
|
stub_foreach_to_string(ifcfg_file_static)
|
50
|
-
allow(AwesomeSpawn).to receive(:run!).
|
50
|
+
allow(AwesomeSpawn).to receive(:run!).exactly(4).times.and_return(result("", 0))
|
51
51
|
described_class.new(device_name)
|
52
52
|
end
|
53
53
|
|
@@ -100,6 +100,22 @@ EOF
|
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
|
+
describe '#address6=' do
|
104
|
+
it 'sets the ipv6 address' do
|
105
|
+
address = 'fe80::1/64'
|
106
|
+
dhcp_interface.address6 = address
|
107
|
+
conf = dhcp_interface.interface_config
|
108
|
+
expect(conf['IPV6ADDR']).to eq(address)
|
109
|
+
expect(conf['BOOTPROTO']).to eq('static')
|
110
|
+
expect(conf['IPV6INIT']).to eq('yes')
|
111
|
+
expect(conf['DHCPV6C']).to eq('no')
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'raises error when given a bad address' do
|
115
|
+
expect { dhcp_interface.address6 = '1::1::1' }.to raise_error(ArgumentError)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
103
119
|
describe "#gateway=" do
|
104
120
|
it "sets the gateway address" do
|
105
121
|
address = "192.168.1.1"
|
@@ -112,6 +128,14 @@ EOF
|
|
112
128
|
end
|
113
129
|
end
|
114
130
|
|
131
|
+
describe '#gateway6=' do
|
132
|
+
it 'sets the default gateway for IPv6' do
|
133
|
+
address = 'fe80::1/64'
|
134
|
+
dhcp_interface.gateway6 = address
|
135
|
+
expect(dhcp_interface.interface_config['IPV6_DEFAULTGW']).to eq(address)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
115
139
|
describe "#netmask=" do
|
116
140
|
it "sets the sub-net mask" do
|
117
141
|
mask = "255.255.255.0"
|
@@ -185,6 +209,17 @@ EOF
|
|
185
209
|
end
|
186
210
|
end
|
187
211
|
|
212
|
+
describe '#enable_dhcp6' do
|
213
|
+
it 'sets the correct configuration' do
|
214
|
+
[static_interface, dhcp_interface].each do |interface|
|
215
|
+
interface.enable_dhcp6
|
216
|
+
conf = interface.interface_config
|
217
|
+
expect(conf).to include('IPV6INIT' => 'yes', 'DHCPV6C' => 'yes')
|
218
|
+
expect(conf.keys).not_to include('IPV6ADDR', 'IPV6_DEFAULTGW')
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
188
223
|
describe "#apply_static" do
|
189
224
|
it "sets the correct configuration" do
|
190
225
|
expect(dhcp_interface).to receive(:save)
|
@@ -201,6 +236,16 @@ EOF
|
|
201
236
|
end
|
202
237
|
end
|
203
238
|
|
239
|
+
describe '#apply_static6' do
|
240
|
+
it 'sets the static IPv6 configuration' do
|
241
|
+
expect(dhcp_interface).to receive(:save)
|
242
|
+
dhcp_interface.apply_static6('d:e:a:d:b:e:e:f', 127, 'd:e:a:d::/64', ['d:e:a:d::'])
|
243
|
+
conf = dhcp_interface.interface_config
|
244
|
+
expect(conf).to include('BOOTPROTO' => 'static', 'IPV6INIT' => 'yes', 'DHCPV6C' => 'no',
|
245
|
+
'IPV6ADDR' => 'd:e:a:d:b:e:e:f/127', 'IPV6_DEFAULTGW' => 'd:e:a:d::/64')
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
204
249
|
describe "#save" do
|
205
250
|
let(:iface_file) { Pathname.new("/etc/sysconfig/network-scripts/ifcfg-#{device_name}") }
|
206
251
|
|
@@ -65,7 +65,12 @@ describe LinuxAdmin::NetworkInterface do
|
|
65
65
|
|
66
66
|
IP_ROUTE_ARGS = [
|
67
67
|
LinuxAdmin::Common.cmd("ip"),
|
68
|
-
:params =>
|
68
|
+
:params => ['-4', 'route']
|
69
|
+
]
|
70
|
+
|
71
|
+
IP6_ROUTE_ARGS = [
|
72
|
+
LinuxAdmin::Common.cmd("ip"),
|
73
|
+
:params => ['-6', 'route']
|
69
74
|
]
|
70
75
|
|
71
76
|
IFUP_ARGS = [
|
@@ -101,6 +106,16 @@ IP_OUT
|
|
101
106
|
IP_ROUTE_OUT = <<-IP_OUT
|
102
107
|
default via 192.168.1.1 dev eth0 proto static metric 100
|
103
108
|
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.9 metric 100
|
109
|
+
IP_OUT
|
110
|
+
IP6_ROUTE_OUT = <<-IP_OUT
|
111
|
+
default via d:e:a:d:b:e:e:f dev eth0 proto static metric 100
|
112
|
+
fc00:dead:beef:a::/64 dev virbr1 proto kernel metric 256 linkdown pref medium
|
113
|
+
fe80::/64 dev eth0 proto kernel scope link metric 100
|
114
|
+
IP_OUT
|
115
|
+
|
116
|
+
IP_NONE_ADDR_OUT = <<-IP_OUT.freeze
|
117
|
+
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr1 state DOWN group default qlen 1000
|
118
|
+
link/ether 52:54:00:ce:b4:f4 brd ff:ff:ff:ff:ff:ff
|
104
119
|
IP_OUT
|
105
120
|
|
106
121
|
subject(:subj) do
|
@@ -109,6 +124,7 @@ IP_OUT
|
|
109
124
|
|
110
125
|
allow(AwesomeSpawn).to receive(:run!).with(*IP_SHOW_ARGS).and_return(result(IP_ADDR_OUT, 0))
|
111
126
|
allow(AwesomeSpawn).to receive(:run!).with(*IP_ROUTE_ARGS).and_return(result(IP_ROUTE_OUT, 0))
|
127
|
+
allow(AwesomeSpawn).to receive(:run!).with(*IP6_ROUTE_ARGS).and_return(result(IP6_ROUTE_OUT, 0))
|
112
128
|
described_class.new("eth0")
|
113
129
|
end
|
114
130
|
|
@@ -118,6 +134,17 @@ IP_OUT
|
|
118
134
|
|
119
135
|
allow(AwesomeSpawn).to receive(:run!).with(*IP_SHOW_ARGS).and_return(result(IP6_ADDR_OUT, 0))
|
120
136
|
allow(AwesomeSpawn).to receive(:run!).with(*IP_ROUTE_ARGS).and_return(result(IP_ROUTE_OUT, 0))
|
137
|
+
allow(AwesomeSpawn).to receive(:run!).with(*IP6_ROUTE_ARGS).and_return(result(IP6_ROUTE_OUT, 0))
|
138
|
+
described_class.new("eth0")
|
139
|
+
end
|
140
|
+
|
141
|
+
subject(:subj_no_net) do
|
142
|
+
allow(LinuxAdmin::Distros).to receive(:local).and_return(LinuxAdmin::Distros.generic)
|
143
|
+
described_class.dist_class(true)
|
144
|
+
|
145
|
+
allow(AwesomeSpawn).to receive(:run!).with(*IP_SHOW_ARGS).and_return(result(IP_NONE_ADDR_OUT, 0))
|
146
|
+
allow(AwesomeSpawn).to receive(:run!).with(*IP_ROUTE_ARGS).and_return(result(IP_ROUTE_OUT, 0))
|
147
|
+
allow(AwesomeSpawn).to receive(:run!).with(*IP6_ROUTE_ARGS).and_return(result(IP6_ROUTE_OUT, 0))
|
121
148
|
described_class.new("eth0")
|
122
149
|
end
|
123
150
|
|
@@ -138,6 +165,7 @@ IP_OUT
|
|
138
165
|
awesome_error = AwesomeSpawn::CommandResultError.new("", nil)
|
139
166
|
allow(AwesomeSpawn).to receive(:run!).with(*IP_SHOW_ARGS).and_return(result(IP_ADDR_OUT, 0))
|
140
167
|
allow(AwesomeSpawn).to receive(:run!).with(*IP_ROUTE_ARGS).and_raise(awesome_error)
|
168
|
+
allow(AwesomeSpawn).to receive(:run!).with(*IP6_ROUTE_ARGS).and_raise(awesome_error)
|
141
169
|
expect { subj.reload }.to raise_error(LinuxAdmin::NetworkInterfaceError)
|
142
170
|
end
|
143
171
|
|
@@ -145,6 +173,7 @@ IP_OUT
|
|
145
173
|
subj6
|
146
174
|
allow(AwesomeSpawn).to receive(:run!).with(*IP_SHOW_ARGS).and_return(result(IP6_ADDR_OUT, 0))
|
147
175
|
allow(AwesomeSpawn).to receive(:run!).with(*IP_ROUTE_ARGS).and_return(result(IP_ROUTE_OUT, 0))
|
176
|
+
allow(AwesomeSpawn).to receive(:run!).with(*IP6_ROUTE_ARGS).and_return(result(IP6_ROUTE_OUT, 0))
|
148
177
|
expect { subj.reload }.to_not raise_error
|
149
178
|
end
|
150
179
|
end
|
@@ -179,6 +208,10 @@ IP_OUT
|
|
179
208
|
it "returns the correct netmask" do
|
180
209
|
expect(subj.netmask).to eq("255.255.255.0")
|
181
210
|
end
|
211
|
+
|
212
|
+
it 'does not blow-up, when no ip assigned' do
|
213
|
+
expect(subj_no_net.netmask).to eq(nil)
|
214
|
+
end
|
182
215
|
end
|
183
216
|
|
184
217
|
describe "#netmask6" do
|
@@ -195,12 +228,38 @@ IP_OUT
|
|
195
228
|
end
|
196
229
|
end
|
197
230
|
|
231
|
+
describe '#prefix' do
|
232
|
+
it 'returns the correct prefix' do
|
233
|
+
expect(subj.prefix).to eq(24)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe '#prefix6' do
|
238
|
+
it 'returns the correct global prefix length' do
|
239
|
+
expect(subj.prefix6).to eq(96)
|
240
|
+
end
|
241
|
+
|
242
|
+
it 'returns the correct link local prefix length' do
|
243
|
+
expect(subj.prefix6(:link)).to eq(64)
|
244
|
+
end
|
245
|
+
|
246
|
+
it 'raises ArgumentError when given a bad scope' do
|
247
|
+
expect { subj.prefix6(:garbage) }.to raise_error(ArgumentError)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
198
251
|
describe "#gateway" do
|
199
252
|
it "returns the correct gateway address" do
|
200
253
|
expect(subj.gateway).to eq("192.168.1.1")
|
201
254
|
end
|
202
255
|
end
|
203
256
|
|
257
|
+
describe '#gateway6' do
|
258
|
+
it 'returns the correct default gateway for IPv6 routing' do
|
259
|
+
expect(subj.gateway6).to eq('d:e:a:d:b:e:e:f')
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
204
263
|
describe "#start" do
|
205
264
|
it "returns true on success" do
|
206
265
|
expect(AwesomeSpawn).to receive(:run).with(*IFUP_ARGS).and_return(result("", 0))
|
@@ -1,4 +1,6 @@
|
|
1
1
|
describe LinuxAdmin::SystemdService do
|
2
|
+
let(:command) { LinuxAdmin::Common.cmd(:systemctl) }
|
3
|
+
|
2
4
|
before do
|
3
5
|
@service = described_class.new 'foo'
|
4
6
|
end
|
@@ -6,27 +8,24 @@ describe LinuxAdmin::SystemdService do
|
|
6
8
|
describe "#running?" do
|
7
9
|
it "checks service" do
|
8
10
|
expect(LinuxAdmin::Common).to receive(:run)
|
9
|
-
.with(
|
10
|
-
:params => {nil => %w(status foo)}).and_return(double(:exit_status => 0))
|
11
|
+
.with(command, :params => %w(status foo)).and_return(double(:success? => true))
|
11
12
|
@service.running?
|
12
13
|
end
|
13
14
|
|
14
15
|
it "returns true when service is running" do
|
15
|
-
expect(LinuxAdmin::Common).to receive(:run).and_return(double(:
|
16
|
+
expect(LinuxAdmin::Common).to receive(:run).and_return(double(:success? => true))
|
16
17
|
expect(@service).to be_running
|
17
18
|
end
|
18
19
|
|
19
20
|
it "returns false when service is not running" do
|
20
|
-
expect(LinuxAdmin::Common).to receive(:run).and_return(double(:
|
21
|
+
expect(LinuxAdmin::Common).to receive(:run).and_return(double(:success? => false))
|
21
22
|
expect(@service).not_to be_running
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
25
26
|
describe "#enable" do
|
26
27
|
it "enables service" do
|
27
|
-
expect(LinuxAdmin::Common).to receive(:run!)
|
28
|
-
.with(LinuxAdmin::Common.cmd(:systemctl),
|
29
|
-
:params => {nil => %w(enable foo)})
|
28
|
+
expect(LinuxAdmin::Common).to receive(:run!) .with(command, :params => %w(enable foo))
|
30
29
|
@service.enable
|
31
30
|
end
|
32
31
|
|
@@ -38,9 +37,7 @@ describe LinuxAdmin::SystemdService do
|
|
38
37
|
|
39
38
|
describe "#disable" do
|
40
39
|
it "disables service" do
|
41
|
-
expect(LinuxAdmin::Common).to receive(:run!)
|
42
|
-
.with(LinuxAdmin::Common.cmd(:systemctl),
|
43
|
-
:params => {nil => %w(disable foo)})
|
40
|
+
expect(LinuxAdmin::Common).to receive(:run!).with(command, :params => %w(disable foo))
|
44
41
|
@service.disable
|
45
42
|
end
|
46
43
|
|
@@ -52,9 +49,7 @@ describe LinuxAdmin::SystemdService do
|
|
52
49
|
|
53
50
|
describe "#start" do
|
54
51
|
it "starts service" do
|
55
|
-
expect(LinuxAdmin::Common).to receive(:run!)
|
56
|
-
.with(LinuxAdmin::Common.cmd(:systemctl),
|
57
|
-
:params => {nil => %w(start foo)})
|
52
|
+
expect(LinuxAdmin::Common).to receive(:run!).with(command, :params => %w(start foo))
|
58
53
|
@service.start
|
59
54
|
end
|
60
55
|
|
@@ -66,9 +61,7 @@ describe LinuxAdmin::SystemdService do
|
|
66
61
|
|
67
62
|
describe "#stop" do
|
68
63
|
it "stops service" do
|
69
|
-
expect(LinuxAdmin::Common).to receive(:run!)
|
70
|
-
.with(LinuxAdmin::Common.cmd(:systemctl),
|
71
|
-
:params => {nil => %w(stop foo)})
|
64
|
+
expect(LinuxAdmin::Common).to receive(:run!).with(command, :params => %w(stop foo))
|
72
65
|
@service.stop
|
73
66
|
end
|
74
67
|
|
@@ -80,9 +73,7 @@ describe LinuxAdmin::SystemdService do
|
|
80
73
|
|
81
74
|
describe "#restart" do
|
82
75
|
it "restarts service" do
|
83
|
-
expect(LinuxAdmin::Common).to receive(:run)
|
84
|
-
.with(LinuxAdmin::Common.cmd(:systemctl),
|
85
|
-
:params => {nil => %w(restart foo)}).and_return(double(:exit_status => 0))
|
76
|
+
expect(LinuxAdmin::Common).to receive(:run).with(command, :params => %w(restart foo)).and_return(double(:exit_status => 0))
|
86
77
|
@service.restart
|
87
78
|
end
|
88
79
|
|
@@ -101,8 +92,7 @@ describe LinuxAdmin::SystemdService do
|
|
101
92
|
|
102
93
|
describe "#reload" do
|
103
94
|
it "reloads service" do
|
104
|
-
expect(LinuxAdmin::Common).to receive(:run!)
|
105
|
-
.with(LinuxAdmin::Common.cmd(:systemctl), :params => %w(reload foo))
|
95
|
+
expect(LinuxAdmin::Common).to receive(:run!).with(command, :params => %w(reload foo))
|
106
96
|
expect(@service.reload).to eq(@service)
|
107
97
|
end
|
108
98
|
end
|
@@ -111,9 +101,33 @@ describe LinuxAdmin::SystemdService do
|
|
111
101
|
it "returns the service status" do
|
112
102
|
status = "service status here"
|
113
103
|
expect(LinuxAdmin::Common).to receive(:run)
|
114
|
-
.with(
|
115
|
-
:params => %w(status foo)).and_return(double(:output => status))
|
104
|
+
.with(command, :params => %w(status foo)).and_return(double(:output => status))
|
116
105
|
expect(@service.status).to eq(status)
|
117
106
|
end
|
118
107
|
end
|
108
|
+
|
109
|
+
describe "#show" do
|
110
|
+
it "returns a hash of runtime information" do
|
111
|
+
output = <<-EOS
|
112
|
+
MainPID=29189
|
113
|
+
ExecMainStartTimestamp=Wed 2017-02-08 13:49:57 EST
|
114
|
+
ExecStart={ path=/bin/sh ; argv[]=/bin/sh -c /bin/evmserver.sh start ; status=0/0 }
|
115
|
+
ExecStop={ path=/bin/sh ; argv[]=/bin/sh -c /bin/evmserver.sh stop ; status=0/0 }
|
116
|
+
ControlGroup=/system.slice/evmserverd.service
|
117
|
+
MemoryCurrent=2865373184
|
118
|
+
EOS
|
119
|
+
|
120
|
+
hash = {
|
121
|
+
"MainPID" => 29_189,
|
122
|
+
"ExecMainStartTimestamp" => Time.new(2017, 2, 8, 13, 49, 57, "-05:00"),
|
123
|
+
"ExecStart" => {"path" => "/bin/sh", "argv[]" => "/bin/sh -c /bin/evmserver.sh start", "status" => "0/0"},
|
124
|
+
"ExecStop" => {"path" => "/bin/sh", "argv[]" => "/bin/sh -c /bin/evmserver.sh stop", "status" => "0/0"},
|
125
|
+
"ControlGroup" => "/system.slice/evmserverd.service",
|
126
|
+
"MemoryCurrent" => 2_865_373_184
|
127
|
+
}
|
128
|
+
expect(LinuxAdmin::Common).to receive(:run!)
|
129
|
+
.with(command, :params => %w(show foo)).and_return(double(:output => output))
|
130
|
+
expect(@service.show).to eq(hash)
|
131
|
+
end
|
132
|
+
end
|
119
133
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: linux_admin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.20.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Dunne
|
@@ -20,7 +20,7 @@ authors:
|
|
20
20
|
autorequire:
|
21
21
|
bindir: bin
|
22
22
|
cert_chain: []
|
23
|
-
date:
|
23
|
+
date: 2017-03-24 00:00:00.000000000 Z
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
@@ -140,14 +140,14 @@ dependencies:
|
|
140
140
|
requirements:
|
141
141
|
- - ">="
|
142
142
|
- !ruby/object:Gem::Version
|
143
|
-
version:
|
143
|
+
version: 1.6.8
|
144
144
|
type: :runtime
|
145
145
|
prerelease: false
|
146
146
|
version_requirements: !ruby/object:Gem::Requirement
|
147
147
|
requirements:
|
148
148
|
- - ">="
|
149
149
|
- !ruby/object:Gem::Version
|
150
|
-
version:
|
150
|
+
version: 1.6.8
|
151
151
|
- !ruby/object:Gem::Dependency
|
152
152
|
name: openscap
|
153
153
|
requirement: !ruby/object:Gem::Requirement
|