<?php if (!defined('MASTER_CRONJOB')) die('You cannot access this file directly!');

/**
 * This file is part of the Froxlor project.
 * Copyright (c) 2003-2009 the SysCP Team (see authors).
 * Copyright (c) 2010 the Froxlor Team (see authors).
 *
 * For the full copyright and license information, please view the COPYING
 * file that was distributed with this source code. You can also view the
 * COPYING file online at http://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  (c) the authors
 * @author     Florian Lippert <flo@syscp.org> (2003-2009)
 * @author     Froxlor team <team@froxlor.org> (2010-)
 * @license    GPLv2 http://files.froxlor.org/misc/COPYING.txt
 * @package    Cron
 *
 */

// Check Traffic-Lock
if (function_exists('pcntl_fork')) {
	$TrafficLock = makeCorrectFile(dirname($lockfile)."/froxlor_cron_traffic.lock");
	if (file_exists($TrafficLock)
		&& is_numeric($TrafficPid=file_get_contents($TrafficLock))
	) {
		if (function_exists('posix_kill')) {
			$TrafficPidStatus = @posix_kill($TrafficPid,0);
		} else {
			system("kill -CHLD " . $TrafficPid . " 1> /dev/null 2> /dev/null", $TrafficPidStatus);
			$TrafficPidStatus = $TrafficPidStatus ? false : true;
		}
		if ($TrafficPidStatus) {
			$cronlog->logAction(CRON_ACTION, LOG_INFO, 'Traffic Run already in progress');
			return 1;
		}
	}
	// Create Traffic Log and Fork
	// We close the database - connection before we fork, so we don't share resources with the child
	Database::needRoot(false); // this forces the connection to be set to null
	$TrafficPid = pcntl_fork();
	// Parent
	if ($TrafficPid) {
		file_put_contents($TrafficLock, $TrafficPid);
		// unnecessary to recreate database connection here
		return 0;

	}
	//Child
	elseif ($TrafficPid == 0) {
		posix_setsid();
		fclose($debugHandler);
		// re-create db
		Database::needRoot(false);
	}
	//Fork failed
	else {
		return 1;
	}

} else {
	if (extension_loaded('pcntl')) {
		$msg = "PHP compiled with pcntl but pcntl_fork function is not available.";
	} else {
		$msg = "PHP compiled without pcntl.";
	}
	$cronlog->logAction(CRON_ACTION, LOG_INFO, $msg." Not forking traffic-cron, this may take a long time!");
}

require_once makeCorrectFile(dirname(__FILE__) . '/cron_traffic.inc.functions.php');

/**
 * TRAFFIC AND DISKUSAGE MESSURE
 */
