Browse Source

auto update script executed

Toby Chui 1 year ago
parent
commit
a502d95f32
3 changed files with 164 additions and 21 deletions
  1. 1 2
      api.go
  2. 64 2
      mod/ganserv/handlers.go
  3. 99 17
      web/components/gandetails.html

+ 1 - 2
api.go

@@ -84,12 +84,11 @@ func initAPIs() {
 	authRouter.HandleFunc("/api/gan/network/remove", ganManager.HandleRemoveNetwork)
 	authRouter.HandleFunc("/api/gan/network/list", ganManager.HandleListNetwork)
 	authRouter.HandleFunc("/api/gan/network/name", ganManager.HandleNetworkNaming)
+	authRouter.HandleFunc("/api/gan/network/setRange", ganManager.HandleSetRanges)
 	authRouter.HandleFunc("/api/gan/members/list", ganManager.HandleMemberList)
 	authRouter.HandleFunc("/api/gan/members/authorize", ganManager.HandleMemberAuthorization)
 	authRouter.HandleFunc("/api/gan/members/delete", ganManager.HandleMemberDelete)
 
-	authRouter.HandleFunc("/api/gan/network/test", ganManager.HandleTest)
-
 	//mDNS APIs
 	authRouter.HandleFunc("/api/mdns/list", HandleMdnsListing)
 	authRouter.HandleFunc("/api/mdns/discover", HandleMdnsScanning)

+ 64 - 2
mod/ganserv/handlers.go

@@ -2,8 +2,10 @@ package ganserv
 
 import (
 	"encoding/json"
+	"net"
 	"net/http"
 	"regexp"
+	"strings"
 
 	"imuslab.com/zoraxy/mod/utils"
 )
@@ -137,8 +139,49 @@ func (m *NetworkManager) HandleNetworkNaming(w http.ResponseWriter, r *http.Requ
 	}
 }
 
-func (m *NetworkManager) HandleTest(w http.ResponseWriter, r *http.Request) {
-	err := m.configureNetwork("e7dd1ce7bfd3b1f9", "192.168.192.1", "192.168.192.254", "192.168.192.0/24")
+func (m *NetworkManager) HandleSetRanges(w http.ResponseWriter, r *http.Request) {
+	netid, err := utils.PostPara(r, "netid")
+	if err != nil {
+		utils.SendErrorResponse(w, "netid not given")
+		return
+	}
+	cidr, err := utils.PostPara(r, "cidr")
+	if err != nil {
+		utils.SendErrorResponse(w, "cidr not given")
+		return
+	}
+	ipstart, err := utils.PostPara(r, "ipstart")
+	if err != nil {
+		utils.SendErrorResponse(w, "ipstart not given")
+		return
+	}
+	ipend, err := utils.PostPara(r, "ipend")
+	if err != nil {
+		utils.SendErrorResponse(w, "ipend not given")
+		return
+	}
+
+	//Validate the CIDR is real, the ip range is within the CIDR range
+	_, ipnet, err := net.ParseCIDR(cidr)
+	if err != nil {
+		utils.SendErrorResponse(w, "invalid cidr string given")
+		return
+	}
+
+	startIP := net.ParseIP(ipstart)
+	endIP := net.ParseIP(ipend)
+	if startIP == nil || endIP == nil {
+		utils.SendErrorResponse(w, "invalid start or end ip given")
+		return
+	}
+
+	withinRange := ipnet.Contains(startIP) && ipnet.Contains(endIP)
+	if !withinRange {
+		utils.SendErrorResponse(w, "given CIDR did not cover all of the start to end ip range")
+		return
+	}
+
+	err = m.configureNetwork(netid, startIP.String(), endIP.String(), strings.TrimSpace(cidr))
 	if err != nil {
 		utils.SendErrorResponse(w, err.Error())
 		return
@@ -221,6 +264,25 @@ func (m *NetworkManager) HandleMemberAuthorization(w http.ResponseWriter, r *htt
 	}
 }
 
+//Handle Delete or Add IP for a member in a network
+func (m *NetworkManager) HandleMemberIP(w http.ResponseWriter, r *http.Request) {
+	opr, err := utils.PostPara(r, "opr")
+	if err != nil {
+		utils.SendErrorResponse(w, "opr not defined")
+		return
+	}
+
+	if opr == "add" {
+
+	} else if opr == "del" {
+
+	} else if opr == "get" {
+
+	} else {
+		utils.SendErrorResponse(w, "unsupported opr type: "+opr)
+	}
+}
+
 //Handle delete of a given memver
 func (m *NetworkManager) HandleMemberDelete(w http.ResponseWriter, r *http.Request) {
 	netid, err := utils.PostPara(r, "netid")

+ 99 - 17
web/components/gandetails.html

@@ -38,20 +38,23 @@
             </tbody>
         </table>
     </div>
-    <div class="ui basic segment form">
-        <div class="unstackable fields">
-            <div class="ten wide field">
-                <label>Multicast Recipient Limit</label>
-                <input type="number" id="" placeholder="32" value="32">
+    <br>
+    <div class="ui form">
+        <h3>Custom IP Range</h3>
+        <p>Manual IP Range Configuration. The IP range must be within the selected CIDR range. 
+        <br>Use <code>Utilities > IP to CIDR tool</code> if you are not too familiar with CIDR notations.</p>
+        <div class="two fields">
+            <div class="field">
+                <label>IP Start</label>
+                <input type="text" class="ganIpStart" placeholder="">
             </div>
-            <div class="six wide field">
-                <div class="ui toggle checkbox" style="margin-top: 2.3em; padding-left: 0.6em;">
-                    <label>Enable Multicast</label>
-                    <input type="checkbox" tabindex="0" class="hidden">
-                </div>
+            <div class="field">
+                <label>IP End</label>
+                <input type="text" class="ganIpEnd" placeholder="">
             </div>
         </div>
     </div>
+    <button onclick="setNetworkRange();" class="ui basic button"><i class="ui blue save icon"></i> Save Settings</button>
 
     <div class="ui divider"></div>
     <h2>Members</h2>
@@ -65,9 +68,9 @@
                 <tr>
                     <th>Auth</th>
                     <th>Address</th>
-                    <th>Name/Description</th>
+                    <th>Name</th>
                     <th>Managed IP</th>
-                    <th>Last Seen</th>
+                    <th>Authorized Since</th>
                     <th>Version</th>
                     <th>Remove</th>
                 </tr>
@@ -138,7 +141,7 @@
             td.innerHTML = cidrs[i];
             let thisCidr = cidrs[i];
             td.onclick = function(){
-                selectNetworkRange(thisCidr);
+                selectNetworkRange(thisCidr, td);
             };
             
             row.appendChild(td);
@@ -159,12 +162,68 @@
         $(".iprange").each(function(){
             if ($(this).attr("CIDR") == currentCIDR){
                 $(this).addClass("active");
+                populateStartEndIpByCidr(currentCIDR);
             }
         })
     }
 
-    function selectNetworkRange(cidr){
-        alert(cidr);
+    function populateStartEndIpByCidr(cidr){
+        function cidrToRange(cidr) {
+            var range = [2];
+            cidr = cidr.split('/');
+            var start = ip2long(cidr[0]);
+            range[0] = long2ip(start);
+            range[1] = long2ip(Math.pow(2, 32 - cidr[1]) + start - 1);
+            return range;
+        }
+        var cidrRange = cidrToRange(cidr);
+        $(".ganIpStart").val(cidrRange[0]);
+        $(".ganIpEnd").val(cidrRange[1]);
+    }
+
+    function selectNetworkRange(cidr, object){
+        populateStartEndIpByCidr(cidr);
+
+        $(".iprange.active").removeClass("active");
+        $(object).addClass("active");
+    }
+
+    function setNetworkRange(){
+        var ipstart = $(".ganIpStart").val().trim();
+        var ipend = $(".ganIpEnd").val().trim();
+
+        if (ipstart == ""){
+            $(".ganIpStart").parent().addClass("error");
+        }else{
+            $(".ganIpStart").parent().removeClass("error");
+        }
+
+        if (ipend == ""){
+            $(".ganIpEnd").parent().addClass("error");
+        }else{
+            $(".ganIpEnd").parent().removeClass("error");
+        }
+
+        //Get CIDR from selected range group
+        var cidr = $(".iprange.active").attr("cidr");
+
+        $.ajax({
+            url: "/api/gan/network/setRange",
+            metohd: "POST",
+            data:{
+                netid: currentGANetID,
+                cidr: cidr,
+                ipstart: ipstart,
+                ipend: ipend
+            },
+            success: function(data){
+                if (data.error != undefined){
+                    msgbox(data.error, false, 5000)
+                }else{
+                    msgbox("Network Range Updated")
+                }
+            }
+        })
     }
 
 
@@ -218,10 +277,15 @@
         });
     }
 
