Просмотр исходного кода

1.自动封禁流量超限账号,避免因节点之间时间不同步造成流量超限问题
2.节点宕机发信由15分钟改为10分钟
3.加入工具:SS(R)链接反解析
4.移除serverStatus

zhangjiangbin 8 лет назад
Родитель
Сommit
58a485a5e5

+ 10 - 8
app/Console/Commands/AutoBanUserJob.php

@@ -26,15 +26,17 @@ class AutoBanUserJob extends Command
         // 封禁24小时内流量异常账号
         if ($config['is_traffic_ban']) {
             $userList = User::query()->where('status', '>=', 0)->where('enable', 1)->get();
-            foreach ($userList as $user) {
-                $time = date('Y-m-d H:i:s', time() - 24 * 60 * 60);
-                $totalTraffic = UserTrafficHourly::query()->where('user_id', $user->id)->where('node_id', 0)->where('created_at', '>=', $time)->sum('total');
-                if ($totalTraffic >= ($config['traffic_ban_value'] * 1024 * 1024 * 1024)) {
-                    $ban_time = date('Y-m-d H:i:s', strtotime("+" . $config['traffic_ban_time'] . " minutes"));
-                    User::query()->where('id', $user->id)->update(['enable' => 0, 'ban_time' => $ban_time]);
+            if (!$userList->isEmpty()) {
+                foreach ($userList as $user) {
+                    $time = date('Y-m-d H:i:s', time() - 24 * 60 * 60);
+                    $totalTraffic = UserTrafficHourly::query()->where('user_id', $user->id)->where('node_id', 0)->where('created_at', '>=', $time)->sum('total');
+                    if ($totalTraffic >= ($config['traffic_ban_value'] * 1024 * 1024 * 1024)) {
+                        $ban_time = date('Y-m-d H:i:s', strtotime("+" . $config['traffic_ban_time'] . " minutes"));
+                        User::query()->where('id', $user->id)->update(['enable' => 0, 'ban_time' => $ban_time]);
 
-                    // 写入日志
-                    $this->log($user->id, $config['traffic_ban_time'], '【自动封禁】-流量异常');
+                        // 写入日志
+                        $this->log($user->id, $config['traffic_ban_time'], '【自动封禁】-24小时内流量异常');
+                    }
                 }
             }
         }

+ 2 - 2
app/Console/Commands/AutoCheckNodeStatusJob.php

@@ -33,7 +33,7 @@ class AutoCheckNodeStatusJob extends Command
             // 10分钟内无节点信息则认为是宕机,因为每个节点的负载信息最多保存10分钟
             $node_info = SsNodeInfo::query()->where('node_id', $node->id)->where('log_time', '>=', strtotime("-10 minutes"))->orderBy('id', 'desc')->first();
             if (empty($node_info) || empty($node_info->load)) {
-                // 15分钟内已发警告,则不再发
+                // 10分钟内已发警告,则不再发
                 if (Cache::has($this->cacheKey . $node->id)) {
                     continue;
                 }
@@ -65,7 +65,7 @@ class AutoCheckNodeStatusJob extends Command
                     }
 
                     // 写入发信缓存
-                    Cache::put($this->cacheKey . $node->id, $node->name . '(' . $node->server . ')', 15);
+                    Cache::put($this->cacheKey . $node->id, $node->name . '(' . $node->server . ')', 10);
                 }
             }
         }

+ 44 - 0
app/Console/Commands/AutoDisableUserJob.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Http\Models\UserBanLog;
+use Illuminate\Console\Command;
+use App\Http\Models\User;
+use Log;
+
+class autoDisableUserJob extends Command
+{
+    protected $signature = 'command:autoDisableExpireUserJob';
+    protected $description = '自动禁用流量超限的用户';
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        // 禁用流量超限账号
+        $userList = User::query()->where('enable', 1)->whereRaw("u + d >= transfer_enable")->get();
+        if (!$userList->isEmpty()) {
+            foreach ($userList as $user) {
+                User::query()->where('id', $user->id)->update(['enable' => 0]);
+
+                // 写入日志
+                $this->log($user->id, '【自动封禁】-流量超限');
+            }
+        }
+
+        Log::info('定时任务:' . $this->description);
+    }
+
+    private function log($user_id, $desc)
+    {
+        $log = new UserBanLog();
+        $log->user_id = $user_id;
+        $log->minutes = 0;
+        $log->desc = $desc;
+        $log->save();
+    }
+}

+ 2 - 0
app/Console/Kernel.php

@@ -19,6 +19,7 @@ class Kernel extends ConsoleKernel
         \App\Console\Commands\AutoClearLogJob::class,
         \App\Console\Commands\AutoDecGoodsTrafficJob::class,
         \App\Console\Commands\AutoDisableExpireUserJob::class,
+        \App\Console\Commands\AutoDisableUserJob::class,
         \App\Console\Commands\AutoExpireCouponJob::class,
         \App\Console\Commands\AutoExpireInviteJob::class,
         \App\Console\Commands\AutoGetLocationInfoJob::class,
