boris 1.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/LICENSE.md +9 -0
  2. data/README.md +94 -0
  3. data/boris.gemspec +28 -0
  4. data/doc/Array.html +437 -0
  5. data/doc/Boris.html +230 -0
  6. data/doc/Boris/ConnectionAlreadyActive.html +123 -0
  7. data/doc/Boris/ConnectionFailed.html +127 -0
  8. data/doc/Boris/Connector.html +794 -0
  9. data/doc/Boris/InvalidCredentials.html +131 -0
  10. data/doc/Boris/InvalidOption.html +123 -0
  11. data/doc/Boris/InvalidTargetName.html +123 -0
  12. data/doc/Boris/Lumberjack.html +466 -0
  13. data/doc/Boris/MissingCredentials.html +123 -0
  14. data/doc/Boris/NoActiveConnection.html +123 -0
  15. data/doc/Boris/NoProfileDetected.html +123 -0
  16. data/doc/Boris/Options.html +783 -0
  17. data/doc/Boris/Profiles.html +117 -0
  18. data/doc/Boris/Profiles/Linux.html +1151 -0
  19. data/doc/Boris/Profiles/RedHat.html +875 -0
  20. data/doc/Boris/Profiles/Solaris.html +1230 -0
  21. data/doc/Boris/Profiles/Structure.html +2050 -0
  22. data/doc/Boris/Profiles/UNIX.html +893 -0
  23. data/doc/Boris/Profiles/Windows.html +1846 -0
  24. data/doc/Boris/Profiles/Windows/Windows2003.html +304 -0
  25. data/doc/Boris/Profiles/Windows/Windows2008.html +379 -0
  26. data/doc/Boris/Profiles/Windows/Windows2012.html +304 -0
  27. data/doc/Boris/SNMPConnector.html +512 -0
  28. data/doc/Boris/SSHConnector.html +633 -0
  29. data/doc/Boris/Target.html +2002 -0
  30. data/doc/Boris/WMIConnector.html +1134 -0
  31. data/doc/BorisLogger.html +217 -0
  32. data/doc/Hash.html +195 -0
  33. data/doc/String.html +1246 -0
  34. data/doc/_index.html +420 -0
  35. data/doc/class_list.html +53 -0
  36. data/doc/css/common.css +1 -0
  37. data/doc/css/full_list.css +57 -0
  38. data/doc/css/style.css +328 -0
  39. data/doc/file.README.html +183 -0
  40. data/doc/file_list.html +55 -0
  41. data/doc/frames.html +28 -0
  42. data/doc/index.html +183 -0
  43. data/doc/js/app.js +214 -0
  44. data/doc/js/full_list.js +173 -0
  45. data/doc/js/jquery.js +4 -0
  46. data/doc/method_list.html +1468 -0
  47. data/doc/top-level-namespace.html +126 -0
  48. data/lib/boris.rb +30 -0
  49. data/lib/boris/connectors.rb +47 -0
  50. data/lib/boris/connectors/snmp.rb +56 -0
  51. data/lib/boris/connectors/ssh.rb +110 -0
  52. data/lib/boris/connectors/wmi.rb +186 -0
  53. data/lib/boris/errors.rb +17 -0
  54. data/lib/boris/helpers/array.rb +63 -0
  55. data/lib/boris/helpers/constants.rb +20 -0
  56. data/lib/boris/helpers/hash.rb +8 -0
  57. data/lib/boris/helpers/scrubber.rb +51 -0
  58. data/lib/boris/helpers/string.rb +130 -0
  59. data/lib/boris/lumberjack.rb +47 -0
  60. data/lib/boris/options.rb +86 -0
  61. data/lib/boris/profiles/linux/redhat.rb +77 -0
  62. data/lib/boris/profiles/linux_core.rb +216 -0
  63. data/lib/boris/profiles/unix/solaris.rb +307 -0
  64. data/lib/boris/profiles/unix_core.rb +85 -0
  65. data/lib/boris/profiles/windows/windows2003.rb +15 -0
  66. data/lib/boris/profiles/windows/windows2008.rb +23 -0
  67. data/lib/boris/profiles/windows/windows2012.rb +15 -0
  68. data/lib/boris/profiles/windows_core.rb +530 -0
  69. data/lib/boris/structure.rb +167 -0
  70. data/lib/boris/target.rb +340 -0
  71. data/test/connector_tests/test_snmp.rb +35 -0
  72. data/test/connector_tests/test_ssh.rb +51 -0
  73. data/test/connector_tests/test_wmi.rb +129 -0
  74. data/test/helper_tests/test_array.rb +25 -0
  75. data/test/helper_tests/test_hash.rb +10 -0
  76. data/test/helper_tests/test_string.rb +136 -0
  77. data/test/profile_tests/test_core_skeleton +107 -0
  78. data/test/profile_tests/test_linux_core.rb +331 -0
  79. data/test/profile_tests/test_redhat.rb +134 -0
  80. data/test/profile_tests/test_solaris.rb +523 -0
  81. data/test/profile_tests/test_unix_core.rb +117 -0
  82. data/test/profile_tests/test_windows.rb +536 -0
  83. data/test/setup_tests.rb +14 -0
  84. data/test/test_all.rb +8 -0
  85. data/test/test_options.rb +44 -0
  86. data/test/test_structure.rb +136 -0
  87. data/test/test_target.rb +146 -0
  88. metadata +241 -0