$cronlog->logAction(CRON_ACTION, LOG_INFO, 'Traffic run started...');
$admin_traffic = array();
$domainlist = array();
$speciallogfile_domainlist = array();
$result_domainlist_stmt = Database::query("
	SELECT `id`, `domain`, `customerid`, `parentdomainid`, `speciallogfile`
	FROM `" . TABLE_PANEL_DOMAINS . "` WHERE `aliasdomain` IS NULL AND `email_only` <> '1';
");

while ($row_domainlist = $result_domainlist_stmt->fetch(PDO::FETCH_ASSOC)) {

	if (!isset($domainlist[$row_domainlist['customerid']])) {
		$domainlist[$row_domainlist['customerid']] = array();
	}

	$domainlist[$row_domainlist['customerid']][$row_domainlist['id']] = $row_domainlist['domain'];

	if ($row_domainlist['parentdomainid'] == '0'
		&& $row_domainlist['speciallogfile'] == '1'
	) {
		if (!isset($speciallogfile_domainlist[$row_domainlist['customerid']])) {
			$speciallogfile_domainlist[$row_domainlist['customerid']] = array();
		}
		$speciallogfile_domainlist[$row_domainlist['customerid']][$row_domainlist['id']] = $row_domainlist['domain'];
	}
}

$mysqlusage_all = array();
$databases_stmt = Database::query("SELECT * FROM " . TABLE_PANEL_DATABASES . " ORDER BY `dbserver`");
$last_dbserver = 0;

$databases_list = array();
Database::needRoot(true);
$databases_list_result_stmt = Database::query("SHOW DATABASES");
while ($databases_list_row = $databases_list_result_stmt->fetch(PDO::FETCH_ASSOC)) {
	$databases_list[] = strtolower($databases_list_row['Database']);
}

while ($row_database = $databases_stmt->fetch(PDO::FETCH_ASSOC)) {

	if ($last_dbserver != $row_database['dbserver']) {
		Database::needRoot(true, $row_database['dbserver']);
		$last_dbserver = $row_database['dbserver'];

		$database_list = array();
		$databases_list_result_stmt = Database::query("SHOW DATABASES");
		while ($databases_list_row = $databases_list_result_stmt->fetch(PDO::FETCH_ASSOC)) {
			$databases_list[] = strtolower($databases_list_row['Database']);
		}
	}

	if (in_array(strtolower($row_database['databasename']), $databases_list)) {
		// sum up data_length and index_length
		$mysql_usage_result_stmt = Database::prepare("
			SELECT SUM(data_length + index_length) AS customerusage
			FROM information_schema.TABLES
			WHERE table_schema = :database
			GROUP BY table_schema;
		");
		// get the result
		$mysql_usage_row = Database::pexecute_first($mysql_usage_result_stmt, array('database' => $row_database['databasename']));
		// initialize counter for customer
		if (!isset($mysqlusage_all[$row_database['customerid']])) {
			$mysqlusage_all[$row_database['customerid']] = 0;
		}
		// sum up result
		$mysqlusage_all[$row_database['customerid']] += floatval($mysql_usage_row['customerusage']);
	} else {
		$cronlog->logAction(CRON_ACTION, LOG_WARNING, "Seems like the database " . $row_database['databasename'] . " had been removed manually.");
	}
}

Database::needRoot(false);

// We are using the file-system quota, this will speed up the diskusage - collection
if (Settings::Get('system.diskquota_enabled')) {
	$usedquota = getFilesystemQuota();
}

/**
 * MAIL-Traffic
 */
if (Settings::Get("system.mailtraffic_enabled")) {
	$mailTrafficCalc = new MailLogParser(Settings::Get("system.last_traffic_run"));
}

$result_stmt = Database::query("SELECT * FROM `" . TABLE_PANEL_CUSTOMERS . "` ORDER BY `customerid` ASC");

while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
	/**
	 * HTTP-Traffic
	 */
	$cronlog->logAction(CRON_ACTION, LOG_INFO, 'http traffic for ' . $row['loginname'] . ' started...');
	$httptraffic = 0;

	if (isset($domainlist[$row['customerid']])
		&& is_array($domainlist[$row['customerid']])
		&& count($domainlist[$row['customerid']]) != 0
	) {
		// Examining which caption to use for default webalizer stats...
		if ($row['standardsubdomain'] != '0') {
			// ... of course we'd prefer to use the standardsubdomain ...
			$caption = $domainlist[$row['customerid']][$row['standardsubdomain']];
		} else {
			// ... but if there is no standardsubdomain, we have to use the loginname ...
			$caption = $row['loginname'];

			// ... which results in non-usable links to files in the stats, so lets have a look if we find a domain which is not speciallogfiledomain
			foreach ($domainlist[$row['customerid']] as $domainid => $domain) {

				if (!isset($speciallogfile_domainlist[$row['customerid']])
					|| !isset($speciallogfile_domainlist[$row['customerid']][$domainid])
				) {
					$caption = $domain;
					break;
				}
			}
		}

		$httptraffic = 0;
		reset($domainlist[$row['customerid']]);

		if (isset($speciallogfile_domainlist[$row['customerid']])
			&& is_array($speciallogfile_domainlist[$row['customerid']])
			&& count($speciallogfile_domainlist[$row['customerid']]) != 0
		) {
			reset($speciallogfile_domainlist[$row['customerid']]);
			if (Settings::Get('system.awstats_enabled') == '0') {
				foreach ($speciallogfile_domainlist[$row['customerid']] as $domainid => $domain) {
					$httptraffic+= floatval(callWebalizerGetTraffic($row['loginname'] . '-' . $domain, $row['documentroot'] . '/webalizer/' . $domain . '/', $domain, $domainlist[$row['customerid']]));
				}
			}
		}

		reset($domainlist[$row['customerid']]);

		// callAwstatsGetTraffic is called ONLY HERE and
		// *not* also in the special-logfiles-loop, because the function
		// will iterate through all customer-domains and the awstats-configs
		// know the logfile-name, #246
		if (Settings::Get('system.awstats_enabled') == '1') {
			$httptraffic+= floatval(callAwstatsGetTraffic($row['customerid'], $row['documentroot'] . '/awstats/', $domainlist[$row['customerid']]));
		} else {
			$httptraffic+= floatval(callWebalizerGetTraffic($row['loginname'], $row['documentroot'] . '/webalizer/', $caption, $domainlist[$row['customerid']]));
		}

		// make the stuff readable for the customer, #258
		makeChownWithNewStats($row);
	}

	/**
	 * FTP-Traffic
	 */
	$cronlog->logAction(CRON_ACTION, LOG_INFO, 'ftp traffic for ' . $row['loginname'] . ' started...');
	$ftptraffic_stmt = Database::prepare("
		SELECT SUM(`up_bytes`) AS `up_bytes_sum`, SUM(`down_bytes`) AS `down_bytes_sum`
		FROM `" . TABLE_FTP_USERS . "` WHERE `customerid` = :customerid
	");
	$ftptraffic = Database::pexecute_first($ftptraffic_stmt, array('customerid' => $row['customerid']));

	if (!is_array($ftptraffic)) {
		$ftptraffic = array(
			'up_bytes_sum' => 0,
			'down_bytes_sum' => 0
		);
	}

	$upd_stmt = Database::prepare("
		UPDATE `" . TABLE_FTP_USERS . "` SET `up_bytes` = '0', `down_bytes` = '0' WHERE `customerid` = :customerid
	");
	Database::pexecute($upd_stmt, array('customerid' => $row['customerid']));

	/**
	 * Mail-Traffic
	 */
	$mailtraffic = 0;
	if (Settings::Get("system.mailtraffic_enabled")) {
		$cronlog->logAction(CRON_ACTION, LOG_INFO, 'mail traffic usage for ' . $row['loginname'] . " started...");

		$currentDate = date("Y-m-d");

		$domains_stmt = Database::prepare("SELECT domain FROM `" . TABLE_PANEL_DOMAINS . "` WHERE `customerid` = :cid");
		Database::pexecute($domains_stmt, array("cid" => $row['customerid']));
		while ($domainRow = $domains_stmt->fetch(PDO::FETCH_ASSOC)) {
			$domainMailTraffic = $mailTrafficCalc->getDomainTraffic($domainRow["domain"]);
			if (!is_array($domainMailTraffic)) { continue; }

			foreach ($domainMailTraffic as $dateTraffic => $dayTraffic) {
				$dayTraffic = floatval($dayTraffic / 1024);

				list($year, $month, $day) = explode("-", $dateTraffic);
				if ($dateTraffic == $currentDate) {
					$mailtraffic = $dayTraffic;
				} else {
					// Check if an entry for the given day exists
					$stmt = Database::prepare("SELECT * FROM `" . TABLE_PANEL_TRAFFIC . "`
						WHERE `customerid` = :cid
						AND `year` = :year
						AND `month` = :month
						AND `day` = :day");
					$params = array(
						"cid" => $row['customerid'],
						"year" => $year,
						"month" => $month,
						"day" => $day
					);
					Database::pexecute($stmt, $params);
					if ($stmt->rowCount() > 0) {
						$updRow = $stmt->fetch(PDO::FETCH_ASSOC);
						$upd_stmt = Database::prepare("UPDATE `" . TABLE_PANEL_TRAFFIC . "` SET
							`mail` = :mail
							WHERE `id` = :id");
						Database::pexecute($upd_stmt, array("mail" => $updRow['mail'] + $dayTraffic, "id" => $updRow['id']));
					}
				}
			}
		}
	}

	/**
	 * Total Traffic
	 */
	$cronlog->logAction(CRON_ACTION, LOG_INFO, 'total traffic for ' . $row['loginname'] . ' started');
	$current_traffic = array();
	$current_traffic['http'] = floatval($httptraffic);
	$current_traffic['ftp_up'] = floatval(($ftptraffic['up_bytes_sum'] / 1024));
	$current_traffic['ftp_down'] = floatval(($ftptraffic['down_bytes_sum'] / 1024));
	$current_traffic['mail'] = floatval($mailtraffic);
	$current_traffic['all'] = $current_traffic['http'] + $current_traffic['ftp_up'] + $current_traffic['ftp_down'] + $current_traffic['mail'];

	$ins_data = array(
		'customerid' => $row['customerid'],
		'year' => date('Y', time()),
		'month' => date('m', time()),
		'day' => date('d', time()),
		'stamp' => time(),
		'http' => $current_traffic['http'],
		'ftp_up' => $current_traffic['ftp_up'],
		'ftp_down' => $current_traffic['ftp_down'],
		'mail' => $current_traffic['mail']
	);
	$ins_stmt = Database::prepare("
		INSERT INTO `" . TABLE_PANEL_TRAFFIC . "` SET
		`customerid` = :customerid,
		`year` = :year,
		`month` = :month,
		`day` = :day,
		`stamp` = :stamp,
		`http` = :http,
		`ftp_up` = :ftp_up,
		`ftp_down` = :ftp_down,
		`mail` = :mail
	");
	Database::pexecute($ins_stmt, $ins_data);

	$sum_month_traffic_stmt = Database::prepare("
		SELECT SUM(`http`) AS `http`, SUM(`ftp_up`) AS `ftp_up`, SUM(`ftp_down`) AS `ftp_down`, SUM(`mail`) AS `mail`
		FROM `" . TABLE_PANEL_TRAFFIC . "` WHERE `year` = :year AND `month` = :month AND `customerid` = :customerid
	");
	$sum_month_traffic = Database::pexecute_first($sum_month_traffic_stmt, array('year' => date('Y', time()), 'month' => date('m', time()), 'customerid' => $row['customerid']));
	$sum_month_traffic['all'] = $sum_month_traffic['http'] + $sum_month_traffic['ftp_up'] + $sum_month_traffic['ftp_down'] + $sum_month_traffic['mail'];

	if (!isset($admin_traffic[$row['adminid']])
		|| !is_array($admin_traffic[$row['adminid']])
	) {
		$admin_traffic[$row['adminid']]['http'] = 0;
		$admin_traffic[$row['adminid']]['ftp_up'] = 0;
		$admin_traffic[$row['adminid']]['ftp_down'] = 0;
		$admin_traffic[$row['adminid']]['mail'] = 0;
		$admin_traffic[$row['adminid']]['all'] = 0;
		$admin_traffic[$row['adminid']]['sum_month'] = 0;
	}

	$admin_traffic[$row['adminid']]['http']+= $current_traffic['http'];
	$admin_traffic[$row['adminid']]['ftp_up']+= $current_traffic['ftp_up'];
	$admin_traffic[$row['adminid']]['ftp_down']+= $current_traffic['ftp_down'];
	$admin_traffic[$row['adminid']]['mail']+= $current_traffic['mail'];
	$admin_traffic[$row['adminid']]['all']+= $current_traffic['all'];
	$admin_traffic[$row['adminid']]['sum_month']+= $sum_month_traffic['all'];

	/**
	 * WebSpace-Usage
	 */
	$cronlog->logAction(CRON_ACTION, LOG_INFO, 'calculating webspace usage for ' . $row['loginname']);
	$webspaceusage = 0;

	// Using repquota, it's faster using this tool than using du traversing the complete directory
	if (Settings::Get('system.diskquota_enabled')
		&& isset($usedquota[$row['guid']]['block']['used'])
		&& $usedquota[$row['guid']]['block']['used'] >= 1
	) {
		// We may use the array we created earlier, the used diskspace is stored in [<guid>][block][used]
		$webspaceusage = floatval($usedquota[$row['guid']]['block']['used']);

	} else {

		// Use the old fashioned way with "du"
		if (file_exists($row['documentroot'])
			&& is_dir($row['documentroot'])
		) {
			$back = safe_exec('du -sk ' . escapeshellarg($row['documentroot']) . '');
			foreach ($back as $backrow) {
				$webspaceusage = explode(' ', $backrow);
			}

			$webspaceusage = floatval($webspaceusage['0']);
			unset($back);

		} else {
			$cronlog->logAction(CRON_ACTION, LOG_WARNING, 'documentroot ' . $row['documentroot'] . ' does not exist');
		}
	}

	/**
	 * MailSpace-Usage
	 */
	$cronlog->logAction(CRON_ACTION, LOG_INFO, 'calculating mailspace usage for ' . $row['loginname']);
	$emailusage = 0;

	$maildir = makeCorrectDir(Settings::Get('system.vmail_homedir') . $row['loginname']);
	if (file_exists($maildir) && is_dir($maildir)) {
		$back = safe_exec('du -sk ' . escapeshellarg($maildir) . '');
		foreach ($back as $backrow) {
			$emailusage = explode(' ', $backrow);
		}

		$emailusage = floatval($emailusage['0']);
		unset($back);

	} else {
		$cronlog->logAction(CRON_ACTION, LOG_WARNING, 'maildir ' . $maildir . ' does not exist');
	}

	/**
	 * MySQLSpace-Usage
	 */
	$cronlog->logAction(CRON_ACTION, LOG_INFO, 'calculating mysqlspace usage for ' . $row['loginname']);
	$mysqlusage = 0;

	if (isset($mysqlusage_all[$row['customerid']])) {
		$mysqlusage = floatval($mysqlusage_all[$row['customerid']] / 1024);
	}

	$current_diskspace = array();
	$current_diskspace['webspace'] = floatval($webspaceusage);
	$current_diskspace['mail'] = floatval($emailusage);
	$current_diskspace['mysql'] = floatval($mysqlusage);
	$current_diskspace['all'] = $current_diskspace['webspace'] + $current_diskspace['mail'] + $current_diskspace['mysql'];

	$ins_data = array(
		'customerid' => $row['customerid'],
		'year' => date('Y', time()),
		'month' => date('m', time()),
		'day' => date('d', time()),
		'stamp' => time(),
		'webspace' => $current_diskspace['webspace'],
		'mail' => $current_diskspace['mail'],
		'mysql' => $current_diskspace['mysql']
	);
	$ins_stmt = Database::prepare("
		INSERT INTO `" . TABLE_PANEL_DISKSPACE . "` SET
		`customerid` = :customerid,
		`year` = :year,
		`month` = :month,
		`day` = :day,
		`stamp` = :stamp,
		`webspace` = :webspace,
		`mail` = :mail,
		`mysql` = :mysql
	");
	Database::pexecute($ins_stmt, $ins_data);

	if (!isset($admin_diskspace[$row['adminid']])
		|| !is_array($admin_diskspace[$row['adminid']])
	) {
		$admin_diskspace[$row['adminid']] = array();
		$admin_diskspace[$row['adminid']]['webspace'] = 0;
		$admin_diskspace[$row['adminid']]['mail'] = 0;
		$admin_diskspace[$row['adminid']]['mysql'] = 0;
		$admin_diskspace[$row['adminid']]['all'] = 0;
	}

	$admin_diskspace[$row['adminid']]['webspace']+= $current_diskspace['webspace'];
	$admin_diskspace[$row['adminid']]['mail']+= $current_diskspace['mail'];
	$admin_diskspace[$row['adminid']]['mysql']+= $current_diskspace['mysql'];
	$admin_diskspace[$row['adminid']]['all']+= $current_diskspace['all'];

	/**
	 * Total Usage
	 */
	$diskusage = floatval($webspaceusage + $emailusage + $mysqlusage);

	$upd_data = array(
		'diskspace' => $current_diskspace['all'],
		'traffic' => $sum_month_traffic['all'],
		'customerid' => $row['customerid']
	);
	$upd_stmt = Database::prepare("
		UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET
		`diskspace_used` = :diskspace,
		`traffic_used` = :traffic
		WHERE `customerid` = :customerid
	");
	Database::pexecute($upd_stmt, $upd_data);

	/**
	 * Proftpd Quota
	 */
	$upd_data = array(
		'biu' => ($current_diskspace['all'] * 1024),
		'loginname' => $row['loginname'],
		'loginnamelike' => $row['loginname'] . Settings::Get('customer.ftpprefix') . "%"
	);
	$upd_stmt = Database::prepare("
		UPDATE `" . TABLE_FTP_QUOTATALLIES . "` SET
		`bytes_in_used` = :biu WHERE `name` = :loginname OR `name` LIKE :loginnamelike
	");
	Database::pexecute($upd_stmt, $upd_data);

	/**
	 * Pureftpd Quota
	 */
	if (Settings::Get('system.ftpserver') == "pureftpd") {

		$result_quota_stmt = Database::prepare("
			SELECT homedir FROM `" . TABLE_FTP_USERS . "` WHERE customerid = :customerid
		");
		Database::pexecute($result_quota_stmt, array('customerid' => $row['customerid']));

		// get correct user
		if (Settings::Get('system.mod_fcgid') == 1
			&& $row['deactivated'] == '0'
		) {
			$user = $row['loginname'];
			$group = $row['loginname'];
		} else {
			$user = $row['guid'];
			$group = $row['guid'];
		}

		while ($row_quota = $result_quota_stmt->fetch(PDO::FETCH_ASSOC)) {
			$quotafile = "" . $row_quota['homedir'] . ".ftpquota";
			$fh = fopen($quotafile, 'w');
			$stringdata = "0 " . $current_diskspace['all']*1024 . "";
			fwrite($fh, $stringdata);
			fclose($fh);
			safe_exec('chown ' . $user . ':' . $group . ' ' . escapeshellarg($quotafile) . '');
		}
	}
}

/**
 * Admin Usage
 */
$result_stmt = Database::query("SELECT `adminid` FROM `" . TABLE_PANEL_ADMINS . "` ORDER BY `adminid` ASC");

while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {

	if (isset($admin_traffic[$row['adminid']])) {

		$ins_data = array(
			'adminid' => $row['adminid'],
			'year' => date('Y', time()),
			'month' => date('m', time()),
			'day' => date('d', time()),
			'stamp' => time(),
			'http' => $admin_traffic[$row['adminid']]['http'],
			'ftp_up' => $admin_traffic[$row['adminid']]['ftp_up'],
			'ftp_down' => $admin_traffic[$row['adminid']]['ftp_down'],
			'mail' => $admin_traffic[$row['adminid']]['mail']
		);
		$ins_stmt = Database::prepare("
			INSERT INTO `" . TABLE_PANEL_TRAFFIC_ADMINS . "` SET
			`adminid` = :adminid,
			`year` = :year,
			`month` = :month,
			`day` = :day,
			`stamp` = :stamp,
			`http` = :http,
			`ftp_up` = :ftp_up,
			`ftp_down` = :ftp_down,
			`mail` = :mail
		");
		Database::pexecute($ins_stmt, $ins_data);

		$upd_data = array(
			'traffic' => $admin_traffic[$row['adminid']]['sum_month'],
			'adminid' => $row['adminid']
		);
		$upd_stmt = Database::prepare("
			UPDATE `" . TABLE_PANEL_ADMINS . "` SET
			`traffic_used` = :traffic
			WHERE `adminid` = :adminid
		");
		Database::pexecute($upd_stmt, $upd_data);
	}

	if (isset($admin_diskspace[$row['adminid']])) {

		$ins_data = array(
			'adminid' => $row['adminid'],
			'year' => date('Y', time()),
			'month' => date('m', time()),
			'day' => date('d', time()),
			'stamp' => time(),
			'webspace' => $admin_diskspace[$row['adminid']]['webspace'],
			'mail' => $admin_diskspace[$row['adminid']]['mail'],
			'mysql' => $admin_diskspace[$row['adminid']]['mysql']
		);
		$ins_stmt = Database::prepare("
			INSERT INTO `" . TABLE_PANEL_DISKSPACE_ADMINS . "` SET
			`adminid` = :adminid,
			`year` = :year,
			`month` = :month,
			`day` = :day,
			`stamp` = :stamp,
			`webspace` = :webspace,
			`mail` = :mail,
			`mysql` = :mysql
		");

		$upd_data = array(
			'diskspace' => $admin_diskspace[$row['adminid']]['all'],
			'adminid' => $row['adminid']
		);
		$upd_stmt = Database::prepare("
			UPDATE `" . TABLE_PANEL_ADMINS . "` SET
			`diskspace_used` = :diskspace
			WHERE `adminid` = :adminid
		");
		Database::pexecute($upd_stmt, $upd_data);

	}
}

Database::query("UPDATE `" . TABLE_PANEL_SETTINGS . "` SET `value` = UNIX_TIMESTAMP() WHERE `settinggroup` = 'system' AND `varname` = 'last_traffic_run'");

if (function_exists('pcntl_fork')) {
	@unlink($TrafficLock);
	die();
}
