recog 0.02 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -0
  3. data/.rspec +2 -1
  4. data/.travis.yml +5 -0
  5. data/.yardopts +1 -0
  6. data/Gemfile +3 -1
  7. data/README.md +12 -12
  8. data/Rakefile +22 -0
  9. data/bin/recog_verify.rb +1 -1
  10. data/features/match.feature +2 -2
  11. data/features/verify.feature +10 -7
  12. data/features/xml/no_tests.xml +0 -50
  13. data/features/xml/successful_tests.xml +7 -22
  14. data/features/xml/tests_with_failures.xml +10 -0
  15. data/features/xml/tests_with_warnings.xml +7 -0
  16. data/lib/recog/db.rb +26 -10
  17. data/lib/recog/db_manager.rb +1 -1
  18. data/lib/recog/fingerprint.rb +118 -34
  19. data/lib/recog/fingerprint/regexp_factory.rb +39 -0
  20. data/lib/recog/fingerprint/test.rb +13 -0
  21. data/lib/recog/matcher.rb +3 -3
  22. data/lib/recog/nizer.rb +16 -23
  23. data/lib/recog/verifier.rb +10 -25
  24. data/lib/recog/verifier_factory.rb +1 -1
  25. data/lib/recog/verify_reporter.rb +1 -1
  26. data/lib/recog/version.rb +1 -1
  27. data/recog.gemspec +12 -3
  28. data/spec/data/test_fingerprints.xml +12 -0
  29. data/spec/lib/fingerprint_self_test_spec.rb +8 -4
  30. data/spec/lib/{db_spec.rb → recog/db_spec.rb} +19 -7
  31. data/spec/lib/recog/fingerprint/regexp_factory.rb +61 -0
  32. data/spec/lib/recog/fingerprint_spec.rb +5 -0
  33. data/spec/lib/{formatter_spec.rb → recog/formatter_spec.rb} +1 -1
  34. data/spec/lib/{match_reporter_spec.rb → recog/match_reporter_spec.rb} +10 -9
  35. data/spec/lib/{nizer_spec.rb → recog/nizer_spec.rb} +5 -5
  36. data/spec/lib/{verify_reporter_spec.rb → recog/verify_reporter_spec.rb} +8 -7
  37. data/spec/spec_helper.rb +82 -0
  38. data/xml/apache_os.xml +48 -2
  39. data/xml/http_servers.xml +38 -6
  40. data/xml/ntp_banners.xml +4 -3
  41. data/xml/smb_native_os.xml +32 -32
  42. data/xml/smtp_expn.xml +1 -0
  43. data/xml/smtp_help.xml +2 -1
  44. data/xml/snmp_sysdescr.xml +164 -24
  45. data/xml/ssh_banners.xml +7 -3
  46. metadata +56 -8
  47. data/Gemfile.lock +0 -42
@@ -0,0 +1,5 @@
1
+ require 'recog/fingerprint'
2
+
3
+ describe Recog::Fingerprint do
4
+
5
+ end
@@ -1,4 +1,4 @@
1
- require_relative '../../lib/recog/formatter'
1
+ require 'recog/formatter'
2
2
 
3
3
  describe Recog::Formatter do
4
4
  let(:output) { StringIO.new }
@@ -1,11 +1,11 @@
1
- require_relative '../../lib/recog/match_reporter'
1
+ require 'recog/match_reporter'
2
2
 
3
3
  describe Recog::MatchReporter do
4
4
  let(:options) { double(detail: false) }
5
5
  let(:formatter) { double('formatter').as_null_object }
6
6
  subject { Recog::MatchReporter.new(options, formatter) }
7
7
 
8
- def run_report
8
+ def run_report
9
9
  subject.report do
10
10
  subject.increment_line_count
11
11
  subject.match 'a match'
@@ -23,7 +23,7 @@ describe Recog::MatchReporter do
23
23
  expect(formatter).to receive(:failure_message).with('a failure')
24
24
  run_report
25
25
  end
26
-
26
+
27
27
  context "with detail" do
28
28
  subject { Recog::MatchReporter.new(double(detail: true), formatter) }
29
29
 
@@ -35,7 +35,7 @@ describe Recog::MatchReporter do
35
35
  it "prints summary" do
36
36
  expect(formatter).to receive(:failure_message).with("SUMMARY: 1 matches and 1 failures")
