sys-uname 0.7.4-mswin32

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.
data/CHANGES ADDED
@@ -0,0 +1,115 @@
1
+ == 0.7.4 - 19-Nov-2006
2
+ * Internal layout changes, doc updates and gemspec improvements.
3
+ * No code changes.
4
+
5
+ == 0.7.3 - 30-Jul-2006
6
+ * Bug fix for 64 bit platforms.
7
+ * Minor modification of the extconf.rb file.
8
+
9
+ == 0.7.2 - 5-Jul-2006
10
+ * Removed '?' from the struct member names on MS Windows since these are no
11
+ longer legal.
12
+ * Removed duplicate definition of Uname.version on MS Windows (oops).
13
+ * Added a gemspec.
14
+ * Added inline rdoc documentation to the source files.
15
+
16
+ == 0.7.1 - 5-May-2005
17
+ * Removed the uname.rd file. The uname.txt file is rdoc friendly, so you
18
+ can autogenerate html from that file if you wish.
19
+ * Removed the version.h file - no longer needed now that the Windows version
20
+ is pure Ruby.
21
+ * Renamed test.rb to uname_test.rb
22
+ * Minor setup modifications to the test suite.
23
+ * This package is now hosted on RubyForge.
24
+
25
+ == 0.7.0 - 11-Jan-2004
26
+ * Scrapped the C version for Windows in favor of a pure Ruby version that uses
27
+ WMI + OLE. I highly recommend using Ruby 1.8.2 or later on Win32 systems.
28
+ Earlier versions may cause segfaults.
29
+ * Added the isa_list, hw_provider, hw_serial_number, srpc_domain and
30
+ dhcp_cache methods for Solaris.
31
+ * Added install.rb program for Windows, and modified extconf.rb to only run on
32
+ non-Windows systems.
33
+ * The 'examples' directory has been moved to the toplevel directory.
34
+ * Removed the INSTALL file. That information is now included in the README.
35
+ * Documentation updates.
36
+
37
+ == 0.6.1 - 25-Apr-2004
38
+ * Simplified extconf.rb script and installation instructions.
39
+ * Combined three test scripts into a single test script.
40
+ * Warranty information added.
41
+
42
+ == 0.6.0 - 25-Jun-2003
43
+ * Added HP-UX support, including the id() class method (HP-UX only)
44
+ * Fixed minor bug in extconf.rb (forgot 'require ftools' at top)
45
+ * Added HP-UX specific tests and support
46
+ * Made test.rb friendlier for folks without TestUnit installed
47
+
48
+ == 0.5.0 - 16-Jun-2003
49
+ * Added OS X support, including the "model" method. Thanks to Mike Hall
50
+ for the patch
51
+ * Removed VERSION() class method. Use the constant instead
52
+ * Moved rd documentation to its own file (under /doc directory)
53
+ * Added a version.h file under 'lib' to store VERSION info for
54
+ all source files
55
+ * Modified extconf.rb file to handle OS X support. In addition, moved
56
+ test.rb into a static file under /test, instead of dynamically
57
+ generating it
58
+ * Fixed up test suite. Added OS X specific tests and support. Should now
59
+ work with TestUnit 0.1.6 or later
60
+
61
+ == 0.4.1 - 7-Feb-2003
62
+ * Fixed C89 issue (again) - thanks go to Daniel Zepeda for the spot
63
+ * Fixed bugs in extconf.rb file (rescue clause, ftools)
64
+
65
+ == 0.4.0 - 6-Feb-2003
66
+ * MS Windows support!
67
+ * Added a test suite and automatic test.rb creation
68
+ * Documentation additions/fixes
69
+ * Internal directory layout and filename changes (Changelog -> CHANGES)
70
+
71
+ == 0.3.3 - 6-Jan-2003
72
+ * Made the code C89 compliant for older compilers. Thanks to Paul Brannan
73
+ for teaching me how to fix this in general.
74
+ * Moved README to doc/uname.txt
75
+ * Created an INSTALL file
76
+ * Added a copyright notice
77
+ * Added a VERSION class method
78
+ * Changed tarball name to reflect RAA package name
79
+ * Minor doc changes
80
+
81
+ == 0.3.2 - 8-Aug-2002
82
+ * Changed the struct name returned by the 'uname()' method from
83
+ "Uname::UnameStruct" to just "UnameStruct". This was to make it
84
+ compliant with future versions of Ruby. The extra namespace was
85
+ redundant anyway.
86
+ * I include the documentation now, instead of making you install rd2 :)
87
+
88
+ == 0.3.1 - 22-Jul-2002
89
+ * Added the 'uname' class method, which returns a struct that contains all
90
+ of the uname information
91
+ * Added a test script. Do 'ruby test.rb' to run it.
92
+ * If rd2 is installed on your system, the documentation is automatically
93
+ generated for you.
94
+ * Moved html documentation to 'doc' directory.
95
+ * Changed version number style to be consistent with other 'Sys' modules
96
+ * Now installs into 'Sys-Uname-x.x.x' directory (instead of just 'Uname')
97
+
98
+ == 0.03 - 6-June-2002
99
+ * rd style documentation now inline
100
+ * README.html is now uname.html - created via rdtool
101
+ * The 'platform()' and 'architecture()' methods have been added for Solaris
102
+ * You can now do an 'include Sys' to shorten your syntax
103
+ * The whole 'Sys' class has been removed. Delete your sys.so file if you
104
+ installed a previous version of Sys-Uname
105
+
106
+ == 0.02 - 3-June-2002
107
+ * Potentially fatal memory problems corrected.
108
+ * Should now build with C++ as well
109
+ * Thanks to Mike Hall for both the spot and the fix
110
+ * Added a Changelog file
111
+ * Added a README.html file
112
+ * Added a Manifest file
113
+
114
+ == 0.01 - 31-May-2002
115
+ * Initial release (unannounced)
data/MANIFEST ADDED
@@ -0,0 +1,16 @@
1
+ install.rb
2
+ MANIFEST
3
+ CHANGES
4
+ README
5
+ sys-uname.gemspec
6
+
7
+ doc/uname.txt
8
+
9
+ examples/uname_test.rb
10
+
11
+ ext/extconf.rb
12
+ ext/uname.c
13
+
14
+ lib/sys/uname.rb
15
+
16
+ test/tc_uname.rb
data/README ADDED
@@ -0,0 +1,42 @@
1
+ = Prerequisites
2
+ === Unix
3
+ Ruby 1.8.0 or later.
4
+ === MS Windows
5
+ Ruby 1.8.2 or later. Earlier versions segfault due to OLE bugs.
6
+ Active WMI service (normally on by default).
7
+
8
+ = Installation
9
+ === Unix
10
+ ruby extconf.rb
11
+ make
12
+ ruby test/tc_uname.rb (optional)
13
+ make site-install
14
+ === MS Windows
15
+ ruby test\tc_uname.rb (optional)
16
+ ruby install.rb
17
+
18
+ = Synopsis
19
+ require 'sys/uname'
20
+ include Sys
21
+
22
+ p Uname.uname
23
+
24
+ = Solaris Notes
25
+ Folks building this package on SunOS get two extra methods: architecture()
26
+ and platform()
27
+
28
+ = OS X Notes
29
+ OS X users get the extra method "model()".
30
+
31
+ = HP-UX Notes
32
+ HP-UX users get the extra method "id()". This is actually a String, not
33
+ a Fixnum, because that's how it's defined in the utsname struct.
34
+
35
+ = MS Windows Notes
36
+ The C version for Windows has been completely scrapped in favor of an OLE
37
+ plus WMI approach. It is pure Ruby. Please see the MSDN documentation for
38
+ the Win32_OperatingSystem class for a complete list of what each of the
39
+ UnameStruct members mean.
40
+
41
+ = Documentation
42
+ For more details, see the 'uname.txt' file under the 'doc' directory.
data/doc/uname.txt ADDED
@@ -0,0 +1,122 @@
1
+ == Description
2
+ A Ruby interface to the 'uname' command.
3
+
4
+ == Synopsis
5
+ require 'sys/uname'
6
+ include Sys
7
+
8
+ puts Uname.nodename
9
+ puts Uname.version
10
+ puts Uname.sysname
11
+ puts Uname.machine
12
+ puts Uname.release
13
+
14
+ p Uname.uname
15
+
16
+ == Constants
17
+ VERSION
18
+ The current version number of sys-uname.
19
+
20
+ == Class Methods
21
+ Uname.sysname
22
+ Returns the operating system name. e.g. "SunOS"
23
+
24
+ Uname.nodename
25
+ Returns the nodename. This is usually, but not necessarily, the
26
+ same as the system's hostname.
27
+
28
+ You cannot currently set the nodename (root or otherwise). This may
29
+ be added in a future release.
30
+
31
+ Uname.machine
32
+ Returns the machine hardware type. e.g. "i686"
33
+
34
+ Uname.version
35
+ Returns the operating system version. e.g. "5.8". In the case of MS
36
+ Windows, it returns the version plus patch information, separated by
37
+ a hyphen, e.g. "2915-Service Pack 2".
38
+
39
+ Uname.release
40
+ Returns the operating system release. e.g. "2.2.16-3"
41
+
42
+ Uname.uname
43
+ Returns a struct of type UnameStruct that contains sysname, nodename,
44
+ machine, version, and release. On Solaris, it will also include
45
+ architecture and platform. On HP-UX, it will also include id.
46
+
47
+ MS Windows - there are many more, and different, fields in the struct.
48
+ Please see the MSDN documenation for a complete explanation of what
49
+ each of these members mean.
50
+
51
+ == Solaris Only
52
+ Uname.architecture
53
+ Returns the instruction set architecture. e.g. "sparc"
54
+
55
+ Uname.platform
56
+ Returns the platform identifier. e.g. "SUNW,Sun-Blade-100"
57
+
58
+ Uname.isa_list
59
+ Returns a space separated string containing a list of all variant
60
+ instruction set architectures executable on the current system.
61
+
62
+ They are listed in order of performance, from best to worst.
63
+
64
+ Uname.hw_provider
65
+ Returns the name of the hardware manufacturer.
66
+
67
+ Uname.hw_serial_number
68
+ Returns the ASCII representation of the hardware-specific serial number
69
+ of the machine that executes the function.
70
+
71
+ Uname.srpc_domain
72
+ Returns the name of the Secure Remote Procedure Call domain, if any.
73
+
74
+ Uname.dhcp_cache
75
+ Returns a hexidecimal encoding, in String form, of the name of the
76
+ interface configured by boot(1M) followed by the DHCPACK reply from
77
+ the server.
78
+
79
+ == OS X Only
80
+ Uname.model
81
+ Returns the model type, e.g. "PowerBook5,1"
82
+
83
+ == HP-UX Only
84
+ Uname.id
85
+ Returns the id number, e.g. 234233587. This is a String, not a Fixnum.
86
+
87
+ == Notes
88
+ Not all of the information that you might be used to seeing with
89
+ a 'uname -a' is available. This may be added in future releases,
90
+ but since different implementations provide different information
91
+ (via different header files) it will be a bit of a pain.
92
+
93
+ Windows users - please see the MSDN documentation for the
94
+ Win32_OperatingSystem class for a complete list of what each of the
95
+ UnameStruct members mean.
96
+
97
+ == Known Bugs
98
+ None that I'm aware of. Please log any bugs on the project page at
99
+ http://www.rubyforge.org/projects/sysutils.
100
+
101
+ == Future Plans
102
+ Add additional info for Linux, Solaris, BSD.
103
+
104
+ == License
105
+ Ruby's
106
+
107
+ == Copyright
108
+ (C) 2002-2006 Daniel J. Berger
109
+ All Rights Reserved
110
+
111
+ == Warranty
112
+ This package is provided "as is" and without any express or
113
+ implied warranties, including, without limitation, the implied
114
+ warranties of merchantability and fitness for a particular purpose.
115
+
116
+ == Author
117
+ Daniel Berger
118
+ djberg96 at gmail dot com
119
+ imperator on IRC (Freenode)
120
+
121
+ == See Also
122
+ uname(1) for unix, or WMI for MS Windows.
data/install.rb ADDED
@@ -0,0 +1,30 @@
1
+ ###############################################
2
+ # install.rb
3
+ #
4
+ # This is used for MS Windows only.
5
+ ###############################################
6
+ require "ftools"
7
+ require "rbconfig"
8
+ include Config
9
+
10
+ unless RUBY_PLATFORM.match('mswin')
11
+ STDERR.puts "Run 'ruby extconf.rb; make; make site-install' instead"
12
+ STDERR.puts "Exiting..."
13
+ end
14
+
15
+ sitelibdir = CONFIG["sitelibdir"]
16
+ file = nil
17
+
18
+ file = "lib/sys/uname.rb"
19
+ install_dir = sitelibdir + "/sys"
20
+
21
+ unless File.exist?(install_dir)
22
+ begin
23
+ Dir.mkdir(install_dir)
24
+ rescue Exception => e
25
+ STDERR.puts "Unable to create #{install_dir}: #{e}"
26
+ exit
27
+ end
28
+ end
29
+
30
+ File.copy(file, install_dir, true)
data/lib/sys/uname.rb ADDED
@@ -0,0 +1,464 @@
1
+ require 'win32ole'
2
+ require 'socket'
3
+ require 'parsedate'
4
+
5
+ module Sys
6
+ # This is the error raised if any of the Sys::Uname methods should fail.
7
+ class UnameError < StandardError; end
8
+
9
+ # An interface for returning uname (platform) information.
10
+ class Uname
11
+ VERSION = '0.7.4'
12
+
13
+ fields = %w/
14
+ boot_device
15
+ build_number
16
+ build_type
17
+ caption
18
+ code_set
19
+ country_code
20
+ creation_class_name
21
+ cscreation_class_name
22
+ csd_version
23
+ cs_name
24
+ current_time_zone
25
+ debug
26
+ description
27
+ distributed
28
+ foreground_application_boost
29
+ free_physical_memory
30
+ free_space_in_paging_files
31
+ free_virtual_memory
32
+ install_date
33
+ last_bootup_time
34
+ local_date_time
35
+ locale
36
+ manufacturer
37
+ max_number_of_processes
38
+ max_process_memory_size
39
+ name
40
+ number_of_licensed_users
41
+ number_of_processes
42
+ number_of_users
43
+ organization
44
+ os_language
45
+ os_product_suite
46
+ os_type
47
+ other_type_description
48
+ plus_product_id
49
+ plus_version_number
50
+ primary
51
+ quantum_length
52
+ quantum_type
53
+ registered_user
54
+ serial_number
55
+ service_pack_major_version
56
+ service_pack_minor_version
57
+ size_stored_in_paging_files
58
+ status
59
+ system_device
60
+ system_directory
61
+ total_swap_space_size
62
+ total_virtual_memory_size
63
+ total_visible_memory_size
64
+ version
65
+ windows_directory
66
+ /
67
+
68
+ UnameStruct = Struct.new("UnameStruct", *fields)
69
+
70
+ #########################################################################
71
+ # The instance name is unpredictable, so we have to resort to using
72
+ # the 'InstancesOf' method to get the data we need, rather than
73
+ # including it as part of the connection.
74
+ #########################################################################
75
+
76
+ # Returns the version plus patch information of the operating system,
77
+ # separated by a hyphen, e.g. "2915-Service Pack 2".
78
+ #
79
+ def self.version(host=Socket.gethostname)
80
+ cs = "winmgmts://#{host}/root/cimv2"
81
+ begin
82
+ wmi = WIN32OLE.connect(cs)
83
+ rescue WIN32OLERuntimeError => e
84
+ raise UnameError, e
85
+ else
86
+ query = "select * from Win32_OperatingSystem"
87
+ wmi.InstancesOf("Win32_OperatingSystem").each{ |ole|
88
+ str = "#{ole.Version} #{ole.BuildNumber}-"
89
+ str << "#{ole.ServicePackMajorVersion}"
90
+ return str
91
+ }
92
+ end
93
+ end
94
+
95
+ # Returns the operating system name, e.g. "Microsoft Windows XP Home"
96
+ #
97
+ def self.sysname(host=Socket.gethostname)
98
+ cs = "winmgmts:{impersonationLevel=impersonate,(security)}"
99
+ cs << "//#{host}/root/cimv2"
100
+ begin
101
+ wmi = WIN32OLE.connect(cs)
102
+ rescue WIN32OLERuntimeError => e
103
+ raise UnameError, e
104
+ else
105
+ query = "select * from Win32_OperatingSystem"
106
+ wmi.InstancesOf("Win32_OperatingSystem").each{ |ole|
107
+ return ole.Caption
108
+ }
109
+ end
110
+ end
111
+
112
+ # Returns the nodename. This is usually, but not necessarily, the
113
+ # same as the system's hostname.
114
+ #
115
+ def self.nodename(host=Socket.gethostname)
116
+ cs = "winmgmts:{impersonationLevel=impersonate,(security)}"
117
+ cs << "//#{host}/root/cimv2"
118
+ begin
119
+ wmi = WIN32OLE.connect(cs)
120
+ rescue WIN32OLERuntimeError => e
121
+ raise UnameError, e
122
+ else
123
+ query = "select * from Win32_OperatingSystem"
124
+ wmi.InstancesOf("Win32_OperatingSystem").each{ |ole|
125
+ return ole.CSName
126
+ }
127
+ end
128
+ end
129
+
130
+ # Returns the machine hardware type. e.g. "i686".
131
+ #--
132
+ # This may or may not return the expected value because some CPU types
133
+ # were unknown to the OS when the OS was originally released. It
134
+ # appears that MS doesn't necessarily patch this, either.
135
+ #
136
+ def self.machine(cpu_num=0, host=Socket.gethostname)
137
+ cs = "winmgmts:{impersonationLevel=impersonate,(security)}"
138
+ cs << "//#{host}/root/cimv2:Win32_Processor='cpu#{cpu_num}'"
139
+ begin
140
+ wmi = WIN32OLE.connect(cs)
141
+ rescue WIN32OLERuntimeError => e
142
+ raise UnameError, e
143
+ else
144
+ # Convert a family number into the equivalent string
145
+ case wmi.Family
146
+ when 1
147
+ return "Other"
148
+ when 2
149
+ return "Unknown"
150
+ when 3
151
+ return "8086"
152
+ when 4
153
+ return "80286"
154
+ when 5
155
+ return "80386"
156
+ when 6
157
+ return "80486"
158
+ when 7
159
+ return "8087"
160
+ when 8
161
+ return "80287"
162
+ when 9
163
+ return "80387"
164
+ when 10
165
+ return "80487"
166
+ when 11
167
+ return "Pentium brand"
168
+ when 12
169
+ return "Pentium Pro"
170
+ when 13
171
+ return "Pentium II"
172
+ when 14
173
+ return "Pentium processor with MMX technology"
174
+ when 15
175
+ return "Celeron"
176
+ when 16
177
+ return "Pentium II Xeon"
178
+ when 17
179
+ return "Pentium III"
180
+ when 18
181
+ return "M1 Family"
182
+ when 19
183
+ return "M2 Family"
184
+ when 24
185
+ return "K5 Family"
186
+ when 25
187
+ return "K6 Family"
188
+ when 26
189
+ return "K6-2"
190
+ when 27
191
+ return "K6-3"
192
+ when 28
193
+ return "AMD Athlon Processor Family"
194
+ when 29
195
+ return "AMD Duron Processor"
196
+ when 30
197
+ return "AMD2900 Family"
198
+ when 31
199
+ return "K6-2+"
200
+ when 32
201
+ return "Power PC Family"
202
+ when 33
203
+ return "Power PC 601"
204
+ when 34
205
+ return "Power PC 603"
206
+ when 35
207
+ return "Power PC 603+"
208
+ when 36
209
+ return "Power PC 604"
210
+ when 37
211
+ return "Power PC 620"
212
+ when 38
213
+ return "Power PC X704"
214
+ when 39
215
+ return "Power PC 750"
216
+ when 48
217
+ return "Alpha Family"
218
+ when 49
219
+ return "Alpha 21064"
220
+ when 50
221
+ return "Alpha 21066"
222
+ when 51
223
+ return "Alpha 21164"
224
+ when 52
225
+ return "Alpha 21164PC"
226
+ when 53
227
+ return "Alpha 21164a"
228
+ when 54
229
+ return "Alpha 21264"
230
+ when 55
231
+ return "Alpha 21364"
232
+ when 64
233
+ return "MIPS Family"
234
+ when 65
235
+ return "MIPS R4000"
236
+ when 66
237
+ return "MIPS R4200"
238
+ when 67
239
+ return "MIPS R4400"
240
+ when 68
241
+ return "MIPS R4600"
242
+ when 69
243
+ return "MIPS R10000"
244
+ when 80
245
+ return "SPARC Family"
246
+ when 81
247
+ return "SuperSPARC"
248
+ when 82
249
+ return "microSPARC II"
250
+ when 83
251
+ return "microSPARC IIep"
252
+ when 84
253
+ return "UltraSPARC"
254
+ when 85
255
+ return "UltraSPARC II"
256
+ when 86
257
+ return "UltraSPARC IIi"
258
+ when 87
259
+ return "UltraSPARC III"
260
+ when 88
261
+ return "UltraSPARC IIIi"
262
+ when 96
263
+ return "68040"
264
+ when 97
265
+ return "68xxx Family"
266
+ when 98
267
+ return "68000"
268
+ when 99
269
+ return "68010"
270
+ when 100
271
+ return "68020"
272
+ when 101
273
+ return "68030"
274
+ when 112
275
+ return "Hobbit Family"
276
+ when 120
277
+ return "Crusoe TM5000 Family"
278
+ when 121
279
+ return "Crusoe TM3000 Family"
280
+ when 128
281
+ return "Weitek"
282
+ when 130
283
+ return "Itanium Processor"
284
+ when 144
285
+ return "PA-RISC Family"
286
+ when 145
287
+ return "PA-RISC 8500"
288
+ when 146
289
+ return "PA-RISC 8000"
290
+ when 147
291
+ return "PA-RISC 7300LC"
292
+ when 148
293
+ return "PA-RISC 7200"
294
+ when 149
295
+ return "PA-RISC 7100LC"
296
+ when 150
297
+ return "PA-RISC 7100"
298
+ when 160
299
+ return "V30 Family"
300
+ when 176
301
+ return "Pentium III Xeon�"
302
+ when 177
303
+ return "Pentium III Processor with Intel SpeedStep Technology"
304
+ when 178
305
+ return "Pentium 4"
306
+ when 179
307
+ return "Intel Xeon�"
308
+ when 180
309
+ return "AS400 Family"
310
+ when 181
311
+ return "Intel Xeon processor MP"
312
+ when 182
313
+ return "AMD AthlonXP Family"
314
+ when 183
315
+ return "AMD AthlonMP Family"
316
+ when 184
317
+ return "Intel Itanium 2"
318
+ when 185
319
+ return "AMD Opteron� Family"
320
+ when 190
321
+ return "K7"
322
+ when 200
323
+ return "IBM390 Family"
324
+ when 201
325
+ return "G4"
326
+ when 202
327
+ return "G5"
328
+ when 250
329
+ return "i860"
330
+ when 251
331
+ return "i960"
332
+ when 260
333
+ return "SH-3"
334
+ when 261
335
+ return "SH-4"
336
+ when 280
337
+ return "ARM"
338
+ when 281
339
+ return "StrongARM"
340
+ when 300
341
+ return "6x86"
342
+ when 301
343
+ return "MediaGX"
344
+ when 302
345
+ return "MII"
346
+ when 320
347
+ return "WinChip"
348
+ when 350
349
+ return "DSP"
350
+ when 500
351
+ return "Video Processor"
352
+ else
353
+ return "Unknown"
354
+ end
355
+ end
356
+ end
357
+
358
+ # Returns the release number, e.g. 5.1.2600.
359
+ #
360
+ def self.release(host=Socket.gethostname)
361
+ cs = "winmgmts://#{host}/root/cimv2"
362
+ begin
363
+ wmi = WIN32OLE.connect(cs)
364
+ rescue WIN32OLERuntimeError => e
365
+ raise UnameError, e
366
+ else
367
+ query = "select * from Win32_OperatingSystem"
368
+ wmi.InstancesOf("Win32_OperatingSystem").each{ |ole|
369
+ return ole.Version
370
+ }
371
+ end
372
+ end
373
+
374
+ # Returns a struct of type UnameStruct that contains sysname, nodename,
375
+ # machine, version, and release, as well as a plethora of other fields.
376
+ # Please see the MSDN documentation for what each of these fields mean.
377
+ #
378
+ def self.uname(host=Socket.gethostname)
379
+ cs = "winmgmts://#{host}/root/cimv2"
380
+ begin
381
+ wmi = WIN32OLE.connect(cs)
382
+ rescue WIN32OLERuntimeError => e
383
+ raise UnameError, e
384
+ else
385
+ query = "select * from Win32_OperatingSystem"
386
+ wmi.InstancesOf("Win32_OperatingSystem").each{ |os|
387
+ return UnameStruct.new(
388
+ os.BootDevice,
389
+ os.BuildNumber,
390
+ os.BuildType,
391
+ os.Caption,
392
+ os.CodeSet,
393
+ os.CountryCode,
394
+ os.CreationClassName,
395
+ os.CSCreationClassName,
396
+ os.CSDVersion,
397
+ os.CSName,
398
+ os.CurrentTimeZone,
399
+ os.Debug,
400
+ os.Description,
401
+ os.Distributed,
402
+ os.ForegroundApplicationBoost,
403
+ self.convert(os.FreePhysicalMemory),
404
+ self.convert(os.FreeSpaceInPagingFiles),
405
+ self.convert(os.FreeVirtualMemory),
406
+ self.parse_ms_date(os.InstallDate),
407
+ self.parse_ms_date(os.LastBootUpTime),
408
+ self.parse_ms_date(os.LocalDateTime),
409
+ os.Locale,
410
+ os.Manufacturer,
411
+ os.MaxNumberOfProcesses,
412
+ self.convert(os.MaxProcessMemorySize),
413
+ os.Name,
414
+ os.NumberOfLicensedUsers,
415
+ os.NumberOfProcesses,
416
+ os.NumberOfUsers,
417
+ os.Organization,
418
+ os.OSLanguage,
419
+ os.OSProductSuite,
420
+ os.OSType,
421
+ os.OtherTypeDescription,
422
+ os.PlusProductID,
423
+ os.PlusVersionNumber,
424
+ os.Primary,
425
+ os.QuantumLength,
426
+ os.QuantumType,
427
+ os.RegisteredUser,
428
+ os.SerialNumber,
429
+ os.ServicePackMajorVersion,
430
+ os.ServicePackMinorVersion,
431
+ self.convert(os.SizeStoredInPagingFiles),
432
+ os.Status,
433
+ os.SystemDevice,
434
+ os.SystemDirectory,
435
+ self.convert(os.TotalSwapSpaceSize),
436
+ self.convert(os.TotalVirtualMemorySize),
437
+ self.convert(os.TotalVisibleMemorySize),
438
+ os.Version,
439
+ os.WindowsDirectory
440
+ )
441
+ }
442
+ end
443
+ end
444
+
445
+ private
446
+
447
+ # Converts a string in the format '20040703074625.015625-360' into a
448
+ # Ruby Time object.
449
+ #
450
+ def self.parse_ms_date(str)
451
+ return if str.nil?
452
+ parsed = ParseDate.parsedate(str)
453
+ return Time.mktime(*parsed)
454
+ end
455
+
456
+ # There is a bug in win32ole where uint64 types are returned as a
457
+ # String rather than a Fixnum/Bignum. This deals with that for now.
458
+ #
459
+ def self.convert(str)
460
+ return nil if str.nil? # Don't turn nil into 0
461
+ return str.to_i
462
+ end
463
+ end
464
+ end