|
<?php defined('SYSPATH') or die('No direct script access.');
|
|
/*
|
|
* This file is part of open source system FreenetIS
|
|
* and it is release under GPLv3 licence.
|
|
*
|
|
* More info about licence can be found:
|
|
* http://www.gnu.org/licenses/gpl-3.0.html
|
|
*
|
|
* More info about project can be found:
|
|
* http://www.freenetis.org/
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* VLAN is a virtual independent network that contains a collection of virtual
|
|
* interfaces.
|
|
*
|
|
* @package Model
|
|
*
|
|
* @property integer $id
|
|
* @property string $name
|
|
* @property integer $tag_802_1q
|
|
* @property string $comment
|
|
* @property ORM_Iterator $ifaces_vlans
|
|
*/
|
|
class Vlan_Model extends ORM
|
|
{
|
|
/**
|
|
* Const for default VLAN
|
|
*/
|
|
const DEFAULT_VLAN_TAG = 1;
|
|
|
|
// relationship
|
|
protected $has_many = array('ifaces_vlan');
|
|
|
|
/**
|
|
* Returns default VLAN
|
|
*
|
|
* @author Michal Kliment
|
|
* @return Vlan_Model object
|
|
*/
|
|
public function get_default_vlan()
|
|
{
|
|
return $this->where('tag_802_1q', self::DEFAULT_VLAN_TAG)->find();
|
|
}
|
|
|
|
/**
|
|
* Get count of vlans
|
|
*
|
|
* @return integer
|
|
*/
|
|
public function count_all_vlans()
|
|
{
|
|
return $this->db->count_records('vlans');
|
|
}
|
|
|
|
/**
|
|
* Gets all VLANs
|
|
*
|
|
* @param integer $limit_from
|
|
* @param integer $limit_results
|
|
* @param string $order_by
|
|
* @param integer $order_by_direction
|
|
* @return Mysql_Result
|
|
*/
|
|
public function get_all_vlans(
|
|
$limit_from = 0, $limit_results = 50,
|
|
$order_by = 'tag_802_1q', $order_by_direction = 'ASC')
|
|
{
|
|
// order by direction check
|
|
$order_by_direction = strtolower($order_by_direction);
|
|
|
|
if ($order_by_direction != 'desc')
|
|
{
|
|
$order_by_direction = 'asc';
|
|
}
|
|
|
|
// query
|
|
return $this->db->query("
|
|
SELECT v.*, COUNT(DISTINCT d.id) AS devices_count,
|
|
GROUP_CONCAT(DISTINCT d.name SEPARATOR ', \n') AS devices
|
|
FROM vlans v
|
|
LEFT JOIN ifaces_vlans iv ON iv.vlan_id = v.id
|
|
LEFT JOIN ifaces i ON iv.iface_id = i.id
|
|
LEFT JOIN devices d ON i.device_id = d.id
|
|
GROUP BY v.id
|
|
ORDER BY $order_by $order_by_direction
|
|
LIMIT " . intval($limit_from) . ", " . intval($limit_results) ."
|
|
");
|
|
}
|
|
|
|
/**
|
|
* Override default ORM function select_list due to
|
|
* need of ordering by another column than are key and value
|
|
*
|
|
* @author Michal Kliment, Ondrej Fibich
|
|
* @return array
|
|
*/
|
|
public function select_list($key = 'id', $val = NULL, $order_val = 'tag_802_1q')
|
|
{
|
|
if (empty($val))
|
|
{
|
|
$val = 'CONCAT(COALESCE(tag_802_1q, ""), " - ", COALESCE(name, ""))';
|
|
}
|
|
|
|
return parent::select_list($key, $val, $order_val);
|
|
}
|
|
|
|
/**
|
|
* Returns all devices which belong to VLAN
|
|
*
|
|
* @param integer $vlan_id
|
|
* @return Mysql_Result
|
|
*/
|
|
public function get_devices_of_vlan($vlan_id = NULL)
|
|
{
|
|
if (!$vlan_id && isset($this))
|
|
{
|
|
$vlan_id = $this->id;
|
|
}
|
|
|
|
return $this->db->query("
|
|
SELECT d.id, d.name, IFNULL(p.ports_count, 0) AS ports_count,
|
|
p.ports, ip.ip_address AS ip_address, ip.id AS ip_address_id
|
|
FROM devices d
|
|
LEFT JOIN ifaces i ON i.device_id = d.id
|
|
LEFT JOIN ifaces_vlans iv ON iv.iface_id = i.id
|
|
LEFT JOIN
|
|
(
|
|
SELECT COUNT(*) AS ports_count, i.device_id, GROUP_CONCAT(
|
|
IF(i.number IS NOT NULL, CONCAT(?, i.number), i.name)
|
|
ORDER BY i.number SEPARATOR ', \n'
|
|
) AS ports
|
|
FROM ifaces i
|
|
JOIN ifaces_vlans iv2 ON iv2.iface_id = i.id
|
|
WHERE i.type = ? AND iv2.vlan_id = ?
|
|
GROUP BY i.device_id
|
|
) p ON p.device_id = d.id
|
|
LEFT JOIN
|
|
(
|
|
SELECT ip.id, ip.ip_address, i.device_id
|
|
FROM ip_addresses ip
|
|
LEFT JOIN ifaces i ON ip.iface_id = i.id
|
|
) ip ON ip.device_id = d.id
|
|
WHERE iv.vlan_id = ?
|
|
GROUP BY d.id
|
|
ORDER BY INET_ATON(ip.ip_address)
|
|
", array( __('Port') . ' ', Iface_Model::TYPE_PORT, $vlan_id, $vlan_id));
|
|
}
|
|
|
|
/**
|
|
* Gets all VLANs of interface
|
|
*
|
|
* @param integer $iface_id
|
|
* @return Mysql_Result
|
|
*/
|
|
public function get_all_vlans_of_iface($iface_id = null)
|
|
{
|
|
// query
|
|
return $this->db->query("
|
|
SELECT v.name, v.tag_802_1q, iv.tagged, iv.port_vlan, iv.vlan_id
|
|
FROM vlans v
|
|
LEFT JOIN ifaces_vlans iv ON iv.vlan_id = v.id
|
|
WHERE iv.iface_id = ?
|
|
GROUP BY v.id
|
|
ORDER BY v.tag_802_1q
|
|
", $iface_id);
|
|
}
|
|
|
|
/**
|
|
* Gets default VLAN of iface
|
|
*
|
|
* @param integer $iface_id
|
|
* @return Mysql_Result
|
|
*/
|
|
public function get_default_vlan_of_interface($iface_id = null)
|
|
{
|
|
// query
|
|
$result = $this->db->query("
|
|
SELECT v.name, v.id
|
|
FROM vlans v
|
|
LEFT JOIN ifaces_vlans iv ON iv.vlan_id = v.id
|
|
WHERE iv.iface_id = ?
|
|
AND iv.port_vlan = 1
|
|
GROUP BY v.id
|
|
", $iface_id);
|
|
|
|
if ($result)
|
|
return $result->current();
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
}
|