@@ -46,6 +47,7 @@ class Kernel extends ConsoleKernel
         $schedule->command('command:autoClearLogJob')->everyThirtyMinutes();
         $schedule->command('command:autoDecGoodsTrafficJob')->everyTenMinutes();
         $schedule->command('command:autoDisableExpireUserJob')->everyMinute();
+        $schedule->command('command:autoDisableUserJob')->everyMinute();
         $schedule->command('command:autoExpireCouponJob')->everyThirtyMinutes();
         $schedule->command('command:autoExpireInviteJob')->everyThirtyMinutes();
         //$schedule->command('command:autoGetLocationInfoJob')->everyMinute();

+ 50 - 3
app/Http/Controllers/AdminController.php

@@ -240,6 +240,7 @@ class AdminController extends Controller
             }
 
             DB::commit();
+
             return Response::json(['status' => 'success', 'data' => '', 'message' => '批量生成账号成功']);
         } catch (\Exception $e) {
             DB::rollBack();
@@ -263,9 +264,9 @@ class AdminController extends Controller
             $method = $request->get('method');
             //$custom_method = $request->get('custom_method');
             $protocol = $request->get('protocol');
-            $protocol_param = $request->get('protocol_param');
+            $protocol_param = $request->get('protocol_param', '');
             $obfs = $request->get('obfs');
-            $obfs_param = $request->get('obfs_param');
+            $obfs_param = $request->get('obfs_param', '');
             $speed_limit_per_con = $request->get('speed_limit_per_con');
             $speed_limit_per_user = $request->get('speed_limit_per_user');
             $gender = $request->get('gender');
@@ -861,6 +862,41 @@ class AdminController extends Controller
         return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
     }
 
