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.
- checksums.yaml +7 -0
- data/COMMITTERS.md +194 -0
- data/CONTRIBUTING.md +65 -0
- data/Gemfile +53 -0
- data/LICENSE +15 -0
- data/README.md +33 -0
- data/Rakefile +79 -0
- data/bin/facter +20 -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 +36 -0
- data/ext/redhat/facter.spec.erb +220 -0
- data/ext/solaris/pkginfo +7 -0
- data/install.rb +380 -0
- data/lib/facter.rb +261 -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 +123 -0
- data/lib/facter/core/execution/base.rb +81 -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 +113 -0
- data/lib/facter/dhcp_servers.rb +39 -0
- data/lib/facter/domain.rb +99 -0
- data/lib/facter/ec2.rb +44 -0
- data/lib/facter/ec2/rest.rb +130 -0
- data/lib/facter/facterversion.rb +15 -0
- data/lib/facter/filesystems.rb +38 -0
- data/lib/facter/fqdn.rb +24 -0
- data/lib/facter/gce.rb +16 -0
- data/lib/facter/gce/metadata.rb +87 -0
- data/lib/facter/hardwareisa.rb +20 -0
- data/lib/facter/hardwaremodel.rb +67 -0
- data/lib/facter/hostname.rb +31 -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 +23 -0
- data/lib/facter/kernelrelease.rb +50 -0
- data/lib/facter/kernelversion.rb +22 -0
- data/lib/facter/ldom.rb +47 -0
- data/lib/facter/lsbdistcodename.rb +16 -0
- data/lib/facter/lsbdistdescription.rb +25 -0
- data/lib/facter/lsbdistid.rb +16 -0
- data/lib/facter/lsbdistrelease.rb +16 -0
- data/lib/facter/lsbmajdistrelease.rb +27 -0
- data/lib/facter/lsbrelease.rb +16 -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 +168 -0
- data/lib/facter/netmask.rb +42 -0
- data/lib/facter/network.rb +20 -0
- data/lib/facter/operatingsystem.rb +141 -0
- data/lib/facter/operatingsystemmajrelease.rb +47 -0
- data/lib/facter/operatingsystemrelease.rb +250 -0
- data/lib/facter/osfamily.rb +37 -0
- data/lib/facter/partitions.rb +35 -0
- data/lib/facter/path.rb +14 -0
- data/lib/facter/physicalprocessorcount.rb +91 -0
- data/lib/facter/processor.rb +168 -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 +63 -0
- data/lib/facter/util/confine.rb +66 -0
- data/lib/facter/util/dhcp_servers.rb +43 -0
- data/lib/facter/util/directory_loader.rb +83 -0
- data/lib/facter/util/ec2.rb +106 -0
- data/lib/facter/util/fact.rb +204 -0
- data/lib/facter/util/file_read.rb +37 -0
- data/lib/facter/util/formatter.rb +39 -0
- data/lib/facter/util/ip.rb +285 -0
- data/lib/facter/util/ip/windows.rb +215 -0
- data/lib/facter/util/loader.rb +155 -0
- data/lib/facter/util/macaddress.rb +43 -0
- data/lib/facter/util/macosx.rb +73 -0
- data/lib/facter/util/manufacturer.rb +99 -0
- data/lib/facter/util/memory.rb +228 -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/operatingsystem.rb +21 -0
- data/lib/facter/util/parser.rb +158 -0
- data/lib/facter/util/partitions.rb +41 -0
- data/lib/facter/util/partitions/linux.rb +65 -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/posix.rb +16 -0
- data/lib/facter/util/processor.rb +289 -0
- data/lib/facter/util/registry.rb +11 -0
- data/lib/facter/util/resolution.rb +160 -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 +109 -0
- data/lib/facter/util/virtual.rb +180 -0
- data/lib/facter/util/vlans.rb +21 -0
- data/lib/facter/util/windows_root.rb +7 -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 +311 -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/openbsd_bridge_rules +11 -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/dhcp_servers/nmcli_devices +4 -0
- data/spec/fixtures/unit/dhcp_servers/nmcli_devices_disconnected +4 -0
- data/spec/fixtures/unit/dhcp_servers/nmcli_eth0_dhcp +36 -0
- data/spec/fixtures/unit/dhcp_servers/nmcli_eth0_static +24 -0
- data/spec/fixtures/unit/dhcp_servers/nmcli_wlan0_dhcp +49 -0
- data/spec/fixtures/unit/dhcp_servers/nmcli_wlan0_static +37 -0
- data/spec/fixtures/unit/dhcp_servers/route +3 -0
- data/spec/fixtures/unit/dhcp_servers/route_nogw +1 -0
- data/spec/fixtures/unit/ec2/rest/meta-data/root +20 -0
- data/spec/fixtures/unit/filesystems/linux +28 -0
- data/spec/fixtures/unit/gce/metadata/metadata.json +69 -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/kernelrelease/openbsd-5.3 +2 -0
- data/spec/fixtures/unit/kernelrelease/openbsd-5.3-current +3 -0
- data/spec/fixtures/unit/memory/aix-svmon +9 -0
- data/spec/fixtures/unit/memory/aix-swap_l +2 -0
- data/spec/fixtures/unit/memory/darwin-swapinfo-multiple +3 -0
- data/spec/fixtures/unit/memory/darwin-swapinfo-single +2 -0
- data/spec/fixtures/unit/memory/darwin-vm_stat +13 -0
- data/spec/fixtures/unit/memory/dragonfly-vmstat +3 -0
- data/spec/fixtures/unit/memory/freebsd-vmstat +3 -0
- data/spec/fixtures/unit/memory/linux-proc_meminfo +10 -0
- data/spec/fixtures/unit/memory/openbsd-vmstat +3 -0
- data/spec/fixtures/unit/memory/smartos_zone_swap_l-single +2 -0
- data/spec/fixtures/unit/memory/solaris-prtconf +4 -0
- data/spec/fixtures/unit/memory/solaris-swap_l-multiple +3 -0
- data/spec/fixtures/unit/memory/solaris-swap_l-single +2 -0
- data/spec/fixtures/unit/memory/solaris-vmstat +3 -0
- data/spec/fixtures/unit/netmask/darwin_10_8_5.txt +30 -0
- data/spec/fixtures/unit/netmask/ifconfig_aix_7.txt +3 -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/dhcp_servers/route +3 -0
- data/spec/fixtures/unit/util/dhcp_servers/route_nogw +1 -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/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/smartos_smbios +533 -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/operatingsystem/cumuluslinux.txt +8 -0
- data/spec/fixtures/unit/util/operatingsystem/redhat-7.txt +12 -0
- data/spec/fixtures/unit/util/operatingsystem/sabayon.txt +7 -0
- data/spec/fixtures/unit/util/operatingsystem/wheezy.txt +9 -0
- data/spec/fixtures/unit/util/partitions/partitions/mount +9 -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/centos-5-no-vlans +2 -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_1_cgroup/in_a_container +9 -0
- data/spec/fixtures/virtual/proc_1_cgroup/in_a_docker_container +8 -0
- data/spec/fixtures/virtual/proc_1_cgroup/not_in_a_container +9 -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 +130 -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 +42 -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 +106 -0
- data/spec/unit/dhcp_servers_spec.rb +152 -0
- data/spec/unit/domain_spec.rb +310 -0
- data/spec/unit/ec2/rest_spec.rb +145 -0
- data/spec/unit/ec2_spec.rb +127 -0
- data/spec/unit/facter_spec.rb +108 -0
- data/spec/unit/filesystems_spec.rb +50 -0
- data/spec/unit/fqdn_spec.rb +16 -0
- data/spec/unit/gce/metadata_spec.rb +49 -0
- data/spec/unit/gce_spec.rb +34 -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 +22 -0
- data/spec/unit/kernelrelease_spec.rb +69 -0
- data/spec/unit/kernelversion_spec.rb +32 -0
- data/spec/unit/ldom_spec.rb +75 -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 +73 -0
- data/spec/unit/manufacturer_spec.rb +115 -0
- data/spec/unit/memory_spec.rb +470 -0
- data/spec/unit/netmask_spec.rb +106 -0
- data/spec/unit/operatingsystem_spec.rb +160 -0
- data/spec/unit/operatingsystemmajrelease_spec.rb +38 -0
- data/spec/unit/operatingsystemrelease_spec.rb +236 -0
- data/spec/unit/osfamily_spec.rb +62 -0
- data/spec/unit/partitions_spec.rb +48 -0
- data/spec/unit/physicalprocessorcount_spec.rb +85 -0
- data/spec/unit/processor_spec.rb +401 -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 +97 -0
- data/spec/unit/util/confine_spec.rb +148 -0
- data/spec/unit/util/dhcp_servers_spec.rb +63 -0
- data/spec/unit/util/directory_loader_spec.rb +88 -0
- data/spec/unit/util/ec2_spec.rb +184 -0
- data/spec/unit/util/fact_spec.rb +142 -0
- data/spec/unit/util/file_read_spec.rb +29 -0
- data/spec/unit/util/formatter_spec.rb +50 -0
- data/spec/unit/util/ip/windows_spec.rb +80 -0
- data/spec/unit/util/ip_spec.rb +467 -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 +114 -0
- data/spec/unit/util/manufacturer_spec.rb +223 -0
- data/spec/unit/util/normalization_spec.rb +113 -0
- data/spec/unit/util/operatingsystem_spec.rb +92 -0
- data/spec/unit/util/parser_spec.rb +200 -0
- data/spec/unit/util/partitions/partitions_spec.rb +67 -0
- data/spec/unit/util/partitions_spec.rb +19 -0
- data/spec/unit/util/posix_spec.rb +11 -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 +171 -0
- data/spec/unit/util/virtual_spec.rb +364 -0
- data/spec/unit/util/vlans_spec.rb +42 -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 +519 -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 +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
|