Blame | Last modification | View Log | RSS feed
<?php
/***************************************************************************
* Copyright (C) 2009-2011 by Geo Varghese(www.seopanel.in) *
* sendtogeo@gmail.com *
* *
* This program 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 2 of the License, or *
* (at your option) any later version. *
* *
* This program 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 this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
# class defines all proxy controller functions
class ProxyController extends Controller{
# func to show proxy list
function listProxy($info=''){
$userId = isLoggedIn();
$sql = "select * from proxylist where 1=1";
if (isset($info['status'])) {
if (($info['status']== 'active') || ($info['status']== 'inactive')) {
$statVal = ($info['status']=='active') ? 1 : 0;
$conditions .= " and status=$statVal";
$urlParams .= "&status=".$info['status'];
}
} else {
$info['status'] = '';
}
$this->set('statVal', $info['status']);
if (empty($info['keyword'])) {
$info['keyword'] = '';
} else {
$info['keyword'] = urldecode($info['keyword']);
$conditions .= " and proxy like '%".addslashes($info['keyword'])."%'";
$urlParams .= "&keyword=".urlencode($info['keyword']);
}
$this->set('keyword', $info['keyword']);
$sql .= " $conditions order by id";
# pagination setup
$this->db->query($sql, true);
$this->paging->setDivClass('pagingdiv');
$this->paging->loadPaging($this->db->noRows, SP_PAGINGNO);
$pagingDiv = $this->paging->printPages('proxy.php', '', 'scriptDoLoad', 'content', $urlParams);
$this->set('pagingDiv', $pagingDiv);
$sql .= " limit ".$this->paging->start .",". $this->paging->per_page;
$proxyList = $this->db->select($sql);
$this->set('pageNo', $info['pageno']);
$this->set('list', $proxyList);
$this->set('urlParams', $urlParams);
$this->render('proxy/proxylist');
}
# func to show import proxy form
function showImportProxy($info = ''){
$this->render('proxy/importproxy');
}
#funvtion to import proxy
function importProxy($data = "") {
$errMsg['proxy_list'] = formatErrorMsg($this->validate->checkBlank($data['proxy_list']));
if(!$this->validate->flagErr){
$resInfo['total'] = $resInfo['valid'] = $resInfo['existing'] = 0;
$proxyMaxId = $this->db->getMaxId('proxylist');
$proxyList = explode("\n", $data['proxy_list']);
foreach ($proxyList as $proxy) {
if(!preg_match('/\w+/', $proxy)) continue;
$listInfo = explode(",", $proxy);
$proxyInfo['proxy'] = trim($listInfo[0]);
if (!empty($proxyInfo['proxy'])) {
$resInfo['total']++;
$proxyInfo['port'] = trim($listInfo[1]);
$proxyInfo['proxy_username'] = trim($listInfo[2]);
$proxyInfo['proxy_password'] = trim($listInfo[3]);
if ($this->__checkProxy($proxyInfo['proxy'], $proxyInfo['port'])) {
$resInfo['existing']++;
} else {
$proxyInfo['proxy_auth'] = (!empty($proxyInfo['proxy_username']) || !empty($proxyInfo['proxy_password'])) ? 1 : 0;
$this->insertProxy($proxyInfo);
$resInfo['valid']++;
}
}
}
// if imported proxies needs to be checked
$proxyList = array();
if (!empty($data['check_status'])) {
$this->updateProxyCheckedStatus(0, "");
$condition = " and id > $proxyMaxId";
$sql = "select * from proxylist where 1=1 ". $condition;
$proxyList = $this->db->select($sql);
}
$this->set('proxyList', $proxyList);
$this->set('resInfo', $resInfo);
$this->set('proxyMaxId', $proxyMaxId);
$this->render('proxy/importresult');
} else {
showErrorMsg("Please enter valid proxy list.");
}
}
# func to check status of all proxy list
function showcheckAllStatus($info=''){
$this->render('proxy/showcheckallstatus');
}
# function to check all proxy status
function checkAllProxyStatus($info = '') {
$isStatusCheck = false;
$this->updateProxyCheckedStatus(0, "");
if ($info['status'] != "") {
$isStatusCheck = true;
$status = ($info['status'] == 'active') ? 1 : 0;
$this->set('status', $status);
}
$proxyList = $this->__getAllProxys($isStatusCheck, $status);
$this->set('activeCount', $this->__getProxyCount(" where status=1 and checked=1"));
$this->set('inActiveCount', $this->__getProxyCount(" where status=0 and checked=1"));
$this->set('proxyList', $proxyList);
$this->render('proxy/checkallstatus');
}
# func to check status of all proxy list
function runCheckStatus($info = '') {
$proxyId = intval($info['id']);
$this->checkStatus($proxyId);
$this->updateProxyCheckedStatus(1, " where id=$proxyId");
$where = "";
if (isset($info['status'])) {
$status = intval($info['status']);
$where = " and status=$status";
$this->set('status', $status);
}
// if max id is set
if (isset($info['proxy_max_id'])) {
$where = " and id > ".intval($info['proxy_max_id']);
$this->set('proxyMaxId', $info['proxy_max_id']);
}
$sql = "select * from proxylist where checked=0 $where order by id";
$proxyList = $this->db->select($sql);
$this->set('activeCount', $this->__getProxyCount(" where status=1 and checked=1"));
$this->set('inActiveCount', $this->__getProxyCount(" where status=0 and checked=1"));
$this->set('checkedCount', $this->__getProxyCount(" where checked=1"));
$this->set('proxyList', $proxyList);
$this->render('proxy/runcheckstatus');
}
# function to update checked status of the proxy list
function updateProxyCheckedStatus($checkedVal = 0, $where = "") {
$sql = "update proxylist set checked=".intval($checkedVal);
$sql .= empty($where) ? "" : $where;
$this->db->query($sql);
}
# function to get proxy count
function __getProxyCount($where = '') {
$sql = "select count(*) as count from proxylist $where";
$listInfo = $this->db->select($sql, true);
return $listInfo['count'];
}
# func to get all Proxys
function __getAllProxys($isStatusCheck=true, $status=1){
$sql = "select * from proxylist where 1=1";
if($isStatusCheck){
$sql .= " and status=".intval($status);
}
$sql .= " order by id";
$proxyList = $this->db->select($sql);
return $proxyList;
}
# func to change status
function __changeStatus($proxyId, $status){
$sql = "update proxylist set status=$status where id=".intval($proxyId);
$this->db->query($sql);
}
# func to change status
function __deleteProxy($proxyId){
$sql = "delete from proxylist where id=".intval($proxyId);
$this->db->query($sql);
}
function __checkProxy($name, $port=80){
$sql = "select id from proxylist where proxy='".addslashes($name)."' and port=".intval($port);
$listInfo = $this->db->select($sql, true);
return empty($listInfo['id']) ? false : $listInfo['id'];
}
function newProxy($listInfo=''){
if (!isset($listInfo['port'])) {
$listInfo['port'] = 80;
}
$this->set('post', $listInfo);
$this->render('proxy/newproxy');
}
function createProxy($listInfo){
$errMsg['proxy'] = formatErrorMsg($this->validate->checkBlank($listInfo['proxy']));
$errMsg['port'] = formatErrorMsg($this->validate->checkNumber($listInfo['port']));
if (!empty($listInfo['proxy_auth'])) {
$errMsg['proxy_username'] = formatErrorMsg($this->validate->checkBlank($listInfo['proxy_username']));
$errMsg['proxy_password'] = formatErrorMsg($this->validate->checkBlank($listInfo['proxy_password']));
}
if(!$this->validate->flagErr){
if (!$this->__checkProxy($listInfo['proxy'], $listInfo['port'])) {
$this->insertProxy($listInfo);
$this->listProxy();
exit;
}else{
$errMsg['proxy'] = formatErrorMsg($this->spTextProxy['Proxyalreadyexist']);
}
}
$this->set('errMsg', $errMsg);
$this->newProxy($listInfo);
}
function insertProxy($listInfo) {
$proxyAuth = empty($listInfo['proxy_auth']) ? 0 : 1;
$sql = "insert into proxylist(proxy,port,proxy_auth,proxy_username,proxy_password,status)
values('".addslashes($listInfo['proxy'])."', '".intval($listInfo['port'])."', $proxyAuth, '".addslashes($listInfo['proxy_username'])."', '".addslashes($listInfo['proxy_password'])."', 0)";
$this->db->query($sql);
}
function __getProxyInfo($proxyId){
$sql = "select * from proxylist where id=".intval($proxyId);
$listInfo = $this->db->select($sql, true);
$listInfo['proxy_username'] = stripslashes($listInfo['proxy_username']);
$listInfo['proxy_password'] = stripslashes($listInfo['proxy_password']);
return empty($listInfo['id']) ? false : $listInfo;
}
function editProxy($proxyId, $listInfo=''){
if(!empty($proxyId)){
if(empty($listInfo)){
$listInfo = $this->__getProxyInfo($proxyId);
$listInfo['oldProxy'] = $listInfo['proxy'];
}
$this->set('post', $listInfo);
$this->render('proxy/editproxy');
exit;
}
$this->listProxy();
}
function updateProxy($listInfo){
$listInfo['id'] = intval($listInfo['id']);
$this->set('post', $listInfo);
$errMsg['proxy'] = formatErrorMsg($this->validate->checkBlank($listInfo['proxy']));
$errMsg['port'] = formatErrorMsg($this->validate->checkNumber($listInfo['port']));
if (!empty($listInfo['proxy_auth'])) {
$errMsg['proxy_username'] = formatErrorMsg($this->validate->checkBlank($listInfo['proxy_username']));
$errMsg['proxy_password'] = formatErrorMsg($this->validate->checkBlank($listInfo['proxy_password']));
}
if(!$this->validate->flagErr){
if($listInfo['proxy'] != $listInfo['oldProxy']){
if ($this->__checkProxy($listInfo['proxy'], $listInfo['port'])) {
$errMsg['proxy'] = formatErrorMsg($this->spTextProxy['Proxyalreadyexist']);
$this->validate->flagErr = true;
}
}
if (!$this->validate->flagErr) {
$proxyAuth = empty($listInfo['proxy_auth']) ? 0 : 1;
$sql = "update proxylist set
proxy = '".addslashes($listInfo['proxy'])."',
port = '".intval($listInfo['port'])."',
status = '".intval($listInfo['status'])."',
proxy_auth = $proxyAuth,
proxy_username = '".addslashes($listInfo['proxy_username'])."',
proxy_password = '".addslashes($listInfo['proxy_password'])."'
where id={$listInfo['id']}";
$this->db->query($sql);
$this->listProxy();
exit;
}
}
$this->set('errMsg', $errMsg);
$this->editProxy($listInfo['id'], $listInfo);
}
# func to check whether proxy is active or not
function __isProxyActive($proxyId) {
$proxyInfo = $this->__getProxyInfo($proxyId);
$ret = $this->spider->checkProxy($proxyInfo);
return empty($ret['error']) ? 1 : 0;
}
function checkStatus($proxyId) {
$status = $this->__isProxyActive($proxyId);
$this->__changeStatus($proxyId, $status);
}
function getRandomProxy() {
$sql = "SELECT * FROM proxylist where status=1 ORDER BY RAND() LIMIT 1";
$listInfo = $this->db->select($sql, true);
$listInfo['proxy_username'] = stripslashes($listInfo['proxy_username']);
$listInfo['proxy_password'] = stripslashes($listInfo['proxy_password']);
return empty($listInfo['id']) ? false : $listInfo;
}
// function to show cron command
function showCronCommand(){
$this->render('proxy/croncommand');
}
/**
* function to show perfomance of a proxy
* @param Array $info Contains all search info details
*/
function showProxyPerfomance($info = '') {
$sql = "select p.id as proxy_id, p.proxy, p.port, count(*) count, sum(crawl_status) success, avg(crawl_status) avg_score,
count(*) - sum(crawl_status) fail from crawl_log t join proxylist p on p.id=t.proxy_id where 1=1";
$conditions = "";
if (empty($info['keyword'])) {
$info['keyword'] = '';
} else {
$info['keyword'] = urldecode($info['keyword']);
$searchKeyword = addslashes($info['keyword']);
$conditions .= " and p.proxy like '%$searchKeyword%'";
$urlParams .= "&keyword=".urlencode($info['keyword']);
}
$this->set('keyword', $info['keyword']);
if (!empty ($info['from_time'])) {
$fromTime = strtotime($info['from_time'] . ' 00:00:00');
} else {
$fromTime = mktime(0, 0, 0, date('m'), date('d') - 90, date('Y'));
}
if (!empty ($info['to_time'])) {
$toTime = strtotime($info['to_time'] . ' 00:00:00');
} else {
$toTime = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
}
$fromTimeLabel = date('Y-m-d', $fromTime);
$toTimeLabel = date('Y-m-d', $toTime);
$this->set('fromTime', $fromTimeLabel);
$this->set('toTime', $toTimeLabel);
$urlParams .= "&from_time=$fromTimeLabel&to_time=$toTimeLabel";
// set status
$urlParams .= "&order_by=".$info['order_by'];
$this->set('statVal', $info['order_by']);
// sql created using param
$sql .= " $conditions and crawl_time >='$fromTimeLabel 00:00:00' and crawl_time<='$toTimeLabel 23:59:59' group by proxy_id order by avg_score";
$sql .= ($info['order_by'] == 'fail') ? " ASC" : " DESC";
// pagination setup
$this->db->query($sql, true);
$this->paging->setDivClass('pagingdiv');
$this->paging->loadPaging($this->db->noRows, SP_PAGINGNO);
$pagingDiv = $this->paging->printPages('proxy.php?sec=perfomance', '', 'scriptDoLoad', 'content', $urlParams);
$this->set('pagingDiv', $pagingDiv);
$sql .= " limit ".$this->paging->start .",". $this->paging->per_page;
$logList = $this->db->select($sql);
$this->set('pageNo', $info['pageno']);
$this->set('list', $logList);
$this->set('urlParams', $urlParams);
$this->render('proxy/proxyperfomance');
}
// function to add proxy to curl handle
public static function addProxyToCurlHandle($curlHandle, $noProxy = false) {
$proxyId = 0;
// to use proxy if proxy enabled
if (SP_ENABLE_PROXY && !$noProxy) {
$proxyCtrler = New self();
if ($proxyInfo = $proxyCtrler->getRandomProxy()) {
$proxyId = $proxyInfo['id'];
curl_setopt($curlHandle, CURLOPT_PROXY, $proxyInfo['proxy'].":".$proxyInfo['port']);
if (CURLOPT_HTTPPROXYTUNNEL_VAL) {
curl_setopt($curlHandle, CURLOPT_HTTPPROXYTUNNEL, CURLOPT_HTTPPROXYTUNNEL_VAL);
}
if (!empty($proxyInfo['proxy_auth'])) {
curl_setopt ($curlHandle, CURLOPT_PROXYUSERPWD, $proxyInfo['proxy_username'].":".$proxyInfo['proxy_password']);
}
} else {
showErrorMsg("No active proxies found!! Please check your proxy settings from Admin Panel.");
}
}
// to fix the ssl related issues
curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, 0);
return array($curlHandle, $proxyId);
}
// changes for proxy after curl execute
public static function processProxyStatus($ret, $proxyId) {
// disable proxy if not working
if (SP_ENABLE_PROXY && $proxyId && !empty($ret['error'])) {
$proxyCtrler = New self();
// deactivate proxy
if (PROXY_DEACTIVATE_CRAWL) {
$proxyCtrler->__changeStatus($proxyId, 0);
}
}
}
}
?>