/** Create a Virtual Machine in the specified pool @param name The name of the new Virtual Machine @param ip The IP address to assign the VM @param asset Asset tag to use (VM UUID) @param osInfo Operating System information (to be stored as a comment) @param taglist Array of tags to use for this new object @param poolID Virtual Machine pool to parent this object to */ function createVMInPool($name, $ip, $asset, $osInfo, $taglist, $poolID, $vmTypeID) { // make sure there's no duplicates if (getSearchResultByField('RackObject', array('id'), 'name', $name, '', 2)) { return FALSE; } // commitAddObject ($new_name, $new_label, $new_type_id, $new_asset_no, $taglist = array()) $newObject = commitAddObject($name, $name, $vmTypeID, $asset, $taglist); // add IP address to new object if (!empty($ip)) { bindIpToObject(ip_parse($ip), $newObject, 'eth0', 'regular'); } // add OS info to new object if (!empty($osInfo)) { usePreparedUpdateBlade('Object', array('comment' => $osInfo), array('id' => $newObject)); } // set container //commitLinkEntities($parent_entity_type, $parent_entity_id, $child_entity_type, $child_entity_id); commitLinkEntities("object", $poolID, "object", $newObject); }
function RunImport() { $taglist = isset($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array(); $objectnames = $_POST['objectname']; global $dbxlink; $log = emptyLog(); foreach ($objectnames as $objectname) { // FIXME: This reads the entire directory for each object. Not very efficient. if ($handle = opendir('./yamls/')) { while (false !== ($file = readdir($handle))) { # puppet names the files $FQDN.yaml, not PSMN if ($file == $objectname . ".yaml") { # SPYC is not happy with the puppet header. Hence read it as string, strip the header and feed it to SPYC $file_contents = file_get_contents("./yamls/{$file}"); $file_contents = substr($file_contents, strpos($file_contents, "\n") + 1); $yaml_file_array = Spyc::YAMLLoadString($file_contents); // FIXME: Is this the correct way to narrow in on an array? // At this point, $yaml_file_array contains all the data from the YAML files in a indexed array. $yaml_name = $yaml_file_array['name']; // switch to the 2nd part of the array $yaml_file_array = $yaml_file_array['parameters']; // getSearchResultByField ($tname, $rcolumns, $scolumn, $terms, $ocolumn = '', $exactness = 0|1|2) $object = getSearchResultByField('RackObject', array('id'), 'name', $yaml_name, '', 2); if ($object) { # Object exists. Do NOT modify. $id = $object[0]['id']; $log = mergeLogs($log, oneLiner(202, array("{$objectname} exists. No modifications!"))); } else { // Object does not exist. Create new. // Syntax: commitAddObject ($new_name, $new_label, $new_type_id, $new_asset_no, $taglist = array()) // Type is 4, server, by default. $new_yamlobject = commitAddObject($yaml_name, '', 4, $yaml_file_array['serialnumber'], $taglist); // Hardware type (i.e. ProLiant DL380 G6a), Dict Chapter ID is '11'; $hw_dict_key = getdict($hw = $yaml_file_array['productname'], $chapter = 11); commitUpdateAttrValue($object_id = $new_yamlobject, $attr_id = '2', $value = $hw_dict_key); // Operating system string, Dict Chapter ID is '13'. $osrelease = $yaml_file_array['operatingsystem'] . " " . $yaml_file_array['operatingsystemrelease']; $os_dict_key = getdict($hw = $osrelease, $chapter = 13); commitUpdateAttrValue($object_id = $new_yamlobject, $attr_id = '4', $value = $os_dict_key); /* // FIXME: The IDs should be looked up, and not preset. // Architecture. Attribute ID is '10000'. commitUpdateAttrValue ($object_id = $new_yamlobject, $attr_id = '10000', $value = $yaml_file_array['hardwareisa']); // Memory. Attribute ID is 17. commitUpdateAttrValue ($object_id = $new_yamlobject, $attr_id = '17', $value = (int)$yaml_file_array['memorysize']); // CPU. Attribute ID is 100001 $cpu = $yaml_file_array['processorcount'] . " x " . $yaml_file_array['processor0']; commitUpdateAttrValue ($object_id = $new_yamlobject, $attr_id = '10001', $value = $cpu); */ // OEM S/N 1. Attribute ID is '1'. commitUpdateAttrValue($object_id = $new_yamlobject, $attr_id = '1', $value = $yaml_file_array['serialnumber']); // FQDN. Attribute ID is '3'. commitUpdateAttrValue($object_id = $new_yamlobject, $attr_id = '3', $value = $yaml_file_array['fqdn']); // UUID. Attribute ID is '25'. commitUpdateAttrValue($object_id = $new_yamlobject, $attr_id = '25', $value = $yaml_file_array['uuid']); // Hypervisor. Attribute ID is '26', Dict Chapter ID is '29'. // Hypervisor key does not exist in standard Puppet yaml file, added by PSMN if (isset($yaml_file_array['hypervisor'])) { $hv_dict_key = getdict($hw = $yaml_file_array['hypervisor'], $chapter = 29); commitUpdateAttrValue($object_id = $new_yamlobject, $attr_id = '26', $value = $hv_dict_key); } // NICS // Warning! This part only work if default Configuration is modified // Go to "MainPage -> Configuration -> User Interface" // Modify "AutoPorts configuration": Change "4 = 1*33*kvm + 2*24*eth%u;15 = 1*446*kvm" to "15 = 1*446*kvm" // Ref: http://www.freelists.org/post/racktables-users/Automatic-insertions-of-servers-in-the-db,7 $nics = explode(',', $yaml_file_array['interfaces'], 9); $count = count($nics); for ($i = 0; $i < $count; $i++) { switch ($nics[$i]) { case "sit0": break 1; case "ib0": // infiniband if (isset($yaml_file_array['ipaddress_' . $nics[$i]])) { $ip = $yaml_file_array['ipaddress_' . $nics[$i]]; } // do NOT import infiniband MAC for now // if (isset($yaml_file_array['macaddress_' . $nics[$i]])) // { // $mac = $yaml_file_array['macaddress_' . $nics[$i]]; // } // Add port to object. Type 40 is 10GBase-CX4, MAC can be NULL commitAddPort($object_id = $new_yamlobject, $nics[$i], 40, 'infiniband', $mac); // Add IP to object. if (isset($ip)) { bindIpToObject($ip, $new_yamlobject, $nics[$i], 'regular'); } break 1; default: if (preg_match("eth", $nics[$i]) === 0) { break 1; } # this one might be bad for non-linux OSes ? if (isset($yaml_file_array['ipaddress_' . $nics[$i]])) { $ip = $yaml_file_array['ipaddress_' . $nics[$i]]; } if (isset($yaml_file_array['macaddress_' . $nics[$i]])) { $mac = $yaml_file_array['macaddress_' . $nics[$i]]; } // Add port to object. Type 24 is 1000Base-T commitAddPort($object_id = $new_yamlobject, $nics[$i], 24, 'Ethernet port', "{$mac}"); // Add IP to object. if (isset($ip)) { bindIpToObject($ip, $new_yamlobject, $nics[$i], 'regular'); } break 1; } unset($ip); unset($mac); } // Create a URL for the log message. $url = makeHref(array('page' => 'object', 'tab' => 'default', 'object_id' => $new_yamlobject)); $loginstance = "<a href=\"{$url}\">" . $objectname . "</a>"; $log = mergeLogs($log, oneLiner(80, array("{$loginstance}"))); } } } } } return showSuccess($log); }
function Update() { // Read uploaded file $lines = file($_FILES['userfile']['tmp_name']); // add file contents to facter array foreach ($lines as $line_num => $line) { $tmpfacter = explode("=>", $line, 2); $facter[trim($tmpfacter[0])] = str_replace('"', '', trim($tmpfacter[1])); } // Fix fqdn since all fields have \n inn them $facter['fqdn'] = str_replace("\n", "", $facter['fqdn']); // Check if it's an existing machine // 2011-08-31 <*****@*****.**> // * expanded query to try to match via facter Serialnumber to be able to // match unnamed HW assets. Serial is more precise and less likely to be changed. if (array_key_exists('serialnumber', $facter) && strlen($facter['serialnumber']) > 0 && $facter['serialnumber'] != 'Not Specified') { $query = "select id from RackObject where name = \"{$facter['fqdn']}\" OR asset_no = \"{$facter['serialnumber']}\" LIMIT 1"; } else { $query = "select id from RackObject where name = \"{$facter['fqdn']}\" LIMIT 1"; } unset($result); $result = usePreparedSelectBlade($query); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); if ($resultarray) { $id = $resultarray[0]['id']; } // If it's a new machine if (!isset($id)) { // Check to see if it's a physical machine and get the correct id for Server if ($facter['is_virtual'] == "false") { // Find server id $query = "select dict_key from Dictionary where dict_value='Server' LIMIT 1"; unset($result); $result = usePreparedSelectBlade($query); $resultarray = $result->fetchAll(); if ($resultarray) { $virtual = $resultarray[0]['dict_key']; } } else { // Find virtual id $query = "select dict_key from Dictionary where dict_value='VM' LIMIT 1"; unset($result); $result = usePreparedSelectBlade($query); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); if ($resultarray) { $virtual = $resultarray[0]['dict_key']; } } // Add the new machine $newmachine = commitAddObject($facter['fqdn'], "", $virtual, $value = ""); $type_id = getObjectTypeID($newmachine); } else { // Just set some fields I use later down for updating $newmachine = $id; $machineupdate = 1; $type_id = getObjectTypeID($newmachine); } // 2011-08-31 <*****@*****.**> // * Update (unique) name of object. if (array_key_exists('serialnumber', $facter) && strlen($facter['serialnumber']) > 0 && $facter['serialnumber'] != 'Not Specified') { unset($result); $query = "select * from RackObject where asset_no = \"{$facter['serialnumber']}\" LIMIT 1"; $result = usePreparedSelectBlade($query); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); if ($resultarray) { $id = $resultarray[0]['id']; $label = $resultarray[0]['label']; // Update FQDN commitUpdateObject($id, $facter['fqdn'], $label, 'no', $facter['serialnumber'], 'Facter Import::Update Common Name'); } } // Find HW type id // 2011-08-31 <*****@*****.**> // * adjust format to match default Dictionary Sets if ($facter['is_virtual'] == "false") { $iHWTemp = preg_match('([a-zA-Z]{1,})', $facter['manufacturer'], $matches); $sManufacturer = $matches[0]; $sHW = preg_replace('(\\ )', '\\1%GPASS%', $facter['productname']); $sHWType = $sManufacturer . ' ' . $sHW; $query = "select id from Attribute where name='HW type' LIMIT 1"; unset($result); $result = usePreparedSelectBlade($query); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); if ($resultarray) { $id = $resultarray[0]['id']; // Update HW type $hw_dict_key = getdict($sHWType, $chapter = 11); commitUpdateAttrValue($object_id = $newmachine, $attr_id = $id, $value = $hw_dict_key); } //Also Check if HYPERVISOR if (isset($facter['is_hypervisor'])) { $query = "select id from Attribute where name REGEXP '^ *Hypervisor Type\$' LIMIT 1"; unset($result); $result = usePreparedSelectBlade($query); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); if ($resultarray) { $id = $resultarray[0]['id']; // 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); } //Set Value to Yes $query = "select id from Attribute where name REGEXP '^ *Hypervisor' LIMIT 1"; unset($result); $result = usePreparedSelectBlade($query); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); if ($resultarray) { $id = $resultarray[0]['id']; // Update Hypervisor type $hypervisor = "Yes"; $hypervisor_dict_key = getdict($hypervisor, $chapter = 29); commitUpdateAttrValue($object_id = $newmachine, $attr_id = $id, $value = $hypervisor_dict_key); } //Find Running VMs $vms = explode(',', $facter['vms']); $vm_count = count($vms); 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); $result = usePreparedSelectBlade($query); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); if ($resultarray) { $id = $resultarray[0]['id']; // Update Hypervisor type $hypervisor = "No"; $hypervisor_dict_key = getdict($hypervisor, $chapter = 29); commitUpdateAttrValue($object_id = $newmachine, $attr_id = $id, $value = ""); } } } // Find SW type id (OS) $query = "select id from Attribute where name REGEXP '^ *SW type\$' LIMIT 1"; unset($result); $result = usePreparedSelectBlade($query); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); if ($resultarray) { $id = $resultarray[0]['id']; // Update SW type (OS) $osrelease = $facter['operatingsystem'] . '%GSKIP%' . $facter['operatingsystem'] . ' V' . $facter['operatingsystemrelease']; $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"); while (!feof($manifest_file)) { $tmp_line = fgets($manifest_file); if (!empty($tmp_line) && !preg_match("/\\/\\//", $tmp_line)) { @(list($Fact, $Attr, $Chapter) = array_map('trim', explode(',', $tmp_line, 3))); //check for multi-facter names if (strstr($Fact, '.')) { @(list($Fact1, $Fact2) = array_map('trim', explode('.', $Fact))); $value = $facter[$Fact1] . ' ' . $facter[$Fact2]; if (!isset($facter[$Fact1]) || !isset($facter[$Fact2])) { echo "WARNING: {$Fact1} or {$Fact2} does not exist in Facter for this object \n"; continue; } } else { if (!isset($facter[$Fact])) { echo "WARNING: {$Fact} does not exist in Facter for this object \n"; continue; } else { $value = $facter[$Fact]; } } $query = "select id from Attribute where name REGEXP '^ *{$Attr}' LIMIT 1"; unset($result); $result = usePreparedSelectBlade($query); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); $id = $resultarray[0]['id']; if (!valid($type_id, $id)) { echo "WARNING: Not a valid Mapping for {$Fact} to {$Attr} for objectType {$type_id} \n"; } else { if ($resultarray) { if (!empty($Chapter)) { $name = $value; $name_dict_key = getdict($hw = $name, $chapter = $Chapter); commitUpdateAttrValue($object_id = $newmachine, $attr_id = $id, $value = $name_dict_key); } else { if (preg_match("/[0-9]{1,2}\\/[0-9]{1,2}\\/[0-9]{4}/", $value) || preg_match("/[0-9]{1,2}\\-[0-9]{1,2}\\-[0-9]{4}/", $value) || preg_match("/[0-9]{4}\\-[0-9]{1,2}\\-[0-9]{1,2}/", $value)) { //handle dates commitUpdateAttrValue($newmachine, $id, strtotime($value)); } else { commitUpdateAttrValue($newmachine, $id, $value); } } } } } } fclose($manifest_file); // Add network interfaces // Create an array with interfaces $nics = explode(',', $facter['interfaces']); // Go through all interfaces and add IP and MAC $count = count($nics); for ($i = 0; $i < $count; $i++) { // Remove newline from the field $nics[$i] = str_replace("\n", "", $nics[$i]); // We generally don't monitor sit interfaces. // We don't do this for lo interfaces, too // 2011-08-31 <*****@*****.**> // * 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) { // 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") { // Find 1000Base-T id $query = "select id from PortOuterInterface where oif_name REGEXP '^ *1000Base-T\$' LIMIT 1"; } else { // Find virtual port id $query = "select id from PortOuterInterface where oif_name REGEXP '^ *virtual port\$' LIMIT 1"; } unset($result); $result = usePreparedSelectBlade($query); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); 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; } // Check if it's been configured a port already $query = "SELECT id,iif_id FROM Port where object_id={$newmachine} and name=\"{$nics[$i]}\""; unset($result); $result = usePreparedSelectBlade($query); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); if ($resultarray) { $portid = $resultarray[0]['id']; unset($id); $portcheck = $resultarray; } // Add/update port // 2011-08-31 <*****@*****.**> // * Don't touch already existing complex ports if ($resultarray[0]['type'] != 9) { if (count($portcheck) == 1) { commitUpdatePort($newmachine, $portid, $nics[$i], $nictypeid, "Ethernet port", "{$mac}", NULL); } else { commitAddPort($object_id = $newmachine, $nics[$i], $nictypeid, 'Ethernet port', "{$mac}"); } } else { //We've got a complex port, don't touch it, it raises an error with 'Database error: foreign key violation' } if (count($ipcheck) == 1) { if ($ip) { updateAddress(ip_parse($ip), $newmachine, $nics[$i], 'regular'); } } else { if ($ip) { bindIpToObject(ip_parse($ip), $newmachine, $nics[$i], 'regular'); } } unset($portcheck); unset($ipcheck); unset($ip); unset($mac); } } //uncomment to start using auto tags //addTagToObject($facter, $newmachine); return buildRedirectURL(); }