Skip to content
This repository was archived by the owner on Jun 19, 2020. It is now read-only.

Commit 126eca8

Browse files
author
Oana Tanasoiu
committed
(FACT-2330) Add ssh fact for Windows OpenSSH feature
1 parent bc2aca6 commit 126eca8

9 files changed

Lines changed: 541 additions & 93 deletions

File tree

.rubocop_todo.yml

Lines changed: 213 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This configuration was generated by
2-
# `rubocop --auto-gen-config`
3-
# on 2020-04-13 17:31:41 +0300 using RuboCop version 0.74.0.
2+
# `rubocop --auto-gen-config --exclude-limit 1000`
3+
# on 2020-04-15 10:09:42 +0300 using RuboCop version 0.74.0.
44
# The point is for the user to remove these configuration records
55
# one by one as the offenses are removed from the code base.
66
# Note that changes in the inspected code, or installation of new
@@ -9,7 +9,87 @@
99
# Offense count: 80
1010
# Configuration parameters: CustomTransform, IgnoreMethods.
1111
RSpec/FilePath:
12-
Enabled: false
12+
Exclude:
13+
- 'spec/custom_facts/core/aggregate_spec.rb'
14+
- 'spec/custom_facts/core/directed_graph_spec.rb'
15+
- 'spec/custom_facts/core/execution/fact_manager_spec.rb'
16+
- 'spec/custom_facts/core/execution/posix_spec.rb'
17+
- 'spec/custom_facts/core/execution/windows_spec.rb'
18+
- 'spec/custom_facts/core/execution_spec.rb'
19+
- 'spec/custom_facts/core/logging_spec.rb'
20+
- 'spec/custom_facts/core/resolvable_spec.rb'
21+
- 'spec/custom_facts/core/suitable_spec.rb'
22+
- 'spec/custom_facts/util/collection_spec.rb'
23+
- 'spec/custom_facts/util/config_spec.rb'
24+
- 'spec/custom_facts/util/confine_spec.rb'
25+
- 'spec/custom_facts/util/directory_loader_spec.rb'
26+
- 'spec/custom_facts/util/fact_spec.rb'
27+
- 'spec/custom_facts/util/loader_spec.rb'
28+
- 'spec/custom_facts/util/normalization_spec.rb'
29+
- 'spec/custom_facts/util/parser_spec.rb'
30+
- 'spec/custom_facts/util/resolution_spec.rb'
31+
- 'spec/facter/facts_utils/bytes_to_human_readable_spec.rb'
32+
- 'spec/facter/facts_utils/uptime_parser_spec.rb'
33+
- 'spec/facter/facts_utils/windows_release_finder_spec.rb'
34+
- 'spec/facter/model/fact_collection_spec.rb'
35+
- 'spec/facter/model/resolved_fact_spec.rb'
36+
- 'spec/facter/resolvers/aio_agent_version_spec.rb'
37+
- 'spec/facter/resolvers/aix/architecture_resolver_spec.rb'
38+
- 'spec/facter/resolvers/aix/ffi_helper_spec.rb'
39+
- 'spec/facter/resolvers/aix/hardware_resolver_spec.rb'
40+
- 'spec/facter/resolvers/disk_resolver_spec.rb'
41+
- 'spec/facter/resolvers/dmi_resolver_spec.rb'
42+
- 'spec/facter/resolvers/filesystems_resolver_spec.rb'
43+
- 'spec/facter/resolvers/fips_enabled_resolver_spec.rb'
44+
- 'spec/facter/resolvers/identity_resolver_spec.rb'
45+
- 'spec/facter/resolvers/load_averages_resolver_spec.rb'
46+
- 'spec/facter/resolvers/macosx/dmi_resolver_spec.rb'
47+
- 'spec/facter/resolvers/memory_resolver_spec.rb'
48+
- 'spec/facter/resolvers/mountpoints_resolver_spec.rb'
49+
- 'spec/facter/resolvers/processors_resolver_spec.rb'
50+
- 'spec/facter/resolvers/redhat_release_resolver_spec.rb'
51+
- 'spec/facter/resolvers/selinux_resolver_spec.rb'
52+
- 'spec/facter/resolvers/solaris/current_zone_resolver_spec.rb'
53+
- 'spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb'
54+
- 'spec/facter/resolvers/solaris/zone_resolver_spec.rb'
55+
- 'spec/facter/resolvers/solaris/zpool_resolver_spec.rb'
56+
- 'spec/facter/resolvers/suse_relese_resolver_spec.rb'
57+
- 'spec/facter/resolvers/system_profile_resolver_spec.rb'
58+
- 'spec/facter/resolvers/utils/aix/odm_query_spec.rb'
59+
- 'spec/facter/resolvers/utils/macosx/filesystem_helper_spec.rb'
60+
- 'spec/facter/resolvers/utils/windows/win32ole_spec.rb'
61+
- 'spec/facter/resolvers/windows/dmi_bios_resolver_spec.rb'
62+
- 'spec/facter/resolvers/windows/dmi_computersystem_resolver_spec.rb'
63+
- 'spec/facter/resolvers/windows/hardware_architecture_resolver_spec.rb'
64+
- 'spec/facter/resolvers/windows/identity_resolver_spec.rb'
65+
- 'spec/facter/resolvers/windows/kernel_resolver_spec.rb'
66+
- 'spec/facter/resolvers/windows/memory_resolver_spec.rb'
67+
- 'spec/facter/resolvers/windows/netkvm_resolver_spec.rb'
68+
- 'spec/facter/resolvers/windows/networking_resolver_spec.rb'
69+
- 'spec/facter/resolvers/windows/processors_resolver_spec.rb'
70+
- 'spec/facter/resolvers/windows/product_release_resolver_spec.rb'
71+
- 'spec/facter/resolvers/windows/system32_resolver_spec.rb'
72+
- 'spec/facter/resolvers/windows/virtualization_resolver_spec.rb'
73+
- 'spec/facter/resolvers/windows/win_os_description_resolver_spec.rb'
74+
- 'spec/framework/config/block_list_spec.rb'
75+
- 'spec/framework/config/config_reader_spec.rb'
76+
- 'spec/framework/core/fact/external/external_fact_manager_spec.rb'
77+
- 'spec/framework/core/fact/internal/internal_fact_manager_spec.rb'
78+
- 'spec/framework/core/fact_loaders/class_discoverer_spec.rb'
79+
- 'spec/framework/core/fact_loaders/external_fact_loader_spec.rb'
80+
- 'spec/framework/core/fact_loaders/fact_loader_spec.rb'
81+
- 'spec/framework/core/fact_loaders/internal_fact_loader_spec.rb'
82+
- 'spec/framework/core/fact_manager_spec.rb'
83+
- 'spec/framework/core/options/option_store_spec.rb'
84+
- 'spec/framework/core/options/options_validator_spec.rb'
85+
- 'spec/framework/core/options_spec.rb'
86+
- 'spec/framework/core/session_cache_spec.rb'
87+
- 'spec/framework/formatters/fact_formatter_spec.rb'
88+
- 'spec/framework/formatters/hocon_fact_formatter_spec.rb'
89+
- 'spec/framework/formatters/json_fact_formatter_spec.rb'
90+
- 'spec/framework/formatters/legacy_fact_formatter_spec.rb'
91+
- 'spec/framework/formatters/yaml_fact_formatter_spec.rb'
92+
- 'spec/framework/utils/utils_spec.rb'
1393

