Revize 18ac9009
Přidáno uživatelem Ondřej Fibich před asi 9 roky(ů)
application/models/link.php | ||
---|---|---|
<?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/
|
||
*
|
||
*/
|
||
|
||
/**
|
||
* Link is providing connection between two interfaces. Type is given by
|
||
* medium (e.g. wifi, cable). Link may be specified by attributed such as
|
||
* bitrate, duplex, GPS line, etc. Moreover ink of wifi type may be also
|
||
* specified by several other attributes (norm, frequency, channel, ssid, etc.).
|
||
*
|
||
* @package Model
|
||
*
|
||
* @property integer $id
|
||
* @property string $name
|
||
* @property integer $medium
|
||
* @property integer $bitrate
|
||
* @property integer $duplex
|
||
* @property string $comment
|
||
* @property blob $gps
|
||
* @property string $wireless_ssid
|
||
* @property integer $wireless_norm
|
||
* @property integer $wireless_frequency
|
||
* @property integer $wireless_channel
|
||
* @property integer $wireless_channel_width
|
||
* @property integer $wireless_polarization
|
||
* @property ORM_Iterator $ifaces
|
||
*/
|
||
class Link_Model extends ORM
|
||
{
|
||
protected $has_many = array('ifaces');
|
||
|
||
// mediums
|
||
const MEDIUM_ROAMING = 1;
|
||
const MEDIUM_AIR = 2;
|
||
const MEDIUM_CABLE = 3;
|
||
const MEDIUM_SINGLE_FIBER = 4;
|
||
const MEDIUM_MULTI_FIBER = 5;
|
||
|
||
// constants of norms
|
||
const NORM_802_11_A = 1;
|
||
const NORM_802_11_B = 2;
|
||
const NORM_802_11_G = 3;
|
||
const NORM_802_11_N = 4;
|
||
const NORM_802_11_B_G = 5;
|
||
|
||
// constants of polarizations
|
||
const POLARIZATION_HORIZONTAL = 1;
|
||
const POLARIZATION_VERTICAL = 2;
|
||
const POLARIZATION_CIRCULAR = 3;
|
||
const POLARIZATION_BOTH = 4;
|
||
const POLARIZATION_HORIZONTAL_VERTICAL = 5;
|
||
|
||
/**
|
||
* Array of norms, keys of array are equal to constants of norms
|
||
*
|
||
* @var array
|
||
*/
|
||
private static $wireless_norms = array
|
||
(
|
||
self::NORM_802_11_A => '802.11a',
|
||
self::NORM_802_11_B => '802.11b',
|
||
self::NORM_802_11_G => '802.11g',
|
||
self::NORM_802_11_N => '802.11n',
|
||
self::NORM_802_11_B_G => '802.11b/g'
|
||
);
|
||
|
||
/**
|
||
* Array of polarizations, keys of array are equal to constants of polarizations
|
||
*
|
||
* @var array
|
||
*/
|
||
private static $wireless_polarizations = array
|
||
(
|
||
self::POLARIZATION_HORIZONTAL => 'horizontal',
|
||
self::POLARIZATION_VERTICAL => 'vertical',
|
||
self::POLARIZATION_CIRCULAR => 'circular',
|
||
self::POLARIZATION_BOTH => 'both',
|
||
self::POLARIZATION_HORIZONTAL_VERTICAL => 'horizontal and vertical'
|
||
);
|
||
|
||
/**
|
||
* Array of max bitrates
|
||
*
|
||
* @var array
|
||
*/
|
||
private static $wireless_max_bitrates = array
|
||
(
|
||
self::NORM_802_11_A => 54,
|
||
self::NORM_802_11_B => 11,
|
||
self::NORM_802_11_G => 54,
|
||
self::NORM_802_11_N => 600,
|
||
self::NORM_802_11_B_G => 54
|
||
);
|
||
|
||
/**
|
||
* Medium types
|
||
*
|
||
* @var array
|
||
*/
|
||
private static $medium_types = array
|
||
(
|
||
self::MEDIUM_ROAMING => 'roaming',
|
||
self::MEDIUM_AIR => 'air',
|
||
self::MEDIUM_CABLE => 'cable',
|
||
self::MEDIUM_SINGLE_FIBER => 'fiber optical single-mode',
|
||
self::MEDIUM_MULTI_FIBER => 'fiber optical multi-mode'
|
||
);
|
||
|
||
/**
|
||
* Max allowed interfaces in link by type
|
||
*
|
||
* @var array
|
||
*/
|
||
private static $ifaces_count = array
|
||
(
|
||
Iface_Model::TYPE_WIRELESS => PHP_INT_MAX,
|
||
Iface_Model::TYPE_ETHERNET => 2,
|
||
Iface_Model::TYPE_PORT => 2,
|
||
Iface_Model::TYPE_INTERNAL => 0,
|
||
Iface_Model::TYPE_VLAN => 0,
|
||
Iface_Model::TYPE_BRIDGE => 0,
|
||
Iface_Model::TYPE_VIRTUAL_AP => PHP_INT_MAX
|
||
);
|
||
|
||
/**
|
||
* Returns norm name by given norm id
|
||
*
|
||
* @author Michal Kliment
|
||
* @param integer $norm
|
||
* @return string
|
||
*/
|
||
public static function get_wireless_norm ($norm)
|
||
{
|
||
if (array_key_exists($norm, self::$wireless_norms))
|
||
{
|
||
return self::$wireless_norms[$norm];
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
/**
|
||
* Returns all norm names
|
||
*
|
||
* @author Michal Kliment
|
||
* @return array
|
||
*/
|
||
public static function get_wireless_norms ()
|
||
{
|
||
return self::$wireless_norms;
|
||
}
|
||
|
||
/**
|
||
* Returns polarization name by given polarization id
|
||
*
|
||
* @author Michal Kliment
|
||
* @param integer $polarization
|
||
* @return string
|
||
*/
|
||
public static function get_wireless_polarization ($polarization)
|
||
{
|
||
if (array_key_exists($polarization, self::$wireless_polarizations))
|
||
{
|
||
return __(self::$wireless_polarizations[$polarization]);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
/**
|
||
* Returns all polarization names
|
||
*
|
||
* @author Michal Kliment
|
||
* @return array
|
||
*/
|
||
public static function get_wireless_polarizations()
|
||
{
|
||
return array_map('__', self::$wireless_polarizations);
|
||
}
|
||
|
||
/**
|
||
* Returns max bitrate of norm
|
||
*
|
||
* @author Michal Kliment
|
||
* @param integer $norm
|
||
* @return integer
|
||
*/
|
||
public static function get_wireless_max_bitrate($norm = NULL)
|
||
{
|
||
if (array_key_exists($norm, self::$wireless_max_bitrates))
|
||
{
|
||
return self::$wireless_max_bitrates[$norm];
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
/**
|
||
* Returns all max bitrates of norms
|
||
*
|
||
* @author Michal Kliment
|
||
* @param integer $norm
|
||
* @return integer
|
||
*/
|
||
public static function get_wireless_max_bitrates()
|
||
{
|
||
return self::$wireless_max_bitrates;
|
||
}
|
||
|
||
/**
|
||
* Returns medium type by medium type id
|
||
*
|
||
* @author Michal Kliment
|
||
* @param integer $type_id
|
||
* @return string
|
||
*/
|
||
public static function get_medium_type($medium_type_id)
|
||
{
|
||
if (isset(self::$medium_types[$medium_type_id]))
|
||
{
|
||
return __(self::$medium_types[$medium_type_id]);
|
||
}
|
||
else
|
||
{
|
||
return NULL;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Returns maximum number of interfaces in link
|
||
*
|
||
* @author David Raška
|
||
* @param integer $iface_type
|
||
* @return integer
|
||
*/
|
||
public static function get_max_ifaces_count ($iface_type)
|
||
{
|
||
if (array_key_exists($iface_type, self::$ifaces_count))
|
||
{
|
||
return self::$ifaces_count[$iface_type];
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
/**
|
||
* Returns medium types
|
||
*
|
||
* @author Michal Kliment
|
||
* @return array
|
||
*/
|
||
public static function get_medium_types()
|
||
{
|
||
return array_map('__', self::$medium_types);
|
||
}
|
||
|
||
/**
|
||
* Counts all links
|
||
*
|
||
* @param array $filter_sql
|
||
* @return integer
|
||
*/
|
||
public function count_all_links($filter_sql = '')
|
||
{
|
||
$where = '';
|
||
|
||
// filter
|
||
if ($filter_sql != '')
|
||
$where = "WHERE $filter_sql";
|
||
|
||
// query
|
||
return $this->db->query("
|
||
SELECT COUNT(*) AS total
|
||
FROM
|
||
(
|
||
SELECT s.id, s.name, s.medium, s.duplex, s.comment, s.bitrate,
|
||
IFNULL(s.wireless_ssid,'') AS ssid, s.wireless_norm,
|
||
(SELECT COUNT(*) FROM ifaces WHERE link_id = s.id) as items_count
|
||
FROM links s
|
||
) s
|
||
$where
|
||
", Config::get('lang'))->current()->total;
|
||
}
|
||
|
||
/**
|
||
* Gets all linkss
|
||
*
|
||
* @param integer $limit_from
|
||
* @param integer $limit_results
|
||
* @param string $order_by
|
||
* @param string $order_by_direction
|
||
* @param array $filter_values
|
||
* @return Mysql_Result
|
||
*/
|
||
public function get_all_links(
|
||
$limit_from = 0, $limit_results = 20,
|
||
$order_by = 'id', $order_by_direction = 'asc',
|
||
$filter_sql = '')
|
||
{
|
||
$where = '';
|
||
|
||
if ($filter_sql != '')
|
||
$where = "WHERE $filter_sql";
|
||
|
||
// query
|
||
return $this->db->query("
|
||
SELECT * FROM
|
||
(
|
||
SELECT s.id, s.name, s.medium, s.duplex, s.comment, s.bitrate,
|
||
IFNULL(s.wireless_ssid,'') AS ssid, s.wireless_norm,
|
||
(SELECT COUNT(*) FROM ifaces WHERE link_id = s.id) as items_count
|
||
FROM links s
|
||
) s
|
||
$where
|
||
ORDER BY " . $this->db->escape_column($order_by) . " $order_by_direction
|
||
LIMIT " .intval($limit_from) . ", " . intval($limit_results) . "
|
||
", Config::get('lang'));
|
||
}
|
||
|
||
/**
|
||
* Returns roaming link. This function changes current object values.
|
||
*
|
||
* @author Michal Kliment
|
||
* @return integer
|
||
*/
|
||
public function get_roaming()
|
||
{
|
||
$roaming = $this->where('medium', self::MEDIUM_ROAMING)->find();
|
||
return ($roaming && $roaming->id) ? $roaming->id : NULL;
|
||
}
|
||
|
||
/**
|
||
* Returns all items (interfaces) which belong to given link
|
||
*
|
||
* @author Michal Kliment
|
||
* @param integer $link_id
|
||
* @return Mysql_Result
|
||
*/
|
||
public function get_items($link_id = NULL)
|
||
{
|
||
if (!$link_id)
|
||
{
|
||
$link_id = $this->id;
|
||
}
|
||
|
||
return $this->db->query("
|
||
SELECT i.*, d.name AS device_name, m.name AS member_name,
|
||
m.id AS member_id, i.wireless_mode
|
||
FROM ifaces i
|
||
JOIN devices d ON i.device_id = d.id
|
||
JOIN users u ON d.user_id = u.id
|
||
JOIN members m ON u.member_id = m.id
|
||
WHERE i.link_id = ?
|
||
ORDER BY i.wireless_mode ASC, i.name ASC, i.type ASC
|
||
", $link_id);
|
||
}
|
||
|
||
/**
|
||
* Returns all links according to given type of iface
|
||
*
|
||
* @author Ondřej Fibich
|
||
* @param integer $type
|
||
* @return array
|
||
*/
|
||
public function select_list_by_iface_type($type)
|
||
{
|
||
$mediums = Iface_Model::get_type_has_link_with_medium($type);
|
||
|
||
if (count($mediums))
|
||
{
|
||
return $this->in('medium', $mediums)->select_list('id', 'name');
|
||
}
|
||
else
|
||
{
|
||
return $this->select_list('id', 'name');
|
||
}
|
||
}
|
||
}
|
||
<?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/
|
||
*
|
||
*/
|
||
|
||
/**
|
||
* Link is providing connection between two interfaces. Type is given by
|
||
* medium (e.g. wifi, cable). Link may be specified by attributed such as
|
||
* bitrate, duplex, GPS line, etc. Moreover ink of wifi type may be also
|
||
* specified by several other attributes (norm, frequency, channel, ssid, etc.).
|
||
*
|
||
* @package Model
|
||
*
|
||
* @property integer $id
|
||
* @property string $name
|
||
* @property integer $medium
|
||
* @property integer $bitrate
|
||
* @property integer $duplex
|
||
* @property string $comment
|
||
* @property blob $gps
|
||
* @property string $wireless_ssid
|
||
* @property integer $wireless_norm
|
||
* @property integer $wireless_frequency
|
||
* @property integer $wireless_channel
|
||
* @property integer $wireless_channel_width
|
||
* @property integer $wireless_polarization
|
||
* @property ORM_Iterator $ifaces
|
||
*/
|
||
class Link_Model extends ORM
|
||
{
|
||
protected $has_many = array('ifaces');
|
||
|
||
// mediums
|
||
const MEDIUM_ROAMING = 1;
|
||
const MEDIUM_AIR = 2;
|
||
const MEDIUM_CABLE = 3;
|
||
const MEDIUM_SINGLE_FIBER = 4;
|
||
const MEDIUM_MULTI_FIBER = 5;
|
||
|
||
// constants of norms
|
||
const NORM_802_11_A = 1;
|
||
const NORM_802_11_B = 2;
|
||
const NORM_802_11_G = 3;
|
||
const NORM_802_11_N = 4;
|
||
const NORM_802_11_B_G = 5;
|
||
|
||
// constants of polarizations
|
||
const POLARIZATION_HORIZONTAL = 1;
|
||
const POLARIZATION_VERTICAL = 2;
|
||
const POLARIZATION_CIRCULAR = 3;
|
||
const POLARIZATION_BOTH = 4;
|
||
const POLARIZATION_HORIZONTAL_VERTICAL = 5;
|
||
|
||
/**
|
||
* Array of norms, keys of array are equal to constants of norms
|
||
*
|
||
* @var array
|
||
*/
|
||
private static $wireless_norms = array
|
||
(
|
||
self::NORM_802_11_A => '802.11a',
|
||
self::NORM_802_11_B => '802.11b',
|
||
self::NORM_802_11_G => '802.11g',
|
||
self::NORM_802_11_N => '802.11n',
|
||
self::NORM_802_11_B_G => '802.11b/g'
|
||
);
|
||
|
||
/**
|
||
* Array of polarizations, keys of array are equal to constants of polarizations
|
||
*
|
||
* @var array
|
||
*/
|
||
private static $wireless_polarizations = array
|
||
(
|
||
self::POLARIZATION_HORIZONTAL => 'horizontal',
|
||
self::POLARIZATION_VERTICAL => 'vertical',
|
||
self::POLARIZATION_CIRCULAR => 'circular',
|
||
self::POLARIZATION_BOTH => 'both',
|
||
self::POLARIZATION_HORIZONTAL_VERTICAL => 'horizontal and vertical'
|
||
);
|
||
|
||
/**
|
||
* Array of max bitrates
|
||
*
|
||
* @var array
|
||
*/
|
||
private static $wireless_max_bitrates = array
|
||
(
|
||
self::NORM_802_11_A => 54,
|
||
self::NORM_802_11_B => 11,
|
||
self::NORM_802_11_G => 54,
|
||
self::NORM_802_11_N => 600,
|
||
self::NORM_802_11_B_G => 54
|
||
);
|
||
|
||
/**
|
||
* Medium types
|
||
*
|
||
* @var array
|
||
*/
|
||
private static $medium_types = array
|
||
(
|
||
self::MEDIUM_ROAMING => 'roaming',
|
||
self::MEDIUM_AIR => 'air',
|
||
self::MEDIUM_CABLE => 'cable',
|
||
self::MEDIUM_SINGLE_FIBER => 'fiber optical single-mode',
|
||
self::MEDIUM_MULTI_FIBER => 'fiber optical multi-mode'
|
||
);
|
||
|
||
/**
|
||
* Max allowed interfaces in link by type
|
||
*
|
||
* @var array
|
||
*/
|
||
private static $ifaces_count = array
|
||
(
|
||
Iface_Model::TYPE_WIRELESS => PHP_INT_MAX,
|
||
Iface_Model::TYPE_ETHERNET => 2,
|
||
Iface_Model::TYPE_PORT => 2,
|
||
Iface_Model::TYPE_INTERNAL => 0,
|
||
Iface_Model::TYPE_VLAN => 0,
|
||
Iface_Model::TYPE_BRIDGE => 0,
|
||
Iface_Model::TYPE_VIRTUAL_AP => PHP_INT_MAX
|
||
);
|
||
|
||
/**
|
||
* Returns norm name by given norm id
|
||
*
|
||
* @author Michal Kliment
|
||
* @param integer $norm
|
||
* @return string
|
||
*/
|
||
public static function get_wireless_norm ($norm)
|
||
{
|
||
if (array_key_exists($norm, self::$wireless_norms))
|
||
{
|
||
return self::$wireless_norms[$norm];
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
/**
|
||
* Returns all norm names
|
||
*
|
||
* @author Michal Kliment
|
||
* @return array
|
||
*/
|
||
public static function get_wireless_norms ()
|
||
{
|
||
return self::$wireless_norms;
|
||
}
|
||
|
||
/**
|
||
* Returns polarization name by given polarization id
|
||
*
|
||
* @author Michal Kliment
|
||
* @param integer $polarization
|
||
* @return string
|
||
*/
|
||
public static function get_wireless_polarization ($polarization)
|
||
{
|
||
if (array_key_exists($polarization, self::$wireless_polarizations))
|
||
{
|
||
return __(self::$wireless_polarizations[$polarization]);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
/**
|
||
* Returns all polarization names
|
||
*
|
||
* @author Michal Kliment
|
||
* @return array
|
||
*/
|
||
public static function get_wireless_polarizations()
|
||
{
|
||
return array_map('__', self::$wireless_polarizations);
|
||
}
|
||
|
||
/**
|
||
* Returns max bitrate of norm
|
||
*
|
||
* @author Michal Kliment
|
||
* @param integer $norm
|
||
* @return integer
|
||
*/
|
||
public static function get_wireless_max_bitrate($norm = NULL)
|
||
{
|
||
if (array_key_exists($norm, self::$wireless_max_bitrates))
|
||
{
|
||
return self::$wireless_max_bitrates[$norm];
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
/**
|
||
* Returns all max bitrates of norms
|
||
*
|
||
* @author Michal Kliment
|
||
* @param integer $norm
|
||
* @return integer
|
||
*/
|
||
public static function get_wireless_max_bitrates()
|
||
{
|
||
return self::$wireless_max_bitrates;
|
||
}
|
||
|
||
/**
|
||
* Returns medium type by medium type id
|
||
*
|
||
* @author Michal Kliment
|
||
* @param integer $type_id
|
||
* @return string
|
||
*/
|
||
public static function get_medium_type($medium_type_id)
|
||
{
|
||
if (isset(self::$medium_types[$medium_type_id]))
|
||
{
|
||
return __(self::$medium_types[$medium_type_id]);
|
||
}
|
||
else
|
||
{
|
||
return NULL;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Returns maximum number of interfaces in link
|
||
*
|
||
* @author David Raška
|
||
* @param integer $iface_type
|
||
* @return integer
|
||
*/
|
||
public static function get_max_ifaces_count ($iface_type)
|
||
{
|
||
if (array_key_exists($iface_type, self::$ifaces_count))
|
||
{
|
||
return self::$ifaces_count[$iface_type];
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
/**
|
||
* Returns medium types
|
||
*
|
||
* @author Michal Kliment
|
||
* @return array
|
||
*/
|
||
public static function get_medium_types()
|
||
{
|
||
return array_map('__', self::$medium_types);
|
||
}
|
||
|
||
/**
|
||
* Counts all links
|
||
*
|
||
* @param array $filter_sql
|
||
* @return integer
|
||
*/
|
||
public function count_all_links($filter_sql = '')
|
||
{
|
||
$where = '';
|
||
|
||
// filter
|
||
if ($filter_sql != '')
|
||
$where = "WHERE $filter_sql";
|
||
|
||
// query
|
||
return $this->db->query("
|
||
SELECT COUNT(*) AS total
|
||
FROM
|
||
(
|
||
SELECT s.id, s.name, s.medium, s.duplex, s.comment, s.bitrate,
|
||
IFNULL(s.wireless_ssid,'') AS ssid, s.wireless_norm,
|
||
(SELECT COUNT(*) FROM ifaces WHERE link_id = s.id) as items_count
|
||
FROM links s
|
||
) s
|
||
$where
|
||
", Config::get('lang'))->current()->total;
|
||
}
|
||
|
||
/**
|
||
* Gets all linkss
|
||
*
|
||
* @param integer $limit_from
|
||
* @param integer $limit_results
|
||
* @param string $order_by
|
||
* @param string $order_by_direction
|
||
* @param array $filter_values
|
||
* @return Mysql_Result
|
||
*/
|
||
public function get_all_links(
|
||
$limit_from = 0, $limit_results = 20,
|
||
$order_by = 'id', $order_by_direction = 'asc',
|
||
$filter_sql = '')
|
||
{
|
||
$where = '';
|
||
|
||
if ($filter_sql != '')
|
||
$where = "WHERE $filter_sql";
|
||
|
||
// query
|
||
return $this->db->query("
|
||
SELECT * FROM
|
||
(
|
||
SELECT s.id, s.name, s.medium, s.duplex, s.comment, s.bitrate,
|
||
IFNULL(s.wireless_ssid,'') AS ssid, s.wireless_norm,
|
||
(SELECT COUNT(*) FROM ifaces WHERE link_id = s.id) as items_count
|
||
FROM links s
|
||
) s
|
||
$where
|
||
ORDER BY " . $this->db->escape_column($order_by) . " $order_by_direction
|
||
LIMIT " .intval($limit_from) . ", " . intval($limit_results) . "
|
||
", Config::get('lang'));
|
||
}
|
||
|
||
/**
|
||
* Returns roaming link. This function changes current object values.
|
||
*
|
||
* @author Michal Kliment
|
||
* @return integer
|
||
*/
|
||
public function get_roaming()
|
||
{
|
||
$roaming = $this->where('medium', self::MEDIUM_ROAMING)->find();
|
||
return ($roaming && $roaming->id) ? $roaming->id : NULL;
|
||
}
|
||
|
||
/**
|
||
* Returns all items (interfaces) which belong to given link
|
||
*
|
||
* @author Michal Kliment
|
||
* @param integer $link_id
|
||
* @return Mysql_Result
|
||
*/
|
||
public function get_items($link_id = NULL)
|
||
{
|
||
if (!$link_id)
|
||
{
|
||
$link_id = $this->id;
|
||
}
|
||
|
||
return $this->db->query("
|
||
SELECT i.*, d.name AS device_name, m.name AS member_name,
|
||
m.id AS member_id, i.wireless_mode
|
||
FROM ifaces i
|
||
JOIN devices d ON i.device_id = d.id
|
||
JOIN users u ON d.user_id = u.id
|
||
JOIN members m ON u.member_id = m.id
|
||
WHERE i.link_id = ?
|
||
ORDER BY i.wireless_mode ASC, i.name ASC, i.type ASC
|
||
", $link_id);
|
||
}
|
||
|
||
/**
|
||
* Returns all links according to given type of iface
|
||
*
|
||
* @author Ondřej Fibich
|
||
* @param integer $type
|
||
* @return array
|
||
*/
|
||
public function select_list_by_iface_type($type)
|
||
{
|
||
$mediums = Iface_Model::get_type_has_link_with_medium($type);
|
||
|
||
if (count($mediums))
|
||
{
|
||
return $this->in('medium', $mediums)->select_list('id', 'name');
|
||
}
|
||
else
|
||
{
|
||
return $this->select_list('id', 'name');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Gets all subnets that are used on given link/links or this link.
|
||
*
|
||
* @author Ondřej Fibich <ondrej.fibich@gmail.com>
|
||
* @since 1.2
|
||
* @param integer|array $link_id link ID, nothing for this link or array
|
||
* of link IDs [optional]
|
||
* @return Mysql_Result
|
||
*/
|
||
public function get_subnets_on_link($link_id = NULL)
|
||
{
|
||
if ($link_id === NULL && isset($this))
|
||
{
|
||
$link_id = $this->id;
|
||
}
|
||
|
||
if (empty($link_id))
|
||
{
|
||
$link_id = array(0);
|
||
}
|
||
else if (!is_array($link_id))
|
||
{
|
||
$link_id = array($link_id);
|
||
}
|
||
|
||
$links = implode(',', array_map('intval', $link_id));
|
||
|
||
// We must search for subnet in all interfaces that has given link_id
|
||
// which covers all ethernet, wireless, port and internal interfaces.
|
||
// For VLAN, Virtual WLAN and bridge interfaces we must also search in
|
||
// ifaces_relationships (for bridge in reverse order).
|
||
return $this->db->query("
|
||
SELECT s.*, INET_ATON(s.network_address) AS cidr,
|
||
CONCAT(s.network_address, '/',
|
||
32-log2((~inet_aton(s.netmask) & 0xffffffff) + 1)) AS cidr_address
|
||
FROM (
|
||
(
|
||
SELECT i.* FROM ifaces i
|
||
WHERE i.link_id IN (" . $links . ")
|
||
) UNION (
|
||
SELECT child_i.*
|
||
FROM ifaces_relationships ir
|
||
JOIN ifaces child_i ON ir.iface_id = child_i.id
|
||
JOIN ifaces parent_i ON ir.parent_iface_id = parent_i.id
|
||
WHERE child_i.type IN (?, ?) AND
|
||
parent_i.link_id IN (" . $links . ")
|
||
) UNION (
|
||
SELECT i_bridged.*
|
||
FROM ifaces_relationships ir
|
||
JOIN ifaces i_parent ON i_parent.id = ir.parent_iface_id
|
||
JOIN ifaces i_bridged ON i_bridged.id = ir.iface_id
|
||
WHERE i_parent.type = ? AND i_parent.id IN (
|
||
SELECT parent_iface_id FROM ifaces i
|
||
JOIN ifaces_relationships ir ON ir.iface_id = i.id
|
||
WHERE i.link_id IN (" . $links . ")
|
||
)
|
||
)
|
||
) AS i
|
||
JOIN ip_addresses ip ON ip.iface_id = i.id
|
||
JOIN subnets s ON ip.subnet_id = s.id
|
||
GROUP BY s.id
|
||
ORDER BY INET_ATON(s.network_address)
|
||
", Iface_Model::TYPE_VLAN, Iface_Model::TYPE_VIRTUAL_AP,
|
||
Iface_Model::TYPE_BRIDGE);
|
||
}
|
||
|
||
/**
|
||
* Gets all VLANs that are used on given link/links or this link.
|
||
*
|
||
* @author Ondřej Fibich <ondrej.fibich@gmail.com>
|
||
* @since 1.2
|
||
* @param integer|array $link_id link ID, nothing for this link or array
|
||
* of link IDs [optional]
|
||
* @return Mysql_Result
|
||
*/
|
||
public function get_vlans_on_link($link_id = NULL)
|
||
{
|
||
if ($link_id === NULL && isset($this))
|
||
{
|
||
$link_id = $this->id;
|
||
}
|
||
|
||
if (empty($link_id))
|
||
{
|
||
$link_id = array(0);
|
||
}
|
||
else if (!is_array($link_id))
|
||
{
|
||
$link_id = array($link_id);
|
||
}
|
||
|
||
$links = implode(',', array_map('intval', $link_id));
|
||
|
||
return $this->db->query("
|
||
SELECT v.*
|
||
FROM ifaces i
|
||
JOIN ifaces_vlans iv ON iv.iface_id = i.id
|
||
JOIN vlans v ON v.id = iv.vlan_id
|
||
WHERE i.link_id IN (" . $links . ")
|
||
");
|
||
}
|
||
|
||
}
|
Také k dispozici: Unified diff
Fix merge issue that removed all staff from developer branch :-).