recog 0.02 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>