Browse Source

auto update script executed

Toby Chui 1 year ago
parent
commit
c0e4339dca

+ 42 - 32
api.go

@@ -35,6 +35,48 @@ func initAPIs() {
 		http.Handle("/", fs)
 	}
 
+	//Authentication APIs
+	registerAuthAPIs(requireAuth)
+
+	//Reverse proxy
+	authRouter.HandleFunc("/api/proxy/enable", ReverseProxyHandleOnOff)
+	authRouter.HandleFunc("/api/proxy/add", ReverseProxyHandleAddEndpoint)
+	authRouter.HandleFunc("/api/proxy/status", ReverseProxyStatus)
+	authRouter.HandleFunc("/api/proxy/list", ReverseProxyList)
+	authRouter.HandleFunc("/api/proxy/del", DeleteProxyEndpoint)
+	authRouter.HandleFunc("/api/proxy/setIncoming", HandleIncomingPortSet)
+	authRouter.HandleFunc("/api/proxy/useHttpsRedirect", HandleUpdateHttpsRedirect)
+
+	//TLS / SSL config
+	authRouter.HandleFunc("/api/cert/tls", handleToggleTLSProxy)
+	authRouter.HandleFunc("/api/cert/upload", handleCertUpload)
+	authRouter.HandleFunc("/api/cert/list", handleListCertificate)
+	authRouter.HandleFunc("/api/cert/checkDefault", handleDefaultCertCheck)
+	authRouter.HandleFunc("/api/cert/delete", handleCertRemove)
+
+	//Redirection config
+	authRouter.HandleFunc("/api/redirect/list", handleListRedirectionRules)
+	authRouter.HandleFunc("/api/redirect/add", handleAddRedirectionRule)
+	authRouter.HandleFunc("/api/redirect/delete", handleDeleteRedirectionRule)
+
+	//Blacklist APIs
+	authRouter.HandleFunc("/api/blacklist/list", handleListBlacklisted)
+	authRouter.HandleFunc("/api/blacklist/country/add", handleCountryBlacklistAdd)
+	authRouter.HandleFunc("/api/blacklist/country/remove", handleCountryBlacklistRemove)
+	authRouter.HandleFunc("/api/blacklist/ip/add", handleIpBlacklistAdd)
+	authRouter.HandleFunc("/api/blacklist/ip/remove", handleIpBlacklistRemove)
+	authRouter.HandleFunc("/api/blacklist/enable", handleBlacklistEnable)
+
+	//Statistic API
+	authRouter.HandleFunc("/api/stats/summary", statisticCollector.HandleTodayStatLoad)
+
+	//Upnp
+	authRouter.HandleFunc("/api/upnp/discover", handleUpnpDiscover)
+	//If you got APIs to add, append them here
+}
+
+//Function to renders Auth related APIs
+func registerAuthAPIs(requireAuth bool) {
 	//Auth APIs
 	http.HandleFunc("/api/auth/login", authAgent.HandleLogin)
 	http.HandleFunc("/api/auth/logout", authAgent.HandleLogout)
@@ -107,36 +149,4 @@ func initAPIs() {
 		authAgent.CreateUserAccount(username, newPassword, "")
 	})
 
-	//Reverse proxy
-	authRouter.HandleFunc("/api/proxy/enable", ReverseProxyHandleOnOff)
-	authRouter.HandleFunc("/api/proxy/add", ReverseProxyHandleAddEndpoint)
-	authRouter.HandleFunc("/api/proxy/status", ReverseProxyStatus)
-	authRouter.HandleFunc("/api/proxy/list", ReverseProxyList)
-	authRouter.HandleFunc("/api/proxy/del", DeleteProxyEndpoint)
-	authRouter.HandleFunc("/api/proxy/setIncoming", HandleIncomingPortSet)
-	authRouter.HandleFunc("/api/proxy/useHttpsRedirect", HandleUpdateHttpsRedirect)
-
-	//TLS / SSL config
-	authRouter.HandleFunc("/api/cert/tls", handleToggleTLSProxy)
-	authRouter.HandleFunc("/api/cert/upload", handleCertUpload)
-	authRouter.HandleFunc("/api/cert/list", handleListCertificate)
-	authRouter.HandleFunc("/api/cert/checkDefault", handleDefaultCertCheck)
-	authRouter.HandleFunc("/api/cert/delete", handleCertRemove)
-
-	//Redirection config
-	authRouter.HandleFunc("/api/redirect/list", handleListRedirectionRules)
-	authRouter.HandleFunc("/api/redirect/add", handleAddRedirectionRule)
-	authRouter.HandleFunc("/api/redirect/delete", handleDeleteRedirectionRule)
-
-	//Blacklist APIs
-	authRouter.HandleFunc("/api/blacklist/list", handleListBlacklisted)
-	authRouter.HandleFunc("/api/blacklist/country/add", handleCountryBlacklistAdd)
-	authRouter.HandleFunc("/api/blacklist/country/remove", handleCountryBlacklistRemove)
-	authRouter.HandleFunc("/api/blacklist/ip/add", handleIpBlacklistAdd)
-	authRouter.HandleFunc("/api/blacklist/ip/remove", handleIpBlacklistRemove)
-	authRouter.HandleFunc("/api/blacklist/enable", handleBlacklistEnable)
-
-	//Upnp
-	authRouter.HandleFunc("/api/upnp/discover", handleUpnpDiscover)
-	//If you got APIs to add, append them here
 }

