<?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,''
}
}
?>