]> git.ipfire.org Git - people/amarx/ipfire-2.x.git/commitdiff
ccd extension
authorAlexander Marx <amarx@ipfire.org>
Mon, 5 Nov 2012 13:35:01 +0000 (14:35 +0100)
committerAlexander Marx <amarx@ipfire.org>
Mon, 5 Nov 2012 13:35:01 +0000 (14:35 +0100)
general functions for ccd extension

config/cfgroot/general-functions.pl

index 567f2e104ec5cb02bae2e588e0b18472a7ab7957..2c7710810ff4c35e790edbdd6e44c2795b6699a4 100644 (file)
@@ -18,12 +18,11 @@ use strict;
 use Socket;
 use IO::Socket;
 use Net::SSLeay;
-use Net::IPv4Addr;
-
+use Net::IPv4Addr qw(:all);
 $|=1; # line buffering
 
-$General::version = 'VERSION';
-$General::swroot = 'CONFIG_ROOT';
+$General::version = '2.11';
+$General::swroot = '/var/ipfire';
 $General::noipprefix = 'noipg-';
 $General::adminmanualurl = 'http://wiki.ipfire.org';
 
@@ -211,7 +210,184 @@ sub validipormask
                return 0; }
        return &validmask($mask);
 }
+################
+#A.Marx CCD Func----------------------------------------------------------------
+################
+sub subtocidr
+{
+       #Erwartet: Subnetzmaske in dezimal (255.255.255.0) 
+       #Gibt aus: 24 (Die cidr Zahl des Netzwerks)
+       my ($byte1, $byte2, $byte3, $byte4) = split(/\./, $_[0].".0.0.0.0"); 
+       my $num = ($byte1 * 16777216) + ($byte2 * 65536) + ($byte3 * 256) + $byte4; 
+       my $bin = unpack("B*", pack("N", $num)); 
+       my $count = ($bin =~ tr/1/1/); 
+       return $count;
+}
 