37
37
  run_report
38
- end
38
+ end
39
39
  end
40
40
  end
41
41
 
@@ -63,27 +63,28 @@ describe Recog::MatchReporter do
63
63
 
64
64
  describe "#stop?" do
65
65
  context "with a failure limit" do
66
+
67
+ let(:options) { double(fail_fast: true, stop_after: 3, detail: false) }
66
68
  before do
67
- options.stub(fail_fast: true, stop_after: 3)
68
69
  subject.failure 'first'
69
70
  subject.failure 'second'
70
71
  end
71
72
 
72
73
  it "returns true when the limit is reached " do
73
74
  subject.failure 'third'
74
- expect(subject.stop?).to be_true
75
+ expect(subject.stop?).to be true
75
76
  end
76
77
 
77
78
  it "returns false when under the limit" do
78
- expect(subject.stop?).to be_false
79
+ expect(subject.stop?).to be false
79
80
  end
80
81
  end
81
82
 
82
83
  context "with no failure limit" do
83
- before { options.stub(fail_fast: false) }
84
+ let(:options) { double(fail_fast: false, detail: false) }
84
85
 
85
86
  it "return false" do
86
- expect(subject.stop?).to be_false
87
+ expect(subject.stop?).to be false
87
88
  end
88
89
  end
89
90
  end
@@ -1,10 +1,10 @@
1
- require_relative '../../lib/recog'
1
+ require 'recog'
2
2
  require 'yaml'
3
3
 
4
4
  describe Recog::Nizer do
5
- subject { Recog::Nizer }
5
+ subject { described_class }
6
6
 
7
- describe "#match" do
7
+ describe ".match" do
8
8
  File.readlines(File.expand_path(File.join('spec', 'data', 'smb_native_os.txt'))).each do |line|
9
9
  data = line.strip
10
10
  context "with smb_native_os:#{data}" do
@@ -32,7 +32,7 @@ describe Recog::Nizer do
32
32
  end
33
33
  end
34
34
 
35
- describe "self.best_os_match" do
35
+ describe ".best_os_match" do
36
36
 
37
37
  # Demonstrates how this method picks up additional attributes from other members of the winning
38
38
  # os.product match group and applies them to the result.
@@ -90,7 +90,7 @@ describe Recog::Nizer do
90
90
 
91
91
  end
92
92
 
93
- describe "self.best_service_match" do
93
+ describe ".best_service_match" do
94
94
 
95
95
  # Demonstrates how this method picks up additional attributes from other members of the winning
96
96
  # service.product match group and applies them to the result.
@@ -1,15 +1,16 @@
1
- require_relative '../../lib/recog/verify_reporter'
1
+ require 'recog/verify_reporter'
2
2
 
3
3
  describe Recog::VerifyReporter do
4
4
  let(:formatter) { double('formatter').as_null_object }
5
- let(:fingerprint) { double(name: 'a name', tests: [double, double, double]) }
5
+ let(:fingerprint) { double(name: 'a name', tests: tests) }
6
+ let(:tests) { [double, double, double] }
6
7
  let(:summary_line) do
7
8
  "SUMMARY: Test completed with 1 successful, 1 warnings, and 1 failures"
8
9
  end
9
10
 
10
11
  subject { Recog::VerifyReporter.new(double(detail: false), formatter) }
11
12
 
12
- def run_report
13
+ def run_report
13
14
  subject.report(1) do
14
15
  subject.print_name fingerprint
15
16
  subject.success 'passed'
@@ -32,8 +33,8 @@ describe Recog::VerifyReporter do
32
33
  it "prints summary" do
33
34
  expect(formatter).to receive(:failure_message).with(summary_line)
34
35
  run_report
35
- end
36
-
36
+ end
37
+
37
38
  context "with detail" do
38
39
  subject { Recog::VerifyReporter.new(double(detail: true), formatter) }
39
40
 
@@ -65,10 +66,10 @@ describe Recog::VerifyReporter do
65
66
  it "prints summary" do
66
67
  expect(formatter).to receive(:failure_message).with(summary_line)
67
68
  run_report
68
- end
69
+ end
69
70
 
70
71
  context "with no fingerprint tests" do
71
- before { fingerprint.stub(tests: []) }
72
+ let(:tests) { [] }
72
73
 
73
74
  it "does not print the name" do
74
75
  expect(formatter).not_to receive(:status_message).with("\na name")
@@ -0,0 +1,82 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ # This file was generated by the `rspec --init` command. Conventionally, all
5
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
6
+ # The generated `.rspec` file contains `--require spec_helper` which will cause this
7
+ # file to always be loaded, without a need to explicitly require it in any files.
8
+ #
9
+ # Given that it is always loaded, you are encouraged to keep this file as
10
+ # light-weight as possible. Requiring heavyweight dependencies from this file
11
+ # will add to the boot time of your test suite on EVERY test run, even for an
12
+ # individual file that may not need all of that loaded. Instead, make a
13
+ # separate helper file that requires this one and then use it only in the specs
14
+ # that actually need it.
15
+ #
16
+ # The `.rspec` file also contains a few flags that are not defaults but that
17
+ # users commonly want.
18
+ #
19
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
20
+ RSpec.configure do |config|
21
+
22
+ # Run specs in random order to surface order dependencies. If you find an
23
+ # order dependency and want to debug it, you can fix the order by providing
24
+ # the seed, which is printed after each run.
25
+ # --seed 1234
26
+ config.order = :random
27
+
28
+ # Seed global randomization in this process using the `--seed` CLI option.
29
+ # Setting this allows you to use `--seed` to deterministically reproduce
30
+ # test failures related to randomization by passing the same `--seed` value
31
+ # as the one that triggered the failure.
32
+ Kernel.srand config.seed
33
+
34
+ # Many RSpec users commonly either run the entire suite or an individual
35
+ # file, and it's useful to allow more verbose output when running an
36
+ # individual spec file.
37
+ if config.files_to_run.one?
38
+ # Use the documentation formatter for detailed output,
39
+ # unless a formatter has already been configured
40
+ # (e.g. via a command-line flag).
41
+ config.default_formatter = 'doc'
42
+ end
43
+
44
+ # The settings below are suggested to provide a good initial experience
45
+ # with RSpec, but feel free to customize to your heart's content.
46
+ =begin
47
+ # These two settings work together to allow you to limit a spec run
48
+ # to individual examples or groups you care about by tagging them with
49
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
50
+ # get run.
51
+ config.filter_run :focus
52
+ config.run_all_when_everything_filtered = true
53
+
54
+ # Print the 10 slowest examples and example groups at the
55
+ # end of the spec run, to help surface which specs are running
56
+ # particularly slow.
57
+ config.profile_examples = 10
58
+
59
+ # rspec-expectations config goes here. You can use an alternate
60
+ # assertion/expectation library such as wrong or the stdlib/minitest
61
+ # assertions if you prefer.
62
+ config.expect_with :rspec do |expectations|
63
+ # Enable only the newer, non-monkey-patching expect syntax.
64
+ # For more details, see:
65
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
66
+ expectations.syntax = :expect
67
+ end
68
+
69
+ # rspec-mocks config goes here. You can use an alternate test double
70
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
71
+ config.mock_with :rspec do |mocks|
72
+ # Enable only the newer, non-monkey-patching expect syntax.
73
+ # For more details, see:
74
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
75
+ mocks.syntax = :expect
76
+
77
+ # Prevents you from mocking or stubbing a method that does not exist on
78
+ # a real object. This is generally recommended.
79
+ mocks.verify_partial_doubles = true
80
+ end
81
+ =end
82
+ end
data/xml/apache_os.xml CHANGED
@@ -1,7 +1,8 @@
1
1
  <?xml version="1.0"?>
2
2
  <!--
3
- When an HTTP server is fingerprinted as Apache, a second analysis pass can be done
4
- on the server headers to extract OS information.
3
+ When an HTTP server is fingerprinted as Apache, a 2nd analysis pass is done
4
+ on the server headers HTTPProtocolHelper.SERVER_HEADERS: they are matched
5
+ against the following patterns to extract OS information.
5
6
  -->
6
7
 
7
8
  <fingerprints matches="apache_os">
@@ -110,6 +111,51 @@ on the server headers to extract OS information.
110
111
  <param pos="0" name="os.product" value="Cobalt RaQ"/>
111
112
  </fingerprint>
112
113
 
