2013-08-28 22:47:04 +02:00
< ? php
/**
* File : trafficdata . php .
* Author : Ulrich Block
* Contact : < ulrich . block @ easy - wi . com >
*
* This file is part of Easy - WI .
*
* Easy - WI 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 .
*
* Easy - WI 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 Easy - WI . If not , see < http :// www . gnu . org / licenses />.
*
* Diese Datei ist Teil von Easy - WI .
*
* Easy - WI ist Freie Software : Sie koennen es unter den Bedingungen
* der GNU General Public License , wie von der Free Software Foundation ,
* Version 3 der Lizenz oder ( nach Ihrer Wahl ) jeder spaeteren
* veroeffentlichten Version , weiterverbreiten und / oder modifizieren .
*
* Easy - WI wird in der Hoffnung , dass es nuetzlich sein wird , aber
* OHNE JEDE GEWAEHELEISTUNG , bereitgestellt ; sogar ohne die implizite
* Gewaehrleistung der MARKTFAEHIGKEIT oder EIGNUNG FUER EINEN BESTIMMTEN ZWECK .
* Siehe die GNU General Public License fuer weitere Details .
*
* Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
* Programm erhalten haben . Wenn nicht , siehe < http :// www . gnu . org / licenses />.
*/
ini_set ( 'display_errors' , 1 );
error_reporting ( E_ALL | E_STRICT );
if ( isset ( $_SERVER [ 'REMOTE_ADDR' ])) {
2013-10-13 11:42:31 +02:00
$remoteip = $_SERVER [ 'REMOTE_ADDR' ];
2013-08-28 22:47:04 +02:00
} else {
if ( isset ( $argv [ 1 ])) {
2013-10-13 11:42:31 +02:00
$maxTime = $argv [ 1 ];
2013-08-28 22:47:04 +02:00
} else {
$maxTime = 60 ;
}
if ( isset ( $argv [ 2 ])) {
2013-10-13 11:42:31 +02:00
$memoryLimit = $argv [ 2 ];
2013-08-28 22:47:04 +02:00
} else {
$memoryLimit = '64M' ;
}
ini_set ( 'max_execution_time' , $maxTime );
ini_set ( 'memory_limit' , $memoryLimit );
set_time_limit ( $maxTime );
print " The time is now: " . ini_get ( 'max_execution_time' ) . " \r \n " ;
print " The memory limit is now: " . ini_get ( 'memory_limit' ) . " \r \n " ;
}
2013-10-05 13:39:56 +02:00
if ( ! isset ( $remoteip ) or $_SERVER [ 'SERVER_ADDR' ] == $remoteip ) {
2013-09-27 08:22:09 +02:00
define ( 'EASYWIDIR' , dirname ( __FILE__ ));
include ( EASYWIDIR . '/stuff/vorlage.php' );
include ( EASYWIDIR . '/stuff/class_validator.php' );
include ( EASYWIDIR . '/stuff/functions.php' );
include ( EASYWIDIR . '/stuff/settings.php' );
include ( EASYWIDIR . '/stuff/keyphrasefile.php' );
2013-09-29 15:29:58 +02:00
$query = $sql -> prepare ( " SELECT `type`,`statip`,AES_DECRYPT(`dbname`,:aeskey) AS `decpteddbname`,AES_DECRYPT(`dbuser`,:aeskey) AS `decpteddbuser`,AES_DECRYPT(`dbpassword`,:aeskey) AS `decpteddbpassword`,`table_name`,`column_sourceip`,`column_destip`,`column_byte`,`column_date` FROM `traffic_settings` LIMIT 1 " );
2013-10-05 13:39:56 +02:00
$query -> execute ( array ( ':aeskey' => $aeskey ));
2013-08-28 22:47:04 +02:00
foreach ( $query -> fetchAll ( PDO :: FETCH_ASSOC ) as $row ) {
2013-10-13 11:42:31 +02:00
$stats_databanktype = $row [ 'type' ];
$stats_host = $row [ 'statip' ];
$stats_db = $row [ 'decpteddbname' ];
$stats_user = $row [ 'decpteddbuser' ];
$stats_pwd = $row [ 'decpteddbpassword' ];
$table_name = $row [ 'table_name' ];
$column_sourceip = $row [ 'column_sourceip' ];
$column_destip = $row [ 'column_destip' ];
$column_byte = $row [ 'column_byte' ];
$column_date = $row [ 'column_date' ];
2013-08-28 22:47:04 +02:00
}
try {
$sql2 = new PDO ( " $stats_databanktype :host= $stats_host ;dbname= $stats_db " , $stats_user , $stats_pwd );
}
catch ( PDOException $error ) {
print $error -> getMessage ();
die ( " Could not connect to external server \r \n " );
}
function searchinnerarray ( $value , $array ) {
foreach ( $array as $key => $ips ) {
if ( in_array ( $value , $ips )) {
2013-10-13 11:42:31 +02:00
$serverid = $key ;
2013-08-28 22:47:04 +02:00
}
}
if ( isset ( $serverid )) {
return $serverid ;
}
}
2013-09-29 15:29:58 +02:00
$query = $sql -> prepare ( " SELECT `ips`,`resellerid`,`resellersid` FROM `resellerdata` " );
2013-08-28 22:47:04 +02:00
$query -> execute ();
foreach ( $query -> fetchAll ( PDO :: FETCH_ASSOC ) as $row ) {
2013-10-13 11:42:31 +02:00
$ids = $row [ 'resellerid' ] . '-' . $row [ 'resellersid' ];
2013-09-08 17:21:34 +02:00
$userips [ $ids ] = ipstoarray ( $row [ 'ips' ]);
2013-08-28 22:47:04 +02:00
}
2013-09-29 15:29:58 +02:00
$query = $sql -> prepare ( " SELECT `id`,`ip`,`ips` FROM `virtualcontainer` " );
2013-08-28 22:47:04 +02:00
$query -> execute ();
foreach ( $query -> fetchAll ( PDO :: FETCH_ASSOC ) as $row ) {
unset ( $vserverip );
2013-10-05 13:39:56 +02:00
$vserverip [] = $row [ 'ip' ];
2013-10-13 11:42:31 +02:00
$vserverid = $row [ 'id' ];
2013-08-28 22:47:04 +02:00
foreach ( ipstoarray ( $row [ 'ips' ]) as $vip ) {
2013-10-05 13:39:56 +02:00
$vserverip [] = $vip ;
2013-08-28 22:47:04 +02:00
}
2013-10-05 13:39:56 +02:00
$vserverips [ $vserverid ] = $vserverip ;
2013-08-28 22:47:04 +02:00
}
2013-09-29 15:29:58 +02:00
$query = $sql2 -> prepare ( " SHOW PROCESSLIST " );
2013-08-28 22:47:04 +02:00
$query -> execute ();
print " Killing active locks and threads regarding database $stats_db\r\n " ;
foreach ( $query -> fetchAll ( PDO :: FETCH_ASSOC ) as $row ) {
2013-10-03 12:49:13 +02:00
list ( $host ) = explode ( ':' , $row [ 'Host' ]);
2013-10-05 13:39:56 +02:00
if ( $host == 'localhost' and $row [ 'db' ] == $stats_db ) {
2013-09-29 15:29:58 +02:00
$query2 = $sql2 -> prepare ( " KILL ? " );
2013-08-28 22:47:04 +02:00
$query2 -> execute ( array ( $row [ 'Id' ]));
}
}
2013-10-13 11:42:31 +02:00
$Count = $sql2 -> prepare ( " SELECT COUNT(`id`) AS `amount` FROM ` $table_name ` " );
2013-08-28 22:47:04 +02:00
$Count -> execute ();
2013-09-29 15:29:58 +02:00
$pass = 1 ;
2013-10-13 11:42:31 +02:00
$theCount = $Count -> fetchColumn ();
2013-08-28 22:47:04 +02:00
while ( $theCount > 100 ) {
2013-09-29 15:29:58 +02:00
$query = $sql2 -> prepare ( " SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED " );
2013-08-28 22:47:04 +02:00
$query -> execute ();
2013-09-29 15:29:58 +02:00
$query = $sql2 -> prepare ( " SELECT `id`,` $column_sourceip `,` $column_destip `,` $column_byte `,` $column_date ` FROM ` $table_name ` ORDER BY `id` LIMIT 300 " );
2013-08-28 22:47:04 +02:00
$query -> execute ();
2013-10-13 11:42:31 +02:00
$trafficData = $query -> fetchAll ( PDO :: FETCH_ASSOC );
2013-09-29 15:29:58 +02:00
$query = $sql2 -> prepare ( " SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ " );
2013-08-28 22:47:04 +02:00
$query -> execute ();
2013-09-29 15:29:58 +02:00
$query = $sql2 -> prepare ( " DELETE FROM ` $table_name ` ORDER BY `id` LIMIT 300 " );
2013-08-28 22:47:04 +02:00
$query -> execute ();
2013-10-13 11:42:31 +02:00
$currentCount = $theCount ;
2013-08-28 22:47:04 +02:00
$Count -> execute ();
2013-10-13 11:42:31 +02:00
$theCount = $Count -> fetchColumn ();
2013-08-28 22:47:04 +02:00
print " Run: $pass ; Found $currentCount traffic entries; Entries left after Run: $theCount\r\n " ;
$pass ++ ;
2013-09-29 15:29:58 +02:00
$serverIDs = array ();
2013-08-28 22:47:04 +02:00
foreach ( $trafficData as $id => $row ) {
unset ( $trafficData [ $id ]);
unset ( $serverid );
2013-10-13 11:42:31 +02:00
$data_id = $row [ 'id' ];
$ip_src = $row [ $column_sourceip ];
$ip_dst = $row [ $column_destip ];
$bytes = $row [ $column_byte ];
$stamp_updated = $row [ $column_date ];
2013-10-03 12:49:13 +02:00
$date = explode ( ' ' , $row [ $column_date ]);
2013-09-08 17:21:34 +02:00
$hour = explode ( ':' , $date [ 1 ]);
2013-10-13 11:42:31 +02:00
$day = $date [ 0 ] . ' ' . $hour [ 0 ] . " :00:00 " ;
2013-08-28 22:47:04 +02:00
if ( searchinnerarray ( $ip_src , $vserverips ) or searchinnerarray ( $ip_dst , $vserverips )) {
if ( searchinnerarray ( $ip_src , $vserverips )) {
$direction = " out " ;
$serverid = searchinnerarray ( $ip_src , $vserverips );
} else if ( searchinnerarray ( $ip_dst , $vserverips )) {
$direction = " in " ;
$serverid = searchinnerarray ( $ip_dst , $vserverips );
}
if ( isset ( $serverid ) and isset ( $serverIDs [ $serverid ])) {
2013-10-13 11:42:31 +02:00
$userid = $serverIDs [ $serverid ][ 'userid' ];
$resellerid = $serverIDs [ $serverid ][ 'resellerid' ];
2013-08-28 22:47:04 +02:00
} else if ( isset ( $serverid )) {
2013-09-29 15:29:58 +02:00
$query2 = $sql -> prepare ( " SELECT `userid`,`resellerid` FROM `virtualcontainer` WHERE `id`=? LIMIT 1 " );
2013-08-28 22:47:04 +02:00
$query2 -> execute ( array ( $serverid ));
foreach ( $query2 -> fetchAll ( PDO :: FETCH_ASSOC ) as $row ) {
2013-10-13 11:42:31 +02:00
$userid = $row [ 'userid' ];
$resellerid = $row [ 'resellerid' ];
2013-10-05 13:39:56 +02:00
$serverIDs [ $serverid ][ 'userid' ] = $userid ;
$serverIDs [ $serverid ][ 'resellerid' ] = $resellerid ;
2013-08-28 22:47:04 +02:00
}
}
} else if ( searchinnerarray ( $ip_src , $userips )) {
$direction = " out " ;
2013-09-29 15:29:58 +02:00
$serverid = 0 ;
2013-08-28 22:47:04 +02:00
$userids = searchinnerarray ( $ip_src , $userips );
$uids = explode ( " - " , $userids );
2013-10-13 11:42:31 +02:00
$userid = $uids [ 0 ];
$resellerid = $uids [ 1 ];
2013-08-28 22:47:04 +02:00
} else if ( searchinnerarray ( $ip_dst , $userips )) {
$direction = " in " ;
2013-09-29 15:29:58 +02:00
$serverid = 0 ;
2013-08-28 22:47:04 +02:00
$userids = searchinnerarray ( $ip_dst , $userips );
$uids = explode ( " - " , $userids );
2013-10-13 11:42:31 +02:00
$userid = $uids [ 0 ];
$resellerid = $uids [ 1 ];
2013-08-28 22:47:04 +02:00
}
if ( isset ( $serverid )) {
2013-10-13 13:11:38 +02:00
if ( $direction == " in " ) {
2013-10-13 11:42:31 +02:00
$ip = $ip_dst ;
2013-08-28 22:47:04 +02:00
$ipcase = " ip_dst " ;
} else {
2013-10-13 11:42:31 +02:00
$ip = $ip_src ;
2013-08-28 22:47:04 +02:00
$ipcase = " ip_src " ;
}
2013-09-29 15:29:58 +02:00
$query2 = $sql -> prepare ( " SELECT `id` FROM `traffic_data` WHERE `ip`=? AND `day`=? AND `userid`=? AND `resellerid`=? LIMIT 1 " );
2013-08-28 22:47:04 +02:00
$query2 -> execute ( array ( $ip , $day , $userid , $resellerid ));
foreach ( $query2 -> fetchAll ( PDO :: FETCH_ASSOC ) as $row ) {
2013-10-13 11:42:31 +02:00
$id = $row [ 'id' ];
2013-08-28 22:47:04 +02:00
}
if ( $query2 -> rowcount () == 1 ) {
2013-09-29 15:29:58 +02:00
$query2 = $sql -> prepare ( " UPDATE `traffic_data` SET ` $direction `=` $direction `+?,`serverid`=? WHERE `id`=? LIMIT 1 " );
2013-08-28 22:47:04 +02:00
$query2 -> execute ( array ( $bytes , $id , $serverid ));
} else {
2013-09-29 15:29:58 +02:00
$query2 = $sql -> prepare ( " INSERT INTO `traffic_data` (`serverid`,` $direction `,`ip`,`day`,`userid`,`resellerid`) VALUES (?,?,?,?,?,?) " );
2013-08-28 22:47:04 +02:00
$query2 -> execute ( array ( $serverid , $bytes , $ip , $day , $userid , $resellerid ));
}
}
}
}
print " Truncating $table_name\r\n " ;
2013-09-29 15:29:58 +02:00
$query = $sql2 -> prepare ( " TRUNCATE TABLE ` $table_name ` " );
2013-08-28 22:47:04 +02:00
$query -> execute ();
2013-09-29 15:29:58 +02:00
$query = $sql2 -> prepare ( " OPTIMIZE TABLE ` $table_name ` " );
2013-08-28 22:47:04 +02:00
$query -> execute ();
2013-10-13 11:42:31 +02:00
$sql = null ;
$sql2 = null ;
2013-08-28 22:47:04 +02:00
}