<?php
/**
 * tt管理工具
 * 作者:于斌
 */

#tt守护进程核心
define('TT_IN'                  ,  true);
define('TT'                     ,  'tt');
define('TT_PATH'                ,  dirname(__FILE__)    . DIRECTORY_SEPARATOR);
define('TT_SERVICE_PATH'        ,  TT_PATH . 'service' . DIRECTORY_SEPARATOR);
define('TT_DB_PATH'             ,  TT_PATH . 'db' . DIRECTORY_SEPARATOR);
define('TT_BAK_PATH'            ,  TT_PATH . 'bak' . DIRECTORY_SEPARATOR);
define('TT_MANAGE_PATH'         ,  TT_PATH . 'manage' . DIRECTORY_SEPARATOR);
define('TT_CONFIG_PATH'         ,  TT_PATH . 'config' . DIRECTORY_SEPARATOR);
define('TT_LOG_PATH'            ,  TT_PATH . 'log' . DIRECTORY_SEPARATOR);

/**
 * tt_config()
 */
function tt_config()
{
    return scandir(TT_CONFIG_PATH);
}

/**
 * tt_echo()
 */
function tt_echo($string)
{
    static $str;
    $str .= tt_log($string . "\n");
    return $str;
}

/**
 * tt_log()
 */
function tt_log($str)
{
    $time = time();
    $file = tt_mkdir(TT_LOG_PATH . date('Y-m-d', $time) . '/') . date('Y-m-d_H', $time) . '.log';
    $content = '';
    if(is_file($file))
    {
        $content = file_get_contents($file);
    }

    $content .= date('Y-m-d_H:i:s', $time) . ':' . $str;
    file_put_contents($file, $content);
    return $str;
}

/**
 * tt_system()
 */
function tt_system($command)
{
    system($command);
}

/**
 * tt_create()
 */
function tt_create($config)
{
    if(isset($config['host']))
    {
        $command = $config['server'] . 'ttserver -host ' . $config['host'] . ' -port ' . $config['port'] .' -thnum ' . $config['thnum'] .' -dmn -pid ' . $config['path'] . $config['name'] . '.pid -log ' . $config['path'] . $config['name'] . '.log -le -ulog ' . $config['ulog'] . ' -ulim ' . $config['ulim'] . ' -rts ' . $config['path'] . $config['name'] . '.rts ';

        if(isset($config['mhost']))
        {
            $command .= '-sid ' . $config['sid'] . ' -mhost ' . $config['mhost'] . ' -mport ' . $config['mport'] . ' ';
        }

        if($config['type'] == '*')
        {
            $command .= '*';
        }
        else
        {
            $command .= $config['path'] . $config['name'] . '.' . $config['type'] . $config['ext'];
        }
        $command = 'ulimit -SHn 51200;' . escapeshellcmd($command);
        tt_system($command);
    }
}

/**
 * tt_mkdir()
 */
function tt_mkdir($dir)
{
    if(!is_dir($dir))
    {
        mkdir($dir, 0775);
    }
    return $dir;
}

/**
 * tt_runtime()
 */
function tt_runtime()
{
    static $time;
    if(!$time)
    {
        $time = microtime();
    }
    else
    {
        $new = microtime() - $time;
        return $new;
    }
}

/**
 * tt_load()
 */
function tt_load($php, $func = 'start')
{
    if(strstr($php, '.php') && is_file(TT_CONFIG_PATH . $php))
    {
        include(TT_CONFIG_PATH . $php);
        if($config['global']['state'] == 1)
        {
            $path = tt_mkdir(TT_DB_PATH . $config['global']['name'] . '/');

            if(!is_file($path . 'create'))
            {
                tt_echo($config['global']['name'] . ':正在对相关服务进行指定操作');
                if(isset($config['db']))
                {
                    foreach($config['db'] as $i => $j)
                    {
                        call_user_func('tt_' . $func, $config, $j);
                    }
                    tt_echo($config['global']['name'] . ':完成指定操作');
                }
                else
                {
                    tt_echo($config['global']['name'] . ':没有数据库需要启动');
                }
                file_put_contents($path . 'create', time());
            }
            else
            {
                if(is_string($func))
                {
                    unlink($path . 'create');
                    tt_echo($config['global']['name'] . ':清理权限文件成功');
                    tt_load($php, $func);
                }
                else
                {
                    tt_echo($config['global']['name'] . ':没有操作权限');
                }
            }
        }
        else
        {
            tt_echo($config['global']['name'] . ':服务已关闭');
        }
    }
    elseif(!strstr($php, '.'))
    {
        tt_echo($php . ':文件不存在,创建失败');
    }
}

/**
 * tt_start()
 */
