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,42 @@
1
+ # Fact: Cfkey
2
+ #
3
+ # Purpose: Return the public key(s) for CFengine.
4
+ #
5
+ # Resolution:
6
+ # Tries each file of standard localhost.pub & cfkey.pub locations,
7
+ # checks if they appear to be a public key, and then join them all together.
8
+ #
9
+ # Caveats:
10
+ #
11
+
12
+ ## Cfkey.rb
13
+ ## Facts related to cfengine
14
+ ##
15
+
16
+ Facter.add(:Cfkey) do
17
+ setcode do
18
+ value = nil
19
+ ["/usr/local/etc/cfkey.pub",
20
+ "/etc/cfkey.pub",
21
+ "/var/cfng/keys/localhost.pub",
22
+ "/var/cfengine/ppkeys/localhost.pub",
23
+ "/var/lib/cfengine/ppkeys/localhost.pub",
24
+ "/var/lib/cfengine2/ppkeys/localhost.pub"
25
+ ].each do |file|
26
+ if FileTest.file?(file)
27
+ File.open(file) { |openfile|
28
+ value = openfile.readlines.reject { |line|
29
+ line =~ /PUBLIC KEY/
30
+ }.collect { |line|
31
+ line.chomp
32
+ }.join("")
33
+ }
34
+ end
35
+ if value
36
+ break
37
+ end
38
+ end
39
+
40
+ value
41
+ end
42
+ end
@@ -0,0 +1,204 @@
1
+ require 'optparse'
2
+ require 'facter'
3
+ require 'facter/util/formatter'
4
+
5
+ module Facter
6
+ module Application
7
+
8
+ require 'facter/util/nothing_loader'
9
+
10
+ def self.create_directory_loader(dir)
11
+ begin
12
+ Facter::Util::Config.ext_fact_loader = Facter::Util::DirectoryLoader.loader_for(dir)
13
+ rescue Facter::Util::DirectoryLoader::NoSuchDirectoryError => error
14
+ Facter.log_exception(error, "Specified external facts directory #{dir} does not exist.")
15
+ exit(1)
16
+ end
17
+ end
18
+
19
+ def self.create_nothing_loader
20
+ Facter::Util::Config.ext_fact_loader = Facter::Util::NothingLoader.new
21
+ end
22
+
23
+ def self.run(argv)
24
+ options = parse(argv)
25
+
26
+ # Accept fact names to return from the command line
27
+ names = argv
28
+
29
+ # Change location of external facts dir
30
+ # Check here for valid ext_dir and exit program
31
+
32
+ # Create the facts hash that is printed to standard out.
33
+ unless names.empty?
34
+ facts = {}
35
+ names.each do |name|
36
+ begin
37
+ facts[name] = Facter.value(name)
38
+ rescue => error
39
+ Facter.log_exception(error, "Could not retrieve #{name}: #{error.message}")
40
+ exit(10)
41
+ end
42
+ end
43
+ end
44
+
45
+ # Print everything if they didn't ask for specific facts.
46
+ facts ||= Facter.to_hash
47
+
48
+ output = nil
49
+
50
+ if options[:yaml]
51
+ output = Facter::Util::Formatter.format_yaml(facts)
52
+ elsif options[:json]
53
+ output = Facter::Util::Formatter.format_json(facts)
54
+ elsif options[:plaintext]
55
+ output = Facter::Util::Formatter.format_plaintext(facts)
56
+ else
57
+ output = Facter::Util::Formatter.format_plaintext(facts)
58
+ end
59
+
60
+ puts output
61
+ exit(0)
62
+
63
+ rescue => e
64
+ Facter.log_exception(e)
65
+ exit(12)
66
+ end
67
+
68
+ private
69
+
70
+ # Parses the given argument array destructively to return an options hash
71
+ # (and possibly perform side effects such as changing settings).
72
+ #
73
+ # @param [Array<String>] argv command line arguments
74
+ # @return [Hash] options hash
75
+ def self.parse(argv)
76
+ options = {}
77
+ parser = OptionParser.new do |opts|
78
+ opts.banner = <<-BANNER
79
+ facter(8) -- Gather system information
80
+ ======
81
+
82
+ SYNOPSIS
83
+ --------
84
+
85
+ Collect and display facts about the system.
86
+
87
+ USAGE
88
+ -----
89
+
90
+ facter [-h|--help] [-t|--timing] [-d|--debug] [-p|--puppet] [-v|--version]
91
+ [-y|--yaml] [-j|--json] [--plaintext] [--external-dir DIR] [--no-external-dir]
92
+ [fact] [fact] [...]
93
+
94
+ DESCRIPTION
95
+ -----------
96
+
97
+ Collect and display facts about the current system. The library behind
98
+ Facter is easy to expand, making Facter an easy way to collect information
99
+ about a system from within the shell or within Ruby.
100
+
101
+ If no facts are specifically asked for, then all facts will be returned.
102
+
103
+ EXAMPLE
104
+ -------
105
+
106
+ Display all facts:
107
+
108
+ $ facter
109
+ architecture => amd64
110
+ blockdevices => sda,sr0
111
+ domain => example.com
112
+ fqdn => puppet.example.com
113
+ hardwaremodel => x86_64
114
+ [...]
115
+
116
+ Display a single fact:
117
+
118
+ $ facter kernel
119
+ Linux
120
+
121
+ Format facts as JSON:
122
+
123
+ $ facter --json architecture kernel hardwaremodel
124
+ {
125
+ "architecture": "amd64",
126
+ "kernel": "Linux",
127
+ "hardwaremodel": "x86_64"
128
+ }
129
+
130
+ AUTHOR
131
+ ------
132
+ Luke Kanies
133
+
134
+ COPYRIGHT
135
+ ---------
136
+ Copyright (c) 2011-2014 Puppet Labs, Inc Licensed under the Apache 2.0 license
137
+
138
+ OPTIONS
139
+ -------
140
+ BANNER
141
+ opts.on("-y",
142
+ "--yaml",
143
+ "Emit facts in YAML format.") { |v| options[:yaml] = v }
144
+ opts.on("-j",
145
+ "--json",
146
+ "Emit facts in JSON format.") { |v| options[:json] = v }
147
+ opts.on("--plaintext",
148
+ "Emit facts in plaintext format.") { |v| options[:plaintext] = v }
149
+ opts.on("--trace",
150
+ "Enable backtraces.") { |v| Facter.trace(true) }
151
+ opts.on("--external-dir DIR",
152
+ "The directory to use for external facts.") { |v| create_directory_loader(v) }
153
+ opts.on("--no-external-dir",
154
+ "Turn off external facts.") { |v| create_nothing_loader }
155
+ opts.on("-d",
156
+ "--debug",
157
+ "Enable debugging.") { |v| Facter.debugging(1) }
158
+ opts.on("-t",
159
+ "--timing",
160
+ "Enable timing.") { |v| Facter.timing(1) }
161
+ opts.on("-p",
162
+ "--puppet",
163
+ "Load the Puppet libraries, thus allowing Facter to load Puppet-specific facts.") { |v| load_puppet }
164
+
165
+ opts.on_tail("-v",
166
+ "--version",
167
+ "Print the version and exit.") do
168
+ puts Facter.version
169
+ exit(0)
170
+ end
171
+
172
+ opts.on_tail("-h",
173
+ "--help",
174
+ "Print this help message.") do
175
+ puts parser
176
+ exit(0)
177
+ end
178
+ end
179
+
180
+ parser.parse!(argv)
181
+
182
+ options
183
+ rescue OptionParser::InvalidOption => e
184
+ $stderr.puts e.message
185
+ exit(12)
186
+ end
187
+
188
+ def self.load_puppet
189
+ require 'puppet'
190
+ Puppet.parse_config
191
+
192
+ # If you've set 'vardir' but not 'libdir' in your
193
+ # puppet.conf, then the hook to add libdir to $:
194
+ # won't get triggered. This makes sure that it's setup
195
+ # correctly.
196
+ unless $LOAD_PATH.include?(Puppet[:libdir])
197
+ $LOAD_PATH << Puppet[:libdir]
198
+ end
199
+ rescue LoadError => detail
200
+ $stderr.puts "Could not load Puppet: #{detail}"
201
+ end
202
+
203
+ end
204
+ end
@@ -0,0 +1,50 @@
1
+ # Fact: architecture
2
+ #
3
+ # Purpose:
4
+ # Return the CPU hardware architecture.
5
+ #
6
+ # Resolution:
7
+ # On non-AIX IBM, OpenBSD, Linux and Debian's kfreebsd, use the hardwaremodel fact.
8
+ # On AIX get the arch value from lsattr -El proc0 -a type
9
+ # Gentoo and Debian call "x86_86" "amd64".
10
+ # Gentoo also calls "i386" "x86".
11
+ #
12
+ # Caveats:
13
+ #
14
+
15
+ require 'facter/util/architecture'
16
+
17
+ Facter.add(:architecture) do
18
+ setcode do
19
+ model = Facter.value(:hardwaremodel)
20
+ case model
21
+ # most linuxen use "x86_64"
22
+ when /IBM*/
23
+ case Facter.value(:operatingsystem)
24
+ when "AIX"
25
+ arch = Facter::Util::Architecture.lsattr
26
+ if (match = arch.match /type\s(\S+)\s/)
27
+ match[1]
28
+ end
29
+ else
30
+ model
31
+ end
32
+ when "x86_64"
33
+ case Facter.value(:operatingsystem)
34
+ when "Debian", "Gentoo", "GNU/kFreeBSD", "Ubuntu"
35
+ "amd64"
36
+ else
37
+ model
38
+ end
39
+ when /(i[3456]86|pentium)/
40
+ case Facter.value(:operatingsystem)
41
+ when "Gentoo", "windows"
42
+ "x86"
43
+ else
44
+ "i386"
45
+ end
46
+ else
47
+ model
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,28 @@
1
+ # Fact: augeasversion
2
+ #
3
+ # Purpose: Report the version of the Augeas library
4
+ #
5
+ # Resolution:
6
+ # Loads ruby-augeas and reports the value of /augeas/version, the version of
7
+ # the underlying Augeas library.
8
+ #
9
+ # Caveats:
10
+ # The library version may not indicate the presence of certain lenses,
11
+ # depending on the system packages updated, nor the version of ruby-augeas
12
+ # which may affect support for the Puppet Augeas provider.
13
+ # Versions prior to 0.3.6 cannot be interrogated for their version.
14
+ #
15
+
16
+ Facter.add(:augeasversion) do
17
+ setcode do
18
+ begin
19
+ require 'augeas'
20
+ aug = Augeas::open('/', nil, Augeas::NO_MODL_AUTOLOAD)
21
+ ver = aug.get('/augeas/version')
22
+ aug.close
23
+ ver
24
+ rescue Exception
25
+ Facter.debug('ruby-augeas not available')
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,105 @@
1
+ # Fact: blockdevice_<devicename>_size
2
+ #
3
+ # Purpose:
4
+ # Return the size of a block device in bytes
5
+ #
6
+ # Resolution:
7
+ # Parse the contents of /sys/block/<device>/size to receive the size (multiplying by 512 to correct for blocks-to-bytes)
8
+ #
9
+ # Caveats:
10
+ # Only supports Linux 2.6+ at this time, due to the reliance on sysfs
11
+ #
12
+
13
+ # Fact: blockdevice_<devicename>_vendor
14
+ #
15
+ # Purpose:
16
+ # Return the vendor name of block devices attached to the system
17
+ #
18
+ # Resolution:
19
+ # Parse the contents of /sys/block/<device>/device/vendor to retrieve the vendor for a device
20
+ #
21
+ # Caveats:
22
+ # Only supports Linux 2.6+ at this time, due to the reliance on sysfs
23
+ #
24
+
25
+ # Fact: blockdevice_<devicename>_model
26
+ #
27
+ # Purpose:
28
+ # Return the model name of block devices attached to the system
29
+ #
30
+ # Resolution:
31
+ # Parse the contents of /sys/block/<device>/device/model to retrieve the model name/number for a device
32
+ #
33
+ # Caveats:
34
+ # Only supports Linux 2.6+ at this time, due to the reliance on sysfs
35
+ #
36
+
37
+
38
+ # Fact: blockdevices
39
+ #
40
+ # Purpose:
41
+ # Return a comma seperated list of block devices
42
+ #
43
+ # Resolution:
44
+ # Retrieve the block devices that were identified and iterated over in the creation of the blockdevice_ facts
45
+ #
46
+ # Caveats:
47
+ # Block devices must have been identified using sysfs information
48
+ #
49
+
50
+ # Author: Jason Gill <jasongill@gmail.com>
51
+
52
+ require 'facter'
53
+
54
+ # Only Linux 2.6+ kernels support sysfs which is required to easily get device details
55
+ if Facter.value(:kernel) == 'Linux'
56
+
57
+ sysfs_block_directory = '/sys/block/'
58
+
59
+ blockdevices = []
60
+
61
+ # This should prevent any non-2.6 kernels or odd machines without sysfs support from being investigated further
62
+ if File.exist?(sysfs_block_directory)
63
+
64
+ # Iterate over each file in the /sys/block/ directory and skip ones that do not have a device subdirectory
65
+ Dir.entries(sysfs_block_directory).each do |device|
66
+ sysfs_device_directory = sysfs_block_directory + device + "/device"
67
+ next unless File.exist?(sysfs_device_directory)
68
+
69
+ # Add the device to the blockdevices list, which is returned as it's own fact later on
70
+ blockdevices << device
71
+
72
+ sizefile = sysfs_block_directory + device + "/size"
73
+ vendorfile = sysfs_device_directory + "/vendor"
74
+ modelfile = sysfs_device_directory + "/model"
75
+
76
+ if File.exist?(sizefile)
77
+ Facter.add("blockdevice_#{device}_size".to_sym) do
78
+ setcode { IO.read(sizefile).strip.to_i * 512 }
79
+ end
80
+ end
81
+
82
+ if File.exist?(vendorfile)
83
+ Facter.add("blockdevice_#{device}_vendor".to_sym) do
84
+ setcode { IO.read(vendorfile).strip }
85
+ end
86
+ end
87
+
88
+ if File.exist?(modelfile)
89
+ Facter.add("blockdevice_#{device}_model".to_sym) do
90
+ setcode { IO.read(modelfile).strip }
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ end
97
+
98
+ # Return a comma-seperated list of block devices found
99
+ unless blockdevices.empty?
100
+ Facter.add(:blockdevices) do
101
+ setcode { blockdevices.sort.join(',') }
102
+ end
103
+ end
104
+
105
+ end
@@ -0,0 +1,220 @@
1
+ require 'facter'
2
+ require 'facter/core/directed_graph'
3
+ require 'facter/core/suitable'
4
+ require 'facter/core/resolvable'
5
+ require 'facter/util/values'
6
+
7
+ # Aggregates provide a mechanism for facts to be resolved in multiple steps.
8
+ #
9
+ # Aggregates are evaluated in two parts: generating individual chunks and then
10
+ # aggregating all chunks together. Each chunk is a block of code that generates
11
+ # a value, and may depend on other chunks when it runs. After all chunks have
12
+ # been evaluated they are passed to the aggregate block as Hash<name, result>.
13
+ # The aggregate block converts the individual chunks into a single value that is
14
+ # returned as the final value of the aggregate.
15
+ #
16
+ # @api public
17
+ # @since 2.0.0
18
+ class Facter::Core::Aggregate
19
+
20
+ include Facter::Core::Suitable
21
+ include Facter::Core::Resolvable
22
+
23
+ # @!attribute [r] name
24
+ # @return [Symbol] The name of the aggregate resolution
25
+ attr_reader :name
26
+
27
+ # @!attribute [r] deps
28
+ # @api private
29
+ # @return [Facter::Core::DirectedGraph]
30
+ attr_reader :deps
31
+
32
+ # @!attribute [r] confines
33
+ # @return [Array<Facter::Core::Confine>] An array of confines restricting
34
+ # this to a specific platform
35
+ # @see Facter::Core::Suitable
36
+ attr_reader :confines
37
+
38
+ # @!attribute [r] fact
39
+ # @return [Facter::Util::Fact]
40
+ # @api private
41
+ attr_reader :fact
42
+
43
+ def initialize(name, fact)
44
+ @name = name
45
+ @fact = fact
46
+
47
+ @confines = []
48
+ @chunks = {}
49
+
50
+ @aggregate = nil
51
+ @deps = Facter::Core::DirectedGraph.new
52
+ end
53
+
54
+ def set_options(options)
55
+ if options[:name]
56
+ @name = options.delete(:name)
57
+ end
58
+
59
+ if options.has_key?(:timeout)
60
+ @timeout = options.delete(:timeout)
61
+ end
62
+
63
+ if options.has_key?(:weight)
64
+ @weight = options.delete(:weight)
65
+ end
66
+
67
+ if not options.keys.empty?
68
+ raise ArgumentError, "Invalid aggregate options #{options.keys.inspect}"
69
+ end
70
+ end
71
+
72
+ def evaluate(&block)
73
+ instance_eval(&block)
74
+ end
75
+
76
+ # Define a new chunk for the given aggregate
77
+ #
78
+ # @api public
79
+ #
80
+ # @example Defining a chunk with no dependencies
81
+ # aggregate.chunk(:mountpoints) do
82
+ # # generate mountpoint information
83
+ # end
84
+ #
85
+ # @example Defining an chunk to add mount options
86
+ # aggregate.chunk(:mount_options, :require => [:mountpoints]) do |mountpoints|
87
+ # # `mountpoints` is the result of the previous chunk
88
+ # # generate mount option information based on the mountpoints
89
+ # end
90
+ #
91
+ # @param name [Symbol] A name unique to this aggregate describing the chunk
92
+ # @param opts [Hash]
93
+ # @options opts [Array<Symbol>, Symbol] :require One or more chunks
94
+ # to evaluate and pass to this block.
95
+ # @yield [*Object] Zero or more chunk results
96
+ #
97
+ # @return [void]
98
+ def chunk(name, opts = {}, &block)
99
+ if not block_given?
100
+ raise ArgumentError, "#{self.class.name}#chunk requires a block"
101
+ end
102
+
103
+ deps = Array(opts.delete(:require))
104
+
105
+ if not opts.empty?
106
+ raise ArgumentError, "Unexpected options passed to #{self.class.name}#chunk: #{opts.keys.inspect}"
107
+ end
108
+
109
+ @deps[name] = deps
110
+ @chunks[name] = block
111
+ end
112
+
113
+ # Define how all chunks should be combined
114
+ #
115
+ # @api public
116
+ #
117
+ # @example Merge all chunks
118
+ # aggregate.aggregate do |chunks|
119
+ # final_result = {}
120
+ # chunks.each_value do |chunk|
121
+ # final_result.deep_merge(chunk)
122
+ # end
123
+ # final_result
124
+ # end
125
+ #
126
+ # @example Sum all chunks
127
+ # aggregate.aggregate do |chunks|
128
+ # total = 0
129
+ # chunks.each_value do |chunk|
130
+ # total += chunk
131
+ # end
132
+ # total
133
+ # end
134
+ #
135
+ # @yield [Hash<Symbol, Object>] A hash containing chunk names and
136
+ # chunk values
137
+ #
138
+ # @return [void]
139
+ def aggregate(&block)
140
+ if block_given?
141
+ @aggregate = block
142
+ else
143
+ raise ArgumentError, "#{self.class.name}#aggregate requires a block"
144
+ end
145
+ end
146
+
147
+ def resolution_type
148
+ :aggregate
149
+ end
150
+
151
+ private
152
+
153
+ # Evaluate the results of this aggregate.
154
+ #
155
+ # @see Facter::Core::Resolvable#value
156
+ # @return [Object]
157
+ def resolve_value
158
+ chunk_results = run_chunks()
159
+ aggregate_results(chunk_results)
160
+ end
161
+
162
+ # Order all chunks based on their dependencies and evaluate each one, passing
163
+ # dependent chunks as needed.
164
+ #
165
+ # @return [Hash<Symbol, Object>] A hash containing the chunk that
166
+ # generated value and the related value.
167
+ def run_chunks
168
+ results = {}
169
+ order_chunks.each do |(name, block)|
170
+ input = @deps[name].map { |dep_name| results[dep_name] }
171
+
172
+ output = block.call(*input)
173
+ results[name] = Facter::Util::Values.deep_freeze(output)
174
+ end
175
+
176
+ results
177
+ end
178
+
179
+ # Process the results of all chunks with the aggregate block and return the
180
+ # results. If no aggregate block has been specified, fall back to deep
181
+ # merging the given data structure
182
+ #
183
+ # @param results [Hash<Symbol, Object>] A hash of chunk names and the output
184
+ # of that chunk.
185
+ # @return [Object]
186
+ def aggregate_results(results)
187
+ if @aggregate
188
+ @aggregate.call(results)
189
+ else
190
+ default_aggregate(results)
191
+ end
192
+ end
193
+
194
+ def default_aggregate(results)
195
+ results.values.inject do |result, current|
196
+ Facter::Util::Values.deep_merge(result, current)
197
+ end
198
+ rescue Facter::Util::Values::DeepMergeError => e
199
+ raise ArgumentError, "Could not deep merge all chunks (Original error: " +
200
+ "#{e.message}), ensure that chunks return either an Array or Hash or " +
201
+ "override the aggregate block", e.backtrace
202
+ end
203
+
204
+ # Order chunks based on their dependencies
205
+ #
206
+ # @return [Array<Symbol, Proc>] A list of chunk names and blocks in evaluation order.
207
+ def order_chunks
208
+ if not @deps.acyclic?
209
+ raise DependencyError, "Could not order chunks; found the following dependency cycles: #{@deps.cycles.inspect}"
210
+ end
211
+
212
+ sorted_names = @deps.tsort
213
+
214
+ sorted_names.map do |name|
215
+ [name, @chunks[name]]
216
+ end
217
+ end
218
+
219
+ class DependencyError < StandardError; end
220
+ end