linux_admin 0.10.1 → 0.11.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 416f57382aba9378eb64a0b558478898d1d40e2f
4
- data.tar.gz: d4c70351176347b76844638bae4cc6c49dbad3b2
3
+ metadata.gz: 1c8a9566372578734f209b1cb4d7795bc8d911ff
4
+ data.tar.gz: 0d10059fc09b699b8b0debda74afb30592021353
5
5
  SHA512:
6
- metadata.gz: e3f345b3999366943ae185ce3a93a57664142b0213a37490fbeff23d650712fc28c29f64b761deba2eb3652548e461459773e6bfedb1ea393d049a595a15a5c9
7
- data.tar.gz: 97b4f388757fce7f406a4a5e3671aa034b347384c37958e3c22e9e307aa4cb649143079640fff88b5b0989819c085696b9a6c79ba6653d4a309909baf6c9fc28
6
+ metadata.gz: 063fcd55e7a1b6f1aa8d595b0a060ac642fc00766aba7a26ab398f5d87f9cc4e5adec38321ee5f5bf6c8e0adda73798bbdb0b4015f9c33fff988d533afc1fac5
7
+ data.tar.gz: 33dfa49d8909ed8a7c2a28db9ac4d314ef09f263d7f10c64e628ba792b59a76d4964002c8f7a4b58badefb659fc0c2cb980cb404a1825ae50af64890c690cf25
data/lib/linux_admin.rb CHANGED
@@ -27,6 +27,7 @@ require 'linux_admin/volume'
27
27
  require 'linux_admin/logical_volume'
28
28
  require 'linux_admin/physical_volume'
29
29
  require 'linux_admin/volume_group'
30
+ require 'linux_admin/scap'
30
31
 
31
32
  module LinuxAdmin
32
33
  extend Common
@@ -6,6 +6,10 @@ module LinuxAdmin
6
6
  Distros.local.command(cmd)
7
7
  end
8
8
 
9
+ def cmd?(cmd)
10
+ Distros.local.command?(cmd)
11
+ end
12
+
9
13
  def run(cmd, options = {})
10
14
  AwesomeSpawn.logger ||= logger
11
15
  AwesomeSpawn.run(cmd, options)
@@ -68,12 +68,12 @@ module LinuxAdmin
68
68
  @size ||= begin
69
69
  size = nil
70
70
  out = run!(cmd(:fdisk), :params => {"-l" => nil}).output
71
- out.each_line { |l|
72
- if l =~ /Disk #{path}: ([0-9\.]*) ([KMG])B.*/
73
- size = str_to_bytes($1, $2)
71
+ out.each_line do |l|
72
+ /Disk #{path}: .*B, (\d+) bytes/.match(l) do |m|
73
+ size = m[1].to_i
74
74
  break
75
75
  end
76
- }
76
+ end
77
77
  size
78
78
  end
79
79
  end
@@ -60,6 +60,10 @@ module LinuxAdmin
60
60
  @path.collect { |dir| "#{dir}/#{name}" }.detect { |cmd| File.exist?(cmd) }
61
61
  end
62
62
 
63
+ def command?(name)
64
+ !!command(name)
65
+ end
66
+
63
67
  def info(pkg)
64
68
  info_class ? info_class.info(pkg) : nil
65
69
  end
