facter 2.0.1.rc1-x86-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.
- checksums.yaml +7 -0
- data/COMMITTERS.md +194 -0
- data/CONTRIBUTING.md +65 -0
- data/Gemfile +43 -0
- data/LICENSE +15 -0
- data/README.md +33 -0
- data/Rakefile +79 -0
- data/bin/facter +16 -0
- data/etc/facter.conf +5 -0
- data/ext/build_defaults.yaml +24 -0
- data/ext/debian/changelog.erb +59 -0
- data/ext/debian/compat +1 -0
- data/ext/debian/control +14 -0
- data/ext/debian/copyright +19 -0
- data/ext/debian/docs +1 -0
- data/ext/debian/lintian-overrides +0 -0
- data/ext/debian/rules +10 -0
- data/ext/debian/source/format +1 -0
- data/ext/facter-diff +74 -0
- data/ext/ips/facter.p5m.erb +10 -0
- data/ext/ips/rules +7 -0
- data/ext/ips/transforms +18 -0
- data/ext/osx/file_mapping.yaml +27 -0
- data/ext/osx/preflight.erb +33 -0
- data/ext/osx/prototype.plist.erb +38 -0
- data/ext/project_data.yaml +33 -0
- data/ext/redhat/facter.spec.erb +220 -0
- data/ext/solaris/pkginfo +7 -0
- data/install.rb +380 -0
- data/lib/facter.rb +262 -0
- data/lib/facter/Cfkey.rb +42 -0
- data/lib/facter/application.rb +204 -0
- data/lib/facter/architecture.rb +50 -0
- data/lib/facter/augeasversion.rb +28 -0
- data/lib/facter/blockdevices.rb +105 -0
- data/lib/facter/core/aggregate.rb +220 -0
- data/lib/facter/core/directed_graph.rb +46 -0
- data/lib/facter/core/execution.rb +100 -0
- data/lib/facter/core/execution/base.rb +73 -0
- data/lib/facter/core/execution/posix.rb +50 -0
- data/lib/facter/core/execution/windows.rb +57 -0
- data/lib/facter/core/logging.rb +169 -0
- data/lib/facter/core/resolvable.rb +94 -0
- data/lib/facter/core/suitable.rb +117 -0
- data/lib/facter/domain.rb +99 -0
- data/lib/facter/ec2.rb +37 -0
- data/lib/facter/facterversion.rb +15 -0
- data/lib/facter/filesystems.rb +38 -0
- data/lib/facter/fqdn.rb +22 -0
- data/lib/facter/hardwareisa.rb +20 -0
- data/lib/facter/hardwaremodel.rb +67 -0
- data/lib/facter/hostname.rb +33 -0
- data/lib/facter/id.rb +21 -0
- data/lib/facter/interfaces.rb +46 -0
- data/lib/facter/ipaddress.rb +171 -0
- data/lib/facter/ipaddress6.rb +82 -0
- data/lib/facter/iphostnumber.rb +29 -0
- data/lib/facter/kernel.rb +22 -0
- data/lib/facter/kernelmajversion.rb +15 -0
- data/lib/facter/kernelrelease.rb +42 -0
- data/lib/facter/kernelversion.rb +22 -0
- data/lib/facter/ldom.rb +47 -0
- data/lib/facter/lsbdistcodename.rb +18 -0
- data/lib/facter/lsbdistdescription.rb +21 -0
- data/lib/facter/lsbdistid.rb +18 -0
- data/lib/facter/lsbdistrelease.rb +18 -0
- data/lib/facter/lsbmajdistrelease.rb +27 -0
- data/lib/facter/lsbrelease.rb +18 -0
- data/lib/facter/macaddress.rb +97 -0
- data/lib/facter/macosx.rb +56 -0
- data/lib/facter/manufacturer.rb +68 -0
- data/lib/facter/memory.rb +162 -0
- data/lib/facter/netmask.rb +42 -0
- data/lib/facter/network.rb +20 -0
- data/lib/facter/operatingsystem.rb +121 -0
- data/lib/facter/operatingsystemmajrelease.rb +33 -0
- data/lib/facter/operatingsystemrelease.rb +226 -0
- data/lib/facter/osfamily.rb +35 -0
- data/lib/facter/path.rb +14 -0
- data/lib/facter/physicalprocessorcount.rb +84 -0
- data/lib/facter/processor.rb +183 -0
- data/lib/facter/ps.rb +30 -0
- data/lib/facter/puppetversion.rb +20 -0
- data/lib/facter/rubysitedir.rb +12 -0
- data/lib/facter/rubyversion.rb +12 -0
- data/lib/facter/selinux.rb +99 -0
- data/lib/facter/ssh.rb +72 -0
- data/lib/facter/timezone.rb +14 -0
- data/lib/facter/uniqueid.rb +4 -0
- data/lib/facter/uptime.rb +34 -0
- data/lib/facter/uptime_days.rb +15 -0
- data/lib/facter/uptime_hours.rb +15 -0
- data/lib/facter/uptime_seconds.rb +24 -0
- data/lib/facter/util/architecture.rb +19 -0
- data/lib/facter/util/collection.rb +161 -0
- data/lib/facter/util/composite_loader.rb +12 -0
- data/lib/facter/util/config.rb +61 -0
- data/lib/facter/util/confine.rb +66 -0
- data/lib/facter/util/directory_loader.rb +83 -0
- data/lib/facter/util/ec2.rb +101 -0
- data/lib/facter/util/fact.rb +204 -0
- data/lib/facter/util/file_read.rb +37 -0
- data/lib/facter/util/formatter.rb +38 -0
- data/lib/facter/util/ip.rb +285 -0
- data/lib/facter/util/ip/windows.rb +215 -0
- data/lib/facter/util/loader.rb +146 -0
- data/lib/facter/util/macaddress.rb +43 -0
- data/lib/facter/util/macosx.rb +73 -0
- data/lib/facter/util/manufacturer.rb +104 -0
- data/lib/facter/util/memory.rb +228 -0
- data/lib/facter/util/monkey_patches.rb +8 -0
- data/lib/facter/util/netmask.rb +40 -0
- data/lib/facter/util/normalization.rb +94 -0
- data/lib/facter/util/nothing_loader.rb +12 -0
- data/lib/facter/util/parser.rb +158 -0
- data/lib/facter/util/plist.rb +24 -0
- data/lib/facter/util/plist/generator.rb +228 -0
- data/lib/facter/util/plist/parser.rb +226 -0
- data/lib/facter/util/processor.rb +291 -0
- data/lib/facter/util/registry.rb +11 -0
- data/lib/facter/util/resolution.rb +152 -0
- data/lib/facter/util/solaris_zones.rb +158 -0
- data/lib/facter/util/unix_root.rb +5 -0
- data/lib/facter/util/uptime.rb +81 -0
- data/lib/facter/util/values.rb +80 -0
- data/lib/facter/util/virtual.rb +151 -0
- data/lib/facter/util/vlans.rb +24 -0
- data/lib/facter/util/windows_root.rb +37 -0
- data/lib/facter/util/wmi.rb +16 -0
- data/lib/facter/util/xendomains.rb +10 -0
- data/lib/facter/version.rb +86 -0
- data/lib/facter/virtual.rb +262 -0
- data/lib/facter/vlans.rb +17 -0
- data/lib/facter/xendomains.rb +20 -0
- data/lib/facter/zfs_version.rb +10 -0
- data/lib/facter/zonename.rb +6 -0
- data/lib/facter/zones.rb +17 -0
- data/lib/facter/zpool_version.rb +10 -0
- data/spec/fixtures/cpuinfo/amd64dual +57 -0
- data/spec/fixtures/cpuinfo/amd64quad +79 -0
- data/spec/fixtures/cpuinfo/amd64solo +23 -0
- data/spec/fixtures/cpuinfo/amd64tri +86 -0
- data/spec/fixtures/cpuinfo/amd64twentyfour +600 -0
- data/spec/fixtures/cpuinfo/bbg3-armel +12 -0
- data/spec/fixtures/cpuinfo/beaglexm-armel +12 -0
- data/spec/fixtures/cpuinfo/panda-armel +17 -0
- data/spec/fixtures/cpuinfo/ppc64 +19 -0
- data/spec/fixtures/cpuinfo/sparc +10 -0
- data/spec/fixtures/hpux/machinfo/hppa-rp4440 +26 -0
- data/spec/fixtures/hpux/machinfo/ia64-rx2620 +49 -0
- data/spec/fixtures/hpux/machinfo/ia64-rx6600 +26 -0
- data/spec/fixtures/hpux/machinfo/ia64-rx8640 +53 -0
- data/spec/fixtures/hpux/machinfo/superdome-server-SD32B +53 -0
- data/spec/fixtures/hpux/machinfo/superdome2-16s +31 -0
- data/spec/fixtures/hpux/sched.models +174 -0
- data/spec/fixtures/hpux/unistd.h +1534 -0
- data/spec/fixtures/ifconfig/bsd_ifconfig_all_with_multiple_interfaces +18 -0
- data/spec/fixtures/ifconfig/centos_5_5 +17 -0
- data/spec/fixtures/ifconfig/centos_5_5_eth0 +8 -0
- data/spec/fixtures/ifconfig/darwin_10_3_0 +26 -0
- data/spec/fixtures/ifconfig/darwin_10_3_0_en0 +6 -0
- data/spec/fixtures/ifconfig/darwin_10_6_4 +28 -0
- data/spec/fixtures/ifconfig/darwin_10_6_4_en1 +6 -0
- data/spec/fixtures/ifconfig/darwin_10_6_6_dualstack +8 -0
- data/spec/fixtures/ifconfig/darwin_10_6_6_dualstack_en1 +7 -0
- data/spec/fixtures/ifconfig/darwin_9_8_0 +26 -0
- data/spec/fixtures/ifconfig/darwin_9_8_0_en0 +6 -0
- data/spec/fixtures/ifconfig/darwin_ifconfig_all_with_multiple_interfaces +23 -0
- data/spec/fixtures/ifconfig/fedora_10 +36 -0
- data/spec/fixtures/ifconfig/fedora_10_eth0 +9 -0
- data/spec/fixtures/ifconfig/fedora_13 +18 -0
- data/spec/fixtures/ifconfig/fedora_13_eth0 +9 -0
- data/spec/fixtures/ifconfig/fedora_8 +38 -0
- data/spec/fixtures/ifconfig/fedora_8_eth0 +9 -0
- data/spec/fixtures/ifconfig/freebsd_6_0 +12 -0
- data/spec/fixtures/ifconfig/ifconfig_net_tools_1.60.txt +19 -0
- data/spec/fixtures/ifconfig/ifconfig_ubuntu_1204.txt +16 -0
- data/spec/fixtures/ifconfig/linux_ifconfig_all_with_multiple_interfaces +19 -0
- data/spec/fixtures/ifconfig/linux_ifconfig_no_addr +19 -0
- data/spec/fixtures/ifconfig/linux_ifconfig_no_mac +8 -0
- data/spec/fixtures/ifconfig/linux_ifconfig_venet +24 -0
- data/spec/fixtures/ifconfig/open_solaris_10 +12 -0
- data/spec/fixtures/ifconfig/open_solaris_b132 +20 -0
- data/spec/fixtures/ifconfig/sunos_ifconfig_all_with_multiple_interfaces +10 -0
- data/spec/fixtures/ifconfig/ubuntu_7_04 +38 -0
- data/spec/fixtures/ifconfig/ubuntu_7_04_eth0 +9 -0
- data/spec/fixtures/ldom/ldom_v1 +6 -0
- data/spec/fixtures/netstat/centos_5_5 +5 -0
- data/spec/fixtures/netstat/darwin_10_3_0 +35 -0
- data/spec/fixtures/netstat/darwin_10_6_4 +29 -0
- data/spec/fixtures/netstat/darwin_10_6_6_dualstack +34 -0
- data/spec/fixtures/netstat/darwin_9_8_0 +28 -0
- data/spec/fixtures/netstat/fedora_10 +7 -0
- data/spec/fixtures/netstat/open_solaris_10 +16 -0
- data/spec/fixtures/netstat/open_solaris_b132 +17 -0
- data/spec/fixtures/netstat/ubuntu_7_04 +7 -0
- data/spec/fixtures/processorcount/solaris-psrinfo +24 -0
- data/spec/fixtures/processorcount/solaris-sparc-kstat-cpu-info +1216 -0
- data/spec/fixtures/processorcount/solaris-x86_64-kstat-cpu-info +225 -0
- data/spec/fixtures/unit/filesystems/linux +28 -0
- data/spec/fixtures/unit/interfaces/ifconfig_net_tools_1.60.txt +19 -0
- data/spec/fixtures/unit/interfaces/ifconfig_net_tools_1.60.txt.em1 +10 -0
- data/spec/fixtures/unit/interfaces/ifconfig_net_tools_1.60.txt.lo +8 -0
- data/spec/fixtures/unit/ipaddress/ifconfig_multiple_127_addresses.txt +20 -0
- data/spec/fixtures/unit/ipaddress/ifconfig_net_tools_1.60.txt +19 -0
- data/spec/fixtures/unit/ipaddress/ifconfig_non_english_locale.txt +18 -0
- data/spec/fixtures/unit/ipaddress/ifconfig_ubuntu_1204.txt +16 -0
- data/spec/fixtures/unit/netmask/darwin_10_8_5.txt +30 -0
- data/spec/fixtures/unit/netmask/ifconfig_net_tools_1.60.txt +19 -0
- data/spec/fixtures/unit/netmask/ifconfig_ubuntu_1204.txt +16 -0
- data/spec/fixtures/unit/selinux/selinux_sestatus +6 -0
- data/spec/fixtures/unit/util/ec2/centos-arp-ec2.out +1 -0
- data/spec/fixtures/unit/util/ec2/linux-arp-ec2.out +1 -0
- data/spec/fixtures/unit/util/ec2/linux-arp-not-ec2.out +5 -0
- data/spec/fixtures/unit/util/ec2/solaris8_arp_a_not_ec2.out +7 -0
- data/spec/fixtures/unit/util/ec2/windows-2008-arp-a-not-ec2.out +6 -0
- data/spec/fixtures/unit/util/ec2/windows-2008-arp-a.out +10 -0
- data/spec/fixtures/unit/util/ip/6.0-STABLE_FreeBSD_ifconfig +12 -0
- data/spec/fixtures/unit/util/ip/Mac_OS_X_10.5.5_ifconfig +26 -0
- data/spec/fixtures/unit/util/ip/darwin_ifconfig_all_with_multiple_interfaces +10 -0
- data/spec/fixtures/unit/util/ip/darwin_ifconfig_single_interface +6 -0
- data/spec/fixtures/unit/util/ip/debian_kfreebsd_ifconfig +40 -0
- data/spec/fixtures/unit/util/ip/hpux_1111_ifconfig_lan0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1111_ifconfig_lan1 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1111_ifconfig_lo0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1111_lanscan +5 -0
- data/spec/fixtures/unit/util/ip/hpux_1111_netstat_in +4 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_ifconfig_lan0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_ifconfig_lan1 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_ifconfig_lo0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_lanscan +5 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_asterisk_netstat_in +4 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_ifconfig_lan0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_ifconfig_lan1 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_ifconfig_lo0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_lanscan +4 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_netstat_in +4 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_ifconfig_lan1 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_ifconfig_lan4 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_ifconfig_lan4_1 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_ifconfig_lo0 +2 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_lanscan +9 -0
- data/spec/fixtures/unit/util/ip/hpux_1131_nic_bonding_netstat_in +6 -0
- data/spec/fixtures/unit/util/ip/linux_2_6_35_proc_net_bonding_bond0 +19 -0
- data/spec/fixtures/unit/util/ip/linux_get_single_interface_eth0 +10 -0
- data/spec/fixtures/unit/util/ip/linux_get_single_interface_ib0 +8 -0
- data/spec/fixtures/unit/util/ip/linux_get_single_interface_lo +9 -0
- data/spec/fixtures/unit/util/ip/linux_ifconfig_all_with_single_interface +18 -0
- data/spec/fixtures/unit/util/ip/linux_ifconfig_ib0 +8 -0
- data/spec/fixtures/unit/util/ip/solaris_ifconfig_all_with_multiple_interfaces +8 -0
- data/spec/fixtures/unit/util/ip/solaris_ifconfig_single_interface +3 -0
- data/spec/fixtures/unit/util/ip/windows_netsh_all_interfaces +12 -0
- data/spec/fixtures/unit/util/ip/windows_netsh_single_interface +7 -0
- data/spec/fixtures/unit/util/ip/windows_netsh_single_interface6 +18 -0
- data/spec/fixtures/unit/util/loader/nosuchfact.rb +1 -0
- data/spec/fixtures/unit/util/manufacturer/freebsd_dmidecode +42 -0
- data/spec/fixtures/unit/util/manufacturer/intel_linux_dmidecode +549 -0
- data/spec/fixtures/unit/util/manufacturer/linux_dmidecode_with_spaces +60 -0
- data/spec/fixtures/unit/util/manufacturer/opensolaris_smbios +33 -0
- data/spec/fixtures/unit/util/manufacturer/solaris_sunfire_v120_prtdiag +33 -0
- data/spec/fixtures/unit/util/manufacturer/solaris_t5220_prtdiag +136 -0
- data/spec/fixtures/unit/util/processor/solaris-i86pc +28 -0
- data/spec/fixtures/unit/util/processor/solaris-sun4u +151 -0
- data/spec/fixtures/unit/util/processor/x86-pentium2 +41 -0
- data/spec/fixtures/unit/util/uptime/kstat_boot_time +1 -0
- data/spec/fixtures/unit/util/uptime/sysctl_kern_boottime_darwin +1 -0
- data/spec/fixtures/unit/util/uptime/sysctl_kern_boottime_openbsd +1 -0
- data/spec/fixtures/unit/util/uptime/ubuntu_proc_uptime +1 -0
- data/spec/fixtures/unit/util/virtual/invalid_unicode_dmi_entries +0 -0
- data/spec/fixtures/unit/util/virtual/solaris10_proc_self_status1 +0 -0
- data/spec/fixtures/unit/util/vlans/linux_vlan_config +6 -0
- data/spec/fixtures/unit/util/xendomains/xendomains +4 -0
- data/spec/fixtures/unit/virtual/sysfs_dmi_entries_raw.txt +0 -0
- data/spec/fixtures/unit/zfs_version/freebsd_8.2 +14 -0
- data/spec/fixtures/unit/zfs_version/freebsd_9.0 +13 -0
- data/spec/fixtures/unit/zfs_version/linux-fuse_0.6.9 +14 -0
- data/spec/fixtures/unit/zfs_version/solaris_10 +10 -0
- data/spec/fixtures/unit/zfs_version/solaris_11 +12 -0
- data/spec/fixtures/unit/zpool_version/freebsd_8.2 +26 -0
- data/spec/fixtures/unit/zpool_version/freebsd_9.0 +38 -0
- data/spec/fixtures/unit/zpool_version/linux-fuse_0.6.9 +35 -0
- data/spec/fixtures/unit/zpool_version/solaris_10 +31 -0
- data/spec/fixtures/unit/zpool_version/solaris_11 +43 -0
- data/spec/fixtures/virtual/proc_self_status/vserver_2_1/guest +37 -0
- data/spec/fixtures/virtual/proc_self_status/vserver_2_1/host +36 -0
- data/spec/fixtures/virtual/proc_self_status/vserver_2_3/guest +39 -0
- data/spec/fixtures/virtual/proc_self_status/vserver_2_3/host +39 -0
- data/spec/integration/facter_spec.rb +39 -0
- data/spec/lib/facter_spec/cpuinfo.rb +15 -0
- data/spec/lib/facter_spec/windows_network.rb +64 -0
- data/spec/puppetlabs_spec/files.rb +57 -0
- data/spec/puppetlabs_spec/fixtures.rb +49 -0
- data/spec/puppetlabs_spec/matchers.rb +87 -0
- data/spec/puppetlabs_spec/verbose.rb +9 -0
- data/spec/puppetlabs_spec_helper.rb +26 -0
- data/spec/shared_contexts/platform.rb +55 -0
- data/spec/shared_formats/parses.rb +3 -0
- data/spec/spec_helper.rb +75 -0
- data/spec/unit/application_spec.rb +101 -0
- data/spec/unit/architecture_spec.rb +63 -0
- data/spec/unit/blockdevices_spec.rb +109 -0
- data/spec/unit/core/aggregate_spec.rb +125 -0
- data/spec/unit/core/directed_graph_spec.rb +79 -0
- data/spec/unit/core/execution/base_spec.rb +119 -0
- data/spec/unit/core/execution/posix_spec.rb +86 -0
- data/spec/unit/core/execution/windows_spec.rb +106 -0
- data/spec/unit/core/execution_spec.rb +37 -0
- data/spec/unit/core/logging_spec.rb +104 -0
- data/spec/unit/core/resolvable_spec.rb +81 -0
- data/spec/unit/core/suitable_spec.rb +96 -0
- data/spec/unit/domain_spec.rb +310 -0
- data/spec/unit/ec2_spec.rb +187 -0
- data/spec/unit/facter_spec.rb +108 -0
- data/spec/unit/filesystems_spec.rb +50 -0
- data/spec/unit/hardwareisa_spec.rb +41 -0
- data/spec/unit/hardwaremodel_spec.rb +56 -0
- data/spec/unit/hostname_spec.rb +40 -0
- data/spec/unit/id_spec.rb +29 -0
- data/spec/unit/interfaces_spec.rb +57 -0
- data/spec/unit/ipaddress6_spec.rb +161 -0
- data/spec/unit/ipaddress_spec.rb +114 -0
- data/spec/unit/kernel_spec.rb +24 -0
- data/spec/unit/kernelmajversion_spec.rb +17 -0
- data/spec/unit/kernelrelease_spec.rb +53 -0
- data/spec/unit/kernelversion_spec.rb +32 -0
- data/spec/unit/ldom_spec.rb +74 -0
- data/spec/unit/lsbdistcodename_spec.rb +25 -0
- data/spec/unit/lsbdistdescription_spec.rb +25 -0
- data/spec/unit/lsbdistid_spec.rb +25 -0
- data/spec/unit/lsbdistrelease_spec.rb +25 -0
- data/spec/unit/lsbmajdistrelease_spec.rb +13 -0
- data/spec/unit/lsbrelease_spec.rb +25 -0
- data/spec/unit/macaddress_spec.rb +61 -0
- data/spec/unit/manufacturer_spec.rb +115 -0
- data/spec/unit/memory_spec.rb +539 -0
- data/spec/unit/netmask_spec.rb +95 -0
- data/spec/unit/operatingsystem_spec.rb +141 -0
- data/spec/unit/operatingsystemmajrelease_spec.rb +16 -0
- data/spec/unit/operatingsystemrelease_spec.rb +226 -0
- data/spec/unit/physicalprocessorcount_spec.rb +76 -0
- data/spec/unit/processor_spec.rb +393 -0
- data/spec/unit/ps_spec.rb +42 -0
- data/spec/unit/selinux_spec.rb +114 -0
- data/spec/unit/ssh_spec.rb +77 -0
- data/spec/unit/uniqueid_spec.rb +27 -0
- data/spec/unit/uptime_spec.rb +110 -0
- data/spec/unit/util/collection_spec.rb +258 -0
- data/spec/unit/util/config_spec.rb +84 -0
- data/spec/unit/util/confine_spec.rb +148 -0
- data/spec/unit/util/directory_loader_spec.rb +88 -0
- data/spec/unit/util/ec2_spec.rb +180 -0
- data/spec/unit/util/fact_spec.rb +142 -0
- data/spec/unit/util/file_read_spec.rb +29 -0
- data/spec/unit/util/ip/windows_spec.rb +80 -0
- data/spec/unit/util/ip_spec.rb +463 -0
- data/spec/unit/util/loader_spec.rb +286 -0
- data/spec/unit/util/macaddress_spec.rb +141 -0
- data/spec/unit/util/macosx_spec.rb +113 -0
- data/spec/unit/util/manufacturer_spec.rb +179 -0
- data/spec/unit/util/normalization_spec.rb +113 -0
- data/spec/unit/util/parser_spec.rb +200 -0
- data/spec/unit/util/processor_spec.rb +92 -0
- data/spec/unit/util/registry_spec.rb +76 -0
- data/spec/unit/util/resolution_spec.rb +129 -0
- data/spec/unit/util/solaris_zones_spec.rb +127 -0
- data/spec/unit/util/uptime_spec.rb +126 -0
- data/spec/unit/util/values_spec.rb +131 -0
- data/spec/unit/util/virtual_spec.rb +294 -0
- data/spec/unit/util/vlans_spec.rb +12 -0
- data/spec/unit/util/wmi_spec.rb +19 -0
- data/spec/unit/util/xendomains_spec.rb +21 -0
- data/spec/unit/version_spec.rb +42 -0
- data/spec/unit/virtual_spec.rb +470 -0
- data/spec/unit/zfs_version_spec.rb +75 -0
- data/spec/unit/zonename_spec.rb +14 -0
- data/spec/unit/zones_spec.rb +55 -0
- data/spec/unit/zpool_version_spec.rb +75 -0
- data/spec/watchr.rb +125 -0
- metadata +758 -0
data/lib/facter/Cfkey.rb
ADDED
@@ -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
|