Explorar o código

dashboard: add proxy start and close time

fatedier %!s(int64=7) %!d(string=hai) anos
pai
achega
e29a1330ed

+ 1 - 1
assets/static/index.html

@@ -1 +1 @@
-<!DOCTYPE html> <html lang=en> <head> <meta charset=utf-8> <title>frps dashboard</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <div id=app></div> <script type="text/javascript" src="manifest.js?189199ae955b61cb7046"></script><script type="text/javascript" src="vendor.js?66dfcf2d1c500e900413"></script><script type="text/javascript" src="index.js?ba5d6545ccb2ffaaf197"></script></body> </html> 
+<!DOCTYPE html> <html lang=en> <head> <meta charset=utf-8> <title>frps dashboard</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <div id=app></div> <script type="text/javascript" src="manifest.js?5217927b66cc446ebfd3"></script><script type="text/javascript" src="vendor.js?66dfcf2d1c500e900413"></script><script type="text/javascript" src="index.js?bf962cded96400bef9a0"></script></body> </html> 

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
assets/static/index.js


+ 1 - 1
assets/static/manifest.js

@@ -1 +1 @@
-!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var a,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(a in c)Object.prototype.hasOwnProperty.call(c,a)&&(e[a]=c[a]);for(n&&n(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=r(r.s=u[l]);return f};var t={},o={2:0};r.e=function(e){function n(){u.onerror=u.onload=null,clearTimeout(a);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=new Promise(function(r,n){o[e]=[r,n]});o[e][2]=t;var c=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,r.nc&&u.setAttribute("nonce",r.nc),u.src=r.p+""+e+".js?"+{0:"ba5d6545ccb2ffaaf197",1:"66dfcf2d1c500e900413"}[e];var a=setTimeout(n,12e4);return u.onerror=u.onload=n,c.appendChild(u),t},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,n,t){r.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
+!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(n&&n(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=r(r.s=u[l]);return f};var t={},o={2:0};r.e=function(e){function n(){u.onerror=u.onload=null,clearTimeout(i);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=new Promise(function(r,n){o[e]=[r,n]});o[e][2]=t;var c=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,r.nc&&u.setAttribute("nonce",r.nc),u.src=r.p+""+e+".js?"+{0:"bf962cded96400bef9a0",1:"66dfcf2d1c500e900413"}[e];var i=setTimeout(n,12e4);return u.onerror=u.onload=n,c.appendChild(u),t},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,n,t){r.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
assets/statik/statik.go


+ 5 - 1
server/dashboard_api.go

@@ -89,6 +89,8 @@ type ProxyStatsInfo struct {
 	TodayTrafficIn  int64            `json:"today_traffic_in"`
 	TodayTrafficOut int64            `json:"today_traffic_out"`
 	CurConns        int64            `json:"cur_conns"`
+	LastStartTime   string           `json:"last_start_time"`
+	LastCloseTime   string           `json:"last_close_time"`
 	Status          string           `json:"status"`
 }
 
@@ -176,10 +178,12 @@ func getProxyStatsByType(proxyType string) (proxyInfos []*ProxyStatsInfo) {
 		} else {
 			proxyInfo.Status = consts.Offline
 		}
+		proxyInfo.Name = ps.Name
 		proxyInfo.TodayTrafficIn = ps.TodayTrafficIn
 		proxyInfo.TodayTrafficOut = ps.TodayTrafficOut
 		proxyInfo.CurConns = ps.CurConns
-		proxyInfo.Name = ps.Name
+		proxyInfo.LastStartTime = ps.LastStartTime
+		proxyInfo.LastCloseTime = ps.LastCloseTime
 		proxyInfos = append(proxyInfos, proxyInfo)
 	}
 	return

+ 14 - 6
server/metric.go

@@ -117,15 +117,15 @@ func StatsNewProxy(name string, proxyType string) {
 		proxyStats, ok := globalStats.ProxyStatistics[name]
 		if !(ok && proxyStats.ProxyType == proxyType) {
 			proxyStats = &ProxyStatistics{
-				Name:          name,
-				ProxyType:     proxyType,
-				CurConns:      metric.NewCounter(),
-				TrafficIn:     metric.NewDateCounter(ReserveDays),
-				TrafficOut:    metric.NewDateCounter(ReserveDays),
-				LastStartTime: time.Now(),
+				Name:       name,
+				ProxyType:  proxyType,
+				CurConns:   metric.NewCounter(),
+				TrafficIn:  metric.NewDateCounter(ReserveDays),
+				TrafficOut: metric.NewDateCounter(ReserveDays),
 			}
 			globalStats.ProxyStatistics[name] = proxyStats
 		}
+		proxyStats.LastStartTime = time.Now()
 	}
 }
 
@@ -230,6 +230,8 @@ type ProxyStats struct {
 	Type            string
 	TodayTrafficIn  int64
 	TodayTrafficOut int64
+	LastStartTime   string
+	LastCloseTime   string
 	CurConns        int64
 }
 
@@ -250,6 +252,12 @@ func StatsGetProxiesByType(proxyType string) []*ProxyStats {
 			TodayTrafficOut: proxyStats.TrafficOut.TodayCount(),
 			CurConns:        proxyStats.CurConns.Count(),
 		}
+		if !proxyStats.LastStartTime.IsZero() {
+			ps.LastStartTime = proxyStats.LastStartTime.Format("01-02 15:04:05")
+		}
+		if !proxyStats.LastCloseTime.IsZero() {
+			ps.LastCloseTime = proxyStats.LastCloseTime.Format("01-02 15:04:05")
+		}
 		res = append(res, ps)
 	}
 	return res

+ 1 - 1
web/frps/src/components/Overview.vue

@@ -28,7 +28,7 @@
                         <el-form-item label="Client Counts">
                           <span>{{ client_counts }}</span>
                         </el-form-item>
-                        <el-form-item label="Current Conns">
+                        <el-form-item label="Current Connections">
                           <span>{{ cur_conns }}</span>
                         </el-form-item>
                         <el-form-item label="Proxy Counts">

+ 6 - 0
web/frps/src/components/ProxiesHttp.vue

@@ -39,6 +39,12 @@
             <el-form-item label="Compression">
               <span>{{ props.row.compression }}</span>
             </el-form-item>
+            <el-form-item label="Last Start">
+              <span>{{ props.row.last_start_time }}</span>
+            </el-form-item>
+            <el-form-item label="Last Close">
+              <span>{{ props.row.last_close_time }}</span>
+            </el-form-item>
         </el-form>
     </template>
     </el-table-column>

+ 6 - 0
web/frps/src/components/ProxiesHttps.vue

@@ -33,6 +33,12 @@
             <el-form-item label="Compression">
               <span>{{ props.row.compression }}</span>
             </el-form-item>
+            <el-form-item label="Last Start">
+              <span>{{ props.row.last_start_time }}</span>
+            </el-form-item>
+            <el-form-item label="Last Close">
+              <span>{{ props.row.last_close_time }}</span>
+            </el-form-item>
         </el-form>
     </template>
     </el-table-column>

+ 6 - 0
web/frps/src/components/ProxiesTcp.vue

@@ -30,6 +30,12 @@
             <el-form-item label="Compression">
               <span>{{ props.row.compression }}</span>
             </el-form-item>
+            <el-form-item label="Last Start">
+              <span>{{ props.row.last_start_time }}</span>
+            </el-form-item>
+            <el-form-item label="Last Close">
+              <span>{{ props.row.last_close_time }}</span>
+            </el-form-item>
         </el-form>
         </template>
     </el-table-column>

+ 6 - 0
web/frps/src/components/ProxiesUdp.vue

@@ -30,6 +30,12 @@
             <el-form-item label="Compression">
               <span>{{ props.row.compression }}</span>
             </el-form-item>
+            <el-form-item label="Last Start">
+              <span>{{ props.row.last_start_time }}</span>
+            </el-form-item>
+            <el-form-item label="Last Close">
+              <span>{{ props.row.last_close_time }}</span>
+            </el-form-item>
         </el-form>
     </template>
     </el-table-column>

+ 2 - 0
web/frps/src/utils/proxy.js

@@ -11,6 +11,8 @@ class BaseProxy {
         this.conns = proxyStats.cur_conns
         this.traffic_in = proxyStats.today_traffic_in
         this.traffic_out = proxyStats.today_traffic_out
+        this.last_start_time = proxyStats.last_start_time
+        this.last_close_time = proxyStats.last_close_time
         this.status = proxyStats.status
     }
 }

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio