facter 2.1.0-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of facter might be problematic. Click here for more details.

Files changed (440) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +194 -0
  3. data/CONTRIBUTING.md +65 -0
  4. data/Gemfile +53 -0
  5. data/LICENSE +15 -0
  6. data/README.md +33 -0
  7. data/Rakefile +79 -0
  8. data/bin/facter +20 -0
  9. data/etc/facter.conf +5 -0
  10. data/ext/build_defaults.yaml +24 -0
  11. data/ext/debian/changelog.erb +59 -0
  12. data/ext/debian/compat +1 -0
  13. data/ext/debian/control +14 -0
  14. data/ext/debian/copyright +19 -0
  15. data/ext/debian/docs +1 -0
  16. data/ext/debian/lintian-overrides +0 -0
  17. data/ext/debian/rules +10 -0
  18. data/ext/debian/source/format +1 -0
  19. data/ext/facter-diff +74 -0
  20. data/ext/ips/facter.p5m.erb +10 -0
  21. data/ext/ips/rules +7 -0
  22. data/ext/ips/transforms +18 -0
  23. data/ext/osx/file_mapping.yaml +27 -0
  24. data/ext/osx/preflight.erb +33 -0
  25. data/ext/osx/prototype.plist.erb +38 -0
  26. data/ext/project_data.yaml +36 -0
  27. data/ext/redhat/facter.spec.erb +220 -0
  28. data/ext/solaris/pkginfo +7 -0
  29. data/install.rb +380 -0
  30. data/lib/facter.rb +261 -0
  31. data/lib/facter/Cfkey.rb +42 -0
  32. data/lib/facter/application.rb +204 -0
  33. data/lib/facter/architecture.rb +50 -0
  34. data/lib/facter/augeasversion.rb +28 -0
  35. data/lib/facter/blockdevices.rb +105 -0
  36. data/lib/facter/core/aggregate.rb +220 -0
  37. data/lib/facter/core/directed_graph.rb +46 -0
  38. data/lib/facter/core/execution.rb +123 -0
  39. data/lib/facter/core/execution/base.rb +81 -0
  40. data/lib/facter/core/execution/posix.rb +50 -0
  41. data/lib/facter/core/execution/windows.rb +57 -0
  42. data/lib/facter/core/logging.rb +169 -0
  43. data/lib/facter/core/resolvable.rb +94 -0
  44. data/lib/facter/core/suitable.rb +113 -0
  45. data/lib/facter/dhcp_servers.rb +39 -0
  46. data/lib/facter/domain.rb +99 -0
  47. data/lib/facter/ec2.rb +44 -0
  48. data/lib/facter/ec2/rest.rb +130 -0
  49. data/lib/facter/facterversion.rb +15 -0
  50. data/lib/facter/filesystems.rb +38 -0
  51. data/lib/facter/fqdn.rb +24 -0
  52. data/lib/facter/gce.rb +16 -0
  53. data/lib/facter/gce/metadata.rb +87 -0
  54. data/lib/facter/hardwareisa.rb +20 -0
  55. data/lib/facter/hardwaremodel.rb +67 -0
  56. data/lib/facter/hostname.rb +31 -0
  57. data/lib/facter/id.rb +21 -0
  58. data/lib/facter/interfaces.rb +46 -0
  59. data/lib/facter/ipaddress.rb +171 -0
  60. data/lib/facter/ipaddress6.rb +82 -0
  61. data/lib/facter/iphostnumber.rb +29 -0
  62. data/lib/facter/kernel.rb +22 -0
  63. data/lib/facter/kernelmajversion.rb +23 -0
  64. data/lib/facter/kernelrelease.rb +50 -0
  65. data/lib/facter/kernelversion.rb +22 -0
  66. data/lib/facter/ldom.rb +47 -0
  67. data/lib/facter/lsbdistcodename.rb +16 -0
  68. data/lib/facter/lsbdistdescription.rb +25 -0
  69. data/lib/facter/lsbdistid.rb +16 -0
  70. data/lib/facter/lsbdistrelease.rb +16 -0
  71. data/lib/facter/lsbmajdistrelease.rb +27 -0
  72. data/lib/facter/lsbrelease.rb +16 -0
  73. data/lib/facter/macaddress.rb +97 -0
  74. data/lib/facter/macosx.rb +56 -0
  75. data/lib/facter/manufacturer.rb +68 -0
  76. data/lib/facter/memory.rb +168 -0
  77. data/lib/facter/netmask.rb +42 -0
  78. data/lib/facter/network.rb +20 -0
  79. data/lib/facter/operatingsystem.rb +141 -0
  80. data/lib/facter/operatingsystemmajrelease.rb +47 -0
  81. data/lib/facter/operatingsystemrelease.rb +250 -0
  82. data/lib/facter/osfamily.rb +37 -0
  83. data/lib/facter/partitions.rb +35 -0
  84. data/lib/facter/path.rb +14 -0
  85. data/lib/facter/physicalprocessorcount.rb +91 -0
  86. data/lib/facter/processor.rb +168 -0
  87. data/lib/facter/ps.rb +30 -0
  88. data/lib/facter/puppetversion.rb +20 -0
  89. data/lib/facter/rubysitedir.rb +12 -0
  90. data/lib/facter/rubyversion.rb +12 -0
  91. data/lib/facter/selinux.rb +99 -0
  92. data/lib/facter/ssh.rb +72 -0
  93. data/lib/facter/timezone.rb +14 -0
  94. data/lib/facter/uniqueid.rb +4 -0
  95. data/lib/facter/uptime.rb +34 -0
  96. data/lib/facter/uptime_days.rb +15 -0
  97. data/lib/facter/uptime_hours.rb +15 -0
  98. data/lib/facter/uptime_seconds.rb +24 -0
  99. data/lib/facter/util/architecture.rb +19 -0
  100. data/lib/facter/util/collection.rb +161 -0
  101. data/lib/facter/util/composite_loader.rb +12 -0
  102. data/lib/facter/util/config.rb +63 -0
  103. data/lib/facter/util/confine.rb +66 -0
  104. data/lib/facter/util/dhcp_servers.rb +43 -0
  105. data/lib/facter/util/directory_loader.rb +83 -0
  106. data/lib/facter/util/ec2.rb +106 -0
  107. data/lib/facter/util/fact.rb +204 -0
  108. data/lib/facter/util/file_read.rb +37 -0
  109. data/lib/facter/util/formatter.rb +39 -0
  110. data/lib/facter/util/ip.rb +285 -0
  111. data/lib/facter/util/ip/windows.rb +215 -0
  112. data/lib/facter/util/loader.rb +155 -0
  113. data/lib/facter/util/macaddress.rb +43 -0
  114. data/lib/facter/util/macosx.rb +73 -0
  115. data/lib/facter/util/manufacturer.rb +99 -0
  116. data/lib/facter/util/memory.rb +228 -0
  117. data/lib/facter/util/netmask.rb +40 -0
  118. data/lib/facter/util/normalization.rb +94 -0
  119. data/lib/facter/util/nothing_loader.rb +12 -0
  120. data/lib/facter/util/operatingsystem.rb +21 -0
  121. data/lib/facter/util/parser.rb +158 -0
  122. data/lib/facter/util/partitions.rb +41 -0
  123. data/lib/facter/util/partitions/linux.rb +65 -0
  124. data/lib/facter/util/plist.rb +24 -0
  125. data/lib/facter/util/plist/generator.rb +228 -0
  126. data/lib/facter/util/plist/parser.rb +226 -0
  127. data/lib/facter/util/posix.rb +16 -0
  128. data/lib/facter/util/processor.rb +289 -0
  129. data/lib/facter/util/registry.rb +11 -0
  130. data/lib/facter/util/resolution.rb +160 -0
  131. data/lib/facter/util/solaris_zones.rb +158 -0
  132. data/lib/facter/util/unix_root.rb +5 -0
  133. data/lib/facter/util/uptime.rb +81 -0
  134. data/lib/facter/util/values.rb +109 -0
  135. data/lib/facter/util/virtual.rb +180 -0
  136. data/lib/facter/util/vlans.rb +21 -0
  137. data/lib/facter/util/windows_root.rb +7 -0
  138. data/lib/facter/util/wmi.rb +16 -0
  139. data/lib/facter/util/xendomains.rb +10 -0
  140. data/lib/facter/version.rb +86 -0
  141. data/lib/facter/virtual.rb +311 -0
  142. data/lib/facter/vlans.rb +17 -0
  143. data/lib/facter/xendomains.rb +20 -0
  144. data/lib/facter/zfs_version.rb +10 -0
  145. data/lib/facter/zonename.rb +6 -0
  146. data/lib/facter/zones.rb +17 -0
  147. data/lib/facter/zpool_version.rb +10 -0
  148. data/spec/fixtures/cpuinfo/amd64dual +57 -0
  149. data/spec/fixtures/cpuinfo/amd64quad +79 -0
  150. data/spec/fixtures/cpuinfo/amd64solo +23 -0
  151. data/spec/fixtures/cpuinfo/amd64tri +86 -0
  152. data/spec/fixtures/cpuinfo/amd64twentyfour +600 -0
  153. data/spec/fixtures/cpuinfo/bbg3-armel +12 -0
  154. data/spec/fixtures/cpuinfo/beaglexm-armel +12 -0
  155. data/spec/fixtures/cpuinfo/panda-armel +17 -0
  156. data/spec/fixtures/cpuinfo/ppc64 +19 -0
  157. data/spec/fixtures/cpuinfo/sparc +10 -0
  158. data/spec/fixtures/hpux/machinfo/hppa-rp4440 +26 -0
  159. data/spec/fixtures/hpux/machinfo/ia64-rx2620 +49 -0
  160. data/spec/fixtures/hpux/machinfo/ia64-rx6600 +26 -0
  161. data/spec/fixtures/hpux/machinfo/ia64-rx8640 +53 -0
  162. data/spec/fixtures/hpux/machinfo/superdome-server-SD32B +53 -0
  163. data/spec/fixtures/hpux/machinfo/superdome2-16s +31 -0
  164. data/spec/fixtures/hpux/sched.models +174 -0
  165. data/spec/fixtures/hpux/unistd.h +1534 -0
  166. data/spec/fixtures/ifconfig/bsd_ifconfig_all_with_multiple_interfaces +18 -0
  167. data/spec/fixtures/ifconfig/centos_5_5 +17 -0
  168. data/spec/fixtures/ifconfig/centos_5_5_eth0 +8 -0
  169. data/spec/fixtures/ifconfig/darwin_10_3_0 +26 -0
  170. data/spec/fixtures/ifconfig/darwin_10_3_0_en0 +6 -0
  171. data/spec/fixtures/ifconfig/darwin_10_6_4 +28 -0
  172. data/spec/fixtures/ifconfig/darwin_10_6_4_en1 +6 -0
  173. data/spec/fixtures/ifconfig/darwin_10_6_6_dualstack +8 -0
  174. data/spec/fixtures/ifconfig/darwin_10_6_6_dualstack_en1 +7 -0
  175. data/spec/fixtures/ifconfig/darwin_9_8_0 +26 -0
  176. data/spec/fixtures/ifconfig/darwin_9_8_0_en0 +6 -0
  177. data/spec/fixtures/ifconfig/darwin_ifconfig_all_with_multiple_interfaces +23 -0
  178. data/spec/fixtures/ifconfig/fedora_10 +36 -0
  179. data/spec/fixtures/ifconfig/fedora_10_eth0 +9 -0
  180. data/spec/fixtures/ifconfig/fedora_13 +18 -0
  181. data/spec/fixtures/ifconfig/fedora_13_eth0 +9 -0
  182. data/spec/fixtures/ifconfig/fedora_8 +38 -0
  183. data/spec/fixtures/ifconfig/fedora_8_eth0 +9 -0
  184. data/spec/fixtures/ifconfig/freebsd_6_0 +12 -0
  185. data/spec/fixtures/ifconfig/ifconfig_net_tools_1.60.txt +19 -0
  186. data/spec/fixtures/ifconfig/ifconfig_ubuntu_1204.txt +16 -0
  187. data/spec/fixtures/ifconfig/linux_ifconfig_all_with_multiple_interfaces +19 -0
  188. data/spec/fixtures/ifconfig/linux_ifconfig_no_addr +19 -0
  189. data/spec/fixtures/ifconfig/linux_ifconfig_no_mac +8 -0
  190. data/spec/fixtures/ifconfig/linux_ifconfig_venet +24 -0
  191. data/spec/fixtures/ifconfig/open_solaris_10 +12 -0
  192. data/spec/fixtures/ifconfig/open_solaris_b132 +20 -0
  193. data/spec/fixtures/ifconfig/openbsd_bridge_rules +11 -0
  194. data/spec/fixtures/ifconfig/sunos_ifconfig_all_with_multiple_interfaces +10 -0
  195. data/spec/fixtures/ifconfig/ubuntu_7_04 +38 -0
  196. data/spec/fixtures/ifconfig/ubuntu_7_04_eth0 +9 -0
  197. data/spec/fixtures/ldom/ldom_v1 +6 -0
  198. data/spec/fixtures/netstat/centos_5_5 +5 -0
  199. data/spec/fixtures/netstat/darwin_10_3_0 +35 -0
  200. data/spec/fixtures/netstat/darwin_10_6_4 +29 -0
  201. data/spec/fixtures/netstat/darwin_10_6_6_dualstack +34 -0
  202. data/spec/fixtures/netstat/darwin_9_8_0 +28 -0
  203. data/spec/fixtures/netstat/fedora_10 +7 -0
  204. data/spec/fixtures/netstat/open_solaris_10 +16 -0
  205. data/spec/fixtures/netstat/open_solaris_b132 +17 -0
  206. data/spec/fixtures/netstat/ubuntu_7_04 +7 -0
  207. data/spec/fixtures/processorcount/solaris-psrinfo +24 -0
  208. data/spec/fixtures/processorcount/solaris-sparc-kstat-cpu-info +1216 -0
  209. data/spec/fixtures/processorcount/solaris-x86_64-kstat-cpu-info +225 -0
  210. data/spec/fixtures/unit/dhcp_servers/nmcli_devices +4 -0
  211. data/spec/fixtures/unit/dhcp_servers/nmcli_devices_disconnected +4 -0
  212. data/spec/fixtures/unit/dhcp_servers/nmcli_eth0_dhcp +36 -0
  213. data/spec/fixtures/unit/dhcp_servers/nmcli_eth0_static +24 -0
  214. data/spec/fixtures/unit/dhcp_servers/nmcli_wlan0_dhcp +49 -0
  215. data/spec/fixtures/unit/dhcp_servers/nmcli_wlan0_static +37 -0
  216. data/spec/fixtures/unit/dhcp_servers/route +3 -0
  217. data/spec/fixtures/unit/dhcp_servers/route_nogw +1 -0
  218. data/spec/fixtures/unit/ec2/rest/meta-data/root +20 -0
  219. data/spec/fixtures/unit/filesystems/linux +28 -0
  220. data/spec/fixtures/unit/gce/metadata/metadata.json +69 -0
  221. data/spec/fixtures/unit/interfaces/ifconfig_net_tools_1.60.txt +19 -0
  222. data/spec/fixtures/unit/interfaces/ifconfig_net_tools_1.60.txt.em1 +10 -0
  223. data/spec/fixtures/unit/interfaces/ifconfig_net_tools_1.60.txt.lo +8 -0
  224. data/spec/fixtures/unit/ipaddress/ifconfig_multiple_127_addresses.txt +20 -0
  225. data/spec/fixtures/unit/ipaddress/ifconfig_net_tools_1.60.txt +19 -0
  226. data/spec/fixtures/unit/ipaddress/ifconfig_non_english_locale.txt +18 -0
  227. data/spec/fixtures/unit/ipaddress/ifconfig_ubuntu_1204.txt +16 -0
  228. data/spec/fixtures/unit/kernelrelease/openbsd-5.3 +2 -0
  229. data/spec/fixtures/unit/kernelrelease/openbsd-5.3-current +3 -0
  230. data/spec/fixtures/unit/memory/aix-svmon +9 -0
  231. data/spec/fixtures/unit/memory/aix-swap_l +2 -0
  232. data/spec/fixtures/unit/memory/darwin-swapinfo-multiple +3 -0
  233. data/spec/fixtures/unit/memory/darwin-swapinfo-single +2 -0
  234. data/spec/fixtures/unit/memory/darwin-vm_stat +13 -0
  235. data/spec/fixtures/unit/memory/dragonfly-vmstat +3 -0
  236. data/spec/fixtures/unit/memory/freebsd-vmstat +3 -0
  237. data/spec/fixtures/unit/memory/linux-proc_meminfo +10 -0
  238. data/spec/fixtures/unit/memory/openbsd-vmstat +3 -0
  239. data/spec/fixtures/unit/memory/smartos_zone_swap_l-single +2 -0
  240. data/spec/fixtures/unit/memory/solaris-prtconf +4 -0
  241. data/spec/fixtures/unit/memory/solaris-swap_l-multiple +3 -0
  242. data/spec/fixtures/unit/memory/solaris-swap_l-single +2 -0
  243. data/spec/fixtures/unit/memory/solaris-vmstat +3 -0
  244. data/spec/fixtures/unit/netmask/darwin_10_8_5.txt +30 -0
  245. data/spec/fixtures/unit/netmask/ifconfig_aix_7.txt +3 -0
  246. data/spec/fixtures/unit/netmask/ifconfig_net_tools_1.60.txt +19 -0
  247. data/spec/fixtures/unit/netmask/ifconfig_ubuntu_1204.txt +16 -0
  248. data/spec/fixtures/unit/selinux/selinux_sestatus +6 -0
  249. data/spec/fixtures/unit/util/dhcp_servers/route +3 -0
  250. data/spec/fixtures/unit/util/dhcp_servers/route_nogw +1 -0
  251. data/spec/fixtures/unit/util/ec2/centos-arp-ec2.out +1 -0
  252. data/spec/fixtures/unit/util/ec2/linux-arp-ec2.out +1 -0
  253. data/spec/fixtures/unit/util/ec2/linux-arp-not-ec2.out +5 -0
  254. data/spec/fixtures/unit/util/ec2/solaris8_arp_a_not_ec2.out +7 -0
  255. data/spec/fixtures/unit/util/ec2/windows-2008-arp-a-not-ec2.out +6 -0
  256. data/spec/fixtures/unit/util/ec2/windows-2008-arp-a.out +10 -0
  257. data/spec/fixtures/unit/util/ip/6.0-STABLE_FreeBSD_ifconfig +12 -0
  258. data/spec/fixtures/unit/util/ip/Mac_OS_X_10.5.5_ifconfig +26 -0
  259. data/spec/fixtures/unit/util/ip/darwin_ifconfig_all_with_multiple_interfaces +10 -0
  260. data/spec/fixtures/unit/util/ip/darwin_ifconfig_single_interface +6 -0
  261. data/spec/fixtures/unit/util/ip/debian_kfreebsd_ifconfig +40 -0
  262. data/spec/fixtures/unit/util/ip/hpux_1111_ifconfig_lan0 +2 -0
  263. data/spec/fixtures/unit/util/ip/hpux_1111_ifconfig_lan1 +2 -0
  264. data/spec/fixtures/unit/util/ip/hpux_1111_ifconfig_lo0 +2 -0
  265. data/spec/fixtures/unit/util/ip/hpux_1111_lanscan +5 -0
  266. data/spec/fixtures/unit/util/ip/hpux_1111_netstat_in +4 -0
  267. data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_ifconfig_lan0 +2 -0
  268. data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_ifconfig_lan1 +2 -0
  269. data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_ifconfig_lo0 +2 -0
  270. data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_lanscan +5 -0
  271. data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_netstat_in +4 -0
  272. data/spec/fixtures/unit/util/ip/hpux_1131_ifconfig_lan0 +2 -0
  273. data/spec/fixtures/unit/util/ip/hpux_1131_ifconfig_lan1 +2 -0
  274. data/spec/fixtures/unit/util/ip/hpux_1131_ifconfig_lo0 +2 -0
  275. data/spec/fixtures/unit/util/ip/hpux_1131_lanscan +4 -0
  276. data/spec/fixtures/unit/util/ip/hpux_1131_netstat_in +4 -0
  277. data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_ifconfig_lan1 +2 -0
  278. data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_ifconfig_lan4 +2 -0
  279. data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_ifconfig_lan4_1 +2 -0
  280. data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_ifconfig_lo0 +2 -0
  281. data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_lanscan +9 -0
  282. data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_netstat_in +6 -0
  283. data/spec/fixtures/unit/util/ip/linux_2_6_35_proc_net_bonding_bond0 +19 -0
  284. data/spec/fixtures/unit/util/ip/linux_get_single_interface_eth0 +10 -0
  285. data/spec/fixtures/unit/util/ip/linux_get_single_interface_ib0 +8 -0
  286. data/spec/fixtures/unit/util/ip/linux_get_single_interface_lo +9 -0
  287. data/spec/fixtures/unit/util/ip/linux_ifconfig_all_with_single_interface +18 -0
  288. data/spec/fixtures/unit/util/ip/linux_ifconfig_ib0 +8 -0
  289. data/spec/fixtures/unit/util/ip/solaris_ifconfig_all_with_multiple_interfaces +8 -0
  290. data/spec/fixtures/unit/util/ip/solaris_ifconfig_single_interface +3 -0
  291. data/spec/fixtures/unit/util/ip/windows_netsh_all_interfaces +12 -0
  292. data/spec/fixtures/unit/util/ip/windows_netsh_single_interface +7 -0
  293. data/spec/fixtures/unit/util/ip/windows_netsh_single_interface6 +18 -0
  294. data/spec/fixtures/unit/util/manufacturer/freebsd_dmidecode +42 -0
  295. data/spec/fixtures/unit/util/manufacturer/intel_linux_dmidecode +549 -0
  296. data/spec/fixtures/unit/util/manufacturer/linux_dmidecode_with_spaces +60 -0
  297. data/spec/fixtures/unit/util/manufacturer/opensolaris_smbios +33 -0
  298. data/spec/fixtures/unit/util/manufacturer/smartos_smbios +533 -0
  299. data/spec/fixtures/unit/util/manufacturer/solaris_sunfire_v120_prtdiag +33 -0
  300. data/spec/fixtures/unit/util/manufacturer/solaris_t5220_prtdiag +136 -0
  301. data/spec/fixtures/unit/util/operatingsystem/cumuluslinux.txt +8 -0
  302. data/spec/fixtures/unit/util/operatingsystem/redhat-7.txt +12 -0
  303. data/spec/fixtures/unit/util/operatingsystem/sabayon.txt +7 -0
  304. data/spec/fixtures/unit/util/operatingsystem/wheezy.txt +9 -0
  305. data/spec/fixtures/unit/util/partitions/partitions/mount +9 -0
  306. data/spec/fixtures/unit/util/processor/solaris-i86pc +28 -0
  307. data/spec/fixtures/unit/util/processor/solaris-sun4u +151 -0
  308. data/spec/fixtures/unit/util/processor/x86-pentium2 +41 -0
  309. data/spec/fixtures/unit/util/uptime/kstat_boot_time +1 -0
  310. data/spec/fixtures/unit/util/uptime/sysctl_kern_boottime_darwin +1 -0
  311. data/spec/fixtures/unit/util/uptime/sysctl_kern_boottime_openbsd +1 -0
  312. data/spec/fixtures/unit/util/uptime/ubuntu_proc_uptime +1 -0
  313. data/spec/fixtures/unit/util/virtual/invalid_unicode_dmi_entries +0 -0
  314. data/spec/fixtures/unit/util/virtual/solaris10_proc_self_status1 +0 -0
  315. data/spec/fixtures/unit/util/vlans/centos-5-no-vlans +2 -0
  316. data/spec/fixtures/unit/util/vlans/linux_vlan_config +6 -0
  317. data/spec/fixtures/unit/util/xendomains/xendomains +4 -0
  318. data/spec/fixtures/unit/virtual/sysfs_dmi_entries_raw.txt +0 -0
  319. data/spec/fixtures/unit/zfs_version/freebsd_8.2 +14 -0
  320. data/spec/fixtures/unit/zfs_version/freebsd_9.0 +13 -0
  321. data/spec/fixtures/unit/zfs_version/linux-fuse_0.6.9 +14 -0
  322. data/spec/fixtures/unit/zfs_version/solaris_10 +10 -0
  323. data/spec/fixtures/unit/zfs_version/solaris_11 +12 -0
  324. data/spec/fixtures/unit/zpool_version/freebsd_8.2 +26 -0
  325. data/spec/fixtures/unit/zpool_version/freebsd_9.0 +38 -0
  326. data/spec/fixtures/unit/zpool_version/linux-fuse_0.6.9 +35 -0
  327. data/spec/fixtures/unit/zpool_version/solaris_10 +31 -0
  328. data/spec/fixtures/unit/zpool_version/solaris_11 +43 -0
  329. data/spec/fixtures/virtual/proc_1_cgroup/in_a_container +9 -0
  330. data/spec/fixtures/virtual/proc_1_cgroup/in_a_docker_container +8 -0
  331. data/spec/fixtures/virtual/proc_1_cgroup/not_in_a_container +9 -0
  332. data/spec/fixtures/virtual/proc_self_status/vserver_2_1/guest +37 -0
  333. data/spec/fixtures/virtual/proc_self_status/vserver_2_1/host +36 -0
  334. data/spec/fixtures/virtual/proc_self_status/vserver_2_3/guest +39 -0
  335. data/spec/fixtures/virtual/proc_self_status/vserver_2_3/host +39 -0
  336. data/spec/integration/facter_spec.rb +39 -0
  337. data/spec/lib/facter_spec/cpuinfo.rb +15 -0
  338. data/spec/lib/facter_spec/windows_network.rb +64 -0
  339. data/spec/puppetlabs_spec/files.rb +57 -0
  340. data/spec/puppetlabs_spec/fixtures.rb +49 -0
  341. data/spec/puppetlabs_spec/matchers.rb +87 -0
  342. data/spec/puppetlabs_spec/verbose.rb +9 -0
  343. data/spec/puppetlabs_spec_helper.rb +26 -0
  344. data/spec/shared_contexts/platform.rb +55 -0
  345. data/spec/shared_formats/parses.rb +3 -0
  346. data/spec/spec_helper.rb +75 -0
  347. data/spec/unit/application_spec.rb +101 -0
  348. data/spec/unit/architecture_spec.rb +63 -0
  349. data/spec/unit/blockdevices_spec.rb +109 -0
  350. data/spec/unit/core/aggregate_spec.rb +125 -0
  351. data/spec/unit/core/directed_graph_spec.rb +79 -0
  352. data/spec/unit/core/execution/base_spec.rb +130 -0
  353. data/spec/unit/core/execution/posix_spec.rb +86 -0
  354. data/spec/unit/core/execution/windows_spec.rb +106 -0
  355. data/spec/unit/core/execution_spec.rb +42 -0
  356. data/spec/unit/core/logging_spec.rb +104 -0
  357. data/spec/unit/core/resolvable_spec.rb +81 -0
  358. data/spec/unit/core/suitable_spec.rb +106 -0
  359. data/spec/unit/dhcp_servers_spec.rb +152 -0
  360. data/spec/unit/domain_spec.rb +310 -0
  361. data/spec/unit/ec2/rest_spec.rb +145 -0
  362. data/spec/unit/ec2_spec.rb +127 -0
  363. data/spec/unit/facter_spec.rb +108 -0
  364. data/spec/unit/filesystems_spec.rb +50 -0
  365. data/spec/unit/fqdn_spec.rb +16 -0
  366. data/spec/unit/gce/metadata_spec.rb +49 -0
  367. data/spec/unit/gce_spec.rb +34 -0
  368. data/spec/unit/hardwareisa_spec.rb +41 -0
  369. data/spec/unit/hardwaremodel_spec.rb +56 -0
  370. data/spec/unit/hostname_spec.rb +40 -0
  371. data/spec/unit/id_spec.rb +29 -0
  372. data/spec/unit/interfaces_spec.rb +57 -0
  373. data/spec/unit/ipaddress6_spec.rb +161 -0
  374. data/spec/unit/ipaddress_spec.rb +114 -0
  375. data/spec/unit/kernel_spec.rb +24 -0
  376. data/spec/unit/kernelmajversion_spec.rb +22 -0
  377. data/spec/unit/kernelrelease_spec.rb +69 -0
  378. data/spec/unit/kernelversion_spec.rb +32 -0
  379. data/spec/unit/ldom_spec.rb +75 -0
  380. data/spec/unit/lsbdistcodename_spec.rb +25 -0
  381. data/spec/unit/lsbdistdescription_spec.rb +25 -0
  382. data/spec/unit/lsbdistid_spec.rb +25 -0
  383. data/spec/unit/lsbdistrelease_spec.rb +25 -0
  384. data/spec/unit/lsbmajdistrelease_spec.rb +13 -0
  385. data/spec/unit/lsbrelease_spec.rb +25 -0
  386. data/spec/unit/macaddress_spec.rb +73 -0
  387. data/spec/unit/manufacturer_spec.rb +115 -0
  388. data/spec/unit/memory_spec.rb +470 -0
  389. data/spec/unit/netmask_spec.rb +106 -0
  390. data/spec/unit/operatingsystem_spec.rb +160 -0
  391. data/spec/unit/operatingsystemmajrelease_spec.rb +38 -0
  392. data/spec/unit/operatingsystemrelease_spec.rb +236 -0
  393. data/spec/unit/osfamily_spec.rb +62 -0
  394. data/spec/unit/partitions_spec.rb +48 -0
  395. data/spec/unit/physicalprocessorcount_spec.rb +85 -0
  396. data/spec/unit/processor_spec.rb +401 -0
  397. data/spec/unit/ps_spec.rb +42 -0
  398. data/spec/unit/selinux_spec.rb +114 -0
  399. data/spec/unit/ssh_spec.rb +77 -0
  400. data/spec/unit/uniqueid_spec.rb +27 -0
  401. data/spec/unit/uptime_spec.rb +110 -0
  402. data/spec/unit/util/collection_spec.rb +258 -0
  403. data/spec/unit/util/config_spec.rb +97 -0
  404. data/spec/unit/util/confine_spec.rb +148 -0
  405. data/spec/unit/util/dhcp_servers_spec.rb +63 -0
  406. data/spec/unit/util/directory_loader_spec.rb +88 -0
  407. data/spec/unit/util/ec2_spec.rb +184 -0
  408. data/spec/unit/util/fact_spec.rb +142 -0
  409. data/spec/unit/util/file_read_spec.rb +29 -0
  410. data/spec/unit/util/formatter_spec.rb +50 -0
  411. data/spec/unit/util/ip/windows_spec.rb +80 -0
  412. data/spec/unit/util/ip_spec.rb +467 -0
  413. data/spec/unit/util/loader_spec.rb +286 -0
  414. data/spec/unit/util/macaddress_spec.rb +141 -0
  415. data/spec/unit/util/macosx_spec.rb +114 -0
  416. data/spec/unit/util/manufacturer_spec.rb +223 -0
  417. data/spec/unit/util/normalization_spec.rb +113 -0
  418. data/spec/unit/util/operatingsystem_spec.rb +92 -0
  419. data/spec/unit/util/parser_spec.rb +200 -0
  420. data/spec/unit/util/partitions/partitions_spec.rb +67 -0
  421. data/spec/unit/util/partitions_spec.rb +19 -0
  422. data/spec/unit/util/posix_spec.rb +11 -0
  423. data/spec/unit/util/processor_spec.rb +92 -0
  424. data/spec/unit/util/registry_spec.rb +76 -0
  425. data/spec/unit/util/resolution_spec.rb +129 -0
  426. data/spec/unit/util/solaris_zones_spec.rb +127 -0
  427. data/spec/unit/util/uptime_spec.rb +126 -0
  428. data/spec/unit/util/values_spec.rb +171 -0
  429. data/spec/unit/util/virtual_spec.rb +364 -0
  430. data/spec/unit/util/vlans_spec.rb +42 -0
  431. data/spec/unit/util/wmi_spec.rb +19 -0
  432. data/spec/unit/util/xendomains_spec.rb +21 -0
  433. data/spec/unit/version_spec.rb +42 -0
  434. data/spec/unit/virtual_spec.rb +519 -0
  435. data/spec/unit/zfs_version_spec.rb +75 -0
  436. data/spec/unit/zonename_spec.rb +14 -0
  437. data/spec/unit/zones_spec.rb +55 -0
  438. data/spec/unit/zpool_version_spec.rb +75 -0
  439. data/spec/watchr.rb +125 -0
  440. metadata +815 -0
