Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 8 additions & 20 deletions lib/puppet/provider/loginctl_user/ruby.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,30 +5,18 @@
# @see https://wiki.archlinux.org/title/Systemd/User
Puppet::Type.type(:loginctl_user).provide(:ruby) do
desc 'custom provider to manage systemd user sessions/linger'
commands loginctl: 'loginctl'

def self.instances
users = loginctl('list-users', '--no-legend').split("\n").map { |l| l.split[1] }
loginctl('show-user', '-p', 'Name', '-p', 'Linger', *users).split("\n\n").map do |u|
user = u.split("\n").to_h { |f| f.split('=') }
linger = if user['Linger'] == 'yes'
'enabled'
else
'disabled'
end
new(name: user['Name'],
linger: linger)
end
end
commands loginctl: 'loginctl'

def self.prefetch(resources)
instances.each do |prov|
resources[prov.name].provider = prov if resources[prov.name]
end
def linger
# loginctl is only successful if the user has an active session (so either logged in or lingering
# so if loginctl fails, linger is definitly disabled, for users with an active session
# (eg. logged in or running a timer or ...), the Linger property displays if lingering is activated.
:enabled if loginctl('show-user', resource[:name], '--property=Linger', '--value').chomp == 'yes'
rescue Puppet::ExecutionFailure
:disabled
end

mk_resource_methods

def linger=(value)
case value
when :enabled
Expand Down
14 changes: 0 additions & 14 deletions spec/unit/puppet/provider/loginctl_user/ruby_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,6 @@
}
end

context 'when listing instances' do
it 'finds all entries' do
allow(provider_class).to receive(:loginctl).
with('list-users', '--no-legend').
and_return("0 root\n42 foo\n314 bar\n")
allow(provider_class).to receive(:loginctl).
with('show-user', '-p', 'Name', '-p', 'Linger', 'root', 'foo', 'bar').
and_return("Name=root\nLinger=no\n\nName=foo\nLinger=yes\n\nName=bar\nLinger=no\n")
inst = provider_class.instances.map!

expect(inst.size).to eq(3)
end
end

it 'enables linger' do
resource = Puppet::Type.type(:loginctl_user).new(common_params)
expect(provider_class).to receive(:loginctl).with('enable-linger', 'foo')
Expand Down
Loading