114
+ <fingerprint pattern="^Apache\/2\.2\.11.*\(Fedora\).*">
115
+ <description>Red Hat Fedora 11</description>
116
+ <param pos="0" name="os.vendor" value="Red Hat"/>
117
+ <param pos="0" name="os.device" value="General"/>
118
+ <param pos="0" name="os.family" value="Linux"/>
119
+ <param pos="0" name="os.product" value="Fedora Core Linux"/>
120
+ <param pos="0" name="os.version" value="11"/>
121
+ </fingerprint>
122
+
123
+ <fingerprint pattern="^Apache\/2\.2\.15.*\(Fedora\).*">
124
+ <description>Red Hat Fedora 13</description>
125
+ <param pos="0" name="os.vendor" value="Red Hat"/>
126
+ <param pos="0" name="os.device" value="General"/>
127
+ <param pos="0" name="os.family" value="Linux"/>
128
+ <param pos="0" name="os.product" value="Fedora Core Linux"/>
129
+ <param pos="0" name="os.version" value="13"/>
130
+ </fingerprint>
131
+
132
+ <fingerprint pattern="^Apache\/2\.2\.16.*\(Fedora\).*">
133
+ <description>Red Hat Fedora 14</description>
134
+ <param pos="0" name="os.vendor" value="Red Hat"/>
135
+ <param pos="0" name="os.device" value="General"/>
136
+ <param pos="0" name="os.family" value="Linux"/>
137
+ <param pos="0" name="os.product" value="Fedora Core Linux"/>
138
+ <param pos="0" name="os.version" value="14"/>
139
+ </fingerprint>
140
+
141
+ <fingerprint pattern="^Apache\/2\.2\.23.*\(Fedora\).*">
142
+ <description>Red Hat Fedora 17</description>
143
+ <param pos="0" name="os.vendor" value="Red Hat"/>
144
+ <param pos="0" name="os.device" value="General"/>
145
+ <param pos="0" name="os.family" value="Linux"/>
146
+ <param pos="0" name="os.product" value="Fedora Core Linux"/>
147
+ <param pos="0" name="os.version" value="17"/>
148
+ </fingerprint>
149
+
150
+ <fingerprint pattern="^Apache\/2\.4\.3.*\(Fedora\).*">
151
+ <description>Red Hat Fedora 18</description>
152
+ <param pos="0" name="os.vendor" value="Red Hat"/>
153
+ <param pos="0" name="os.device" value="General"/>
154
+ <param pos="0" name="os.family" value="Linux"/>
155
+ <param pos="0" name="os.product" value="Fedora Core Linux"/>
156
+ <param pos="0" name="os.version" value="18"/>
157
+ </fingerprint>
158
+
113
159
  <fingerprint pattern=".*\(Fedora\).*">
114
160
  <description>Red Hat Fedora</description>
115
161
  <param pos="0" name="os.vendor" value="Red Hat"/>
data/xml/http_servers.xml CHANGED
@@ -1588,6 +1588,15 @@
1588
1588
  <param pos="0" name="os.device" value="General"/>
1589
1589
  <param pos="0" name="os.family" value="Windows"/>
1590
1590
  <param pos="0" name="os.product" value="Windows Server 2012 R2"/>
1591
+ </fingerprint>
1592
+
1593
+ <fingerprint pattern="^Microsoft-IIS/([\d\.]+)$">
1594
+ <example>Microsoft-IIS/9.0</example>
1595
+ <description>Microsoft IIS new, unknown version</description>
1596
+ <param pos="0" name="service.vendor" value="Microsoft"/>
1597
+ <param pos="0" name="service.product" value="IIS"/>
1598
+ <param pos="0" name="service.family" value="IIS"/>
1599
+ <param pos="1" name="service.version"/>
1591
1600
  </fingerprint>
1592
1601
 
1593
1602
  <fingerprint pattern="^Microsoft-IIS$">
@@ -1868,6 +1877,7 @@
1868
1877
  </fingerprint>
1869
1878
 
1870
1879
  <fingerprint pattern = "^com.hp.openview.Coda (\d\.\d.\d)$">
1880
+ <description>HP Openview Coda</description>
1871
1881
  <example>com.hp.openview.Coda 0.0.1</example>
1872
1882
  <param pos="0" name="service.vendor" value="HP"/>
1873
1883
  <param pos="0" name="service.family" value="OpenView"/>
@@ -1876,6 +1886,7 @@
1876
1886
  </fingerprint>