@@ -0,0 +1,117 @@
1
+ require 'setup_tests'
2
+
3
+ class UNIXCoreTest < ProfileTestSetup
4
+ context 'a UNIX target' do
5
+ setup do
6
+ @connector = @target.connector = instance_of(SSHConnector)
7
+ @target.stubs(:target_profile).returns(Profiles::UNIX)
8
+ @target.extend(Profiles::UNIX)
9
+ @connector.stubs(:value_at).with('uname -a').returns('some_flavor_of_unix')
10
+ end
11
+
12
+ context 'being scanned' do
13
+ setup do
14
+ end
15
+
16
+ context 'for file system information' do
17
+ setup do
18
+ @file_system_data = [
19
+ '/dev/md/dsk/d10|1000|500|/',
20
+ '/dev/md/dsk/d11|2000|1000|/var'
21
+ ]
22
+
23
+ @expected_data = [
24
+ {
25
+ :capacity_mb=>1000,
26
+ :file_system=>'/dev/md/dsk/d10',
27
+ :mount_point=>'/',
28
+ :san_storage=>nil,
29
+ :used_space_mb=>500
30
+ },
31
+ {
32
+ :capacity_mb=>2000,
33
+ :file_system=>'/dev/md/dsk/d11',
34
+ :mount_point=>'/var',
35
+ :san_storage=>nil,
36
+ :used_space_mb=>1000
37
+ }
38
+ ]
39
+ end
40
+
41
+ should 'return file system information via #get_file_systems' do
42
+ file_system_command = %q{df -kl 2>/dev/null | grep ^/ | nawk '{print $1 "|" $2 / 1024 "|" $3 / 1024 "|" $6}'}
43
+
44
+ @connector.stubs(:values_at).with(file_system_command).returns(@file_system_data)
45
+
46
+ @target.get_file_systems
47
+
48
+ assert_equal(@expected_data, @target.file_systems)
49
+ end
50
+ end
51
+
52
+ # OS SPECIFIC
53
+ #context 'for hardware information' do
54
+ #end
55
+
56
+ # OS SPECIFIC
57
+ #context 'for hosted shares' do
58
+ #end
59
+
60
+ # OS SPECIFIC
61
+ #context 'for installed applications' do
62
+ #end
63
+
64
+ # OS SPECIFIC
65
+ #context 'for installed patches' do
66
+ #end
67
+
68
+ # OS SPECIFIC
69
+ #context 'for installed services' do
70
+ #end
71
+
72
+ context 'for local users and groups' do
73
+ setup do
74
+ @user_data = [
75
+ 'root:x:0:0:Super-User:/root:/sbin/sh',
76
+ 'usera:x:2001:10:User A:/export/home/usera:/bin/ksh',
77
+ 'userb:x:2001:10:User B:/export/home/userb:/bin/ksh'
78
+ ]
79
+ @group_data = ['root::0:', 'staff::10:']
80
+ @expected_data = [{:members=>['root'], :name=>'root'}, {:members=>['usera', 'userb'], :name=>'staff'}]
81
+ end
82
+
83
+ should 'return local user groups and accounts via #get_local_user_groups' do
84
+ @connector.stubs(:values_at).with('cat /etc/passwd | grep -v "^#"').returns(@user_data)
85
+ @connector.stubs(:values_at).with('cat /etc/group | grep -v "^#"').returns(@group_data)
86
+
87
+ @target.get_local_user_groups
88
+
89
+ assert_equal(@expected_data, @target.local_user_groups)
90
+ end
91
+ end
92
+
93
+ context 'for network identification' do
94
+ setup do
95
+ @expected_data = {:domain=>'mydomain.com', :hostname=>'SERVER01'}
96
+ end
97
+
98
+ should 'return the domain and hostname via #get_network_id' do
99
+ @connector.stubs(:value_at).with('hostname').returns(@expected_data[:hostname])
100
+ @connector.stubs(:value_at).with('domainname').returns(@expected_data[:domain])
101
+
102
+ @target.get_network_id
103
+
104
+ assert_equal(@expected_data, @target.network_id)
105
+ end
106
+ end
107
+
108
+ # OS SPECIFIC
109
+ #context 'for network interfaces' do; end
110
+ #end
111
+
112
+ # OS SPECIFIC
113
+ #context 'for operating system information' do
114
+ #end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,536 @@
1
+ require 'setup_tests'
2
+
3
+ class WindowsCoreTest < ProfileTestSetup
4
+ extend Profiles::Structure
5
+
6
+ context 'a Windows target' do
7
+ setup do
8
+ @connector = @target.connector = instance_of(WMIConnector)
9
+ @target.stubs(:target_profile).returns(Profiles::Windows)
10
+ @target.extend(Profiles::Windows)
11
+ @connector.stubs(:value_at).with('SELECT Name FROM Win32_OperatingSystem').returns({:name=>'Windows Server 2008'})
12
+ end
13
+
14
+ context 'being scanned' do
15
+ setup do
16
+ end
17
+
18
+ context 'for file system information' do
19
+ setup do
20
+ @logical_disks_qry = 'SELECT FreeSpace, Name, Size FROM Win32_LogicalDisk WHERE DriveType=3'
21
+ @logical_disks_data = [
22
+ {:freespace=>1024, :name=>'C:', :size=>2048}
23
+ ]
24
+
25
+ @physical_disks_qry = 'SELECT DeviceID, Model FROM Win32_DiskDrive'
26
+ @physical_disks_data = [
27
+ {
28
+ :deviceid=>'\\.\PHYSICALDRIVE0',
29
+ :model=>'LOGICAL VOLUME SCSI Disk Device'
30
+ }
31
+ ]
32
+
33
+ @partition_mapping_qry = 'SELECT Antecedent, Dependent FROM Win32_LogicalDiskToPartition'
34
+ @partition_mapping_data = [
35
+ {
36
+ :antecedent=>"\\#{@target_name}\\root\\cimv2:Win32_DiskPartition.DeviceID=\"Disk #0, Partition #0\"",
37
+ :dependent=>"\\#{@target_name}\\root\\cimv2:Win32_LogicalDisk.DeviceID=\"C:\""
38
+ }
39
+ ]
40
+
41
+ @disk_partitions_qry = "SELECT Antecedent, Dependent FROM Win32_DiskDriveToDiskPartition"
42
+ @disk_partitions_data = [
43
+ {
44
+ :antecedent=>"\\#{@target_name}\\root\\cimv2:Win32_DiskDrive.DeviceID=\"\\\\.\\PHYSICALDRIVE0\"",
45
+ :dependent=>"\\#{@target_name}\\root\\cimv2:Win32_DiskPartition.DeviceID=\"Disk #0, Partition #0\""
46
+ }
47
+ ]
48
+
49
+ @expected_data = [
50
+ {
51
+ :capacity_mb=>2,
52
+ :file_system=>'Disk #0, Partition #0',
53
+ :mount_point=>'C:',
54
+ :san_storage=>nil,
55
+ :used_space_mb=>1
56
+ }
57
+ ]
58
+ end
59
+
60
+ should 'return file system information via #get_file_systems' do
61
+ @connector.stubs(:values_at).with(@logical_disks_qry).returns(@logical_disks_data)
62
+ @connector.stubs(:values_at).with(@partition_mapping_qry).returns(@partition_mapping_data)
63
+ @connector.stubs(:values_at).with(@physical_disks_qry).returns(@physical_disks_data)
64
+ @connector.stubs(:values_at).with(@disk_partitions_qry).returns(@disk_partitions_data)
65
+
66
+ @target.get_file_systems
67
+
68
+ assert_equal(@expected_data, @target.file_systems)
69
+ end
70
+ end
71
+
72
+ context 'for hardware information' do
73
+ setup do
74
+ @bios_qry = 'SELECT SerialNumber, SMBIOSBIOSVersion FROM Win32_BIOS'
75
+ @bios_data = {:serialnumber=>'1234ABCD', :smbiosbiosversion=>'6.0'}
76
+
77
+ @model_qry = 'SELECT Manufacturer, Model, TotalPhysicalMemory FROM Win32_ComputerSystem'
78
+ @model_data = {
79
+ :manufacturer=>'VMware, Inc.',
80
+ :model=>'VMware Virtual Platform',
81
+ :totalphysicalmemory=>2146861056
82
+ }
83
+
84
+ @cpu_qry = 'SELECT * FROM Win32_Processor'
85
+ @cpu_data = [
86
+ {
87
+ :datawidth=>32,
88
+ :l2cachesize=>1024,
89
+ :manufacturer=>'AuthenticAMD',
90
+ :maxclockspeed=>2813,
91
+ :name=>'Dual-Core AMD Opteron(tm) Processor 8220',
92
+ :numberofcores=>1,
93
+ :numberoflogicalprocessors=>1
94
+ }
95
+ ]
96
+
97
+ @expected_data = {
98
+ :cpu_architecture=>32,
99
+ :cpu_core_count=>1,
100
+ :cpu_model=>'Dual-Core AMD Opteron(tm) Processor 8220',
101
+ :cpu_physical_count=>1,
102
+ :cpu_speed_mhz=>2813,
103
+ :cpu_vendor=>'AuthenticAMD',
104
+ :firmware_version=>'6.0',
105
+ :model=>'VMware Virtual Platform',
106
+ :memory_installed_mb=>2047,
107
+ :serial=>'1234ABCD',
108
+ :vendor=>'VMware, Inc.'
109
+ }
110
+ end
111
+
112
+ should 'return hardware information via #get_hardware' do
113
+ @connector.stubs(:value_at).with(@bios_qry).returns(@bios_data)
114
+ @connector.stubs(:value_at).with(@model_qry).returns(@model_data)
115
+ @connector.stubs(:values_at).with(@cpu_qry).returns(@cpu_data)
116
+
117
+ @target.get_hardware
118
+
119
+ assert_equal(@expected_data, @target.hardware)
120
+ end
121
+ end
122
+
123
+ context 'for hosted shares' do
124
+ setup do
125
+ @expected_data = [{:name=>'myshare', :path=>'D:\myshare'}]
126
+ end
127
+
128
+ should 'return hosted share information via #get_hosted_shares' do
129
+ @connector.stubs(:values_at).with('SELECT Name, Path FROM Win32_Share WHERE Type = 0').returns(@expected_data)
130
+ @target.get_hosted_shares
131
+ assert_equal(@expected_data, @target.hosted_shares)
132
+ end
133
+ end
134
+
135
+ context 'for installed applications' do
136
+ setup do
137
+ @guid = '{4AB6A079-178B-4144-B21F-4D1AE71666A2}'
138
+ @product_key_binary = [164, 1, 1, 0, 3, 0, 0, 0, 53, 53, 48, 52, 49, 45, 49, 56, 54, 45, 48, 49, 51, 51, 48,
139
+ 51, 53, 45, 55, 53, 55, 54, 51, 0, 151, 0, 0, 0, 88, 49, 52, 45, 50, 51, 56, 57, 54, 0, 0, 0, 0, 0, 0, 0,
140
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
141
+ @expected_product_key = 'BBBBB-BBBBB-BBBBB-BBBBB-BBBBB'
142
+ end
143
+
144
+ should 'extract the product key from a binary string' do
145
+ assert_equal(@expected_product_key, @product_key_binary.to_ms_product_key)
146
+ end
147
+
148
+ context 'by microsoft' do
149
+ context 'in the sqlserver family' do
150
+ should 'detect the product key for various sqlserver editions' do
151
+
152
+ versions = []
153
+ versions << {:code=>90, :instance=>'mssql.1', :name=>'Microsoft SQL Server 2005'}
154
+ versions << {:code=>100, :instance=>'mssql10.1', :name=>'Microsoft SQL Server 2008'}
155
+ versions << {:code=>110, :instance=>'mssql11.1', :name=>'Microsoft SQL Server 2012'}
156
+
157
+ key_path = 'SOFTWARE\Microsoft\Microsoft SQL Server'
158
+
159
+ versions.each do |version|
160
+ @connector.stubs(:registry_subkeys_at).returns(["#{key_path}\\#{version[:instance]}"])
161
+ @connector.stubs(:registry_values_at).with("#{key_path}\\#{version[:code]}\\ProductID").returns({:digitalproductid=>@product_key_binary})
162
+ assert_equal(@expected_product_key, @target.get_product_key(version[:name]))
163
+ end
164
+ end
165
+ end
166
+
167
+ context 'in the visual studio family' do
168
+ setup do
169
+ @connector.stubs(:registry_values_at).at_least_once.returns({:pidkey=>@expected_product_key.gsub(/-/, '')})
170
+ end
171
+
172
+ should 'detect the product key for various Visual Studio editions' do
173
+ assert_equal(@expected_product_key, @target.get_product_key('Microsoft Visual Studio 2005 Professional Edition'))
174
+ assert_equal(@expected_product_key, @target.get_product_key('Microsoft Visual Studio 2008 Professional Edition'))
175
+ end
176
+ end
177
+
178
+ context "in the exchange/office/windows families" do
179
+ setup do
180
+ @connector.stubs(:registry_values_at).at_least_once.returns({:digitalproductid=>@product_key_binary})
181
+ end
182
+
183
+ should 'detect the product key for various Exchange editions' do
184
+ assert_equal(@expected_product_key, @target.get_product_key('Microsoft Exchange'))
185
+ end
186
+
187
+ should 'detect the product key for various Office and Exchange editions' do
188
+ assert_equal(@expected_product_key, @target.get_product_key('Microsoft Office Professional Edition 2003', @guid))
189
+ assert_equal(@expected_product_key, @target.get_product_key('Microsoft Office Project Server 12', @guid))
190
+ assert_equal(@expected_product_key, @target.get_product_key('Microsoft Office SharePoint Server 2007', @guid))
191
+ assert_equal(@expected_product_key, @target.get_product_key('Microsoft Office XP Professional with FrontPage', @guid))
192
+ end
193
+
194
+ should 'detect the product key for various Windows editions' do
195
+ assert_equal(@expected_product_key, @target.get_product_key('Microsoft Windows'))
196
+ end
197
+ end
198
+ end
199
+
200
+ should 'return installed applications via #get_installed_applications' do
201
+ key_path = Profiles::Windows::APP64_KEYPATH + '\{4AB6A079-178B-4144-B21F-4D1AE71666A2}'
202
+
203
+ application_data = {
204
+ :installdate=>'20120101',
205
+ :installlocation=>'',
206
+ :displayname=>'Microsoft SQL Server 2008 R2 Native Client',
207
+ :publisher=>'Microsoft Corporation',
208
+ :displayversion=>'10.50.1600.1'
209
+ }
210
+
211
+ expected_data = {
212
+ :date_installed=>DateTime.parse(application_data[:installdate]),
213
+ :install_location=>nil,
214
+ :license_key=>nil,
215
+ :name=>application_data[:displayname],
216
+ :vendor=>application_data[:publisher],
217
+ :version=>application_data[:displayversion]
218
+ }
219
+
220
+ @connector.stubs(:registry_subkeys_at).with(Profiles::Windows::ORACLE_KEYPATH).returns([])
221
+
222
+ @connector.stubs(:registry_subkeys_at).with(Profiles::Windows::APP32_KEYPATH).returns([])
223
+ @connector.stubs(:registry_subkeys_at).with(Profiles::Windows::APP64_KEYPATH).returns([key_path])
224
+
225
+ sql_key_path = 'SOFTWARE\Microsoft\Microsoft SQL Server'
226
+ @connector.stubs(:registry_subkeys_at).with(sql_key_path).returns(["#{sql_key_path}\\mssql10.1"])
227
+ @connector.stubs(:registry_values_at).with("#{sql_key_path}\\100\\ProductID").returns({})
228
+ @connector.stubs(:registry_values_at).with("#{sql_key_path}\\Setup").returns({})
229
+ @connector.stubs(:registry_values_at).with(key_path).returns(application_data)
230
+
231
+ @target.get_installed_applications
232
+
233
+ assert_equal([expected_data], @target.installed_applications)
234
+ end
235
+ end
236
+
237
+ context 'for installed patches' do
238
+ should 'parse out the patches from the registry location for applications' do
239
+ wmi_patch_data = {
240
+ :hotfixid=>'KB456789',
241
+ :installedby=>'SYSTEM',
242
+ :installedon=>'1/1/2013',
243
+ :servicepackineffect=>''
244
+ }
245
+
246
+ registry_patch_data = {
247
+ :displayname=>'KB123456',
248
+ :displayversion=>'1.0',
249
+ :installdate=>'20120101',
250
+ :installlocation=>'',
251
+ :publisher=>'Microsoft Corporation'
252
+ }
253
+ registry_patch_key_path = "#{Profiles::Windows::APP32_KEYPATH}\\#{registry_patch_data[:displayname]}"
254
+
255
+ expected_data = [
256
+ {:date_installed=>DateTime.parse(wmi_patch_data[:installedon]), :installed_by=>wmi_patch_data[:installedby], :patch_code=>wmi_patch_data[:hotfixid]},
257
+ {:date_installed=>DateTime.parse(registry_patch_data[:installdate]), :installed_by=>nil, :patch_code=>registry_patch_data[:displayname]}
258
+ ]
259
+
260
+ @connector.stubs(:values_at).returns([wmi_patch_data])
261
+
262
+ @connector.stubs(:registry_subkeys_at).with(Profiles::Windows::APP32_KEYPATH).returns([registry_patch_key_path])
263
+ @connector.stubs(:registry_subkeys_at).with(Profiles::Windows::APP64_KEYPATH).returns([])
264
+ @connector.stubs(:registry_values_at).with(registry_patch_key_path).returns(registry_patch_data)
265
+
266
+ @target.get_installed_patches
267
+
268
+ assert_equal(expected_data, @target.installed_patches)
269
+ end
270
+ end
271
+
272
+ context 'for installed services' do
273
+ setup do
274
+ @service_data = [
275
+ :name=>'Plug and Play',
276
+ :pathname=>'C:\WINDOWS\system32\services.exe',
277
+ :startmode=>'Auto'
278
+ ]
279
+
280
+ @expected_data = [{
281
+ :name=>'Plug and Play',
282
+ :install_location=>'C:\WINDOWS\system32\services.exe',
283
+ :start_mode=>'Auto'
284
+ }]
285
+ end
286
+
287
+ should 'return service information via #get_installed_services' do
288
+ @connector.stubs(:values_at).with('SELECT Name, PathName, StartMode FROM Win32_Service').returns(@service_data)
289
+
290
+ @target.get_installed_services
291
+ assert_equal(@expected_data, @target.installed_services)
292
+ end
293
+ end
294
+
295
+
296
+ context 'for local users and groups' do
297
+ should 'allow us to detect the user name of an account from its guid via #get_username' do
298
+ user_data = {:caption=>'username', :sid=>'S-1-1-1'}
299
+
300
+ @connector.stubs(:value_at).with("SELECT Caption, SID FROM Win32_UserAccount WHERE SID = '#{user_data[:sid]}'").returns(user_data)
301
+
302
+ assert_equal(user_data[:caption], @target.get_username(user_data[:sid]))
303
+ end
304
+
305
+ should 'return local user groups and accounts via #get_local_user_groups if the server is not a domain controller' do
306
+ hostname = 'SERVER01'
307
+ group = 'Users'
308
+ members = ["#{hostname}\\user1", "#{hostname}\\user2"]
309
+
310
+ wmi_member_data = [
311
+ {:partcomponent=>"\\#{hostname}\root\cimv2:Win32_UserAccount.Domain=\"#{hostname}\",Name=\"user1\""},
312
+ {:partcomponent=>"\\#{hostname}\root\cimv2:Win32_UserAccount.Domain=\"#{hostname}\",Name=\"user2\""}
313
+ ]
314
+
315
+ expected_data = [{:name=>group, :members=>members}]
316
+
317
+ @target.instance_variable_set(:@network_id, {:domain=>'mydomain.com', :hostname=>hostname})
318
+
319
+ @connector.stubs(:value_at).with('SELECT Roles FROM Win32_ComputerSystem').returns({:roles=>[]})
320
+
321
+ @connector.stubs(:values_at).with("SELECT Name FROM Win32_Group WHERE Domain = '#{hostname}'").returns([{:name=>'Users'}])
322
+ @connector.stubs(:values_at).with("SELECT * FROM Win32_GroupUser WHERE GroupComponent = \"Win32_Group.Domain='#{hostname}',Name='#{group}'\"").returns(wmi_member_data)
323
+
324
+ @target.get_local_user_groups
325
+
326
+ assert_equal(expected_data, @target.local_user_groups)
327
+ end
328
+ end
329
+
330
+ context 'for network identification' do
331
+ setup do
332
+ @expected_data = {:domain=>'mydomain.com', :name=>'SERVER01'}
333
+ end
334
+
335
+ should 'return the domain and hostname via #get_network_id' do
336
+ @connector.stubs(:value_at).with('SELECT Domain, Name FROM Win32_ComputerSystem').returns(@expected_data)
337
+ @target.get_network_id
338
+
339
+ assert_equal(@target.network_id[:domain], @expected_data[:domain])
340
+ assert_equal(@target.network_id[:hostname], @expected_data[:name])
341
+ end
342
+ end
343
+
344
+ context 'for network interfaces' do
345
+ setup do
346
+ @expected_ethernet_data = [@target.network_interface_template.merge({
347
+ :auto_negotiate=>false,
348
+ :current_speed_mbps=>1000,
349
+ :dns_servers=>['192.168.1.100', '192.168.1.101'],
350
+ :duplex=>'full',
351
+ :ip_addresses=>[{:ip_address=>'192.168.1.2', :subnet=>'255.255.255.0'}],
352
+ :is_uplink=>false,
353
+ :mac_address=>'01:01:01:01:01:01',
354
+ :model=>'Intel PRO/1000',
355
+ :model_id=>'0x1234',
356
+ :mtu=>1400,
357
+ :name=>'Local Area Connection',
358
+ :status=>'up',
359
+ :type=>'ethernet',
360
+ :vendor=>'Intel Corp.',
361
+ :vendor_id=>'0x1234'
362
+ })]
363
+
364
+ @expected_fibre_data = @target.network_interface_template.merge({
365
+ :current_speed_mbps=>4000,
366
+ :fabric_name=>'00000000aaaaaaaa',
367
+ :is_uplink=>false,
368
+ :model=>'QLogic Fibre Channel Adapter',
369
+ :model_id=>'0x1234',
370
+ :name=>'fc0',
371
+ :node_wwn=>'00000000aaaaaaaa',
372
+ :port_wwn=>'00000000aaaaaaaa',
373
+ :status=>'up',
374
+ :type=>'fibre',
375
+ :vendor=>'QLogic Corp.',
376
+ :vendor_id=>'0x1234'
377
+ })
378
+ end
379
+
380
+ should 'return ethernet interface information via #get_network_interfaces' do
381
+
382
+ expected_ethernet_data = @expected_ethernet_data[0]
383
+
384
+ @connector.stubs(:values_at).with('SELECT InstanceName, Manufacturer, ModelDescription FROM MSFC_FCAdapterHBAAttributes', :root_wmi).returns([])
385
+ @connector.stubs(:values_at).with('SELECT Attributes, InstanceName FROM MSFC_FibrePortHBAAttributes', :root_wmi).returns([])
386
+
387
+ ethernet_guid = '{1234ABCD}'
388
+ nic_keypath = Profiles::Windows::NIC_CFG_KEYPATH
389
+ ethernet_data = [{
390
+ :index=>1,
391
+ :macaddress=>expected_ethernet_data[:mac_address],
392
+ :manufacturer=>expected_ethernet_data[:vendor],
393
+ :netconnectionid=>expected_ethernet_data[:name],
394
+ :netconnectionstatus=>2,
395
+ :productname=>expected_ethernet_data[:model]
396
+ }]
397
+
398
+ @connector.stubs(:values_at).with('SELECT Index, MACAddress, Manufacturer, NetConnectionID, NetConnectionStatus, ProductName FROM Win32_NetworkAdapter WHERE NetConnectionID IS NOT NULL').returns(ethernet_data)
399
+
400
+ adapter_config_data = {
401
+ :dnsserversearchorder=>expected_ethernet_data[:dns_servers],
402
+ :ipaddress=>expected_ethernet_data[:ip_addresses].collect{|ip| ip[:ip_address]},
403
+ :ipsubnet=>expected_ethernet_data[:ip_addresses].collect{|ip| ip[:subnet]}[0],
404
+ :settingid=>ethernet_guid
405
+ }
406
+ @connector.stubs(:value_at).with("SELECT DNSServerSearchOrder, IPAddress, IPSubnet, SettingID FROM Win32_NetworkAdapterConfiguration WHERE Index = #{ethernet_data[0][:index]}").returns(adapter_config_data)
407
+
408
+ enum_adapter_data = {:devicename=>"\\DEVICE\\#{ethernet_guid}", :instancename=>expected_ethernet_data[:model]}
409
+
410
+ nic_cfg_path = nic_keypath + "\\0001"
411
+
412
+ @connector.stubs(:registry_values_at).with(nic_cfg_path + '\\Linkage').returns(:export=>[enum_adapter_data[:devicename]])
413
+ @connector.stubs(:registry_values_at).with(nic_cfg_path).returns({:matchingdeviceid=>'pci\\ven_1234&dev_1234', :speedduplex=>1})
414
+ @connector.stubs(:registry_subkeys_at).with(nic_cfg_path + "\\Ndi\\params").returns([nic_cfg_path + '\\SpeedDuplex'])
415
+ @connector.stubs(:registry_values_at).with(nic_cfg_path + "\\Ndi\\params\\speedduplex\\Enum").returns({'1'.to_sym=>'1000Mbps/Full Duplex'})
416
+
417
+ @connector.stubs(:value_at).with("SELECT InstanceName FROM MSNdis_EnumerateAdapter WHERE DeviceName = '#{enum_adapter_data[:devicename].gsub(/\\/, '\\\\\\')}'", :root_wmi).returns(enum_adapter_data)
418
+ linkspeed_data = {:instancename=>expected_ethernet_data[:model], :ndislinkspeed=>10000000}
419
+ @connector.stubs(:value_at).with("SELECT NdisLinkSpeed FROM MSNdis_LinkSpeed WHERE InstanceName = '#{expected_ethernet_data[:model]}'", :root_wmi).returns(linkspeed_data)
420
+
421
+ @connector.stubs(:registry_values_at).with(Profiles::Windows::TCPIP_CFG_KEYPATH + "\\#{ethernet_guid}").returns({:mtu=>1400})
422
+
423
+ @target.get_network_interfaces
424
+ assert_equal(@expected_ethernet_data, @target.network_interfaces)
425
+ end
426
+
427
+ should 'return fibre channel interface information via #get_network_interfaces' do
428
+ @connector.stubs(:values_at).with('SELECT Index, MACAddress, Manufacturer, NetConnectionID, NetConnectionStatus, ProductName FROM Win32_NetworkAdapter WHERE NetConnectionID IS NOT NULL').returns([])
429
+
430
+ hba_data = {
431
+ :instancename=>'pci\\ven_1234&dev_1234',
432
+ :manufacturer=>@expected_fibre_data[:vendor],
433
+ :modeldescription=>@expected_fibre_data[:model]
434
+ }
435
+
436
+ wwn = [0, 0, 0, 0, 170, 170, 170, 170]
437
+ hba_profile = {
438
+ :fabricname=>wwn,
439
+ :instancename=>hba_data[:instancename],
440
+ :portspeed=>8,
441
+ :nodewwn=>wwn,
442
+ :portwwn=>wwn
443
+ }
444
+
445
+ @connector.stubs(:values_at).with('SELECT InstanceName, Manufacturer, ModelDescription FROM MSFC_FCAdapterHBAAttributes', :root_wmi).returns([hba_data])
446
+
447
+ @connector.stubs(:values_at).with("SELECT Attributes, InstanceName FROM MSFC_FibrePortHBAAttributes", :root_wmi).returns([hba_profile])
448
+
449
+ @target.get_network_interfaces
450
+
451
+ assert_equal([@expected_fibre_data], @target.network_interfaces)
452
+ end
453
+ end
454
+
455
+ context 'for operating system information' do
456
+ setup do
457
+ @os_data = {
458
+ :caption=>'Microsoft(R) Windows(R) Server 2003, Standard Edition',
459
+ :csdversion=>'Service Pack 2',
460
+ :installdate=>'20130101000000.000000-000',
461
+ :othertypedescription=>'R2',
462
+ :roles=>[],
463
+ :version=>'5.2.3790'
464
+ }
465
+
466
+ product_key_binary = [164, 1, 1, 0, 3, 0, 0, 0, 53, 53, 48, 52, 49, 45, 49, 56, 54, 45, 48, 49, 51, 51, 48,
467
+ 51, 53, 45, 55, 53, 55, 54, 51, 0, 151, 0, 0, 0, 88, 49, 52, 45, 50, 51, 56, 57, 54, 0, 0, 0, 0, 0, 0, 0,
468
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 223, 75, 219, 238, 3, 102, 3, 0, 0,
469
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
470
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
471
+ 0, 0, 0, 0, 0, 0, 0, 148, 135, 143, 209]
472
+
473
+ @connector.stubs(:value_at).with('SELECT Roles FROM Win32_ComputerSystem').returns(:roles=>[])
474
+ @connector.stubs(:value_at).with('SELECT Caption, CSDVersion, InstallDate, OtherTypeDescription, Version FROM Win32_OperatingSystem').returns(@os_data)
475
+ @connector.stubs(:registry_values_at).with('SOFTWARE\Microsoft\Windows NT\CurrentVersion').returns({:digitalproductid=>product_key_binary})
476
+
477
+ @expected_data = {
478
+ :date_installed=>DateTime.parse(@os_data[:installdate]),
479
+ :features=>[],
480
+ :kernel=>@os_data[:version],
481
+ :license_key=>'BBBBB-BBBBB-BBBBB-BBBBB-BBBBB',
482
+ :name=>'Microsoft Windows',
483
+ :roles=>@os_data[:roles],
484
+ :service_pack=>@os_data[:csdversion],
485
+ :version=>'Server 2003 R2 Standard'
486
+ }
487
+ end
488
+
489
+ should 'return operating system information via #get_operating_system' do
490
+ @target.get_operating_system
491
+ assert_equal(@expected_data, @target.operating_system)
492
+ end
493
+
494
+ context 'of a windows 2008 host' do
495
+ setup do
496
+ @target.extend(Profiles::Windows::Windows2008)
497
+ @features_qry = 'SELECT Name FROM Win32_ServerFeature'
498
+ @features_data = [{:name=>'File Server'}, {:name=>'Print Server'}]
499
+ @connector.stubs(:values_at).with(@features_qry).returns(@features_data)
500
+
501
+ @expected_data[:features] = @features_data.map{|h| h[:name]}
502
+ end
503
+
504
+ should 'return the enabled OS features of the OS (only for windows 2008)' do
505
+ @connector.stubs(:values_at).with(@features_qry).returns(@features_data)
506
+ @target.get_operating_system
507
+ assert_equal(@expected_data, @target.operating_system)
508
+ end
509
+ end
510
+ end
511
+
512
+ # context 'for system roles' do
513
+ # should 'return a list of system roles via #get_system_roles' do
514
+ # expected_data = [
515
+ # 'PrimaryDomainController',
516
+ # 'IIS7',
517
+ # 'OracleRDMS',
518
+ # 'TerminalServer',
519
+ # 'TerminalServicesLicenseServer'
520
+ # ]
521
+
522
+ # @connector.stubs(:value_at).with('SELECT Roles FROM Win32_ComputerSystem').returns({:roles=>['Primary_Domain_Controller']})
523
+ # @connector.stubs(:registry_values_at).with(Profiles::Windows::IIS_KEYPATH).returns({:majorversion=>7})
524
+ # oracle_key = "#{Profiles::Windows::ORACLE_KEYPATH}\\KEY_OracleHome11g"
525
+ # @connector.stubs(:registry_subkeys_at).with(Profiles::Windows::ORACLE_KEYPATH).returns([oracle_key])
526
+ # @connector.stubs(:registry_values_at).with(oracle_key).returns({:oracle_group_name=>'Oracle - Orahome11g'})
527
+
528
+ # @connector.stubs(:value_at).with('SELECT TerminalServerMode FROM Win32_TerminalServiceSetting').returns({:terminalservermode=>1})
529
+ # @connector.stubs(:value_at).with("SELECT * FROM Win32_Service WHERE Caption = 'Terminal Server Licensing'").returns(true)
530
+
531
+ # @target.get_system_roles
532
+ # end
533
+ # end
534
+ end
535
+ end
536
+ end