1494
# Offense count: 15
1595
# Configuration parameters: AssignmentOnly.
@@ -33,7 +113,71 @@ RSpec/LeakyConstantDeclaration:
33113
# Configuration parameters: EnforcedStyle.
34114
# SupportedStyles: have_received, receive
35115
RSpec/MessageSpies:
36-
Enabled: false
116+
Exclude:
117+
- 'spec/custom_facts/core/aggregate_spec.rb'
118+
- 'spec/custom_facts/core/execution/fact_manager_spec.rb'
119+
- 'spec/custom_facts/core/execution/windows_spec.rb'
120+
- 'spec/custom_facts/core/execution_spec.rb'
121+
- 'spec/custom_facts/core/logging_spec.rb'
122+
- 'spec/custom_facts/core/resolvable_spec.rb'
123+
- 'spec/custom_facts/core/suitable_spec.rb'
124+
- 'spec/custom_facts/util/collection_spec.rb'
125+
- 'spec/custom_facts/util/confine_spec.rb'
126+
- 'spec/custom_facts/util/directory_loader_spec.rb'
127+
- 'spec/custom_facts/util/fact_spec.rb'
128+
- 'spec/custom_facts/util/loader_spec.rb'
129+
- 'spec/custom_facts/util/parser_spec.rb'
130+
- 'spec/custom_facts/util/resolution_spec.rb'
131+
- 'spec/facter/facter_spec.rb'
132+
- 'spec/facter/facts/aix/os/name_spec.rb'
133+
- 'spec/facter/facts/aix/os/release_spec.rb'
134+
- 'spec/facter/facts/macosx/is_virtual_spec.rb'
135+
- 'spec/facter/facts/macosx/mountpoints_spec.rb'
136+
- 'spec/facter/facts/macosx/os/architecture_spec.rb'
137+
- 'spec/facter/facts/macosx/os/family_spec.rb'
138+
- 'spec/facter/facts/macosx/os/name_spec.rb'
139+
- 'spec/facter/facts/sles/os/architecture_spec.rb'
140+
- 'spec/facter/facts/sles/os/name_spec.rb'
141+
- 'spec/facter/facts/sles/os/release_spec.rb'
142+
- 'spec/facter/facts/solaris/os/architecture_spec.rb'
143+
- 'spec/facter/facts/solaris/os/name_spec.rb'
144+
- 'spec/facter/facts/solaris/ruby/platform_spec.rb'
145+
- 'spec/facter/facts/solaris/ruby/sitedir_spec.rb'
146+
- 'spec/facter/facts/windows/dmi/manufacturer_spec.rb'
147+
- 'spec/facter/facts/windows/dmi/product/name_spec.rb'
148+
- 'spec/facter/facts/windows/dmi/product/serial_number_spec.rb'
149+
- 'spec/facter/facts/windows/dmi/product/uuid_spec.rb'
150+
- 'spec/facter/facts/windows/fips_enabled_spec.rb'
151+
- 'spec/facter/facts/windows/identity/user_spec.rb'
152+
- 'spec/facter/facts/windows/ipaddress6_interfaces_spec.rb'
153+
- 'spec/facter/facts/windows/ipaddress_interfaces_spec.rb'
154+
- 'spec/facter/facts/windows/macaddress_interfaces_spec.rb'
155+
- 'spec/facter/facts/windows/memory/system/available_bytes_spec.rb'
156+
- 'spec/facter/facts/windows/memory/system/available_spec.rb'
157+
- 'spec/facter/facts/windows/memory/system/total_bytes_spec.rb'
158+
- 'spec/facter/facts/windows/memory/system/total_spec.rb'
159+
- 'spec/facter/facts/windows/mtu_interfaces_spec.rb'
160+
- 'spec/facter/facts/windows/netmask6_interfaces_spec.rb'
161+
- 'spec/facter/facts/windows/netmask_interfaces_spec.rb'
162+
- 'spec/facter/facts/windows/network6_interfaces_spec.rb'
163+
- 'spec/facter/facts/windows/network_interfaces_spec.rb'
164+
- 'spec/facter/facts/windows/os/architecture_spec.rb'
165+
- 'spec/facter/facts/windows/os/family_spec.rb'
166+
- 'spec/facter/facts/windows/os/hardware_spec.rb'
167+
- 'spec/facter/facts/windows/os/name_spec.rb'
168+
- 'spec/facter/facts/windows/os/windows/edition_id_spec.rb'
169+
- 'spec/facter/facts/windows/os/windows/installation_type_spec.rb'
170+
- 'spec/facter/facts/windows/os/windows/product_name_spec.rb'
171+
- 'spec/facter/facts/windows/os/windows/release_id_spec.rb'
172+
- 'spec/facter/facts/windows/os/windows/system32_spec.rb'
173+
- 'spec/facter/facts/windows/processors/count_spec.rb'
174+
- 'spec/facter/facts/windows/processors/isa_spec.rb'
175+
- 'spec/facter/facts/windows/processors/physicalcount_spec.rb'
176+
- 'spec/facter/facts/windows/ruby/platform_spec.rb'
177+
- 'spec/facter/facts/windows/ruby/sitedir_spec.rb'
178+
- 'spec/facter/facts/windows/scope6_interfaces_spec.rb'
179+
- 'spec/facter/resolvers/utils/aix/odm_query_spec.rb'
180+
- 'spec/framework/core/fact_loaders/external_fact_loader_spec.rb'
37181