+ 0 - 2
mod/dynamicproxy/dpcore/dpcore.go

@@ -2,7 +2,6 @@ package dpcore
 
 import (
 	"errors"
-	"fmt"
 	"io"
 	"log"
 	"net"
@@ -298,7 +297,6 @@ func (p *ReverseProxy) ProxyHTTP(rw http.ResponseWriter, req *http.Request) erro
 	//Custom header rewriter functions
 	if res.Header.Get("Location") != "" {
 		//Custom redirection to this rproxy relative path
-		fmt.Println(res.Header.Get("Location"))
 		res.Header.Set("Location", filepath.ToSlash(filepath.Join(p.Prepender, res.Header.Get("Location"))))
 	}
 	// Copy header from response to client.

+ 0 - 2
mod/dynamicproxy/proxyRequestHandler.go

@@ -2,7 +2,6 @@ package dynamicproxy
 
 import (
 	"errors"
-	"fmt"
 	"log"
 	"net"
 	"net/http"
@@ -143,7 +142,6 @@ func (h *ProxyHandler) logRequest(r *http.Request, succ bool, statusCode int, fo
 				StatusCode:                    statusCode,
 				ForwardType:                   forwardType,
 			}
-			fmt.Println(requestInfo)
 			h.Parent.Option.StatisticCollector.RecordRequest(requestInfo)
 		}()
 

+ 58 - 2
mod/statistic/handler.go

@@ -15,6 +15,62 @@ import (
 */
 
 func (c *Collector) HandleTodayStatLoad(w http.ResponseWriter, r *http.Request) {
-	js, _ := json.Marshal(c.DailySummary)
-	utils.SendJSONResponse(w, string(js))
+	type DailySummaryExport struct {
+		TotalRequest int64 //Total request of the day
+		ErrorRequest int64 //Invalid request of the day, including error or not found
+		ValidRequest int64 //Valid request of the day
+
+		ForwardTypes    map[string]int
+		RequestOrigin   map[string]int
+		RequestClientIp map[string]int
+	}
+
+	fast, err := utils.GetPara(r, "fast")
+	if err != nil {
+		fast = "false"
+	}
+	d := c.DailySummary
+	if fast == "true" {
+		//Only return the counter
+		exported := DailySummaryExport{
+			TotalRequest: d.TotalRequest,
+			ErrorRequest: d.ErrorRequest,
+			ValidRequest: d.ValidRequest,
+		}
+		js, _ := json.Marshal(exported)
+		utils.SendJSONResponse(w, string(js))
+	} else {
+		//Return everything
+		exported := DailySummaryExport{
+			TotalRequest:    d.TotalRequest,
+			ErrorRequest:    d.ErrorRequest,
+			ValidRequest:    d.ValidRequest,
+			ForwardTypes:    make(map[string]int),
+			RequestOrigin:   make(map[string]int),
+			RequestClientIp: make(map[string]int),
+		}
+
+		// Export ForwardTypes sync.Map
+		d.ForwardTypes.Range(func(key, value interface{}) bool {
+			exported.ForwardTypes[key.(string)] = value.(int)
+			return true
+		})
+
+		// Export RequestOrigin sync.Map
+		d.RequestOrigin.Range(func(key, value interface{}) bool {
+			exported.RequestOrigin[key.(string)] = value.(int)
+			return true
+		})
+
+		// Export RequestClientIp sync.Map
+		d.RequestClientIp.Range(func(key, value interface{}) bool {
+			exported.RequestClientIp[key.(string)] = value.(int)
+			return true
+		})
+
+		js, _ := json.Marshal(exported)
+
+		utils.SendJSONResponse(w, string(js))
+	}
+
 }

+ 6 - 6
mod/statistic/statistic.go

@@ -22,9 +22,9 @@ type DailySummary struct {
 	ErrorRequest int64 //Invalid request of the day, including error or not found
 	ValidRequest int64 //Valid request of the day
 	//Type counters
-	ForwardTypes    sync.Map //Map that hold the forward types
-	RequestOrigin   sync.Map //Map that hold [country ISO code]: visitor counter
-	RequestClientIp sync.Map //Map that hold all unique request IPs
+	ForwardTypes    *sync.Map //Map that hold the forward types
+	RequestOrigin   *sync.Map //Map that hold [country ISO code]: visitor counter
+	RequestClientIp *sync.Map //Map that hold all unique request IPs
 }
 
 type RequestInfo struct {
@@ -177,8 +177,8 @@ func newDailySummary() *DailySummary {
 		TotalRequest:    0,
 		ErrorRequest:    0,
 		ValidRequest:    0,
-		ForwardTypes:    sync.Map{},
-		RequestOrigin:   sync.Map{},
-		RequestClientIp: sync.Map{},
+		ForwardTypes:    &sync.Map{},
+		RequestOrigin:   &sync.Map{},
+		RequestClientIp: &sync.Map{},
 	}
 }

+ 75 - 8
web/components/status.html

@@ -1,8 +1,8 @@
 <div class="ui stackable four column grid">
         <div class="column">
-            <div id="serverstatus" class="ui green inverted segment">
+            <div id="serverstatus" class="ui green statustab inverted segment">
                 <h4 class="ui header">
-                    <i class="exchange icon"></i>
+                    <i class="power off icon"></i>
                     <div class="content">
                       <span id="statusTitle">Offline</span>
                       <div style="color: white;" class="sub header" id="statusText">Reverse proxy server is offline</div>
@@ -11,18 +11,21 @@
             </div>
         </div>
         <div class="column">
-            <div id="connections" class="ui blue inverted segment">
+            <div id="connections" class="ui statustab summary segment">
                 <h4 class="ui header">
                     <i class="exchange icon"></i>
                     <div class="content">
-                      <span></span>
-                      <div class="sub header"></div>
+                      <span id="summaryTotalCount"></span> <small>Req. Today</small>
+                      <div class="sub header" style="margin-top: 0.4em;">
+                        <i class="green circle check icon"></i> <span id="summarySuccCount"></span>
+                         / <i class="red red exclamation circle icon"></i> <span id="summaryErrCount"></span>
+                      </div>
                     </div>
                 </h4>
             </div>
         </div>
         <div class="column">
-            <div id="connections" class="ui yellow inverted segment">
+            <div id="connections" class="ui yellow statustab inverted segment">
                 <h4 class="ui header">
                     <i class="exchange icon"></i>
                     <div class="content">
@@ -33,7 +36,7 @@
             </div>
         </div>
         <div class="column">
-            <div id="connections" class="ui pink inverted segment">
+            <div id="connections" class="ui pink statustab inverted segment">
                 <h4 class="ui header">
                     <i class="exchange icon"></i>
                     <div class="content">
@@ -70,6 +73,39 @@
 <button id="startbtn" class="ui teal button" onclick="startService();">Start Service</button>
 <button id="stopbtn" class="ui red disabled button" onclick="stopService();">Stop Service</button>
 <div id="statusErrmsg" class="ui red message" style="display: none;"></div>
+<div class="ui divider"></div>
+<div class="ui two column stackable grid">
+    <div class="column">
+      <p>Visitor Counts</p>
+      <table class="ui basic celled table">
+        <thead>
+          <tr>
+            <th>Country ISO Code</th>
+            <th>Visitor Count</th>
+          </tr>
+        </thead>
+        <tbody>
+          <!-- insert table rows here -->
+        </tbody>
+      </table>
+    </div>
+    <div class="column">
+      <p>Proxy Request Types</p>
+      <table class="ui basic celled table">
+        <thead>
+          <tr>
+            <th>Proxy Type</th>
+            <th>Count</th>
+          </tr>
+        </thead>
+        <tbody>
+          <!-- insert table rows here -->
+        </tbody>
+      </table>
+    </div>
+  </div>
+  <br>
+  <button class="ui basic green button"><i class="refresh icon"></i> Refresh</button>
 <script>
     //Get the latest server status from proxy server
     function initRPStaste(){
@@ -79,7 +115,7 @@
                 $("#stopbtn").removeClass("disabled");
                 $("#serverstatus").addClass("green");
                 $("#statusTitle").text("Online");
-                $("#statusText").text("Reverse proxying request on port: " + data.Option.Port);
+                $("#statusText").text("Serving request on port: " + data.Option.Port);
             }else{
                 $("#startbtn").removeClass("disabled");
                 $("#stopbtn").addClass("disabled");
@@ -89,7 +125,38 @@
             }
             $("#incomingPort").val(data.Option.Port);
         });