1877
1887
 
1878
1888
  <fingerprint pattern = "^com.hp.openview.bbc.LLBServer (\d\.\d.\d\.\d)$">
1889
+ <description>HP Openview LLBServer</description>
1879
1890
  <example>com.hp.openview.bbc.LLBServer 2.6.8.1</example>
1880
1891
  <param pos="0" name="service.vendor" value="HP"/>
1881
1892
  <param pos="0" name="service.family" value="OpenView"/>
@@ -2183,6 +2194,23 @@
2183
2194
  <param pos="0" name="service.family" value="Integrated Lights Out Manager"/>
2184
2195
  <param pos="0" name="hw.vendor" value="Sun"/>
2185
2196
  <param pos="0" name="hw.family" value="Sun Fire"/>
2197
+ </fingerprint>
2198
+
2199
+ <fingerprint pattern="^HP-iLO-Server/(?:[\S]+)">
2200
+ <example>HP-iLO-Server/1.30</example>
2201
+ <description>
2202
+ HP Integrated Lights Out Manager (iLO). The version in the Server
2203
+ header is the firmware version and is not currently used. Furthermore,
2204
+ this header value only seems to be present in iLO 4
2205
+ </description>
2206
+ <param pos="0" name="service.vendor" value="HP"/>
2207
+ <param pos="0" name="service.product" value="iLO"/>
2208
+ <param pos="0" name="service.family" value="iLO"/>
2209
+ <param pos="0" name="hw.vendor" value="HP"/>
2210
+ <param pos="0" name="os.vendor" value="HP"/>
2211
+ <param pos="0" name="os.product" value="iLO"/>
2212
+ <param pos="0" name="os.family" value="iLO"/>
2213
+ <param pos="0" name="os.device" value="Lights Out Management"/>
2186
2214
  </fingerprint>
2187
2215
 
2188
2216
  <!--
@@ -2192,6 +2220,7 @@
2192
2220
  -->
2193
2221
 
2194
2222
  <fingerprint pattern="^Jetty/(\d+\.[\d.]+)(?: \((.*)\))?$">
2223
+ <description>Jetty</description>
2195
2224
  <example>Jetty/4.0.1 (SunOS 5.8 sparc)</example>
2196
2225
  <example>Jetty/4.2.23 (SunOS/5.9 sparc java/1.4.2_04)</example>
2197
2226
  <example>Jetty/5.1.10 (Linux/2.6.12 i386 java/1.5.0_05)</example>
@@ -2203,8 +2232,9 @@
2203
2232
  <param pos="2" name="jetty.info"/>
2204
2233
  </fingerprint>
2205
2234
 
2206
- <!-- Catch-all for Jetty verstions using the Jetty/version format. -->
2235
+ <!-- Catch-all for Jetty versions using the Jetty/version format. -->
2207
2236
  <fingerprint pattern="^Jetty/(\S+) \(.*$">
2237
+ <description>Jetty</description>
2208
2238
  <example>Jetty/4.2.x (VxWorks/WIND version 2.9 ppc java/1.1-rr-std-b12)</example>
2209
2239
  <param pos="0" name="service.vendor" value="Mort Bay"/>
2210
2240
  <param pos="0" name="service.product" value="Jetty"/>
@@ -2269,6 +2299,7 @@
2269
2299
  <example>nginx/0.8.53</example>
2270
2300
  <param pos="0" name="service.product" value="nginx"/>
2271
2301
  <param pos="0" name="service.family" value="nginx"/>
2302
+ <param pos="0" name="service.vendor" value="nginx"/>
2272
2303
  <param pos="1" name="service.version"/>
2273
2304
  </fingerprint>
2274
2305
 
@@ -2277,6 +2308,7 @@
2277
2308
  <example>nginx</example>
2278
2309
  <param pos="0" name="service.product" value="nginx"/>
2279
2310
  <param pos="0" name="service.family" value="nginx"/>
2311
+ <param pos="0" name="service.vendor" value="nginx"/>
2280
2312
  </fingerprint>
2281
2313
 
2282
2314
  <fingerprint pattern="^Lotus(?:-Domino)?(?:/|/0|/Release)?$">
@@ -3231,7 +3263,7 @@
3231
3263
  <param pos="0" name="service.product" value="Cross Web Server"/>
