|
@@ -31,151 +31,46 @@
|
|
|
<div class="four wide column">
|
|
|
<div id="mainmenu" class="ui secondary vertical pointing menu">
|
|
|
<a class="item active" tag="status">
|
|
|
- Status
|
|
|
+ <i class="info circle icon"></i>Status
|
|
|
</a>
|
|
|
<a class="item" tag="vdir">
|
|
|
- Virtual Directory
|
|
|
+ <i class="folder icon"></i> Virtual Directory
|
|
|
</a>
|
|
|
<a class="item" tag="subd">
|
|
|
- Subdomain Proxy
|
|
|
+ <i class="sitemap icon"></i> Subdomain Proxy
|
|
|
</a>
|
|
|
<a class="item" tag="rules">
|
|
|
- Create Proxy Rules
|
|
|
+ <i class="plus square icon"></i> Create Proxy Rules
|
|
|
</a>
|
|
|
<a class="item" tag="setroot">
|
|
|
- Set Proxy Root
|
|
|
+ <i class="home icon"></i> Set Proxy Root
|
|
|
+ </a>
|
|
|
+ <div class="ui divider"></div>
|
|
|
+ <a class="item" tag="cert">
|
|
|
+ <i class="lock icon"></i> TLS / SSL certificate
|
|
|
</a>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="twelve wide column">
|
|
|
<!-- Status Tab -->
|
|
|
- <div id="status" class="functiontab">
|
|
|
- <div id="serverstatus" class="ui message">
|
|
|
- <h3 class="ui header">
|
|
|
- <i class="exchange icon"></i>
|
|
|
- <div class="content">
|
|
|
- <span id="statusTitle">Offline</span>
|
|
|
- <div class="sub header" id="statusText">Reverse proxy server is offline</div>
|
|
|
- </div>
|
|
|
- </h3>
|
|
|
- </div>
|
|
|
- <div class="ui divider"></div>
|
|
|
- <p>Inbound Port (Port to be proxied)</p>
|
|
|
- <div class="ui action fluid input">
|
|
|
- <input type="text" id="incomingPort" placeholder="Incoming Port" value="80">
|
|
|
- <button class="ui button" onclick="handlePortChange();">Apply</button>
|
|
|
- </div>
|
|
|
- <Br>
|
|
|
- <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="status" class="functiontab" target="status.html" style="display: block ;">
|
|
|
+ <br><br><div class="ui active centered inline loader"></div>
|
|
|
</div>
|
|
|
|
|
|
<!-- Virtual Directory Tab -->
|
|
|
- <div id="vdir" class="functiontab">
|
|
|
- <table class="ui celled table">
|
|
|
- <thead>
|
|
|
- <tr>
|
|
|
- <th>Virtual Directory</th>
|
|
|
- <th>Proxy To</th>
|
|
|
- <th>Remove</th>
|
|
|
- </tr>
|
|
|
- </thead>
|
|
|
- <tbody id="vdirList">
|
|
|
- <tr>
|
|
|
- <td data-label="">test</td>
|
|
|
- <td data-label="">test</td>
|
|
|
- <td data-label=""><button class="ui circular mini red basic button"><i class="remove icon"></i> Remove Proxy</button></td>
|
|
|
- </tr>
|
|
|
- </tbody>
|
|
|
- </table>
|
|
|
- </div>
|
|
|
+ <div id="vdir" class="functiontab" target="vdir.html"></div>
|
|
|
|
|
|
<!-- Subdomain Proxy -->
|
|
|
- <div id="subd" class="functiontab">
|
|
|
- <table class="ui celled table">
|
|
|
- <thead>
|
|
|
- <tr>
|
|
|
- <th>Matching Domain</th>
|
|
|
- <th>Proxy To</th>
|
|
|
- <th>Remove</th>
|
|
|
- </tr>
|
|
|
- </thead>
|
|
|
- <tbody id="subdList">
|
|
|
-
|
|
|
- </tbody>
|
|
|
- </table>
|
|
|
- </div>
|
|
|
+ <div id="subd" class="functiontab" target="subd.html"></div>
|
|
|
|
|
|
- <!-- Create Rules -->
|
|
|
- <div id="rules" class="functiontab">
|
|
|
- <div class="">
|
|
|
- <h3><i class="ui exchange icon"></i> New Proxy Endpoint</h3>
|
|
|
- <p>You can create a proxy endpoing by subdomain or virtual directories</p>
|
|
|
- <div class="ui form">
|
|
|
- <div class="field">
|
|
|
- <label>Proxy Type</label>
|
|
|
- <div class="ui selection dropdown">
|
|
|
- <input type="hidden" id="ptype" value="subd">
|
|
|
- <i class="dropdown icon"></i>
|
|
|
- <div class="default text">Proxy Type</div>
|
|
|
- <div class="menu">
|
|
|
- <div class="item" data-value="subd">Sub-domain</div>
|
|
|
- <div class="item" data-value="vdir">Virtual Directory</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="field">
|
|
|
- <label>Subdomain Matching Keyword / Virtual Directory Name</label>
|
|
|
- <input type="text" id="rootname" placeholder="s1.mydomain.com">
|
|
|
- <div class="ui message">
|
|
|
- Example of subdomain matching keyword:<br>
|
|
|
- <code>s1.arozos.com</code> <br>(Any access starting with s1.arozos.com will be proxy to the IP address below)<br>
|
|
|
- Example of virtual directory name: <br>
|
|
|
- <code>/s1/home</code> <br>(Any access to {this_server}/s1/ will be proxy to the IP address below)
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="field">
|
|
|
- <label>IP Address or Domain Name with port</label>
|
|
|
- <input type="text" id="proxyDomain">
|
|
|
- <small>E.g. 192.168.0.101:8000 or example.com</small>
|
|
|
- </div>
|
|
|
- <div class="field">
|
|
|
- <div class="ui checkbox">
|
|
|
- <input type="checkbox" id="reqTls">
|
|
|
- <label>Proxy Target require TLS Connection <br><small>(i.e. Your proxy target starts with https://)</small></label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <button class="ui teal button" onclick="newProxyEndpoint();">Create Proxy Endpoint</button>
|
|
|
- </div>
|
|
|
- <div class="ui green message" id="proxyaddSucc" style="display:none">
|
|
|
- <i class="ui checkmark icon"></i> Proxy Endpoint Added
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <!-- Create Rules -->
|
|
|
+ <div id="rules" class="functiontab" target="rules.html"></div>
|
|
|
|
|
|
<!-- Set proxy root -->
|
|
|
- <div id="setroot" class="functiontab">
|
|
|
- <h3><i class="ui home icon"></i> Set Proxy Root</h3>
|
|
|
- <p>For all routing not found in the proxy rule, will be redirected to the proxy root server.</p>
|
|
|
- <div class="ui form">
|
|
|
- <div class="field">
|
|
|
- <label>Proxy Root</label>
|
|
|
- <input type="text" id="proxyRoot">
|
|
|
- <small>E.g. localhost:8080</small>
|
|
|
- </div>
|
|
|
- <div class="field">
|
|
|
- <div class="ui checkbox">
|
|
|
- <input type="checkbox" id="rootReqTLS">
|
|
|
- <label>Root require TLS Connection <br><small>(i.e. Your proxy target starts with https://)</small></label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <br>
|
|
|
- <button class="ui teal button" onclick="setProxyRoot()"><i class="home icon" ></i> Set Proxy Root</button>
|
|
|
- <div class="ui green message" id="ProxyRootUpdate" style="display:none">
|
|
|
- <i class="ui checkmark icon"></i> Proxy Root Updated
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <div id="setroot" class="functiontab" target="rproot.html"></div>
|
|
|
+
|
|
|
+ <!-- Set TLS cert -->
|
|
|
+ <div id="cert" class="functiontab" target="cert.html"></div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -186,189 +81,118 @@
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
-
|
|
|
+ <br><br>
|
|
|
<script>
|
|
|
- initRPStaste();
|
|
|
- $("#status").slideDown('fast');
|
|
|
- $(".ui.dropdown").dropdown();
|
|
|
- $(".ui.checkbox").checkbox();
|
|
|
-
|
|
|
- $("#mainmenu").find(".item").each(function(){
|
|
|
- $(this).on("click", function(e){
|
|
|
- $("#mainmenu").find(".item").removeClass("active");
|
|
|
- $(this).addClass("active");
|
|
|
- let targetOpeningTab = $(this).attr("tag");
|
|
|
- $(".functiontab").hide();
|
|
|
- $("#" + targetOpeningTab).slideDown('fast');
|
|
|
- });
|
|
|
- });
|
|
|
-
|
|
|
- function initRPStaste(){
|
|
|
- $.get("status", function(data){
|
|
|
- if (data.Running == true){
|
|
|
- $("#startbtn").addClass("disabled");
|
|
|
- $("#stopbtn").removeClass("disabled");
|
|
|
- $("#serverstatus").addClass("green");
|
|
|
- $("#statusTitle").text("Online");
|
|
|
- $("#statusText").text("Reverse proxying request on port: " + data.ListenPort);
|
|
|
+ /*
|
|
|
+ Loader function
|
|
|
+
|
|
|
+ Load all the components view from the
|
|
|
+ components/ directory into their corrisponding divs
|
|
|
+ */
|
|
|
+ let loadingComponents = 0;
|
|
|
+ function initTabs(callback=undefined){
|
|
|
+ $('.functiontab').each(function(){
|
|
|
+ let loadTarget = $(this).attr("target");
|
|
|
+ if (loadTarget != undefined){
|
|
|
+ $(this).load("./components/" + loadTarget, function(){
|
|
|
+ loadingComponents--;
|
|
|
+ });
|
|
|
+ loadingComponents++;
|
|
|
}else{
|
|
|
- $("#startbtn").removeClass("disabled");
|
|
|
- $("#stopbtn").addClass("disabled");
|
|
|
- $("#statusTitle").text("Offline");
|
|
|
- $("#statusText").text("Reverse proxy server is offline");
|
|
|
- $("#serverstatus").removeClass("green");
|
|
|
+ $(this).html(`<p>Unable to load components for this tab</p>`);
|
|
|
}
|
|
|
- $("#incomingPort").val(data.ListenPort);
|
|
|
- });
|
|
|
+ })
|
|
|
+ if (callback != undefined){
|
|
|
+ waitInit(callback);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- function deleteEndpoint(ptype, epoint){
|
|
|
- if (confirm("Confirm remove proxy for :" + epoint + " (type: " + ptype + ")?")){
|
|
|
- $.ajax({
|
|
|
- url: "./del",
|
|
|
- data: {ep: epoint, ptype: ptype},
|
|
|
- success: function(){
|
|
|
- listVdirs();
|
|
|
- listSubd();
|
|
|
- }
|
|
|
- })
|
|
|
+ function waitInit(callback = undefined, retryCount = 0){
|
|
|
+ if (loadingComponents > 0 && retryCount < 5){
|
|
|
+ setTimeout(function(){
|
|
|
+ waitInit(callback, retryCount++);
|
|
|
+ }, 300);
|
|
|
+ }else if (loadingComponents == 0){
|
|
|
+ callback();
|
|
|
+ }else{
|
|
|
+ alert("Missing component. Please check if your installation is complete.")
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
- function startService(){
|
|
|
- $.post("enable", {enable: true}, function(data){
|
|
|
- if (data.error != undefined){
|
|
|
- errmsg(data.error);
|
|
|
- }
|
|
|
- initRPStaste();
|
|
|
- });
|
|
|
- }
|
|
|
+ initTabs(function(){
|
|
|
+ initRPStaste();
|
|
|
|
|
|
- function stopService(){
|
|
|
- $.post("enable", {enable: false}, function(data){
|
|
|
- if (data.error != undefined){
|
|
|
- errmsg(data.error);
|
|
|
- }
|
|
|
- initRPStaste();
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- function handlePortChange(){
|
|
|
- var newPortValue = $("#incomingPort").val();
|
|
|
- if (isNaN(newPortValue - 1)){
|
|
|
- alert("Invalid incoming port value");
|
|
|
- return;
|
|
|
+ if (window.location.hash.length > 1){
|
|
|
+ let tabID = window.location.hash.substr(1);
|
|
|
+ openTabById(tabID);
|
|
|
+ }else{
|
|
|
+ openTabById("status");
|
|
|
}
|
|
|
-
|
|
|
- $.post("setIncoming", {incoming: newPortValue}, function(data){
|
|
|
- if (data.error != undefined){
|
|
|
- errmsg(data.error);
|
|
|
- }
|
|
|
- initRPStaste();
|
|
|
+ $(".ui.dropdown").dropdown();
|
|
|
+ $(".ui.checkbox").checkbox();
|
|
|
+
|
|
|
+ //Click on the current tab
|
|
|
+ $("#mainmenu").find(".item").each(function(){
|
|
|
+ $(this).on("click", function(event){
|
|
|
+ let tabid = $(this).attr("tag");
|
|
|
+ openTabById(tabid);
|
|
|
+ });
|
|
|
});
|
|
|
- }
|
|
|
|
|
|
- //Virtual directories functions
|
|
|
- listVdirs();
|
|
|
- function listVdirs(){
|
|
|
- $("#vdirList").html(``);
|
|
|
- $.get("list?type=vdir", function(data){
|
|
|
- if (data.error !== undefined){
|
|
|
- $("#vdirList").append(`<tr>
|
|
|
- <td data-label="" colspan="3"><i class="remove icon"></i> ${data.error}</td>
|
|
|
- </tr>`);
|
|
|
- }else if (data.length == 0){
|
|
|
- $("#vdirList").append(`<tr>
|
|
|
- <td data-label="" colspan="3"><i class="checkmark icon"></i> No Virtual Directory Record</td>
|
|
|
- </tr>`);
|
|
|
- }else{
|
|
|
- data.forEach(vdir => {
|
|
|
- let tlsIcon = "";
|
|
|
- if (vdir.RequireTLS){
|
|
|
- tlsIcon = `<i class="lock icon"></i>`;
|
|
|
- }
|
|
|
- $("#vdirList").append(`<tr>
|
|
|
- <td data-label="">${vdir.Root}</td>
|
|
|
- <td data-label="">${vdir.Domain} ${tlsIcon}</td>
|
|
|
- <td data-label=""><button class="ui circular mini red basic button" onclick='deleteEndpoint("vdir","${vdir.Root}")'><i class="remove icon"></i> Remove Vdir</button></td>
|
|
|
- </tr>`);
|
|
|
- });
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
+ });
|
|
|
|
|
|
- listSubd();
|
|
|
- function listSubd(){
|
|
|
- $("#subdList").html(``);
|
|
|
- $.get("list?type=subd", function(data){
|
|
|
- if (data.error !== undefined){
|
|
|
- $("#subdList").append(`<tr>
|
|
|
- <td data-label="" colspan="3"><i class="remove icon"></i> ${data.error}</td>
|
|
|
- </tr>`);
|
|
|
- }else if (data.length == 0){
|
|
|
- $("#subdList").append(`<tr>
|
|
|
- <td data-label="" colspan="3"><i class="checkmark icon"></i> No Subdomain Proxy Record</td>
|
|
|
- </tr>`);
|
|
|
- }else{
|
|
|
- data.forEach(subd => {
|
|
|
- let tlsIcon = "";
|
|
|
- if (subd.RequireTLS){
|
|
|
- tlsIcon = `<i class="lock icon"></i>`;
|
|
|
- }
|
|
|
- $("#subdList").append(`<tr>
|
|
|
- <td data-label="">${subd.MatchingDomain}</td>
|
|
|
- <td data-label="">${subd.Domain} ${tlsIcon}</td>
|
|
|
- <td data-label=""><button class="ui circular mini red basic button" onclick='deleteEndpoint("subd","${subd.MatchingDomain}")'><i class="remove icon"></i> Remove Subd</button></td>
|
|
|
- </tr>`);
|
|
|
- });
|
|
|
+ function getTabButtonById(targetTabId){
|
|
|
+ let targetTabBtn = undefined;
|
|
|
+ $("#mainmenu").find(".item").each(function(){
|
|
|
+ let tabid = $(this).attr("tag");
|
|
|
+
|
|
|
+ if (tabid == targetTabId){
|
|
|
+ targetTabBtn = $(this);
|
|
|
}
|
|
|
});
|
|
|
- }
|
|
|
|
|
|
- //New Proxy Endpoint
|
|
|
- function newProxyEndpoint(){
|
|
|
- var type = $("#ptype").val();
|
|
|
- var rootname = $("#rootname").val();
|
|
|
- var proxyDomain = $("#proxyDomain").val();
|
|
|
- var useTLS = $("#reqTls")[0].checked;
|
|
|
+ return targetTabBtn;
|
|
|
+ }
|
|
|
|
|
|
- if (rootname.trim() == ""){
|
|
|
- $("#rootname").parent().addClass("error");
|
|
|
- return
|
|
|
- }else{
|
|
|
- $("#rootname").parent().removeClass("error");
|
|
|
+ //Select and open a tab by its tag id
|
|
|
+ function openTabById(tabID){
|
|
|
+ let targetBtn = getTabButtonById(tabID);
|
|
|
+ if (targetBtn == undefined){
|
|
|
+ alert("Invalid tabid given");
|
|
|
+ return;
|
|
|
}
|
|
|
+ $("#mainmenu").find(".item").removeClass("active");
|
|
|
+ $(targetBtn).addClass("active");
|
|
|
+ $(".functiontab").hide();
|
|
|
+ $("#" + tabID).slideDown('fast');
|
|
|
+ window.location.hash = tabID;
|
|
|
+ }
|
|
|
|
|
|
- if (proxyDomain.trim() == ""){
|
|
|
- $("#proxyDomain").parent().addClass("error");
|
|
|
- return
|
|
|
- }else{
|
|
|
- $("#proxyDomain").parent().removeClass("error");
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
- //Create the endpoint by calling add
|
|
|
- $.ajax({
|
|
|
- url: "./add",
|
|
|
- data: {type: type, rootname: rootname, tls: useTLS, ep: proxyDomain},
|
|
|
- success: function(data){
|
|
|
- if (data.error != undefined){
|
|
|
- alert(data.error);
|
|
|
- }else{
|
|
|
- //OK
|
|
|
+ //Generic functions
|
|
|
+ function deleteEndpoint(ptype, epoint){
|
|
|
+ if (confirm("Confirm remove proxy for :" + epoint + " (type: " + ptype + ")?")){
|
|
|
+ $.ajax({
|
|
|
+ url: "./del",
|
|
|
+ data: {ep: epoint, ptype: ptype},
|
|
|
+ success: function(){
|
|
|
listVdirs();
|
|
|
listSubd();
|
|
|
- $("#proxyaddSucc").stop().slideDown('fast').delay(3000).slideUp('fast');
|
|
|
-
|
|
|
- //Clear old data
|
|
|
- $("#rootname").val("");
|
|
|
- $("#proxyDomain").val("");
|
|
|
}
|
|
|
- }
|
|
|
- });
|
|
|
+ })
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
function setProxyRoot(){
|
|
|
var newpr = $("#proxyRoot").val();
|
|
|
if (newpr.trim() == ""){
|
|
@@ -397,17 +221,8 @@
|
|
|
|
|
|
}
|
|
|
|
|
|
- initRootInfo();
|
|
|
- function initRootInfo(){
|
|
|
- $.get("list?type=root", function(data){
|
|
|
- if (data == null){
|
|
|
-
|
|
|
- }else{
|
|
|
- $("#proxyRoot").val(data.Domain);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
+
|
|
|
+ //Show error message
|
|
|
function errmsg(message){
|
|
|
$("#errmsg").html(`<i class="red remove icon"></i> ${message}`);
|
|
|
$("#errmsg").slideDown('fast').delay(5000).slideUp('fast');
|