+        
+    }
+
+    function abbreviateNumber(value) {
+        var newValue = value;
+        var suffixes = ["", "K", "M", "B", "T"];
+        var suffixNum = 0;
+        while (newValue >= 1000 && suffixNum < suffixes.length - 1) {
+            newValue /= 1000;
+            suffixNum++;
+        }
+        if (value > 1000){
+            newValue = newValue.toFixed(2);
+        }
+        
+        return newValue + suffixes[suffixNum];
+    }
+
+
+    function getDailySummary(){
+        $.get("/api/stats/summary?fast=true", function(data){
+            console.log(data);
+            
+            $("#summaryTotalCount").text(abbreviateNumber(data.TotalRequest));
+            $("#summarySuccCount").text(abbreviateNumber(data.ValidRequest));
+            $("#summaryErrCount").text(abbreviateNumber(data.ErrorRequest));
+        });
     }
+    setInterval(function(){
+        getDailySummary();
+    }, 10000);
+    getDailySummary();
 
     //Start and stop service button
     function startService(){

+ 1 - 72
web/index.html

@@ -12,78 +12,7 @@
         <script src="../script/ao_module.js"></script>
         <script src="script/semantic/semantic.min.js"></script>
         <script src="script/tablesort.js"></script>
-        <style>
-            body{
-                background-color:white;
-            }
-            
-            .functiontab{
-                display:none;
-            }
-
-            .menubar{
-                width: 100%;
-                padding: 0.4em;
-                padding-left: 1.2em;
-                padding-right: 1.2em;
-                background-color: #f5f5f5;
-                margin-bottom: 1em;
-
-                position: fixed;
-                top: 0;
-                width: 100%;
-                z-index: 10;
-                box-shadow: 0px 1px 5px 0px rgba(38,38,38,0.26);
-            }
-
-            .menubar .logo{
-                height: 36px;
-            }
-
-            .menubar .item{
-                display: inline-block;
-                vertical-align: middle;
-            }
-
-            .wrapper{
-                display: flex;
-                flex-wrap: wrap;
-                margin-top: 4em;
-            }
-
-            .toolbar{
-                width: 240px;
-            }
-
-            .contentWindow{
-                padding: 1em;
-                flex: 1;
-            }
-
-            @media screen and (max-width: 750px) {
-                .toolbar {
-                    display: inline-block;
-                    width: 100%;
-                    margin-bottom: 1em;
-                }
-
-                #mainmenu{
-                    width: calc(100% - 1em);
-                }
-
-                .contentWindow{
-                    display: inline-block;
-                    width: 100%;
-                }
-            }
-
-            .menudivider{
-                font-size: 0.8em !important;
-                color: #9c9c9c !important;
-                padding-left: 0.6em;
-            }
-
-        </style>
+        <link rel="stylesheet" href="main.css">
     </head>
     <body>
         <div class="menubar">

