Facter enhancements (#28)
authorMatt Klich <matt@elementalvoid.com>
Wed, 8 Mar 2017 16:46:33 +0000 (09:46 -0700)
committerDenis Ovsienko <denis@ovsienko.info>
Wed, 8 Mar 2017 16:46:33 +0000 (19:46 +0300)
* allow for skipping hw_type update
* detect manifest via racktables_plugins_dir variable
* Ubuntu specific - auto add LTS in sw version
* allow bond interfaces but not docker
* whitespace fixes
* Add comments on what is being done.
* Link to LTS docs.
* Fix detection so that only even numbered major, '.04' minor releases are flagged as LTS.

facter/facter.php

index 25e7406..af38f66 100644 (file)
 *  To get VMs to auto add you have to create a facter function to return a list like:
 *  export FACTER_VMs=$(virsh list | awk '$3 == "running" {printf $2","}' | sed -e 's/,$//');
 *  Whatever you use for VMs it should return a list like: vms => vm1,vm2
-*  
+*
 *
 * Author: Torstein Hansen <huleboer@users.sourceforge.net>, sponsored by eniro.no
 *
 * This script is based on yaml_import for racktables by Tommy Botten Jensen
-* 
+*
 * 2011-08-25 modified by Neil Scholten <neil.scholten@gamigo.com>
 * - adjusted path for racktables > 0.19.1
 * - modified .yaml parsing to match to 'facter -py' format
 * - modified interface-type detection to use virtual port on VMs
 * - modified OS detection to match more better default sets (Testcase: CentOS).
-* 
+*
 * 2012-12-13 modified by Daniel Kasen <djtech@gmail.com>
 * - added generic looping to easially add fields
 * - Corrected issues with VM's breaking script
@@ -141,8 +141,13 @@ function Update()
        // Find HW type id
        // 2011-08-31 <neil.scholten@gamigo.com>
        // * adjust format to match default Dictionary Sets
-       if ($facter['is_virtual']=="false")
-       {       
+       $update_hw_type = true;
+       if (isset($_GET['update_hw_type']) && $_GET['update_hw_type'] == 'false')
+       {
+               $update_hw_type = false
+       }
+       if ($facter['is_virtual']=="false" && $update_hw_type)
+       {
                $iHWTemp                                = preg_match('([a-zA-Z]{1,})', $facter['manufacturer'], $matches);
                $sManufacturer  = $matches[0];
                $sHW                                            = preg_replace('(\ )', '\1%GPASS%', $facter['productname']);
@@ -166,7 +171,7 @@ function Update()
                        $resultarray = $result->fetchAll (PDO::FETCH_ASSOC);
                        if($resultarray) {
                        $id=$resultarray[0]['id'];
-                                       // Update Hypervisor type 
+                                       // Update Hypervisor type
                                        $hypervisor_type = $facter['is_hypervisor'];
                        $hypervisor_type_dict_key = getdict($hw=$hypervisor_type, $chapter=10005);
                        commitUpdateAttrValue ($object_id = $newmachine, $attr_id = $id, $value = $hypervisor_type_dict_key);
@@ -178,7 +183,7 @@ function Update()
                $resultarray = $result->fetchAll (PDO::FETCH_ASSOC);
                if($resultarray) {
                                $id=$resultarray[0]['id'];
-                               // Update Hypervisor type 
+                               // Update Hypervisor type
                                $hypervisor = "Yes";
                                $hypervisor_dict_key = getdict($hypervisor, $chapter=29);
                        commitUpdateAttrValue ($object_id = $newmachine, $attr_id = $id, $value = $hypervisor_dict_key);
@@ -189,7 +194,7 @@ function Update()
             for ($i = 0; $i < $vm_count; $i++) {
                                //addToParent
                                addVmToParent ($vms[$i], $newmachine);
-                       }        
+                       }
                } else {
                        $query = "select id from Attribute where name REGEXP '^ *Hypervisor' LIMIT 1";
                        unset($result);
@@ -204,7 +209,7 @@ function Update()
                        }
                }
        }
-       
+
        // Find SW type id (OS)
        $query = "select id from Attribute where name REGEXP '^ *SW type$' LIMIT 1";
        unset($result);
@@ -213,13 +218,22 @@ function Update()
        if($resultarray) {
                $id=$resultarray[0]['id'];
                // Update SW type (OS)
-               $osrelease = $facter['operatingsystem'] . '%GSKIP%' . $facter['operatingsystem'] . ' V' . $facter['operatingsystemrelease'];
+               // Ubuntu LTS - https://wiki.ubuntu.com/LTS
+               // Ubuntu LTS can be detected by an even OS Major and an OS minor of '04'.
+               // Example Ubuntu 'operatingsystemrelease' values: '16.10', '15.04'.
+               $os_release_lts = "";
+               $facter_osrelease = explode(".", $facter['operatingsystemrelease'])
+               if ($facter['operatingsystem'] == 'Ubuntu' && $facter_osrelease[0] % 2 == 0 && $facter_osrelease[1] == '04') {
+                       $os_release_lts = " LTS";
+               }
+               $osrelease = $facter['operatingsystem'] . '%GSKIP%' . $facter['operatingsystem'] . ' ' . $facter['operatingsystemrelease'] . $os_release_lts;
                $os_dict_key = getdict($hw=$osrelease, $chapter=13);
                commitUpdateAttrValue ($object_id = $newmachine, $attr_id = $id, $value = $os_dict_key);
        }
 
-       //Generic to read in from file  
-       $manifest_file = fopen("../plugins/manifest", "r") or die("Could not open manifest, make sure it is in the websrv root and called manifest \n");
+       //Generic to read in from file
+       global $racktables_plugins_dir;
+       $manifest_file = fopen($racktables_plugins_dir . "/manifest", "r") or die("Could not open manifest, make sure it is in the websrv root and called manifest \n");
        while ( ! feof ($manifest_file)) {
                $tmp_line = fgets($manifest_file);
                if (!empty($tmp_line) && !preg_match("/\/\//",$tmp_line)) {
@@ -258,7 +272,7 @@ function Update()
                                        commitUpdateAttrValue ($newmachine, $id, strtotime($value) );
                                } else {
                                        commitUpdateAttrValue ($newmachine, $id, $value );
-                               }       
+                               }
                        }
                }
        }
