inspec/test/unit/resources/processes_test.rb
Jonathan Hartman 7451917223 Support finding larger processes on Busybox (#3446)
For larger processes, Busybox's ps displays the vsz and rss columns in
megabytes or gigabytes, with no option I've found to override the behavior.

This change updates the process regex to account for that and converts
the values to kilobytes so they can still be cast as integers.

Signed-off-by: Jonathan Hartman <j@hartman.io>
2018-10-04 14:06:17 -04:00

232 lines
7.1 KiB
Ruby

# encoding: utf-8
# author: Christoph Hartmann
# author: Dominik Richter
require 'helper'
require 'inspec/resource'
describe 'Inspec::Resources::Processes' do
it 'handles empty process results' do
resource = load_resource('processes', 'nothing')
_(resource.entries).must_equal []
end
it 'verify processes resource' do
resource = MockLoader.new(:freebsd10).load_resource('processes', 'login -fp apop')
_(resource.list.length).must_equal 2 # until we deprecate
_(resource.entries.length).must_equal 2
_(resource.entries[0].to_h).must_equal({
label: nil,
pid: 7115,
cpu: '0.3',
mem: '0.0',
vsz: 2516588,
rss: 3052,
tty: 'ttys008',
stat: 'U',
start: 'Fri05PM',
time: '0:00.05',
user: 'root',
command: 'login -fp apop',
})
end
it 'verify processes resource on linux os' do
resource = MockLoader.new(:centos6).load_resource('processes', 'postgres: bifrost bifrost')
_(resource.entries.length).must_equal 1
_(resource.entries[0].to_h).must_equal({
label: 'system_u:system_r:init_t:s0',
pid: 5127,
cpu: '0.0',
mem: '0.2',
vsz: 547208,
rss: 5376,
tty: '?',
stat: 'Ss',
start: '10:54:22',
time: '00:00:00',
user: 'opscode-pgsql',
command: 'postgres: bifrost bifrost 127.0.0.1(43699) idle',
})
end
it 'verify processes resource using where filters on linux os. String match regex' do
resource = MockLoader.new(:centos6).load_resource('processes', '.+')
_(resource.entries.length).must_equal 8
_(resource.where { pid < 11663 && cpu == '0.0' }.users).must_equal(["opscode-pgsql", "opscode", "root", "httpd"])
_(resource.where { user =~ /opscode-.*/ }.entries[0].to_h).must_equal({
label: 'system_u:system_r:init_t:s0',
pid: 5127,
cpu: '0.0',
mem: '0.2',
vsz: 547208,
rss: 5376,
tty: '?',
stat: 'Ss',
start: '10:54:22',
time: '00:00:00',
user: 'opscode-pgsql',
command: 'postgres: bifrost bifrost 127.0.0.1(43699) idle',
})
end
it 'verify long-run processes resource on linux os' do
resource = MockLoader.new(:centos6).load_resource('processes', 'httpd')
_(resource.entries.length).must_equal 4
_(resource.entries[0].to_h).must_equal({
label: '-',
pid: 4589,
cpu: '0.0',
mem: '0.0',
vsz: 70992,
rss: 2864,
tty: '?',
stat: 'Ss',
start: 'Nov 09',
time: '00:01:01',
user: 'root',
command: '/usr/local/apache2/bin/httpd -k start',
})
end
it 'access attributes of a process' do
resource = MockLoader.new(:centos6).load_resource('processes', 'postgres: bifrost bifrost')
process = resource.entries[0]
process.user.must_equal 'opscode-pgsql'
process[:user].must_equal 'opscode-pgsql'
process['user'].must_equal 'opscode-pgsql'
process[-1].must_equal 'postgres: bifrost bifrost 127.0.0.1(43699) idle'
process[1].must_equal 5127
end
it 'retrieves the users and states as arrays' do
resource = MockLoader.new(:freebsd10).load_resource('processes', 'login -fp apop')
_(resource.users.sort).must_equal ['apop', 'root']
_(resource.states.sort).must_equal ['Ss', 'U']
end
it 'retrieves the users and states as arrays on linux os' do
resource = MockLoader.new(:centos6).load_resource('processes', 'postgres: bifrost bifrost')
_(resource.users.sort).must_equal ['opscode-pgsql']
_(resource.states.sort).must_equal ['Ss']
_(resource.exists?).must_equal true
end
it 'command name matches with output (string)' do
resource = MockLoader.new(:centos6).load_resource('processes', 'mysqld')
_(resource.to_s).must_equal 'Processes mysqld'
end
it 'command name matches with output (regex)' do
resource = MockLoader.new(:centos6).load_resource('processes', /mysqld/)
_(resource.to_s).must_equal 'Processes /mysqld/'
end
it 'handles labels with spaces' do
resource = MockLoader.new(:centos6).load_resource('processes', 'ntpd')
_(resource.entries.length).must_equal 1
_(resource.entries[0].to_h).must_equal({
label: '/usr/sbin/ntpd (enforce)',
pid: 14415,
cpu: '0.0',
mem: '0.5',
vsz: 110032,
rss: 5164,
tty: '?',
stat: 'Ssl',
start: '22:39:25',
time: '00:00:00',
user: 'ntp',
command: '/usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 112:117',
})
end
it 'handles regular processes from busybox' do
resource = MockLoader.new(:alpine).load_resource('processes', '/some/other/coolprogram')
_(resource.entries.length).must_equal 1
_(resource.entries[0].to_h).must_equal({
label: nil,
pid: 5,
cpu: nil,
mem: nil,
vsz: 1528,
rss: 4,
tty: '136,0',
stat: 'R',
start: nil,
time: '0:00',
user: 'joe',
command: '/some/other/coolprogram',
})
end
it 'handles human readable megabytes from busybox' do
resource = MockLoader.new(:alpine).load_resource('processes', '/a/bigger/program')
_(resource.entries.length).must_equal 1
_(resource.entries[0].to_h).must_equal({
label: nil,
pid: 82,
cpu: nil,
mem: nil,
vsz: 24576,
rss: 2048,
tty: '?',
stat: 'S',
start: nil,
time: '3:50',
user: 'frank',
command: '/a/bigger/program',
})
end
it 'handles human readable gigabytes from busybox' do
resource = MockLoader.new(:alpine).load_resource('processes', '/the/biggest/program')
_(resource.entries.length).must_equal 1
_(resource.entries[0].to_h).must_equal({
label: nil,
pid: 83,
cpu: nil,
mem: nil,
vsz: 2726297,
rss: 1048576,
tty: '?',
stat: 'S',
start: nil,
time: '39:00',
user: 'tim',
command: '/the/biggest/program',
})
end
it 'command name matches with output (string)' do
resource = MockLoader.new(:windows).load_resource('processes', 'winlogon.exe')
_(resource.to_s).must_equal 'Processes winlogon.exe'
end
it 'retrieves the users and states as arrays on windows os' do
resource = MockLoader.new(:windows).load_resource('processes', 'winlogon.exe')
_(resource.users.sort).must_equal ['NT AUTHORITY\\SYSTEM']
end
it 'process should exist' do
resource = MockLoader.new(:windows).load_resource('processes', 'winlogon.exe')
_(resource.exists?).must_equal true
end
it 'process should_not exist' do
resource = MockLoader.new(:windows).load_resource('processes', 'unicorn.exe')
_(resource.exists?).must_equal false
end
it 'returns the correct command for busybox ps' do
resource = MockLoader.new(:alpine).load_resource('processes')
resource.expects(:busybox_ps?).returns(true)
resource.send(:ps_configuration_for_linux)[0].must_equal 'ps -o pid,vsz,rss,tty,stat,time,ruser,args'
end
it 'returns the correct command for non-busybox linux' do
resource = MockLoader.new(:centos7).load_resource('processes')
resource.expects(:busybox_ps?).returns(false)
resource.send(:ps_configuration_for_linux)[0].must_equal 'ps axo label,pid,pcpu,pmem,vsz,rss,tty,stat,start,time,user:32,command'
end
end