+sub delccdnet
+{
+ my %ccdconfhash = ();
+ my %ccdhash = ();
+ my $ccdnetname=$_[0];
+ if (-f "${General::swroot}/ovpn/ovpnconfig"){
+ &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%ccdhash);
+ foreach my $key (keys %ccdhash) {
+ if ($ccdhash{$key}[32] eq $ccdnetname) {
+ $errormessage=$Lang::tr{'ccd err hostinnet'};
+ return;
+ }
+ }
+ }
+ &General::readhasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+ foreach my $key (keys %ccdconfhash) {
+ if ($ccdconfhash{$key}[0] eq $ccdnetname){
+ delete $ccdconfhash{$key};
+ }
+ }
+ &General::writehasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+
+ &writeserverconf;
+ return 0;
+}
+
+sub addccdnet
+{
+ my %ccdconfhash=();
+ my @ccdconf=();
+ my $ccdname=$_[0];
+ my $ccdnet=$_[1];
+ my $subcidr;
+ my @ip2=();
+ my $checkup;
+ my $ccdip;
+ my $baseaddress;
+
+
+ #check name
+ if ($ccdname eq '')
+ {
+ $errormessage=$errormessage.$Lang::tr{'ccd err name'}."<br>";
+ return
+ }
+
+ if(!&General::validhostname($ccdname))
+ {
+ $errormessage=$Lang::tr{'ccd err invalidname'};
+ return;
+ }
+
+ ($ccdip,$subcidr) = split (/\//,$ccdnet);
+ $subcidr=&General::iporsubtocidr($subcidr);
+ #check subnet
+ if ($subcidr > 30)
+ {
+ $errormessage=$Lang::tr{'ccd err invalidnet'};
+ return;
+ }
+ #check ip
+ if (!&General::validipandmask($ccdnet)){
+ $errormessage=$Lang::tr{'ccd err invalidnet'};
+ return;
+ }
+
+ $errormessage=&General::checksubnets($ccdname,$ccdnet);
+
+
+ if (!$errormessage) {
+ my %ccdconfhash=();
+ $baseaddress=&General::getnetworkip($ccdip,$subcidr);
+ &General::readhasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+ my $key = &General::findhasharraykey (\%ccdconfhash);
+ foreach my $i (0 .. 1) { $ccdconfhash{$key}[$i] = "";}
+ $ccdconfhash{$key}[0] = $ccdname;
+ $ccdconfhash{$key}[1] = $baseaddress."/".$subcidr;
+ &General::writehasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+ &writeserverconf;
+ $cgiparams{'ccdname'}='';
+ $cgiparams{'ccdsubnet'}='';
+ return 1;
+ }
+}
+
+sub modccdnet
+{
+
+ my $newname=$_[0];
+ my $oldname=$_[1];
+ my %ccdconfhash=();
+ my %ccdhash=();
+ &General::readhasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+ foreach my $key (keys %ccdconfhash) {
+ if ($ccdconfhash{$key}[0] eq $oldname) {
+ foreach my $key1 (keys %ccdconfhash) {
+ if ($ccdconfhash{$key1}[0] eq $newname){
+ $errormessage=$errormessage.$Lang::tr{'ccd err netadrexist'};
+ return;
+ }else{
+ $ccdconfhash{$key}[0]= $newname;
+ &General::writehasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+ last;
+ }
+ }
+ }
+ }
+
+ &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%ccdhash);
+ foreach my $key (keys %ccdhash) {
+ if ($ccdhash{$key}[32] eq $oldname) {
+ $ccdhash{$key}[32]=$newname;
+ &General::writehasharray("${General::swroot}/ovpn/ovpnconfig", \%ccdhash);
+ last;
+ }
+ }
+
+ return 0;
+}
+sub ccdmaxclients
+{
+ my $ccdnetwork=$_[0];
+ my @octets=();
+ my @subnet=();
+ @octets=split("\/",$ccdnetwork);
+ @subnet= split /\./, &General::cidrtosub($octets[1]);
+ my ($a,$b,$c,$d,$e);
+ $a=256-$subnet[0];
+ $b=256-$subnet[1];
+ $c=256-$subnet[2];
+ $d=256-$subnet[3];
+ $e=($a*$b*$c*$d)/4;
+ return $e-1;
+}
+
+sub getccdadresses
+{
+ my $ipin=$_[0];
+ my ($ip1,$ip2,$ip3,$ip4)=split /\./, $ipin;
+ my $cidr=$_[1];
+ chomp($cidr);
+ my $count=$_[2];
+ my $hasip=$_[3];
+ chomp($hasip);
+ my @iprange=();
+ my %ccdhash=();
+ &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%ccdhash);
+ $iprange[0]=$ip1.".".$ip2.".".$ip3.".".2;
+ for (my $i=1;$i<=$count;$i++) {
+ my $tmpip=$iprange[$i-1];
+ my $stepper=$i*4;
+ $iprange[$i]= &General::getnextip($tmpip,4);
+ }
+ my $r=0;
+ foreach my $key (keys %ccdhash) {
+ $r=0;
+ foreach my $tmp (@iprange){
+ my ($net,$sub) = split (/\//,$ccdhash{$key}[33]);
+ if ($net eq $tmp) {
+ if ( $hasip ne $ccdhash{$key}[33] ){
+ splice (@iprange,$r,1);
+ }
+ }
+ $r++;
+ }
+ }
+ return @iprange;
+}
+
+sub fillselectbox
+{
+ my $boxname=$_[1];
+ my ($ccdip,$subcidr) = split("/",$_[0]);
+ my $tz=$_[2];
+ my @allccdips=&getccdadresses($ccdip,$subcidr,&ccdmaxclients($ccdip."/".$subcidr),$tz);
+ print"<select name='$boxname' STYLE='font-family : arial; font-size : 9pt; width:130px;' >";
+ foreach (@allccdips) {
+ my $ip=$_."/30";
+ chomp($ip);
+ print "<option value='$ip' ";
+ if ( $ip eq $cgiparams{$boxname} ){
+ print"selected";
+ }
+ print ">$ip</option>";
+ }
+ print "</select>";
+}
+
+sub hostsinnet
+{
+ my $name=$_[0];
+ my %ccdhash=();
+ my $i=0;
+ &General::readhasharray("${General::swroot}/ovpn/ovpnconfig", \%ccdhash);
+ foreach my $key (keys %ccdhash) {
+ if ($ccdhash{$key}[32] eq $name){ $i++;}
+ }
+ return $i;
+}
+
+sub check_routes_push
+{
+ my $val=$_[0];
+ my ($ip,$cidr) = split (/\//, $val);
+ ##check for existing routes in routes_push
+ if (-e "${General::swroot}/ovpn/routes_push") {
+ open(FILE,"${General::swroot}/ovpn/routes_push");
+ while (<FILE>) {
+ $_=~s/\s*$//g;
+
+ my ($ip2,$cidr2) = split (/\//,"$_");
+ my $val2=$ip2."/".&General::iporsubtodec($cidr2);
+
+ if($val eq $val2){
+ return 0;
+ }
+ #subnetcheck
+ if (&General::IpInSubnet ($ip,$ip2,&General::iporsubtodec($cidr2))){
+ return 0;
+ }
+ };
+ close(FILE);
+ }
+ return 1;
+}
+
+sub check_ccdroute
+{
+ my %ccdroutehash=();
+ my $val=$_[0];
+ my ($ip,$cidr) = split (/\//, $val);
+ #check for existing routes in ccdroute
+ &General::readhasharray("${General::swroot}/ovpn/ccdroute", \%ccdroutehash);
+ foreach my $key (keys %ccdroutehash) {
+ foreach my $i (1 .. $#{$ccdroutehash{$key}}) {
+ if (&General::iporsubtodec($val) eq $ccdroutehash{$key}[$i] && $ccdroutehash{$key}[0] ne $cgiparams{'NAME'}){
+ return 0;
+ }
+ my ($ip2,$cidr2) = split (/\//,$ccdroutehash{$key}[$i]);
+ #subnetcheck
+ if (&General::IpInSubnet ($ip,$ip2,$cidr2)&& $ccdroutehash{$key}[0] ne $cgiparams{'NAME'} ){
+ return 0;
+ }
+ }
+ }
+ return 1;
+}
+sub check_ccdconf
+{
+ my %ccdconfhash=();
+ my $val=$_[0];
+ my ($ip,$cidr) = split (/\//, $val);
+ #check for existing routes in ccdroute
+ &General::readhasharray("${General::swroot}/ovpn/ccd.conf", \%ccdconfhash);
+ foreach my $key (keys %ccdconfhash) {
+ if (&General::iporsubtocidr($val) eq $ccdconfhash{$key}[1]){
+ return 0;
+ }
+ my ($ip2,$cidr2) = split (/\//,$ccdconfhash{$key}[1]);
+ #subnetcheck
+ if (&General::IpInSubnet ($ip,$ip2,&General::cidrtosub($cidr2))){
+ return 0;
+ }
+
+ }
+ return 1;
+}
+