function CableIDTabHandler() { echo '<div class=portlet><h2>Cable ID Helper</h2></div>'; $rack = spotEntity('rack', $_REQUEST['rack_id']); $result = usePreparedSelectBlade('SELECT DISTINCT object_id FROM RackSpace WHERE rack_id = ? ', array($rack['id'])); $objects = $result->fetchAll(PDO::FETCH_ASSOC); $cableIDs = array(); foreach ($objects as $object) { $pals = getObjectPortsAndLinks($object['object_id']); foreach ($pals as $portLink) { if ($portLink['cableid']) { $new = true; $dublicate = false; foreach ($cableIDs as $key => $cableID) { if ($portLink['object_id'] == $cableID['object1_id'] && $portLink['name'] == $cableID['object1_port'] || $portLink['object_id'] == $cableID['object2_id'] && $portLink['name'] == $cableID['object2_port']) { $new = false; // Link already in List } // Check for duplicate cable ids if ($new && $portLink['cableid'] == $cableID['cableID']) { $dublicate = true; $cableIDs[$key]['dublicate'] = true; } } if ($new) { $cableID = array(); $cableID['cableID'] = $portLink['cableid']; $cableID['object1_id'] = $portLink['object_id']; $cableID['object1_name'] = $portLink['object_name']; $cableID['object1_port'] = $portLink['name']; $cableID['object2_id'] = $portLink['remote_object_id']; $cableID['object2_name'] = $portLink['remote_object_name']; $cableID['object2_port'] = $portLink['remote_name']; $cableID['dublicate'] = $dublicate; array_push($cableIDs, $cableID); } } } } // Sort by cableIDs usort($cableIDs, function ($elem1, $elem2) { return strnatcasecmp($elem1['cableID'], $elem2['cableID']); }); // Print table echo '<table class="cooltable" align="center" border="0" cellpadding="5" cellspacing="0">' . '<tbody>' . ' <tr>' . ' <th>CableID</th>' . ' <th>Object 1</th>' . ' <th>Object 2</th>' . ' </tr>'; $i = 0; foreach ($cableIDs as $cableID) { if ($i % 2) { $class = 'row_even tdleft'; } else { $class = 'row_odd tdleft'; } if ($cableID['dublicate']) { $class .= ' trerror'; } echo '<tr class="' . $class . '">' . '<td>' . $cableID['cableID'] . '</td>' . '<td><a href="' . makeHref(array('page' => 'object', 'object_id' => $cableID['object1_id'])) . '">' . $cableID['object1_name'] . ': ' . $cableID['object1_port'] . '</a></td>' . '<td><a href="' . makeHref(array('page' => 'object', 'object_id' => $cableID['object2_id'])) . '">' . $cableID['object2_name'] . ': ' . $cableID['object2_port'] . '</a></td>' . '</tr>'; $i++; } echo ' </tbody>' . '</table>'; }
function getRacktablesObjects($type_id, $attr_id, $attr_value) { $r = usePreparedSelectBlade('select o.id, o.name, o.objtype_id, o.label, i.ip, i.type, i.name as ifname, av.attr_id as zabbix_flag_id, av.uint_value as zabbix_flag_value, av2.attr_id as sw_type_id, av2.uint_value as sw_type_value from Object AS o INNER JOIN IPv4Allocation as i ON (o.id = i.object_id AND o.objtype_id = ?) INNER JOIN AttributeValue av on (av.object_id = o.id AND av.attr_id = ? AND av.uint_value = ?) LEFT JOIN AttributeValue av2 on (av2.object_id = o.id AND av2.attr_id = ?)', array($type_id, $attr_id, $attr_value, RACKTABLES_SOFTWARE_TYPE_ID)); $items = $r->fetchAll(PDO::FETCH_ASSOC); $result = array(); foreach ($items as $item) { $ip = ip_format(ip4_int2bin($item['ip'])); if (!isset($result[$item['id']])) { if (!empty($item['ifname'])) { $item['ip'] = array($item['ifname'] => $ip); } else { $item['ip'] = array($ip); } $result[$item['id']] = $item; } else { if (is_array($result[$item['id']]['ip'])) { if (!empty($item['ifname'])) { $result[$item['id']]['ip'][$item['ifname']] = $ip; } else { $result[$item['id']]['ip'][] = $ip; } } } } return $result; }
public function testUpdateLinkWithPortAGreaterThanPortB() { usePreparedInsertBlade('Link', array('porta' => self::$porta, 'portb' => self::$portb)); usePreparedUpdateBlade('Link', array('porta' => self::$portb, 'portb' => self::$porta), array('porta' => self::$porta, 'portb' => self::$portb)); $result = usePreparedSelectBlade('SELECT COUNT(*) FROM Link WHERE porta=? AND portb=?', array(self::$porta, self::$portb)); $this->assertEquals($result->fetchColumn(), 1); }
/** Create a new Virtual Machine Pool @param name Pool name @param tagid Tag ID to use for this new VM @returns poolID ID of new VMPool object */ function createVMPool($name, $tagid) { // Get "VM Cluster" dict key $vmClusterTypeID = usePreparedSelectBlade("select * from Dictionary where dict_value = 'VM Cluster'")->fetch(PDO::FETCH_ASSOC); $vmClusterTypeID = $vmClusterTypeID['dict_key']; // Add the pool, with the proper type and tags $taglist = array($tagid); $poolID = commitAddObject($name, $name, $vmClusterTypeID, '', $taglist); // return the pool ID return $poolID; }
function fetchBackendPortList($sql_where_clause, $query_params = array()) { $query = <<<END SELECT \tPort.id, \tPort.name, \tPort.object_id, \tObject.name AS object_name, \tPort.l2address, \tPort.label, \tPort.reservation_comment, \tPort.iif_id, \tPort.type AS oif_id, \t(SELECT PortInnerInterface.iif_name FROM PortInnerInterface WHERE PortInnerInterface.id = Port.iif_id) AS iif_name, \t(SELECT Dictionary.dict_value FROM Dictionary WHERE Dictionary.dict_key = Port.type) AS oif_name, \tIF(lba.porta, lba.cable, lbb.cable) AS cableid, \tIF(lba.porta, pa.id, pb.id) AS remote_id, \tIF(lba.porta, pa.name, pb.name) AS remote_name, \tIF(lba.porta, pa.object_id, pb.object_id) AS remote_object_id, \tIF(lba.porta, oa.name, ob.name) AS remote_object_name, \t(SELECT COUNT(*) FROM PortLog WHERE PortLog.port_id = Port.id) AS log_count, \tPortLog.user, \tUNIX_TIMESTAMP(PortLog.date) as time FROM \tPort \tINNER JOIN Object ON Port.object_id = Object.id \tLEFT JOIN LinkBackend AS lba ON lba.porta = Port.id \tLEFT JOIN Port AS pa ON pa.id = lba.portb \tLEFT JOIN Object AS oa ON pa.object_id = oa.id \tLEFT JOIN LinkBackend AS lbb on lbb.portb = Port.id \tLEFT JOIN Port AS pb ON pb.id = lbb.porta \tLEFT JOIN Object AS ob ON pb.object_id = ob.id \tLEFT JOIN PortLog ON PortLog.id = (SELECT id FROM PortLog WHERE PortLog.port_id = Port.id ORDER BY date DESC LIMIT 1) WHERE \t{$sql_where_clause} END; $result = usePreparedSelectBlade($query, $query_params); $ret = array(); while ($row = $result->fetch(PDO::FETCH_ASSOC)) { $row['l2address'] = l2addressFromDatabase($row['l2address']); $row['linked'] = isset($row['remote_id']) ? 1 : 0; // last changed log $row['last_log'] = array(); if ($row['log_count']) { $row['last_log']['user'] = $row['user']; $row['last_log']['time'] = $row['time']; } unset($row['user']); unset($row['time']); $ret[] = $row; } return $ret; }
public static function getTripletsByIP($ip_bin) { $ret = array(); $result = usePreparedSelectBlade("\nSELECT DISTINCT IPv4LB.*\nFROM\n\tIPv4LB INNER JOIN IPv4VS ON IPv4VS.id = IPv4LB.vs_id\n\tLEFT JOIN IPv4RS USING (rspool_id)\nWHERE\n\trsip = ? OR vip = ?\nORDER BY\n\tvs_id\n\t", array($ip_bin, $ip_bin)); $rows = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); global $triplet_class; foreach ($rows as $row) { $triplet = new $triplet_class($row['object_id'], $row['vs_id'], $row['rspool_id'], $row); $triplet->display_cells = array('vs', 'lb', 'rs'); $ret[] = $triplet; } return $ret; }
function getEntityIdByName($element, $name) { // set table name $id = -1; $table = ""; switch ($element) { case "rack": $table = "Rack"; break; case "object": $table = "Object"; break; default: return $id; } $query = "SELECT id, name FROM {$table} WHERE name = '{$name}'"; $result = usePreparedSelectBlade($query); foreach ($result as $key => $value) { $id = $value["id"]; break; } return $id; }
function renderCablingPlan() { // Build cabling plan // Select edges $sql = "SELECT oa.id AS source, ob.id AS target, CONCAT(pa.name, _utf8' <> ', pb.name) AS label, 0 AS weight " . "FROM ((Link l JOIN Port pa ON l.porta = pa.id) JOIN RackObject oa ON pa.object_id = oa.id " . "JOIN Port pb ON l.portb = pb.id JOIN RackObject ob ON pb.object_id = ob.id)"; $result = usePreparedSelectBlade($sql); $edges = array(); while ($row = $result->fetch(PDO::FETCH_ASSOC)) { $found = FALSE; foreach ($edges as $key => $edge) { if ($edge['source'] == $row['source'] && $edge['target'] == $row['target']) { // Edge already exists ("Parallel"). Alter label and add weight $edges[$key]['label'] .= "\n" . $row['label']; $edges[$key]['weight']++; $found = TRUE; } } if (!$found) { $edges[] = $row; } } // Select nodes $sql = "SELECT DISTINCT o.id AS id, o.name AS label, '' AS url " . "FROM Port p JOIN RackObject o ON p.object_id = o.id " . "WHERE (p.id IN (SELECT Link.porta AS porta FROM Link) OR p.id IN " . "(SELECT Link.portb AS portb FROM Link))"; $result = usePreparedSelectBlade($sql); $nodes = $result->fetchAll(PDO::FETCH_ASSOC); $graph = new Image_GraphViz(TRUE, array(), 'Cabling Plan', FALSE, FALSE); foreach ($nodes as $node) { $graph->addNode($node['id'], array('label' => $node['label'], 'shape' => 'box3d')); } foreach ($edges as $edge) { $graph->addEdge(array($edge['source'] => $edge['target']), array('label' => $edge['label'], 'weight' => floatval($edge['weight']), 'fontsize' => 8.0, 'arrowhead' => 'dot', 'arrowtail' => 'dot', 'arrowsize' => 0.5)); } if (in_array($_REQUEST['format'], array('svg', 'png'))) { $graph->image($_REQUEST['format']); } }
function fetchNetworkRowsByAttr($attribute_id, $attribute_value, $use_key = FALSE, $dont_filter = FALSE) { global $netobject_type_id, $SQLSchema; // get attribute type static $map; if (!isset($map)) { $map = getAttrMap(); } if (!array_key_exists($attribute_id, $map)) { throw new InvalidArgException('attribute_id', $attribute_id, "No such attribute"); } $attribute = $map[$attribute_id]; // get realms $realms = array(); foreach ($attribute['application'] as $application) { foreach ($netobject_type_id as $realm => $type) { if ($application['objtype_id'] == $type) { $realms[] = $realm; } } } $join_side = $dont_filter && $attribute_value !== NULL ? 'INNER' : 'LEFT'; $join = ''; $field = ''; switch ($attribute['type']) { case 'string': $field = 'AV.string_value'; break; case 'uint': $field = 'AV.uint_value'; break; case 'float': $field = 'AV.float_value'; break; case 'date': $field = 'AV.uint_value'; break; case 'dict': if ($use_key) { $field = 'AV.uint_value'; } else { $join = 'LEFT JOIN Dictionary D ON D.dict_key = AV.uint_value'; $field = 'D.dict_value'; } break; default: throw new RackTablesError(); } $subqueries = array(); $params = array(); foreach (array('ipv4net' => 'AttributeValue_IPv4', 'ipv6net' => 'AttributeValue_IPv6') as $realm => $table) { if (in_array($realm, $realms)) { $main_table = $SQLSchema[$realm]['table']; $subquery = "\nSELECT\n MT.id as net_id,\n MT.ip,\n MT.mask,\n ? as realm,\n {$field} as attr_value\nFROM\n `{$main_table}` MT\n {$join_side} JOIN `{$table}` AV ON MT.id = AV.net_id AND AV.attr_id = ?\n {$join}\n"; $params[] = $realm; $params[] = $attribute_id; if (!$dont_filter) { if (isset($attribute_value)) { $subquery .= " WHERE {$field} = ?"; $params[] = $attribute_value; } else { $subquery .= " WHERE {$field} IS NULL"; } } $subqueries[] = $subquery; } } $query = implode(' UNION ', $subqueries); $result = usePreparedSelectBlade($query, $params); return $result->fetchAll(PDO::FETCH_ASSOC); }
function findObjectParentCandidates($object_id) { $object = spotEntity('object', $object_id); $args = array($object['objtype_id'], $object_id, $object_id); $query = "SELECT O.id, O.name, O.objtype_id FROM Object O "; $query .= "LEFT JOIN ObjectParentCompat OPC ON O.objtype_id = OPC.parent_objtype_id "; $query .= "WHERE OPC.child_objtype_id = ? "; $query .= "AND O.id != ? "; // exclude existing parents $query .= "AND O.id NOT IN (SELECT parent_entity_id FROM EntityLink WHERE parent_entity_type = 'object' AND child_entity_type = 'object' AND child_entity_id = ?) "; if ($object['objtype_id'] == 1504 || $object['objtype_id'] == 1507) { array_push($args, $object['objtype_id'], $object_id, $object_id); $query .= "AND OPC.parent_objtype_id != 4 "; $query .= "UNION "; $query .= "SELECT O.id, O.name, O.objtype_id FROM Object O "; $query .= "LEFT JOIN ObjectParentCompat OPC ON O.objtype_id = OPC.parent_objtype_id "; $query .= "LEFT JOIN AttributeValue AV ON O.id = AV.object_id "; $query .= "WHERE OPC.child_objtype_id = ? "; $query .= "AND (O.objtype_id = 4 AND AV.attr_id = 26 AND AV.uint_value = 1501) "; $query .= "AND O.id != ? "; // exclude existing parents $query .= "AND O.id NOT IN (SELECT parent_entity_id FROM EntityLink WHERE parent_entity_type = 'object' AND child_entity_type = 'object' AND child_entity_id = ?) "; } $query .= "ORDER BY 2"; $result = usePreparedSelectBlade($query, $args); $ret = array(); while ($row = $result->fetch(PDO::FETCH_ASSOC)) { $ret[$row['id']] = empty($row['name']) ? sprintf("[%s] - object %d", decodeObjectType($row['objtype_id']), $row['id']) : $row['name']; } return $ret; }
function renderDataIntegrityReport() { global $nextorder; $violations = FALSE; // check 1: EntityLink rows referencing not-existent relatives // check 1.1: children $realms = array('location' => 'Location', 'object' => 'RackObject', 'rack' => 'Rack', 'row' => 'Row'); $orphans = array(); foreach ($realms as $realm => $table) { $result = usePreparedSelectBlade('SELECT EL.* FROM EntityLink EL ' . "LEFT JOIN {$table} ON EL.child_entity_id = {$table}.id " . "WHERE EL.child_entity_type = ? AND {$table}.id IS NULL", array($realm)); $rows = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); $orphans = array_merge($orphans, $rows); } if (count($orphans)) { $violations = TRUE; startPortlet('EntityLink: Missing Children (' . count($orphans) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>Parent</th><th>Child Type</th><th>Child ID</th></tr>\n"; $order = 'odd'; foreach ($orphans as $orphan) { $realm_name = formatRealmName($orphan['parent_entity_type']); $parent = spotEntity($orphan['parent_entity_type'], $orphan['parent_entity_id']); echo "<tr class=row_{$order}>"; echo "<td>{$realm_name}: {$parent['name']}</td>"; echo "<td>{$orphan['child_entity_type']}</td>"; echo "<td>{$orphan['child_entity_id']}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 1.2: parents $orphans = array(); foreach ($realms as $realm => $table) { $result = usePreparedSelectBlade('SELECT EL.* FROM EntityLink EL ' . "LEFT JOIN {$table} ON EL.parent_entity_id = {$table}.id " . "WHERE EL.parent_entity_type = ? AND {$table}.id IS NULL", array($realm)); $rows = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); $orphans = array_merge($orphans, $rows); } if (count($orphans)) { $violations = TRUE; startPortlet('EntityLink: Missing Parents (' . count($orphans) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>Child</th><th>Parent Type</th><th>Parent ID</th></tr>\n"; $order = 'odd'; foreach ($orphans as $orphan) { $realm_name = formatRealmName($orphan['child_entity_type']); $child = spotEntity($orphan['child_entity_type'], $orphan['child_entity_id']); echo "<tr class=row_{$order}>"; echo "<td>{$realm_name}: {$child['name']}</td>"; echo "<td>{$orphan['parent_entity_type']}</td>"; echo "<td>{$orphan['parent_entity_id']}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 3: multiple tables referencing non-existent dictionary entries // check 3.1: AttributeMap $orphans = array(); $result = usePreparedSelectBlade('SELECT AM.*, A.name AS attr_name, C.name AS chapter_name ' . 'FROM AttributeMap AM ' . 'LEFT JOIN Attribute A ON AM.attr_id = A.id ' . 'LEFT JOIN Chapter C ON AM.chapter_id = C.id ' . 'LEFT JOIN Dictionary D ON AM.objtype_id = D.dict_key ' . 'WHERE D.dict_key IS NULL'); $orphans = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); if (count($orphans)) { $violations = TRUE; startPortlet('AttributeMap: Invalid Mappings (' . count($orphans) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>Attribute</th><th>Chapter</th><th>Object TypeID</th></tr>\n"; $order = 'odd'; foreach ($orphans as $orphan) { echo "<tr class=row_{$order}>"; echo "<td>{$orphan['attr_name']}</td>"; echo "<td>{$orphan['chapter_name']}</td>"; echo "<td>{$orphan['objtype_id']}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 3.2: Object $orphans = array(); $result = usePreparedSelectBlade('SELECT O.* FROM Object O ' . 'LEFT JOIN Dictionary D ON O.objtype_id = D.dict_key ' . 'WHERE D.dict_key IS NULL'); $orphans = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); if (count($orphans)) { $violations = TRUE; startPortlet('Object: Invalid Types (' . count($orphans) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>ID</th><th>Name</th><th>Type ID</th></tr>\n"; $order = 'odd'; foreach ($orphans as $orphan) { echo "<tr class=row_{$order}>"; echo "<td>{$orphan['id']}</td>"; echo "<td>{$orphan['name']}</td>"; echo "<td>{$orphan['objtype_id']}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 3.3: ObjectHistory $orphans = array(); $result = usePreparedSelectBlade('SELECT OH.* FROM ObjectHistory OH ' . 'LEFT JOIN Dictionary D ON OH.objtype_id = D.dict_key ' . 'WHERE D.dict_key IS NULL'); $orphans = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); if (count($orphans)) { $violations = TRUE; startPortlet('ObjectHistory: Invalid Types (' . count($orphans) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>ID</th><th>Name</th><th>Type ID</th></tr>\n"; $order = 'odd'; foreach ($orphans as $orphan) { echo "<tr class=row_{$order}>"; echo "<td>{$orphan['id']}</td>"; echo "<td>{$orphan['name']}</td>"; echo "<td>{$orphan['objtype_id']}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 3.4: ObjectParentCompat $orphans = array(); $result = usePreparedSelectBlade('SELECT OPC.*, PD.dict_value AS parent_name, CD.dict_value AS child_name ' . 'FROM ObjectParentCompat OPC ' . 'LEFT JOIN Dictionary PD ON OPC.parent_objtype_id = PD.dict_key ' . 'LEFT JOIN Dictionary CD ON OPC.child_objtype_id = CD.dict_key ' . 'WHERE PD.dict_key IS NULL OR CD.dict_key IS NULL'); $orphans = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); if (count($orphans)) { $violations = TRUE; startPortlet('Object Container Compatibility rules: Invalid Parent or Child Type (' . count($orphans) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>Parent</th><th>Parent Type ID</th><th>Child</th><th>Child Type ID</th></tr>\n"; $order = 'odd'; foreach ($orphans as $orphan) { echo "<tr class=row_{$order}>"; echo "<td>{$orphan['parent_name']}</td>"; echo "<td>{$orphan['parent_objtype_id']}</td>"; echo "<td>{$orphan['child_name']}</td>"; echo "<td>{$orphan['child_objtype_id']}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 4: relationships that violate ObjectParentCompat Rules $invalids = array(); $result = usePreparedSelectBlade('SELECT CO.id AS child_id, CO.objtype_id AS child_type_id, CD.dict_value AS child_type, CO.name AS child_name, ' . 'PO.id AS parent_id, PO.objtype_id AS parent_type_id, PD.dict_value AS parent_type, PO.name AS parent_name ' . 'FROM Object CO ' . 'LEFT JOIN EntityLink EL ON CO.id = EL.child_entity_id ' . 'LEFT JOIN Object PO ON EL.parent_entity_id = PO.id ' . 'LEFT JOIN ObjectParentCompat OPC ON PO.objtype_id = OPC.parent_objtype_id ' . 'LEFT JOIN Dictionary PD ON PO.objtype_id = PD.dict_key ' . 'LEFT JOIN Dictionary CD ON CO.objtype_id = CD.dict_key ' . "WHERE EL.parent_entity_type = 'object' AND EL.child_entity_type = 'object' " . 'AND OPC.parent_objtype_id IS NULL'); $invalids = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); if (count($invalids)) { $violations = TRUE; startPortlet('Objects: Violate Object Container Compatibility rules (' . count($invalids) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>Contained Obj Name</th><th>Contained Obj Type</th><th>Container Obj Name</th><th>Container Obj Type</th></tr>\n"; $order = 'odd'; foreach ($invalids as $invalid) { echo "<tr class=row_{$order}>"; echo "<td>{$invalid['child_name']}</td>"; echo "<td>{$invalid['child_type']}</td>"; echo "<td>{$invalid['parent_name']}</td>"; echo "<td>{$invalid['parent_type']}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 5: Links that violate PortCompat Rules $invalids = array(); $result = usePreparedSelectBlade('SELECT OA.id AS obja_id, OA.name AS obja_name, L.porta AS porta_id, PA.name AS porta_name, POIA.oif_name AS porta_type, ' . 'OB.id AS objb_id, OB.name AS objb_name, L.portb AS portb_id, PB.name AS portb_name, POIB.oif_name AS portb_type ' . 'FROM Link L ' . 'LEFT JOIN Port PA ON L.porta = PA.id ' . 'LEFT JOIN Object OA ON PA.object_id = OA.id ' . 'LEFT JOIN PortOuterInterface POIA ON PA.type = POIA.id ' . 'LEFT JOIN Port PB ON L.portb = PB.id ' . 'LEFT JOIN Object OB ON PB.object_id = OB.id ' . 'LEFT JOIN PortOuterInterface POIB ON PB.type = POIB.id ' . 'LEFT JOIN PortCompat PC on PA.type = PC.type1 AND PB.type = PC.type2 ' . 'WHERE PC.type1 IS NULL OR PC.type2 IS NULL'); $invalids = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); if (count($invalids)) { $violations = TRUE; startPortlet('Port Links: Violate Port Compatibility Rules (' . count($invalids) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>Object A</th><th>Port A Name</th><th>Port A Type</th><th>Object B</th><th>Port B Name</th><th>Port B Type</th></tr>\n"; $order = 'odd'; foreach ($invalids as $invalid) { echo "<tr class=row_{$order}>"; echo "<td>{$invalid['obja_name']}</td>"; echo "<td>{$invalid['porta_name']}</td>"; echo "<td>{$invalid['porta_type']}</td>"; echo "<td>{$invalid['objb_name']}</td>"; echo "<td>{$invalid['portb_name']}</td>"; echo "<td>{$invalid['portb_type']}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 6: TagStorage rows referencing non-existent parents $realms = array('file' => array('table' => 'File', 'column' => 'id'), 'ipv4net' => array('table' => 'IPv4Network', 'column' => 'id'), 'ipv4rspool' => array('table' => 'IPv4RSPool', 'column' => 'id'), 'ipv4vs' => array('table' => 'IPv4VS', 'column' => 'id'), 'ipv6net' => array('table' => 'IPv6Network', 'column' => 'id'), 'ipvs' => array('table' => 'VS', 'column' => 'id'), 'location' => array('table' => 'Location', 'column' => 'id'), 'object' => array('table' => 'RackObject', 'column' => 'id'), 'rack' => array('table' => 'Rack', 'column' => 'id'), 'user' => array('table' => 'UserAccount', 'column' => 'user_id'), 'vst' => array('table' => 'VLANSwitchTemplate', 'column' => 'id')); $orphans = array(); foreach ($realms as $realm => $details) { $result = usePreparedSelectBlade('SELECT TS.*, TT.tag FROM TagStorage TS ' . 'LEFT JOIN TagTree TT ON TS.tag_id = TT.id ' . "LEFT JOIN {$details['table']} ON TS.entity_id = {$details['table']}.{$details['column']} " . "WHERE TS.entity_realm = ? AND {$details['table']}.{$details['column']} IS NULL", array($realm)); $rows = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); $orphans = array_merge($orphans, $rows); } if (count($orphans)) { $violations = TRUE; startPortlet('TagStorage: Missing Parents (' . count($orphans) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>Tag</th><th>Parent Type</th><th>Parent ID</th></tr>\n"; $order = 'odd'; foreach ($orphans as $orphan) { $realm_name = formatRealmName($orphan['entity_realm']); echo "<tr class=row_{$order}>"; echo "<td>{$orphan['tag']}</td>"; echo "<td>{$realm_name}</td>"; echo "<td>{$orphan['entity_id']}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 7: FileLink rows referencing non-existent parents // re-use the realms list from the TagStorage check, with a few mods unset($realms['file'], $realms['vst']); $realms['row'] = array('table' => 'Row', 'column' => 'id'); $orphans = array(); foreach ($realms as $realm => $details) { $result = usePreparedSelectBlade('SELECT FL.*, F.name FROM FileLink FL ' . 'LEFT JOIN File F ON FL.file_id = F.id ' . "LEFT JOIN {$details['table']} ON FL.entity_id = {$details['table']}.{$details['column']} " . "WHERE FL.entity_type = ? AND {$details['table']}.{$details['column']} IS NULL", array($realm)); $rows = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); $orphans = array_merge($orphans, $rows); } if (count($orphans)) { $violations = TRUE; startPortlet('FileLink: Missing Parents (' . count($orphans) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>File</th><th>Parent Type</th><th>Parent ID</th></tr>\n"; $order = 'odd'; foreach ($orphans as $orphan) { $realm_name = formatRealmName($orphan['entity_type']); echo "<tr class=row_{$order}>"; echo "<td>{$orphan['name']}</td>"; echo "<td>{$realm_name}</td>"; echo "<td>{$orphan['entity_id']}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 8: missing triggers $triggers = array('Link-before-insert' => 'Link', 'Link-before-update' => 'Link'); $result = usePreparedSelectBlade('SELECT TRIGGER_NAME, EVENT_OBJECT_TABLE ' . 'FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = SCHEMA()'); $rows = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); $existing_triggers = $missing_triggers = array(); foreach ($rows as $row) { $existing_triggers[$row['TRIGGER_NAME']] = $row['EVENT_OBJECT_TABLE']; } foreach ($triggers as $trigger => $table) { if (!array_key_exists($trigger, $existing_triggers)) { $missing_triggers[$trigger] = $table; } } if (count($missing_triggers)) { $violations = TRUE; startPortlet('Missing Triggers (' . count($missing_triggers) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>Table</th><th>Trigger</th></tr>\n"; $order = 'odd'; foreach ($missing_triggers as $trigger => $table) { echo "<tr class=row_{$order}>"; echo "<td>{$table}</td>"; echo "<td>{$trigger}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 9: missing foreign keys $fkeys = array('Atom-FK-molecule_id' => 'Atom', 'Atom-FK-rack_id' => 'Atom', 'AttributeMap-FK-chapter_id' => 'AttributeMap', 'AttributeMap-FK-attr_id' => 'AttributeMap', 'AttributeValue-FK-map' => 'AttributeValue', 'AttributeValue-FK-object' => 'AttributeValue', 'CachedPAV-FK-object-port' => 'CachedPAV', 'CachedPAV-FK-vlan_id' => 'CachedPAV', 'CachedPNV-FK-compound' => 'CachedPNV', 'CachedPVM-FK-object_id' => 'CachedPVM', 'CactiGraph-FK-server_id' => 'CactiGraph', 'CactiGraph-FK-server_id' => 'CactiGraph', 'Dictionary-FK-chapter_id' => 'Dictionary', 'FileLink-File_fkey' => 'FileLink', 'IPv4Allocation-FK-object_id' => 'IPv4Allocation', 'IPv4LB-FK-vs_id' => 'IPv4LB', 'IPv4LB-FK-object_id' => 'IPv4LB', 'IPv4LB-FK-rspool_id' => 'IPv4LB', 'IPv4NAT-FK-object_id' => 'IPv4NAT', 'IPv4RS-FK' => 'IPv4RS', 'IPv6Allocation-FK-object_id' => 'IPv6Allocation', 'Link-FK-a' => 'Link', 'Link-FK-b' => 'Link', 'MountOperation-FK-object_id' => 'MountOperation', 'MountOperation-FK-old_molecule_id' => 'MountOperation', 'MountOperation-FK-new_molecule_id' => 'MountOperation', 'MuninGraph-FK-server_id' => 'MuninGraph', 'MuninGraph-FK-server_id' => 'MuninGraph', 'ObjectHistory-FK-object_id' => 'ObjectHistory', 'ObjectLog-FK-object_id' => 'ObjectLog', 'Port-FK-iif-oif' => 'Port', 'Port-FK-object_id' => 'Port', 'PortAllowedVLAN-FK-object-port' => 'PortAllowedVLAN', 'PortAllowedVLAN-FK-vlan_id' => 'PortAllowedVLAN', 'PortCompat-FK-oif_id1' => 'PortCompat', 'PortCompat-FK-oif_id2' => 'PortCompat', 'PortInterfaceCompat-FK-iif_id' => 'PortInterfaceCompat', 'PortInterfaceCompat-FK-oif_id' => 'PortInterfaceCompat', 'PortLog_ibfk_1' => 'PortLog', 'PortNativeVLAN-FK-compound' => 'PortNativeVLAN', 'PortVLANMode-FK-object-port' => 'PortVLANMode', 'RackSpace-FK-rack_id' => 'RackSpace', 'RackSpace-FK-object_id' => 'RackSpace', 'TagStorage-FK-TagTree' => 'TagStorage', 'TagTree-K-parent_id' => 'TagTree', 'UserConfig-FK-varname' => 'UserConfig', 'VLANDescription-FK-domain_id' => 'VLANDescription', 'VLANDescription-FK-vlan_id' => 'VLANDescription', 'VLANIPv4-FK-compound' => 'VLANIPv4', 'VLANIPv4-FK-ipv4net_id' => 'VLANIPv4', 'VLANIPv6-FK-compound' => 'VLANIPv6', 'VLANIPv6-FK-ipv6net_id' => 'VLANIPv6', 'VLANSTRule-FK-vst_id' => 'VLANSTRule', 'VLANSwitch-FK-domain_id' => 'VLANSwitch', 'VLANSwitch-FK-object_id' => 'VLANSwitch', 'VLANSwitch-FK-template_id' => 'VLANSwitch', 'VSEnabledIPs-FK-object_id' => 'VSEnabledIPs', 'VSEnabledIPs-FK-rspool_id' => 'VSEnabledIPs', 'VSEnabledIPs-FK-vs_id-vip' => 'VSEnabledIPs', 'VSEnabledPorts-FK-object_id' => 'VSEnabledPorts', 'VSEnabledPorts-FK-rspool_id' => 'VSEnabledPorts', 'VSEnabledPorts-FK-vs_id-proto-vport' => 'VSEnabledPorts', 'VSIPs-vs_id' => 'VSIPs', 'VS-vs_id' => 'VSPorts'); $result = usePreparedSelectBlade('SELECT CONSTRAINT_NAME, TABLE_NAME ' . 'FROM information_schema.TABLE_CONSTRAINTS ' . "WHERE CONSTRAINT_SCHEMA = SCHEMA() AND CONSTRAINT_TYPE = 'FOREIGN KEY'"); $rows = $result->fetchAll(PDO::FETCH_ASSOC); unset($result); $existing_fkeys = $missing_fkeys = array(); foreach ($rows as $row) { $existing_fkeys[$row['CONSTRAINT_NAME']] = $row['TABLE_NAME']; } foreach ($fkeys as $fkey => $table) { if (!array_key_exists($fkey, $existing_fkeys)) { $missing_fkeys[$fkey] = $table; } } if (count($missing_fkeys)) { $violations = TRUE; startPortlet('Missing Foreign Keys (' . count($missing_fkeys) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>Table</th><th>Key</th></tr>\n"; $order = 'odd'; foreach ($missing_fkeys as $fkey => $table) { echo "<tr class=row_{$order}>"; echo "<td>{$table}</td>"; echo "<td>{$fkey}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 10: circular references // - all affected members of the tree are displayed // - it would be beneficial to only display the offending records // check 10.1: locations $invalids = array(); $locations = listCells('location'); foreach ($locations as $location) { try { $children = getLocationChildrenList($location['id']); } catch (RackTablesError $e) { $invalids[] = $location; } } if (count($invalids)) { $violations = TRUE; startPortlet('Locations: Tree Contains Circular References (' . count($invalids) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>Child ID</th><th>Child Location</th><th>Parent ID</th><th>Parent Location</th></tr>\n"; $order = 'odd'; foreach ($invalids as $invalid) { echo "<tr class=row_{$order}>"; echo "<td>{$invalid['id']}</td>"; echo "<td>{$invalid['name']}</td>"; echo "<td>{$invalid['parent_id']}</td>"; echo "<td>{$invalid['parent_name']}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 10.2: objects $invalids = array(); $objects = listCells('object'); foreach ($objects as $object) { try { $children = getObjectContentsList($object['id']); } catch (RackTablesError $e) { $invalids[] = $object; } } if (count($invalids)) { $violations = TRUE; startPortlet('Objects: Tree Contains Circular References (' . count($invalids) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>Contained ID</th><th>Contained Object</th><th>Container ID</th><th>Container Object</th></tr>\n"; $order = 'odd'; foreach ($invalids as $invalid) { echo "<tr class=row_{$order}>"; echo "<td>{$invalid['id']}</td>"; echo "<td>{$invalid['name']}</td>"; echo "<td>{$invalid['container_id']}</td>"; echo "<td>{$invalid['container_name']}</td>"; echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } // check 10.3: tags $invalids = array(); $tags = getTagList(); foreach ($tags as $tag) { try { $children = getTagChildrenList($tag['id']); } catch (RackTablesError $e) { $invalids[] = $tag; } } if (count($invalids)) { $violations = TRUE; startPortlet('Tags: Tree Contains Circular References (' . count($invalids) . ')'); echo "<table cellpadding=5 cellspacing=0 align=center class=cooltable>\n"; echo "<tr><th>Child ID</th><th>Child Tag</th><th>Parent ID</th><th>Parent Tag</th></tr>\n"; $order = 'odd'; foreach ($invalids as $invalid) { echo "<tr class=row_{$order}>"; echo "<td>{$invalid['id']}</td>"; echo "<td>{$invalid['tag']}</td>"; echo "<td>{$invalid['parent_id']}</td>"; printf('<td>%s</td>', $tags[$invalid['parent_id']]['tag']); echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table>\n"; finishPortLet(); } if (!$violations) { echo '<h2>No integrity violations found</h2>'; } }
function determine_PortLinker() { global $localSplit, $remoteSplit, $portLinkerObjectTypes; $errorText = ""; assertUIntArg('object_id', __FUNCTION__); $object = spotEntity('object', $_REQUEST['object_id']); $linkok = localpretrigger_PortLinker(); if ($linkok == 2) { if (in_array($object['objtype_id'], $portLinkerObjectTypes)) { $localPortCount = countPorts($object['id']); $remotePortCount = array(); $remoteObject = array(); $remoteSplit = array(); $localSplit = determinePortSplit($object['label'], $localPortCount); $current = 1; foreach ($localSplit as $aKey => $aValue) { if (strlen($errorText) == 0) { $q = "SELECT id FROM RackObject WHERE name='{$aKey}' "; $result = usePreparedSelectBlade($q); if ($result == NULL) { print_r($dbxlink->errorInfo()); die; } if ($row = $result->fetch(PDO::FETCH_NUM)) { $remotePortCount[$aKey] = countPorts($row[0]); $remoteObject[$aKey] = spotEntity('object', $row[0]); $remoteSplit[$aKey] = determinePortSplit($remoteObject[$aKey]['label'], $remotePortCount[$aKey]); } else { $errorText = "Could not find object <b>{$aKey}</b>"; } } } if (strlen($errorText) == 0) { foreach ($localSplit as $aKey => $aValue) { if (strlen($errorText) == 0 && !isset($remoteSplit[$aKey][$object['name']]['count'])) { $errorText = "Object <b>{$aKey}</b> does not list this object in the label field as a remote panel"; } if (strlen($errorText) == 0 && $remoteSplit[$aKey][$object['name']]['count'] != $aValue['count']) { $errorText = "Port count does not match for object <b>{$aKey}</b>"; } } if (strlen($errorText) == 0) { foreach ($localSplit as $aKey => $aValue) { if (strlen($errorText) == 0) { $localSplit[$aKey]['ports'] = getPorts($object['id'], $aValue['count'], $aValue['start']); if (count($localSplit[$aKey]['ports']) != $aValue['count']) { $errorText = "Not all ports available on this object"; } } if (strlen($errorText) == 0) { $localSplit[$aKey]['remote_ports'] = getPorts($remoteObject[$aKey]['id'], $remoteSplit[$aKey][$object['name']]['count'], $remoteSplit[$aKey][$object['name']]['start']); if (count($localSplit[$aKey]['ports']) != $remoteSplit[$aKey][$object['name']]['count']) { $errorText = "Not all ports available on this object"; } } } } } } else { $errorText = "Object type should be PatchPanel or ODFPanel"; } } else { switch ($linkok) { case "-1": $errorText = "There are no ports configured yet, so nothing to link to."; break; case "0": $errorText = "Some link ports are already linked to another port."; break; case "1": $errorText = "No ports found that end in link."; break; default: $errorText = "Unknown error."; } } return $errorText; }
function renderObjectHistory($object_id) { $order = 'odd'; global $nextorder; echo '<table border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>'; echo '<tr><th>change time</th><th>author</th><th>name</th><th>visible label</th><th>asset no</th><th>has problems?</th><th>comment</th></tr>'; $result = usePreparedSelectBlade('SELECT ctime, user_name, name, label, asset_no, has_problems, comment FROM ObjectHistory WHERE id=? ORDER BY ctime', array($object_id)); while ($row = $result->fetch(PDO::FETCH_NUM)) { echo "<tr class=row_{$order}><td>{$row[0]}</td>"; for ($i = 1; $i <= 6; $i++) { echo "<td>" . $row[$i] . "</td>"; } echo "</tr>\n"; $order = $nextorder[$order]; } echo "</table><br>\n"; }
function updateconfig_PortGenerator() { global $tablePortGenerator; checkForTable(); $q = "SELECT autoportconfig FROM {$tablePortGenerator} WHERE dict_key={$_REQUEST['yId']} "; $result = usePreparedSelectBlade($q); if ($result == NULL) { print_r($dbxlink->errorInfo()); die; } if ($row = $result->fetch(PDO::FETCH_NUM)) { $q = "UPDATE {$tablePortGenerator} SET autoportconfig='{$_REQUEST['yConfig']}' WHERE dict_key={$_REQUEST['yId']} "; } else { $q = "INSERT INTO {$tablePortGenerator} (dict_key,autoportconfig) VALUES ({$_REQUEST['yId']},'{$_REQUEST['yConfig']}') "; } $result = usePreparedSelectBlade($q); if ($result == NULL) { print_r($dbxlink->errorInfo()); die; } if (true) { return setMessage('success', $message = "Successfully updated auto port configuration"); } else { print "false"; return setMessage('error', $message = "Error in update to auto port configuration"); } }
function ConfigTabHandler() { $dateadd = date("Y-m-d H:i:s"); // Add show/hide JS functionality for existing configuration fields echo "<SCRIPT language=\"JavaScript\">\n\t<!--\n\tfunction toggle_visibility(id){\n\tvar e = document.getElementById(id);\n\tif(e.style.display == 'block')\n\t\te.style.display = 'none';\n\telse\n\t\te.style.display = 'block';\n\t}\n\t//-->\n\t</script>\n"; // Print markup content for config tab $display = "<center>\n"; if (isset($_POST['op'])) { if ($_POST['op'] == "addConfig") { commitNewConfig($_POST['object_id'], $_POST['config'], $_POST['comments'], $_POST['dateadd']); } if ($_POST['op'] == "editConfig") { commitUpdateConfig($_POST['conf_id'], $_POST['config'], $_POST['comments'], $_POST['dateadd']); } } if (isset($_GET['op'])) { if ($_GET['op'] == "delConfig") { commitDeleteConfig($_GET['conf_id']); } } // Table header $display .= "<table cellspacing=0 cellpadding='5' align='center' class='widetable'>"; $display .= "<tr><th> </th>"; $display .= "<th class=tdleft></br>Saved Configurations</th>"; //$display .= "<th class=tdleft>Comment</th>"; $display .= "<th> </th></tr>"; assertUIntArg('object_id', __FUNCTION__); $object = spotEntity('object', $_REQUEST['object_id']); // Existing configs $query = "SELECT * FROM ObjectConfigs WHERE object_id = '{$object['id']}'"; $result = NULL; $result = usePreparedSelectBlade($query); while ($row = $result->fetch(PDO::FETCH_ASSOC)) { $conf_id = $row['id']; $object_id = $row['object_id']; $config = $row['config']; $comments = $row['comments']; $date = $row['date']; $display .= "<form method=post id=editConfig name=editConfig autocomplete=off action=\"\">"; $display .= "<input type=hidden name=\"conf_id\" value=\"" . $conf_id . "\">"; $display .= "<input type=hidden name=\"date\" value=\"" . $date . "\">"; $display .= "<input type=hidden name=\"op\" value=\"editConfig\">"; $display .= "<input type=hidden name=\"object_id\" value=\"" . $object_id . "\">"; $display .= "<tr><td><a href='?page=object&tab=configs&object_id=" . $object_id . "&op=delConfig&conf_id=" . $conf_id . "'onclick=\"javascript:return confirm('Are you sure you want to delete this Config?')\">"; $display .= "<img src='?module=chrome&uri=pix/tango-list-remove.png' width=16 height=16 border=0 title='Delete this Config'></a></td>"; $display .= "<td><a href=# onclick=toggle_visibility('{$conf_id}');>{$date}           Comments:  {$comments}</a>"; $display .= "</br><div id={$conf_id} style=display:none;><textarea style=background-color:#CCCCCC form=editConfig name=\"config\" cols=125 rows=15>" . $config . "</textarea></div></td><td></td>"; //$display .= "<td class='tdleft' NOWRAP><textarea name=comment value='".$comments."' cols=25 maxlength=254></textarea></td>"; $display .= "<td><input type=image name=submit class=icon src='?module=chrome&uri=pix/tango-document-save-16x16.png' border=0 title='Save' onclick=\"javascript:return confirm('Are you sure you want to overwrite this Config?')\"></td></form></tr>"; } // New config $display .= "<form action=\"\" method=post autocomplete=off id=\"addConfig\" name=\"addConfig\">"; $display .= "<input type=hidden name=\"object_id\" value=\"" . $object['id'] . "\">"; $display .= "<input type=hidden name=\"dateadd\" value=\"" . $dateadd . "\">"; $display .= "<input type=hidden name=\"op\" value=\"addConfig\">"; $display .= "<tr><td><input type=image name=submit class=icon src='?module=chrome&uri=pix/tango-list-add.png' border=0 title='Add a Config'></td>"; $display .= "<td class='tdleft'></br></br><p style=font-weight:bold;> Add New Configurations</p>Comment: <input cols=40 name=comments tabindex=102></br><textarea cols=125 rows=20 name=config tabindex=100 required></textarea></br></td></tr>"; $display .= "</form></br></table></br></center>"; // Output all .display strings to markup echo $display; }
function updateTripletConfig() { $key_fields = array('object_id' => assertUIntArg('object_id'), 'vs_id' => assertUIntArg('vs_id'), 'rspool_id' => assertUIntArg('rspool_id')); $config_fields = array('vsconfig' => nullEmptyStr(assertStringArg('vsconfig', TRUE)), 'rsconfig' => nullEmptyStr(assertStringArg('rsconfig', TRUE))); $vsinfo = spotEntity('ipvs', $key_fields['vs_id']); amplifyCell($vsinfo); $found = FALSE; if ($_REQUEST['op'] == 'updPort') { $table = 'VSEnabledPorts'; $proto = assertStringArg('proto'); $vport = assertUIntArg('port', TRUE); $key_fields['proto'] = $proto; $key_fields['vport'] = $vport; $key = "Port {$proto}-{$vport}"; // check if such port exists in VS foreach ($vsinfo['ports'] as $vs_port) { if ($vs_port['proto'] == $proto && $vs_port['vport'] == $vport) { $found = TRUE; break; } } } else { $table = 'VSEnabledIPs'; $vip = assertIPArg('vip'); $config_fields['prio'] = nullEmptyStr(assertStringArg('prio', TRUE)); $key_fields['vip'] = $vip; $key = "IP " . ip_format($vip); // check if such VIP exists in VS foreach ($vsinfo['vips'] as $vs_vip) { if ($vs_vip['vip'] === $vip) { $found = TRUE; break; } } } if (!$found) { showError("{$key} not found in VS"); return; } $nchanged = 0; if (!isCheckSet('enabled')) { if ($nchanged += usePreparedDeleteBlade($table, $key_fields)) { showSuccess("{$key} disabled"); return; } } else { global $dbxlink; $dbxlink->beginTransaction(); $q = "SELECT * FROM {$table} WHERE"; $sep = ''; $params = array(); foreach ($key_fields as $field => $value) { $q .= " {$sep} {$field} = ?"; $params[] = $value; $sep = 'AND'; } $result = usePreparedSelectBlade("{$q} FOR UPDATE", $params); $row = $result->fetch(PDO::FETCH_ASSOC); unset($result); if ($row) { if ($nchanged += usePreparedUpdateBlade($table, $config_fields, $key_fields)) { showSuccess("{$key} config updated"); } } else { if ($nchanged += $table == 'VSEnabledIPs' ? addSLBIPLink($key_fields + $config_fields) : addSLBPortLink($key_fields + $config_fields)) { showSuccess("{$key} enabled"); } } $dbxlink->commit(); } if (!$nchanged) { showNotice("No changes made"); } }
function scanAttrRelativeDays($attr_id, $not_before_days, $not_after_days) { $attrmap = getAttrMap(); if ($attrmap[$attr_id]['type'] != 'date') { throw new InvalidArgException('attr_id', $attr_id, 'attribute cannot store dates'); } $result = usePreparedSelectBlade('SELECT uint_value, object_id FROM AttributeValue ' . 'WHERE attr_id=? and FROM_UNIXTIME(uint_value) BETWEEN ' . 'DATE_ADD(curdate(), INTERVAL ? DAY) and DATE_ADD(curdate(), INTERVAL ? DAY)', array($attr_id, $not_before_days, $not_after_days)); return $result->fetchAll(PDO::FETCH_ASSOC); }
function getPortOIOptions() { $result = usePreparedSelectBlade('SELECT dict_key,dict_value from Dictionary where chapter_id = 2', array()); $row = $result->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_UNIQUE | PDO::FETCH_COLUMN); return $row; }
function getUnlinkedNodePingChecks($object_id) { $result = usePreparedSelectBlade('SELECT id, label, target, type ' . 'FROM NodePingCheck ' . 'WHERE id NOT IN (SELECT check_id FROM NodePingLink WHERE object_id = ?) ' . 'ORDER BY label, target, type', array($object_id)); return reindexById($result->fetchAll(PDO::FETCH_ASSOC)); }
function updateObjectAllocation() { global $remote_username, $sic; if (!isset($_REQUEST['got_atoms'])) { unset($_GET['page']); unset($_GET['tab']); unset($_GET['op']); unset($_POST['page']); unset($_POST['tab']); unset($_POST['op']); return buildRedirectURL(NULL, NULL, $_REQUEST); } $object_id = getBypassValue(); $rf1 = $_REQUEST['rfid']; if (isset($_REQUEST['rfid'])) { // $rf1 = 1000000;//$_REQUEST['rfid']; $result = usePreparedSelectBlade("SELECT object_id FROM objecttorf WHERE rf_id = ?", array($rf1)); $row = $result->fetch(PDO::FETCH_ASSOC); if (isset($row)) { $object_id = $row['object_id']; } //получить значение из базы где rf1=njvenj //showError ('Permission deniedddddddd, "' . $object_id . '" left unchanged'); } $changecnt = 0; // Get a list of all of this object's parents, // then trim the list to only include parents that are racks $objectParents = getEntityRelatives('parents', 'object', $object_id); $parentRacks = array(); foreach ($objectParents as $parentData) { if ($parentData['entity_type'] == 'rack') { $parentRacks[] = $parentData['entity_id']; } } $workingRacksData = array(); foreach ($_REQUEST['rackmulti'] as $cand_id) { if (!isset($workingRacksData[$cand_id])) { $rackData = spotEntity('rack', $cand_id); amplifyCell($rackData); $workingRacksData[$cand_id] = $rackData; } // It's zero-U mounted to this rack on the form, but not in the DB. Mount it. if (isset($_REQUEST["zerou_{$cand_id}"]) && !in_array($cand_id, $parentRacks)) { $changecnt++; commitLinkEntities('rack', $cand_id, 'object', $object_id); } // It's not zero-U mounted to this rack on the form, but it is in the DB. Unmount it. if (!isset($_REQUEST["zerou_{$cand_id}"]) && in_array($cand_id, $parentRacks)) { $changecnt++; commitUnlinkEntities('rack', $cand_id, 'object', $object_id); } } foreach ($workingRacksData as &$rd) { applyObjectMountMask($rd, $object_id); } $oldMolecule = getMoleculeForObject($object_id); foreach ($workingRacksData as $rack_id => $rackData) { if (!processGridForm($rackData, 'F', 'T', $object_id)) { continue; } $changecnt++; // Reload our working copy after form processing. $rackData = spotEntity('rack', $cand_id); amplifyCell($rackData); applyObjectMountMask($rackData, $object_id); $workingRacksData[$rack_id] = $rackData; } if ($changecnt) { // Log a record. $newMolecule = getMoleculeForObject($object_id); usePreparedInsertBlade('MountOperation', array('object_id' => $object_id, 'old_molecule_id' => count($oldMolecule) ? createMolecule($oldMolecule) : NULL, 'new_molecule_id' => count($newMolecule) ? createMolecule($newMolecule) : NULL, 'user_name' => $remote_username, 'comment' => empty($sic['comment']) ? NULL : $sic['comment'])); } showFuncMessage(__FUNCTION__, 'OK', array($changecnt)); }
static function hasbackend($object_id) { /* sql bitwise xor: porta ^ portb */ //select cable, ((porta ^ portb) ^ 4556) as port from Link where (4556 in (porta, portb)); $result = usePreparedSelectBlade('SELECT count(*) from Port join LinkBackend as LinkBackend_a on LinkBackend_a.porta = id join LinkBackend as LinkBackend_b on LinkBackend_b.portb = id where object_id = ?', array($object_id)); $retval = $result->fetchColumn(); $result->closeCursor(); return $retval != 0; }
function renderRack($rack_id, $hl_obj_id = 0) { $rackData = spotEntity('rack', $rack_id); amplifyCell($rackData); markAllSpans($rackData); if ($hl_obj_id > 0) { highlightObject($rackData, $hl_obj_id); } $prev_id = getPrevIDforRack($rackData['row_id'], $rack_id); $next_id = getNextIDforRack($rackData['row_id'], $rack_id); echo "<center><table border=0><tr valign=middle>"; echo '<td><h2>' . mkA($rackData['row_name'], 'row', $rackData['row_id']) . ' :</h2></td>'; if ($prev_id != NULL) { echo '<td>' . mkA(getImageHREF('prev', 'previous rack'), 'rack', $prev_id) . '</td>'; } echo '<td><h2>' . mkA($rackData['name'], 'rack', $rackData['id']) . '</h2></td>'; if ($next_id != NULL) { echo '<td>' . mkA(getImageHREF('next', 'next rack'), 'rack', $next_id) . '</td>'; } echo "</h2></td></tr></table>\n"; $result = usePreparedSelectBlade("SELECT * FROM racktemperature WHERE rackid = ?", array($rack_id)); $row = $result->fetch(PDO::FETCH_ASSOC); if (isset($row['top'])) { echo "<table align=left border=1>\n"; echo "<tr><th>Sensor</th><th>Temperature</th></tr>\n"; for ($i = $rackData['height']; $i > 5; $i--) { if ($i == 40) { echo "<tr><td>top</td><td>{$row['top']}</td></tr>\n"; } else { if ($i == 23) { echo "<tr><td>middle</td><td>{$row['middle']}</td></tr>\n"; } else { if ($i == 11) { echo "<tr><td>bottom</td><td>{$row['bottom']}</td></tr>\n"; } else { echo "<tr><td> </td><td> </td></tr>\n"; } } } } echo "</table>"; } echo "<table class=rack align=center border=0 cellspacing=0 cellpadding=1>\n"; echo "<tr><th width='10%'> </th><th width='20%'>Front</th>"; echo "<th width='50%'>Interior</th><th width='20%'>Back</th></tr>\n"; for ($i = $rackData['height']; $i > 0; $i--) { echo "<tr><th>" . inverseRackUnit($i, $rackData) . "</th>"; for ($locidx = 0; $locidx < 3; $locidx++) { if (isset($rackData[$i][$locidx]['skipped'])) { continue; } $state = $rackData[$i][$locidx]['state']; echo "<td class='atom state_{$state}"; if (isset($rackData[$i][$locidx]['hl'])) { echo $rackData[$i][$locidx]['hl']; } echo "'"; if (isset($rackData[$i][$locidx]['colspan'])) { echo ' colspan=' . $rackData[$i][$locidx]['colspan']; } if (isset($rackData[$i][$locidx]['rowspan'])) { echo ' rowspan=' . $rackData[$i][$locidx]['rowspan']; } echo ">"; switch ($state) { case 'T': printObjectDetailsForRenderRack($rackData[$i][$locidx]['object_id'], $hl_obj_id); break; case 'A': echo '<div title="This rackspace does not exist"> </div>'; break; case 'F': echo '<div title="Free rackspace"> </div>'; break; case 'U': echo '<div title="Problematic rackspace, you CAN\'T mount here"> </div>'; break; default: echo '<div title="No data"> </div>'; break; } echo '</td>'; } echo "</tr>\n"; } echo "</table>\n"; // Get a list of all of objects Zero-U mounted to this rack $zeroUObjects = getEntityRelatives('children', 'rack', $rack_id); if (count($zeroUObjects) > 0) { echo "<br><table width='75%' class=rack border=0 cellspacing=0 cellpadding=1>\n"; echo "<tr><th>Zero-U:</th></tr>\n"; foreach ($zeroUObjects as $zeroUObject) { $state = $zeroUObject['entity_id'] == $hl_obj_id ? 'Th' : 'T'; echo "<tr><td class='atom state_{$state}'>"; printObjectDetailsForRenderRack($zeroUObject['entity_id']); echo "</td></tr>\n"; } echo "</table>\n"; } echo "</center>\n"; }
function getdict($hw, $chapter) { try { global $dbxlink; $query = "select dict_key from Dictionary where chapter_id='{$chapter}' AND dict_value LIKE '%{$hw}%' LIMIT 1"; $result = usePreparedSelectBlade($query); $array = $result->fetchAll(PDO::FETCH_ASSOC); if ($array) { return $array[0]['dict_key']; } else { $dbxlink->exec("INSERT INTO Dictionary (chapter_id,dict_value) VALUES ('{$chapter}','{$hw}')"); $squery = "select dict_key from Dictionary where dict_value ='{$hw}' AND chapter_ID ='{$chapter}' LIMIT 1"; $sresult = usePreparedSelectBlade($squery); $sarray = $sresult->fetchAll(PDO::FETCH_ASSOC); if ($sarray) { return $sarray[0]['dict_key']; } else { // If it still has not returned, we are up shit creek. return 0; } } $dbxlink = null; } catch (PDOException $e) { echo $e->getMessage(); } }
function sg_checkObjectNameUniqueness($name, $type_id, $object_id = 0) { // Some object types do not need unique names // 1560 - Rack // 1561 - Row $dupes_allowed = array(1560, 1561); if (in_array($type_id, $dupes_allowed)) { return; } $result = usePreparedSelectBlade('SELECT COUNT(*) FROM Object WHERE name = ? AND id != ?', array($name, $object_id)); $row = $result->fetch(PDO::FETCH_NUM); if ($row[0] != 0) { return false; } else { return true; } }
function triggerIPAddressLog() { $ip_bin = assertIPArg('ip'); switch (strlen($ip_bin)) { case 4: $result = usePreparedSelectBlade("SELECT COUNT(id) FROM IPv4Log WHERE ip = ?", array(ip4_bin2db($ip_bin))); break; case 16: $result = usePreparedSelectBlade("SELECT COUNT(id) FROM IPv6Log WHERE ip = ?", array($ip_bin)); break; } if ($row = $result->fetch(PDO::FETCH_NUM)) { if ($row[0] > 0) { return 'std'; } } return ''; }
function addSLBIPLink($link_row) { global $dbxlink; $do_transaction = !isTransactionActive(); if ($do_transaction) { $dbxlink->beginTransaction(); } // lock on vip $result = usePreparedSelectBlade("SELECT * FROM VSIPs WHERE vip = ? FOR UPDATE", array($link_row['vip'])); unset($result); $ret = usePreparedInsertBlade('VSEnabledIPs', $link_row); $result = usePreparedSelectBlade("SELECT proto, vport FROM VSEnabledPorts vep INNER JOIN VSEnabledIPs vei USING (vs_id, object_id, rspool_id) WHERE vei.object_id = ? AND vip = ? HAVING COUNT(distinct proto,vport) != COUNT(vport)", array($link_row['object_id'], $link_row['vip'])); if ($row = $result->fetch(PDO::FETCH_ASSOC, 0)) { unset($result); if ($do_transaction) { $dbxlink->rollBack(); } throw new RTDatabaseError(sprintf("Duplicate link of %s [%s]:%s to object #%d", $row['proto'], ip_format($link_row['vip']), $row['vport'], $link_row['object_id'])); } if ($do_transaction) { $dbxlink->commit(); } return $ret; }
function addVmToParent($vms, $newmachine) { $search_for_child = "select id from RackObject WHERE name REGEXP '^ *{$vms}\\\\.'"; unset($result); $result = usePreparedSelectBlade($search_for_child); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); $child = $resultarray[0]['id']; if (!empty($child)) { //make sure the association doesn't exist already or deal with it $current_container = "SELECT parent_entity_id from EntityLink WHERE child_entity_id = {$child}"; unset($result); $result = usePreparedSelectBlade($current_container); $resultarray = $result->fetchAll(PDO::FETCH_ASSOC); $current_parent = $resultarray[0]['parent_entity_id']; if ($current_parent != $newmachine && !empty($current_parent)) { commitUpdateEntityLink('object', $current_parent, 'object', $child, 'object', $newmachine, 'object', $child); } else { if (empty($current_parent)) { commitLinkEntities('object', $newmachine, 'object', $child); } } } else { echo "WARNING: The {$vms} VM does not exist for this Parent \n"; } }