@@ -280,17 +294,17 @@ function Update()
                // 2011-08-31 <neil.scholten@gamigo.com>
                // * Only Document real interfaces, dont do bridges, bonds, vlan-interfaces
                //   when they have no IP defined.
-               if ( preg_match('(_|^(bond|lo|sit|vnet|virbr|veth|peth))',$nics[$i]) != 0 ) {
+               if ( preg_match('/(_|^(docker|lo|sit|vnet|virbr|veth|peth))/',$nics[$i]) != 0 ) {
                        // do nothing
                } else {
                        // Get IP
                        if (isset($facter['ipaddress_' . $nics[$i]]))
                        $ip = $facter['ipaddress_' . $nics[$i]];
-       
+
                        // Get MAC
                        if (isset($facter['macaddress_' . $nics[$i]]))
                        $mac = $facter['macaddress_' . $nics[$i]];
-       
+
                        //check if VM or not
                        if ($facter['is_virtual']=="false")
                        {
@@ -308,16 +322,16 @@ function Update()
                        if($resultarray) {
                                $nictypeid=$resultarray[0]['id'];
                        }
-       
+
                        // Remove newline from ip
                        $ip=str_replace("\n","", $ip);
-       
+
                        // Check to se if the interface has an ip assigned
                        $query = "SELECT object_id FROM IPv4Allocation where object_id=$newmachine and name=\"$nics[$i]\"";
                        unset($result);
                        $result = usePreparedSelectBlade ($query);
                        $resultarray = $result->fetchAll (PDO::FETCH_ASSOC);
-       
+
                        if($resultarray) {
                                unset($id);
                                $ipcheck=$resultarray;
@@ -327,7 +341,7 @@ function Update()
                        unset($result);
                        $result = usePreparedSelectBlade ($query);
                        $resultarray = $result->fetchAll (PDO::FETCH_ASSOC);
-       
+
                        if($resultarray) {
                                $portid = $resultarray[0]['id'];
                                unset($id);