+    // SS(R)链接反解析
+    public function decompile(Request $request)
+    {
+        if ($request->method() == 'POST') {
+            $content = $request->get('content');
+
+            if (empty($content)) {
+                return Response::json(['status' => 'fail', 'data' => '', 'message' => '请在左侧填入要反解析的SS(R)链接']);
+            }
+
+            // 反解析处理
+            $content = str_replace("\n", ",", $content);
+            $content = explode(',', $content);
+            $txt = '';
+            foreach ($content as $item) {
+                // 判断是SS还是SSR链接
+                $str = '';
+                if (false !== strpos($item, 'ssr://')) {
+                    $str = mb_substr($item, 6);
+                } else if (false !== strpos($item, 'ss://')) {
+                    $str = mb_substr($item, 5);
+                }
+
+                $txt .= "\r\n" . $this->base64url_decode($str);
+            }
+
+            // 生成转换好的JSON文件
+            file_put_contents(public_path('downloads/decompile.json'), $txt);
+
+            return Response::json(['status' => 'success', 'data' => $txt, 'message' => '反解析成功']);
+        } else {
+            return Response::view('admin/decompile');
+        }
+    }
+
     // 格式转换(SS转SSR)
     public function convert(Request $request)
     {
@@ -921,7 +957,18 @@ class AdminController extends Controller
     // 下载转换好的JSON文件
     public function download(Request $request)
     {
-        if (!file_exists(public_path('downloads/convert.json'))) {
+        $type = $request->get('type');
+        if (empty($type)) {
+            exit('参数异常');
+        }
+
+        if ($type == '1') {
+            $filePath = public_path('downloads/convert.json');
+        } else {
+            $filePath = public_path('downloads/decompile.json');
+        }
+
+        if (!file_exists($filePath)) {
             exit('文件不存在');
         }
 

+ 0 - 0
public/downloads/convert.json


+ 0 - 0
public/downloads/decompile.json


+ 1 - 0
resources/lang/en/home.php

@@ -24,6 +24,7 @@ return [
     'account_level' => 'Level',
     'account_balance' => 'Balance',
     'account_score' => 'Score',
+    'account_status' => 'Status',
     'account_expire' => 'Overdue At',
     'account_last_usage' => 'Last Usage',
     'account_last_login' => 'Last Login',

+ 1 - 0
resources/lang/zh-CN/home.php

@@ -24,6 +24,7 @@ return [
     'account_level' => '等级',
     'account_balance' => '余额',
     'account_score' => '积分',
+    'account_status' => '账号状态',
     'account_expire' => '账号到期',
     'account_last_usage' => '最后使用',
     'account_last_login' => '最后登录',

+ 5 - 5
resources/views/admin/convert.blade.php

@@ -76,10 +76,10 @@
                         </div>
                         <div class="row" style="margin-top:10px;">
                             <div class="col-md-6">
-                                <button class="btn blue btn-block" onclick="do_convert()">转 换</button>
+                                <button class="btn blue btn-block" onclick="doConvert()">转 换</button>
                             </div>
                             <div class="col-md-6">
-                                <button class="btn red btn-block" onclick="do_download()">下 载</button>
+                                <button class="btn red btn-block" onclick="doDownload()">下 载</button>
                             </div>
                         </div>
                     </div>
@@ -96,7 +96,7 @@
 
     <script type="text/javascript">
         // 转换
-        function do_convert() {
+        function doConvert() {
             var _token = '{{csrf_token()}}';
             var method = $('#method').val();
             var transfer_enable = $('#transfer_enable').val();
@@ -134,8 +134,8 @@
         }
 
         // 下载
-        function do_download() {
-            window.location.href = '{{url('admin/download')}}';
+        function doDownload() {
+            window.location.href = '{{url('admin/download?type=1')}}';
         }
     </script>
 @endsection

+ 87 - 0
resources/views/admin/decompile.blade.php

@@ -0,0 +1,87 @@
+@extends('admin.layouts')
+
+@section('css')
+@endsection
+@section('title', '控制面板')
+@section('content')
+    <!-- BEGIN CONTENT BODY -->
+    <div class="page-content" style="padding-top:0;">
+        <!-- BEGIN PAGE BASE CONTENT -->
+        <div class="row">
+            <div class="col-md-12">
+                <!-- BEGIN PORTLET-->
+                <div class="portlet light bordered">
+                    <div class="portlet-title">
+                        <div class="caption font-dark">
+                            <i class="icon-reload font-dark"></i>
+                            <span class="caption-subject bold uppercase"> 反解析 </span>
+                        </div>
+                    </div>
+                    <div class="portlet-body">
+                        <div class="row">
+                            <div class="col-md-6">
+                                <textarea class="form-control" rows="33" name="content" id="content" placeholder="请填入要反解析的SS(R)链接,一行一条" autofocus></textarea>
+                            </div>
+                            <div class="col-md-6">
+                                <textarea class="form-control" rows="33" name="result" id="result" readonly="readonly"></textarea>
+                            </div>
+                        </div>
+                        <div class="row" style="margin-top:10px;">
+                            <div class="col-md-6">
+                                <button class="btn blue btn-block" onclick="doDecompile()">反解析</button>
+                            </div>
+                            <div class="col-md-6">
+                                <button class="btn red btn-block" onclick="doDownload()">下 载</button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- END PORTLET-->
+            </div>
+        </div>
+        <!-- END PAGE BASE CONTENT -->
+    </div>
+    <!-- END CONTENT BODY -->
+@endsection
+@section('script')
+    <script src="/js/layer/layer.js" type="text/javascript"></script>
+
+    <script type="text/javascript">
+        // 转换
+        function doDecompile() {
+            var _token = '{{csrf_token()}}';
+            var content = $('#content').val();
+
+            if (content == '') {
+                layer.msg('请填入要反解析的链接信息', {time:1000});
+                return ;
+            }
+
+            layer.confirm('确定继续反解析吗?', {icon: 2, title:'警告'}, function(index) {
+                $.ajax({
+                    type: "POST",
+                    url: "{{url('admin/decompile')}}",
+                    async: false,
+                    data: {_token:_token, content: content},
+                    dataType: 'json',
+                    success: function (ret) {
+                        if (ret.status == 'success') {
+                            $("#result").val(ret.data);
+                        } else {
+                            $("#result").val(ret.message);
+                        }
+                    }
+                });
+
+                layer.close(index);
+            });
+
+            return false;
+        }
+
+        // 下载
+        function doDownload() {
+            window.location.href = '{{url('admin/download?type=2')}}';
+        }
+    </script>
+@endsection

+ 7 - 1
resources/views/admin/layouts.blade.php

@@ -210,13 +210,19 @@
                         </li>
                     </ul>
                 </li>
-                <li class="nav-item {{in_array(Request::path(), ['admin/convert', 'admin/import', 'admin/trafficLog', 'admin/analysis', 'admin/subscribeLog', 'emailLog/logList']) ? 'active open' : ''}}">
+                <li class="nav-item {{in_array(Request::path(), ['admin/decompile', 'admin/convert', 'admin/import', 'admin/trafficLog', 'admin/analysis', 'admin/subscribeLog', 'emailLog/logList']) ? 'active open' : ''}}">
                     <a href="javascript:;" class="nav-link nav-toggle">
                         <i class="icon-wrench"></i>
                         <span class="title">工具箱</span>
                         <span class="arrow"></span>
                     </a>
                     <ul class="sub-menu">
+                        <li class="nav-item {{in_array(Request::path(), ['admin/decompile']) ? 'active open' : ''}}">
+                            <a href="{{url('admin/decompile')}}" class="nav-link">
+                                <i class="icon-reload"></i>
+                                <span class="title">反解析</span>
+                            </a>
+                        </li>
                         <li class="nav-item {{in_array(Request::path(), ['admin/convert']) ? 'active open' : ''}}">
                             <a href="{{url('admin/convert')}}" class="nav-link">
                                 <i class="icon-refresh"></i>

Разница между файлами не показана из-за своего большого размера
+ 0 - 6
resources/views/serverStatus/css/bootstrap-theme.min.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 6
resources/views/serverStatus/css/bootstrap.min.css


+ 0 - 55
resources/views/serverStatus/css/light.css

@@ -1,55 +0,0 @@
-body { font-family:Molengo,"Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; background: #ebebeb url('../img/light.png'); }
-.announcement { color: #777; border-bottom: solid 3px #d0d0d0; background-color: #fff; padding: 10px 10px; text-align: center; transition: 0.3s; }
-.announcement:hover { border-bottom: solid 3px #159e83; transition: 0.3s; }
-.announcement p { display: inline-block;font-size: 15px;margin: 0;line-height: 1;text-indent: 5px; }
-.announcement i { display: inline-block;font-size: 15px;margin: 0;line-height: 1;color: #444; }
-.navbar { min-height: 50px; }
-.navbar-top { background-color: #4a4a4a !important; border-bottom: 6px solid #159e83; -moz-box-shadow: 0 -4px 0 rgba(0,0,0,.1); box-shadow: 0 6px 0 rgba(0,0,0,.1); }
-.navbar-brand { color: #fff; padding: 10px; font-size: 20px; }
-.dropdown .dropdown-toggle { padding-bottom: 10px; padding-top: 10px; }
-.navbar-inverse .navbar-brand { color: #fff; padding: 15px 20px 10px; font-size: 20px; }
-.content { background: #ffffff; padding: 20px; border: 1px #cecece solid; -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, .1); -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, .1); box-shadow: 0 1px 10px rgba(0, 0, 0, .1); margin-bottom: 20px; margin-top: 20px; }
-.table { background: #ffffff; margin-bottom: 0; border-collapse: collapse; border-radius: 3px; }
-.table th, .table td { text-align: center; }
-.table-striped tbody > tr.even > td, .table-striped tbody > tr.even > th { background-color: #F9F9F9; }
-.table-striped tbody > tr.odd > td, .table-striped tbody > tr.odd > th { background-color: #FFF; }
-.progress { margin-bottom: 0; }
-.progress-bar { color: #000; }
-.table-hover > tbody > tr:hover > td { background: #E6E6E6; }
-tr.even.expandRow > :hover { background: #F9F9F9 !important; }
-tr.odd.expandRow > :hover { background: #FFF !important; }
-.expandRow > td { padding: 0 !important; border-top: 0px !important; }
-#cpu, #ram, #hdd, #network, #traffic { min-width: 55px; max-width: 100px; }
-
-@media only screen and (max-width: 992px) {
-	#location, tr td:nth-child(4)		{ display:none; visibility:hidden; }
-}
-@media only screen and (max-width: 720px) {
-	#type, tr td:nth-child(3)			{ display:none; visibility:hidden; }
-	#location, tr td:nth-child(4)		{ display:none; visibility:hidden; }
-	#uptime, tr td:nth-child(5)			{ display:none; visibility:hidden; }
-}
-@media only screen and (max-width: 600px) {
-	#type, tr td:nth-child(3)			{ display:none; visibility:hidden; }
-	#location, tr td:nth-child(4)		{ display:none; visibility:hidden; }
-	#uptime, tr td:nth-child(5)			{ display:none; visibility:hidden; }
-	#load, tr td:nth-child(6)			{ display:none; visibility:hidden; }
-}
-@media only screen and (max-width: 533px) {
-	#type, tr td:nth-child(3)			{ display:none; visibility:hidden; }
-	#location, tr td:nth-child(4)		{ display:none; visibility:hidden; }
-	#uptime, tr td:nth-child(5)			{ display:none; visibility:hidden; }
-	#traffic, tr td:nth-child(8)		{ display:none; visibility:hidden; }
-	#load, tr td:nth-child(6)			{ display:none; visibility:hidden; }
-}
-@media only screen and (max-width: 450px) {
-	body								{ font-size: 10px; }
-	.content 							{ padding: 0; }
-	#name, tr td:nth-child(2)			{ min-width: 20px; max-width: 60px; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; }
-	#type, tr td:nth-child(3)			{ display:none; visibility:hidden; }
-	#location, tr td:nth-child(4)		{ display:none; visibility:hidden; }
-	#uptime, tr td:nth-child(5)			{ display:none; visibility:hidden; }
-	#traffic, tr td:nth-child(8)		{ display:none; visibility:hidden; }
-	#hdd, tr td:nth-child(11)		{ display:none; visibility:hidden; }
-	#cpu, #ram { min-width: 20px; max-width: 40px; }
-}

BIN
resources/views/serverStatus/favicon.ico


BIN
resources/views/serverStatus/img/light.png


+ 0 - 77
resources/views/serverStatus/index.html

@@ -1,77 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh">
-	<head>
-		<title>逗比云监控</title>
-		<meta charset="utf-8">
-		<meta http-equiv="X-UA-Compatible" content="IE=edge">
-		<meta name="viewport" content="width=device-width, initial-scale=1.0">
-		<link rel="stylesheet" href="css/bootstrap.min.css">
-		<link rel="stylesheet" href="css/bootstrap-theme.min.css">
-		<link href="//fonts.cat.net/css?family=Molengo"rel="stylesheet">
-		<link rel="stylesheet" href="css/light.css">
-		<style>
-			body {
-				padding-top: 70px;
-				padding-bottom: 30px;
-			}
-		</style>
-	</head>
-	<body>
-		<div role="navigation" class="navbar navbar-inverse navbar-fixed-top navbar-top">
-			<div class="navbar-inner">
-				<div class="container">
-					<div class="navbar-header">
-						<a href="#" class="navbar-brand">逗比云监控</a>
-					</div>
-				</div>
-			</div>
-		</div>
-		
-		<div class="container announcement">
-		<p>逗比云监控演示 / 自建<a target="_blank" href="https://doub.io/sszhfx/">免费SS节点</a> 监控站 —— <a target="_blank" href="https://doub.io">逗比根据地</a></p>
-		</div>
-		
-		<div class="container content">
-			<div id="loading-notice">
-				<div class="progress progress-striped center-block active" style="width: 50%;">
-					<div class="progress-bar progress-bar-warning" style="width: 99%;">加载中...</div>
-				</div>
-				<div style="text-align: center;">
-					如果出现此消息,请确保您已启用JavaScript ! <br />否则云监控主服务(服务端) 未启动或已关闭.
-				</div>
-				<br />
-			</div>
-			<table class="table table-striped table-condensed table-hover">
-				<thead>
-				<tr>
-					<th id="status4" class="center-block">IPv4</th>
-					<th id="name">节点名</th>
-					<th id="type">虚拟化</th>
-					<th id="location">位置</th>
-					<th id="uptime">在线时间</th>
-					<th id="load">负载</th>
-					<th id="network">网络(B/s) ↓|↑</th>
-					<th id="traffic">流量(B) ↓|↑</th>
-					<th id="cpu">CPU</th>
-					<th id="ram">内存</th>
-					<th id="hdd">硬盘</th>
-				</tr>
-				</thead>
-				<tbody id="servers">
-				<!-- Servers here \o/ -->
-				</tbody>
-			</table>
-			<br />
-			<div id="updated" style="margin-left: 5px;">Updating...</div>
-		</div>
-
-		<div class="container">
-			<p style="text-align: center; font-size: 10px;">
-				<a href="https://github.com/ToyoDAdoubi/ServerStatus-Toyo">ServerStatus-Toyo</a> 基于 <a href="https://github.com/tenyue/ServerStatus">ServerStatus中文版</a>
-			</p>
-		</div>
-		<script src="js/jquery-1.10.2.min.js"></script>
-		<script src="js/bootstrap.min.js"></script>
-		<script src="js/serverstatus.js"></script>
-	</body>
-</html>

Разница между файлами не показана из-за своего большого размера
+ 0 - 6
resources/views/serverStatus/js/bootstrap.min.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 3
resources/views/serverStatus/js/jquery-1.10.2.min.js


+ 0 - 383
resources/views/serverStatus/js/serverstatus.js

@@ -1,383 +0,0 @@
-// serverstatus.js
-var error = 0;
-var d = 0;
-var server_status = new Array();
-
-function timeSince(date) {
-	if(date == 0)
-		return "从未.";
-
-	var seconds = Math.floor((new Date() - date) / 1000);
-	var interval = Math.floor(seconds / 31536000);
-
-	if (interval > 1)
-		return interval + " 年前.";
-	interval = Math.floor(seconds / 2592000);
-	if (interval > 1)
-		return interval + " 月前.";
-	interval = Math.floor(seconds / 86400);
-	if (interval > 1)
-		return interval + " 日前.";
-	interval = Math.floor(seconds / 3600);
-	if (interval > 1)
-		return interval + " 小时前.";
-	interval = Math.floor(seconds / 60);
-	if (interval > 1)
-		return interval + " 分钟前.";
-	/*if(Math.floor(seconds) >= 5)
-		return Math.floor(seconds) + " seconds";*/
-	else
-		return "几秒前.";
-}
-
-function bytesToSize(bytes, precision, si)
-{
-	var ret;
-	si = typeof si !== 'undefined' ? si : 0;
-	if(si != 0) {
-		var kilobyte = 1000;
-		var megabyte = kilobyte * 1000;
-		var gigabyte = megabyte * 1000;
-		var terabyte = gigabyte * 1000;
-	} else {
-		var kilobyte = 1024;
-		var megabyte = kilobyte * 1024;
-		var gigabyte = megabyte * 1024;
-		var terabyte = gigabyte * 1024;
-	}
-
-	if ((bytes >= 0) && (bytes < kilobyte)) {
-		return bytes + ' B';
-
-	} else if ((bytes >= kilobyte) && (bytes < megabyte)) {
-		ret = (bytes / kilobyte).toFixed(precision) + ' K';
-
-	} else if ((bytes >= megabyte) && (bytes < gigabyte)) {
-		ret = (bytes / megabyte).toFixed(precision) + ' M';
-
-	} else if ((bytes >= gigabyte) && (bytes < terabyte)) {
-		ret = (bytes / gigabyte).toFixed(precision) + ' G';
-
-	} else if (bytes >= terabyte) {
-		ret = (bytes / terabyte).toFixed(precision) + ' T';
-
-	} else {
-		return bytes + ' B';
-	}
-	if(si != 0) {
-		return ret + 'B';
-	} else {
-		return ret + 'iB';
-	}
-}
-
-function uptime() {
-	$.getJSON("json/stats.json", function(result) {
-		$("#loading-notice").remove();
-		if(result.reload)
-			setTimeout(function() { location.reload(true) }, 1000);
-
-		for (var i = 0; i < result.servers.length; i++) {
-			var TableRow = $("#servers tr#r" + i);
-			var ExpandRow = $("#servers #rt" + i);
-			var hack; // fuck CSS for making me do this
-			if(i%2) hack="odd"; else hack="even";
-			if (!TableRow.length) {
-				$("#servers").append(
-					"<tr id=\"r" + i + "\" data-toggle=\"collapse\" data-target=\"#rt" + i + "\" class=\"accordion-toggle " + hack + "\">" +
-						"<td id=\"online4\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
-						"<td id=\"name\">加载中</td>" +
-						"<td id=\"type\">加载中</td>" +
-						"<!-- td id=\"host\">加载中</td -->" +
-						"<td id=\"location\">加载中</td>" +
-						"<td id=\"uptime\">加载中</td>" +
-						"<td id=\"load\">加载中</td>" +
-						"<td id=\"network\">加载中</td>" +
-						"<td id=\"traffic\">加载中</td>" +
-						"<td id=\"cpu\"><div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
-						"<td id=\"memory\"><div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
-						"<td id=\"hdd\"><div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
-					"</tr>" +
-					"<tr class=\"expandRow " + hack + "\"><td colspan=\"12\"><div class=\"accordian-body collapse\" id=\"rt" + i + "\">" +
-						"<div id=\"expand_mem\">加载中</div>" +
-						"<div id=\"expand_swap\">加载中</div>" +
-						"<div id=\"expand_hdd\">加载中</div>" +
-						"<div id=\"expand_custom\">加载中</div>" +
-					"</div></td></tr>"
-				);
-				TableRow = $("#servers tr#r" + i);
-				ExpandRow = $("#servers #rt" + i);
-				server_status[i] = true;
-			}
-			TableRow = TableRow[0];
-			if(error) {
-				TableRow.setAttribute("data-target", "#rt" + i);
-				server_status[i] = true;
-			}
-
-			// Online4
-			if (result.servers[i].online4) {
-				TableRow.children["online4"].children[0].children[0].className = "progress-bar progress-bar-success";
-				TableRow.children["online4"].children[0].children[0].innerHTML = "<small>开启</small>";
-			} else {
-				TableRow.children["online4"].children[0].children[0].className = "progress-bar progress-bar-danger";
-				TableRow.children["online4"].children[0].children[0].innerHTML = "<small>关闭</small>";
-			}
-
-			// Online6
-			//if (result.servers[i].online6) {
-			//	TableRow.children["online6"].children[0].children[0].className = "progress-bar progress-bar-success";
-			//	TableRow.children["online6"].children[0].children[0].innerHTML = "<small>开启</small>";
-			//} else {
-			//	TableRow.children["online6"].children[0].children[0].className = "progress-bar progress-bar-danger";
-			//	TableRow.children["online6"].children[0].children[0].innerHTML = "<small>关闭</small>";
-			//}
-
-			// Name
-			TableRow.children["name"].innerHTML = result.servers[i].name;
-
-			// Type
-			TableRow.children["type"].innerHTML = result.servers[i].type;
-
-			// Host
-			//TableRow.children["host"].innerHTML = result.servers[i].host;
-
-			// Location
-			TableRow.children["location"].innerHTML = result.servers[i].location;
-			if (!result.servers[i].online4 && !result.servers[i].online6) {
-				if (server_status[i]) {
-					TableRow.children["uptime"].innerHTML = "–";
-					TableRow.children["load"].innerHTML = "–";
-					TableRow.children["network"].innerHTML = "–";
-					TableRow.children["traffic"].innerHTML = "–";
-					TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-danger";
-					TableRow.children["cpu"].children[0].children[0].style.width = "100%";
-					TableRow.children["cpu"].children[0].children[0].innerHTML = "<small>关闭</small>";
-					TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-danger";
-					TableRow.children["memory"].children[0].children[0].style.width = "100%";
-					TableRow.children["memory"].children[0].children[0].innerHTML = "<small>关闭</small>";
-					TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-danger";
-					TableRow.children["hdd"].children[0].children[0].style.width = "100%";
-					TableRow.children["hdd"].children[0].children[0].innerHTML = "<small>关闭</small>";
-					if(ExpandRow.hasClass("in")) {
-						ExpandRow.collapse("hide");
-					}
-					TableRow.setAttribute("data-target", "");
-					server_status[i] = false;
-				}
-			} else {
-				if (!server_status[i]) {
-					TableRow.setAttribute("data-target", "#rt" + i);
-					server_status[i] = true;
-				}
-
-				// Uptime
-				TableRow.children["uptime"].innerHTML = result.servers[i].uptime;
-
-				// Load
-				if(result.servers[i].load == -1) {
-					TableRow.children["load"].innerHTML = "–";
-				} else {
-					TableRow.children["load"].innerHTML = result.servers[i].load;
-				}
-
-				// Network
-				var netstr = "";
-				if(result.servers[i].network_rx < 1000)
-					netstr += result.servers[i].network_rx.toFixed(0) + "B";
-				else if(result.servers[i].network_rx < 1000*1000)
-					netstr += (result.servers[i].network_rx/1000).toFixed(0) + "K";
-				else
-					netstr += (result.servers[i].network_rx/1000/1000).toFixed(1) + "M";
-				netstr += " | "
-				if(result.servers[i].network_tx < 1000)
-					netstr += result.servers[i].network_tx.toFixed(0) + "B";
-				else if(result.servers[i].network_tx < 1000*1000)
-					netstr += (result.servers[i].network_tx/1000).toFixed(0) + "K";
-				else
-					netstr += (result.servers[i].network_tx/1000/1000).toFixed(1) + "M";
-				TableRow.children["network"].innerHTML = netstr;
-
-				//Traffic
-				var trafficstr = "";
-				if(result.servers[i].network_in < 1024)
-					trafficstr += result.servers[i].network_in.toFixed(0) + "B";
-				else if(result.servers[i].network_in < 1024*1024)
-					trafficstr += (result.servers[i].network_in/1024).toFixed(0) + "K";
-				else if(result.servers[i].network_in < 1024*1024*1024)
-					trafficstr += (result.servers[i].network_in/1024/1024).toFixed(1) + "M";
-				else if(result.servers[i].network_in < 1024*1024*1024*1024)
-					trafficstr += (result.servers[i].network_in/1024/1024/1024).toFixed(2) + "G";
-				else
-					trafficstr += (result.servers[i].network_in/1024/1024/1024/1024).toFixed(2) + "T";
-				trafficstr += " | "
-				if(result.servers[i].network_out < 1024)
-					trafficstr += result.servers[i].network_out.toFixed(0) + "B";
-				else if(result.servers[i].network_out < 1024*1024)
-					trafficstr += (result.servers[i].network_out/1024).toFixed(0) + "K";
-				else if(result.servers[i].network_out < 1024*1024*1024)
-					trafficstr += (result.servers[i].network_out/1024/1024).toFixed(1) + "M";
-				else if(result.servers[i].network_out < 1024*1024*1024*1024)
-					trafficstr += (result.servers[i].network_out/1024/1024/1024).toFixed(2) + "G";
-				else
-					trafficstr += (result.servers[i].network_out/1024/1024/1024/1024).toFixed(2) + "T";
-				TableRow.children["traffic"].innerHTML = trafficstr;
-
-				// CPU
-				if (result.servers[i].cpu >= 90)
-					TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-danger";
-				else if (result.servers[i].cpu >= 80)
-					TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-warning";
-				else
-					TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-success";
-				TableRow.children["cpu"].children[0].children[0].style.width = result.servers[i].cpu + "%";
-				TableRow.children["cpu"].children[0].children[0].innerHTML = result.servers[i].cpu + "%";
-
-				// Memory
-				var Mem = ((result.servers[i].memory_used/result.servers[i].memory_total)*100.0).toFixed(0);
-				if (Mem >= 90)
-					TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-danger";
-				else if (Mem >= 80)
-					TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-warning";
-				else
-					TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-success";
-				TableRow.children["memory"].children[0].children[0].style.width = Mem + "%";
-				TableRow.children["memory"].children[0].children[0].innerHTML = Mem + "%";
-				ExpandRow[0].children["expand_mem"].innerHTML = "内存信息: " + bytesToSize(result.servers[i].memory_used*1024, 2) + " / " + bytesToSize(result.servers[i].memory_total*1024, 2);
-				// Swap
-				ExpandRow[0].children["expand_swap"].innerHTML = "交换分区: " + bytesToSize(result.servers[i].swap_used*1024, 2) + " / " + bytesToSize(result.servers[i].swap_total*1024, 2);
-
-				// HDD
-				var HDD = ((result.servers[i].hdd_used/result.servers[i].hdd_total)*100.0).toFixed(0);
-				if (HDD >= 90)
-					TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-danger";
-				else if (HDD >= 80)
-					TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-warning";
-				else
-					TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-success";
-				TableRow.children["hdd"].children[0].children[0].style.width = HDD + "%";
-				TableRow.children["hdd"].children[0].children[0].innerHTML = HDD + "%";
-				ExpandRow[0].children["expand_hdd"].innerHTML = "硬盘信息: " + bytesToSize(result.servers[i].hdd_used*1024*1024, 2) + " / " + bytesToSize(result.servers[i].hdd_total*1024*1024, 2);
-
-				// Custom
-				if (result.servers[i].custom) {
-					ExpandRow[0].children["expand_custom"].innerHTML = result.servers[i].custom
-				} else {
-					ExpandRow[0].children["expand_custom"].innerHTML = ""
-				}
-			}
-		};
-
-		d = new Date(result.updated*1000);
-		error = 0;
-	}).fail(function(update_error) {
-		if (!error) {
-			$("#servers > tr.accordion-toggle").each(function(i) {
-				var TableRow = $("#servers tr#r" + i)[0];
-				var ExpandRow = $("#servers #rt" + i);
-				TableRow.children["online4"].children[0].children[0].className = "progress-bar progress-bar-error";
-				TableRow.children["online4"].children[0].children[0].innerHTML = "<small>错误</small>";
-				//TableRow.children["online6"].children[0].children[0].className = "progress-bar progress-bar-error";
-				//TableRow.children["online6"].children[0].children[0].innerHTML = "<small>错误</small>";
-				TableRow.children["uptime"].innerHTML = "<div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-error\"><small>错误</small></div></div>";
-				TableRow.children["load"].innerHTML = "<div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-error\"><small>错误</small></div></div>";
-				TableRow.children["network"].innerHTML = "<div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-error\"><small>错误</small></div></div>";
-				TableRow.children["traffic"].innerHTML = "<div class=\"progress progress-striped active\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-error\"><small>错误</small></div></div>";
-				TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-error";
-				TableRow.children["cpu"].children[0].children[0].style.width = "100%";
-				TableRow.children["cpu"].children[0].children[0].innerHTML = "<small>错误</small>";
-				TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-error";
-				TableRow.children["memory"].children[0].children[0].style.width = "100%";
-				TableRow.children["memory"].children[0].children[0].innerHTML = "<small>错误</small>";
-				TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-error";
-				TableRow.children["hdd"].children[0].children[0].style.width = "100%";
-				TableRow.children["hdd"].children[0].children[0].innerHTML = "<small>错误</small>";
-				if(ExpandRow.hasClass("in")) {
-					ExpandRow.collapse("hide");
-				}
-				TableRow.setAttribute("data-target", "");
-				server_status[i] = false;
-			});
-		}
-		error = 1;
-		$("#updated").html("更新错误.");
-	});
-}
-
-function updateTime() {
-	if (!error)
-		$("#updated").html("最后更新: " + timeSince(d));
-}
-
-uptime();
-updateTime();
-setInterval(uptime, 2000);
-setInterval(updateTime, 500);
-
-
-// styleswitcher.js
-function setActiveStyleSheet(title) {
-	var i, a, main;
-	for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
-		if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
-			a.disabled = true;
-			if(a.getAttribute("title") == title) a.disabled = false;
-		}
-	}
-}
-
-function getActiveStyleSheet() {
-	var i, a;
-	for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
-		if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled)
-			return a.getAttribute("title");
-	}
-	return null;
-}
-
-function getPreferredStyleSheet() {
-	var i, a;
-	for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
-		if(a.getAttribute("rel").indexOf("style") != -1	&& a.getAttribute("rel").indexOf("alt") == -1 && a.getAttribute("title"))
-			return a.getAttribute("title");
-	}
-return null;
-}
-
-function createCookie(name,value,days) {
-	if (days) {
-		var date = new Date();
-		date.setTime(date.getTime()+(days*24*60*60*1000));
-		var expires = "; expires="+date.toGMTString();
-	}
-	else expires = "";
-	document.cookie = name+"="+value+expires+"; path=/";
-}
-
-function readCookie(name) {
-	var nameEQ = name + "=";
-	var ca = document.cookie.split(';');
-	for(var i=0;i < ca.length;i++) {
-		var c = ca[i];
-		while (c.charAt(0)==' ')
-			c = c.substring(1,c.length);
-		if (c.indexOf(nameEQ) == 0)
-			return c.substring(nameEQ.length,c.length);
-	}
-	return null;
-}
-
-window.onload = function(e) {
-	var cookie = readCookie("style");
-	var title = cookie ? cookie : getPreferredStyleSheet();
-	setActiveStyleSheet(title);
-}
-
-window.onunload = function(e) {
-	var title = getActiveStyleSheet();
-	createCookie("style", title, 365);
-}
-
-var cookie = readCookie("style");
-var title = cookie ? cookie : getPreferredStyleSheet();
-setActiveStyleSheet(title);

+ 0 - 2
resources/views/serverStatus/json/.gitignore

@@ -1,2 +0,0 @@
-stats.json
-stats.json~

+ 1 - 0
resources/views/user/index.blade.php

@@ -99,6 +99,7 @@
                                 <a href="javascript:;" data-toggle="modal" data-target="#exchange_modal" style="color:#FFF;">兑换</a>
                             </span>
                         </p>
+                        <p class="text-muted"> {{trans('home.account_status')}}:{{$info['enable'] ? '正常' : '禁用'}} </p>
                         <p class="text-muted"> {{trans('home.account_expire')}}:{{date('Y-m-d 0:0:0') > $info['expire_time'] ? '已过期' : $info['expire_time']}} </p>
                         <p class="text-muted"> {{trans('home.account_last_usage')}}:{{empty($info['t']) ? '从未使用' : date('Y-m-d H:i:s', $info['t'])}} </p>
                         <p class="text-muted"> {{trans('home.account_last_login')}}:{{empty($info['last_login']) ? '未登录' : date('Y-m-d H:i:s', $info['last_login'])}} </p>

+ 1 - 0
routes/web.php

@@ -81,6 +81,7 @@ Route::group(['middleware' => ['user', 'admin']], function() {
     Route::get('coupon/exportCoupon', 'CouponController@exportCoupon'); // 导出优惠券
     Route::get('emailLog/logList', 'EmailLogController@logList'); // 邮件发送日志
     Route::post("admin/switchToUser","AdminController@switchToUser"); // 转换成某个用户的身份
+    Route::any("admin/decompile", "AdminController@decompile"); // SS(R)链接反解析
 });
 
 Route::group(['middleware' => ['user']], function() {

Некоторые файлы не были показаны из-за большого количества измененных файлов