From 4569cae57f127afd093794310ccd290d2d9fdf36 Mon Sep 17 00:00:00 2001
From: Marius Burkard <m.burkard@pixcept.de>
Date: Wed, 20 Apr 2016 10:58:46 -0400
Subject: [PATCH] Merge branch 'stable-3.1'

---
 server/lib/classes/cron.d/200-ftplogfiles.inc.php |  126 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 126 insertions(+), 0 deletions(-)

diff --git a/server/lib/classes/cron.d/200-ftplogfiles.inc.php b/server/lib/classes/cron.d/200-ftplogfiles.inc.php
new file mode 100644
index 0000000..e471967
--- /dev/null
+++ b/server/lib/classes/cron.d/200-ftplogfiles.inc.php
@@ -0,0 +1,126 @@
+<?php
+
+/*
+ * Author Gody - Orm 2016
+ * You need to configure daily log rotation for pureftp (/etc/logorate.d/pure-ftpd-comon)
+ * TODO: replace logrotate to ISPConfig log rotation
+ */
+
+class cronjob_ftplogfiles extends cronjob {
+
+	// job schedule
+	protected $_schedule = '0 0 * * *';
+
+	/* this function is optional if it contains no custom code */
+	public function onPrepare() {
+		global $app;
+
+		parent::onPrepare();
+	}
+
+	/* this function is optional if it contains no custom code */
+	public function onBeforeRun() {
+		global $app;
+
+		return parent::onBeforeRun();
+	}
+
+	public function onRunJob() {
+		global $app, $conf;
+
+		//######################################################################################################
+		// Make the ftp logfiles directories world readable to enable ftp access
+		//######################################################################################################
+
+		if(is_dir('/var/log/pure-ftpd/')) exec('chmod +r /var/log/pure-ftpd/*');
+
+		//######################################################################################################
+		// Manage and compress ftp logfiles and create traffic statistics
+		//######################################################################################################
+		$sql = "SELECT domain_id, domain, type, document_root, web_folder, parent_domain_id FROM web_domain WHERE (type = 'vhost' or type = 'vhostsubdomain' or type = 'vhostalias') AND server_id = ?";
+		$records = $app->db->queryAllRecords($sql, $conf['server_id']);
+		
+		function parse_ftp_log($line){		
+			if(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} - (.+) \[(\d+\/\w+\/\d+):.+\] "(PUT|GET) .+" \d+ (\d+)$/', $line, $matches) == false) return false;
+
+			$date = date('Y-m-d', strtotime(str_replace('/', '-', $matches[2])));  // Correction date
+		
+			switch($matches[3])
+			{
+				case 'PUT':
+					$direction = 'in';
+					break;
+				case 'GET':
+					$direction = 'out';
+					break;
+			}		
+			// Returned array
+			return array('username' => $matches[1],	'date' => $date,'direction' => $direction,	'size' => $matches[4]);	
+		}
+		
+		function add_ftp_traffic(&$traffic_array, $parsed_line)
+		{		
+			if(is_array($traffic_array[$parsed_line['date']]) && array_key_exists($parsed_line['domain'], $traffic_array[$parsed_line['date']]))
+			{
+				$traffic_array[$parsed_line['date']][$parsed_line['domain']][$parsed_line['direction']] += $parsed_line['size'];
+			}
+			else
+			{
+				$traffic_array[$parsed_line['date']][$parsed_line['domain']] = array('in' => 0, 'out' => 0 );
+				$traffic_array[$parsed_line['date']][$parsed_line['domain']][$parsed_line['direction']] = $parsed_line['size'];
+			}
+		}
+		
+		$fp = fopen('/var/log/pure-ftpd/transfer.log.1', 'r');
+		$ftp_traffic = array();
+
+		// cumule des stats journalière dans un tableau
+		while($line = fgets($fp)) 
+		{
+			$parsed_line = parse_ftp_log($line);
+			
+			$sql = "SELECT wd.domain FROM ftp_user AS fu INNER JOIN web_domain AS wd ON fu.parent_domain_id = wd.domain_id WHERE fu.username = ? ";		
+			$temp = $app->db->queryOneRecord($sql, $parsed_line['username'] );
+			
+			$parsed_line['domain'] = $temp['domain'];
+					
+			add_ftp_traffic($ftp_traffic, $parsed_line);		
+		}
+			
+		fclose($fp);
+		
+		// Save du tableau en BD
+		foreach($ftp_traffic as $traffic_date => $all_traffic)
+		{
+			foreach ( $all_traffic as $hostname =>$traffic)
+			{
+				$sql1 = "SELECT hostname FROM ftp_traffic WHERE hostname = ? AND traffic_date = ?";
+				$tmp = $app->dbmaster->queryOneRecord($sql1, $hostname , $traffic_date);		
+				
+				if(is_array($tmp) && count($tmp) > 0) {
+					$sql = "UPDATE ftp_traffic SET in_bytes=in_bytes+ ?, out_bytes=out_bytes+ ? WHERE hostname = ? AND traffic_date = ? ";
+				}
+				else
+				{
+					$sql = "INSERT INTO ftp_traffic (in_bytes, out_bytes, hostname, traffic_date ) VALUES ( ?, ?, ?, ? )";
+				}
+				
+				$resultat = $app->dbmaster->query($sql, $traffic['in'], $traffic['out'], $hostname, $traffic_date );
+				
+				//if($resultat == 1){
+					//echo 'finished.'.PHP_EOL; // maybe you have a better solution ? 	}						
+			}
+		}
+
+		parent::onRunJob();
+	}
+
+	/* this function is optional if it contains no custom code */
+	public function onAfterRun() {
+		global $app;
+
+		parent::onAfterRun();
+	}
+}
+
+?>
\ No newline at end of file

--
Gitblit v1.9.1