38182
# Offense count: 26
39183
RSpec/SubjectStub:
@@ -46,7 +190,70 @@ RSpec/SubjectStub:
46190
- 'spec/custom_facts/util/fact_spec.rb'
47191
- 'spec/custom_facts/util/resolution_spec.rb'
48192

49-
# Offense count: 185
193+
# Offense count: 179
50194
# Configuration parameters: IgnoreNameless, IgnoreSymbolicNames.
51195
RSpec/VerifiedDoubles:
52-
Enabled: false
196+
Exclude:
197+
- 'spec/custom_facts/core/aggregate_spec.rb'
198+
- 'spec/custom_facts/util/collection_spec.rb'
199+
- 'spec/custom_facts/util/confine_spec.rb'
200+
- 'spec/custom_facts/util/directory_loader_spec.rb'
201+
- 'spec/custom_facts/util/fact_spec.rb'
202+
- 'spec/custom_facts/util/resolution_spec.rb'
203+
- 'spec/facter/facter_spec.rb'
204+
- 'spec/facter/facts/aix/ssh_spec.rb'
205+
- 'spec/facter/facts/macosx/memory/swap/capacity_spec.rb'
206+
- 'spec/facter/facts/macosx/memory/swap/used_bytes_spec.rb'
207+
- 'spec/facter/facts/macosx/memory/system/capacity_spec.rb'
208+
- 'spec/facter/facts/macosx/memory/system/used_bytes_spec.rb'
209+
- 'spec/facter/facts/windows/dmi/product/serial_number_spec.rb'
210+
- 'spec/facter/facts/windows/hypervisors/hyperv_spec.rb'
211+
- 'spec/facter/facts/windows/hypervisors/kvm_spec.rb'
212+
- 'spec/facter/facts/windows/hypervisors/virtualbox_spec.rb'
213+
- 'spec/facter/facts/windows/hypervisors/vmware_spec.rb'
214+
- 'spec/facter/facts/windows/hypervisors/xen_spec.rb'
215+
- 'spec/facter/facts/windows/identity/privileged_spec.rb'
216+
- 'spec/facter/facts/windows/memory/system/capacity_spec.rb'
217+
- 'spec/facter/facts/windows/memory/system/used_bytes_spec.rb'
218+
- 'spec/facter/facts/windows/networking/dhcp_spec.rb'
219+
- 'spec/facter/facts/windows/networking/interfaces_spec.rb'
220+
- 'spec/facter/facts/windows/networking/mtu_spec.rb'
221+
- 'spec/facter/facts/windows/networking/primary_spec.rb'
222+
- 'spec/facter/facts/windows/processors/models_spec.rb'
223+
- 'spec/facter/facts/windows/virtualization/is_virtual_spec.rb'
224+
- 'spec/facter/facts/windows/virtualization/virtual_spec.rb'
225+
- 'spec/facter/query_parser_spec.rb'
226+
- 'spec/facter/resolvers/aix/architecture_resolver_spec.rb'
227+
- 'spec/facter/resolvers/aix/ffi_helper_spec.rb'
228+
- 'spec/facter/resolvers/aix/hardware_resolver_spec.rb'
229+
- 'spec/facter/resolvers/macosx/mountpoints_resolver_spec.rb'
230+
- 'spec/facter/resolvers/mountpoints_resolver_spec.rb'
231+
- 'spec/facter/resolvers/solaris/current_zone_resolver_spec.rb'
232+
- 'spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb'
233+
- 'spec/facter/resolvers/solaris/zfs_resolver_spec.rb'
234+
- 'spec/facter/resolvers/solaris/zone_resolver_spec.rb'
235+
- 'spec/facter/resolvers/solaris/zpool_resolver_spec.rb'
236+
- 'spec/facter/resolvers/utils/windows/network_utils_spec.rb'
237+
- 'spec/facter/resolvers/utils/windows/win32ole_spec.rb'
238+
- 'spec/facter/resolvers/windows/dmi_bios_resolver_spec.rb'
239+
- 'spec/facter/resolvers/windows/dmi_computersystem_resolver_spec.rb'
240+
- 'spec/facter/resolvers/windows/hardware_architecture_resolver_spec.rb'
241+
- 'spec/facter/resolvers/windows/identity_resolver_spec.rb'
242+
- 'spec/facter/resolvers/windows/kernel_resolver_spec.rb'
243+
- 'spec/facter/resolvers/windows/memory_resolver_spec.rb'
244+
- 'spec/facter/resolvers/windows/networking_resolver_spec.rb'
245+
- 'spec/facter/resolvers/windows/processors_resolver_spec.rb'
246+
- 'spec/facter/resolvers/windows/system32_resolver_spec.rb'
247+
- 'spec/facter/resolvers/windows/uptime_resolver_spec.rb'
248+
- 'spec/facter/resolvers/windows/virtualization_resolver_spec.rb'
249+
- 'spec/facter/resolvers/windows/win_os_description_resolver_spec.rb'
250+
- 'spec/framework/config/block_list_spec.rb'
251+
- 'spec/framework/core/fact_loaders/external_fact_loader_spec.rb'
252+
- 'spec/framework/core/fact_loaders/fact_loader_spec.rb'
253+
- 'spec/framework/core/fact_manager_spec.rb'
254+
- 'spec/framework/core/session_cache_spec.rb'
255+
- 'spec/framework/formatters/hocon_fact_formatter_spec.rb'
256+
- 'spec/framework/formatters/json_fact_formatter_spec.rb'
257+
- 'spec/framework/formatters/legacy_fact_formatter_spec.rb'
258+
- 'spec/framework/formatters/yaml_fact_formatter_spec.rb'
259+
- 'spec/mocks/util.rb'

