#!/usr/bin/env php
<?php
# 读取LOG/error500/中的压缩格式化的数据


# 不自动执行，这样只初始化Bootstrap和Core类，而不执行Core::run()方法
$auto_run = false;


$argv = $_SERVER['argv'];
array_shift($argv);

if (!isset($argv[0]) || !$argv[0])
{
    help();
}


function help()
{
    echo <<<EOF
读取LOG/error500/中的压缩格式化的数据
=====================================
使用方法: $ \x1b[36mview-error500-log\x1b[39m \x1b[33m[ErrorNo]\x1b[39m

OPTIONS:
  -d [date] \x1b[32m清除指定日期log\x1b[39m

EXAMPLE:
  $ \x1b[36mview-error500-log\x1b[39m \x1b[33m2012-12-27-96699DBC65\x1b[39m         查看LOG
  $ \x1b[36mview-error500-log\x1b[39m \x1b[33m2012-12-27-96699DBC65 -r\x1b[39m      查看完毕立即删除
  $ \x1b[36mview-error500-log\x1b[39m \x1b[33m-d 2012-12-27\x1b[39m                 删除指定日期LOG

EOF;
    exit;
}

# 调用项目
$project = 'default';

include (dirname(__FILE__).'/../index.php');


if ($argv[0]=='-d')
{
    $date = $argv[1];
    if (!$date)
    {
        echo "缺少日期\n";
    }
    if (!preg_match('#^([0-9]{4})(-[0-9]{2})?(-[0-9]{2})?$#i', $date  , $m))
    {
        echo "日期格式错误，应该类似“2012-12-27”\n";
        exit;
    }

    $error_config = Core::config('core.error500');

    if (isset($error_config['save_type']) && $error_config['save_type'])
    {
        $save_type = $error_config['save_type'];
    }
    else
    {
        $save_type = 'file';
    }

    switch ($save_type)
    {
        case 'database':
            $obj = new Database($error_config['db_config']?$error_config['db_config']:'default');
            $date_str = $date;
            if (!$m[2])
            {
                $date_str .= '-01-01';
            }
            elseif (!$m[3])
            {
                $date_str .= '-01';
            }
            $date_str .= ' 00:00:00';
            $time = strtotime($date_str);
            if (!$time)
            {
                echo "时间格式错误\n";
                exit;
            }
            if (!$m[2])
            {
                $where = array
                (
                    'time>=' => $time,
                    'time<=' => strtotime($m[1].'-12-31 23:59:59'),
                );
            }
            elseif (!$m[3])
            {
                $where = array
                (
                    'time>=' => $time,
                    'time<=' => $time + (86400*date('t',$time)),
                );
            }
            else
            {
                $where = $time;
            }

            $obj->delete('error500_log',$where);

            echo "删除成功！\n";
            break;
        case 'cache':
            echo "缓存模式不支持删除指定日常LOG！\n";
            break;
        default:
            $dir = DIR_LOG . 'error500' . DS . str_replace('-',DS,$date) . DS;
            if (!is_dir($dir))
            {
                echo "缓存目录不存在，操作完成。\n";
            }
            elseif (File::remove_dir($dir))
            {
                echo "删除成功！\n";
            }
            else
            {
                echo "删除失败，可能没有权限！请直接执行以下代码:\n  $ \x1b[36mrm -rf {$dir}\x1b[39m\n";
            }
            break;
    }
}
else
{
    $error_no = $argv[0];
    if (!preg_match('#^([0-9]{4}-[0-9]{2}-[0-9]{2})-([a-z0-9]+)$#i', $error_no , $m))
    {
        echo "编号错误，编号类似“2012-12-27-96699DBC65”\n";
        exit;
    }

    $file = DIR_LOG . 'error500' . DS . str_replace('-',DS,$m[1]) . DS . $m[2] . '.log';

    if (is_file($file))
    {
        $data = @unserialize(gzuncompress(base64_decode(file_get_contents($file))));
        if ($data)
        {
            $obj = $data['trace'];

            echo "\x1b[32m当前项目  ：\x1b[33m{$data['project']} (".Core::config('core.projects.'.$data['project'].'.name').")\x1b[39m\n";
            echo "\x1b[32m请求URI   ：\x1b[33m{$data['uri']}\x1b[39m\n";
            echo "\x1b[32m请求URL   ：\x1b[33m{$data['url']}\x1b[39m\n";
            echo "\x1b[32m引用页    ：\x1b[33m{$data['referrer']}\x1b[39m\n";
            echo "\x1b[32m浏览器信息：\x1b[33m{$data['user_agent']}\x1b[39m\n";
            echo "\x1b[32m服务器名  ：\x1b[33m{$data['server_name']}\x1b[39m\n";
            echo "\x1b[32m服务器IP  ：\x1b[33m{$data['server_ip']}\x1b[39m\n";
            echo "\x1b[32m客户端IP  ：\x1b[33m{$data['client_ip']}\x1b[39m\n";
            echo "\x1b[32m请求时间  ：\x1b[33m".date('Y-m-d H:i:s',$data['time'])."\x1b[39m\n";
            echo "\x1b[32m执行时间  ：\x1b[33m{$data['use_time']}\x1b[39m\n";
            if ($data['get'])
            {
                echo "\n\x1b[32m================================ QueryString ===============================\x1b[39m";
                echo "\n";
                echo $data['get'];
                echo "\n";
            }
            if ($data['post'])
            {
                echo "\n\x1b[32m================================ POST ======================================\x1b[39m";
                echo "\n";
                var_export($data['post']);
                echo ";\n";
            }
            if ($data['cookie'])
            {
                echo "\n\x1b[32m================================ COOKIE ====================================\x1b[39m";
                echo "\n";
                var_export($data['cookie']);
                echo ";\n";
            }
            echo "\n";
            echo "\x1b[32m================================ Trace =====================================\x1b[39m";
            echo "\n" . (string)$obj . "\n\n\n";
        }
        else
        {
            echo "data error.\n";
        }

        if (in_array('-r',$argv))
        {
            echo "\x1b[36m";
            # 删除当前日志
            if (File::unlink($file))
            {
                echo "日志删除成功\n";
            }
            else
            {
                echo "日志删除失败，可能没有权限\n";
            }
            echo "\x1b[39m";
        }
    }
    else
    {
        echo "指定的编号日志不存在\n";
    }
}