<?php


class ftpDownLogManager {

//读取ftp用户下载文件的日志:/var/log/proftpd/xferlog

public static function readFtpLogTest(){

       $file = '/var/log/proftpd/xferlog';

       //先从库里取出最新的id

       $getlastid = ftpDownLogDataHandler::getLastLogId();

       if($getlastid['id']>0){

           $getlastid['id']++;

           $content = ftpDownLogManager::getFileLines($file,$getlastid['id']);

       }else{

           $content = ftpDownLogManager::getFileLines($file);

       }

       ftpDownLogManager::contentSave($content);

}

   //读取每行并入库

   public static function contentSave($content=null){

       if(empty($content))

           return false;

       if(!is_array($content))

           return false;

       foreach ($content as $key =>$value){

           $i = explode(' ', $value);//2014-03-21 09:45:09  Thu Aug 20 00:53:27 2009

//            echo '<pre/>';

//            print_r($i);die;

           if($i[2]==''){//Wed Sep  2 14:20:58 2009 0

               $c_time = $i[1].' '.$i[3].' '.$i[4].' '.$i[5];

               $current_time = date('Y-m-d H:i:s',strtotime($c_time));//current-time:传输发生时刻Fri Jan 9 10:07:20 2004


               $transfer_time = $i[6];//transfer-time:传输持续时间 0 秒


               $remote_host = substr($i[7],7);//remote-host:远程 ftp 客户机的地址 192.168.0.88


               $file_size = $i[8];//file-size:传输文件大小 320 B


               $file_name = $i[9];//file-name:传输文件名 /home/redflag/partitioninfo


               $transfer_type = $i[10];//transfer-type:传输类型 b 表示为二进制传输,a 表示 ascii 传输


               $special_action_flag = $i[11];//special-action-flag:特殊行为标记 _ ,C 表示 被压缩的文件、U 表示 未被压缩、 T 表示被 tar 、_表示没有特殊行为


               $direction = $i[12];//direction:方向 i,为上传,o为下载,d表示删除


               $access_mode = $i[13];//access- mode: r 表示 为系统用户,a 为 anonymous 用户


               $username = $i[14];//username:用户名 redflag


               $service_name = $i[15];//service-name:被调用的 ftp 服务器软件名字


               $authentication_method = $i[16];//authentication-method 认证方式,0 表示没有


               $authen_ticated_user_id = $i[17];//authen- ticated-user-id * 表示 没有认证用户id


               $completion_status = $i[18];//completion-status:传输完成状态 c 表示完成,i 表示没有完成


           }else{

               $c_time = $i[1].' '.$i[2].' '.$i[3].' '.$i[4];

               $current_time = date('Y-m-d H:i:s',strtotime($c_time));//current-time:传输发生时刻Fri Jan 9 10:07:20 2004


               $transfer_time = $i[5];//transfer-time:传输持续时间 0 秒


               $remote_host = substr($i[6],7);//remote-host:远程 ftp 客户机的地址 192.168.0.88


               $file_size = $i[7];//file-size:传输文件大小 320 B


               $file_name = $i[8];//file-name:传输文件名 /home/redflag/partitioninfo


               $transfer_type = $i[9];//transfer-type:传输类型 b 表示为二进制传输,a 表示 ascii 传输


               $special_action_flag = $i[10];//special-action-flag:特殊行为标记 _ ,C 表示 被压缩的文件、U 表示 未被压缩、 T 表示被 tar 、_表示没有特殊行为


               $direction = $i[11];//direction:方向 i,为上传,o为下载,d表示删除


               $access_mode = $i[12];//access- mode: r 表示 为系统用户,a 为 anonymous 用户


               $username = $i[13];//username:用户名 redflag


               $service_name = $i[14];//service-name:被调用的 ftp 服务器软件名字


               $authentication_method = $i[15];//authentication-method 认证方式,0 表示没有


               $authen_ticated_user_id = $i[16];//authen- ticated-user-id * 表示 没有认证用户id


               $completion_status = $i[17];//completion-status:传输完成状态 c 表示完成,i 表示没有完成

           }



           $pre1 = "`current_time`,`transfer_time`,`remote_host`,`file_size`,`file_name`, `transfer_type`,

           `special_action_flag`, `direction`, `access_mode` ,`username`, `service_name`, `authentication_method`, `authen_ticated_user_id`, `completion_status`";


           $pre2 = "'$current_time','$transfer_time','$remote_host','$file_size','$file_name', '$transfer_type',

           '$special_action_flag', '$direction', '$access_mode' ,'$username', '$service_name', '$authentication_method', '$authen_ticated_user_id', '$completion_status'";


           $sql = "INSERT INTO proftpd_downlog( $pre1) VALUES ($pre2)";

           //echo $sql;die;

           DB::cmsDB()->simplePrepare($sql);

           $resid = DB::logDB()->lastInsertId();

//            print_r( $resid);die;

           $key = $key+1;

           if($resid){

               echo $resid.':ok---line:'.$key.':'.$value."\n";

           }else{

               echo $resid.':error---line:'.$key.':'.$value."\n";

           }

           //echo $res;die;

       }

}


   //返回文件从X行到Y行的内容php5版本以上

   public static function getFileLines($filename, $startLine = 1, $countLine = 1000, $method = 'rb') {

       $content = array();

       $fp = new SplFileObject($filename, $method);

       $fp->seek($startLine - 1); // 转到第N行, seek方法参数从0开始计数

       for ($i = 0; $i < $countLine; ++$i) {

           $content[] = trim($fp->current()); // current()获取当前行内容并删除首尾处空白字符

           $fp->next(); // 下一行

       }

       return array_filter($content); // array_filter过滤:false,null,''

   }

}

?>