Rename package and rebuild opkg-feed
- Added luci-app-GO-wireguard (Luci app for Wireguard pulled from GoldenOrb)
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
|
||||
<script type="text/javascript">
|
||||
//<![CDATA[
|
||||
function vpn_add()
|
||||
{
|
||||
var vpn_name = div_add.querySelector("#instance_name1").value.replace(/[^\x00-\x7F]|[\s\.!@#$%^&*()\-+=\[\]{};':"\\|,<>\/?]/g,'');
|
||||
var vpn_template = div_add.querySelector("#instance_template").value;
|
||||
var form = document.getElementsByName('cbi')[0];
|
||||
|
||||
if (!vpn_name || !vpn_name.length)
|
||||
{
|
||||
return info_message(vpn_output, "<%=pcdata(translate("The 'Name' field must not be empty!"))%>", 2000);
|
||||
}
|
||||
|
||||
document.getElementById("instance_name1").value = vpn_name;
|
||||
if (document.getElementById("cbi-wireguard-" + vpn_name) != null)
|
||||
{
|
||||
return info_message(vpn_output, "<%=pcdata(translate("Instance with that name already exists!"))%>", 2000);
|
||||
}
|
||||
|
||||
if (!vpn_template || !vpn_template.length)
|
||||
{
|
||||
return info_message(vpn_output, "<%=pcdata(translate("Please select a valid VPN template!"))%>", 2000);
|
||||
}
|
||||
|
||||
if (form)
|
||||
{
|
||||
form.submit();
|
||||
}
|
||||
}
|
||||
|
||||
function vpn_upload()
|
||||
{
|
||||
var vpn_name = div_upload.querySelector("#instance_name2").value.replace(/[^\x00-\x7F]|[\s\.!@#$%^&*()\-+=\[\]{};':"\\|,<>\/?]/g,'');
|
||||
var vpn_file = document.getElementById("ovpn_file").value;
|
||||
var form = document.getElementsByName('cbi')[0];
|
||||
|
||||
if (!vpn_name || !vpn_name.length)
|
||||
{
|
||||
return info_message(vpn_output, "<%=pcdata(translate("The 'Name' field must not be empty!"))%>", 2000);
|
||||
}
|
||||
|
||||
document.getElementById("instance_name2").value = vpn_name;
|
||||
if (document.getElementById("cbi-wireguard-" + vpn_name) != null)
|
||||
{
|
||||
return info_message(vpn_output, "<%=pcdata(translate("Instance with that name already exists!"))%>", 2000);
|
||||
}
|
||||
|
||||
if (!vpn_file || !vpn_file.length)
|
||||
{
|
||||
return info_message(vpn_output, "<%=pcdata(translate("Please select a valid CONF config file to upload!"))%>", 2000);
|
||||
}
|
||||
|
||||
if (form)
|
||||
{
|
||||
form.enctype = 'multipart/form-data';
|
||||
form.action = '<%=url('admin/vpn/wireguard/wupload')%>';
|
||||
form.submit();
|
||||
}
|
||||
}
|
||||
|
||||
function info_message(output, msg, timeout)
|
||||
{
|
||||
timeout = timeout || 0;
|
||||
output.innerHTML = '<em>' + msg + '</em>';
|
||||
if (timeout > 0)
|
||||
{
|
||||
setTimeout(function(){ output.innerHTML=""}, timeout);
|
||||
}
|
||||
}
|
||||
//]]>
|
||||
</script>
|
||||
|
||||
<%+wireguard/ovpn_css%>
|
||||
|
||||
<div class="cbi-section-node">
|
||||
<div class="table cbi-section-table">
|
||||
<h4><%:Template based configuration%></h4>
|
||||
<div class="tr cbi-section-table-row" id="div_add">
|
||||
<div class="td left">
|
||||
<input type="text" maxlength="20" placeholder="Instance name" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.text" id="instance_name1" />
|
||||
</div>
|
||||
<div class="td left">
|
||||
<select id="instance_template" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.select">
|
||||
<option value="" selected="selected" disabled="disabled"><%:Select template ...%></option>
|
||||
<%- for k, v in luci.util.kspairs(self.add_select_options) do %>
|
||||
<option value="<%=k%>"><%=luci.xml.pcdata(v)%></option>
|
||||
<% end -%>
|
||||
</select>
|
||||
</div>
|
||||
<div class="td left">
|
||||
<input class="cbi-button cbi-button-add" type="submit" onclick="vpn_add(); return false;" value="<%:Add%>" title="<%:Add template based configuration%>" /><br />
|
||||
</div>
|
||||
</div>
|
||||
<h4><%:Conf configuration file upload%></h4>
|
||||
<div class="tr cbi-section-table-row" id="div_upload">
|
||||
<div class="td left">
|
||||
<input type="text" maxlength="20" placeholder="Instance name" name="instance_name2" id="instance_name2" />
|
||||
</div>
|
||||
<div class="td left">
|
||||
<input type="file" name="ovpn_file" id="ovpn_file" accept="application/x-wireguard-profile,.conf" />
|
||||
</div>
|
||||
<div class="td left">
|
||||
<input class="cbi-button cbi-button-add" type="submit" onclick="vpn_upload(); return false;" value="<%:Upload%>" title="<%:Upload conf file%>" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="vpn-output">
|
||||
<span id="vpn_output"></span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,27 @@
|
||||
<script type="text/javascript" src="<%=resource%>/xhr.js"></script>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
|
||||
function generateconf()
|
||||
{
|
||||
XHR.get('<%=luci.dispatcher.build_url("admin", "vpn", "generateconf")%>',
|
||||
null,
|
||||
function(x, rv)
|
||||
{
|
||||
window.open('http://'+window.location.hostname+'/package/wgconf.tar.gz', '_self')
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
//]]></script>
|
||||
|
||||
<fieldset class="cbi-section" id="cbi-family">
|
||||
<table width="550" border="0">
|
||||
<tr>
|
||||
<td width="20%"> </td>
|
||||
<td width="17%"><input type="button" type="submit" id="generate" class="cbi-button cbi-button-apply" value="<%:Generate Conf Files%>" onclick="return generateconf()" /></td>
|
||||
<td width="17%"> </td>
|
||||
<td width="46%"> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
@@ -0,0 +1,38 @@
|
||||
<style type="text/css">
|
||||
h4
|
||||
{
|
||||
white-space: nowrap;
|
||||
border-bottom: 0px;
|
||||
margin: 10px 5px 5px 5px;
|
||||
}
|
||||
.tr
|
||||
{
|
||||
border: 0px;
|
||||
text-align: left;
|
||||
}
|
||||
.vpn-output
|
||||
{
|
||||
box-shadow: none;
|
||||
margin: 10px 5px 5px 5px;
|
||||
color: #a22;
|
||||
}
|
||||
textarea
|
||||
{
|
||||
border: 1px solid #cccccc;
|
||||
padding: 5px;
|
||||
font-size: 12px;
|
||||
font-family: monospace;
|
||||
resize: none;
|
||||
white-space: pre;
|
||||
overflow-wrap: normal;
|
||||
overflow-x: scroll;
|
||||
}
|
||||
a
|
||||
{
|
||||
line-height: 1.5;
|
||||
}
|
||||
hr
|
||||
{
|
||||
margin: 0.5em 0;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,30 @@
|
||||
<%#
|
||||
Copyright 2008 Steven Barth <steven@midlink.org>
|
||||
Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
|
||||
Licensed to the public under the Apache License 2.0.
|
||||
-%>
|
||||
|
||||
<%+openvpn/ovpn_css%>
|
||||
|
||||
<div class="cbi-section">
|
||||
<h3>
|
||||
<a href="<%=url('admin/vpn/wireguard')%>"><%:Overview%></a> »
|
||||
<%=luci.i18n.translatef("Instance \"%s\"", self.instance)%>
|
||||
</h3>
|
||||
<% if self.mode == "basic" then %>
|
||||
<a href="<%=url('admin/vpn/wireguard/advanced', self.instance, "Service")%>"><%:Switch to advanced configuration%> »</a><p/>
|
||||
<hr />
|
||||
<% elseif self.mode == "advanced" then %>
|
||||
<a href="<%=url('admin/vpn/wireguard/basic', self.instance)%>"><%:Switch to basic configuration%> »</a><p/>
|
||||
<hr />
|
||||
<%:Configuration category%>:
|
||||
<% for i, c in ipairs(self.categories) do %>
|
||||
<% if c == self.category then %>
|
||||
<strong><%=translate(c)%></strong>
|
||||
<% else %>
|
||||
<a href="<%=luci.dispatcher.build_url("admin", "vpn", "wireguard", "advanced", self.instance, c)%>"><%=translate(c)%></a>
|
||||
<% end %>
|
||||
<% if next(self.categories, i) then %>|<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
@@ -0,0 +1,61 @@
|
||||
<%
|
||||
|
||||
%>
|
||||
<script type="text/javascript" src="<%=resource%>/xhr.js"></script>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
|
||||
function uploadc(btn)
|
||||
{
|
||||
var conf = document.getElementById("conf").value;
|
||||
if ( conf == "" )
|
||||
{
|
||||
alert("<%:You must enter a Conf file!!%>");
|
||||
return false;
|
||||
}
|
||||
var iname = document.getElementById("iname").value;
|
||||
if ( iname == "" )
|
||||
{
|
||||
alert("<%:You must enter an Instance name!!%>");
|
||||
return false;
|
||||
}
|
||||
var boot = document.getElementById('boot').checked;
|
||||
bootn = "0";
|
||||
if ( boot == true )
|
||||
{
|
||||
bootn= "1";
|
||||
}
|
||||
confile = bootn + "?" + iname + "?" + conf +"\n?";
|
||||
XHR.get('<%=luci.dispatcher.build_url("admin", "vpn", "textconf")%>',
|
||||
{ set: confile },
|
||||
function(x, rv)
|
||||
{
|
||||
window.location.reload(false);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
//]]></script>
|
||||
|
||||
<fieldset class="cbi-section" id="cbi-family">
|
||||
<legend><%:Paste Configuration File Here%></legend>
|
||||
<table id="ctxt" width="700" border="0" style="display:table;">
|
||||
<tr>
|
||||
<td width="50%">
|
||||
<textarea name="conf" id="conf" rows="10" style="width: 600px;" maxlength="1000"></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table id="btxt" width="700" border="0" style="display:table;">
|
||||
<tr>
|
||||
<td width="10%"><input type="button" id="apply1" class="cbi-button cbi-button-apply" value="<%:Upload Conf File%>" onclick="return uploadc(this)" /></td>
|
||||
|
||||
<td width="10%"><div align="right"><strong><%:Instance Name : %></strong></div></td>
|
||||
<td width="12%"><input type="text" name="iname" id="iname" class="cbi-input-text" style="width: 150px;" maxlength="100" value="SardisTel"></input></td>
|
||||
<td width="10%"><div align="right"><strong><%:Start on Boot : %></strong></div></td>
|
||||
<td width="8%">
|
||||
<input type="checkbox" id="boot" checked />
|
||||
</td>
|
||||
<td width="50%"> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
@@ -0,0 +1,228 @@
|
||||
<%#
|
||||
Copyright 2016-2017 Dan Luedtke <mail@danrl.com>
|
||||
Licensed to the public under the Apache License 2.0.
|
||||
-%>
|
||||
|
||||
<%
|
||||
|
||||
-%>
|
||||
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
|
||||
function bytes_to_str(bytes) {
|
||||
bytes = parseFloat(bytes);
|
||||
if (bytes < 1) { return "0 B"; }
|
||||
var sizes = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'];
|
||||
var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
|
||||
return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
|
||||
};
|
||||
|
||||
function timestamp_to_str(timestamp) {
|
||||
if (timestamp < 1) {
|
||||
return '<%:Never%>';
|
||||
}
|
||||
var now = new Date();
|
||||
var seconds = (now.getTime() / 1000) - timestamp;
|
||||
var ago = "";
|
||||
if (seconds < 60) {
|
||||
ago = parseInt(seconds) + '<%:s ago%>';
|
||||
} else if (seconds < 3600) {
|
||||
ago = parseInt(seconds / 60) + '<%:m ago%>';
|
||||
} else if (seconds < 86401) {
|
||||
ago = parseInt(seconds / 3600) + '<%:h ago%>';
|
||||
} else {
|
||||
ago = '<%:over a day ago%>';
|
||||
}
|
||||
var t = new Date(timestamp * 1000);
|
||||
return t.toUTCString() + ' (' + ago + ')';
|
||||
}
|
||||
|
||||
|
||||
XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "vpn", "wirestatus")%>', null,
|
||||
function(x, data) {
|
||||
both = {};
|
||||
bothbp={};
|
||||
iii = 1;
|
||||
for (var key in data) {
|
||||
if (!data.hasOwnProperty(key)) { continue; }
|
||||
var ifname = key;
|
||||
var iface = data[key];
|
||||
|
||||
var s = "";
|
||||
if (iface.public_key == '(none)') {
|
||||
s += '<em><%:Interface does not have a public key!%></em>';
|
||||
} else {
|
||||
s += String.format(
|
||||
'<strong><%:Public Key%>: </strong>%s',
|
||||
iface.public_key
|
||||
);
|
||||
}
|
||||
if (iface.listen_port > 0) {
|
||||
s += String.format(
|
||||
'<br /><strong><%:Listen Port%>: </strong>%s',
|
||||
iface.listen_port
|
||||
);
|
||||
}
|
||||
if (iface.fwmark != 'off') {
|
||||
s += String.format(
|
||||
'<br /><strong><%:Firewall Mark%>: </strong>%s',
|
||||
iface.fwmark
|
||||
);
|
||||
}
|
||||
if ( iii == 1 )
|
||||
{
|
||||
document.getElementById("iinfo").innerHTML = s;
|
||||
document.getElementById("leg").innerHTML = ifname;
|
||||
}
|
||||
else
|
||||
{
|
||||
document.getElementById("iinfo1").innerHTML = s;
|
||||
document.getElementById("leg1").innerHTML = ifname;
|
||||
}
|
||||
for (var i = 0, ilen = iface.peers.length; i < ilen; i++) {
|
||||
var peer = iface.peers[i];
|
||||
var s = String.format(
|
||||
'<strong><%:Public Key%>: </strong>%s',
|
||||
peer.public_key
|
||||
);
|
||||
if (peer.endpoint != '(none)') {
|
||||
s += String.format(
|
||||
'<br /><strong><%:Endpoint%>: </strong>%s',
|
||||
peer.endpoint
|
||||
);
|
||||
}
|
||||
if (peer.allowed_ips.length > 0) {
|
||||
s += '<br /><strong><%:Allowed IPs%>:</strong>';
|
||||
for (var k = 0, klen = peer.allowed_ips.length; k < klen; k++) {
|
||||
s += '<br /> • ' + peer.allowed_ips[k];
|
||||
}
|
||||
}
|
||||
if (peer.persistent_keepalive != 'off') {
|
||||
s += String.format(
|
||||
'<br /><strong><%:Persistent Keepalive%>: </strong>%ss',
|
||||
peer.persistent_keepalive
|
||||
);
|
||||
}
|
||||
var icon = '<img src="<%=resource%>/icons/wireguard_disabled.png" />';
|
||||
var now = new Date();
|
||||
if (((now.getTime() / 1000) - peer.latest_handshake) < 140) {
|
||||
icon = '<img src="<%=resource%>/icons/wireguard.png" />';
|
||||
}
|
||||
s += String.format(
|
||||
'<br /><strong><%:Latest Handshake%>: </strong>%s',
|
||||
timestamp_to_str(peer.latest_handshake)
|
||||
);
|
||||
s += String.format(
|
||||
'<br /><strong><%:Data Received%>: </strong>%s' +
|
||||
'<br /><strong><%:Data Transmitted%>: </strong>%s',
|
||||
bytes_to_str(peer.transfer_rx),
|
||||
bytes_to_str(peer.transfer_tx)
|
||||
);
|
||||
if ( iii == 1 )
|
||||
{
|
||||
document.getElementById("config").innerHTML = icon;
|
||||
document.getElementById("info").innerHTML = s;
|
||||
}
|
||||
else
|
||||
{
|
||||
document.getElementById("config1").innerHTML = icon;
|
||||
document.getElementById("info1").innerHTML = s;
|
||||
}
|
||||
}
|
||||
iii = iii + 1;
|
||||
}
|
||||
});
|
||||
//]]></script>
|
||||
|
||||
<h2><%:WireGuard Status%></h2>
|
||||
|
||||
<fieldset class="cbi-section">
|
||||
|
||||
<div>
|
||||
<table width="900" border="0">
|
||||
<tr>
|
||||
<td width="50px" style="vertical-align:center;font-size : 25px">
|
||||
<div><%:Interface %></div>
|
||||
</td>
|
||||
<td width="100px" id="leg" style="width:100px; text-align:left; padding:3px;font-size : 25px"> </td>
|
||||
<td width="650px"> </td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="900" border="0">
|
||||
<tr>
|
||||
<td width="20px"> </td>
|
||||
<td width="150px" style="vertical-align:center;font-size : 20px">
|
||||
<div><%:Configuration%></div>
|
||||
</td>
|
||||
<td width="100px" id="config" style="width:16px; text-align:center; padding:3px"> </td>
|
||||
<td width="50px"> </td>
|
||||
<td width="580px">
|
||||
<div id="info" style="vertical-align:middle; padding: 3px">
|
||||
<em><%:Collecting data...%></em>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td style="vertical-align:center;font-size : 20px">
|
||||
<div><%:Peer%></div>
|
||||
</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td>
|
||||
<div id="iinfo" style="vertical-align:middle; padding: 3px">
|
||||
<em><%:Collecting data...%></em>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table width="900" border="0" id="second1">
|
||||
<tr>
|
||||
<td width="50px" style="vertical-align:center;font-size : 25px">
|
||||
<div><%:Interface %></div>
|
||||
</td>
|
||||
<td width="100px" id="leg1" style="width:100px; text-align:left; padding:3px;font-size : 25px"> </td>
|
||||
<td width="650px"> </td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="900" border="0" id="second">
|
||||
<tr>
|
||||
<td width="20px"> </td>
|
||||
<td width="150px" style="vertical-align:center;font-size : 20px">
|
||||
<div><%:Configuration%></div>
|
||||
</td>
|
||||
<td width="100px" id="config1" style="width:16px; text-align:center; padding:3px"> </td>
|
||||
<td width="50px"> </td>
|
||||
<td width="580px">
|
||||
<div id="info1" style="vertical-align:middle; padding: 3px">
|
||||
<em><%:Collecting data...%></em>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td style="vertical-align:center;font-size : 20px">
|
||||
<div><%:Peer%></div>
|
||||
</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td>
|
||||
<div id="iinfo1" style="vertical-align:middle; padding: 3px">
|
||||
<em><%:Collecting data...%></em>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--
|
||||
<table id="cmdtxt" width="700" border="0" style="display:table;">
|
||||
<tr>
|
||||
<td width="100%">
|
||||
<textarea readonly="readonly" name="attxt" id="attxt" rows="6" style="width: 600px;" maxlength="160"></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table> -->
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
|
||||
Reference in New Issue
Block a user