diff --git a/lib/puppet/provider/loginctl_user/ruby.rb b/lib/puppet/provider/loginctl_user/ruby.rb index 2bc3529f..15f37c04 100644 --- a/lib/puppet/provider/loginctl_user/ruby.rb +++ b/lib/puppet/provider/loginctl_user/ruby.rb @@ -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 diff --git a/spec/unit/puppet/provider/loginctl_user/ruby_spec.rb b/spec/unit/puppet/provider/loginctl_user/ruby_spec.rb index c9091d48..aaea4ce5 100644 --- a/spec/unit/puppet/provider/loginctl_user/ruby_spec.rb +++ b/spec/unit/puppet/provider/loginctl_user/ruby_spec.rb @@ -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')