@@ -0,0 +1,104 @@
1
+ require 'nokogiri'
2
+
3
+ module LinuxAdmin
4
+ class Scap
5
+ PROFILE_ID = "linux-admin-scap"
6
+ SSG_XML_PATH = Pathname.new("/usr/share/xml/scap/ssg/content/")
7
+
8
+ def self.openscap_available?
9
+ require 'openscap'
10
+ true
11
+ rescue LoadError
12
+ false
13
+ end
14
+
15
+ def self.ssg_available?
16
+ xccdf_file && oval_file
17
+ end
18
+
19
+ def lockdown(*args)
20
+ raise "OpenSCAP not available" unless self.class.openscap_available?
21
+ raise "SCAP Security Guide not available" unless self.class.ssg_available?
22
+
23
+ values = args.last.kind_of?(Hash) ? args.pop : {}
24
+ rules = args
25
+
26
+ raise "No SCAP rules provided" if rules.empty?
27
+
28
+ with_xml_files(rules, values) do |xccdf_file_path|
29
+ lockdown_profile(xccdf_file_path, PROFILE_ID)
30
+ end
31
+ end
32
+
33
+ def lockdown_profile(xccdf_file_path, profile_id)
34
+ raise "OpenSCAP not available" unless self.class.openscap_available?
35
+
36
+ session = OpenSCAP::Xccdf::Session.new(xccdf_file_path)
37
+ session.load
38
+ session.profile = profile_id
39
+ session.evaluate
40
+ session.remediate
41
+ ensure
42
+ session.destroy if session
43
+ end
44
+
45
+ private
46
+
47
+ def self.xccdf_file
48
+ local_ssg_file("xccdf")
49
+ end
50
+
51
+ def self.oval_file
52
+ local_ssg_file("oval")
53
+ end
54
+
55
+ def self.local_ssg_file(type)
56
+ Dir.glob(SSG_XML_PATH.join("ssg-*-#{type}.xml")).detect { |f| f =~ /ssg-\w+-#{type}.xml/ }
57
+ end
58
+
59
+ def tempdir
60
+ @tempdir ||= Pathname.new(Dir.tmpdir)
61
+ end
62
+
63
+ def xccdf_file
64
+ @xccdf_file ||= self.class.xccdf_file
65
+ end
66
+
67
+ def oval_file
68
+ @oval_file ||= self.class.oval_file
69
+ end
70
+
71
+ def with_xml_files(rules, values)
72
+ FileUtils.cp(oval_file, tempdir)
73
+
74
+ Tempfile.create("scap_xccdf") do |f|
75
+ write_xccdf_xml(f, profile_xml(PROFILE_ID, rules, values))
76
+ f.close
77
+ yield f.path
78
+ end
79
+ ensure
80
+ FileUtils.rm_f(tempdir.join(File.basename(oval_file)))
81
+ end
82
+
83
+ def profile_xml(profile_id, rules, values)
84
+ builder = Nokogiri::XML::Builder.new do |xml|
85
+ xml.Profile(:id => profile_id) do
86
+ xml.title(profile_id)
87
+ xml.description(profile_id)
88
+ rules.each { |r| xml.select(:idref => r, :selected => "true") }
89
+ values.each { |k, v| xml.send("refine-value", :idref => k, :selector => v) }
90
+ end
91
+ end
92
+ builder.doc.root.to_xml
93
+ end
94
+
95
+ def write_xccdf_xml(io, profile_xml)
96
+ File.open(xccdf_file) do |f|
97
+ doc = Nokogiri::XML(f)
98
+ model = doc.at_css("model")
99
+ model.add_next_sibling("\n#{profile_xml}")
100
+ io.write(doc.root.to_xml)
101
+ end
102
+ end
103
+ end
104
+ end
@@ -1,62 +1,43 @@
1
- # LinuxAdmin Service Representation
2
- #
3
- # Copyright (C) 2013 Red Hat Inc.
4
- # Licensed under the MIT License
5
-
6
1
  module LinuxAdmin
7
2
  class Service
3
+ extend Common
8
4
  include Common
5
+ include Logging
9
6
 
10
- attr_accessor :id
11
- private
12
-
13
- public
14
-
15
- def initialize(id)
16
- @id = id
17
- end
18
-
19
- def running?
20
- run(cmd(:service),
21
- :params => { nil => [id, "status"] }).exit_status == 0
7
+ def self.service_type(reload = false)
8
+ return @service_type if @service_type && !reload
9
+ @service_type = service_type_uncached
22
10
  end
23
11
 
24
- def enable
25
- run!(cmd(:chkconfig),
26
- :params => { nil => [id, "on"] })
27
- self
12
+ class << self
13
+ private
14
+ alias_method :orig_new, :new
28
15
  end
29
16
 
30
- def disable
31
- run!(cmd(:chkconfig),
32
- :params => { nil => [id, "off"] })
33
- self
17
+ def self.new(*args)
18
+ if self == LinuxAdmin::Service
19
+ service_type.new(*args)
20
+ else
21
+ orig_new(*args)
22
+ end
34
23
  end
35
24
 
36
- def start
37
- run!(cmd(:service),
38
- :params => { nil => [id, "start"] })
39
- self
40
- end
25
+ attr_accessor :name
41
26
 
42
- def stop
43
- run!(cmd(:service),
44
- :params => { nil => [id, "stop"] })
45
- self
27
+ def initialize(name)
28
+ @name = name
46
29
  end
47
30
 
48
- def restart
49
- status =
50
- run(cmd(:service),
51
- :params => { nil => [id, "restart"] }).exit_status
31
+ alias_method :id, :name
32
+ alias_method :id=, :name=
52
33
 
53
- # attempt to manually stop/start if restart fails
54
- if status != 0
55
- self.stop
56
- self.start
57
- end
34
+ private
58
35
 
59
- self
36
+ def self.service_type_uncached
37
+ cmd?(:systemctl) ? SystemdService : SysVInitService
60
38
  end
39
+ private_class_method :service_type_uncached
61
40
  end
62
41
  end
42
+
43
+ Dir.glob(File.join(File.dirname(__FILE__), "service", "*.rb")).each { |f| require f }
@@ -0,0 +1,46 @@
1
+ module LinuxAdmin
2
+ class SysVInitService < Service
3
+ def running?
4
+ run(cmd(:service),
5
+ :params => { nil => [name, "status"] }).exit_status == 0
6
+ end
7
+
8
+ def enable
9
+ run!(cmd(:chkconfig),
10
+ :params => { nil => [name, "on"] })
11
+ self
12
+ end
13
+
14
+ def disable
15
+ run!(cmd(:chkconfig),
16
+ :params => { nil => [name, "off"] })
17
+ self
18
+ end
19
+
20
+ def start
21
+ run!(cmd(:service),
22
+ :params => { nil => [name, "start"] })
23
+ self
24
+ end
25
+
26
+ def stop
27
+ run!(cmd(:service),
28
+ :params => { nil => [name, "stop"] })
29
+ self
30
+ end
31
+
32
+ def restart
33
+ status =
34
+ run(cmd(:service),
35
+ :params => { nil => [name, "restart"] }).exit_status
36
+
37
+ # attempt to manually stop/start if restart fails
38
+ if status != 0
39
+ self.stop
40
+ self.start
41
+ end
42
+
43
+ self
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,46 @@
1
+ module LinuxAdmin
2
+ class SystemdService < Service
3
+ def running?
4
+ run(cmd(:systemctl),
5
+ :params => {nil => ["status", name]}).exit_status == 0
6
+ end
7
+
8
+ def enable
9
+ run!(cmd(:systemctl),
10
+ :params => {nil => ["enable", name]})
11
+ self
12
+ end
13
+
14
+ def disable
15
+ run!(cmd(:systemctl),
16
+ :params => {nil => ["disable", name]})
17
+ self
18
+ end
19
+
20
+ def start
21
+ run!(cmd(:systemctl),
22
+ :params => {nil => ["start", name]})
23
+ self
24
+ end
25
+
26
+ def stop
27
+ run!(cmd(:systemctl),
28
+ :params => {nil => ["stop", name]})
29
+ self
30
+ end
31
+
32
+ def restart
33
+ status =
34
+ run(cmd(:systemctl),
35
+ :params => {nil => ["restart", name]}).exit_status
36
+
37
+ # attempt to manually stop/start if restart fails
38
+ if status != 0
39
+ stop
40
+ start
41
+ end
42
+
43
+ self
44
+ end
45
+ end
46
+ end
@@ -1,3 +1,3 @@
1
1
  module LinuxAdmin
2
- VERSION = "0.10.1"
2
+ VERSION = "0.11.0"
3
3
  end
File without changes
File without changes
File without changes
data/spec/disk_spec.rb CHANGED
@@ -37,7 +37,7 @@ eos
37
37
 
38
38
  disk = LinuxAdmin::Disk.new :path => '/dev/hda'
39
39
  allow(disk).to receive(:run!).and_return(double(:output => fdisk))
40
- expect(disk.size).to eq(500.1.gigabytes)
40
+ expect(disk.size).to eq(500_107_862_016)
41
41
  end
42
42
  end
43
43
 
data/spec/scap_spec.rb ADDED
@@ -0,0 +1,61 @@
1
+ describe LinuxAdmin::Scap do
2
+ describe "#lockdown" do
3
+ it "raises if given no rules" do
4
+ stub_const("LinuxAdmin::Scap::SSG_XML_PATH", Pathname.new(data_file_path("scap")))
5
+ scap = described_class.new
6
+ allow(described_class).to receive(:openscap_available?).and_return(true)
7
+ allow(described_class).to receive(:ssg_available?).and_return(true)
8
+ allow(scap).to receive(:lockdown_profile)
9
+ expect { scap.lockdown("value1" => true) }.to raise_error
10
+ end
11
+ end
12
+
13
+ describe "#profile_xml (private)" do
14
+ it "creates a Profile tag" do
15
+ profile_xml = described_class.new.send(:profile_xml, "test-profile", [], {})
16
+ expect(profile_xml).to match(%r{<Profile id="test-profile">.*</Profile>}m)
17
+ end
18
+
19
+ it "creates a title tag" do
20
+ profile_xml = described_class.new.send(:profile_xml, "test-profile", [], {})
21
+ expect(profile_xml).to match(%r{<title>test-profile</title>}m)
22
+ end
23
+
24
+ it "creates a description tag" do
25
+ profile_xml = described_class.new.send(:profile_xml, "test-profile", [], {})
26
+ expect(profile_xml).to match(%r{<description>test-profile</description>}m)
27
+ end
28
+
29
+ it "creates a select tag for each rule" do
30
+ profile_xml = described_class.new.send(:profile_xml, "test-profile", %w(rule1 rule2), {})
31
+ expect(profile_xml).to match(%r{<select idref="rule1" selected="true"/>}m)
32
+ expect(profile_xml).to match(%r{<select idref="rule2" selected="true"/>}m)
33
+ end
34
+
35
+ it "creates a refine-value tag for each value" do
36
+ profile_xml = described_class.new.send(:profile_xml, "test-profile", [], "key1" => "val1", "key2" => "val2")
37
+ expect(profile_xml).to match(%r{<refine-value idref="key1" selector="val1"/>}m)
38
+ expect(profile_xml).to match(%r{<refine-value idref="key2" selector="val2"/>}m)
39
+ end
40
+ end
41
+
42
+ describe ".local_ssg_file (private)" do
43
+ it "returns nil if the file doesn't exist" do
44
+ stub_const("LinuxAdmin::Scap::SSG_XML_PATH", Pathname.new("/doesnt/exist/"))
45
+ file = described_class.send(:local_ssg_file, "type")
46
+ expect(file).to be_nil
47
+ end
48
+
49
+ it "returns a file if there are multiple matches" do
50
+ stub_const("LinuxAdmin::Scap::SSG_XML_PATH", Pathname.new(data_file_path("scap")))
51
+ file = described_class.send(:local_ssg_file, "xccdf")
52
+ expect(file).to match(%r{.*/ssg-\w+-xccdf\.xml})
53
+ end
54
+
55
+ it "returns a matching file" do
56
+ stub_const("LinuxAdmin::Scap::SSG_XML_PATH", Pathname.new(data_file_path("scap")))
57
+ file = described_class.send(:local_ssg_file, "oval")
58
+ expect(file).to eq("#{data_file_path("scap")}/ssg-rhel7-oval.xml")
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,110 @@
1
+ describe LinuxAdmin::SysVInitService do
2
+ before do
3
+ @service = described_class.new 'foo'
4
+ end
5
+
6
+ describe "#running?" do
7
+ it "checks service" do
8
+ expect(@service).to receive(:run).
9
+ with(@service.cmd(:service),
10
+ :params => { nil => ['foo', 'status']}).and_return(double(:exit_status => 0))
11
+ @service.running?
12
+ end
13
+
14
+ context "service is running" do
15
+ it "returns true" do
16
+ @service = described_class.new :id => :foo
17
+ expect(@service).to receive(:run).and_return(double(:exit_status => 0))
18
+ expect(@service).to be_running
19
+ end
20
+ end
21
+
22
+ context "service is not running" do
23
+ it "returns false" do
24
+ @service = described_class.new :id => :foo
25
+ expect(@service).to receive(:run).and_return(double(:exit_status => 1))
26
+ expect(@service).not_to be_running
27
+ end
28
+ end
29
+ end
30
+
31
+ describe "#enable" do
32
+ it "enables service" do
33
+ expect(@service).to receive(:run!).
34
+ with(@service.cmd(:chkconfig),
35
+ :params => { nil => [ 'foo', 'on']})
36
+ @service.enable
37
+ end
38
+
39
+ it "returns self" do
40
+ expect(@service).to receive(:run!) # stub out cmd invocation
41
+ expect(@service.enable).to eq(@service)
42
+ end
43
+ end
44
+
45
+ describe "#disable" do
46
+ it "disable service" do
47
+ expect(@service).to receive(:run!).
48
+ with(@service.cmd(:chkconfig),
49
+ :params => { nil => [ 'foo', 'off']})
50
+ @service.disable
51
+ end
52
+
53
+ it "returns self" do
54
+ expect(@service).to receive(:run!)
55
+ expect(@service.disable).to eq(@service)
56
+ end
57
+ end
58
+
59
+ describe "#start" do
60
+ it "starts service" do
61
+ expect(@service).to receive(:run!).
62
+ with(@service.cmd(:service),
63
+ :params => { nil => [ 'foo', 'start']})
64
+ @service.start
65
+ end
66
+
67
+ it "returns self" do
68
+ expect(@service).to receive(:run!)
69
+ expect(@service.start).to eq(@service)
70
+ end
71
+ end
72
+
73
+ describe "#stop" do
74
+ it "stops service" do
75
+ expect(@service).to receive(:run!).
76
+ with(@service.cmd(:service),
77
+ :params => { nil => [ 'foo', 'stop']})
78
+ @service.stop
79
+ end
80
+
81
+ it "returns self" do
82
+ expect(@service).to receive(:run!)
83
+ expect(@service.stop).to eq(@service)
84
+ end
85
+ end
86
+
87
+ describe "#restart" do
88
+ it "stops service" do
89
+ expect(@service).to receive(:run).
90
+ with(@service.cmd(:service),
91
+ :params => { nil => [ 'foo', 'restart']}).and_return(double(:exit_status => 0))
92
+ @service.restart
93
+ end
94
+
95
+ context "service restart fails" do
96
+ it "manually stops/starts service" do
97
+ expect(@service).to receive(:run).and_return(double(:exit_status => 1))
98
+ expect(@service).to receive(:stop)
99
+ expect(@service).to receive(:start)
100
+ @service.restart
101
+ end
102
+ end
103
+
104
+ it "returns self" do
105
+ expect(@service).to receive(:run).and_return(double(:exit_status => 0))
106
+ expect(@service.restart).to eq(@service)
107
+ end
108
+ end
109
+
110
+ end
@@ -0,0 +1,101 @@
1
+ describe LinuxAdmin::SystemdService do
2
+ before do
3
+ @service = described_class.new 'foo'
4
+ end
5
+
6
+ describe "#running?" do
7
+ it "checks service" do
8
+ expect(@service).to receive(:run)
9
+ .with(@service.cmd(:systemctl),
10
+ :params => {nil => %w(status foo)}).and_return(double(:exit_status => 0))
11
+ @service.running?
12
+ end
13
+
14
+ it "returns true when service is running" do
15
+ expect(@service).to receive(:run).and_return(double(:exit_status => 0))
16
+ expect(@service).to be_running
17
+ end
18
+
19
+ it "returns false when service is not running" do
20
+ expect(@service).to receive(:run).and_return(double(:exit_status => 1))
21
+ expect(@service).not_to be_running
22
+ end
23
+ end
24
+
25
+ describe "#enable" do
26
+ it "enables service" do
27
+ expect(@service).to receive(:run!)
28
+ .with(@service.cmd(:systemctl),
29
+ :params => {nil => %w(enable foo)})
30
+ @service.enable
31
+ end
32
+
33
+ it "returns self" do
34
+ expect(@service).to receive(:run!) # stub out cmd invocation
35
+ expect(@service.enable).to eq(@service)
36
+ end
37
+ end
38
+
39
+ describe "#disable" do
40
+ it "disables service" do
41
+ expect(@service).to receive(:run!)
42
+ .with(@service.cmd(:systemctl),
43
+ :params => {nil => %w(disable foo)})
44
+ @service.disable
45
+ end
46
+
47
+ it "returns self" do
48
+ expect(@service).to receive(:run!)
49
+ expect(@service.disable).to eq(@service)
50
+ end
51
+ end
52
+
53
+ describe "#start" do
54
+ it "starts service" do
55
+ expect(@service).to receive(:run!)
56
+ .with(@service.cmd(:systemctl),
57
+ :params => {nil => %w(start foo)})
58
+ @service.start
59
+ end
60
+
61
+ it "returns self" do
62
+ expect(@service).to receive(:run!)
63
+ expect(@service.start).to eq(@service)
64
+ end
65
+ end
66
+
67
+ describe "#stop" do
68
+ it "stops service" do
69
+ expect(@service).to receive(:run!)
70
+ .with(@service.cmd(:systemctl),
71
+ :params => {nil => %w(stop foo)})
72
+ @service.stop
73
+ end
74
+
75
+ it "returns self" do
76
+ expect(@service).to receive(:run!)
77
+ expect(@service.stop).to eq(@service)
78
+ end
79
+ end
80
+
81
+ describe "#restart" do
82
+ it "restarts service" do
83
+ expect(@service).to receive(:run)
84
+ .with(@service.cmd(:systemctl),
85
+ :params => {nil => %w(restart foo)}).and_return(double(:exit_status => 0))
86
+ @service.restart
87
+ end
88
+
89
+ it "manually stops then starts service when restart fails" do
90
+ expect(@service).to receive(:run).and_return(double(:exit_status => 1))
91
+ expect(@service).to receive(:stop)
92
+ expect(@service).to receive(:start)
93
+ @service.restart
94
+ end
95
+
96
+ it "returns self" do
97
+ expect(@service).to receive(:run).and_return(double(:exit_status => 0))
98
+ expect(@service.restart).to eq(@service)
99
+ end
100
+ end
101
+ end
data/spec/service_spec.rb CHANGED
@@ -1,110 +1,54 @@
1
1
  describe LinuxAdmin::Service do
2
- before(:each) do
3
- @service = LinuxAdmin::Service.new 'foo'
4
- end
5
-
6
- describe "#running?" do
7
- it "checks service" do
8
- expect(@service).to receive(:run).
9
- with(@service.cmd(:service),
10
- :params => { nil => ['foo', 'status']}).and_return(double(:exit_status => 0))
11
- @service.running?
2
+ context ".service_type" do
3
+ it "on systemctl systems" do
4
+ stub_to_service_type(:systemd_service)
5
+ expect(described_class.service_type).to eq(LinuxAdmin::SystemdService)
12
6
  end
13
7
 
14
- context "service is running" do
15
- it "returns true" do
16
- @service = LinuxAdmin::Service.new :id => :foo
17
- expect(@service).to receive(:run).and_return(double(:exit_status => 0))
18
- expect(@service).to be_running
19
- end
8
+ it "on sysv systems" do
9
+ stub_to_service_type(:sys_v_init_service)
10
+ expect(described_class.service_type).to eq(LinuxAdmin::SysVInitService)
20
11
  end
21
12
 
22
- context "service is not running" do
23
- it "returns false" do
24
- @service = LinuxAdmin::Service.new :id => :foo
25
- expect(@service).to receive(:run).and_return(double(:exit_status => 1))
26
- expect(@service).not_to be_running
27
- end
28
- end
29
- end
30
-
31
- describe "#enable" do
32
- it "enables service" do
33
- expect(@service).to receive(:run!).
34
- with(@service.cmd(:chkconfig),
35
- :params => { nil => [ 'foo', 'on']})
36
- @service.enable
13
+ it "should memoize results" do
14
+ expect(described_class).to receive(:service_type_uncached).once.and_return("anything_non_nil")
15
+ described_class.service_type
16
+ described_class.service_type
37
17
  end
38
18
 
39
- it "returns self" do
40
- expect(@service).to receive(:run!) # stub out cmd invocation
41
- expect(@service.enable).to eq(@service)
19
+ it "with reload should refresh results" do
20
+ expect(described_class).to receive(:service_type_uncached).twice.and_return("anything_non_nil")
21
+ described_class.service_type
22
+ described_class.service_type(true)
42
23
  end
43
24
  end
44
25
 
45
- describe "#disable" do
46
- it "disable service" do
47
- expect(@service).to receive(:run!).
48
- with(@service.cmd(:chkconfig),
49
- :params => { nil => [ 'foo', 'off']})
50
- @service.disable
26
+ context ".new" do
27
+ it "on systemctl systems" do
28
+ stub_to_service_type(:systemd_service)
29
+ expect(described_class.new("xxx")).to be_kind_of(LinuxAdmin::SystemdService)
51
30
  end
52
31
 
53
- it "returns self" do
54
- expect(@service).to receive(:run!)
55
- expect(@service.disable).to eq(@service)
32
+ it "on sysv systems" do
33
+ stub_to_service_type(:sys_v_init_service)
34
+ expect(described_class.new("xxx")).to be_kind_of(LinuxAdmin::SysVInitService)
56
35
  end
57
36
  end
58
37
 
59
- describe "#start" do
60
- it "starts service" do
61
- expect(@service).to receive(:run!).
62
- with(@service.cmd(:service),
63
- :params => { nil => [ 'foo', 'start']})
64
- @service.start
65
- end
38
+ it "#id / #id=" do
39
+ s = described_class.new("xxx")
40
+ expect(s.id).to eq("xxx")
66
41
 
67
- it "returns self" do
68
- expect(@service).to receive(:run!)
69
- expect(@service.start).to eq(@service)
70
- end
71
- end
42
+ s.id = "yyy"
43
+ expect(s.id).to eq("yyy")
44
+ expect(s.name).to eq("yyy")
72
45
 
73
- describe "#stop" do
74
- it "stops service" do
75
- expect(@service).to receive(:run!).
76
- with(@service.cmd(:service),
77
- :params => { nil => [ 'foo', 'stop']})
78
- @service.stop
79
- end
80
-
81
- it "returns self" do
82
- expect(@service).to receive(:run!)
83
- expect(@service.stop).to eq(@service)
84
- end
46
+ s.name = "zzz"
47
+ expect(s.id).to eq("zzz")
48
+ expect(s.name).to eq("zzz")
85
49
  end
86
50
 
87
- describe "#restart" do
88
- it "stops service" do
89
- expect(@service).to receive(:run).
90
- with(@service.cmd(:service),
91
- :params => { nil => [ 'foo', 'restart']}).and_return(double(:exit_status => 0))
92
- @service.restart
93
- end
94
-
95
- context "service restart fails" do
96
- it "manually stops/starts service" do
97
- expect(@service).to receive(:run).and_return(double(:exit_status => 1))
98
- expect(@service).to receive(:stop)
99
- expect(@service).to receive(:start)
100
- @service.restart
101
- end
102
- end
103
-
104
- it "returns self" do
105
- expect(@service).to receive(:run).and_return(double(:exit_status => 0))
106
- expect(@service.restart).to eq(@service)
107
- end
51
+ def stub_to_service_type(system)
52
+ allow(LinuxAdmin::Service).to receive(:cmd?).with(:systemctl).and_return(system == :systemd_service)
108
53
  end
109
-
110
54
  end
data/spec/spec_helper.rb CHANGED
@@ -109,6 +109,7 @@ end
109
109
 
110
110
  def clear_caches
111
111
  LinuxAdmin::RegistrationSystem.instance_variable_set(:@registration_type, nil)
112
+ LinuxAdmin::Service.instance_variable_set(:@service_type, nil)
112
113
 
113
114
  # reset the distro, tested in various placed & used extensively
114
115
  LinuxAdmin::Distros.instance_variable_set(:@local, nil)
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.10.1
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Dunne
@@ -10,135 +10,150 @@ authors:
10
10
  - Joe Rafaniello
11
11
  - Keenan Brock
12
12
  - Thomas Wiest
13
+ - Nick Carboni
13
14
  autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
- date: 2015-05-04 00:00:00.000000000 Z
17
+ date: 2015-08-12 00:00:00.000000000 Z
17
18
  dependencies:
18
19
  - !ruby/object:Gem::Dependency
19
20
  name: bundler
20
21
  requirement: !ruby/object:Gem::Requirement
21
22
  requirements:
22
- - - ~>
23
+ - - "~>"
23
24
  - !ruby/object:Gem::Version
24
25
  version: '1.3'
25
26
  type: :development
26
27
  prerelease: false
27
28
  version_requirements: !ruby/object:Gem::Requirement
28
29
  requirements:
29
- - - ~>
30
+ - - "~>"
30
31
  - !ruby/object:Gem::Version
31
32
  version: '1.3'
32
33
  - !ruby/object:Gem::Dependency
33
34
  name: rake
34
35
  requirement: !ruby/object:Gem::Requirement
35
36
  requirements:
36
- - - '>='
37
+ - - ">="
37
38
  - !ruby/object:Gem::Version
38
39
  version: '0'
39
40
  type: :development
40
41
  prerelease: false
41
42
  version_requirements: !ruby/object:Gem::Requirement
42
43
  requirements:
43
- - - '>='
44
+ - - ">="
44
45
  - !ruby/object:Gem::Version
45
46
  version: '0'
46
47
  - !ruby/object:Gem::Dependency
47
48
  name: rspec
48
49
  requirement: !ruby/object:Gem::Requirement
49
50
  requirements:
50
- - - ~>
51
+ - - "~>"
51
52
  - !ruby/object:Gem::Version
52
53
  version: '3.0'
53
54
  type: :development
54
55
  prerelease: false
55
56
  version_requirements: !ruby/object:Gem::Requirement
56
57
  requirements:
57
- - - ~>
58
+ - - "~>"
58
59
  - !ruby/object:Gem::Version
59
60
  version: '3.0'
60
61
  - !ruby/object:Gem::Dependency
61
62
  name: coveralls
62
63
  requirement: !ruby/object:Gem::Requirement
63
64
  requirements:
64
- - - '>='
65
+ - - ">="
65
66
  - !ruby/object:Gem::Version
66
67
  version: '0'
67
68
  type: :development
68
69
  prerelease: false
69
70
  version_requirements: !ruby/object:Gem::Requirement
70
71
  requirements:
71
- - - '>='
72
+ - - ">="
72
73
  - !ruby/object:Gem::Version
73
74
  version: '0'
74
75
  - !ruby/object:Gem::Dependency
75
76
  name: activesupport
76
77
  requirement: !ruby/object:Gem::Requirement
77
78
  requirements:
78
- - - '>'
79
+ - - ">"
79
80
  - !ruby/object:Gem::Version
80
81
  version: '3.2'
81
82
  type: :runtime
82
83
  prerelease: false
83
84
  version_requirements: !ruby/object:Gem::Requirement
84
85
  requirements:
85
- - - '>'
86
+ - - ">"
86
87
  - !ruby/object:Gem::Version
87
88
  version: '3.2'
88
89
  - !ruby/object:Gem::Dependency
89
90
  name: inifile
90
91
  requirement: !ruby/object:Gem::Requirement
91
92
  requirements:
92
- - - '>='
93
+ - - ">="
93
94
  - !ruby/object:Gem::Version
94
95
  version: '0'
95
96
  type: :runtime
96
97
  prerelease: false
97
98
  version_requirements: !ruby/object:Gem::Requirement
98
99
  requirements:
99
- - - '>='
100
+ - - ">="
100
101
  - !ruby/object:Gem::Version
101
102
  version: '0'
102
103
  - !ruby/object:Gem::Dependency
103
104
  name: more_core_extensions
104
105
  requirement: !ruby/object:Gem::Requirement
105
106
  requirements:
106
- - - ~>
107
+ - - "~>"
107
108
  - !ruby/object:Gem::Version
108
109
  version: '1.1'
109
110
  type: :runtime
110
111
  prerelease: false
111
112
  version_requirements: !ruby/object:Gem::Requirement
112
113
  requirements:
113
- - - ~>
114
+ - - "~>"
114
115
  - !ruby/object:Gem::Version
115
116
  version: '1.1'
116
117
  - !ruby/object:Gem::Dependency
117
118
  name: awesome_spawn
118
119
  requirement: !ruby/object:Gem::Requirement
119
120
  requirements:
120
- - - ~>
121
+ - - "~>"
121
122
  - !ruby/object:Gem::Version
122
123
  version: '1.3'
123
124
  type: :runtime
124
125
  prerelease: false
125
126
  version_requirements: !ruby/object:Gem::Requirement
126
127
  requirements:
127
- - - ~>
128
+ - - "~>"
128
129
  - !ruby/object:Gem::Version
129
130
  version: '1.3'
130
131
  - !ruby/object:Gem::Dependency
131
132
  name: nokogiri
132
133
  requirement: !ruby/object:Gem::Requirement
133
134
  requirements:
134
- - - '>='
135
+ - - ">="
135
136
  - !ruby/object:Gem::Version
136
137
  version: '0'
137
138
  type: :runtime
138
139
  prerelease: false
139
140
  version_requirements: !ruby/object:Gem::Requirement
140
141
  requirements:
141
- - - '>='
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: openscap
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :runtime
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
142
157
  - !ruby/object:Gem::Version
143
158
  version: '0'
144
159
  description: |2
@@ -153,10 +168,13 @@ email:
153
168
  - jrafanie@redhat.com
154
169
  - kbrock@redhat.com
155
170
  - twiest@redhat.com
171
+ - ncarboni@redhat.com
156
172
  executables: []
157
173
  extensions: []
158
174
  extra_rdoc_files: []
159
175
  files:
176
+ - LICENSE.txt
177
+ - README.md
160
178
  - lib/linux_admin.rb
161
179
  - lib/linux_admin/common.rb
162
180
  - lib/linux_admin/deb.rb
@@ -177,21 +195,25 @@ files:
177
195
  - lib/linux_admin/registration_system/rhn.rb
178
196
  - lib/linux_admin/registration_system/subscription_manager.rb
179
197
  - lib/linux_admin/rpm.rb
198
+ - lib/linux_admin/scap.rb
180
199
  - lib/linux_admin/service.rb
200
+ - lib/linux_admin/service/sys_v_init_service.rb
201
+ - lib/linux_admin/service/systemd_service.rb
181
202
  - lib/linux_admin/system.rb
182
203
  - lib/linux_admin/version.rb
183
204
  - lib/linux_admin/volume.rb
184
205
  - lib/linux_admin/volume_group.rb
185
206
  - lib/linux_admin/yum.rb
186
207
  - lib/linux_admin/yum/repo_file.rb
187
- - README.md
188
- - LICENSE.txt
189
208
  - spec/common_spec.rb
190
209
  - spec/data/rhn/output_rhn-channel_list
191
210
  - spec/data/rhn/output_rhn-channel_list_available
192
211
  - spec/data/rhn/systemid
193
212
  - spec/data/rhn/systemid.missing_system_id
194
213
  - spec/data/rpm/cmd_output_for_list_installed
214
+ - spec/data/scap/ssg-rhel6-xccdf.xml
215
+ - spec/data/scap/ssg-rhel7-oval.xml
216
+ - spec/data/scap/ssg-rhel7-xccdf.xml
195
217
  - spec/data/subscription_manager/output_list_all_available
196
218
  - spec/data/subscription_manager/output_list_installed_not_subscribed
197
219
  - spec/data/subscription_manager/output_list_installed_subscribed
@@ -215,6 +237,9 @@ files:
215
237
  - spec/registration_system_spec.rb
216
238
  - spec/rhn_spec.rb
217
239
  - spec/rpm_spec.rb
240
+ - spec/scap_spec.rb
241
+ - spec/service/sys_v_init_service_spec.rb
242
+ - spec/service/systemd_service_spec.rb
218
243
  - spec/service_spec.rb
219
244
  - spec/spec_helper.rb
220
245
  - spec/subscription_manager_spec.rb
@@ -231,17 +256,17 @@ require_paths:
231
256
  - lib
232
257
  required_ruby_version: !ruby/object:Gem::Requirement
233
258
  requirements:
234
- - - '>='
259
+ - - ">="
235
260
  - !ruby/object:Gem::Version
236
261
  version: 1.9.3
237
262
  required_rubygems_version: !ruby/object:Gem::Requirement
238
263
  requirements:
239
- - - '>='
264
+ - - ">="
240
265
  - !ruby/object:Gem::Version
241
266
  version: '0'
242
267
  requirements: []
243
268
  rubyforge_project:
244
- rubygems_version: 2.0.14
269
+ rubygems_version: 2.4.8
245
270
  signing_key:
246
271
  specification_version: 4
247
272
  summary: LinuxAdmin is a module to simplify management of linux systems.
@@ -252,6 +277,9 @@ test_files:
252
277
  - spec/data/rhn/systemid
253
278
  - spec/data/rhn/systemid.missing_system_id
254
279
  - spec/data/rpm/cmd_output_for_list_installed
280
+ - spec/data/scap/ssg-rhel6-xccdf.xml
281
+ - spec/data/scap/ssg-rhel7-oval.xml
282
+ - spec/data/scap/ssg-rhel7-xccdf.xml
255
283
  - spec/data/subscription_manager/output_list_all_available
256
284
  - spec/data/subscription_manager/output_list_installed_not_subscribed
257
285
  - spec/data/subscription_manager/output_list_installed_subscribed
@@ -275,6 +303,9 @@ test_files:
275
303
  - spec/registration_system_spec.rb
276
304
  - spec/rhn_spec.rb
277
305
  - spec/rpm_spec.rb
306
+ - spec/scap_spec.rb
307
+ - spec/service/sys_v_init_service_spec.rb
308
+ - spec/service/systemd_service_spec.rb
278
309
  - spec/service_spec.rb
279
310
  - spec/spec_helper.rb
280
311
  - spec/subscription_manager_spec.rb