linux_admin 0.12.1 → 0.13.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/chrony.rb +21 -0
- data/lib/linux_admin/exceptions.rb +2 -0
- data/lib/linux_admin/hosts.rb +29 -14
- data/lib/linux_admin/network_interface/network_interface_rh.rb +2 -1
- data/lib/linux_admin/network_interface.rb +3 -1
- data/lib/linux_admin/version.rb +1 -1
- data/lib/linux_admin.rb +1 -0
- data/spec/chrony_spec.rb +41 -0
- data/spec/hosts_spec.rb +29 -3
- data/spec/network_interface/network_interface_rh_spec.rb +2 -0
- data/spec/network_interface_spec.rb +40 -2
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c5b96fbeb251ef6a0e5c6a2215b828d78ccaa94
|
4
|
+
data.tar.gz: 32276203e615b1a9a22e0d0899fa3eb1cc7f7551
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a02c17575fc1db9259f7192c9ad138a69d2aa0bf5abf87059f5a91566b3ba0f0fea862279f24a69271eb4ec7d873ce3451b928b6e7ee4256b274dea67df92022
|
7
|
+
data.tar.gz: b7b51b7c0bab05f59e4cce1105abf548ca925be5ee2b2213d8ecebb2f055e41e508adb5eb72862426a15e36023f7d32b7ac5989afb5c78e1d412221f0982b366
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module LinuxAdmin
|
2
|
+
class Chrony
|
3
|
+
def initialize(conf = "/etc/chrony.conf")
|
4
|
+
raise MissingConfigurationFileError, "#{conf} does not exist" unless File.exist?(conf)
|
5
|
+
@conf = conf
|
6
|
+
end
|
7
|
+
|
8
|
+
def clear_servers
|
9
|
+
data = File.read(@conf)
|
10
|
+
data.gsub!(/^server\s+.+\n/, "")
|
11
|
+
File.write(@conf, data)
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_servers(*servers)
|
15
|
+
data = File.read(@conf)
|
16
|
+
data << "\n" unless data.end_with?("\n")
|
17
|
+
servers.each { |s| data << "server #{s}\n" }
|
18
|
+
File.write(@conf, data)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/linux_admin/hosts.rb
CHANGED
@@ -19,23 +19,17 @@ module LinuxAdmin
|
|
19
19
|
def save
|
20
20
|
cleanup_empty
|
21
21
|
@raw_lines = assemble_lines
|
22
|
-
File.write(@filename, @raw_lines.join("\n"))
|
22
|
+
File.write(@filename, @raw_lines.join("\n") + "\n")
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
25
|
+
def add_alias(address, hostname, comment = nil)
|
26
|
+
add_name(address, hostname, false, comment)
|
27
|
+
end
|
28
28
|
|
29
|
-
|
30
|
-
line_number = @parsed_file.find_path(address).first
|
29
|
+
alias_method :update_entry, :add_alias
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
else
|
35
|
-
new_hosts = @parsed_file.fetch_path(line_number, :hosts).to_a.push(hostname)
|
36
|
-
@parsed_file.store_path(line_number, :hosts, new_hosts)
|
37
|
-
@parsed_file.store_path(line_number, :comment, comment) if comment
|
38
|
-
end
|
31
|
+
def set_canonical_hostname(address, hostname, comment = nil)
|
32
|
+
add_name(address, hostname, true, comment)
|
39
33
|
end
|
40
34
|
|
41
35
|
def hostname=(name)
|
@@ -52,7 +46,28 @@ module LinuxAdmin
|
|
52
46
|
result.success? ? result.output.strip : nil
|
53
47
|
end
|
54
48
|
|
55
|
-
|
49
|
+
private
|
50
|
+
|
51
|
+
def add_name(address, hostname, fqdn, comment)
|
52
|
+
# Delete entries for this hostname first
|
53
|
+
@parsed_file.each { |i| i[:hosts].to_a.delete(hostname) }
|
54
|
+
|
55
|
+
# Add entry
|
56
|
+
line_number = @parsed_file.find_path(address).first
|
57
|
+
|
58
|
+
if line_number.blank?
|
59
|
+
@parsed_file.push(:address => address, :hosts => [hostname], :comment => comment)
|
60
|
+
else
|
61
|
+
if fqdn
|
62
|
+
new_hosts = @parsed_file.fetch_path(line_number, :hosts).to_a.unshift(hostname)
|
63
|
+
else
|
64
|
+
new_hosts = @parsed_file.fetch_path(line_number, :hosts).to_a.push(hostname)
|
65
|
+
end
|
66
|
+
@parsed_file.store_path(line_number, :hosts, new_hosts)
|
67
|
+
@parsed_file.store_path(line_number, :comment, comment) if comment
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
56
71
|
def parse_file
|
57
72
|
@parsed_file = []
|
58
73
|
@raw_lines.each { |line| @parsed_file.push(parse_line(line.strip)) }
|
@@ -10,8 +10,9 @@ module LinuxAdmin
|
|
10
10
|
|
11
11
|
# @param interface [String] Name of the network interface to manage
|
12
12
|
def initialize(interface)
|
13
|
+
@interface_file = Pathname.new(IFACE_DIR).join("ifcfg-#{interface}")
|
14
|
+
raise MissingConfigurationFileError unless File.exist?(@interface_file)
|
13
15
|
super
|
14
|
-
@interface_file = Pathname.new(IFACE_DIR).join("ifcfg-#{@interface}")
|
15
16
|
parse_conf
|
16
17
|
end
|
17
18
|
|
@@ -25,6 +25,8 @@ module LinuxAdmin
|
|
25
25
|
# Creates an instance of the correct NetworkInterface subclass for the local distro
|
26
26
|
def self.new(*args)
|
27
27
|
self == LinuxAdmin::NetworkInterface ? dist_class.new(*args) : super
|
28
|
+
rescue MissingConfigurationFileError
|
29
|
+
NetworkInterfaceGeneric.new(*args)
|
28
30
|
end
|
29
31
|
|
30
32
|
# @return [String] the interface for networking operations
|
@@ -156,7 +158,7 @@ module LinuxAdmin
|
|
156
158
|
#
|
157
159
|
# @param ip_output [String] The command output
|
158
160
|
def parse_ip4(ip_output)
|
159
|
-
cidr_ip = parse_ip_output(ip_output, /inet/, 1)
|
161
|
+
cidr_ip = parse_ip_output(ip_output, /inet /, 1)
|
160
162
|
return unless cidr_ip
|
161
163
|
|
162
164
|
@network_conf[:address] = cidr_ip.split('/')[0]
|
data/lib/linux_admin/version.rb
CHANGED
data/lib/linux_admin.rb
CHANGED
data/spec/chrony_spec.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
describe LinuxAdmin::Chrony do
|
2
|
+
CHRONY_CONF = <<-EOF
|
3
|
+
# commented server baz.example.net
|
4
|
+
server foo.example.net
|
5
|
+
server bar.example.net iburst
|
6
|
+
driftfile /var/lib/chrony/drift
|
7
|
+
makestep 10 3
|
8
|
+
rtcsync
|
9
|
+
EOF
|
10
|
+
|
11
|
+
subject do
|
12
|
+
allow(File).to receive(:exist?).and_return(true)
|
13
|
+
described_class.new
|
14
|
+
end
|
15
|
+
|
16
|
+
describe ".new" do
|
17
|
+
it "raises when the given config file doesn't exist" do
|
18
|
+
expect { described_class.new("nonsense/file") }.to raise_error(LinuxAdmin::MissingConfigurationFileError)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#clear_servers" do
|
23
|
+
it "removes all the server lines from the conf file" do
|
24
|
+
allow(File).to receive(:read).and_return(CHRONY_CONF.dup)
|
25
|
+
expect(File).to receive(:write) do |_file, contents|
|
26
|
+
expect(contents).to eq "# commented server baz.example.net\ndriftfile /var/lib/chrony/drift\nmakestep 10 3\nrtcsync\n"
|
27
|
+
end
|
28
|
+
subject.clear_servers
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#add_servers" do
|
33
|
+
it "adds server lines to the conf file" do
|
34
|
+
allow(File).to receive(:read).and_return(CHRONY_CONF.dup)
|
35
|
+
expect(File).to receive(:write) do |_file, contents|
|
36
|
+
expect(contents).to eq(CHRONY_CONF + "server baz.example.net\nserver foo.bar.example.com\n")
|
37
|
+
end
|
38
|
+
subject.add_servers("baz.example.net", "foo.bar.example.com")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/spec/hosts_spec.rb
CHANGED
@@ -32,12 +32,30 @@ describe LinuxAdmin::Hosts do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
describe "#
|
36
|
-
|
37
|
-
|
35
|
+
describe "#set_canonical_hostname" do
|
36
|
+
it "removes an existing entry and creates a new one" do
|
37
|
+
expected_hash = [{:blank => true},
|
38
|
+
{:comment => "Some Comment"},
|
39
|
+
{:address => "127.0.0.1", :hosts => ["localhost", "localhost.localdomain"], :comment => "with a comment"},
|
40
|
+
{:address => "127.0.1.1", :hosts => []},
|
41
|
+
{:address => "1.2.3.4", :hosts => ["my.domain.local"], :comment => nil}]
|
42
|
+
@instance.set_canonical_hostname("1.2.3.4", "my.domain.local")
|
43
|
+
expect(@instance.parsed_file).to eq(expected_hash)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "adds the hostname to the start of the hosts list" do
|
47
|
+
expected_hash = [{:blank => true},
|
48
|
+
{:comment => "Some Comment"},
|
49
|
+
{:address => "127.0.0.1", :hosts => ["examplehost.example.com", "localhost", "localhost.localdomain"], :comment => "with a comment"},
|
50
|
+
{:address => "127.0.1.1", :hosts => ["my.domain.local"]}]
|
51
|
+
@instance.set_canonical_hostname("127.0.0.1", "examplehost.example.com")
|
52
|
+
expect(@instance.parsed_file).to eq(expected_hash)
|
38
53
|
end
|
54
|
+
end
|
39
55
|
|
56
|
+
describe "#save" do
|
40
57
|
it "properly generates file with new content" do
|
58
|
+
allow(File).to receive(:write)
|
41
59
|
expected_array = ["", "#Some Comment", "127.0.0.1 localhost localhost.localdomain #with a comment", "127.0.1.1 my.domain.local", "1.2.3.4 test"]
|
42
60
|
@instance.update_entry("1.2.3.4", "test")
|
43
61
|
@instance.save
|
@@ -45,11 +63,19 @@ describe LinuxAdmin::Hosts do
|
|
45
63
|
end
|
46
64
|
|
47
65
|
it "properly generates file with removed content" do
|
66
|
+
allow(File).to receive(:write)
|
48
67
|
expected_array = ["", "#Some Comment", "127.0.0.1 localhost localhost.localdomain my.domain.local #with a comment"]
|
49
68
|
@instance.update_entry("127.0.0.1", "my.domain.local")
|
50
69
|
@instance.save
|
51
70
|
expect(@instance.raw_lines).to eq(expected_array)
|
52
71
|
end
|
72
|
+
|
73
|
+
it "ends the file with a new line" do
|
74
|
+
expect(File).to receive(:write) do |_file, contents|
|
75
|
+
expect(contents).to end_with("\n")
|
76
|
+
end
|
77
|
+
@instance.save
|
78
|
+
end
|
53
79
|
end
|
54
80
|
|
55
81
|
describe "#hostname=" do
|
@@ -34,12 +34,14 @@ EOF
|
|
34
34
|
end
|
35
35
|
|
36
36
|
subject(:dhcp_interface) do
|
37
|
+
allow(File).to receive(:exist?).and_return(true)
|
37
38
|
stub_foreach_to_string(IFCFG_FILE_DHCP)
|
38
39
|
allow(AwesomeSpawn).to receive(:run!).twice.and_return(result("", 0))
|
39
40
|
described_class.new(DEVICE_NAME)
|
40
41
|
end
|
41
42
|
|
42
43
|
subject(:static_interface) do
|
44
|
+
allow(File).to receive(:exist?).and_return(true)
|
43
45
|
stub_foreach_to_string(IFCFG_FILE_STATIC)
|
44
46
|
allow(AwesomeSpawn).to receive(:run!).twice.and_return(result("", 0))
|
45
47
|
described_class.new(DEVICE_NAME)
|
@@ -1,13 +1,22 @@
|
|
1
1
|
describe LinuxAdmin::NetworkInterface do
|
2
2
|
context "on redhat systems" do
|
3
|
-
subject do
|
3
|
+
subject(:subj_success) do
|
4
4
|
allow_any_instance_of(described_class).to receive(:ip_show).and_return(nil)
|
5
5
|
allow(LinuxAdmin::Distros).to receive(:local).and_return(LinuxAdmin::Distros.rhel)
|
6
6
|
described_class.dist_class(true)
|
7
|
+
allow(File).to receive(:exist?).and_return(true)
|
7
8
|
allow(File).to receive(:foreach).and_return("")
|
8
9
|
described_class.new("eth0")
|
9
10
|
end
|
10
11
|
|
12
|
+
subject(:subj_failure) do
|
13
|
+
allow_any_instance_of(described_class).to receive(:ip_show).and_return(nil)
|
14
|
+
allow(LinuxAdmin::Distros).to receive(:local).and_return(LinuxAdmin::Distros.rhel)
|
15
|
+
described_class.dist_class(true)
|
16
|
+
allow(File).to receive(:exist?).and_return(false)
|
17
|
+
described_class.new("eth0")
|
18
|
+
end
|
19
|
+
|
11
20
|
describe ".dist_class" do
|
12
21
|
it "returns NetworkInterfaceRH" do
|
13
22
|
allow(LinuxAdmin::Distros).to receive(:local).and_return(LinuxAdmin::Distros.rhel)
|
@@ -17,7 +26,11 @@ describe LinuxAdmin::NetworkInterface do
|
|
17
26
|
|
18
27
|
describe ".new" do
|
19
28
|
it "creates a NetworkInterfaceRH instance" do
|
20
|
-
expect(
|
29
|
+
expect(subj_success).to be_an_instance_of(LinuxAdmin::NetworkInterfaceRH)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "creates a NetworkInterfaceGeneric instance if the config file does not exist" do
|
33
|
+
expect(subj_failure).to be_an_instance_of(LinuxAdmin::NetworkInterfaceGeneric)
|
21
34
|
end
|
22
35
|
end
|
23
36
|
end
|
@@ -78,6 +91,15 @@ describe LinuxAdmin::NetworkInterface do
|
|
78
91
|
valid_lft forever preferred_lft forever
|
79
92
|
IP_OUT
|
80
93
|
|
94
|
+
IP6_ADDR_OUT = <<-IP_OUT
|
95
|
+
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
|
96
|
+
link/ether 00:0c:29:ed:0e:8b brd ff:ff:ff:ff:ff:ff
|
97
|
+
inet6 fe80::20c:29ff:feed:e8b/64 scope link
|
98
|
+
valid_lft forever preferred_lft forever
|
99
|
+
inet6 fd12:3456:789a:1::1/96 scope global
|
100
|
+
valid_lft forever preferred_lft forever
|
101
|
+
IP_OUT
|
102
|
+
|
81
103
|
IP_ROUTE_OUT = <<-IP_OUT
|
82
104
|
default via 192.168.1.1 dev eth0 proto static metric 100
|
83
105
|
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.9 metric 100
|
@@ -92,6 +114,15 @@ IP_OUT
|
|
92
114
|
described_class.new("eth0")
|
93
115
|
end
|
94
116
|
|
117
|
+
subject(:subj6) do
|
118
|
+
allow(LinuxAdmin::Distros).to receive(:local).and_return(LinuxAdmin::Distros.generic)
|
119
|
+
described_class.dist_class(true)
|
120
|
+
|
121
|
+
allow(AwesomeSpawn).to receive(:run!).with(*IP_SHOW_ARGS).and_return(result(IP6_ADDR_OUT, 0))
|
122
|
+
allow(AwesomeSpawn).to receive(:run!).with(*IP_ROUTE_ARGS).and_return(result(IP_ROUTE_OUT, 0))
|
123
|
+
described_class.new("eth0")
|
124
|
+
end
|
125
|
+
|
95
126
|
def result(output, exit_status)
|
96
127
|
AwesomeSpawn::CommandResult.new("", output, "", exit_status)
|
97
128
|
end
|
@@ -111,6 +142,13 @@ IP_OUT
|
|
111
142
|
allow(AwesomeSpawn).to receive(:run!).with(*IP_ROUTE_ARGS).and_raise(awesome_error)
|
112
143
|
expect { subj.reload }.to raise_error(LinuxAdmin::NetworkInterfaceError)
|
113
144
|
end
|
145
|
+
|
146
|
+
it "doesn't blow up when given only ipv6 addresses" do
|
147
|
+
subj6
|
148
|
+
allow(AwesomeSpawn).to receive(:run!).with(*IP_SHOW_ARGS).and_return(result(IP6_ADDR_OUT, 0))
|
149
|
+
allow(AwesomeSpawn).to receive(:run!).with(*IP_ROUTE_ARGS).and_return(result(IP_ROUTE_OUT, 0))
|
150
|
+
expect { subj.reload }.to_not raise_error
|
151
|
+
end
|
114
152
|
end
|
115
153
|
|
116
154
|
describe "#address" do
|
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.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Dunne
|
@@ -14,7 +14,7 @@ authors:
|
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
|
-
date: 2015-
|
17
|
+
date: 2015-12-04 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: bundler
|
@@ -176,6 +176,7 @@ files:
|
|
176
176
|
- LICENSE.txt
|
177
177
|
- README.md
|
178
178
|
- lib/linux_admin.rb
|
179
|
+
- lib/linux_admin/chrony.rb
|
179
180
|
- lib/linux_admin/common.rb
|
180
181
|
- lib/linux_admin/deb.rb
|
181
182
|
- lib/linux_admin/disk.rb
|
@@ -211,6 +212,7 @@ files:
|
|
211
212
|
- lib/linux_admin/volume_group.rb
|
212
213
|
- lib/linux_admin/yum.rb
|
213
214
|
- lib/linux_admin/yum/repo_file.rb
|
215
|
+
- spec/chrony_spec.rb
|
214
216
|
- spec/common_spec.rb
|
215
217
|
- spec/data/rhn/output_rhn-channel_list
|
216
218
|
- spec/data/rhn/output_rhn-channel_list_available
|
@@ -283,6 +285,7 @@ signing_key:
|
|
283
285
|
specification_version: 4
|
284
286
|
summary: LinuxAdmin is a module to simplify management of linux systems.
|
285
287
|
test_files:
|
288
|
+
- spec/chrony_spec.rb
|
286
289
|
- spec/common_spec.rb
|
287
290
|
- spec/data/rhn/output_rhn-channel_list
|
288
291
|
- spec/data/rhn/output_rhn-channel_list_available
|