Projekt

Obecné

Profil

Stáhnout (7.05 KB) Statistiky
| Větev: | Tag: | Revize:
8baed187 Michal Kliment
<?php defined('SYSPATH') or die('No direct script access.');
/*
* This file is part of open source system FreenetIS
* and it is released 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/
*
*/

/**
* Network helper.
*
* @author Michal Kliment
* @package Helper
*/
class network
{
private static $sizes = array
(
'K' => 1024,
'M' => 1048576,
'G' => 1073741824,
'T' => 1099511627776
);

/**
* Converts netmask in classic format (eg. 255.255.255.0) to CIDR format (/24)
* @author Michal Kliment
* @param string
* @return string
*/
public static function netmask2cidr($netmask)
{
if (!preg_match("/^\d+\.\d+\.\d+\.\d+$/", $netmask))
{
return false;
}
return 32 - log((~ip2long($netmask) & 0xffffffff) + 1, 2);
}

/**
* Converts netmask in CIDR format (eg. 24) to classic format (255.255.255.0)
*
* @author Michal Kliment
* @param string $cidr
* @return string
*/
public static function cidr2netmask($cidr)
{
if (!preg_match("/^\d+$/", $cidr))
{
return false;
}
return long2ip(~(pow(2, 32 - $cidr) - 1) & 0xffffffff);
}

/**
* Formats size
*
* @author Michal Kliment
* @param integer $size
* @return string
*/
public static function size($size, $byte = TRUE)
{
// default unit is kilo
$unit = 'k';

// size is too big
if ($size >= 1024)
{
// transforms to Mega
$unit = 'M';
$size = round($size / 1024, 2);

// size is still too big
if ($size >= 1024)
{
// transforms to Giga
$unit = 'G';
$size = round($size / 1024, 2);
// size is still too big
if ($size >= 1024)
{
// transforms to Giga
$unit = 'T';
$size = round($size / 1024, 2);
}
}
}
$unit .= ($byte) ? 'B' : 'b';

return ($size) ? $size . ' ' . $unit : '0 ' . $unit;
}

c1bdc1c4 Michal Kliment
/**
* Formats speed
*
* @author Michal Kliment
* @param integer $speed In B/s
18ac9009 Ondřej Fibich
* @param integer $delimiter
c1bdc1c4 Michal Kliment
* @return string
*/
18ac9009 Ondřej Fibich
public static function speed($speed, $delimiter = 1024)
c1bdc1c4 Michal Kliment
{
// default unit is nothing
$unit = '';
18ac9009 Ondřej Fibich
if ($speed >= $delimiter)
c1bdc1c4 Michal Kliment
{
$unit = 'k';
18ac9009 Ondřej Fibich
$speed = round($speed / $delimiter, 2);
c1bdc1c4 Michal Kliment
// size is too big
18ac9009 Ondřej Fibich
if ($speed >= $delimiter)
c1bdc1c4 Michal Kliment
{
// transforms to Mega
$unit = 'M';
18ac9009 Ondřej Fibich
$speed = round($speed / $delimiter, 2);
c1bdc1c4 Michal Kliment
// size is still too big
18ac9009 Ondřej Fibich
if ($speed >= $delimiter)
c1bdc1c4 Michal Kliment
{
// transforms to Giga
$unit = 'G';
18ac9009 Ondřej Fibich
$speed = round($speed / $delimiter, 2);
c1bdc1c4 Michal Kliment
// size is still too big
18ac9009 Ondřej Fibich
if ($speed >= $delimiter)
c1bdc1c4 Michal Kliment
{
// transforms to Giga
$unit = 'T';
18ac9009 Ondřej Fibich
$speed = round($speed / $delimiter, 2);
c1bdc1c4 Michal Kliment
}
}
}
}

return ($speed) ? $speed . $unit : '0' . $unit;
}

8baed187 Michal Kliment
/**
* Checks whether ip address belongs to default address ranges
*
* @author Michal Kliment
* @param string $ip_address
* @return boolean
*/
public static function ip_address_in_ranges($ip_address)
{
// default address range is not set, return true
if (($ranges = Settings::get('address_ranges')) == '')
return true;

// transform ip to long
$ip_address = ip2long($ip_address);

// transform string to array
$ranges = explode(',', $ranges);

foreach ($ranges as $range_address)
{
18ac9009 Ondřej Fibich
if (self::ip_address_in_range($ip_address, $range_address))
8baed187 Michal Kliment
return true;
}
return false;
}
18ac9009 Ondřej Fibich
/**
* Checks whether IP address belongs to given address range
*
* @author Michal Kliment
* @param type $ip_address
* @param type $range_address
* @return boolean
*/
public static function ip_address_in_range($ip_address, $range_address)
{
// address contains / => it's in CIDR format
if (strpos($range_address, '/') !== FALSE)
// split address and mask
list ($range_address, $range_mask) = explode('/', $range_address);
// address is without / => it's single address
else
$range_mask = 32;
if (valid::ip($ip_address))
$ip_address = ip2long ($ip_address);

$net = ip2long($range_address);
$mask = ip2long(network::cidr2netmask($range_mask));

// success
if (($ip_address & $mask) == $net)
return true;
}
8baed187 Michal Kliment
/**
c1bdc1c4 Michal Kliment
* Converts speed string to integer (bytes)
8baed187 Michal Kliment
*
* @author Michal Kliment
* @param string $str
* @return integer
*/
public static function str2bytes ($str)
{
$unit = strtoupper(substr($str,-1));
$size = isset(self::$sizes[$unit]) ? self::$sizes[$unit] : 1;
return ((int) $str) * $size;
}
/**
* Converts speed string to array
*
* @param string $str
* @return array
*/
public static function str2array ($str)
{
$unit = strtoupper(substr($str,-1));
if (!isset(self::$sizes[$unit]))
$unit = "";
return array
(
'size' => (int) $str,
'unit' => $unit
);
}
/**
c1bdc1c4 Michal Kliment
* Converts integer (bytes) to speed string
8baed187 Michal Kliment
*
* @author Michal Kliment
* @param type $bytes
* @param type $unit
* @return type
*/
public static function bytes2str ($bytes, $unit = "")
{
$size = isset(self::$sizes[$unit]) ? self::$sizes[$unit] : 1;
return (ceil($bytes/$size*10)/10).$unit;
}
/**
* Tranfers bytes from unit do unit
*
* @author Michal Kliment
* @param type $size
* @param type $from_unit
* @param type $to_unit
* @return type
*/
public static function transfer_unit ($size, $from_unit, $to_unit)
{
$from_size = isset(self::$sizes[$from_unit]) ? self::$sizes[$from_unit] : 1;
$to_size = isset(self::$sizes[$to_unit]) ? self::$sizes[$to_unit] : 1;
return ceil($size*($from_size/$to_size*10))/10;
}
/**
* Parses speed string to array
*
* @author Michal Kliment
* @param type $str
* @param type $unit
* @return type
*/
public static function speed_size ($str, $unit = 'M')
{
if (!valid::speed_size($str))
return FALSE;
$pieces = explode("/", $str);
$upload_str = $pieces[0];
$download_str = $pieces[count($pieces)-1];
$upload = network::str2array($upload_str);
$download = network::str2array($download_str);
return array
(
'upload' => network::transfer_unit($upload['size'], $upload['unit'], $unit),
'download' => network::transfer_unit($download['size'], $download['unit'], $unit),
'unit' => $unit
);
}

18ac9009 Ondřej Fibich
/**
* Converts MAC address in binary format to classic format
*
* @author Michal Kliment
* @param string $str
* @return string|boolean
*/
public static function bin2mac ($str)
{
$str = bin2hex($str);
$regex = '/([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/';
$matches = array();
if (preg_match($regex, $str, $matches))
{
unset($matches[0]);
return implode(':', $matches);
}
else
{
return FALSE;
}
}
/**
* Converts MAC address in decimal format to classic format
*
* @author Michal Kliment
* @param type $str
* @return boolean
*/
public static function dec2mac ($str)
{
$pieces = explode('.', $str);
if (count ($pieces) != 6)
return FALSE;
$pieces = array_map('dechex', $pieces);
$pieces = array_map(
'num::null_fill',
$pieces, array('2', '2', '2', '2', '2', '2')
);
return implode(':', $pieces);
}
8baed187 Michal Kliment
}