tweek 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/bin/tweek +18 -7
- data/lib/tweek.rb +9 -0
- data/lib/tweek/file.rb +38 -31
- data/lib/tweek/section.rb +63 -55
- data/lib/tweek/version.rb +1 -1
- data/settings/{sample.set → sample.twk} +0 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b847609877ba323a4f9feb924b503cd80f9f553
|
4
|
+
data.tar.gz: 28ca6b95b8f2481c00b85aadf4ef2b4aa690f78d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd5be7941a09e0351df76b35e99efe7e5a5d905691f656f7fa577b3e15c303fab0296b716cddbf79faf12f3f74185e063b3a367e7c94d7a33099053c69aed342
|
7
|
+
data.tar.gz: 2ef05e618352ec963c405a9f05cc8b279e29f97c3fd2d847cdd1750352f790f559e44acc7475c638d2e24be98c01fe8a45cbfb616f7e5b352e8459193f79d13f
|
data/README.md
CHANGED
@@ -72,7 +72,8 @@ Use `tweek -s` to show them.
|
|
72
72
|
## Settings File Format
|
73
73
|
|
74
74
|
The settings file is a plaintext file encoded in UTF-8 (if you are running Ruby 2.0 or
|
75
|
-
above) or US-ASCII otherwise.
|
75
|
+
above) or US-ASCII otherwise. Although settings files can have any name, please observe the
|
76
|
+
convention of using a file extension of `.twk`.
|
76
77
|
|
77
78
|
The overall syntax of the file was designed to be Ruby-like so that enabling syntax
|
78
79
|
highlighting (using Ruby as the language) makes it very readable.
|
data/bin/tweek
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
3
|
# A script to check a variety of Linux system settings
|
4
|
-
# See settings/sample.
|
4
|
+
# See settings/sample.twk for a description of these.
|
5
5
|
# By Nick Townsend, June 2017
|
6
6
|
#
|
7
7
|
require 'rubygems'
|
8
8
|
|
9
9
|
require 'optparse'
|
10
|
-
require 'ostruct'
|
11
10
|
require 'tweek'
|
12
11
|
require 'tweek/file'
|
13
12
|
require 'tweek/version'
|
@@ -18,14 +17,16 @@ trap('INT') do
|
|
18
17
|
end
|
19
18
|
|
20
19
|
gflag = false
|
20
|
+
sflag = false
|
21
|
+
qflag = false
|
21
22
|
distro = nil
|
22
23
|
distro_ver = nil
|
23
24
|
kernel_ver = nil
|
24
25
|
OptionParser.new do |o|
|
25
26
|
o.banner = "Usage: #{$0} [options] [settings_file...]"
|
26
27
|
o.separator ""
|
27
|
-
o.separator "Check the system parameters specified in the settings files"
|
28
|
-
o.separator "(If not supplied then built-in
|
28
|
+
o.separator "Check and/or update the system parameters specified in the settings files"
|
29
|
+
o.separator "(If not supplied then built-in samples are used)"
|
29
30
|
o.separator "Options:"
|
30
31
|
o.on('--distro=NAME', "Set Distro (default uses lsb_release)" ) do |d|
|
31
32
|
distro = d
|
@@ -39,14 +40,20 @@ OptionParser.new do |o|
|
|
39
40
|
o.on( '-g', '--generate', "Generate a copy of the input file(s)", "containing current values on STDOUT" ) do
|
40
41
|
gflag = true
|
41
42
|
end
|
43
|
+
o.on( '-q', '--quiet', "No output (default false)" ) do
|
44
|
+
qflag = true
|
45
|
+
end
|
42
46
|
o.on( '-s', '--show', "Write the default parameters to STDOUT",
|
43
47
|
"Use as a fully documented starting point"
|
44
48
|
) do
|
45
|
-
File.open(File.expand_path('../../settings/sample.
|
49
|
+
File.open(File.expand_path('../../settings/sample.twk',__FILE__)).each_line do |l|
|
46
50
|
STDOUT.puts l # no copy_stream in 1.8.7
|
47
51
|
end
|
48
52
|
exit
|
49
53
|
end
|
54
|
+
o.on( '--set', "Set the tweak file(s)" ) do
|
55
|
+
sflag = true
|
56
|
+
end
|
50
57
|
o.on('-v', "--version", "Show version") do
|
51
58
|
puts Tweek::VERSION
|
52
59
|
exit
|
@@ -83,9 +90,13 @@ if kernel_ver.nil?
|
|
83
90
|
exit 2
|
84
91
|
end
|
85
92
|
end
|
86
|
-
cs = Tweek::File.new(
|
93
|
+
cs = Tweek::File.new(distro, distro_ver, kernel_ver, gflag, qflag, sflag)
|
87
94
|
if ARGV.empty?
|
88
|
-
|
95
|
+
if sflag
|
96
|
+
puts "You can't update the system with the sample settings, specify one or more Tweek files!"
|
97
|
+
exit 2
|
98
|
+
end
|
99
|
+
fh = File.open(File.expand_path('../../settings/sample.twk',__FILE__))
|
89
100
|
else
|
90
101
|
fh = ARGF
|
91
102
|
end
|
data/lib/tweek.rb
CHANGED
@@ -31,6 +31,15 @@ module Tweek
|
|
31
31
|
::File.open("/proc/sys/#{name}", &:read).chomp.gsub(/\s+/,' ') rescue $!.message
|
32
32
|
end
|
33
33
|
|
34
|
+
def self.set_sysctl name, value
|
35
|
+
begin
|
36
|
+
::File.open("/proc/sys/#{name}", "w"){|f| f.write value}
|
37
|
+
value
|
38
|
+
rescue
|
39
|
+
$!.message
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
34
43
|
def self.net_driver name
|
35
44
|
::File.basename(::File.readlink("/sys/class/net/#{name}/device/driver"))
|
36
45
|
end
|
data/lib/tweek/file.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'optparse'
|
3
|
-
require 'ostruct'
|
4
2
|
require 'tweek'
|
5
3
|
require 'tweek/section'
|
4
|
+
require 'tweek/entry'
|
6
5
|
|
7
6
|
class Tweek::File
|
8
7
|
|
9
|
-
attr_reader :distro, :distro_version, :kernel_version
|
8
|
+
attr_reader :distro, :distro_version, :kernel_version, :gflag, :qflag, :sflag
|
10
9
|
|
11
|
-
def initialize(
|
10
|
+
def initialize( distro, distro_version, kernel_version, gflag = false, qflag = true, sflag = false)
|
12
11
|
@distro = distro
|
13
12
|
@distro_version = Gem::Version.new(distro_version)
|
14
13
|
@kernel_version = Gem::Version.new(kernel_version)
|
@@ -18,34 +17,43 @@ class Tweek::File
|
|
18
17
|
@skips = []
|
19
18
|
@warns = []
|
20
19
|
@generated = []
|
20
|
+
if gflag
|
21
|
+
@generated << "# Generated at #{Time.now.strftime("%c %Z")}"
|
22
|
+
@generated << "# Distro: #{@distro} Version: #{@distro_version} Kernel: #{@kernel_version}"
|
23
|
+
end
|
21
24
|
@gflag = gflag
|
22
|
-
@
|
25
|
+
@qflag = qflag
|
26
|
+
@sflag = sflag
|
23
27
|
end
|
24
28
|
|
25
|
-
|
29
|
+
# Generate an output file recording what was found (check) or done (set)
|
30
|
+
#
|
31
|
+
def generate type, entry
|
26
32
|
return unless @gflag
|
27
33
|
case type
|
28
34
|
when :line
|
29
|
-
@generated.push "#{
|
35
|
+
@generated.push "#{entry.line}#{entry.comment}"
|
30
36
|
when :section
|
31
|
-
|
37
|
+
return if entry.type.nil?
|
38
|
+
@generated.push "#{entry.type} #{entry.list} #{entry.comment}"
|
32
39
|
when :entry
|
33
|
-
cond =
|
34
|
-
if
|
35
|
-
line = "#{
|
40
|
+
cond = entry.cond.nil? ? "": " if #{entry.cond}"
|
41
|
+
if entry.actual.nil?
|
42
|
+
line = "#{entry.param} = #{entry.value}#{cond}"
|
36
43
|
note = "[condition not met]"
|
37
44
|
else
|
38
|
-
|
39
|
-
|
45
|
+
entry.swap!
|
46
|
+
line = "#{entry.param} = #{entry.actual}#{cond}"
|
47
|
+
if entry.value === entry.actual
|
40
48
|
note = nil
|
41
49
|
else
|
42
|
-
note = "[expected #{
|
50
|
+
note = "[#{entry.set ? 'was' : 'expected'} #{entry.value}]"
|
43
51
|
end
|
44
52
|
end
|
45
|
-
if
|
53
|
+
if entry.comment.nil?
|
46
54
|
@generated.push (note ? line + " # " + note : line)
|
47
55
|
else
|
48
|
-
@generated.push (note ? line + " " + comment + " " + note : line + " " + comment)
|
56
|
+
@generated.push (note ? line + " " + entry.comment + " " + note : line + " " + entry.comment)
|
49
57
|
end
|
50
58
|
end
|
51
59
|
end
|
@@ -96,10 +104,10 @@ class Tweek::File
|
|
96
104
|
def assert_equal expected, actual, msg = ''
|
97
105
|
@nparams += 1
|
98
106
|
if expected === actual
|
99
|
-
STDERR.print "." if @
|
107
|
+
STDERR.print "." if not @qflag and STDERR.isatty
|
100
108
|
return 0
|
101
109
|
else
|
102
|
-
STDERR.print "F" if @
|
110
|
+
STDERR.print "F" if not @qflag and STDERR.isatty
|
103
111
|
@mismatches.push "#{msg}: Expected #{expected}\n#{" "*(msg.size+4)}Actual #{actual}"
|
104
112
|
end
|
105
113
|
return 1
|
@@ -108,23 +116,23 @@ class Tweek::File
|
|
108
116
|
# Read the entire file and split into sections
|
109
117
|
#
|
110
118
|
def read_sections handle
|
111
|
-
section = Tweek::Section.new(0,
|
119
|
+
section = Tweek::Section.new( 0, nil, '', '' )
|
112
120
|
while line = handle.gets
|
113
121
|
line.chomp!
|
114
122
|
if (line =~ /^=begin/)..(line =~ /^=end/)
|
115
|
-
section.push
|
123
|
+
section.push Tweek::Entry.new( :line => line, :lineno => handle.lineno )
|
116
124
|
next
|
117
125
|
end
|
118
126
|
|
119
127
|
comment = line.slice!(/#.*$/)
|
120
128
|
if line.empty?
|
121
|
-
section.push
|
129
|
+
section.push Tweek::Entry.new( :line => line, :lineno => handle.lineno, :comment => comment )
|
122
130
|
next
|
123
131
|
end
|
124
132
|
|
125
133
|
if /^\s*([A-Z0-9]+)\s*(.*?)\s*$/ =~ line # We've hit a new section
|
126
134
|
section.process(self)
|
127
|
-
section = Tweek::Section.new(handle.lineno, $1, $2, comment)
|
135
|
+
section = Tweek::Section.new( handle.lineno, $1, $2, comment )
|
128
136
|
next
|
129
137
|
end
|
130
138
|
|
@@ -132,8 +140,8 @@ class Tweek::File
|
|
132
140
|
if $4 and $4.strip.empty?
|
133
141
|
error "#{handle.lineno}: Missing condition after 'if'"
|
134
142
|
else
|
135
|
-
section.push
|
136
|
-
|
143
|
+
section.push Tweek::Entry.new( :lineno => handle.lineno, :param => $1, :value => $2,
|
144
|
+
:cond => $4, :comment => comment )
|
137
145
|
end
|
138
146
|
next
|
139
147
|
end
|
@@ -144,13 +152,12 @@ class Tweek::File
|
|
144
152
|
end
|
145
153
|
|
146
154
|
def results
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
@generated.unshift "# Generated at #{Time.now.strftime("%c %Z")}\n# Distro: #{@distro} Version: #{@distro_version} Kernel: #{@kernel_version}"
|
155
|
+
unless @qflag
|
156
|
+
STDERR.puts "\nDistro: #{@distro} Version: #{@distro_version} Kernel: #{@kernel_version}"
|
157
|
+
STDERR.puts "\n#{@nparams} parameters checked, #{@skips.size} conditions not met, #{@mismatches.size} mismatches, #{@warns.size} warnings, #{@errors.size} errors"
|
158
|
+
STDERR.puts "\n#{@errors.join("\n")}" unless @errors.empty?
|
159
|
+
STDERR.puts "\n#{@warns.join("\n")}" unless @warns.empty?
|
160
|
+
STDERR.puts "\n#{@mismatches.join("\n")}" unless @mismatches.empty?
|
154
161
|
@generated.each { |l| STDOUT.puts l}
|
155
162
|
end
|
156
163
|
return @mismatches.size
|
data/lib/tweek/section.rb
CHANGED
@@ -8,6 +8,7 @@
|
|
8
8
|
class Tweek::Section < Array
|
9
9
|
|
10
10
|
attr_reader :lineno, :type, :list, :comment
|
11
|
+
|
11
12
|
def initialize lineno, type, list, comment
|
12
13
|
@lineno = lineno
|
13
14
|
@type = type
|
@@ -15,65 +16,64 @@ class Tweek::Section < Array
|
|
15
16
|
@comment = comment
|
16
17
|
end
|
17
18
|
|
18
|
-
def section_entry
|
19
|
-
OpenStruct.new(:lineno => lineno, :type => type, :list => list, :comment => comment )
|
20
|
-
end
|
21
|
-
|
22
19
|
# Iterate through each entry in the section.
|
23
20
|
# If it's a comment then pass to the generate method
|
24
21
|
# If it has a condition which is not met then pass to generate
|
25
22
|
# If it passes yield the entry
|
26
23
|
#
|
27
|
-
def each_entry
|
24
|
+
def each_entry twf, &block
|
28
25
|
self.each do |entry|
|
29
26
|
if entry.line
|
30
|
-
|
27
|
+
twf.generate :line, entry
|
31
28
|
next
|
32
29
|
end
|
33
30
|
begin
|
34
|
-
if
|
35
|
-
|
36
|
-
|
31
|
+
if twf.condfail entry.cond
|
32
|
+
twf.generate :entry, entry
|
33
|
+
twf.skipcond entry
|
37
34
|
next
|
38
35
|
end
|
39
36
|
yield entry
|
40
37
|
rescue Exception => e
|
41
|
-
|
38
|
+
twf.error "#{entry.lineno}: #{e.message}"
|
42
39
|
end
|
43
40
|
end
|
44
41
|
end
|
45
42
|
|
46
|
-
def process
|
43
|
+
def process twf
|
47
44
|
|
48
|
-
|
45
|
+
twf.generate :section, Tweek::Entry.new( :lineno => lineno, :type => type, :list => list, :comment => comment )
|
49
46
|
|
50
47
|
return if self.empty?
|
51
48
|
|
52
|
-
case type
|
53
|
-
when
|
54
|
-
each_entry (
|
49
|
+
case self.type
|
50
|
+
when nil
|
51
|
+
each_entry (twf) do |entry|
|
55
52
|
end
|
56
53
|
|
57
54
|
when 'BLKDEV' # BLOCK DEVICE PARAMETERS
|
58
55
|
|
56
|
+
twf.warn "Set is not currently implemented for #{type} section" if twf.sflag
|
57
|
+
|
59
58
|
Dir.chdir('/dev')
|
60
59
|
devices = Dir.glob(self.list.split(' ').map{|dev| dev.gsub(/^\/dev\//,'')})
|
61
60
|
|
62
|
-
|
61
|
+
twf.warn "Block device check skipped: no devices found" if devices.empty?
|
63
62
|
|
64
63
|
devices.each do |blk|
|
65
|
-
each_entry (
|
64
|
+
each_entry (twf) do |entry|
|
66
65
|
entry.actual = Tweek.blk_param(blk, entry.param)
|
67
66
|
if entry.param == 'scheduler'
|
68
67
|
entry.actual = entry.actual.slice(/\[(.*?)\]/,1) unless entry.actual == 'none'
|
69
68
|
end
|
70
|
-
|
71
|
-
|
69
|
+
twf.assert_equal entry.value, entry.actual, "/dev/#{blk} #{entry.param}"
|
70
|
+
twf.generate :entry, entry
|
72
71
|
end
|
73
72
|
end
|
74
73
|
|
75
74
|
when 'KERNEL' # KERNEL PARAMETERS
|
76
|
-
|
75
|
+
twf.warn "Set is not currently implemented for #{type} section" if twf.sflag
|
76
|
+
each_entry (twf) do |entry|
|
77
77
|
actual = /\b(#{entry.param})(=\S+)?\b/.match(Tweek.bootline)
|
78
78
|
case
|
79
79
|
when (entry.value == 'true' and actual)
|
@@ -92,32 +92,38 @@ class Tweek::Section < Array
|
|
92
92
|
expected = entry.value
|
93
93
|
observed = actual.nil? ? 'was not found' : actual[2][1..-1]
|
94
94
|
end
|
95
|
-
|
95
|
+
twf.assert_equal expected, observed, "Kernel parameter #{entry.param}"
|
96
96
|
entry.actual = !actual.nil?
|
97
|
-
|
97
|
+
twf.generate :entry, entry
|
98
98
|
end
|
99
99
|
|
100
100
|
when 'CLOCKSOURCE'
|
101
|
-
|
101
|
+
twf.warn "Set is not currently implemented for #{type} section" if twf.sflag
|
102
|
+
each_entry (twf) do |entry|
|
102
103
|
entry.actual = Tweek.clocksource(entry.param)
|
103
|
-
|
104
|
-
|
104
|
+
twf.assert_equal entry.value, entry.actual, entry.param
|
105
|
+
twf.generate :entry, entry
|
105
106
|
end
|
106
107
|
|
107
108
|
when 'SYSCTL' # SYSCTL SETTINGS
|
108
|
-
each_entry (
|
109
|
+
each_entry (twf) do |entry|
|
109
110
|
file = entry.param.gsub(/\./,'/')
|
110
111
|
entry.actual = Tweek.sysctl(file)
|
111
|
-
|
112
|
-
|
112
|
+
twf.assert_equal entry.value, entry.actual, entry.param
|
113
|
+
if twf.sflag
|
114
|
+
entry.value = Tweek.set_sysctl(file, entry.value)
|
115
|
+
entry.set = true
|
116
|
+
end
|
117
|
+
twf.generate :entry, entry
|
113
118
|
end
|
114
119
|
|
115
120
|
when 'NET' # NETWORK DEVICES
|
121
|
+
twf.warn "Set is not currently implemented for #{type} section" if twf.sflag
|
116
122
|
devices = self.list.split(' ').map{|dev| dev.gsub(/^\/dev\//,'')}
|
117
|
-
|
123
|
+
twf.warn "Network device check skipped: no devices found" if devices.empty?
|
118
124
|
|
119
125
|
devices.each do |netdev|
|
120
|
-
each_entry (
|
126
|
+
each_entry (twf) do |entry|
|
121
127
|
|
122
128
|
case entry.param
|
123
129
|
when 'driver'
|
@@ -131,7 +137,7 @@ class Tweek::Section < Array
|
|
131
137
|
entry.actual = balpid.zero? ? 'IRQ balance daemon not running' : 'balance'
|
132
138
|
else
|
133
139
|
if balpid.zero?
|
134
|
-
handle_irqs(netdev,
|
140
|
+
handle_irqs(netdev, twf, entry)
|
135
141
|
next
|
136
142
|
else
|
137
143
|
entry.actual = 'IRQ balance daemon running'
|
@@ -142,46 +148,48 @@ class Tweek::Section < Array
|
|
142
148
|
begin
|
143
149
|
entry.actual = Tweek.net_param(netdev, entry.param)
|
144
150
|
rescue
|
145
|
-
|
151
|
+
twf.error "#{entry.lineno}: Network parameter #{entry.param} not handled: #{$!.message}"
|
146
152
|
next
|
147
153
|
end
|
148
154
|
end
|
149
155
|
|
150
|
-
|
151
|
-
|
156
|
+
twf.assert_equal entry.value, entry.actual, entry.param
|
157
|
+
twf.generate :entry, entry
|
152
158
|
end
|
153
159
|
end
|
154
160
|
|
155
161
|
when 'EXT4' # EXT4 filesystems info via `dumpe2fs -h /dev/#{device}`
|
162
|
+
twf.warn "Set is not currently implemented for #{type} section" if twf.sflag
|
156
163
|
mounted = Tweek.mounted
|
157
164
|
mounts = Dir.glob(self.list.split(' '))
|
158
165
|
mounts.each do |mount|
|
159
166
|
unless this = mounted.select{|m| (mount == m[0] or mount == m[1]) and m[2] == 'ext4'}.first
|
160
|
-
|
167
|
+
twf.warn "EXT4 path #{mount} is not mounted or is not mounted as ext4"
|
161
168
|
next
|
162
169
|
end
|
163
170
|
device = this[0].gsub('/dev/','')
|
164
171
|
optstring = File.open("/proc/fs/ext4/#{device}/options",&:read)
|
165
172
|
options = Hash[optstring.scan(/([^=\s]+)=([^=\s,]+)/)] # options a=b
|
166
173
|
optstring.split(/\n/).reject{|o| o.index('=')}.each{|o| options[o] = 'true'}
|
167
|
-
each_entry (
|
174
|
+
each_entry (twf) do |entry|
|
168
175
|
entry.actual = options[entry.param] || "<not found>"
|
169
|
-
|
170
|
-
|
176
|
+
twf.assert_equal entry.value, entry.actual, "EXT4 #{mount}: #{entry.param}"
|
177
|
+
twf.generate :entry, entry
|
171
178
|
end
|
172
179
|
end
|
173
180
|
|
174
181
|
when 'XFS' # XFS filesystems info via `xfs_info`
|
182
|
+
twf.warn "Set is not currently implemented for #{type} section" if twf.sflag
|
175
183
|
# Dynamically via: /proc/fs/xfs/... ?
|
176
184
|
mounts = self.list.split(' ')
|
177
185
|
if mounts.empty?
|
178
|
-
|
186
|
+
twf.warn "#{self.lineno}: XFS device check skipped: no mountpoints found"
|
179
187
|
end
|
180
188
|
mounts.each do |mount|
|
181
189
|
xfsinfo = Tweek.xfsinfo(mount)
|
182
190
|
unless xfsinfo
|
183
|
-
|
184
|
-
each_entry (
|
191
|
+
twf.warn "No XFS filesystem at #{mount}"
|
192
|
+
each_entry (twf) { |entry| twf.generate :entry, entry }
|
185
193
|
next
|
186
194
|
end
|
187
195
|
data = Hash[xfsinfo.slice!(/^meta-data.*(?=^naming)/m).scan(/([^=\s]+)=([^=\s,]+)/)]
|
@@ -190,27 +198,27 @@ class Tweek::Section < Array
|
|
190
198
|
realtime = Hash[xfsinfo.slice!(/^realtime.*$/m).scan(/([^=\s]+)=([^=\s,]+)/)]
|
191
199
|
xfsparms = { 'data' => data, 'naming' => naming, 'log' => log, 'realtime' => realtime }
|
192
200
|
|
193
|
-
each_entry (
|
201
|
+
each_entry (twf) do |entry|
|
194
202
|
parameter = entry.param.split('.',2)
|
195
203
|
entry.actual = xfsparms[parameter[0]][parameter[1]] rescue "<invalid name>"
|
196
|
-
|
197
|
-
|
204
|
+
twf.assert_equal entry.value, entry.actual, "XFS #{mount}: #{entry.param}"
|
205
|
+
twf.generate :entry, entry
|
198
206
|
end
|
199
207
|
end
|
200
208
|
|
201
209
|
else
|
202
|
-
|
210
|
+
twf.error "#{self.lineno}: Unknown type #{self.type}"
|
203
211
|
end
|
204
212
|
|
205
213
|
end
|
206
214
|
|
207
|
-
def handle_irqs netdev,
|
215
|
+
def handle_irqs netdev, twf, entry
|
208
216
|
irqs = Tweek.irqs(netdev)
|
209
217
|
|
210
218
|
if irqs.empty?
|
211
|
-
|
219
|
+
twf.warn "#{netdev} IRQ check skipped: none found"
|
212
220
|
entry.actual = 'null'
|
213
|
-
|
221
|
+
twf.generate :entry, entry
|
214
222
|
return
|
215
223
|
end
|
216
224
|
|
@@ -232,7 +240,7 @@ class Tweek::Section < Array
|
|
232
240
|
expected_rps << "0000"
|
233
241
|
expected_rss << sprintf("%04x", 1<<ix)
|
234
242
|
else
|
235
|
-
|
243
|
+
twf.warn "#{netdev} IRQ strategy '#{entry.value}' can't handle #{ncores} cores"
|
236
244
|
return
|
237
245
|
end
|
238
246
|
|
@@ -248,7 +256,7 @@ class Tweek::Section < Array
|
|
248
256
|
expected_rps << ("00000000," * 3) + "fffefe00"
|
249
257
|
expected_rss << ("00000000," * 3) + sprintf("%08x", 1<<(ix+1))
|
250
258
|
else
|
251
|
-
|
259
|
+
twf.warn "#{netdev} IRQ strategy '#{entry.value}' can't handle IRQ#{ix}"
|
252
260
|
return
|
253
261
|
end
|
254
262
|
|
@@ -261,27 +269,27 @@ class Tweek::Section < Array
|
|
261
269
|
expected_rps << ("00000000," * 2) + "ffff0000," + "ffe00000"
|
262
270
|
expected_rss << ("00000000," * 3) + sprintf("%08x", 1<<(ix + 9))
|
263
271
|
else
|
264
|
-
|
272
|
+
twf.warn "#{netdev} IRQ strategy '#{entry.value}' can't handle IRQ#{ix}"
|
265
273
|
return
|
266
274
|
end
|
267
275
|
|
268
276
|
else
|
269
|
-
|
277
|
+
twf.error "#{entry.lineno}: Can't handle #{ncores} cores in IRQ strategy '#{entry.value}'"
|
270
278
|
return
|
271
279
|
end
|
272
280
|
|
273
281
|
else
|
274
|
-
|
282
|
+
twf.error "#{entry.lineno}: Unrecognized #{netdev} IRQ strategy '#{entry.value}'"
|
275
283
|
return
|
276
284
|
end
|
277
285
|
end
|
278
286
|
irqs.each_with_index do |irq, ix|
|
279
287
|
actual_rss = Tweek.net_rss(irq)
|
280
|
-
mismatches +=
|
288
|
+
mismatches += twf.assert_equal expected_rss[ix], actual_rss, "#{netdev}_irq_#{irq}_rss"
|
281
289
|
end
|
282
290
|
irqs.each_with_index do |irq, ix|
|
283
291
|
actual_rps = Tweek.net_rps(netdev, ix)
|
284
|
-
mismatches +=
|
292
|
+
mismatches += twf.assert_equal expected_rps[ix], actual_rps, "#{netdev}_irq_#{irq}_rps"
|
285
293
|
end
|
286
294
|
entry.actual = 'null' if mismatches > 0
|
287
295
|
return
|
data/lib/tweek/version.rb
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tweek
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Townsend
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -68,7 +68,7 @@ files:
|
|
68
68
|
- lib/tweek/file.rb
|
69
69
|
- lib/tweek/section.rb
|
70
70
|
- lib/tweek/version.rb
|
71
|
-
- settings/sample.
|
71
|
+
- settings/sample.twk
|
72
72
|
homepage: https://github.com/townsen/tweek
|
73
73
|
licenses:
|
74
74
|
- MIT
|