+    //Handle delete IP from memeber
+    function deleteIpFromMemeber(memberid, ip){
+        alert(ip);
+    }
+
     //Member table populate
     function renderMemeberTable(forceUpdate = false) {
         $.ajax({
-            url: '/api/gan/members/list?netid=e7dd1ce7bfd3b1f9&detail=true',
+            url: '/api/gan/members/list?netid=' + currentGANetID + '&detail=true',
             type: 'GET',
             success: function(data) {
                 const tableBody = $('#networkMemeberTable');
@@ -264,11 +328,29 @@
                     if (!member.authorized){
                         rowClass = "unauthorized"
                     }
+                    
+                    let assignedIp = "";
+
+                    if (member.ipAssignments.length == 0){
+                        assignedIp = "Not assigned"
+                    }else{
+                        assignedIp = `<div class="ui list">`
+                        member.ipAssignments.forEach(function(thisIp){
+                            assignedIp += `<div class="item" style="width: 100%;">${thisIp} <a style="cursor:pointer; float: right;" onclick="deleteIpFromMemeber('${member.address}','${thisIp}');"><i class="red remove icon"></i></a></div>`;
+                        })
+                        assignedIp += `</div>`
+                    }
                     const row = $(`<tr class="GANetMemberEntity ${rowClass}" style="${unauthorizedStyle}">`);
                     row.append($(`<td class="GANetMember ${rowClass}" style="text-align: center;">`).html(authorizedCheckbox));
                     row.append($('<td>').text(member.address));
                     row.append($('<td>').text(""));
-                    row.append($('<td>').text(member.ipAssignments || ''));
+                    row.append($('<td>').html(`${assignedIp}
+                        <div class="ui action mini fluid input">
+                            <input type="text" placeholder="Search...">
+                            <button class="ui basic icon button">
+                                <i class="add icon"></i>
+                            </button>
+                        </div>`));
                     row.append($('<td>').text(lastAuthTime));
                     row.append($('<td>').text(version));
                     row.append($(`<td style="text-align: center;" onclick="handleMemberDelete('${member.address}');">`).html(`<button class="ui basic mini icon button"><i class="red remove icon"></i></button>`));