mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-04 15:43:56 +08:00
This commit is contained in:
1 parent
c7bafc635d
commit
c71da84035
264 files changed
+8169
-3944
No files matched your search
@@ -852,6 +852,61 @@ function networksPanel(section) {
|
||||
return tr;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------- sort state
|
||||
*
|
||||
* Click a header: sort ascending by it. Click it again: descending.
|
||||
* Click another column: that column, ascending. Sorting re-reads the
|
||||
* cached model, never the controller -- same rule as the filter. */
|
||||
var sortKey = 'id', sortDir = 1;
|
||||
|
||||
function keyName(m) { var s = (m.name || '').trim(); return s || null; }
|
||||
function keyIp(m) { return (m.ipAssignments || [])[0] || null; }
|
||||
function keyStatus(m) {
|
||||
if (m.id === controllerAddr) return 0;
|
||||
if (!pok) return 3;
|
||||
return isOnline(peerMap[m.id]) ? 1 : 2;
|
||||
}
|
||||
function keyLatency(m) {
|
||||
var p = peerMap[m.id];
|
||||
if (!pok || !isOnline(p) || !(p.latency > 0)) return null;
|
||||
return p.latency;
|
||||
}
|
||||
function cmpIp(a, b) {
|
||||
var pa = a.split('.'), pb = b.split('.'), i, d;
|
||||
for (i = 0; i < 4; i++) { d = (parseInt(pa[i], 10) || 0) - (parseInt(pb[i], 10) || 0); if (d) return d; }
|
||||
return 0;
|
||||
}
|
||||
var sortCols = {
|
||||
name: { key: keyName, cmp: function(a, b) { return a.localeCompare(b, 'zh'); } },
|
||||
id: { key: function(m) { return m.id; }, cmp: function(a, b) { return a < b ? -1 : a > b ? 1 : 0; } },
|
||||
authorized: { key: function(m) { return m.authorized ? 1 : 0; }, cmp: function(a, b) { return a - b; } },
|
||||
activeBridge:{ key: function(m) { return m.activeBridge ? 1 : 0; }, cmp: function(a, b) { return a - b; } },
|
||||
ip: { key: keyIp, cmp: cmpIp },
|
||||
status: { key: keyStatus, cmp: function(a, b) { return a - b; } },
|
||||
latency: { key: keyLatency, cmp: function(a, b) { return a - b; } }
|
||||
};
|
||||
|
||||
/* Empty keys sort last in BOTH directions: a member with no name or no
|
||||
* address must not jump to the top just because the column flipped. */
|
||||
function sortedMembers() {
|
||||
var col = sortCols[sortKey];
|
||||
var arr = membersArr.slice();
|
||||
arr.sort(function(a, b) {
|
||||
var ka = col.key(a), kb = col.key(b);
|
||||
if ((ka == null) !== (kb == null)) return ka == null ? 1 : -1;
|
||||
if (ka == null) return 0;
|
||||
return sortDir * col.cmp(ka, kb);
|
||||
});
|
||||
return arr;
|
||||
}
|
||||
|
||||
function clickSort(key) {
|
||||
if (sortKey === key) sortDir = -sortDir;
|
||||
else { sortKey = key; sortDir = 1; }
|
||||
paintSortInd();
|
||||
drawRows();
|
||||
}
|
||||
|
||||
function drawRows() {
|
||||
while (tbody.firstChild) tbody.removeChild(tbody.firstChild);
|
||||
/* Clear the cell refs of the rows being replaced: a stale entry would
|
||||
@@ -860,7 +915,7 @@ function networksPanel(section) {
|
||||
rowRefs = {};
|
||||
var q = filterI.value ? filterI.value.toLowerCase() : '';
|
||||
var shown = 0;
|
||||
membersArr.forEach(function(m) {
|
||||
sortedMembers().forEach(function(m) {
|
||||
var hay = ((m.name || '') + ' ' + m.id + ' ' + (m.ipAssignments || []).join(', ')).toLowerCase();
|
||||
if (q && hay.indexOf(q) === -1) return;
|
||||
shown++;
|
||||
@@ -905,16 +960,31 @@ function networksPanel(section) {
|
||||
var refreshBtn = E('button', { 'class': 'cbi-button cbi-button-action' }, [ _('Refresh') ]);
|
||||
refreshBtn.addEventListener('click', refreshAll);
|
||||
|
||||
var sortInd = {};
|
||||
function paintSortInd() {
|
||||
for (var k in sortInd)
|
||||
sortInd[k].textContent = (sortKey === k) ? (sortDir > 0 ? ' ▲' : ' ▼') : '';
|
||||
}
|
||||
function sortableTh(label, key, style) {
|
||||
var ind = E('span', { 'style': 'font-size:0.8em; opacity:0.7;' });
|
||||
sortInd[key] = ind;
|
||||
return E('th', {
|
||||
'style': style + ' cursor:pointer; user-select:none;',
|
||||
'title': _('Sort by this column'),
|
||||
'click': function() { clickSort(key); }
|
||||
}, [ _(label), ind ]);
|
||||
}
|
||||
var hdr = E('tr', {}, [
|
||||
E('th', { 'style': 'width:34px;' }, []),
|
||||
E('th', { 'style': 'width:19%;' }, [_('Member name')]),
|
||||
E('th', { 'style': 'width:12%;' }, [_('Member ID')]),
|
||||
E('th', { 'style': 'width:9%; text-align:center;' }, [_('Authorized')]),
|
||||
E('th', { 'style': 'width:9%; text-align:center;' }, [_('Active bridge')]),
|
||||
E('th', { 'style': 'width:13%;' }, [_('IP assignment')]),
|
||||
E('th', { 'style': 'width:12%;' }, [_('Peer status')]),
|
||||
E('th', { 'style': 'width:26%;' }, [_('Peer address / latency')])
|
||||
sortableTh('Member name', 'name', 'width:19%;'),
|
||||
sortableTh('Member ID', 'id', 'width:12%;'),
|
||||
sortableTh('Authorized', 'authorized', 'width:9%; text-align:center;'),
|
||||
sortableTh('Active bridge', 'activeBridge', 'width:9%; text-align:center;'),
|
||||
sortableTh('IP assignment', 'ip', 'width:13%;'),
|
||||
sortableTh('Peer status', 'status', 'width:12%;'),
|
||||
sortableTh('Peer address / latency', 'latency', 'width:26%;')
|
||||
]);
|
||||
paintSortInd();
|
||||
into.appendChild(E('div', { 'style': 'display:flex; gap:8px; align-items:center; margin:6px 0;' },
|
||||
[ filterI, counterHost, refreshBtn, stamp ]));
|
||||
/* The scroll wrapper and min-width are load-bearing: table-layout:fixed
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
* Keys are sfh(trimws(msgid)) in hex, exactly what cbi.js _() looks up.
|
||||
* This firmware ships no window.TR bridge of its own. */
|
||||
window.TR = window.TR || {};
|
||||
Object.assign(window.TR, {"7ba57fa5":"(控制器端口 ","005fb0ba":" —— 成员将不会从此地址池获得地址。","928f10ca":"节点地址必须为 10 位十六进制数字","4f25ffed":"地址池需要一个覆盖相同子网的路由,否则成员将获取不到地址。","623124cd":"ZeroTier 控制器或 Moon 根节点必须运行在具有固定公网 IP 的服务器上,可经 SSH 访问,且该用户具有免密 sudo 权限。控制器 API 不支持 TLS 且拒绝所有非本机回环的调用方,因此本页面从不直接访问它:而是从本路由器向远程回环接口建立 SSH 隧道,经隧道发送 API 调用。控制器令牌按需经 SSH 读取,从不存储在本机。","038a5486":"操作","e733b525":"主动桥接","300fe5c8":"添加","3698d6ed":"添加远程主机","5598797e":"加入 Moon","d252deef":"添加地址池","e5b147b7":"添加远程主机","ea8fae46":"添加路由","71677946":"地址","a4a2e2e7":"高级设置","6ee64833":"允许默认路由","d24721ab":"允许 DNS","51aaeef3":"允许全局","e575f233":"允许管理","d6d5a047":"允许 Zerotier 的拨入客户端访问路由器 LAN 资源(需要在 Zerotier 管理页面设定到 LAN 网段的路由表)","0b830d67":"正在分配地址…","2e4746c8":"授权","18bbde5a":"授权失败","ececebcc":"已授权","e3f664db":"自动允许客户端 NAT","2014c910":"自动 NAT: 已禁用","228abc80":"自动 NAT: 已启用","f2ffec55":"正在备份...","bdabf869":"备份失败","5eca6072":"立即备份","379bb677":"备份请求失败","f9fb6815":"基本设置","6b3b39f7":"广播","fcf89e62":"构建中…","ae5deb3a":"取消","08f23f6b":"无法连接到 ZeroTier 服务","4bd163d1":"无法读取 moon(ZeroTier 服务是否在运行?)","c06f3259":"正在收集数据...","8462484d":"正在获取地址...","cd2f6c29":"运行配置目录","8f48fe99":"配置","6e72b101":"已配置的主机","f1d119dc":"控制器端口","5d359cf2":"控制器可经隧道访问","41e439d8":"控制器状态存在","00a35b8a":"运行配置目录保护","bd7030be":"使用拷贝而不是链接,来保护原目录内容(一般用于预先配置的控制器模式)","88720483":"无法构建方案","a1a69329":"无法获取成员列表","c53244dc":"无法连接控制器","2c150360":"无法读取此网络的任何成员","c1dfeb1a":"以下网络无法读取,因此未显示:","f2248b2d":"无法刷新成员列表;表格保持不变","cbb3b741":"无法保存主机","56370eb4":"创建并签署 Moon","e3a2eb47":"创建失败","eb9bb863":"创建网络","6c94b9b0":"点击跳转到 Zerotier 官网管理平台,新建或者管理网络,并允许客户端接入访问你私人网路(新接入的节点默认不允许访问)","9a74d36d":"删除","b3b872fe":"删除失败","51d36b3d":"删除网络 ","f89b7324":"退出失败","88643bc2":"退出请求失败","be021833":"设备","a0c974c7":"诊断","6469d71b":"诊断失败","00c6b479":"将此文件分发给成员,然后在每个节点上使用「接口信息 → Moon → 添加 Moon」。签署密钥从未离开远程主机。","799c81a7":"下载 .moon","000e380f":"编辑","2f2c0439":"编辑远程主机","814db5a8":"留空 = 直连","78c2105b":"启用","17074f70":"端点","037e2ea1":"错误","be7c6b14":"加载 moon 列表出错","ef0771c3":"加载网络信息失败","eef2dd18":"加载节点信息失败","a285946d":"读取 moon 列表出错","b4b44266":"服务重载失败,请手动执行: /etc/init.d/luci-zerotier reload","d0e77240":"按名称、地址或 IP 筛选","9865b44d":"起始 IP","a62c536c":"常规设置","764447db":"全局设置","8686381d":"隐藏","24553b14":"远程管理的工作原理","42933f28":"接口信息","d08681fe":"IP 地址","ad69d4ef":"IP 分配","fbb92dcf":"IP 地址池","7e11b65e":"标签","f2929f6f":"结束 IP","c6ce32d3":"延迟","22038f1d":"退出","4e72d9f1":"留空则保留已存储的密钥","2b1fb9a6":"正在退出 moon...","dee10879":"已退出 Moon","9c0e750d":"链路","10e6bd0b":"加载中...","c2b71057":"本地配置文件","b259d7d8":"管理","949429e8":"托管 IP 必须为 IPv4 地址,以逗号分隔","cdd88b7c":"成员 ID","cdc6d88f":"成员名称","16916c1d":"成员","9c03b236":"个成员","a0ddf226":"Moon","b7ca31c5":"Moon 已创建:","c2e07f85":"Moon 创建失败","bbf90d15":"Moon ID","1af43404":"Moon ID 必须是 10 位十六进制字符(例如 123456abcd)","119eb928":"Moon 种子节点","793bcbfa":"Moon 种子必须是该 moon 某个根节点的 10 位地址","2e8cf7ed":"本节点并未加入该 moon","9a9a1e82":"主机上的 moon.json","7ab90fdf":"Moon","ff21d2cf":"MTU","a59f3806":"多播限制","8d8bb35f":"我的控制器","d785d68e":"名称","1cbaf231":"网络 ID","fadba037":"网络 ID 必须是 16 位十六进制字符(0-9, a-f)","e4aff468":"网络","3eaa20dd":"从未连接","53386700":"否","20961bde":"没有可 Ping 的 IP","70454625":"尚无成员加入此网络。","0887813c":"没有匹配的成员。","867914a1":"未加入任何 moLine truncated
|
||||
Object.assign(window.TR, {"7ba57fa5":"(控制器端口 ","005fb0ba":" —— 成员将不会从此地址池获得地址。","928f10ca":"节点地址必须为 10 位十六进制数字","4f25ffed":"地址池需要一个覆盖相同子网的路由,否则成员将获取不到地址。","623124cd":"ZeroTier 控制器或 Moon 根节点必须运行在具有固定公网 IP 的服务器上,可经 SSH 访问,且该用户具有免密 sudo 权限。控制器 API 不支持 TLS 且拒绝所有非本机回环的调用方,因此本页面从不直接访问它:而是从本路由器向远程回环接口建立 SSH 隧道,经隧道发送 API 调用。控制器令牌按需经 SSH 读取,从不存储在本机。","038a5486":"操作","e733b525":"主动桥接","300fe5c8":"添加","3698d6ed":"添加远程主机","5598797e":"加入 Moon","d252deef":"添加地址池","e5b147b7":"添加远程主机","ea8fae46":"添加路由","71677946":"地址","a4a2e2e7":"高级设置","6ee64833":"允许默认路由","d24721ab":"允许 DNS","51aaeef3":"允许全局","e575f233":"允许管理","d6d5a047":"允许 Zerotier 的拨入客户端访问路由器 LAN 资源(需要在 Zerotier 管理页面设定到 LAN 网段的路由表)","0b830d67":"正在分配地址…","2e4746c8":"授权","18bbde5a":"授权失败","ececebcc":"已授权","e3f664db":"自动允许客户端 NAT","2014c910":"自动 NAT: 已禁用","228abc80":"自动 NAT: 已启用","f2ffec55":"正在备份...","bdabf869":"备份失败","5eca6072":"立即备份","379bb677":"备份请求失败","f9fb6815":"基本设置","6b3b39f7":"广播","fcf89e62":"构建中…","ae5deb3a":"取消","08f23f6b":"无法连接到 ZeroTier 服务","4bd163d1":"无法读取 moon(ZeroTier 服务是否在运行?)","c06f3259":"正在收集数据...","8462484d":"正在获取地址...","cd2f6c29":"运行配置目录","8f48fe99":"配置","6e72b101":"已配置的主机","f1d119dc":"控制器端口","5d359cf2":"控制器可经隧道访问","41e439d8":"控制器状态存在","00a35b8a":"运行配置目录保护","bd7030be":"使用拷贝而不是链接,来保护原目录内容(一般用于预先配置的控制器模式)","88720483":"无法构建方案","a1a69329":"无法获取成员列表","c53244dc":"无法连接控制器","2c150360":"无法读取此网络的任何成员","c1dfeb1a":"以下网络无法读取,因此未显示:","f2248b2d":"无法刷新成员列表;表格保持不变","cbb3b741":"无法保存主机","56370eb4":"创建并签署 Moon","e3a2eb47":"创建失败","eb9bb863":"创建网络","6c94b9b0":"点击跳转到 Zerotier 官网管理平台,新建或者管理网络,并允许客户端接入访问你私人网路(新接入的节点默认不允许访问)","9a74d36d":"删除","b3b872fe":"删除失败","51d36b3d":"删除网络 ","f89b7324":"退出失败","88643bc2":"退出请求失败","be021833":"设备","a0c974c7":"诊断","6469d71b":"诊断失败","00c6b479":"将此文件分发给成员,然后在每个节点上使用「接口信息 → Moon → 添加 Moon」。签署密钥从未离开远程主机。","799c81a7":"下载 .moon","000e380f":"编辑","2f2c0439":"编辑远程主机","814db5a8":"留空 = 直连","78c2105b":"启用","17074f70":"端点","037e2ea1":"错误","be7c6b14":"加载 moon 列表出错","ef0771c3":"加载网络信息失败","eef2dd18":"加载节点信息失败","a285946d":"读取 moon 列表出错","b4b44266":"服务重载失败,请手动执行: /etc/init.d/luci-zerotier reload","d0e77240":"按名称、地址或 IP 筛选","9865b44d":"起始 IP","a62c536c":"常规设置","764447db":"全局设置","8686381d":"隐藏","24553b14":"远程管理的工作原理","42933f28":"接口信息","d08681fe":"IP 地址","ad69d4ef":"IP 分配","fbb92dcf":"IP 地址池","7e11b65e":"标签","f2929f6f":"结束 IP","c6ce32d3":"延迟","22038f1d":"退出","4e72d9f1":"留空则保留已存储的密钥","2b1fb9a6":"正在退出 moon...","dee10879":"已退出 Moon","9c0e750d":"链路","10e6bd0b":"加载中...","c2b71057":"本地配置文件","b259d7d8":"管理","949429e8":"托管 IP 必须为 IPv4 地址,以逗号分隔","cdd88b7c":"成员 ID","cdc6d88f":"成员名称","16916c1d":"成员","9c03b236":"个成员","a0ddf226":"Moon","b7ca31c5":"Moon 已创建:","c2e07f85":"Moon 创建失败","bbf90d15":"Moon ID","1af43404":"Moon ID 必须是 10 位十六进制字符(例如 123456abcd)","119eb928":"Moon 种子节点","793bcbfa":"Moon 种子必须是该 moon 某个根节点的 10 位地址","2e8cf7ed":"本节点并未加入该 moon","9a9a1e82":"主机上的 moon.json","7ab90fdf":"Moon","ff21d2cf":"MTU","a59f3806":"多播限制","8d8bb35f":"我的控制器","d785d68e":"名称","1cbaf231":"网络 ID","fadba037":"网络 ID 必须是 16 位十六进制字符(0-9, a-f)","e4aff468":"网络","3eaa20dd":"从未连接","53386700":"否","20961bde":"没有可 Ping 的 IP","70454625":"尚无成员加入此网络。","0887813c":"没有匹配的成员。","867914a1":"未加入任何 moLine truncated
|
||||
Reference in new issue
Block a user