Skip to content

Commit

Permalink
Extend SystemdService API
Browse files Browse the repository at this point in the history
  • Loading branch information
imobachgs committed Jun 29, 2018
1 parent 81d1fb2 commit b3eb10f
Show file tree
Hide file tree
Showing 3 changed files with 269 additions and 1 deletion.
98 changes: 98 additions & 0 deletions library/systemd/src/modules/systemd_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,106 @@ def socket
Yast::SystemdSocket.find(socket_name)
end

alias_method :enable_service, :enable
private :enable_service

# Enable a service
#
# @param mode [Symbol] Start mode (:boot or :demand).
# @return [Boolean] true if the service was successfully enabled; false otherwise.
def enable
self.start_mode = :boot
end

alias_method :disable_service, :disable
private :disable_service

# Disable a service
#
# If the service has an associated socket, it is disabled too.
#
# @return [Boolean] true if the service was successfully disabled; false otherwise.
def disable
self.start_mode = :manual
end

alias_method :enabled_on_boot?, :enabled?
private :enabled_on_boot?

# Determine whether the service is enabled or not
#
# The service can be enable to be started on boot or on demand.
#
# @return [Boolean] true if the service is enabled; false otherwise.
def enabled?
start_mode != :manual
end

# Determine whether the service has an associated socket
#
# @return [Boolean] true if an associated socket exists; false otherwise.
def socket?
!socket.nil?
end

# Return the start mode
#
# @return [Symbol] Start mode (:boot, :demand, :manual)
def start_mode
return :boot if enabled_on_boot?
return :demand if enabled_on_demand?
:manual
end

# Set the service start mode
#
# See {#start_modes} to find out the supported modes for a given service (usually :boot,
# :manual and, in some cases, :demand).
#
# @see #start_modes
def start_mode=(mode)
if !start_modes.include?(mode)
log.warn "Invalid start mode: '#{mode}' for service '#{name}'"
return
end

case mode
when :boot
enable_service
socket.disable
when :demand
disable_service
socket.enable
when :manual
disable_service
socket.disable
end
end

# Return the list of supported start modes
#
# * :boot: The service will be started when the system boots.
# * :manual: The service is disabled and it will be started manually.
# * :demand: The service will be started on demand (using a Systemd socket).
#
# @return [Array<Symbol>] List of supported modes.
def start_modes
return @start_modes if @start_modes
@start_modes = [:boot, :manual]
@start_modes.insert(1, :demand) if socket?
@start_modes
end

private

# Determine whether the service is enabled on demand
#
# @return [Boolean] true if it is enabled on demand; false otherwise.
def enabled_on_demand?
return false unless socket
socket.enabled?
end

def installation_system?
File.exist?(START_SERVICE_INSTSYS_COMMAND)
end
Expand Down
170 changes: 170 additions & 0 deletions library/systemd/test/systemd_service_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,176 @@ module Yast
end
end

describe "#enabled?" do
subject(:service) { SystemdService.find("cups") }

before do
allow(service).to receive(:start_mode).and_return(start_mode)
stub_services(service: "cups")
end

context "when the start mode is :boot" do
let(:start_mode) { :boot }

it "returns true" do
expect(service).to be_enabled
end
end

context "when the start mode is :demand" do
let(:start_mode) { :demand }

it "returns true" do
expect(service).to be_enabled
end
end

context "when the start mode is :manual" do
let(:start_mode) { :manual }

it "returns false" do
expect(service).to_not be_enabled
end
end
end

describe "#start_mode" do
let(:enabled_on_boot?) { true }
let(:socket) { double("socket", enabled?: true) }

subject(:service) { SystemdService.find("cups") }

before do
stub_services(service: "cups")
allow(service).to receive(:socket).and_return(socket)
allow(service).to receive(:enabled_on_boot?).and_return(enabled_on_boot?)
end

context "when the service is enabled" do
it "returns :boot" do
expect(service.start_mode).to eq(:boot)
end
end

context "when the service is disabled" do
let(:enabled_on_boot?) { false }

context "but the associated socket is enabled" do
it "returns :demand" do
expect(service.start_mode).to eq(:demand)
end
end

context "and the socket is disabled" do
let(:socket) { double("socket", enabled?: false) }

it "returns :manual" do
expect(service.start_mode).to eq(:manual)
end
end

context "and there is no socket" do
let(:socket) { nil }

it "returns :manual" do
expect(service.start_mode).to eq(:manual)
end
end
end
end

describe "#start_mode=" do
subject(:service) { SystemdService.find("cups") }
let(:socket) { double("socket", disable: true) }

before do
stub_services(service: "cups")
allow(service).to receive(:socket).and_return(socket)
allow(service).to receive(:disable)
end

context "when no argument is given" do
it "enables the service to start on boot" do
expect(socket).to_not receive(:enable)
service.start_mode = :boot
end
end

context "when :boot mode is given" do
it "enables the service to start on boot" do
expect(service).to receive(:enable_service)
expect(socket).to_not receive(:enable)
service.start_mode = :boot
end
end

context "when :demand mode is given" do
it "enables the socket" do
expect(service).to_not receive(:enable_service)
expect(socket).to receive(:enable)
service.start_mode = :demand
end
end

context "when :manual mode is given" do
it "disables the service and the socket" do
expect(service).to receive(:disable_service)
expect(socket).to receive(:disable)
service.start_mode = :manual
end
end
end

describe "#enable" do
subject(:service) { SystemdService.find("cups") }

before do
stub_services(service: "cups")
end

it "sets start_mode to :boot" do
expect(service).to receive(:start_mode=).with(:boot)
service.enable
end
end

describe "#disable" do
subject(:service) { SystemdService.find("cups") }

before do
stub_services(service: "cups")
end

it "sets start_mode to :manual" do
expect(service).to receive(:start_mode=).with(:manual)
service.disable
end
end

describe "#socket?" do
subject(:service) { SystemdService.find("cups") }

before do
allow(service).to receive(:socket).and_return(socket)
end

context "when there is an associated socket" do
let(:socket) { double("socket") }

it "returns true" do
expect(service.socket?).to eq(true)
end
end

context "when there is no associated socket" do
let(:socket) { nil }

it "returns false" do
expect(service.socket?).to eq(false)
end
end
end

context "Start a service on the installation system" do
it "starts a service with a specialized inst-sys helper if available" do
allow(File).to receive(:exist?).with("/bin/service_start").and_return(true)
Expand Down
2 changes: 1 addition & 1 deletion package/yast2.spec
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@


Name: yast2
Version: 4.0.77
Version: 4.0.78
Release: 0
Summary: YaST2 - Main Package
License: GPL-2.0-only
Expand Down

0 comments on commit b3eb10f

Please sign in to comment.