function tt_start($data, $name)
{
    $path = tt_mkdir(TT_DB_PATH . $data['global']['name'] . '/' . $name . '/');
    if(isset($data[$name]) && !is_file($path . $name . '.pid'))
    {
        $data[$name]['name'] = $name;
        $data[$name]['path'] = $path;
        $data[$name]['ulog'] = tt_mkdir($path . 'ulog/');
        $data[$name]['server'] = $data['global']['server'];
        tt_create($data[$name]);

        $file = $path . $name . '.' . $data[$name]['type'];
        if(is_file($file) && !is_file($file . '.create'))
        {
            $command = 'cp ' . $file . ' ' . $file . '.create';
            tt_system($command);
        }
        tt_echo($data['global']['name'] . ':' . $name . '数据库启动成功');
    }
    else
    {
        tt_echo($data['global']['name'] . ':' . $name . '数据库已启动。');
    }
}

/**
 * tt_del()
 */
function tt_del($data, $name)
{
    $file = tt_mkdir(TT_DB_PATH . $data['global']['name'] . '/' . $name . '/') . $name . '.' . $data[$name]['type'];
    if(is_file($file) && is_file($file . '.create'))
    {
        $command = 'rm -rf ' . $file . ';cp ' . $file . '.create ' . $file;
        tt_system($command);
        tt_echo($data['global']['name'] . ':' . $name . '数据库清理成功');
    }
    elseif(is_file($file . '.create'))
    {
        $command = 'cp ' . $file . '.create ' . $file;
        tt_system($command);
        tt_echo($data['global']['name'] . ':' . $name . '数据库清理成功');
    }
    else
    {
        tt_echo($data['global']['name'] . ':' . $name . '数据库清理失败。');
    }
}

/**
 * tt_bak()
 */
function tt_bak($data, $name)
{
    $dir = tt_mkdir(TT_DB_PATH . $data['global']['name'] . '/' . $name . '/');
    if(is_dir($dir))
    {
        //tt_bakdel($data, $name);
        $bak = tt_mkdir(tt_mkdir(TT_BAK_PATH . $data['global']['name']) . '/' . $name . '/') . date('Y-m-d_H:i:s', time()) . '.tar.gz';
        $pid = $dir . $name . '.pid';
        $command = "tar --exclude $pid -zcvPf $bak $dir";
        tt_system($command);
        tt_echo($data['global']['name'] . ':' . $name . '数据库备份成功。');
    }
    else
    {
        tt_echo($data['global']['name'] . ':' . $name . '数据库目录不存在,无法备份。');
    }
}

/**
 * tt_bakdel()
 */
function tt_bakdel($data, $name)
{
    $dir = TT_BAK_PATH . $data['global']['name'] . '/' . $name . '/';
    if(is_dir($dir))
    {
        $command = "rm -rf {$dir}*.tar.gz";
        tt_system($command);
        tt_echo($data['global']['name'] . ':' . $name . '备份删除成功。');
    }
    else
    {
        tt_echo($data['global']['name'] . ':' . $name . '备份目录不存在,无法删除。');
    }
}

/**
 * tt_bakroll()
 */
function tt_bakroll($data, $name)
{
    $dir = TT_BAK_PATH . $data['global']['name'] . '/' . $name . '/';
    if(is_dir($dir))
    {
        $file = scandir($dir);
        $num = count($file) - 1;
        $bak = $dir . $file[$num];
        $command = "tar -zxvf $bak";
        tt_system($command);
        tt_echo($data['global']['name'] . ':' . $name . '备份回滚成功。');
    }
    else
    {
        tt_echo($data['global']['name'] . ':' . $name . '备份目录不存在,无法回滚。');
    }
}

/**
 * tt_ulog()
 */
function tt_ulog($data, $name)
{
    $dir = TT_DB_PATH . $data['global']['name'] . '/' . $name . '/' . 'ulog/';
    if(is_dir($dir))
    {
        $ulog = scandir($dir);

        foreach($ulog as $i => $j)
        {
            $num[$i] = intval(str_replace('.ulog', '', $j));
            $file[$i] = $dir . $j;
            $next[$i] = $dir . str_pad(($num[$i]+1), 8, '0', STR_PAD_LEFT) . '.ulog';
            if(is_file($next[$i]))
            {
                unlink($file[$i]);
            }
        }
        tt_echo($data['global']['name'] . ':' . $name . 'ulog清理成功,只留下最新的日志。');
    }
    else
    {
        //tt_echo($data['global']['name'] . ':' . $name . 'ulog清理失败。');
    }
}


/**
 * tt_stop()
 */
function tt_stop($data, $name)
{
    $file = tt_mkdir(TT_DB_PATH . $data['global']['name'] . '/' . $name . '/') . $name . '.pid';
    if(is_file($file))
    {
        $pid = file_get_contents($file);
        @unlink($file);
        $command = 'kill -15 ' . $pid;
        tt_system($command);
        tt_echo($data['global']['name'] . ':' . $name . '数据库关闭成功。');
    }
    else
    {
        tt_echo($data['global']['name'] . ':' . $name . '数据库已关闭。');
    }
}

/**
 * tt_restart()
 */
function tt_restart($data, $name)
{
    tt_stop($data, $name);
    tt_start($data, $name);
}