@@ -0,0 +1,106 @@
1
+ require 'timeout'
2
+ require 'open-uri'
3
+
4
+ # Provide a set of utility static methods that help with resolving the EC2
5
+ # fact.
6
+ module Facter::Util::EC2
7
+ class << self
8
+ # Test if we can connect to the EC2 api. Return true if able to connect.
9
+ # On failure this function fails silently and returns false.
10
+ #
11
+ # The +wait_sec+ parameter provides you with an adjustable timeout.
12
+ #
13
+ def can_connect?(wait_sec=2)
14
+ Facter.warnonce("#{self}.#{__method__} is deprecated; see the Facter::EC2 classes instead")
15
+ url = "http://169.254.169.254:80/"
16
+ Timeout::timeout(wait_sec) {open(url)}
17
+ return true
18
+ rescue Timeout::Error
19
+ return false
20
+ rescue
21
+ return false
22
+ end
23
+
24
+ # Test if this host has a mac address used by Eucalyptus clouds, which
25
+ # normally is +d0:0d+.
26
+ def has_euca_mac?
27
+ Facter.warnonce("#{self}.#{__method__} is deprecated; see the Facter::EC2 classes instead")
28
+ !!(Facter.value(:macaddress) =~ %r{^[dD]0:0[dD]:})
29
+ end
30
+
31
+ # Test if this host has a mac address used by OpenStack, which
32
+ # normally starts with FA:16:3E (older versions of OpenStack
33
+ # may generate mac addresses starting with 02:16:3E)
34
+ def has_openstack_mac?
35
+ Facter.warnonce("#{self}.#{__method__} is deprecated; see the Facter::EC2 classes instead")
36
+ !!(Facter.value(:macaddress) =~ %r{^(02|[fF][aA]):16:3[eE]})
37
+ end
38
+
39
+ # Test if the host has an arp entry in its cache that matches the EC2 arp,
40
+ # which is normally +fe:ff:ff:ff:ff:ff+.
41
+ def has_ec2_arp?
42
+ Facter.warnonce("#{self}.#{__method__} is deprecated; see the Facter::EC2 classes instead")
43
+ kernel = Facter.value(:kernel)
44
+
45
+ mac_address_re = case kernel
46
+ when /Windows/i
47
+ /fe-ff-ff-ff-ff-ff/i
48
+ else
49
+ /fe:ff:ff:ff:ff:ff/i
50
+ end
51
+
52
+ arp_command = case kernel
53
+ when /Windows/i, /SunOS/i
54
+ "arp -a"
55
+ else
56
+ "arp -an"
57
+ end
58
+
59
+ if arp_table = Facter::Core::Execution.exec(arp_command)
60
+ return true if arp_table.match(mac_address_re)
61
+ end
62
+ return false
63
+ end
64
+ end
65
+
66
+ ##
67
+ # userdata returns a single string containing the body of the response of the
68
+ # GET request for the URI http://169.254.169.254/latest/user-data/ If the
69
+ # metadata server responds with a 404 Not Found error code then this method
70
+ # retuns `nil`.
71
+ #
72
+ # @param version [String] containing the API version for the request.
73
+ # Defaults to "latest" and other examples are documented at
74
+ # http://aws.amazon.com/archives/Amazon%20EC2
75
+ #
76
+ # @api public
77
+ #
78
+ # @return [String] containing the response body or `nil`
79
+ def self.userdata(version="latest")
80
+ Facter.warnonce("#{self}.#{__method__} is deprecated; see the Facter::EC2 classes instead")
81
+ uri = "http://169.254.169.254/#{version}/user-data/"
82
+ begin
83
+ read_uri(uri)
84
+ rescue OpenURI::HTTPError => detail
85
+ case detail.message
86
+ when /404 Not Found/i
87
+ Facter.debug "No user-data present at #{uri}: server responded with #{detail.message}"
88
+ return nil
89
+ else
90
+ raise detail
91
+ end
92
+ end
93
+ end
94
+
95
+ ##
96
+ # read_uri provides a seam method to easily test the HTTP client
97
+ # functionality of a HTTP based metadata server.
98
+ #
99
+ # @api private
100
+ #
101
+ # @return [String] containing the body of the response
102
+ def self.read_uri(uri)
103
+ open(uri).read
104
+ end
105
+ private_class_method :read_uri
106
+ end
@@ -0,0 +1,204 @@
1
+ require 'facter'
2
+ require 'facter/util/resolution'
3
+ require 'facter/core/aggregate'
4
+
5
+ # This class represents a fact. Each fact has a name and multiple
6
+ # {Facter::Util::Resolution resolutions}.
7
+ #
8
+ # Create facts using {Facter.add}
9
+ #
10
+ # @api public
11
+ class Facter::Util::Fact
12
+ # The name of the fact
13
+ # @return [String]
14
+ attr_accessor :name
15
+
16
+ # @return [String]
17
+ # @deprecated
18
+ attr_accessor :ldapname
19
+
20
+ # Creates a new fact, with no resolution mechanisms. See {Facter.add}
21
+ # for the public API for creating facts.
22
+ # @param name [String] the fact name
23
+ # @param options [Hash] optional parameters
24
+ # @option options [String] :ldapname set the ldapname property on the fact
25
+ #
26
+ # @api private
27
+ def initialize(name, options = {})
28
+ @name = name.to_s.downcase.intern
29
+
30
+ extract_ldapname_option!(options)
31
+
32
+ @ldapname ||= @name.to_s
33
+
34
+ @resolves = []
35
+ @searching = false
36
+
37
+ @value = nil
38
+ end
39
+
40
+ # Adds a new {Facter::Util::Resolution resolution}. This requires a
41
+ # block, which will then be evaluated in the context of the new
42
+ # resolution.
43
+ #
44
+ # @param options [Hash] A hash of options to set on the resolution
45
+ #
46
+ # @return [Facter::Util::Resolution]
47
+ #
48
+ # @api private
49
+ def add(options = {}, &block)
50
+ define_resolution(nil, options, &block)
51
+ end
52
+
53
+ # Define a new named resolution or return an existing resolution with
54
+ # the given name.
55
+ #
56
+ # @param resolution_name [String] The name of the resolve to define or look up
57
+ # @param options [Hash] A hash of options to set on the resolution
58
+ # @return [Facter::Util::Resolution]
59
+ #
60
+ # @api public
61
+ def define_resolution(resolution_name, options = {}, &block)
62
+
63
+ resolution_type = options.delete(:type) || :simple
64
+
65
+ resolve = create_or_return_resolution(resolution_name, resolution_type)
66
+
67
+ resolve.set_options(options) unless options.empty?
68
+ resolve.evaluate(&block) if block
69
+
70
+ resolve
71
+ rescue => e
72
+ Facter.log_exception(e, "Unable to add resolve #{resolution_name.inspect} for fact #{@name}: #{e.message}")
73
+ end
74
+
75
+ # Retrieve an existing resolution by name
76
+ #
77
+ # @param name [String]
78
+ #
79
+ # @return [Facter::Util::Resolution, nil] The resolution if exists, nil if
80
+ # it doesn't exist or name is nil
81
+ def resolution(name)
82
+ return nil if name.nil?
83
+
84
+ @resolves.find { |resolve| resolve.name == name }
85
+ end
86
+
87
+ # Flushes any cached values.
88
+ #
89
+ # @return [void]
90
+ #
91
+ # @api private
92
+ def flush
93
+ @resolves.each { |r| r.flush }
94
+ @value = nil
95
+ end
96
+
97
+ # Returns the value for this fact. This searches all resolutions by
98
+ # suitability and weight (see {Facter::Util::Resolution}). If no
99
+ # suitable resolution is found, it returns nil.
100
+ #
101
+ # @api public
102
+ def value
103
+ return @value if @value
104
+
105
+ if @resolves.empty?
106
+ Facter.debug "No resolves for %s" % @name
107
+ return nil
108
+ end
109
+
110
+ searching do
111
+
112
+ suitable_resolutions = sort_by_weight(find_suitable_resolutions(@resolves))
113
+ @value = find_first_real_value(suitable_resolutions)
114
+
115
+ announce_when_no_suitable_resolution(suitable_resolutions)
116
+ announce_when_no_value_found(@value)
117
+
118
+ @value
119
+ end
120
+ end
121
+
122
+ # @api private
123
+ # @deprecated
124
+ def extract_ldapname_option!(options)
125
+ if options[:ldapname]
126
+ Facter.warnonce("ldapname is deprecated and will be removed in a future version")
127
+ self.ldapname = options.delete(:ldapname)
128
+ end
129
+ end
130
+
131
+ private
132
+
133
+ # Are we in the midst of a search?
134
+ def searching?
135
+ @searching
136
+ end
137
+
138
+ # Lock our searching process, so we never ge stuck in recursion.
139
+ def searching
140
+ raise RuntimeError, "Caught recursion on #{@name}" if searching?
141
+
142
+ # If we've gotten this far, we're not already searching, so go ahead and do so.
143
+ @searching = true
144
+ begin
145
+ yield
146
+ ensure
147
+ @searching = false
148
+ end
149
+ end
150
+
151
+ def find_suitable_resolutions(resolutions)
152
+ resolutions.find_all{ |resolve| resolve.suitable? }
153
+ end
154
+
155
+ def sort_by_weight(resolutions)
156
+ resolutions.sort { |a, b| b.weight <=> a.weight }
157
+ end
158
+
159
+ def find_first_real_value(resolutions)
160
+ resolutions.each do |resolve|
161
+ value = resolve.value
162
+ if not value.nil?
163
+ return value
164
+ end
165
+ end
166
+ nil
167
+ end
168
+
169
+ def announce_when_no_suitable_resolution(resolutions)
170
+ if resolutions.empty?
171
+ Facter.debug "Found no suitable resolves of %s for %s" % [@resolves.length, @name]
172
+ end
173
+ end
174
+
175
+ def announce_when_no_value_found(value)
176
+ if value.nil?
177
+ Facter.debug("value for %s is still nil" % @name)
178
+ end
179
+ end
180
+
181
+ def create_or_return_resolution(resolution_name, resolution_type)
182
+ resolve = self.resolution(resolution_name)
183
+
184
+ if resolve
185
+ if resolution_type != resolve.resolution_type
186
+ raise ArgumentError, "Cannot return resolution #{resolution_name} with type" +
187
+ " #{resolution_type}; already defined as #{resolve.resolution_type}"
188
+ end
189
+ else
190
+ case resolution_type
191
+ when :simple
192
+ resolve = Facter::Util::Resolution.new(resolution_name, self)
193
+ when :aggregate
194
+ resolve = Facter::Core::Aggregate.new(resolution_name, self)
195
+ else
196
+ raise ArgumentError, "Expected resolution type to be one of (:simple, :aggregate) but was #{resolution_type}"
197
+ end
198
+
199
+ @resolves << resolve
200
+ end
201
+
202
+ resolve
203
+ end
204
+ end
@@ -0,0 +1,37 @@
1
+ module Facter
2
+ module Util
3
+
4
+ # {Facter::Util::FileRead} is a utility module intended to provide easily
5
+ # mockable methods that delegate to simple file read methods. The intent is to
6
+ # avoid the need to execute the `cat` system command or `File.read` directly in
7
+ # Ruby, as mocking these behaviors can have wide-ranging effects.
8
+ #
9
+ # All Facter facts are encouraged to use this method instead of File.read or
10
+ # Facter::Core::Execution.exec('cat ...')
11
+ #
12
+ # @api public
13
+ module FileRead
14
+ # read returns the raw content of a file as a string. If the file does not
15
+ # exist, or the process does not have permission to read the file then nil is
16
+ # returned.
17
+ #
18
+ # @api public
19
+ #
20
+ # @param path [String] the path to be read
21
+ #
22
+ # @return [String, nil] the raw contents of the file or `nil` if the
23
+ # file cannot be read because it does not exist or the process does not have
24
+ # permission to read the file.
25
+ def self.read(path)
26
+ File.read(path)
27
+ rescue Errno::ENOENT, Errno::EACCES => detail
28
+ Facter.debug "Could not read #{path}: #{detail.message}"
29
+ nil
30
+ end
31
+
32
+ def self.read_binary(path)
33
+ File.open(path, "rb") { |contents| contents.read }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,39 @@
1
+ require 'yaml'
2
+
3
+ module Facter
4
+ module Util
5
+ module Formatter
6
+
7
+ def self.format_json(hash)
8
+ if Facter.json?
9
+ JSON.pretty_generate(hash)
10
+ else
11
+ raise "Cannot format facts as JSON; 'json' library is not present"
12
+ end
13
+ end
14
+
15
+ def self.format_yaml(hash)
16
+ YAML.dump(hash)
17
+ end
18
+
19
+ def self.format_plaintext(hash)
20
+ output = ''
21
+
22
+ # Print the value of a single fact, otherwise print a list sorted by fact
23
+ # name and separated by "=>"
24
+ if hash.length == 1
25
+ if value = hash.values.first
26
+ output = value.is_a?(String) ? value : value.inspect
27
+ end
28
+ else
29
+ hash.sort_by { |(name, value)| name }.each do |name,value|
30
+ value = value.is_a?(String) ? value : value.inspect
31
+ output << "#{name} => #{value}\n"
32
+ end
33
+ end
34
+
35
+ output
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,285 @@
1
+ # A base module for collecting IP-related
2
+ # information from all kinds of platforms.
3
+ module Facter::Util::IP
4
+ # A map of all the different regexes that work for
5
+ # a given platform or set of platforms.
6
+ REGEX_MAP = {
7
+ :linux => {
8
+ :ipaddress => /inet (?:addr:)?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/,
9
+ :ipaddress6 => /inet6 (?:addr: )?((?![fe80|::1])(?>[0-9,a-f,A-F]*\:{1,2})+[0-9,a-f,A-F]{0,4})/,
10
+ :macaddress => /(?:ether|HWaddr)\s+((\w{1,2}:){5,}\w{1,2})/,
11
+ :netmask => /(?:Mask:|netmask )([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/,
12
+ :mtu => /MTU:?\s*(\d+)/i
13
+ },
14
+ :bsd => {
15
+ :aliases => [:openbsd, :netbsd, :freebsd, :darwin, :"gnu/kfreebsd", :dragonfly],
16
+ :ipaddress => /inet\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/,
17
+ :ipaddress6 => /inet6 ((?![fe80|::1])(?>[0-9,a-f,A-F]*\:{1,2})+[0-9,a-f,A-F]{0,4})/,
18
+ :macaddress => /(?:ether|lladdr)\s+(\w?\w:\w?\w:\w?\w:\w?\w:\w?\w:\w?\w)/,
19
+ :netmask => /netmask\s+0x(\w{8})/,
20
+ :mtu => /mtu\s+(\d+)/
21
+ },
22
+ :sunos => {
23
+ :ipaddress => /inet\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/,
24
+ :ipaddress6 => /inet6 ((?![fe80|::1])(?>[0-9,a-f,A-F]*\:{1,2})+[0-9,a-f,A-F]{0,4})/,
25
+ :macaddress => /(?:ether|lladdr)\s+(\w?\w:\w?\w:\w?\w:\w?\w:\w?\w:\w?\w)/,
26
+ :netmask => /netmask\s+(\w{8})/,
27
+ :mtu => /mtu\s+(\d+)/
28
+ },
29
+ :"hp-ux" => {
30
+ :ipaddress => /\s+inet (\S+)\s.*/,
31
+ :macaddress => /(\w{1,2}:\w{1,2}:\w{1,2}:\w{1,2}:\w{1,2}:\w{1,2})/,
32
+ :netmask => /.*\s+netmask (\S+)\s.*/
33
+ },
34
+ :windows => {}
35
+ }
36
+
37
+ # Convert an interface name into purely alphanumeric characters.
38
+ def self.alphafy(interface)
39
+ interface.gsub(/[^a-z0-9_]/i, '_')
40
+ end
41
+
42
+ def self.convert_from_hex?(kernel)
43
+ kernels_to_convert = [:sunos, :openbsd, :netbsd, :freebsd, :darwin, :"hp-ux", :"gnu/kfreebsd", :dragonfly]
44
+ kernels_to_convert.include?(kernel)
45
+ end
46
+
47
+ def self.supported_platforms
48
+ REGEX_MAP.inject([]) do |result, tmp|
49
+ key, map = tmp
50
+ if map[:aliases]
51
+ result += map[:aliases]
52
+ else
53
+ result << key
54
+ end
55
+ result
56
+ end
57
+ end
58
+
59
+ def self.get_interfaces
60
+ if Facter.value(:kernel) == 'windows'
61
+ require 'facter/util/ip/windows'
62
+ return Facter::Util::IP::Windows.interfaces
63
+ end
64
+
65
+ return [] unless output = Facter::Util::IP.get_all_interface_output()
66
+
67
+ # Our regex appears to be stupid, in that it leaves colons sitting
68
+ # at the end of interfaces. So, we have to trim those trailing
69
+ # characters. I tried making the regex better but supporting all
70
+ # platforms with a single regex is probably a bit too much.
71
+ output.scan(/^\S+/).collect { |i| i.sub(/:$/, '') }.uniq
72
+ end
73
+
74
+ def self.get_all_interface_output
75
+ case Facter.value(:kernel)
76
+ when 'Linux', 'OpenBSD', 'NetBSD', 'FreeBSD', 'Darwin', 'GNU/kFreeBSD', 'DragonFly'
77
+ output = Facter::Util::IP.exec_ifconfig(["-a","2>/dev/null"])
78
+ when 'SunOS'
79
+ output = Facter::Util::IP.exec_ifconfig(["-a"])
80
+ when 'HP-UX'
81
+ # (#17487)[https://projects.puppetlabs.com/issues/17487]
82
+ # Handle NIC bonding where asterisks and virtual NICs are printed.
83
+ if output = hpux_netstat_in
84
+ output.gsub!(/\*/, "") # delete asterisks.
85
+ output.gsub!(/^[^\n]*none[^\n]*\n/, "") # delete lines with 'none' instead of IPs.
86
+ output.sub!(/^[^\n]*\n/, "") # delete the header line.
87
+ output
88
+ end
89
+ end
90
+ output
91
+ end
92
+
93
+
94
+ ##
95
+ # exec_ifconfig uses the ifconfig command
96
+ #
97
+ # @return [String] the output of `ifconfig #{arguments} 2>/dev/null` or nil
98
+ def self.exec_ifconfig(additional_arguments=[])
99
+ Facter::Core::Execution.exec("#{self.get_ifconfig} #{additional_arguments.join(' ')}")
100
+ end
101
+ ##
102
+ # get_ifconfig looks up the ifconfig binary
103
+ #
104
+ # @return [String] path to the ifconfig binary
105
+ def self.get_ifconfig
106
+ common_paths=["/bin/ifconfig","/sbin/ifconfig","/usr/sbin/ifconfig"]
107
+ common_paths.select{|path| File.executable?(path)}.first
108
+ end
109
+ ##
110
+ # hpux_netstat_in is a delegate method that allows us to stub netstat -in
111
+ # without stubbing exec.
112
+ def self.hpux_netstat_in
113
+ Facter::Core::Execution.exec("/bin/netstat -in")
114
+ end
115
+
116
+ def self.get_infiniband_macaddress(interface)
117
+ if File.exists?("/sys/class/net/#{interface}/address") then
118
+ ib_mac_address = `cat /sys/class/net/#{interface}/address`.chomp
119
+ elsif File.exists?("/sbin/ip") then
120
+ ip_output = %x{/sbin/ip link show #{interface}}
121
+ ib_mac_address = ip_output.scan(%r{infiniband\s+((\w{1,2}:){5,}\w{1,2})})
122
+ else
123
+ ib_mac_address = "FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF"
124
+ Facter.debug("ip.rb: nothing under /sys/class/net/#{interface}/address and /sbin/ip not available")
125
+ end
126
+ ib_mac_address
127
+ end
128
+
129
+ def self.ifconfig_interface(interface)
130
+ output = Facter::Util::IP.exec_ifconfig([interface,"2>/dev/null"])
131
+ end
132
+
133
+ def self.get_single_interface_output(interface)
134
+ output = ""
135
+ case Facter.value(:kernel)
136
+ when 'OpenBSD', 'NetBSD', 'FreeBSD', 'Darwin', 'GNU/kFreeBSD', 'DragonFly'
137
+ output = Facter::Util::IP.ifconfig_interface(interface)
138
+ when 'Linux'
139
+ ifconfig_output = Facter::Util::IP.ifconfig_interface(interface)
140
+ if interface =~ /^ib/ then
141
+ real_mac_address = get_infiniband_macaddress(interface)
142
+ output = ifconfig_output.sub(%r{(?:ether|HWaddr)\s+((\w{1,2}:){5,}\w{1,2})}, "HWaddr #{real_mac_address}")
143
+ else
144
+ output = ifconfig_output
145
+ end
146
+ when 'SunOS'
147
+ output = Facter::Util::IP.exec_ifconfig([interface])
148
+ when 'HP-UX'
149
+ mac = ""
150
+ ifc = hpux_ifconfig_interface(interface)
151
+ hpux_lanscan.scan(/(\dx\S+).*UP\s+(\w+\d+)/).each {|i| mac = i[0] if i.include?(interface) }
152
+ mac = mac.sub(/0x(\S+)/,'\1').scan(/../).join(":")
153
+ output = ifc + "\n" + mac
154
+ end
155
+ output
156
+ end
157
+
158
+ def self.hpux_ifconfig_interface(interface)
159
+ Facter::Util::IP.exec_ifconfig([interface])
160
+ end
161
+
162
+ def self.hpux_lanscan
163
+ Facter::Core::Execution.exec("/usr/sbin/lanscan")
164
+ end
165
+
166
+ def self.get_output_for_interface_and_label(interface, label)
167
+ return get_single_interface_output(interface) unless Facter.value(:kernel) == 'windows'
168
+
169
+ require 'facter/util/ip/windows'
170
+ output = Facter::Util::IP::Windows.value_for_interface_and_label(interface, label)
171
+ output ? output : ""
172
+ end
173
+
174
+ def self.get_bonding_master(interface)
175
+ if Facter.value(:kernel) != 'Linux'
176
+ return nil
177
+ end
178
+ # We need ip instead of ifconfig because it will show us
179
+ # the bonding master device.
180
+ if not FileTest.executable?("/sbin/ip")
181
+ return nil
182
+ end
183
+ # A bonding interface can never be an alias interface. Alias
184
+ # interfaces do have a colon in their name and the ip link show
185
+ # command throws an error message when we pass it an alias
186
+ # interface.
187
+ if interface =~ /:/
188
+ return nil
189
+ end
190
+ regex = /SLAVE[,>].* (bond[0-9]+)/
191
+ ethbond = regex.match(%x{/sbin/ip link show #{interface}})
192
+ if ethbond
193
+ device = ethbond[1]
194
+ else
195
+ device = nil
196
+ end
197
+ device
198
+ end
199
+
200
+ ##
201
+ # get_interface_value obtains the value of a specific attribute of a specific
202
+ # interface.
203
+ #
204
+ # @param interface [String] the interface identifier, e.g. "eth0" or "bond0"
205
+ #
206
+ # @param label [String] the attribute of the interface to obtain a value for,
207
+ # e.g. "netmask" or "ipaddress"
208
+ #
209
+ # @api private
210
+ #
211
+ # @return [String] representing the requested value. An empty array is
212
+ # returned if the kernel is not supported by the REGEX_MAP constant.
213
+ def self.get_interface_value(interface, label)
214
+ if Facter.value(:kernel) == 'windows'
215
+ require 'facter/util/ip/windows'
216
+ return Facter::Util::IP::Windows.value_for_interface_and_label(interface, label)
217
+ end
218
+
219
+ tmp1 = []
220
+
221
+ kernel = Facter.value(:kernel).downcase.to_sym
222
+
223
+ # If it's not directly in the map or aliased in the map, then we don't know how to deal with it.
224
+ unless map = REGEX_MAP[kernel] || REGEX_MAP.values.find { |tmp| tmp[:aliases] and tmp[:aliases].include?(kernel) }
225
+ return []
226
+ end
227
+
228
+ # Pull the correct regex out of the map.
229
+ regex = map[label.to_sym]
230
+
231
+ # Linux changes the MAC address reported via ifconfig when an ethernet interface
232
+ # becomes a slave of a bonding device to the master MAC address.
233
+ # We have to dig a bit to get the original/real MAC address of the interface.
234
+ bonddev = get_bonding_master(interface)
235
+ if label == 'macaddress' and bonddev
236
+ bondinfo = read_proc_net_bonding("/proc/net/bonding/#{bonddev}")
237
+ re = /^Slave Interface: #{interface}\b.*?\bPermanent HW addr: (([0-9A-F]{2}:?)*)$/im
238
+ if match = re.match(bondinfo)
239
+ value = match[1].upcase
240
+ end
241
+ else
242
+ output_int = get_output_for_interface_and_label(interface, label)
243
+
244
+ output_int.each_line do |s|
245
+ if s =~ regex
246
+ value = $1
247
+ if label == 'netmask' && convert_from_hex?(kernel)
248
+ value = value.scan(/../).collect do |byte| byte.to_i(16) end.join('.')
249
+ end
250
+ tmp1.push(value)
251
+ end
252
+ end
253
+
254
+ if tmp1
255
+ value = tmp1.shift
256
+ end
257
+ end
258
+ end
259
+
260
+ ##
261
+ # read_proc_net_bonding is a seam method for mocking purposes.
262
+ #
263
+ # @param path [String] representing the path to read, e.g. "/proc/net/bonding/bond0"
264
+ #
265
+ # @api private
266
+ #
267
+ # @return [String] modeling the raw file read
268
+ def self.read_proc_net_bonding(path)
269
+ File.read(path) if File.exists?(path)
270
+ end
271
+ private_class_method :read_proc_net_bonding
272
+
273
+ def self.get_network_value(interface)
274
+ require 'ipaddr'
275
+
276
+ ipaddress = get_interface_value(interface, "ipaddress")
277
+ netmask = get_interface_value(interface, "netmask")
278
+
279
+ if ipaddress && netmask
280
+ ip = IPAddr.new(ipaddress, Socket::AF_INET)
281
+ subnet = IPAddr.new(netmask, Socket::AF_INET)
282
+ network = ip.mask(subnet.to_s).to_s
283
+ end
284
+ end
285
+ end