lib/facts/windows/ssh.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# frozen_string_literal: true
2+
3+
module Facts
4+
module Windows
5+
class Ssh
6+
FACT_NAME = 'ssh'
7+
8+
def call_the_resolver
9+
privileged = Facter::Resolvers::Identity.resolve(:privileged)
10+
ssh_info = Facter::Resolvers::Windows::Ssh.resolve(:ssh) if privileged
11+
ssh_facts = {}
12+
ssh_info&.each { |ssh| ssh_facts.merge!(create_ssh_fact(ssh)) }
13+
Facter::ResolvedFact.new(FACT_NAME, ssh_facts.empty? ? nil : ssh_facts)
14+
end
15+
16+
private
17+
18+
def create_ssh_fact(ssh)
19+
{ ssh.name.to_sym =>
20+
{ fingerprints: { sha1: ssh.fingerprint.sha1,
21+
sha256: ssh.fingerprint.sha256 },
22+
key: ssh.key,
23+
type: ssh.type } }
24+
end
25+
end
26+
end
27+
end

lib/resolvers/ssh_resolver.rb

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
# frozen_string_literal: true
22

3-
require 'base64'
4-
require 'digest/sha1'
5-
63
module Facter
74
module Resolvers
85
class SshResolver < BaseResolver
@@ -28,49 +25,12 @@ def retrieve_info(fact_name)
2825
next unless file_content
2926

