#!/usr/bin/perl ############################################################################### # # # IPFire.org - A linux based firewall # # Copyright (C) 2014 IPFire Team # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # # # ############################################################################### use Time::Local; use File::Find; use File::Path; use GD::Graph::area; use GD::Graph::bars; use LWP::UserAgent; use POSIX; use locale; # enable only the following on debugging purpose #use warnings; #use CGI::Carp 'fatalsToBrowser'; require '/var/ipfire/general-functions.pl'; require "${General::swroot}/lang.pl"; require "${General::swroot}/header.pl"; require "${General::swroot}/accounting/acct-lib.pl"; unless (-e "${General::swroot}/accounting/settings.conf") { system("touch ${General::swroot}/accounting/settings.conf"); } my $settingsfile="${General::swroot}/accounting/settings.conf"; my $proxyenabled="${General::swroot}/proxy/enable"; my $logopath="/srv/web/ipfire/html/accounting/logo"; my %settings=(); my %mainsettings; my %color; my %cgiparams=(); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst)=localtime(); my $dbh; my %checked=(); my $errormessage=''; my @ips; my $count=0; my $col; my $proxlog=$Lang::tr{'stopped'}; my $proxsrv=$Lang::tr{'stopped'}; &Header::getcgihash(\%cgiparams); &General::readhash("${General::swroot}/main/settings", \%mainsettings); &General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color); &General::readhash("$settingsfile", \%settings) if(-f $settingsfile); #Find out which lang is set (used later to set decimal separator correctly) my $uplang=uc($mainsettings{'LANGUAGE'}); setlocale LC_NUMERIC,"$mainsettings{'LANGUAGE'}_$uplang"; if ($cgiparams{'BILLVIEW'} eq "show"){ my $file=$cgiparams{'file'}; my $name=$cgiparams{'name'}; open(DLFILE, "<$file") or die "Unable to open $file: $!"; my @fileholder = ; print "Content-Type:application/pdf\n"; my @fileinfo = stat("$file"); print "Content-Length:$fileinfo[7]\n"; print "Content-Disposition:attachment;filename='$name';\n\n"; print @fileholder; exit (0); } if ($cgiparams{'BILLACTION'} eq "open_preview"){ #Generate preview Bill my $rggrp=$cgiparams{'txt_billgroup'}; my $address_cust = &ACCT::getTaAddress($rggrp,'CUST'); my $address_host = &ACCT::getTaAddress($rggrp,'HOST'); my $billpos = &ACCT::getextrabillpos($rggrp); my $mwst=$settings{'MWST'}; my $cur = $settings{'CURRENCY'}; my @now = localtime(time); $now[5] = $now[5] + 1900; my $actmonth = $now[4]+1; my $actyear = $now[5]; my ($from,$till)=&ACCT::getmonth($actmonth,$actyear); my @billar = &ACCT::GetTaValues($from,$till,$rggrp); my $tempfile=&ACCT::pdf2(\@billar,$actmonth,$actyear,$mwst,$address_cust,$address_host,$billpos,$rggrp,$cur,"on"); #Show PDF preview open(DLFILE, "<$tempfile") or die "Unable to open tmp.pdf: $!"; my @fileholder = ; print "Content-Type:application/pdf\n"; my @fileinfo = stat($tempfile); print "Content-Length:$fileinfo[7]\n"; print "Content-Disposition:attachment;filename='tmp.pdf';\n\n"; print @fileholder; unlink ($tempfile); exit (0); } &Header::showhttpheaders(); if ($cgiparams{'ACTION'} eq "$Lang::tr{'acct config'}"){ #ConfigButton from Menu &configsite; } if ($cgiparams{'ACTION'} eq "$Lang::tr{'acct addresses'}"){ #AddressmgmntButton from Menu &addressmgmnt; } if ($cgiparams{'ACTION'} eq "$Lang::tr{'acct billgroup'}"){ #BillgroupButton from Menu &billgroupsite; } if ($cgiparams{'ACTION'} eq "$Lang::tr{'acct maintenance'}"){ #MaintenanceButton from Menu &expertsite; } if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}"){ #SaveButton on configsite my @val=split('\r\n',$cgiparams{'txt_skipurls'}); my $skipurls; foreach my $line (@val){ $skipurls.="|".$line; } $skipurls=$skipurls."|"; $skipurls=~ s/\|\|/\|/g; my @txt=split('\r\n',$cgiparams{'txt_mailtxt'}); my $mailtxt; foreach my $txt (@txt){ $mailtxt.="|".$txt; } #Check fields if ($cgiparams{'USEMAIL'} eq 'on'){ $errormessage=&checkmailsettings; }elsif($cgiparams{'USEMAIL'} ne 'on'){ $cgiparams{'txt_mailserver'}=''; $cgiparams{'txt_mailport'}=''; $cgiparams{'txt_mailuser'}=''; $cgiparams{'txt_mailpass'}=''; $cgiparams{'mail_tls'}=''; $cgiparams{'txt_mailsender'}=''; $cgiparams{'txt_mailsubject'}=''; $mailtxt=''; } if(!$errormessage){ open (TXT, ">$settingsfile") or die("Die Datei konnte nicht geöffnet werden: $!\n"); close TXT; $settings{'LOG'} = $cgiparams{'logging'}; $settings{'EXPERT'} = $cgiparams{'expert'}; $settings{'MULTIUSER'} = $cgiparams{'multiuser'}; $settings{'MWST'} = $cgiparams{'txt_mwst'}; $settings{'CURRENCY'} = $cgiparams{'txt_currency'}; $settings{'SKIPURLS'} = $skipurls; $settings{'USEMAIL'} = $cgiparams{'USEMAIL'}; $settings{'MAILSRV'} = $cgiparams{'txt_mailserver'}; $settings{'MAILPORT'} = $cgiparams{'txt_mailport'}; $settings{'MAILUSER'} = $cgiparams{'txt_mailuser'}; $settings{'MAILPASS'} = $cgiparams{'txt_mailpass'}; $settings{'TLS'} = $cgiparams{'mail_tls'}; $settings{'MAILSENDER'} = $cgiparams{'txt_mailsender'}; $settings{'MAILSUB'} = $cgiparams{'txt_mailsubject'}; $settings{'MAILTXT'} = $mailtxt; &General::writehash("$settingsfile", \%settings); }else{ $cgiparams{'update'}='on'; &configsite; } } if ($cgiparams{'ACTION'} eq "$Lang::tr{'acct view'}"){ #If special month and year is given on mainsite &mainsite($cgiparams{'month'},$cgiparams{'year'}); exit 0; } if ($cgiparams{'ACTION'} eq "$Lang::tr{'acct commit'}"){ #Maintenance function &ACCT::logger($settings{'LOG'},"Clear DB (all data) committed).\n"); &ACCT::cleardbtraf; &expertsite; } if ($cgiparams{'ACTION2'} eq "$Lang::tr{'acct commit'}"){ #Maintenance function &ACCT::logger($settings{'LOG'},"Clear DB (only traffic data) committed).\n"); &ACCT::cleardb; &expertsite; } if ($cgiparams{'ACTION1'} eq "$Lang::tr{'acct commit'}"){ #Maintenance Function #Get Timestamp my ($a,$b)=&ACCT::getmonth($cgiparams{'expmonth'},$cgiparams{'expyear'}); &ACCT::delbefore(($a-1)); &expertsite; } if ($cgiparams{'ACTION'} eq "viewgraph"){ #Graph icon on hosttable (viewhosttable) &graphsite($cgiparams{'month'},$cgiparams{'year'},$cgiparams{'host'}); } if ($cgiparams{'ACTION1'} eq "$Lang::tr{'save'}"){ #SaveButton when adding Address $errormessage=&checkaddress; if ($errormessage){ &addressmgmnt($errormessage); }else{ &ACCT::writeaddr( $cgiparams{'txt_company'}, $cgiparams{'rdo_companytype'}, $cgiparams{'txt_name1'}, $cgiparams{'txt_str'}, $cgiparams{'txt_str_nr'}, $cgiparams{'txt_plz'}, $cgiparams{'txt_city'}, $cgiparams{'txt_bank'}, $cgiparams{'txt_iban'}, $cgiparams{'txt_bic'}, $cgiparams{'txt_blz'}, $cgiparams{'txt_kto'}, $cgiparams{'txt_email'}, $cgiparams{'txt_inet'}, $cgiparams{'txt_hrb'}, $cgiparams{'txt_ustid'}, $cgiparams{'txt_tel'}, $cgiparams{'txt_fax'}, ); &ACCT::logger($settings{'LOG'},"Created new address $cgiparams{'txt_company'} as $cgiparams{'rdo_companytype'}.\n"); %cgiparams=(); } &addressmgmnt; } if ($cgiparams{'ACTION'} eq "edit_addr"){ #Pencil icon in Address overwiev on Addressmgmnt site $cgiparams{'update'} = 'on'; $cgiparams{'oldcompname'}=$cgiparams{'txt_company'}; &addressmgmnt; } if ($cgiparams{'ACTION'} eq "$Lang::tr{'update'}"){ #UpdateButton when editing Address $cgiparams{'update'} = 'on'; $errormessage=&checkaddress; if ($errormessage){ &addressmgmnt($errormessage); }else{ &ACCT::updateaddr( $cgiparams{'rdo_companytype'}, $cgiparams{'txt_company'}, $cgiparams{'txt_name1'}, $cgiparams{'txt_str'}, $cgiparams{'txt_str_nr'}, $cgiparams{'txt_plz'}, $cgiparams{'txt_city'}, $cgiparams{'txt_bank'}, $cgiparams{'txt_iban'}, $cgiparams{'txt_bic'}, $cgiparams{'txt_blz'}, $cgiparams{'txt_kto'}, $cgiparams{'txt_email'}, $cgiparams{'txt_inet'}, $cgiparams{'txt_hrb'}, $cgiparams{'txt_ustid'}, $cgiparams{'txt_tel'}, $cgiparams{'txt_fax'}, $cgiparams{'oldcompname'} ); my $res=&ACCT::getbillgroups; foreach my $line (@$res){ my($name,$host,$cust)=@$line; if($host eq $cgiparams{'oldcompname'}){ &ACCT::updatebillgrouphost($cgiparams{'oldcompname'},$cgiparams{'txt_company'}); }elsif ($cust eq $cgiparams{'oldcompname'}){ &ACCT::updatebillgroupcust($cgiparams{'oldcompname'},$cgiparams{'txt_company'}); } } &ACCT::logger($settings{'LOG'},"Edited address $cgiparams{'oldcompname'}.\n"); %cgiparams=(); } &addressmgmnt; } if ($cgiparams{'ACTION'} eq "del_addr"){ #Trash icon in Address overview on Addressmgmnt site my $res=&ACCT::checkbillgrp; foreach my $line (@$res){ my ($grp,$host,$cust) = @$line; if ($cgiparams{'txt_company'} eq $host){ $errormessage="$Lang::tr{'acct err hostdel'} $grp"; } if ($cgiparams{'txt_company'} eq $cust){ $errormessage="$Lang::tr{'acct err custdel'} $grp"; } } if (! $errormessage){ &ACCT::deladdr($cgiparams{'txt_company'}); &ACCT::logger($settings{'LOG'},"Deleted address $cgiparams{'txt_company'}.\n"); } $cgiparams{'txt_company'}=''; &addressmgmnt; } if ($cgiparams{'BILLACTION'} eq "$Lang::tr{'save'}"){ #SaveButton when adding BillingGroups #check if a group with the same name already exists in DB my $res=&ACCT::getbillgroups; foreach my $row (@$res) { my ($group)=@$row; if ($group eq $cgiparams{'txt_billgroup'}){ $errormessage.=$Lang::tr{'acct billgroupexists'}; } } #Check if a selected user is in another group already if ($settings{'MULTIUSER'} ne 'on'){ #split hosts into array my @user=split(/\|/,$cgiparams{'sel_hosts'}); my $res=&ACCT::checkusergrp; foreach my $val (@$res){ my ($grp,$usr)=@$val; foreach my $wanted (@user){ if($usr eq $wanted){ $errormessage.="$usr $Lang::tr{'acct usermulti'} $grp
"; } } } } #validate namefield if(!&validtextfield($cgiparams{'txt_billgroup'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'name'}
"; } #FIXME: Validate CENT amount (num with .) #if used colon, replace with . $cgiparams{'txt_cent'} =~ tr/,/./; if(!&validnumfield($cgiparams{'txt_cent'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct cent'}
"; } #fill array my @ips=split (/\|/,$cgiparams{'sel_hosts'}); #Check if we use extra bill positions if($cgiparams{'txt_amount'} || $cgiparams{'txt_name'}|| $cgiparams{'txt_price'}){ if (!$cgiparams{'txt_amount'} || !$cgiparams{'txt_name'} || !$cgiparams{'txt_price'}){ $errormessage.="$Lang::tr{'acct invalid billpos'}
"; } #check all fields if (!$errormessage){ if(! &validnumfield($cgiparams{'txt_amount'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct amount'}
"; }elsif(! &validtextfield($cgiparams{'txt_name'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct name'}
"; }elsif(! &validnumfield($cgiparams{'txt_price'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct price pp'}
"; } } } if ($errormessage){ &billgroupsite($errormessage); }else{ #check if we use extra positions if ($cgiparams{'txt_amount'}){ &ACCT::savebillpos( $cgiparams{'txt_posbillgroup'}, $cgiparams{'txt_amount'}, $cgiparams{'txt_name'}, $cgiparams{'txt_price'}); &ACCT::logger($settings{'LOG'},"Saved new fixed billposition $cgiparams{'txt_name'} into billgroup $cgiparams{'txt_posbillgroup'} .\n"); } #save new group &ACCT::savebillgroup( $cgiparams{'txt_billgroup'}, $cgiparams{'txt_billtext1'}, $cgiparams{'dd_host'}, $cgiparams{'dd_cust'}, $cgiparams{'txt_cent'}, \@ips); &ACCT::logger($settings{'LOG'},"Saved new billgroup $cgiparams{'txt_billgroup'}.\n"); %cgiparams=(); } &billgroupsite; } if ($cgiparams{'BILLACTION'} eq "$Lang::tr{'update'}"){ #UpdateButton when editing BillingGroups my $filename=$cgiparams{'uploaded_file'}; if($filename){ #First check if logo dir exists if (! -d "$logopath/$cgiparams{'logo_grp'}"){ mkpath("$logopath/$cgiparams{'logo_grp'}",0,01777); } #Save File my ($filehandle) = CGI::upload('uploaded_file'); open (UPLOADFILE, ">$logopath/$cgiparams{'logo_grp'}/logo.png"); binmode $filehandle; while ( <$filehandle> ) { print UPLOADFILE; } close (UPLOADFILE); #Check dimensions of uploaded file open (PNG , "<$logopath/$cgiparams{'logo_grp'}/logo.png") ; local $/; my $PNG1= ; close(PNG) ; my ($width,$height)=&ACCT::pngsize($PNG1) ; if (! &validnumfield($width)){ $errormessage.="$Lang::tr{'acct invalid png'}
"; unlink("$logopath/$cgiparams{'logo_grp'}/logo.png"); }elsif($width > 400 || $height > 150){ $errormessage.="$Lang::tr{'acct invalid pngsize'} width: $width height: $height
"; unlink("$logopath/$cgiparams{'logo_grp'}/logo.png"); } } #Check if a group with the same name already exists in DB my $res=&ACCT::getbillgroups; foreach my $row (@$res) { my ($group)=@$row; if (($group eq $cgiparams{'txt_billgroup'}) && ($cgiparams{'oldname'} ne $cgiparams{'txt_billgroup'})){ $errormessage.=$Lang::tr{'acct billgroupexists'}; } } #Check if a selected user is in another group already if ($settings{'MULTIUSER'} ne 'on'){ #split hosts into array my @user=split(/\|/,$cgiparams{'sel_hosts'}); my $res=&ACCT::checkusergrp; foreach my $val (@$res){ my ($grp,$usr)=@$val; foreach my $wanted (@user){ if($usr eq $wanted && $grp ne $cgiparams{'txt_billgroup'}){ $errormessage.="$usr $Lang::tr{'acct usermulti'} $grp
"; } } } } #Validate namefield if(!&validtextfield($cgiparams{'txt_billgroup'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'name'}"; } #Validate CENT amount (num with .) #if used colon, replace with . $cgiparams{'txt_cent'} =~ tr/,/./; if(!&validnumfield($cgiparams{'txt_cent'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct cent'}
"; } #Fill array my @ips=split ( /\|/,$cgiparams{'sel_hosts'}); #Check if we use extra bill positions if($cgiparams{'txt_amount'} || $cgiparams{'txt_name'}|| $cgiparams{'txt_price'}){ if (!$cgiparams{'txt_amount'} || !$cgiparams{'txt_name'} || !$cgiparams{'txt_price'}){ $errormessage.="$Lang::tr{'acct invalid billpos'}
"; } #Check all fields if (!$errormessage){ if(! &validnumfield($cgiparams{'txt_amount'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct amount'}
"; }elsif(! &validtextfield($cgiparams{'txt_name'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct name'}
"; }elsif(! &validnumfield($cgiparams{'txt_price'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct price pp'}
"; } } } #Check if we added some CC mail recipients if($cgiparams{'txt_ccmail'}){ $cgiparams{'txt_ccmail'}=~ s/ //g; #Split line into single addresses and check each one my @ccaddr = split(",",$cgiparams{'txt_ccmail'}); foreach my $cc (@ccaddr){ if (! &General::validemail($cc)){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct ccmail'} $cc
"; } } } if ($errormessage){ $cgiparams{'update'} = 'on'; &billgroupsite(); }else{ #update fixedbillpositions if defined if ($cgiparams{'oldname'} ne $cgiparams{'txt_billgroup'}){ &ACCT::updatebillpos($cgiparams{'oldname'},$cgiparams{'txt_billgroup'}); } #Check if we use extra positions if ($cgiparams{'txt_amount'}){ &ACCT::savebillpos( $cgiparams{'txt_billgroup'}, $cgiparams{'txt_amount'}, $cgiparams{'txt_name'}, $cgiparams{'txt_price'}); } #Check if we have NEW cc Mails if($cgiparams{'txt_ccmail'} ne $cgiparams{'oldccmail'}){ &ACCT::updateccaddr($cgiparams{'txt_ccmail'},$cgiparams{'dd_cust'}); } &ACCT::deletebillgroup($cgiparams{'oldname'}); &ACCT::savebillgroup( $cgiparams{'txt_billgroup'}, $cgiparams{'txt_billtext1'}, $cgiparams{'dd_host'}, $cgiparams{'dd_cust'}, $cgiparams{'txt_cent'}, \@ips); %cgiparams=(); } &billgroupsite; } if ($cgiparams{'BILLACTION'} eq "edit_billgroup"){ #Pencil icon in Billgroup table $cgiparams{'update'} = 'on'; &billgroupsite; } if ($cgiparams{'BILLACTION'} eq "delete_billgroup"){ #Trash icon in Billgroup table &deletefiles($cgiparams{'txt_billgroup'}); &ACCT::delbillpos($cgiparams{'txt_billgroup'}); &ACCT::deletebillgroup($cgiparams{'txt_billgroup'}); &ACCT::logger($settings{'LOG'},"Deleted billgroup $cgiparams{'txt_billgroup'}.\n"); &billgroupsite; } if ($cgiparams{'BILLACTION'} eq "open_billgroup"){ #Folder icon on billgrouptable (viewtablebillgroup) &billoverview($cgiparams{'txt_billgroup'}); } if ($cgiparams{'BILLPOS'} eq "delpos"){ #Trash icon in Billpos table $cgiparams{'update'} = 'on'; &ACCT::delbillpos_single($cgiparams{'txt_billpos'},$cgiparams{'txt_billgroup'}); &ACCT::logger($settings{'LOG'},"Deleted fixed billposition $cgiparams{'txt_billpos'} from billgroup $cgiparams{'txt_billgroup'}.\n"); &billgroupsite; } if ($cgiparams{'BILLPOS'} eq "$Lang::tr{'save'}"){ #Savebutton in Billpos table $cgiparams{'update'}='on'; #Check if we use extra bill positions if($cgiparams{'txt_amount'} || $cgiparams{'txt_name'}|| $cgiparams{'txt_price'}){ if (!$cgiparams{'txt_amount'} || !$cgiparams{'txt_name'} || !$cgiparams{'txt_price'}){ $errormessage.="$Lang::tr{'acct invalid billpos'}
"; } #check all fields if (!$errormessage){ #if used colon, replace with . $cgiparams{'txt_price'} =~ tr/,/./; if(! &validnumfield($cgiparams{'txt_amount'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct amount'}
"; }elsif(! &validtextfield($cgiparams{'txt_name'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct name'}
"; }elsif(! &validnumfield($cgiparams{'txt_price'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct price pp'}
"; } } } if ($errormessage){ &billgroupsite($errormessage); }else{ #check if we use extra positions if ($cgiparams{'txt_amount'}){ &ACCT::savebillpos( $cgiparams{'txt_billgroup'}, $cgiparams{'txt_amount'}, $cgiparams{'txt_name'}, $cgiparams{'txt_price'}); } &ACCT::logger($settings{'LOG'},"Added fixed billposition $cgiparams{'txt_amount'} $cgiparams{'txt_name'} with price $cgiparams{'txt_price'} to billgroup $cgiparams{'txt_billgroup'}.\n"); } %cgiparams=(); &billgroupsite; } #Check if we already have settings if ( -z $settingsfile){ &configsite; }else{ &mainsite(($mon+1),($year+1900)); exit 0; } sub configsite{ my $proxymessage=''; my $blockactivation=''; #If update set fieldvalues new if($cgiparams{'update'} eq 'on'){ $settings{'USEMAIL'} = 'on'; $settings{'MAILSRV'} = $cgiparams{'txt_mailserver'}; $settings{'MAILPORT'} = $cgiparams{'txt_mailport'}; $settings{'MAILUSER'} = $cgiparams{'txt_mailuser'}; $settings{'MAILPASS'} = $cgiparams{'txt_mailpass'}; $settings{'MAILSUB'} = $cgiparams{'txt_mailsubject'}; $settings{'MAILTXT'} = $cgiparams{'txt_mailtxt'}; } #find preselections $checked{'expert'}{$settings{'EXPERT'}} = 'CHECKED'; $checked{'logging'}{$settings{'LOG'}} = 'CHECKED'; $checked{'multiuser'}{$settings{'MULTIUSER'}} = 'CHECKED'; $checked{'usemail'}{$settings{'USEMAIL'}} = 'CHECKED'; $checked{'mail_tls'}{$settings{'TLS'}} = 'CHECKED'; #Open site &Header::openpage($Lang::tr{'acct settings'}, 1, ''); &Header::openbigbox('100%', 'center'); &error; &Header::openbox('100%', 'left', $Lang::tr{'acct config'}); #### JAVA SCRIPT #### print< \$(document).ready(function() { // Show/Hide elements when NAT checkbox is checked. if (\$("#MAIL").attr("checked")) { } else { \$(".MAILSRV").hide(); } // Show NAT area when "use nat" checkbox is clicked \$("#MAIL").change(function() { \$(".MAILSRV").toggle(); }); }); END ####################### $settings{'SKIPURLS'} =~ tr/|/\r\n/; $settings{'MAILTXT'} =~ tr/|/\r\n/; my $col="style='background-color:$color{'color22'}'"; print<
$Lang::tr{'acct logging'}
$Lang::tr{'acct expert'}
$Lang::tr{'acct multiuser'}
$Lang::tr{'acct mwst'}
$Lang::tr{'acct currency'}
$Lang::tr{'acct skipurl'}
$Lang::tr{'acct usemail'}