+sub cidrtosub
+{
+       #Erwartet: Cidr Zahl des Netzes (20-30 bei ccd) 
+       #Konvertiert 30 zu 255.255.255.252 z.b
+       my $cidr=$_[0];
+    my $netmask = &Net::IPv4Addr::ipv4_cidr2msk($cidr);
+    return "$netmask";
+}
+  
+sub iporsubtodec
+{
+       #Erwartet: Ip-Adresse oder Subnetzmaske in dezimal oder binär
+       #Gibt aus: Das was reingeworfen wurde nur als CIDR Format
+       my $subnet=$_[0];
+       my $net;
+       my $mask;
+       my $full=0;
+       if ($subnet =~ /^(.*?)\/(.*?)$/) {
+               ($net,$mask) = split (/\//,$subnet);
+               $full=1;
+       }else{
+               $mask=$subnet;
+       }
+       #Subnet already in decimal and valid?
+       if ($mask=~/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ &&(($1<=255  && $2<=$1 && $3<=$2  && $4<=$3 )))       {
+               for (my $i=8;$i<=30;$i++){
+                       if (&General::cidrtosub($i) eq $mask){
+                               if ($full=0){return $mask;}else{
+                                                        return $net."/".$mask;
+                               }
+                       }
+               }       
+       }
+       #Subnet in binary format?
+       if ($mask=~/^(\d{1,2})$/ && (($1<=30 && $1>=8))){
+                       if($full=0){ return &General::cidrtosub($mask);}else{
+                                                return $net."/".&General::cidrtosub($mask);
+                       }
+       }else{
+                       return 3;
+       }
+       return 3;
+}
+  
+  
+sub iporsubtocidr
+{
+       #Erwartet: Ip-Adresse oder Subnetzmaske in dezimal oder binär
+       #Gibt aus: Das was reingeworfen wurde nur als CIDR Format
+       my $subnet=$_[0];
+       my $net;
+       my $mask;
+       my $full=0;
+       if ($subnet =~ /^(.*?)\/(.*?)$/) {
+               ($net,$mask) = split (/\//,$subnet);
+               $full=1;
+       }else{
+               $mask=$subnet;
+       }
+       #Subnet in decimal and valid?
+       if ($mask=~/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ &&(($1<=255  && $2<=$1 && $3<=$2  && $4<=$3 )))       {
+               for (my $i=8;$i<=30;$i++){
+                       if (&General::cidrtosub($i) eq $mask){
+                               if ($full=0){return &General::subtocidr($mask);}else{
+                                                        return $net."/".&General::subtocidr($mask);
+                               }
+                       }
+               }       
+       }
+       #Subnet already in binary format?
+       if ($mask=~/^(\d{1,2})$/ && (($1<=30 && $1>=8))){
+                       if($full=0){ return $mask;}else{
+                                                return $net."/".$mask;
+                       }
+       }else{
+                       return 3;
+       }
+       return 3;
+}
+
+sub getnetworkip
+{
+       #Erwartet:  IP, CIDR    (10.10.10.0-255, 24)
+       #Gibt aus:  10.10.10.0
+       my ($ccdip,$ccdsubnet) = @_;
+       my $ip_address_binary = inet_aton( $ccdip );
+       my $netmask_binary    = ~pack("N", (2**(32-$ccdsubnet))-1);
+       my $network_address    = inet_ntoa( $ip_address_binary & $netmask_binary );
+       return $network_address;
+}
+
+sub getccdbc
+{
+       #Erwartet: IP in Form ("192.168.0.0/24")
+       #Gibt aus: Broadcastadresse des Netzes
+       my $ccdnet=$_;
+       my ($ccdip,$ccdsubnet) = split "/",$ccdnet;
+       my $ip_address_binary = inet_aton( $ccdip );
+       my $netmask_binary    = ~pack("N", (2**(32-$ccdsubnet))-1);
+       my $broadcast_address  = inet_ntoa( $ip_address_binary | ~$netmask_binary );
+       return $broadcast_address;
+}
+sub getnextip
+{
+       my ($a,$b,$c,$d) = split (/\./,$_[0]);
+       my $step=$_[1];
+       for (my $x=1;$x<=$step;$x++){
+               $d++;
+               if($d==255){ $d=0;$c++;}
+                       if($c==255){$c=0;$b++;}
+                               if ($b==255){$b=0;$a++}
+       
+       }
+       return "$a.$b.$c.$d";
+}
+sub getlastip
+{
+       my ($a,$b,$c,$d) = split (/\./,$_[0]);
+       my $step=$_[1];
+       for (my $x=$step;$x>=1;$x--){
+               $d--;
+               if($d==0){ $d=255;$c--;}
+                       if($c==0){$c=255;$b--;}
+                               if ($b==0){$b=255;$a--}
+       }
+       return "$a.$b.$c.$d";
+}
+
+sub validip2
+{
+       #Erwartet: Ip-Adresse als 192.168.0.0/24 oder 192.168.0.0/255.255.255.0 und prüft, ob subnetz gültig ist
+       #Gibt aus: True bzw 0 wenn erfolgreich oder false bzw 1
+       my $ccdnet=$_[0];
+       my $subcidr;
+       
+       if (!($ccdnet =~ /^(.*?)\/(.*?)$/)) {
+               return 0;
+       }
+       my ($ccdip,$ccdsubnet)=split (/\//, $ccdnet);
+       #IP valid?
+       if ($ccdip=~/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ &&(($1>0 && $1<=255 && $2>=0 && $2<=255 && $3>=0 && $3<=255 && $4<=255 ))) {
+               #Subnet in decimal and valid?
+               if ($ccdsubnet=~/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ &&(($1<=255  && $2<=$1 && $3<=$2  && $4<=$3 )))  {
+                       for (my $i=8;$i<=30;$i++){
+                               if (&General::cidrtosub($i) eq $ccdsubnet){
+                                       return 1;
+                               }
+                       }       
+               #Subnet already in binary format?
+               }elsif ($ccdsubnet=~/^(\d{1,2})$/ && (($1<=30 && $1>=8))){
+                       return 1;
+               }else{
+                       return 0;
+               }
+               
+       }
+       return 0;
+}
+
+
+
+###########
+#CCD END------------------------------------------------------------------------
+###########
 sub validipandmask
 {
        my $ipandmask = $_[0];
@@ -407,7 +583,12 @@ sub NextIP
                                   )
                             );
 }
-
+sub NextIP2
+{
+    return &Socket::inet_ntoa( pack("N", 4 +  unpack('N', &Socket::inet_aton(shift))
+                                  )
+                            );
+}
 sub ipcidr
 {
        my ($ip,$cidr) = &Net::IPv4Addr::ipv4_parse(shift);
@@ -465,13 +646,13 @@ sub writehasharray {
     open(FILE, ">$filename") or die "Unable to write to file $filename";
 
     foreach $key (keys %$hash) {
-       if ($key =~ /^[0-9]+$/) {
-           print FILE "$key";
-           foreach $i (0 .. $#{$hash->{$key}}) {
-               print FILE ",$hash->{$key}[$i]";
-           }
-           print FILE "\n";
-       }
+               if ($key =~ /^[0-9]+$/) {
+                       print FILE "$key";
+                       foreach $i (0 .. $#{$hash->{$key}}) {
+                               print FILE ",$hash->{$key}[$i]";
+                       }
+                       print FILE "\n";
+               }
     }
     close FILE;
     return;