+ 113 - 0
web/main.css

@@ -0,0 +1,113 @@
+/*
+    index.html style overwrite
+*/
+body{
+    background-color:white;
+}
+
+.functiontab{
+    display:none;
+}
+
+.menubar{
+    width: 100%;
+    padding: 0.4em;
+    padding-left: 1.2em;
+    padding-right: 1.2em;
+    background-color: #f5f5f5;
+    margin-bottom: 1em;
+
+    position: fixed;
+    top: 0;
+    width: 100%;
+    z-index: 10;
+    box-shadow: 0px 1px 5px 0px rgba(38,38,38,0.26);
+}
+
+.menubar .logo{
+    height: 36px;
+}
+
+.menubar .item{
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.wrapper{
+    display: flex;
+    flex-wrap: wrap;
+    margin-top: 4.6em;
+}
+
+.toolbar{
+    width: 240px;
+}
+
+.contentWindow{
+    padding: 1em;
+    flex: 1;
+}
+
+@media screen and (max-width: 750px) {
+    .toolbar {
+        display: inline-block;
+        width: 100%;
+        margin-bottom: 1em;
+    }
+
+    #mainmenu{
+        width: calc(100% - 1em);
+    }
+
+    .contentWindow{
+        display: inline-block;
+        width: 100%;
+    }
+}
+
+.menudivider{
+    font-size: 0.8em !important;
+    color: #9c9c9c !important;
+    padding-left: 0.6em;
+}
+
+/*
+    Global rules overwrite
+*/
+
+.ui.teal.button{
+    background-color: #7fbbc5 !important;
+}
+
+.ui.red.button:not(.basic){
+    background-color: #c78e70 !important;
+}
+
+/*
+    Status style overwrite
+*/
+#serverstatus.green{
+    background-color: #7fbbc5 !important;
+}
+
+#serverstatus:not(.green){
+    background-color: #5f5e5c !important;
+}
+
+.statustab{
+    min-height: 5em;
+}
+
+#summaryTotalCount{
+    font-size: 1.6em;
+    font-weight: 300;
+}
+
+.statustab.summary{
+    background-color: #f1f1f1 !important;
+    border: 0px solid transparent !important;
+}
+
+.statustab.summary span, .statustab.summary i{
+    color: rgb(37, 37, 37);
+}