$Lang::tr{'acct mailaddr'}
$Lang::tr{'acct mailport'}
$Lang::tr{'acct mailuser'}*
$Lang::tr{'acct mailpass'}*
$Lang::tr{'acct tls'}
$Lang::tr{'acct mailsender'}
 
$Lang::tr{'acct subject'}
$Lang::tr{'acct mailtxt'}

END &Header::closebox(); #BackButton print<
END &Header::closebigbox(); &Header::closepage(); exit 0; } sub deletefiles{ my $grp=shift; rmtree ("$logopath/$grp"); rmtree ("${General::swroot}/accounting/bill/$grp"); } sub mainsite{ my $mon=$_[0]; my $year=$_[1]; if ($_[0]){$mon=$_[0];} &Header::openpage($Lang::tr{'acct title'}, 1, ''); &Header::openbigbox('100%', 'center'); &checkproxy; &statusbox; &menu; &viewtablehosts(($mon),$year); &Header::closebigbox(); &Header::closepage(); } sub expertsite{ &Header::openpage($Lang::tr{'acct maintenance'}, 1, ''); &Header::openbigbox('100%', 'center'); #Get size of Databasefile my $sizedb= -s "/var/ipfire/accounting/acct.db"; $sizedb = sprintf"%.2f", $sizedb/(1024*1024); #Get size of Directory, where all bills are stored my $sizerrd = 0; find(sub { $sizerrd += -s if -f $_ }, "${General::swroot}/accounting/bill"); $sizerrd = sprintf"%.2f", $sizerrd/(1024*1024); &ACCT::connectdb; #Get latest and earliest entry of DB my ($min,$max) = &ACCT::getminmax; $min=&getdate($min); $max=&getdate($max); #Print status table &Header::openbox('100%', 'left', $Lang::tr{'acct status'}); print< $Lang::tr{'name'} $Lang::tr{'acct value'} $Lang::tr{'acct dbsize'} $sizedb MB $Lang::tr{'acct rrdsize'} $sizerrd MB $Lang::tr{'acct oldestdb'} $min $Lang::tr{'acct latestdb'} $max
END &Header::closebox(); #print Database maintenance table &Header::openbox('100%', 'left', $Lang::tr{'acct dbmaintenance'}); print<
$Lang::tr{'acct task'} $Lang::tr{'acct parameter'} $Lang::tr{'acct action'}
$Lang::tr{'acct emptydb'}
$Lang::tr{'acct emptydbtraf'}
$Lang::tr{'acct delbefore'} (ACCT,ACCT_HIST)
END &Header::closebox(); #BackButton print<
END &Header::closebigbox(); &Header::closepage(); &ACCT::closedb; exit 0; } sub getdate{ #GET : Timestamp in seconds since 1.1.1970 #GIVES: Date in Format dd.mm.yyyy HH:MM:SS my $val = $_[0]; my $y=sprintf("%02d",(localtime($val))[5]-100); my $Y=sprintf("%04d",(localtime($val))[5]+1900); my $m=sprintf("%02d",(localtime($val))[4]+1); my $d=sprintf("%02d",(localtime($val))[3]); my $H=sprintf("%02d",(localtime($val))[2]); my $M=sprintf("%02d",(localtime($val))[1]); my $S=sprintf("%02d",(localtime($val))[0]); return "$d.$m.$Y $H:$M:$S"; } sub menu{ &Header::openbox('100%', 'left', $Lang::tr{'menu'}); print<
END if ($settings{'EXPERT'} eq 'on'){ print ""; } print<
END &Header::closebox(); } sub graphsite{ my $grmon=$_[0]; my $gryear=$_[1]; my $grhost=$_[2]; &Header::openpage("$Lang::tr{'acct host detail'} $grhost", 1, ''); &Header::openbigbox('100%', 'center'); &Header::openbox('100%', 'left', ); &generatemonthgraph($grmon,$gryear,$grhost); &Header::closebox(); &Header::closebigbox(); &Header::closepage(); exit 0; } sub generatemonthgraph{ my $grmon=$_[0]; my $gryear=$_[1]; my $grhost=$_[2]; my ($from,$till) = &ACCT::getmonth($grmon,$gryear); my @values=(); my $sth; my $cnt=0; #If we want to show Data from within last 2 months, get DATA from ACCT if ( ! $grmon < ($mon+1) && $gryear == ($year+1900)){ $sth=&ACCT::getmonthgraphdata("ACCT",$from,$till,$grhost); }else{ #If we want to show data from a date older than last two months, use ACCT_HIST $sth=&ACCT::getmonthgraphdata("ACCT_HIST",$from,$till,$grhost); } foreach( @$sth ) { $cnt++; foreach my $i (0..$#$_) { push (@{$values[$i]},($_->[$i])); } } for my $graph (GD::Graph::area->new(600,200)) { my $name = $cgiparams{'host'}; $graph->set( bgclr => 'white', fgclr => 'black', boxclr => '#eeeeee', accentclr => 'dblue', valuesclr => '#ffff77', labelclr => 'black', axislabelcl =>'black', legendclr =>'black', valuesclr =>'black', textclr =>'black', dclrs => [qw(lgreen lred)], x_label => $Lang::tr{'date'}, y_label => $Lang::tr{'acct mb'}, title => $name, y_long_ticks => 1, #x_label_skip => 3, #skip every 3 x-axis title x_label_position => 0, transparent => 0, ); $graph->set_legend("$Lang::tr{'acct traffic'}"); $graph->set(x_labels_vertical => 1, values_vertical => 1); my $gd=$graph->plot(\@values); open(IMG, '>/srv/web/ipfire/html/accounting/tmpgraph.png') or die $!; binmode IMG; print IMG $gd->png; } #Show Box with monthly graph for this host &Header::openbox('100%', 'left', $Lang::tr{'acct traffic monthly'}); print "
$grhost
"; print "$cgiparams{'traffic'}"; &Header::closebox(); print<
END } sub generatehourgraph{ my $grmon=$_[0]; my $gryear=$_[1]; my $grhost=$_[2]; my ($from,$till) = &ACCT::getmonth($grmon,$gryear); my @values=(); my $sth; my $cnt=0; #If we want to show Data from within last 2 months, get DATA from ACCT if ( ! $grmon < ($mon+1) && $gryear == ($year+1900)){ $sth=&ACCT::getgraphdata("ACCT",$from,$till,$grhost); }else{ #If we want to show data from a date older than last two months, use ACCT_HIST $sth=&ACCT::getgraphdata("ACCT_HIST",$from,$till,$grhost); } foreach( @$sth ) { $cnt++; foreach my $i (0..$#$_) { #print "$_->[$i] " if ($i == 1){ push (@{$values[$i]},($_->[$i]/1024/1024)); }else{ push (@{$values[$i]},$_->[$i]); } } } print"


"; for my $graph (GD::Graph::area->new(600,200)) { my $name = $cgiparams{'host'}; print STDERR "Processing $name mit sosse\n"; $graph->set( x_label => 'X Label', y_label => 'Y label', title => 'An Area Graph', #y_max_value => 40, #y_tick_number => 8, #y_label_skip => 2, #accent_treshold => 41, transparent => 0, ); $graph->set_legend( 'one', 'two' ); my $gd=$graph->plot(\@values); open(IMG, '>/srv/web/ipfire/html/test/file.png') or die $!; binmode IMG; print IMG $gd->png; } sleep 1; print "Tanzmaus"; } sub statusbox{ my $bgcolor1=''; my $bgcolor2=''; my $message; if ($proxsrv eq $Lang::tr{'stopped'}){ $bgcolor1="bgcolor='${Header::colourred}' align='center'"; $message="
$Lang::tr{'acct proxy_enable'}"; }else{ $bgcolor1="bgcolor='${Header::colourgreen}' align='center'"; } if ($proxlog eq $Lang::tr{'stopped'}){ $bgcolor2="bgcolor='${Header::colourred}' align='center'"; $message=$message."
$Lang::tr{'acct proxylog_enable'}"; }else{ $bgcolor2="bgcolor='${Header::colourgreen}' align='center'"; } &Header::openbox('100%', 'left', ); print< EOF if ($message){ print""; } print"
$Lang::tr{'service'} $Lang::tr{'status'}
$Lang::tr{'proxy'} $proxsrv
$Lang::tr{'logging'} $proxlog
$message
$Lang::tr{'acct nodata'}
"; &Header::closebox(); } sub calcbytes{ #GET: Value (bytes) #GIVES: Value (in MB,GB,TB) With Type ("MB","GB","TB") my $val=$_[0]; my $type; if (($val/1024) < 1024){ #Calc KB $val=sprintf "%.2f",$val/1024; $type=$Lang::tr{'acct kb'}; }elsif (($val/(1024*1024)) < 1024){ #Calc MB $val=sprintf "%.2f",$val/(1024*1024); $type=$Lang::tr{'acct mb'}; }elsif(($val/(1024*1024*1024)) < 1024){ #Calc GB $val=sprintf "%.2f",$val/(1024*1024*1024); $type=$Lang::tr{'acct gb'}; }elsif(($val/(1024*1024*1024*1024)) < 1024){ #Calc TB $val=sprintf "%.2f",$val/(1024*1024*1024*1024); $type=$Lang::tr{'acct tb'}; } return ($val,$type); } sub addressmgmnt{ #This function shows the site "address management" &Header::openpage("$Lang::tr{'acct addresses'}", 1, ''); &Header::openbigbox('100%', 'center'); &error; my $col1; my $host=0; my $cust=0; #Get all Addresses from DB my $res = &ACCT::getaddresses; &Header::openbox('100%', 'left',$Lang::tr{'acct edit_addr'} ); #When no address preselected, set COMPANYTYPE to "CUST" if ($cgiparams{'rdo_companytype'} eq ''){ $cgiparams{'rdo_companytype'} = 'CUST'; } $checked{'rdo_companytype'}{$cgiparams{'rdo_companytype'}} = 'CHECKED'; #NEW AddressBox print< END if($cgiparams{'update'} eq 'on'){ print""; print ""; }else{ print ""; } print"
$Lang::tr{'acct hint_hoster'}:
$Lang::tr{'acct companytype'} $Lang::tr{'acct customer'}   $Lang::tr{'acct hoster'} $Lang::tr{'acct bank'}
$Lang::tr{'acct company'} $Lang::tr{'acct iban'}*
$Lang::tr{'acct name1'}* $Lang::tr{'acct bic'}*
$Lang::tr{'acct str'} $Lang::tr{'acct blz'}
$Lang::tr{'acct str_nr'} $Lang::tr{'acct kto'}
$Lang::tr{'acct plz'} $Lang::tr{'acct email'}
$Lang::tr{'acct city'} $Lang::tr{'acct inet'}*
$Lang::tr{'acct hrb'}*
$Lang::tr{'acct ustid'}
$Lang::tr{'acct tel'}*
$Lang::tr{'acct fax'}*
*$Lang::tr{'acct optional'}
"; &Header::closebox(); #Upper BackButton print<
END #Check if we need to show HOSTBOX and/or CUSTBOX foreach my $row (@$res) { my ($gr,$comp,$type,$name1,$str,$nr,$plz,$city,$bank,$iban,$bic,$blz,$kto,$email,$inet,$hrb,$ustid,$tel,$fax) = @$row; if ($type eq 'HOST'){ $host=1; } if ($type eq 'CUST'){ $cust=1; } } #Show HOSTER Addresses if any if ($host){ $count=0; #EXISTING HOST BOX &Header::openbox('100%', 'left',$Lang::tr{'acct exst_host_addr'} ); my $float; print ""; foreach my $row (@$res) { #SET colors for tablerows $col="style='background-color:$color{'color22'}'"; $col1="style='background-color:#e2d8d8'"; my ($gr,$comp,$type,$name1,$str,$nr,$plz,$city,$bank,$iban,$bic,$blz,$kto,$email,$inet,$hrb,$ustid,$tel,$fax) = @$row; if ($cgiparams{'oldcompname'} eq $comp){ $col="style='background-color:yellow'"; $col1="style='background-color:yellow'"; } if ($type eq 'HOST'){ $count++; if($count % 2){ print"
"; }else{ print""; } print<
$Lang::tr{'acct company'} $Lang::tr{'acct bank'}
$comp
$name1 $Lang::tr{'acct bank'} $bank
$Lang::tr{'acct iban'} $iban
$str $nr $Lang::tr{'acct bic'} $bic
$plz $city $Lang::tr{'acct blz'} $blz
$Lang::tr{'acct kto'} $kto

END if (! $count % 2){ print""; } } } if ( ($count % 2)){ print""; } print ""; &Header::closebox(); }else{ &Header::openbox('100%', 'left',$Lang::tr{'acct exst_host_addr'} ); print $Lang::tr{'acct host empty'}; &Header::closebox(); } #Show CUSTOMER Addresses if any if($cust){ $count=0; #EXISTING CUSTOMER BOX &Header::openbox('100%', 'left',$Lang::tr{'acct exst_cust_addr'} ); print ""; foreach my $row (@$res) { #SET colors for tablerows $col="style='background-color:$color{'color22'}'"; my ($gr,$comp,$type,$name1,$str,$nr,$plz,$city,$bank,$iban,$bic,$blz,$kto,$email,$inet,$hrb,$ustid,$tel,$fax) = @$row; if ($cgiparams{'oldcompname'} eq $comp){ $col="style='background-color:yellow'"; } if ($type eq 'CUST'){ $count++; print"
"; print<
$Lang::tr{'acct company'}
$comp
$name1
$str $nr
$plz $city

