mirror of
https://github.com/inspec/inspec
synced 2024-11-23 21:23:29 +00:00
7451917223
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>
232 lines
7.1 KiB
Ruby
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
|