3232
3264
  <param pos="0" name="os.vendor" value="HiSilicon"/>
3233
3265
  <param pos="0" name="os.device" value="DVR"/>
3234
- </fingerprint>
3266
+ </fingerprint>
3235
3267
 
3236
3268
  <!-- Hikvision is OEMd by a number of DVR manufacturers -->
3237
3269
  <fingerprint pattern="^(Hikvision|DVRDVS)-Webs$">
@@ -3242,7 +3274,7 @@
3242
3274
  <param pos="0" name="service.product" value="Hikvision Web Server"/>
3243
3275
  <param pos="0" name="os.vendor" value="Hikvision"/>
3244
3276
  <param pos="0" name="os.device" value="DVR"/>
3245
- </fingerprint>
3277
+ </fingerprint>
3246
3278
 
3247
3279
  <fingerprint pattern="^NET-DK[/ ](\d+\.\d+)$">
3248
3280
  <description>Web server found on ARRIS cable modems</description>
@@ -3252,7 +3284,7 @@
3252
3284
  <param pos="0" name="service.product" value="Net-DK Web Server"/>
3253
3285
  <param pos="0" name="os.vendor" value="ARRIS"/>
3254
3286
  <param pos="0" name="os.device" value="Cable Modem"/>
3255
- </fingerprint>
3287
+ </fingerprint>
3256
3288
 
3257
3289
 
3258
3290
  <!-- junit says,
@@ -3286,7 +3318,7 @@
3286
3318
  <param pos="0" name="service.vendor" value="Akamai"/>
3287
3319
  <param pos="0" name="service.product" value="GHost"/>
3288
3320
  <param pos="0" name="os.vendor" value="Akamai"/>
3289
- <param pos="0" name="os.device" value="Web proxy"/>
3321
+ <param pos="0" name="os.device" value="Web proxy"/>
3290
3322
  </fingerprint>
3291
3323
 
3292
3324
  <fingerprint pattern="^gws$">
@@ -3294,7 +3326,7 @@
3294
3326
  <description>Google Web Services</description>
3295
3327
  <param pos="0" name="service.vendor" value="Google"/>
3296
3328
  <param pos="0" name="service.product" value="Google Web Services"/>
3297
- <param pos="0" name="service.family" value="Google Web Server"/>
3329
+ <param pos="0" name="service.family" value="Google Web Server"/>
3298
3330
  </fingerprint>
3299
3331
 
3300
3332
  <fingerprint pattern="^GFE/((?:\d+\.)+\d+)$">
data/xml/ntp_banners.xml CHANGED
@@ -198,8 +198,8 @@ NTP "banners", taken from a readvar response
198
198
  processor="i386", system="JUNOS9.3R4.4", leap=11, stratum=16,
199
199
  </example>
200
200
  <param pos="0" name="os.vendor" value="Juniper"/>
201
- <param pos="0" name="os.family" value="JUNOS"/>
202
- <param pos="0" name="os.product" value="JUNOS"/>
201
+ <param pos="0" name="os.family" value="Junos"/>
202
+ <param pos="0" name="os.product" value="Junos OS"/>
203
203
  <param pos="0" name="service.family" value="NTP"/>
204
204
  <param pos="0" name="service.product" value="NTP"/>
205
205
  <param pos="1" name="service.version"/>
@@ -352,13 +352,14 @@ NTP "banners", taken from a readvar response
352
352
  <param pos="0" name="os.family" value="HP-UX"/>
353
353
  <param pos="0" name="os.product" value="HP-UX"/>
354
354
  </fingerprint>
355
- <fingerprint pattern="system=&quot;UNIX&quot;" flags="REG_ICASE" certainty="0.5">
355
+ <fingerprint pattern="system=&quot;UNIX&quot;" flags="REG_ICASE">
356
356
  <description>Generic UNIX</description>
357
357
  <example>
358
358
  version="4", processor="unknown", system="UNIX", leap=0, stratum=2,
359
359
  </example>
360
360
  <param pos="0" name="os.family" value="UNIX"/>
361
361
  <param pos="0" name="os.product" value="UNIX"/>
362
+ <param pos="0" name="os.certainty" value="0.5"/>
362
363
  </fingerprint>
363
364
  <fingerprint pattern="system=&quot;VxWorks&quot;" flags="REG_ICASE">
364
365
  <description>Generic VxWorks</description>