END if(! ($count % 3)) { print""; } } } if ($count %2){ print""; } print""; &Header::closebox(); }else{ &Header::openbox('100%', 'left',$Lang::tr{'acct exst_cust_addr'} ); print $Lang::tr{'acct cust empty'}; &Header::closebox(); } &Header::closebigbox(); &Header::closepage(); exit 0; } sub checkfield{ my $field=$_[0]; my $fieldvalue=$_[1]; my $errormessage=$_[2]; if (!&validtextfield($fieldvalue)){ if(!$fieldvalue){ $errormessage.="$Lang::tr{'acct empty field'} $field
"; }else{ $errormessage.="$Lang::tr{'acct invalid'} $field
"; } } return $errormessage; } sub checkaddress{ #Check if an address with the same name alread exists if ($cgiparams{'update'} ne 'on'){ my $res=&ACCT::getaddresses; foreach my $row (@$res) { my ($anz,$name)=@$row; if ($name eq $cgiparams{'txt_company'}){ $errormessage.=$Lang::tr{'acct companyexists'}; } } } #Check Companyfield $errormessage=&checkfield($Lang::tr{'acct company'},$cgiparams{'txt_company'},$errormessage); #Check Name1 if($cgiparams{'txt_name1'}){ $errormessage=&checkfield($Lang::tr{'acct name1'},$cgiparams{'txt_name1'},$errormessage); } #Check Name2 if($cgiparams{'txt_name2'}){ $errormessage=&checkfield($Lang::tr{'acct name2'},$cgiparams{'txt_name2'},$errormessage); } #Check STREET $errormessage=&checkfield($Lang::tr{'acct str'},$cgiparams{'txt_str'},$errormessage); #Check STREET-NR if (! $cgiparams{'txt_str_nr'}){ $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct str_nr'}
"; }else{ if(! &validalphanumfield($cgiparams{'txt_str_nr'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct str_nr'}
"; } } #Check POSTAL-CODE if (! $cgiparams{'txt_plz'}){ $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct plz'}
"; }else{ if(! &validnumfield($cgiparams{'txt_plz'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct plz'}
"; } } #Check CITY $errormessage=&checkfield($Lang::tr{'acct city'},$cgiparams{'txt_city'},$errormessage); #Check E-MAIL if(! $cgiparams{'txt_email'}){ $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct email'}
"; }else{ if (! &General::validemail($cgiparams{'txt_email'})){ $errormessage.="
$Lang::tr{'acct invalid'} $Lang::tr{'acct email'}"; } } #Check all fields required for companytype "HOST" if ($cgiparams{'rdo_companytype'} eq 'HOST'){ #Check BANK $errormessage=&checkfield($Lang::tr{'acct bank'},$cgiparams{'txt_bank'},$errormessage); #Check IBAN - optional if($cgiparams{'txt_iban'}){ if(!&validalphanumfield($cgiparams{'txt_iban'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct iban'}
"; } } if($cgiparams{'txt_bic'}){ if(!&validalphanumfield($cgiparams{'txt_bic'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct bic'}
"; } } if(($cgiparams{'txt_iban'} && $cgiparams{'txt_blz'})||(!$cgiparams{'txt_iban'} && $cgiparams{'txt_blz'})){ #Check BLZ if(! &validnumfield($cgiparams{'txt_blz'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct blz'}
"; } #Check BANKACCOUNT if($cgiparams{'txt_kto'}){ if(! &validnumfield($cgiparams{'txt_kto'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct kto'}
"; } }elsif(!$cgiparams{'txt_kto'}){ $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct kto'}
"; } }elsif(!$cgiparams{'txt_iban'} && !$cgiparams{'txt_blz'}){ $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct blz'}
"; #Check BANKACCOUNT if($cgiparams{'txt_kto'}){ if(! &validnumfield($cgiparams{'txt_kto'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct kto'}
"; } }elsif(!$cgiparams{'txt_kto'}){ $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct kto'}
"; } } #Check Internet if($cgiparams{'txt_inet'}){ if ($cgiparams{'txt_inet'} =~ m/([a-z]+:\/\/)??([a-z0-9\-]+\.){1}(([a-z0-9\-]+\.){0,})([a-z0-9\-]+){1}/o) { $cgiparams{'txt_inet'}=$2.$3.$5; } else { $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct inet'}
"; } } #Check Hrb if($cgiparams{'txt_hrb'}){ $errormessage=&checkfield($Lang::tr{'acct hrb'},$cgiparams{'txt_hrb'},$errormessage); } } #Check Phone if($cgiparams{'txt_tel'}){ if (!&validphonefield($cgiparams{'txt_tel'})){ $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct tel'}
"; } } return $errormessage; } sub checkproxy{ if(-f "${General::swroot}/proxy/enable"){ $proxsrv=$Lang::tr{'running'}; }else{ $proxsrv=$Lang::tr{'stopped'}; } my $srce = "${General::swroot}/proxy/squid.conf"; my $string1 = 'access\.log'; open(FH, $srce); while(my $line = ) { if($line =~ m/$string1/) { $proxlog=$Lang::tr{'running'}; } } close FH; return; } sub validtextfield{ #GET: Input from a Textfield #GIVES: True if valid, false if not valid my $remark = $_[0]; # Each part should be at least two characters in length # but no more than 63 characters if (length ($remark) < 1 || length ($remark) > 255) { return 0;} # Only valid characters are a-z, A-Z, 0-9 and - if ($remark !~ /^[a-zäöüA-ZÖÄÜ0-9-.:;\&\|\ß_()\/\s]*$/) { return 0;} # First character can only be a letter or a digit if (substr ($remark, 0, 1) !~ /^[a-zäöüA-ZÖÄÜ0-9(]*$/) { return 0;} # Last character can only be a letter or a digit if (substr ($remark, -1, 1) !~ /^[a-zöäüA-ZÖÄÜ0-9.:;_)]*$/) { return 0;} return 1; } sub validnumfield{ #GET: Input from a numeric field #GIVES: True if valid, false if not valid my $num = $_[0]; # Each part should be at least two characters in length # but no more than 63 characters if (length ($num) < 1 || length ($num) > 255) { return 0;} # Only valid characters are a-z, A-Z, 0-9 and - if ($num !~ /^[0-9.]*$/) { return 0;} # First character can only be a letter or a digit if (substr ($num, 0, 1) !~ /^[0-9]*$/) { return 0;} # Last character can only be a letter or a digit if (substr ($num, -1, 1) !~ /^[0-9]*$/) { return 0;} return 1; } sub validphonefield{ #GET: Input from a numeric field #GIVES: True if valid, false if not valid my $num = $_[0]; # Each part should be at least two characters in length # but no more than 63 characters if (length ($num) < 1 || length ($num) > 255) { return 0;} # Only valid characters are a-z, A-Z, 0-9 and - if ($num !~ /^[0-9-()\+ ]*$/) { return 0;} # First character can only be a letter or a digit if (substr ($num, 0, 1) !~ /^[0-9(\+]*$/) { return 0;} # Last character can only be a digit if (substr ($num, -1, 1) !~ /^[0-9]*$/) { return 0;} return 1; } sub validalphanumfield{ #GET: Input from a numeric field #GIVES: True if valid, false if not valid my $remark = $_[0]; # Each part should be at least two characters in length # but no more than 63 characters if (length ($remark) < 1 || length ($remark) > 255) { return 0;} # Only valid characters are a-z, A-Z, 0-9 and - if ($remark !~ /^[0-9a-zA-Z]*$/) { return 0;} # First character can only be a letter or a digit if (substr ($remark, 0, 1) !~ /^[0-9A-Za-z]*$/) { return 0;} # Last character can only be a letter or a digit if (substr ($remark, -1, 1) !~ /^[0-9a-zA-Z]*$/) { return 0;} return 1; } sub error{ if ($errormessage) { &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); print "$errormessage\n"; print " \n"; &Header::closebox(); } } sub billgroupsite{ &Header::openpage("$Lang::tr{'acct billgroup'}", 1, ''); &Header::openbigbox('100%', 'center'); &error; my $host; my $cust; my @oldhosts; my $grp; my $mailrcpt; my $ccmailrcpt; #Get addresses from DB my $res = &ACCT::getaddresses; #Check if we need to show NEW-BillGROUP-BOX or Hint foreach my $row (@$res) { my ($gr,$comp,$type,$name1,$str,$nr,$plz,$city,$bank,$iban,$bic,$blz,$kto,$email,$inet,$hrb,$ust,$tel,$fax,$ccmail) = @$row; $grp=$gr; $mailrcpt=$email; $ccmailrcpt=$ccmail; if ($type eq 'HOST'){ $host=1; } if ($type eq 'CUST'){ $cust=1; } } if ($host && $cust){ #Fill CCMAIL if (!$cgiparams{'txt_ccmail'}){ $cgiparams{'txt_ccmail'}=$ccmailrcpt; } &Header::openbox('100%', 'left',"$Lang::tr{'acct edit_addr'}" ); print< END #Print Dropdown Menu for HOSTER and CUSTOMER print ""; print ""; print ""; #Print multiselectbox for hosts/users which should be part of this group my $hosts=&ACCT::gethosts; print""; print ""; #set right decimal seperator for cent value setlocale(LC_NUMERIC,"$mainsettings{'LANGUAGE'}_$uplang"); my $val=sprintf"%.3f",$cgiparams{'txt_cent'}; print""; #Optional note print""; print"
$Lang::tr{'name'}

$Lang::tr{'acct billtext1'}*

$Lang::tr{'acct hoster'}

$Lang::tr{'acct customer'}

$Lang::tr{'acct members'}

$Lang::tr{'acct cent'}$settings{'CURRENCY'}
*$Lang::tr{'acct optional'}


"; print"
"; #LOGO Upload if update eq 'on' if ($cgiparams{'update'} eq 'on'){ print< $Lang::tr{'acct logo upload'}
$Lang::tr{'acct logo'} END #Show Logo in webinterface with 1/2 size if set if (-f "$logopath/$cgiparams{'txt_billgroup'}/logo.png"){ print"$logopath/$cgiparams{"; }else{ print"
$Lang::tr{'no'}"; } #Show optional CC Mailadresses print<
$Lang::tr{'acct mailrcpt'}
$mailrcpt
$Lang::tr{'acct ccmail'}
END print""; } print"
"; #Print SAVE or EDIT Button if($cgiparams{'update'} eq 'on'){ print ""; print ""; print ""; }else{ print ""; } print"


"; &Header::closebox(); #BackButton print<
END #Show Box for fixed positions if update if ($cgiparams{'update'} eq 'on'){ &viewtablebillpos($cgiparams{'txt_billgroup'}); } if($grp >0){ &viewtablebillgroups; } }else{ &Header::openbox('100%', 'left',"$Lang::tr{'hint'}" ); print "$Lang::tr{'acct hint billgrp'}"; &Header::closebox(); #BackButton print<
END } &Header::closebigbox(); &Header::closepage(); exit 0; } sub viewtablebillgroups{ $count=0; &Header::openbox('100%', 'left',"$Lang::tr{'acct billgroup'}" ); #Get DATA from table BILLINGGRP my $res = &ACCT::getbillgroups; #Print table billinggroup print< $Lang::tr{'name'} $Lang::tr{'acct hoster'} $Lang::tr{'acct customer'} $Lang::tr{'acct members'} END foreach my $line (@$res){ $count++; if($count % 2){ $col="style='background-color:$color{'color22'}'"; }else{ $col="style='background-color:$color{'color20'}'"; } my ($name,$host,$cust,$txt,$amount,$cent) = @$line; print< $name $host $cust $amount END my $members=&ACCT::listhosts($name); my @mem=split(/\|/,$members); my $msg; foreach my $m (@mem){ $msg.=$m."\n"; } print"$Lang::tr{'acct"; print<
END } print ""; &ACCT::closedb; &Header::closebox(); } sub viewtablehosts{ $dbh=&ACCT::connectdb; &Header::openbox('100%', 'left', $Lang::tr{'acct hosts'}); my $mon=$_[0]; my $year=$_[1]; my ($from,$till)=&ACCT::getmonth($mon,$year); $count=0; #Menu to display another month print<
$Lang::tr{'acct month'} $Lang::tr{'acct year'}

END #View table with all hosts print< $Lang::tr{'name'} $Lang::tr{'acct traffic'} $Lang::tr{'from'} $Lang::tr{'to'} END my $res = $dbh->selectall_arrayref("SELECT SUM(BYTES),min(TIME_RUN),max(TIME_RUN),NAME from ACCT where TIME_RUN between ".$from." and ".$till." group by NAME;"); my $sumbytes; my $type; my $lineval; if (@$res){ foreach my $row (@$res) { $count++; $lineval=''; $type=''; if($count % 2){ $col="background-color:$color{'color22'};"; }else{ $col="background-color:$color{'color20'};"; } my ($bytes, $mintime, $maxtime, $name) = @$row; $sumbytes +=$bytes; ($lineval,$type) = &calcbytes($bytes); #Print Line print"$name$lineval $type".&getdate($mintime)."".&getdate($maxtime).""; print<
END } }else{ print "
$Lang::tr{'acct no data'}"; } print ""; &Header::closebox(); &ACCT::closedb; } sub viewtablebillpos{ my $grp=$_[0]; #BOX for extra billpositions &Header::openbox('100%', 'left',"$Lang::tr{'acct fix billpos'} $grp" ); #Table for optional billpositions print< END #Fill Table for extra billpositions if any if ($cgiparams{'update'} eq 'on'){ my $res = &ACCT::getextrabillpos($cgiparams{'txt_billgroup'}); $count=0; foreach my $line (@$res){ $count++; if($count % 2){ $col="style='background-color:$color{'color22'}'"; }else{ $col="style='background-color:$color{'color20'}'"; } my ($grp,$amnt,$pos,$price) = @$line; setlocale(LC_NUMERIC,"$mainsettings{'LANGUAGE'}_$uplang"); my $locale_price=sprintf"%.2f",$price; print ""; print ""; } } print<
$Lang::tr{'acct amount'} $Lang::tr{'acct name'} $Lang::tr{'acct price pp'}
$amnt$pos$locale_price $settings{'CURRENCY'}"; print ""; print ""; print "

END &Header::closebox(); } sub billoverview{ my $grp=shift; my $col; my $count=0; #Open site &Header::openpage($Lang::tr{'acct billoverview'}, 1, ''); &Header::openbigbox('100%', 'center'); &Header::openbox('100%', 'left', $grp); my $res=&ACCT::getbills($grp); if (@$res > 0){ print< $Lang::tr{'acct nr'} $Lang::tr{'acct path'} $Lang::tr{'name'} $Lang::tr{'acct generated'} END foreach my $row (@$res){ $count++; if($count % 2){ $col="style='background-color:$color{'color22'}'"; }else{ $col="style='background-color:$color{'color20'}'"; } my ($no,$path,$name,$date,$dbgrp) = @$row; print "$no$path$name$date"; print "
"; print ""; my $file="$path/$name"; print ""; print ""; print"
"; } print "
"; }else{ print "
$Lang::tr{'acct no data'}"; } &Header::closebox(); #BackButton print<
END &Header::closebigbox(); &Header::closepage(); exit 0; } sub checkmailsettings{ #Check if mailserver is an ip address or a domain if ($cgiparams{'txt_mailserver'} =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/){ if (! &General::validip($cgiparams{'txt_mailserver'})){ $errormessage.="$Lang::tr{'acct invalid mailip'} $cgiparams{'txt_mailserver'}
"; } }elsif(! &General::validfqdn($cgiparams{'txt_mailserver'})){ $errormessage.="$Lang::tr{'acct invalid mailfqdn'} $cgiparams{'txt_mailserver'}
"; } #Check valid mailserverport if($cgiparams{'txt_mailport'} < 1 || $cgiparams{'txt_mailport'} > 65535){ $errormessage.="$Lang::tr{'acct invalid mailport'} $cgiparams{'txt_mailport'}
"; } #Check valid sender if(! $cgiparams{'txt_mailsender'}){ $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct mailsender'}
"; }else{ if (! &General::validemail($cgiparams{'txt_mailsender'})){ $errormessage.="
$Lang::tr{'acct invalid'} $Lang::tr{'acct mailsender'}
"; } } return $errormessage; }