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>';
}
Example #2
0
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);
 }
Example #4
0
/** 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;
}
Example #6
0
 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);
}
Example #10
0
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;
}
Example #11
0
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;
}
Example #13
0
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");
    }
}
Example #15
0
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>&nbsp;</th>";
    $display .= "<th class=tdleft></br>Saved Configurations</th>";
    //$display .= "<th class=tdleft>Comment</th>";
    $display .= "<th>&nbsp;</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} &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Comments:&nbsp&nbsp{$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;
}
Example #16
0
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");
    }
}
Example #17
0
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);
}
Example #18
0
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));
}
Example #20
0
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));
}
Example #21
0
    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;
    }
Example #22
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>&nbsp</td><td>&nbsp</td></tr>\n";
                    }
                }
            }
        }
        echo "</table>";
    }
    echo "<table class=rack align=center border=0 cellspacing=0 cellpadding=1>\n";
    echo "<tr><th width='10%'>&nbsp;</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">&nbsp;</div>';
                    break;
                case 'F':
                    echo '<div title="Free rackspace">&nbsp;</div>';
                    break;
                case 'U':
                    echo '<div title="Problematic rackspace, you CAN\'T mount here">&nbsp;</div>';
                    break;
                default:
                    echo '<div title="No data">&nbsp;</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;
    }
}
Example #25
0
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 '';
}
Example #26
0
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;
}
Example #27
0
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";
    }
}