X-Git-Url: http://git.ipfire.org/?p=ipfire-2.x.git;a=blobdiff_plain;f=config%2Fcfgroot%2Fnetwork-functions.pl;h=66f1ed554ab12041c31cc0b3163f9e1c8a75710f;hp=029ffc09eee5308dddc5d777e7eb11417e347e3b;hb=203601bf686a3248f4a807d728ed53bc7c499e0d;hpb=24c6cb44e2ff3bc03c6e5eb1ca40126cca0dbd3b diff --git a/config/cfgroot/network-functions.pl b/config/cfgroot/network-functions.pl index 029ffc09ee..66f1ed554a 100644 --- a/config/cfgroot/network-functions.pl +++ b/config/cfgroot/network-functions.pl @@ -23,6 +23,8 @@ package Network; +require "/var/ipfire/general-functions.pl"; + use Socket; my %PREFIX2NETMASK = ( @@ -100,6 +102,22 @@ sub bin2ip($) { return $address; } +# Takes two network addresses, compares them against each other +# and returns true if equal or false if not +sub network_equal { + my $network1 = shift; + my $network2 = shift; + + my $bin1 = &network2bin($network1); + my $bin2 = &network2bin($network2); + + if ($bin1 eq $bin2) { + return 1; + } + + return 0; +} + # Takes a network in either a.b.c.d/a.b.c.d or a.b.c.d/e notation # and will return an 32 bit integer representing the start # address and an other one representing the network mask. @@ -120,6 +138,19 @@ sub network2bin($) { return ($network_start, $netmask_bin); } +# Deletes leading zeros in ip address +sub ip_remove_zero{ + my $address = shift; + my @ip = split (/\./, $address); + + foreach my $octet (@ip) { + $octet = int($octet); + } + + $address = join (".", @ip); + + return $address; +} # Returns True for all valid IP addresses sub check_ip_address($) { my $address = shift; @@ -161,6 +192,21 @@ sub check_ip_address_and_netmask($$) { return &check_netmask($netmask); } +# Returns True for all valid subnets like a.b.c.d/e or a.b.c.d/a.b.c.d +sub check_subnet($) { + my $subnet = shift; + + my ($address, $network) = split(/\//, $subnet, 2); + + # Check if the IP address is fine. + my $result = &check_ip_address($address); + unless ($result) { + return $result; + } + + return &check_prefix($network) || &check_netmask($network); +} + # For internal use only. Will take an IP address and # return it in a normalised style. Like 8.8.8.010 -> 8.8.8.8. sub _normalise_ip_address($) { @@ -239,11 +285,95 @@ sub ip_address_in_network($$) { my ($network_bin, $netmask_bin) = &network2bin($network); # Find end address - my $broadcast_bin = $network_bin ^ ~$netmask_bin; + my $broadcast_bin = $network_bin ^ (~$netmask_bin % 2 ** 32); return (($address_bin ge $network_bin) && ($address_bin le $broadcast_bin)); } +sub setup_upstream_proxy() { + my %proxysettings = (); + &General::readhash("${General::swroot}/proxy/settings", \%proxysettings); + + if ($proxysettings{'UPSTREAM_PROXY'}) { + my $credentials = ""; + + if ($proxysettings{'UPSTREAM_USER'}) { + $credentials = $proxysettings{'UPSTREAM_USER'}; + + if ($proxysettings{'UPSTREAM_PASSWORD'}) { + $credentials .= ":" . $proxysettings{'UPSTREAM_PASSWORD'}; + } + + $credentials .= "@"; + } + + my $proxy = "http://" . $credentials . $proxysettings{'UPSTREAM_PROXY'}; + + $ENV{'http_proxy'} = $proxy; + $ENV{'https_proxy'} = $proxy; + $ENV{'ftp_proxy'} = $proxy; + } +} + +my %wireless_status = (); + +sub _get_wireless_status($) { + my $intf = shift; + + if (!$wireless_status{$intf}) { + $wireless_status{$intf} = `iwconfig $intf`; + } + + return $wireless_status{$intf}; +} + +sub wifi_get_essid($) { + my $status = &_get_wireless_status(shift); + + my ($essid) = $status =~ /ESSID:\"(.*)\"/; + + return $essid; +} + +sub wifi_get_frequency($) { + my $status = &_get_wireless_status(shift); + + my ($frequency) = $status =~ /Frequency:(\d+\.\d+ GHz)/; + + return $frequency; +} + +sub wifi_get_access_point($) { + my $status = &_get_wireless_status(shift); + + my ($access_point) = $status =~ /Access Point: ([0-9A-F:]+)/; + + return $access_point; +} + +sub wifi_get_bit_rate($) { + my $status = &_get_wireless_status(shift); + + my ($bit_rate) = $status =~ /Bit Rate=(\d+ [GM]b\/s)/; + + return $bit_rate; +} + +sub wifi_get_link_quality($) { + my $status = &_get_wireless_status(shift); + + my ($cur, $max) = $status =~ /Link Quality=(\d+)\/(\d+)/; + + return $cur * 100 / $max; +} + +sub wifi_get_signal_level($) { + my $status = &_get_wireless_status(shift); + + my ($signal_level) = $status =~ /Signal level=(\-\d+ dBm)/; + + return $signal_level; +} 1; # Remove the next line to enable the testsuite @@ -297,9 +427,26 @@ sub testsuite() { $result = &find_next_ip_address("1.2.3.4", 2); assert($result eq "1.2.3.6"); + $result = &network_equal("192.168.0.0/24", "192.168.0.0/255.255.255.0"); + assert($result); + + $result = &network_equal("192.168.0.0/24", "192.168.0.0/25"); + assert(!$result); + + $result = &network_equal("192.168.0.0/24", "192.168.0.128/25"); + assert(!$result); + + $result = &network_equal("192.168.0.1/24", "192.168.0.XXX/24"); + assert($result); + $result = &ip_address_in_network("10.0.1.4", "10.0.0.0/8"); assert($result); + $result = &ip_address_in_network("192.168.30.11", "192.168.30.0/255.255.255.0"); + assert($result); + + print "Testsuite completed successfully!\n"; + return 0; }