boris 1.0.0.beta.1
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/LICENSE.md +9 -0
- data/README.md +94 -0
- data/boris.gemspec +28 -0
- data/doc/Array.html +437 -0
- data/doc/Boris.html +230 -0
- data/doc/Boris/ConnectionAlreadyActive.html +123 -0
- data/doc/Boris/ConnectionFailed.html +127 -0
- data/doc/Boris/Connector.html +794 -0
- data/doc/Boris/InvalidCredentials.html +131 -0
- data/doc/Boris/InvalidOption.html +123 -0
- data/doc/Boris/InvalidTargetName.html +123 -0
- data/doc/Boris/Lumberjack.html +466 -0
- data/doc/Boris/MissingCredentials.html +123 -0
- data/doc/Boris/NoActiveConnection.html +123 -0
- data/doc/Boris/NoProfileDetected.html +123 -0
- data/doc/Boris/Options.html +783 -0
- data/doc/Boris/Profiles.html +117 -0
- data/doc/Boris/Profiles/Linux.html +1151 -0
- data/doc/Boris/Profiles/RedHat.html +875 -0
- data/doc/Boris/Profiles/Solaris.html +1230 -0
- data/doc/Boris/Profiles/Structure.html +2050 -0
- data/doc/Boris/Profiles/UNIX.html +893 -0
- data/doc/Boris/Profiles/Windows.html +1846 -0
- data/doc/Boris/Profiles/Windows/Windows2003.html +304 -0
- data/doc/Boris/Profiles/Windows/Windows2008.html +379 -0
- data/doc/Boris/Profiles/Windows/Windows2012.html +304 -0
- data/doc/Boris/SNMPConnector.html +512 -0
- data/doc/Boris/SSHConnector.html +633 -0
- data/doc/Boris/Target.html +2002 -0
- data/doc/Boris/WMIConnector.html +1134 -0
- data/doc/BorisLogger.html +217 -0
- data/doc/Hash.html +195 -0
- data/doc/String.html +1246 -0
- data/doc/_index.html +420 -0
- data/doc/class_list.html +53 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +57 -0
- data/doc/css/style.css +328 -0
- data/doc/file.README.html +183 -0
- data/doc/file_list.html +55 -0
- data/doc/frames.html +28 -0
- data/doc/index.html +183 -0
- data/doc/js/app.js +214 -0
- data/doc/js/full_list.js +173 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +1468 -0
- data/doc/top-level-namespace.html +126 -0
- data/lib/boris.rb +30 -0
- data/lib/boris/connectors.rb +47 -0
- data/lib/boris/connectors/snmp.rb +56 -0
- data/lib/boris/connectors/ssh.rb +110 -0
- data/lib/boris/connectors/wmi.rb +186 -0
- data/lib/boris/errors.rb +17 -0
- data/lib/boris/helpers/array.rb +63 -0
- data/lib/boris/helpers/constants.rb +20 -0
- data/lib/boris/helpers/hash.rb +8 -0
- data/lib/boris/helpers/scrubber.rb +51 -0
- data/lib/boris/helpers/string.rb +130 -0
- data/lib/boris/lumberjack.rb +47 -0
- data/lib/boris/options.rb +86 -0
- data/lib/boris/profiles/linux/redhat.rb +77 -0
- data/lib/boris/profiles/linux_core.rb +216 -0
- data/lib/boris/profiles/unix/solaris.rb +307 -0
- data/lib/boris/profiles/unix_core.rb +85 -0
- data/lib/boris/profiles/windows/windows2003.rb +15 -0
- data/lib/boris/profiles/windows/windows2008.rb +23 -0
- data/lib/boris/profiles/windows/windows2012.rb +15 -0
- data/lib/boris/profiles/windows_core.rb +530 -0
- data/lib/boris/structure.rb +167 -0
- data/lib/boris/target.rb +340 -0
- data/test/connector_tests/test_snmp.rb +35 -0
- data/test/connector_tests/test_ssh.rb +51 -0
- data/test/connector_tests/test_wmi.rb +129 -0
- data/test/helper_tests/test_array.rb +25 -0
- data/test/helper_tests/test_hash.rb +10 -0
- data/test/helper_tests/test_string.rb +136 -0
- data/test/profile_tests/test_core_skeleton +107 -0
- data/test/profile_tests/test_linux_core.rb +331 -0
- data/test/profile_tests/test_redhat.rb +134 -0
- data/test/profile_tests/test_solaris.rb +523 -0
- data/test/profile_tests/test_unix_core.rb +117 -0
- data/test/profile_tests/test_windows.rb +536 -0
- data/test/setup_tests.rb +14 -0
- data/test/test_all.rb +8 -0
- data/test/test_options.rb +44 -0
- data/test/test_structure.rb +136 -0
- data/test/test_target.rb +146 -0
- metadata +241 -0
@@ -0,0 +1,216 @@
|
|
1
|
+
require 'boris/structure'
|
2
|
+
|
3
|
+
module Boris; module Profiles
|
4
|
+
module Linux
|
5
|
+
include Structure
|
6
|
+
|
7
|
+
def self.connection_type
|
8
|
+
Boris::SSHConnector
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.matches_target?(connector)
|
12
|
+
return true if connector.value_at('uname -a') =~ /linux/i
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_file_systems
|
16
|
+
super
|
17
|
+
|
18
|
+
file_system_command = %q{df -P -T | grep "^/" | awk '{print $1 "|" $3 / 1024 "|" $5 / 1024 "|" $7}'}
|
19
|
+
@connector.values_at(file_system_command).each do |file_system|
|
20
|
+
h = file_system_template
|
21
|
+
file_system = file_system.split("|")
|
22
|
+
|
23
|
+
h[:capacity_mb] = file_system[1].to_i
|
24
|
+
h[:file_system] = file_system[0]
|
25
|
+
h[:mount_point] = file_system[3]
|
26
|
+
h[:used_space_mb] = file_system[2].to_i
|
27
|
+
|
28
|
+
@file_systems << h
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_hardware
|
33
|
+
super
|
34
|
+
|
35
|
+
cpu_arch_data = @connector.value_at('uname -m')
|
36
|
+
@hardware[:cpu_architecture] = cpu_arch_data =~ /ia|_(64)/ ? 64 : 32
|
37
|
+
|
38
|
+
cpu_data = @connector.values_at('cat /proc/cpuinfo | egrep -i "processor|vendor|mhz|name|cores"')
|
39
|
+
@hardware[:cpu_physical_count] = cpu_data.grep(/processor/i).last.after_colon.to_i + 1
|
40
|
+
@hardware[:cpu_model] = cpu_data.grep(/model name/i)[0].after_colon
|
41
|
+
@hardware[:cpu_vendor] = cpu_data.grep(/vendor_id/i)[0].after_colon
|
42
|
+
@hardware[:cpu_speed_mhz] = cpu_data.grep(/cpu mhz/i)[0].after_pipe.to_i
|
43
|
+
|
44
|
+
# cpu cores aren't always displayed via /proc/cpuinfo
|
45
|
+
cpu_cores = cpu_data.grep(/cpu cores/i)[0]
|
46
|
+
@hardware[:cpu_core_count] = cpu_cores.after_colon.to_i if cpu_cores
|
47
|
+
|
48
|
+
memory_data = @connector.value_at("cat /proc/meminfo | grep -i memtotal | awk '{print $2 / 1024}'")
|
49
|
+
@hardware[:memory_installed_mb] = memory_data.to_i
|
50
|
+
|
51
|
+
hardware_data = @connector.values_at('/usr/bin/sudo /usr/sbin/dmidecode -t 0,1,4', true)
|
52
|
+
if hardware_data.any?
|
53
|
+
# grab the cpu speed again (because its value is usually more useful/relevant than that found via /proc/cpuinfo)
|
54
|
+
@hardware[:cpu_speed_mhz] = hardware_data.grep(/current speed/i)[0].after_colon.scan(/\d/).join.to_i
|
55
|
+
@hardware[:firmware_version] = hardware_data.grep(/version/i)[0].after_colon
|
56
|
+
@hardware[:model] = hardware_data.grep(/product name/i)[0].after_colon
|
57
|
+
@hardware[:serial] = hardware_data.grep(/serial number/i)[0].after_colon
|
58
|
+
@hardware[:vendor] = hardware_data.grep(/manufacturer/i)[0].after_colon
|
59
|
+
else
|
60
|
+
info 'no hardware information available (give me sudo access for dmidecode!)'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def get_hosted_shares; super; end
|
65
|
+
def get_installed_applications; super; end
|
66
|
+
def get_installed_patches; super; end
|
67
|
+
def get_installed_services; super; end
|
68
|
+
|
69
|
+
def get_local_user_groups
|
70
|
+
super
|
71
|
+
|
72
|
+
user_data = @connector.values_at('cat /etc/passwd | grep -v "^#"')
|
73
|
+
group_data = @connector.values_at('cat /etc/group | grep -v "^#"')
|
74
|
+
|
75
|
+
users = []
|
76
|
+
groups = []
|
77
|
+
|
78
|
+
user_data.each do |x|
|
79
|
+
h = {}
|
80
|
+
x = x.split(":")
|
81
|
+
h[:status] = nil
|
82
|
+
h[:primary_group_id] = x[3]
|
83
|
+
h[:username] = x[0]
|
84
|
+
users << h
|
85
|
+
end
|
86
|
+
|
87
|
+
group_data.each do |group|
|
88
|
+
group = group.split(":")
|
89
|
+
h = {:members=>[], :name=>group[0]}
|
90
|
+
|
91
|
+
h[:members] = users.select{|user| (user[:primary_group_id] == group[2])}.collect{|user| user[:username]}
|
92
|
+
|
93
|
+
@local_user_groups << h
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def get_network_id
|
98
|
+
super
|
99
|
+
|
100
|
+
hostname = @connector.value_at('hostname').split('.')
|
101
|
+
@network_id[:hostname] = hostname.shift
|
102
|
+
|
103
|
+
domain = @connector.value_at('domainname')
|
104
|
+
domain = nil if domain =~ /\(none\)/i
|
105
|
+
|
106
|
+
@network_id[:domain] = domain.nil? ? hostname.join('.') : domain
|
107
|
+
end
|
108
|
+
|
109
|
+
def get_network_interfaces
|
110
|
+
super
|
111
|
+
|
112
|
+
# grab the make/model/slot info for all ethernet/fc ports
|
113
|
+
ports = @connector.values_at('/sbin/lspci -mmv | egrep -i "class:[[:space:]]*(ethernet controller|fibre channel)" -B1 -A5')
|
114
|
+
|
115
|
+
## ETHERNET
|
116
|
+
# get some basic info that will apply to all ethernet interfaces
|
117
|
+
dns_servers = @connector.values_at("cat /etc/resolv.conf | grep ^nameserver | awk '{print $2}'")
|
118
|
+
|
119
|
+
found_ethernet_interfaces = ports.join("\n").split('--').grep(/ethernet controller/i)
|
120
|
+
found_fibre_interfaces = ports.join("\n").split('--').grep(/fibre channel/i)
|
121
|
+
|
122
|
+
if found_ethernet_interfaces.any?
|
123
|
+
# get info on all ethernet interfaces
|
124
|
+
ethernet_mapping_data = @connector.values_at(%q{ls /sys/class/net | awk '{cmd="readlink -f /sys/class/net/" $1 "/device/"; cmd | getline link; print $1 "|" link}'})
|
125
|
+
link_properties = @connector.values_at(%q{find -L /sys/class/net/ -mindepth 2 -maxdepth 2 2>/dev/null | awk '{cmd = "cat " $0 " 2>/dev/null"; cmd | getline value; print $0 "|" value;}'})
|
126
|
+
ip_addr_data = @connector.values_at(%q{/sbin/ip addr | awk '{if($0 ~ /^[0-9]:/) {print "\n" $0} else {print $0}}'})
|
127
|
+
|
128
|
+
found_ethernet_interfaces.each do |interface|
|
129
|
+
interface = interface.split("\n")
|
130
|
+
|
131
|
+
h = network_interface_template
|
132
|
+
|
133
|
+
h[:dns_servers] = dns_servers
|
134
|
+
h[:type] = 'ethernet'
|
135
|
+
|
136
|
+
h[:model] = interface.grep(/^.*sdevice:/i)[0].after_colon
|
137
|
+
h[:vendor] = interface.grep(/^.*svendor:/i)[0].after_colon
|
138
|
+
|
139
|
+
pci_slot = interface.grep(/^.*slot:/i)[0].after_colon
|
140
|
+
|
141
|
+
h[:name] = ethernet_mapping_data.grep(/#{pci_slot}$/)[0].before_pipe
|
142
|
+
|
143
|
+
interface_config = link_properties.grep(/\/#{h[:name]}\//)
|
144
|
+
|
145
|
+
h[:mac_address] = interface_config.grep(/\/address\|/)[0].after_pipe.upcase
|
146
|
+
|
147
|
+
# operstate sometimes gives reports interface as 'unknown' when it is up
|
148
|
+
# and working. checking the value of carrier (0 for not plugged in, 1 for
|
149
|
+
# plugged in) in conjunction with the 'ip' command output is a good fallback
|
150
|
+
wired_connection = interface_config.grep(/\/carrier\|/)[0].after_pipe
|
151
|
+
|
152
|
+
ip_config = ip_addr_data.join("\n").strip.split(/\n\n/).grep(/^.*:\s#{h[:name]}:/)[0].split(/\n/)
|
153
|
+
|
154
|
+
h[:status] = (ip_config[0] =~ /,up,/i && wired_connection =~ /1/i) ? 'up' : 'down'
|
155
|
+
|
156
|
+
if h[:status] == 'up'
|
157
|
+
# speed & duplex are not always available (in case of a virtual machine
|
158
|
+
# or hardware failure, etc)
|
159
|
+
speed = interface_config.grep(/\/speed\|/)[0]
|
160
|
+
h[:current_speed_mbps] = speed.after_pipe.to_i if speed
|
161
|
+
|
162
|
+
duplex = interface_config.grep(/\/duplex\|/)[0]
|
163
|
+
h[:duplex] = duplex.after_pipe if duplex
|
164
|
+
|
165
|
+
h[:mtu] = interface_config.grep(/\/mtu\|/)[0].after_pipe.to_i
|
166
|
+
|
167
|
+
ip_config.grep(/^.*inet /).each do |ip|
|
168
|
+
ip_address = ip.split[1].before_slash
|
169
|
+
netmask_bits = ip.split[1].after_slash
|
170
|
+
h[:ip_addresses] << {:ip_address=>ip_address, :subnet=>NetAddr.i_to_ip(NetAddr.netmask_to_i(netmask_bits))}
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
@network_interfaces << h
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
if found_fibre_interfaces.any?
|
179
|
+
fibre_mapping_data = @connector.values_at("find /sys/devices/pci* -regex '.*fc_host/host[0-9]'")
|
180
|
+
interface_config = @connector.values_at(%q{find -L /sys/class/fc_host/ -mindepth 2 -maxdepth 2 | awk '{value=""; "cat " $1 " 2>/dev/null" | getline value; print $1 "|" value;}'})
|
181
|
+
|
182
|
+
found_fibre_interfaces.each do |interface|
|
183
|
+
interface = interface.split("\n")
|
184
|
+
|
185
|
+
h = network_interface_template
|
186
|
+
|
187
|
+
h[:type] = 'fibre'
|
188
|
+
|
189
|
+
h[:model] = interface.grep(/^.*device:/i)[0].after_colon
|
190
|
+
h[:vendor] = interface.grep(/^.*vendor:/i)[0].after_colon
|
191
|
+
|
192
|
+
pci_slot = interface.grep(/^.*slot:/i)[0].split[1]
|
193
|
+
|
194
|
+
h[:name] = fibre_mapping_data.grep(/0000:#{pci_slot}\//)[0].after_slash
|
195
|
+
|
196
|
+
interface_config = interface_config.grep(/fc_host\/#{h[:name]}\//)
|
197
|
+
|
198
|
+
status = interface_config.grep(/\/port_state\|/)[0].after_pipe
|
199
|
+
h[:status] = status =~ /online/i ? 'up' : 'down'
|
200
|
+
|
201
|
+
if h[:status] == 'up'
|
202
|
+
speed = interface_config.grep(/\/speed\|/)[0].after_pipe.split
|
203
|
+
h[:current_speed_mbps] = speed[0].to_i * 1000
|
204
|
+
h[:fabric_name] = interface_config.grep(/\/fabric_name\|/)[0].after_pipe.sub(/^0x/, '')
|
205
|
+
h[:node_wwn] = interface_config.grep(/\/node_name\|/)[0].after_pipe.sub(/^0x/, '')
|
206
|
+
h[:port_wwn] = interface_config.grep(/\/port_name\|/)[0].after_pipe.sub(/^0x/, '')
|
207
|
+
end
|
208
|
+
|
209
|
+
@network_interfaces << h
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
def get_operating_system; super; end
|
215
|
+
end
|
216
|
+
end; end
|
@@ -0,0 +1,307 @@
|
|
1
|
+
require 'boris/profiles/unix_core'
|
2
|
+
|
3
|
+
module Boris; module Profiles
|
4
|
+
module Solaris
|
5
|
+
include UNIX
|
6
|
+
|
7
|
+
SOLARIS_ZONE_MODEL = 'Oracle Virtual Platform'
|
8
|
+
|
9
|
+
def self.connection_type
|
10
|
+
UNIX.connection_type
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.matches_target?(connector)
|
14
|
+
return true if connector.value_at('uname') =~ /sunos/i
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_hardware
|
18
|
+
super
|
19
|
+
|
20
|
+
detect_platform if !@platform
|
21
|
+
detect_zone if !@zone
|
22
|
+
|
23
|
+
if @zone == :child
|
24
|
+
@hardware[:vendor] = VENDOR_ORACLE
|
25
|
+
@hardware[:model] = SOLARIS_ZONE_MODEL
|
26
|
+
elsif @platform == :sparc
|
27
|
+
@hardware[:vendor] = VENDOR_ORACLE
|
28
|
+
|
29
|
+
@hardware[:firmware_version] = @connector.value_at(%q{/usr/platform/`uname -m`/sbin/prtdiag -v | egrep -i "^obp" | awk '{print $2}'})
|
30
|
+
model_data = @connector.value_at('/usr/sbin/prtconf -b | grep banner-name')
|
31
|
+
@hardware[:model] = model_data.after_colon
|
32
|
+
else
|
33
|
+
@hardware[:firmware_version] = @connector.value_at('/usr/sbin/smbios -t SMB_TYPE_BIOS | grep -i "version string"').after_colon
|
34
|
+
model_data = @connector.values_at("/usr/sbin/smbios -t SMB_TYPE_SYSTEM | egrep -i 'manufacturer|product|serial'")
|
35
|
+
@hardware[:vendor] = model_data.grep(/manufacturer/i)[0].after_colon
|
36
|
+
@hardware[:model] = model_data.grep(/product/i)[0].after_colon
|
37
|
+
@hardware[:serial] = model_data.grep(/serial number/i)[0].after_colon
|
38
|
+
end
|
39
|
+
|
40
|
+
memory_data = @connector.value_at("/usr/sbin/prtconf | egrep -i 'memory size' | awk '{print $3}'")
|
41
|
+
@hardware[:memory_installed_mb] = memory_data.to_i
|
42
|
+
|
43
|
+
cpu_arch_data = @connector.values_at("isainfo -v | egrep -i applications | awk '{print $1}'")
|
44
|
+
@hardware[:cpu_architecture] = cpu_arch_data.include?('64-bit') ? 64 : 32
|
45
|
+
|
46
|
+
cpu_data = @connector.values_at(%q{kstat -m cpu_info | nawk '{if(tolower($1)~/^(chip_id|core_id|clock_mhz|vendor_id|brand)/) {sub($1, $1"|"); print $0}}'})
|
47
|
+
|
48
|
+
@hardware[:cpu_physical_count] = cpu_data.grep(/chip_id/i).uniq.size
|
49
|
+
@hardware[:cpu_core_count] = cpu_data.grep(/core_id/i).uniq.size / @hardware[:cpu_physical_count]
|
50
|
+
@hardware[:cpu_model] = cpu_data.grep(/brand/i)[0].after_pipe
|
51
|
+
@hardware[:cpu_speed_mhz] = cpu_data.grep(/clock_mhz/i)[0].after_pipe.to_i
|
52
|
+
|
53
|
+
@hardware[:cpu_vendor] = if @platform == :sparc
|
54
|
+
VENDOR_ORACLE
|
55
|
+
else
|
56
|
+
cpu_data.grep(/vendor_id/i)[0].after_pipe
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def get_hosted_shares
|
61
|
+
super
|
62
|
+
|
63
|
+
share_data = @connector.values_at(%q{nawk '{system("df -k | grep " $2)}' /usr/sbin/shares | nawk '{print $NF "|" $1}'})
|
64
|
+
share_data.each do |share|
|
65
|
+
h = hosted_share_template
|
66
|
+
share = share.split('|')
|
67
|
+
h[:name] = share[0]
|
68
|
+
h[:path] = share[1]
|
69
|
+
@hosted_shares << h
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def get_installed_applications
|
74
|
+
super
|
75
|
+
|
76
|
+
application_data = @connector.values_at("pkginfo -il -c application | egrep -i '^$|(name|version|basedir|vendor|instdate):'")
|
77
|
+
application_data.join("\n").split("\n\n").each do |application|
|
78
|
+
|
79
|
+
application = application.split("\n")
|
80
|
+
h = installed_application_template
|
81
|
+
|
82
|
+
date_installed = application.grep(/instdate:/i)[0].split(/instdate:/i)[1].strip
|
83
|
+
h[:date_installed] = DateTime.strptime(date_installed, '%b %d %Y %H:%M')
|
84
|
+
h[:name] = application.grep(/name:/i)[0].after_colon
|
85
|
+
h[:version] = application.grep(/version:/i)[0].after_colon
|
86
|
+
|
87
|
+
# these sometimes don't show up
|
88
|
+
install_location = application.grep(/basedir:/i)[0]
|
89
|
+
h[:install_location] = install_location.after_colon if install_location
|
90
|
+
vendor = application.grep(/vendor:/i)[0]
|
91
|
+
h[:vendor] = vendor.after_colon if vendor
|
92
|
+
|
93
|
+
@installed_applications << h
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def get_installed_patches
|
98
|
+
super
|
99
|
+
|
100
|
+
# get list of patch install directories and their modified date. this will be our de-facto
|
101
|
+
# list of installed patches on a host.
|
102
|
+
|
103
|
+
patch_directories = @connector.values_at(%q{ls -ego /var/sadm/patch | grep -v '^total' | nawk '{print $NF "|" $4 " " $5 " " $6 " " $7}'})
|
104
|
+
|
105
|
+
patch_directories.each do |directory|
|
106
|
+
|
107
|
+
h = installed_patch_template
|
108
|
+
|
109
|
+
directory = directory.split('|')
|
110
|
+
|
111
|
+
h[:patch_code] = directory[0]
|
112
|
+
h[:date_installed] = DateTime.parse(directory[1])
|
113
|
+
|
114
|
+
@installed_patches << h
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def get_installed_services
|
119
|
+
super
|
120
|
+
|
121
|
+
service_data = @connector.values_at("svcs -a | nawk '{print $NF}'")
|
122
|
+
service_data.each do |service|
|
123
|
+
h = installed_service_template
|
124
|
+
h[:name] = service
|
125
|
+
|
126
|
+
@installed_services << h
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def get_local_user_groups; super; end
|
131
|
+
|
132
|
+
def get_network_interfaces
|
133
|
+
super
|
134
|
+
|
135
|
+
detect_platform if !@platform
|
136
|
+
detect_zone if !@zone
|
137
|
+
|
138
|
+
## ETHERNET
|
139
|
+
# first, grab the link properties for all connections via the kstat command
|
140
|
+
link_properties = @connector.values_at(%q{/usr/bin/kstat -c net -p | egrep "ifspeed|link_(up|duplex|autoneg)" | nawk '{print $1 "|" $2}'})
|
141
|
+
|
142
|
+
# now create a definitive list of interfaces found on this host. to do this, we pull
|
143
|
+
# the interfaces from the link_properties (kstat cmd) output.
|
144
|
+
found_ethernet_interfaces = []
|
145
|
+
link_properties.grep(/:ifspeed\|/).each do |i|
|
146
|
+
i = i.strip.split(':')
|
147
|
+
found_ethernet_interfaces << {:driver=>i[0], :instance=>i[1]}
|
148
|
+
end
|
149
|
+
|
150
|
+
if found_ethernet_interfaces.any?
|
151
|
+
|
152
|
+
# get some basic info that will apply to all ethernet interfaces
|
153
|
+
dns_servers = @connector.values_at("cat /etc/resolv.conf | grep ^nameserver | awk '{print $2}'")
|
154
|
+
|
155
|
+
# then get ethernet interface config from ifconfig
|
156
|
+
interface_configs = @connector.values_at(%q{/sbin/ifconfig -a | egrep 'flags|inet|zone' | nawk '{if($2~/^flags/ && $1!~/^(lo|dman|sppp)/) {current_line=$0; getline; {if($1!~/^zone/) {$1=$1; print current_line "\n" $0 "\n"}}}}'}).join("\n").strip.split(/\n\n/)
|
157
|
+
|
158
|
+
# now get the macs of active ethernet connections (for backup in cases where we
|
159
|
+
# can't get macs from prtpicl)
|
160
|
+
mac_mapping = @connector.values_at(%q{/usr/bin/netstat -pn | grep SP | nawk '{print $1 "|" $2 "|" toupper($5)}'})
|
161
|
+
|
162
|
+
# if this host is in a child zone, drop any interfaces that are not found in the ifconfig
|
163
|
+
# command output (since these would likely be picked up when scanning the zone host)
|
164
|
+
if @zone == :child
|
165
|
+
found_ethernet_interfaces.delete_if{|fi| interface_configs.select{|config| config =~ /^#{fi[:driver]}#{fi[:instance]}/}.count == 0}
|
166
|
+
end
|
167
|
+
|
168
|
+
# now loop through each unique ethernet interface found on this host
|
169
|
+
found_ethernet_interfaces.uniq.each do |fi|
|
170
|
+
h = network_interface_template
|
171
|
+
|
172
|
+
h[:dns_servers] = dns_servers
|
173
|
+
h[:name] = fi[:driver] + fi[:instance]
|
174
|
+
|
175
|
+
# set some defaults for this interface
|
176
|
+
h[:mac_address] = '00:00:00:00:00:00'
|
177
|
+
h[:model] = 'Unknown Ethernet Adapter'
|
178
|
+
h[:status] = 'down'
|
179
|
+
h[:type] = 'ethernet'
|
180
|
+
h[:vendor] = 'Unknown'
|
181
|
+
|
182
|
+
# grab the ifconfig output matching this interface
|
183
|
+
matched_ifconfig_data = interface_configs.grep(/#{h[:name]}:/)
|
184
|
+
matched_ifconfig_data.each do |ifconfig_data|
|
185
|
+
ifconfig_data = ifconfig_data.split(/\n/)
|
186
|
+
interface_line = ifconfig_data[0].split
|
187
|
+
inet_line = ifconfig_data[1].split
|
188
|
+
|
189
|
+
subnet = inet_line[3] ? inet_line[3].hex_to_address : nil
|
190
|
+
|
191
|
+
h[:status] = 'up' if interface_line[1] =~ /<up/i
|
192
|
+
|
193
|
+
if h[:status] == 'up'
|
194
|
+
h[:mtu] = interface_line[3].to_i unless h[:mtu]
|
195
|
+
h[:ip_addresses] << {:ip_address=>inet_line[1], :subnet=>subnet}
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
# for a child zone, set default ethernet interface model/vendor. for zone host,
|
200
|
+
# run prtpicl command to grab hardware details
|
201
|
+
if @zone == :child
|
202
|
+
h[:model] = 'Virtual Ethernet Adapter'
|
203
|
+
h[:vendor] = VENDOR_ORACLE
|
204
|
+
else
|
205
|
+
prtpicl_command = %q{/usr/sbin/prtpicl -c network -v | egrep ':model|:driver-name|:instance|:local-mac-address|:vendor-id|:device-id|\(network' | nawk '{if ($0 ~ /\(network/) print ""; else {first=$1; $1=""; print first "|" $0}}'}
|
206
|
+
|
207
|
+
prtpicl_command.gsub!(/network/, 'obp-device') if @platform == :x86
|
208
|
+
|
209
|
+
hardware_details = @connector.values_at(prtpicl_command).join("\n").split(/\n\n/)
|
210
|
+
|
211
|
+
hardware = hardware_details.grep(/driver-name\|.*#{fi[:driver]}/).grep(/instance\|.*#{fi[:instance]}/)[0].split(/\n/)
|
212
|
+
|
213
|
+
h[:vendor_id] = hardware.grep(/vendor-id\|/)[0].after_pipe unless hardware.grep(/vendor-id\|/).empty?
|
214
|
+
h[:model_id] = hardware.grep(/device-id\|/)[0].after_pipe unless hardware.grep(/device-id\|/).empty?
|
215
|
+
|
216
|
+
h[:vendor] = hardware.grep(/vendor\|/)[0].after_pipe unless hardware.grep(/vendor\|/).empty?
|
217
|
+
h[:model] = hardware.grep(/model\|/)[0].after_pipe unless hardware.grep(/model\|/).empty?
|
218
|
+
|
219
|
+
# try grabbing the mac from the hardware details (hit or miss if it's there)
|
220
|
+
h[:mac_address] = hardware.grep(/local-mac-address\|/)[0].after_pipe.gsub(/\s+/, ':').upcase unless hardware.grep(/local-mac-address\|/).empty?
|
221
|
+
end
|
222
|
+
|
223
|
+
# make another attempt at grabbing the mac, this time checking output from netstat,
|
224
|
+
# which would only apply to active connections
|
225
|
+
netstat_mac = mac_mapping.select{|mac| mac.strip =~ /^#{fi[:driver]}#{fi[:instance]}\|/}
|
226
|
+
h[:mac_address] = netstat_mac[0].after_pipe unless netstat_mac.empty?
|
227
|
+
|
228
|
+
# grab link properties from the kstat command results
|
229
|
+
properties = link_properties.select{|l| l.strip =~ /^#{fi[:driver]}:#{fi[:instance]}/}
|
230
|
+
|
231
|
+
# override status if the link is down
|
232
|
+
h[:status] = 'down' if properties.grep(/:link_up\|/)[0].after_pipe != '1'
|
233
|
+
|
234
|
+
if h[:status] == 'up'
|
235
|
+
speed = properties.grep(/:ifspeed\|/)
|
236
|
+
h[:current_speed_mbps] = speed[0].after_pipe.to_i / 1000 / 1000 unless speed.empty?
|
237
|
+
|
238
|
+
auto_negotiate_setting = properties.grep(/:link_autoneg\|/)
|
239
|
+
h[:auto_negotiate] = case auto_negotiate_setting[0].after_pipe.to_i
|
240
|
+
when 1; true
|
241
|
+
else; false
|
242
|
+
end unless auto_negotiate_setting.empty?
|
243
|
+
|
244
|
+
duplex_setting = properties.grep(/:link_duplex\|/)
|
245
|
+
h[:duplex] = case duplex_setting[0].after_pipe
|
246
|
+
when '2' || 'full'; 'full'
|
247
|
+
when '1' || 'half'; 'half'
|
248
|
+
end unless duplex_setting.empty?
|
249
|
+
|
250
|
+
end
|
251
|
+
|
252
|
+
@network_interfaces << h
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
## FIBRE CHANNEL
|
257
|
+
found_fibre_interfaces = @connector.values_at(%q{/usr/local/bin/sudo /usr/sbin/fcinfo hba-port | egrep -i "wwn|device name|model|manufacturer|driver name|state|current speed" | nawk '{$1=$1; if(tolower($1) ~ /^node/) print $0 "\n"; else print $0;}'})
|
258
|
+
found_fibre_interfaces = found_fibre_interfaces.join("\n").split(/\n\n/)
|
259
|
+
|
260
|
+
found_fibre_interfaces.each do |hba|
|
261
|
+
hba = hba.split(/\n/)
|
262
|
+
|
263
|
+
h = network_interface_template
|
264
|
+
|
265
|
+
h[:name] = hba.grep(/os device name/i)[0].after_colon
|
266
|
+
h[:node_wwn] = hba.grep(/node wwn/i)[0].after_colon
|
267
|
+
h[:port_wwn] = hba.grep(/port wwn/i)[0].after_colon
|
268
|
+
|
269
|
+
h[:model] = hba.grep(/model/i)[0].after_colon
|
270
|
+
h[:vendor] = hba.grep(/manufacturer/i)[0].after_colon
|
271
|
+
|
272
|
+
h[:status] = hba.grep(/state/i)[0].after_colon =~ /online/i ? 'up' : 'down'
|
273
|
+
h[:type] = 'fibre'
|
274
|
+
|
275
|
+
current_speed = hba.grep(/current speed/i)[0].after_colon
|
276
|
+
speed = current_speed.scan(/\d/).join.to_i
|
277
|
+
h[:current_speed_mbps] = current_speed =~ /gb/i ? speed * 1000 : speed
|
278
|
+
|
279
|
+
@network_interfaces << h
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
def get_operating_system
|
284
|
+
super
|
285
|
+
|
286
|
+
install_log_date = @connector.value_at("ls -l /var/sadm/system/logs/install_log | nawk '{print $6" "$7" "$8'}")
|
287
|
+
@operating_system[:date_installed] = DateTime.parse(install_log_date)
|
288
|
+
|
289
|
+
os_data = @connector.value_at('uname -rv').split
|
290
|
+
@operating_system[:kernel] = os_data[1]
|
291
|
+
@operating_system[:name] = 'Oracle Solaris'
|
292
|
+
@operating_system[:version] = os_data[0]
|
293
|
+
end
|
294
|
+
|
295
|
+
private
|
296
|
+
|
297
|
+
def detect_platform
|
298
|
+
platform = @connector.values_at('showrev').grep(/application architecture/i)[0].after_colon
|
299
|
+
@platform = platform =~ /sparc/i ? :sparc : :x86
|
300
|
+
end
|
301
|
+
|
302
|
+
def detect_zone
|
303
|
+
zone = @connector.values_at('/usr/sbin/zoneadm list')
|
304
|
+
@zone = zone.include?('global') ? :global : :child
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end; end
|