update 2025-02-13 20:42:01
This commit is contained in:
parent
d9e7dca2a2
commit
8e6cc55574
17
luci-app-ap-modem/Makefile
Normal file
17
luci-app-ap-modem/Makefile
Normal file
@ -0,0 +1,17 @@
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_VERSION:=1.0.5-20241208
|
||||
PKG_RELEASE:=
|
||||
PKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>
|
||||
|
||||
LUCI_TITLE:=Easy Access AP / Modem
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
define Package/luci-app-ap-modem/conffiles
|
||||
/etc/config/ap_modem
|
||||
endef
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
@ -0,0 +1,54 @@
|
||||
'use strict';
|
||||
'require view';
|
||||
'require uci';
|
||||
'require form';
|
||||
|
||||
return view.extend({
|
||||
load: function() {
|
||||
return Promise.all([
|
||||
uci.load('ap_modem')
|
||||
]);
|
||||
},
|
||||
|
||||
render: function() {
|
||||
|
||||
var m, s, o, ss;
|
||||
|
||||
m = new form.Map('ap_modem', _('Access AP / Modem'),
|
||||
_('Allows clients in the local network to access AP or modem on different subnet.'));
|
||||
|
||||
s = m.section(form.NamedSection, 'config', 'ap_modem', _('Global Settings'));
|
||||
s.anonymous = true;
|
||||
s.addremove = false;
|
||||
|
||||
o = s.option(form.Flag, 'enabled', _('Enable'));
|
||||
o.rmempty = false;
|
||||
|
||||
s = m.section(form.NamedSection, 'config', 'ap_modem', _('Interface Settings'));
|
||||
s.anonymous = true;
|
||||
s.addremove = false;
|
||||
|
||||
[
|
||||
{id:"lan", title:_("LAN"), subtitle:_("AP on LAN side"), placeholder:"192.168.31.254",
|
||||
example:_("<br>For example, you want to access the AP, its IP address is 192.168.31.1, but the client and the router are not in its subnet, so it cannot be connected. "
|
||||
+ "Then you can add 192.168.31.254 here, the client will be able to access 192.168.31.1 after saving and applying.")},
|
||||
{id:"wan", title:_("WAN"), subtitle:_("AP / Modem on WAN side"), placeholder:"192.168.1.254",
|
||||
example:_("<br>For example, you want to access the modem, its IP address is 192.168.1.1, but because it uses PPPoE bridge mode, so it cannot be connected. "
|
||||
+ "Then you can add 192.168.1.254 here, the client will be able to access 192.168.1.1 after saving and applying.")},
|
||||
].forEach(function(vif) {
|
||||
s.tab(vif.id, vif.title);
|
||||
|
||||
o = s.taboption(vif.id, form.SectionValue, '__'+vif.id+'__', form.NamedSection, vif.id, null,
|
||||
vif.subtitle, _('Here add the IP address of the same subnet as the target device, but not the same as the target device. <br>Do not add IPs already used by other devices.') + vif.example);
|
||||
|
||||
ss = o.subsection;
|
||||
ss.anonymous = true;
|
||||
|
||||
o = ss.option(form.DynamicList, 'ipaddr', _('Virtual IP'), _('Supports "IP/MASK", "IP/PREFIX", and pure "IP" format, pure "IP" assumes a prefix of 24 bits'));
|
||||
o.datatype = 'ipmask4';
|
||||
o.placeholder = vif.placeholder;
|
||||
});
|
||||
|
||||
return m.render();
|
||||
}
|
||||
});
|
43
luci-app-ap-modem/po/zh-cn/ap-modem.po
Normal file
43
luci-app-ap-modem/po/zh-cn/ap-modem.po
Normal file
@ -0,0 +1,43 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8"
|
||||
|
||||
msgid "Access AP / Modem"
|
||||
msgstr "访问AP/光猫"
|
||||
|
||||
msgid "Allows clients in the local network to access AP or modem on different subnet."
|
||||
msgstr "让局域网客户端访问不同子网的AP或光猫"
|
||||
|
||||
msgid "Global Settings"
|
||||
msgstr "全局设置"
|
||||
|
||||
msgid "Interface Settings"
|
||||
msgstr "网络接口配置"
|
||||
|
||||
msgid "AP on LAN side"
|
||||
msgstr "位于LAN口的AP"
|
||||
|
||||
msgid "AP / Modem on WAN side"
|
||||
msgstr "位于WAN口的AP或光猫"
|
||||
|
||||
msgid "Virtual IP"
|
||||
msgstr "虚拟IP地址"
|
||||
|
||||
msgid ""
|
||||
"Here add the IP address of the same subnet as the target device, but not the same as the target device. "
|
||||
"<br>Do not add IPs already used by other devices."
|
||||
msgstr ""
|
||||
"这里添加与目标设备同子网的IP地址,但不能与目标设备IP完全相同。<br>不要添加其他设备正在使用的IP。"
|
||||
|
||||
msgid ""
|
||||
"<br>For example, you want to access the AP, its IP address is 192.168.31.1, but the client and the router are not in its subnet, so it cannot be connected. "
|
||||
"Then you can add 192.168.31.254 here, the client will be able to access 192.168.31.1 after saving and applying."
|
||||
msgstr "<br>例如,你想要访问AP后台,它的IP地址是192.168.31.1,但是由于现在客户端和路由器都不在它的子网,无法连接。那么可以在这里添加192.168.31.254,保存并应用之后客户端就能访问192.168.31.1了。"
|
||||
|
||||
msgid ""
|
||||
"<br>For example, you want to access the modem, its IP address is 192.168.1.1, but because it uses PPPoE bridge mode, so it cannot be connected. "
|
||||
"Then you can add 192.168.1.254 here, the client will be able to access 192.168.1.1 after saving and applying."
|
||||
msgstr "<br>例如,你想要访问光猫后台,它的IP地址是192.168.1.1,但是由于它使用PPPoE桥接模式,无法连接。那么可以在这里添加192.168.1.254,保存并应用之后客户端就能访问192.168.1.1了。"
|
||||
|
||||
msgid "Supports \"IP/MASK\", \"IP/PREFIX\", and pure \"IP\" format, pure \"IP\" assumes a prefix of 24 bits"
|
||||
msgstr "支持“IP/掩码”、“IP/前缀长度”、以及纯“IP”格式,纯“IP”则假设前缀24位"
|
1
luci-app-ap-modem/po/zh_Hans
Symbolic link
1
luci-app-ap-modem/po/zh_Hans
Symbolic link
@ -0,0 +1 @@
|
||||
zh-cn
|
8
luci-app-ap-modem/root/etc/config/ap_modem
Normal file
8
luci-app-ap-modem/root/etc/config/ap_modem
Normal file
@ -0,0 +1,8 @@
|
||||
config ap_modem 'config'
|
||||
option enabled '0'
|
||||
|
||||
config interface 'lan'
|
||||
# list ipaddr '192.168.31.254'
|
||||
|
||||
config interface 'wan'
|
||||
# list ipaddr '192.168.1.254'
|
208
luci-app-ap-modem/root/etc/init.d/ap_modem
Executable file
208
luci-app-ap-modem/root/etc/init.d/ap_modem
Executable file
@ -0,0 +1,208 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=20
|
||||
USE_PROCD=1
|
||||
|
||||
boot() {
|
||||
# procd will call service_triggers
|
||||
rc_procd true
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "network" "ap_modem"
|
||||
}
|
||||
|
||||
find_uci_section_i() {
|
||||
local key="$2"
|
||||
local value="$3"
|
||||
local testv
|
||||
config_get testv "$1" "$key"
|
||||
[[ "$value" = "$testv" ]] && echo "$1"
|
||||
}
|
||||
|
||||
find_uci_section() {
|
||||
local config="$1"
|
||||
local type="$2"
|
||||
local key="$3"
|
||||
local value="$4"
|
||||
(
|
||||
config_load "$config"
|
||||
config_foreach find_uci_section_i "$type" "$key" "$value"
|
||||
)
|
||||
}
|
||||
|
||||
generate_config() {
|
||||
[[ "`uci -q get network.lan.device`" = "br-lan" ]] || {
|
||||
echo "network.lan.device != br-lan in uci" >&2
|
||||
return 1
|
||||
}
|
||||
local wan_dev="`uci -q get network.wan.device`"
|
||||
[[ -z "$wan_dev" ]] && {
|
||||
echo "get network.wan.device in uci failed" >&2
|
||||
return 1
|
||||
}
|
||||
local lan_dev=`find_uci_section network device name 'br-lan' | head -1`
|
||||
[[ -z "$lan_dev" ]] && {
|
||||
echo "network.device.name=br-lan not found in uci" >&2
|
||||
return 1
|
||||
}
|
||||
|
||||
local wan_zone=`find_uci_section firewall zone name 'wan' | head -1`
|
||||
[[ -z "$wan_zone" ]] && {
|
||||
echo "firewall.zone.name=wan not found in uci" >&2
|
||||
return 1
|
||||
}
|
||||
|
||||
# virutal lan device
|
||||
uci -q get network.veth_lan >/dev/null || uci -q batch <<-EOF >/dev/null
|
||||
set network.veth_lan=device
|
||||
set network.veth_lan.type=veth
|
||||
set network.veth_lan.name=vap-lan
|
||||
set network.veth_lan.sendredirects=0
|
||||
set network.veth_lan.ipv6=0
|
||||
set network.veth_lan.multicast=0
|
||||
set network.veth_lan.peer_name=vap-lan-peer
|
||||
EOF
|
||||
uci -q get network.veth_lan_peer >/dev/null || uci -q batch <<-EOF >/dev/null
|
||||
set network.veth_lan_peer=device
|
||||
set network.veth_lan_peer.name=vap-lan-peer
|
||||
set network.veth_lan_peer.sendredirects=0
|
||||
set network.veth_lan_peer.ipv6=0
|
||||
set network.veth_lan_peer.multicast=0
|
||||
EOF
|
||||
uci -q get "network.$lan_dev.ports" | grep -Fwq 'vap-lan' || uci add_list "network.$lan_dev.ports=vap-lan"
|
||||
|
||||
# interface
|
||||
if uci -q get network.vap_lan >/dev/null; then
|
||||
uci -q delete network.vap_lan.auto
|
||||
else
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
set network.vap_lan=interface
|
||||
set network.vap_lan.proto=static
|
||||
set network.vap_lan.device=vap-lan-peer
|
||||
set network.vap_lan.defaultroute=0
|
||||
set network.vap_lan.delegate=0
|
||||
EOF
|
||||
fi
|
||||
if uci -q get network.vap_wan >/dev/null; then
|
||||
uci -q delete network.vap_wan.auto
|
||||
else
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
set network.vap_wan=interface
|
||||
set network.vap_wan.proto=static
|
||||
set network.vap_wan.device=$wan_dev
|
||||
set network.vap_wan.defaultroute=0
|
||||
set network.vap_wan.delegate=0
|
||||
EOF
|
||||
fi
|
||||
# firewall
|
||||
local fw_wan_net="`uci -q get firewall.$wan_zone.network`"
|
||||
echo "$fw_wan_net" | grep -Fwq 'vap_lan' || uci -q batch <<-EOF >/dev/null
|
||||
add_list firewall.$wan_zone.network=vap_lan
|
||||
EOF
|
||||
echo "$fw_wan_net" | grep -Fwq 'vap_wan' || uci -q batch <<-EOF >/dev/null
|
||||
add_list firewall.$wan_zone.network=vap_wan
|
||||
EOF
|
||||
uci commit firewall
|
||||
|
||||
# ip
|
||||
local bip
|
||||
local black_ip="127.0.0.1/8"
|
||||
[[ "`uci -q get network.lan.proto`" = "static" ]] && {
|
||||
local lan_ip="`uci -q get network.lan.ipaddr`"
|
||||
if [[ -n "$lan_ip" ]]; then
|
||||
local netmask="`uci -q get network.lan.netmask`"
|
||||
[[ -n "$netmask" ]] || netmask=255.255.255.255
|
||||
for bip in $lan_ip; do
|
||||
if [[ "$bip" = "*/*" ]]; then
|
||||
eval "$(ipcalc.sh $bip )";black_ip="$black_ip $IP/$PREFIX"
|
||||
else
|
||||
eval "$(ipcalc.sh $bip $netmask )";black_ip="$black_ip $IP/$PREFIX"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
logger -t 'ap_modem' -p INFO "black: $black_ip"
|
||||
|
||||
local ipaddr
|
||||
local vip
|
||||
local vip_p
|
||||
local vnet
|
||||
local bnet
|
||||
local ok
|
||||
local vif
|
||||
for vif in lan wan; do
|
||||
config_get ipaddr $vif ipaddr
|
||||
[[ -n "$ipaddr" ]] || continue
|
||||
for vip in $ipaddr; do
|
||||
ok=1
|
||||
[[ "$vip" = "*/*" ]] || vip="$vip/24"
|
||||
eval "$(ipcalc.sh $vip )";vip="$IP";vip_p="$PREFIX"
|
||||
[[ "$vip_p" = 32 ]] && {
|
||||
logger -t 'ap_modem' -p DEBUG "vap_$vif skip $vip/$vip_p"
|
||||
break
|
||||
}
|
||||
for bip in $black_ip; do
|
||||
eval "$(ipcalc.sh "$bip" )";bip="$IP";
|
||||
[[ "$PREFIX" -le "$vip_p" ]] || PREFIX=$vip_p
|
||||
eval "$(ipcalc.sh "$vip/$PREFIX" )";vnet="$NETWORK";
|
||||
eval "$(ipcalc.sh "$bip/$PREFIX" )";bnet="$NETWORK";
|
||||
if [[ "$vnet" = "$bnet" ]]; then
|
||||
logger -t 'ap_modem' -p DEBUG "vap_$vif skip $vip/$vip_p"
|
||||
ok=0
|
||||
break
|
||||
fi
|
||||
done
|
||||
[[ "$ok" = 1 ]] && {
|
||||
uci add_list "network.vap_$vif.ipaddr=$vip/$vip_p"
|
||||
black_ip="$black_ip $vip/$vip_p"
|
||||
}
|
||||
done
|
||||
done
|
||||
|
||||
uci commit network
|
||||
}
|
||||
|
||||
clean_config() {
|
||||
local wan_zone=`find_uci_section firewall zone name 'wan' | head -1`
|
||||
[[ -z "$wan_zone" ]] || uci -q batch <<-EOF >/dev/null
|
||||
del_list firewall.$wan_zone.network=vap_lan
|
||||
del_list firewall.$wan_zone.network=vap_wan
|
||||
commit firewall
|
||||
EOF
|
||||
local lan_dev=`find_uci_section network device name 'br-lan' | head -1`
|
||||
[[ -z "$lan_dev" ]] || {
|
||||
uci del_list "network.$lan_dev.ports=vap-lan"
|
||||
}
|
||||
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
set network.vap_lan.auto=0
|
||||
set network.vap_wan.auto=0
|
||||
delete network.veth_lan_peer
|
||||
delete network.veth_lan
|
||||
commit network
|
||||
EOF
|
||||
}
|
||||
|
||||
start_service() {
|
||||
config_load ap_modem
|
||||
config_get_bool enabled "config" enabled 0
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
delete network.vap_lan.ipaddr
|
||||
delete network.vap_wan.ipaddr
|
||||
commit network
|
||||
EOF
|
||||
if [[ "$enabled" = "1" ]]; then
|
||||
generate_config
|
||||
else
|
||||
clean_config
|
||||
fi
|
||||
/etc/init.d/network reload
|
||||
return 0
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
clean_config
|
||||
/etc/init.d/network reload
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
{
|
||||
"admin/network/ap_modem": {
|
||||
"title": "Access AP / Modem",
|
||||
"order": 99,
|
||||
"action": {
|
||||
"type": "view",
|
||||
"path": "ap_modem"
|
||||
},
|
||||
"depends": {
|
||||
"acl": [ "luci-app-ap-modem" ],
|
||||
"uci": { "ap_modem": true }
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
{
|
||||
"luci-app-ap-modem": {
|
||||
"description": "Grant access to 'Access AP / Modem'",
|
||||
"read": {
|
||||
"uci": [ "ap_modem" ]
|
||||
},
|
||||
"write": {
|
||||
"uci": [ "ap_modem" ]
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user