3027
key_type, key = file_content.split(' ')
31-
key_name = determine_ssh_key_name(key_type)
32-
ssh_list << create_ssh(key_name, key_type, key)
28+
ssh_list << ::Resolvers::Utils::SshHelper.create_ssh(key_type, key)
3329
end
3430
end
3531
@fact_list[:ssh] = ssh_list
3632
@fact_list[fact_name]
3733
end
38-
39-
def create_ssh(key_name, key_type, key)
40-
decoded_key = Base64.decode64(key)
41-
ssh_fa = determine_ssh_fingerprint(key_name)
42-
sha1 = "SSHFP #{ssh_fa} 1 #{Digest::SHA1.new.update(decoded_key)}"
43-
sha256 = "SSHFP #{ssh_fa} 2 #{Digest::SHA2.new.update(decoded_key)}"
44-
45-
fingerprint = FingerPrint.new(sha1, sha256)
46-
Ssh.new(fingerprint, key_type, key, key_name)
47-
end
48-
49-
def determine_ssh_key_name(key)
50-
case key
51-
when 'ssh-dss'
52-
'dsa'
53-
when 'ecdsa-sha2-nistp256'
54-
'ecdsa'
55-
when 'ssh-ed25519'
56-
'ed25519'
57-
when 'ssh-rsa'
58-
'rsa'
59-
end
60-
end
61-
62-
def determine_ssh_fingerprint(key_name)
63-
case key_name
64-
when 'rsa'
65-
1
66-
when 'dsa'
67-
2
68-
when 'ecdsa'
69-
3
70-
when 'ed25519'
71-
4
72-
end
73-
end
7434
end
7535
end
7636
end

lib/resolvers/utils/ssh_helper.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# frozen_string_literal: true
2+
3+
require 'base64'
4+
require 'digest/sha1'
5+
6+
module Resolvers
7+
module Utils
8+
class SshHelper
9+
class << self
10+
SSH_NAME = { 'ssh-dss' => 'dsa', 'ecdsa-sha2-nistp256' => 'ecdsa',
11+
'ssh-ed25519' => 'ed25519', 'ssh-rsa' => 'rsa' }.freeze
12+
SSH_FINGERPRINT = { 'rsa' => 1, 'dsa' => 2, 'ecdsa' => 3, 'ed25519' => 4 }.freeze
13+
14+
def create_ssh(key_type, key)
15+
key_name = SSH_NAME[key]
16+
decoded_key = Base64.decode64(key)
17+
ssh_fp = SSH_FINGERPRINT[key_name]
18+
sha1 = "SSHFP #{ssh_fp} 1 #{Digest::SHA1.new.update(decoded_key)}"
19+
sha256 = "SSHFP #{ssh_fp} 2 #{Digest::SHA2.new.update(decoded_key)}"
20+
21+
fingerprint = Facter::FingerPrint.new(sha1, sha256)
22+
Facter::Ssh.new(fingerprint, key_type, key, key_name)
23+
end
24+
end
25+
end
26+
end
27+
end

0 commit comments

Comments
 (0)