vmopt 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,57 @@
1
+ #encoding: utf-8
2
+ module Vmopt
3
+ class PowerOperation
4
+
5
+ =begin
6
+ 参数:无
7
+ 功能:关机
8
+ 返回值:默认
9
+ =end
10
+ def shutdown
11
+ system("shutdown -s -t 00")
12
+ end
13
+
14
+ =begin
15
+ 参数:无
16
+ 功能:重启
17
+ 返回值:默认
18
+ =end
19
+ def reboot
20
+ system("shutdown -r -t 00")
21
+ end
22
+
23
+
24
+ =begin
25
+ 参数:无
26
+ 功能:注销
27
+ 返回值:默认
28
+ =end
29
+ def logoff
30
+ system("shutdown -l")
31
+ end
32
+
33
+
34
+ =begin
35
+ 参数:无
36
+ 功能:锁定或切换用户
37
+ 返回值:默认
38
+ =end
39
+ def lock_user
40
+ system("rundll32.exe user32.dll LockWorkStation")
41
+ end
42
+
43
+ =begin
44
+ 参数:无
45
+ 功能:休眠,xp没有休眠的功能,win7有休眠的功能
46
+ 返回值:默认
47
+ =end
48
+ def sleep
49
+ system("rundll32.exe powrprof.dll SetSuspendState")
50
+ end
51
+
52
+ end
53
+ end #end of module vmopt
54
+
55
+ if __FILE__ == $0
56
+ PowerOperation.new().lock_user
57
+ end
@@ -0,0 +1,62 @@
1
+ #encoding: utf-8
2
+ require "vmopt/utils/wmi"
3
+ require "serialport"
4
+
5
+ module Vmopt
6
+ class SerialPortOperation
7
+
8
+ =begin
9
+ 参数:无
10
+ 功能:查询串口的基本信息
11
+ 返回值:默认
12
+ =end
13
+ def get_serial_port
14
+ data_value={}
15
+ colItems = WMI.execquery ("select * from Win32_SerialPort")
16
+ for objItem in colItems do
17
+ name = (objItem.Name)[-5,4]
18
+ str ={"串口名称" => name,
19
+ "状态" => objItem.Status
20
+ }
21
+ data_value["#{name}"] = str
22
+ end
23
+ return data_value
24
+ end
25
+ =begin
26
+ 参数:串口号,写入的字符串
27
+ 功能:将串口写入字符串
28
+ 返回值:默认
29
+ =end
30
+ def write(strcom,strinput)
31
+ strinput
32
+ begin
33
+ File.open(strcom, 'w+') do |file|
34
+ file.write(strinput)
35
+ end
36
+ rescue Exception
37
+ return false
38
+ end
39
+ return true
40
+ end
41
+ =begin
42
+ 参数:串口号
43
+ 功能:从串口读入字符串
44
+ 返回值:读到的com口字符串
45
+ =end
46
+ def read(strcom)
47
+ begin
48
+ stroutput=""
49
+ sp = SerialPort.new "#{strcom}", 9600
50
+ sp.read_timeout=4000 #定时4秒
51
+ stroutput = sp.read(50)
52
+ if stroutput.empty?
53
+ return false
54
+ end
55
+ rescue Exception
56
+ return false
57
+ end
58
+ return stroutput
59
+ end
60
+ end
61
+ end #end of module vmopt
62
+
@@ -0,0 +1,44 @@
1
+ #encoding: utf-8
2
+ #$:.unshift File.join(__FILE__,"..","..")
3
+ require "vmopt/utils/wmi"
4
+
5
+ module Vmopt
6
+ class SystemResource
7
+
8
+ def get_cpu
9
+ data_value={}
10
+ colItems = WMI.execquery ("select * from Win32_Processor")
11
+ for objItem in colItems do
12
+ str={"CPU数量" => objItem.NumberOfCores,
13
+ "CPU主频" => (objItem.MaxClockSpeed/1000.0).round(2),
14
+ "CPU使用率" => "#{objItem.LoadPercentage}%"
15
+ }
16
+ data_value["#{objItem.DeviceID}"]=str
17
+ end
18
+ return data_value
19
+ end
20
+
21
+ def get_memory
22
+ data_value={}
23
+ colItems = WMI.execquery ("select * from Win32_PhysicalMemory")
24
+ for objItem in colItems do
25
+ memsizestr = objItem.Capacity
26
+ memsizei = memsizestr.to_i/1024/1024 #str转interger
27
+ end
28
+ availMemorys = WMI.execquery ("select * from Win32_PerfRawData_PerfOS_Memory")
29
+ for availMemory in availMemorys do
30
+ availstr = availMemory.AvailableMBytes
31
+ availi = availstr.to_i #str转interger
32
+ end
33
+
34
+ str = {"总物理内存" => memsizei,
35
+ "可用内存" => availi,
36
+ "内存使用率" => "#{(((memsizei-availi) * 1.0 /memsizei) * 100).round(1)}%"
37
+ }
38
+ data_value["#{objItem.Name}"] = str
39
+ return data_value
40
+ end
41
+
42
+ end
43
+ end #end of module vmopt
44
+
@@ -0,0 +1,287 @@
1
+ #encoding: utf-8
2
+ # 功能:提供IP的规范性检查,适合所有平台
3
+
4
+ module IP
5
+ # A map of all the different regexes that work for
6
+ # a given platform or set of platforms.
7
+ REGEX_MAP = {
8
+ :linux => {
9
+ :ipaddress => /inet (?:addr:)?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/,
10
+ :ipaddress6 => /inet6 (?:addr: )?((?![fe80|::1])(?>[0-9,a-f,A-F]*\:{1,2})+[0-9,a-f,A-F]{0,4})/,
11
+ :macaddress => /(?:ether|HWaddr)\s+((\w{1,2}:){5,}\w{1,2})/,
12
+ :netmask => /(?:Mask:|netmask )([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/,
13
+ :mtu => /MTU:(\d+)/
14
+ },
15
+ :bsd => {
16
+ :aliases => [:openbsd, :netbsd, :freebsd, :darwin, :"gnu/kfreebsd", :dragonfly],
17
+ :ipaddress => /inet\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/,
18
+ :ipaddress6 => /inet6 ((?![fe80|::1])(?>[0-9,a-f,A-F]*\:{1,2})+[0-9,a-f,A-F]{0,4})/,
19
+ :macaddress => /(?:ether|lladdr)\s+(\w?\w:\w?\w:\w?\w:\w?\w:\w?\w:\w?\w)/,
20
+ :netmask => /netmask\s+0x(\w{8})/,
21
+ :mtu => /mtu\s+(\d+)/
22
+ },
23
+ :sunos => {
24
+ :ipaddress => /inet\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/,
25
+ :ipaddress6 => /inet6 ((?![fe80|::1])(?>[0-9,a-f,A-F]*\:{1,2})+[0-9,a-f,A-F]{0,4})/,
26
+ :macaddress => /(?:ether|lladdr)\s+(\w?\w:\w?\w:\w?\w:\w?\w:\w?\w:\w?\w)/,
27
+ :netmask => /netmask\s+(\w{8})/,
28
+ :mtu => /mtu\s+(\d+)/
29
+ },
30
+ :"hp-ux" => {
31
+ :ipaddress => /\s+inet (\S+)\s.*/,
32
+ :macaddress => /(\w{1,2}:\w{1,2}:\w{1,2}:\w{1,2}:\w{1,2}:\w{1,2})/,
33
+ :netmask => /.*\s+netmask (\S+)\s.*/
34
+ },
35
+ :windows => {}
36
+ }
37
+
38
+ # Convert an interface name into purely alphanumeric characters.
39
+ def self.alphafy(interface)
40
+ interface.gsub(/[^a-z0-9_]/i, '_')
41
+ end
42
+
43
+ def self.convert_from_hex?(kernel)
44
+ kernels_to_convert = [:sunos, :openbsd, :netbsd, :freebsd, :darwin, :"hp-ux", :"gnu/kfreebsd", :dragonfly]
45
+ kernels_to_convert.include?(kernel)
46
+ end
47
+
48
+ def self.supported_platforms
49
+ REGEX_MAP.inject([]) do |result, tmp|
50
+ key, map = tmp
51
+ if map[:aliases]
52
+ result += map[:aliases]
53
+ else
54
+ result << key
55
+ end
56
+ result
57
+ end
58
+ end
59
+
60
+ def self.get_interfaces
61
+ if Facter.value(:kernel) == 'windows'
62
+ require 'facter/util/ip/windows'
63
+ return Vmopt::IP::Windows.interfaces
64
+ end
65
+
66
+ return [] unless output = Vmopt::IP.get_all_interface_output()
67
+
68
+ # Our regex appears to be stupid, in that it leaves colons sitting
69
+ # at the end of interfaces. So, we have to trim those trailing
70
+ # characters. I tried making the regex better but supporting all
71
+ # platforms with a single regex is probably a bit too much.
72
+ output.scan(/^\S+/).collect { |i| i.sub(/:$/, '') }.uniq
73
+ end
74
+
75
+ def self.get_all_interface_output
76
+ case Facter.value(:kernel)
77
+ when 'Linux', 'OpenBSD', 'NetBSD', 'FreeBSD', 'Darwin', 'GNU/kFreeBSD', 'DragonFly'
78
+ output = Vmopt::IP.exec_ifconfig(["-a","2>/dev/null"])
79
+ when 'SunOS'
80
+ output = Vmopt::IP.exec_ifconfig(["-a"])
81
+ when 'HP-UX'
82
+ # (#17487)[https://projects.puppetlabs.com/issues/17487]
83
+ # Handle NIC bonding where asterisks and virtual NICs are printed.
84
+ if output = hpux_netstat_in
85
+ output.gsub!(/\*/, "") # delete asterisks.
86
+ output.gsub!(/^[^\n]*none[^\n]*\n/, "") # delete lines with 'none' instead of IPs.
87
+ output.sub!(/^[^\n]*\n/, "") # delete the header line.
88
+ output
89
+ end
90
+ end
91
+ output
92
+ end
93
+
94
+
95
+ ##
96
+ # exec_ifconfig uses the ifconfig command
97
+ #
98
+ # @return [String] the output of `ifconfig #{arguments} 2>/dev/null` or nil
99
+ def self.exec_ifconfig(additional_arguments=[])
100
+ Facter::Core::Execution.exec("#{self.get_ifconfig} #{additional_arguments.join(' ')}")
101
+ end
102
+ ##
103
+ # get_ifconfig looks up the ifconfig binary
104
+ #
105
+ # @return [String] path to the ifconfig binary
106
+ def self.get_ifconfig
107
+ common_paths=["/bin/ifconfig","/sbin/ifconfig","/usr/sbin/ifconfig"]
108
+ common_paths.select{|path| File.executable?(path)}.first
109
+ end
110
+ ##
111
+ # hpux_netstat_in is a delegate method that allows us to stub netstat -in
112
+ # without stubbing exec.
113
+ def self.hpux_netstat_in
114
+ Facter::Core::Execution.exec("/bin/netstat -in")
115
+ end
116
+
117
+ def self.get_infiniband_macaddress(interface)
118
+ if File.exists?("/sys/class/net/#{interface}/address") then
119
+ ib_mac_address = `cat /sys/class/net/#{interface}/address`.chomp
120
+ elsif File.exists?("/sbin/ip") then
121
+ ip_output = %x{/sbin/ip link show #{interface}}
122
+ ib_mac_address = ip_output.scan(%r{infiniband\s+((\w{1,2}:){5,}\w{1,2})})
123
+ else
124
+ ib_mac_address = "FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF"
125
+ Facter.debug("ip.rb: nothing under /sys/class/net/#{interface}/address and /sbin/ip not available")
126
+ end
127
+ ib_mac_address
128
+ end
129
+
130
+ def self.ifconfig_interface(interface)
131
+ output = Vmopt::IP.exec_ifconfig([interface,"2>/dev/null"])
132
+ end
133
+
134
+ def self.get_single_interface_output(interface)
135
+ output = ""
136
+ case Facter.value(:kernel)
137
+ when 'OpenBSD', 'NetBSD', 'FreeBSD', 'Darwin', 'GNU/kFreeBSD', 'DragonFly'
138
+ output = Vmopt::IP.ifconfig_interface(interface)
139
+ when 'Linux'
140
+ ifconfig_output = Vmopt::IP.ifconfig_interface(interface)
141
+ if interface =~ /^ib/ then
142
+ real_mac_address = get_infiniband_macaddress(interface)
143
+ output = ifconfig_output.sub(%r{(?:ether|HWaddr)\s+((\w{1,2}:){5,}\w{1,2})}, "HWaddr #{real_mac_address}")
144
+ else
145
+ output = ifconfig_output
146
+ end
147
+ when 'SunOS'
148
+ output = Vmopt::IP.exec_ifconfig([interface])
149
+ when 'HP-UX'
150
+ mac = ""
151
+ ifc = hpux_ifconfig_interface(interface)
152
+ hpux_lanscan.scan(/(\dx\S+).*UP\s+(\w+\d+)/).each {|i| mac = i[0] if i.include?(interface) }
153
+ mac = mac.sub(/0x(\S+)/,'\1').scan(/../).join(":")
154
+ output = ifc + "\n" + mac
155
+ end
156
+ output
157
+ end
158
+
159
+ def self.hpux_ifconfig_interface(interface)
160
+ Vmopt::IP.exec_ifconfig([interface])
161
+ end
162
+
163
+ def self.hpux_lanscan
164
+ Facter::Core::Execution.exec("/usr/sbin/lanscan")
165
+ end
166
+
167
+ def self.get_output_for_interface_and_label(interface, label)
168
+ return get_single_interface_output(interface) unless Facter.value(:kernel) == 'windows'
169
+
170
+ require 'facter/util/ip/windows'
171
+ output = Vmopt::IP::Windows.value_for_interface_and_label(interface, label)
172
+ output ? output : ""
173
+ end
174
+
175
+ def self.get_bonding_master(interface)
176
+ if Facter.value(:kernel) != 'Linux'
177
+ return nil
178
+ end
179
+ # We need ip instead of ifconfig because it will show us
180
+ # the bonding master device.
181
+ if not FileTest.executable?("/sbin/ip")
182
+ return nil
183
+ end
184
+ # A bonding interface can never be an alias interface. Alias
185
+ # interfaces do have a colon in their name and the ip link show
186
+ # command throws an error message when we pass it an alias
187
+ # interface.
188
+ if interface =~ /:/
189
+ return nil
190
+ end
191
+ regex = /SLAVE[,>].* (bond[0-9]+)/
192
+ ethbond = regex.match(%x{/sbin/ip link show #{interface}})
193
+ if ethbond
194
+ device = ethbond[1]
195
+ else
196
+ device = nil
197
+ end
198
+ device
199
+ end
200
+
201
+ ##
202
+ # get_interface_value obtains the value of a specific attribute of a specific
203
+ # interface.
204
+ #
205
+ # @param interface [String] the interface identifier, e.g. "eth0" or "bond0"
206
+ #
207
+ # @param label [String] the attribute of the interface to obtain a value for,
208
+ # e.g. "netmask" or "ipaddress"
209
+ #
210
+ # @api private
211
+ #
212
+ # @return [String] representing the requested value. An empty array is
213
+ # returned if the kernel is not supported by the REGEX_MAP constant.
214
+ def self.get_interface_value(interface, label)
215
+ if Facter.value(:kernel) == 'windows'
216
+ require 'facter/util/ip/windows'
217
+ return Vmopt::IP::Windows.value_for_interface_and_label(interface, label)
218
+ end
219
+
220
+ tmp1 = []
221
+
222
+ kernel = Facter.value(:kernel).downcase.to_sym
223
+
224
+ # If it's not directly in the map or aliased in the map, then we don't know how to deal with it.
225
+ unless map = REGEX_MAP[kernel] || REGEX_MAP.values.find { |tmp| tmp[:aliases] and tmp[:aliases].include?(kernel) }
226
+ return []
227
+ end
228
+
229
+ # Pull the correct regex out of the map.
230
+ regex = map[label.to_sym]
231
+
232
+ # Linux changes the MAC address reported via ifconfig when an ethernet interface
233
+ # becomes a slave of a bonding device to the master MAC address.
234
+ # We have to dig a bit to get the original/real MAC address of the interface.
235
+ bonddev = get_bonding_master(interface)
236
+ if label == 'macaddress' and bonddev
237
+ bondinfo = read_proc_net_bonding("/proc/net/bonding/#{bonddev}")
238
+ re = /^Slave Interface: #{interface}\b.*?\bPermanent HW addr: (([0-9A-F]{2}:?)*)$/im
239
+ if match = re.match(bondinfo)
240
+ value = match[1].upcase
241
+ end
242
+ else
243
+ output_int = get_output_for_interface_and_label(interface, label)
244
+
245
+ output_int.each_line do |s|
246
+ if s =~ regex
247
+ value = $1
248
+ if label == 'netmask' && convert_from_hex?(kernel)
249
+ value = value.scan(/../).collect do |byte| byte.to_i(16) end.join('.')
250
+ end
251
+ tmp1.push(value)
252
+ end
253
+ end
254
+
255
+ if tmp1
256
+ value = tmp1.shift
257
+ end
258
+ end
259
+ end
260
+
261
+ ##
262
+ # read_proc_net_bonding is a seam method for mocking purposes.
263
+ #
264
+ # @param path [String] representing the path to read, e.g. "/proc/net/bonding/bond0"
265
+ #
266
+ # @api private
267
+ #
268
+ # @return [String] modeling the raw file read
269
+ def self.read_proc_net_bonding(path)
270
+ File.read(path) if File.exists?(path)
271
+ end
272
+ private_class_method :read_proc_net_bonding
273
+
274
+ def self.get_network_value(interface)
275
+ require 'ipaddr'
276
+
277
+ ipaddress = get_interface_value(interface, "ipaddress")
278
+ netmask = get_interface_value(interface, "netmask")
279
+
280
+ if ipaddress && netmask
281
+ ip = IPAddr.new(ipaddress, Socket::AF_INET)
282
+ subnet = IPAddr.new(netmask, Socket::AF_INET)
283
+ network = ip.mask(subnet.to_s).to_s
284
+ end
285
+ end
286
+ end
287
+