mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2025-12-30 16:19:10 +08:00
Compare commits
74 Commits
cwmp_fixes
...
map-config
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
49b4762dc4 | ||
|
|
0eaba859a7 | ||
|
|
7828e67308 | ||
|
|
985ccf339f | ||
|
|
b8f36d23ec | ||
|
|
4f7aeaaec2 | ||
|
|
d976140484 | ||
|
|
747436ce8f | ||
|
|
dde560d314 | ||
|
|
34ec63d1f2 | ||
|
|
d4465d81f7 | ||
|
|
022ec4d6bb | ||
|
|
6c68ff3be7 | ||
|
|
9e1e0eb0df | ||
|
|
63ba56b87e | ||
|
|
53ab41ea2f | ||
|
|
d1477636f9 | ||
|
|
b2e8affb08 | ||
|
|
2dc9b89cd5 | ||
|
|
77acc69dbe | ||
|
|
5ac418113e | ||
|
|
1ba55b753e | ||
|
|
d483abe7d2 | ||
|
|
511d471d54 | ||
|
|
206ecd46db | ||
|
|
f9f31384c2 | ||
|
|
2c4e50ab10 | ||
|
|
ac46849475 | ||
|
|
4db7061884 | ||
|
|
de40d120e2 | ||
|
|
e54e20de45 | ||
|
|
7add2a163d | ||
|
|
499709e2df | ||
|
|
c566d23c78 | ||
|
|
a5c8b7145f | ||
|
|
0419beb911 | ||
|
|
8bb22efe7d | ||
|
|
bff8f75bbb | ||
|
|
be57a189f7 | ||
|
|
9c365459bb | ||
|
|
f4e9f29d3d | ||
|
|
ac56460fec | ||
|
|
cb2077377a | ||
|
|
673dfc8589 | ||
|
|
a287107ee1 | ||
|
|
47396a4e4f | ||
|
|
d82756305c | ||
|
|
5bd754fc9a | ||
|
|
bed5379108 | ||
|
|
d8e5dcf859 | ||
|
|
64f9e23850 | ||
|
|
aaffffdba2 | ||
|
|
0d6980e0ec | ||
|
|
61f454043d | ||
|
|
defe48e4e8 | ||
|
|
4d893499a5 | ||
|
|
e32f2f09be | ||
|
|
183ba5d634 | ||
|
|
809113d4b2 | ||
|
|
927b002aa6 | ||
|
|
c5654ad9ab | ||
|
|
2e3013dc56 | ||
|
|
a7dd783b49 | ||
|
|
d3451b7bd4 | ||
|
|
776860187d | ||
|
|
d2dda88aad | ||
|
|
22871d2410 | ||
|
|
707203b42a | ||
|
|
60fb332fff | ||
|
|
bd0d27ebc9 | ||
|
|
0af83a4892 | ||
|
|
715f58db4d | ||
|
|
cdfa0a7313 | ||
|
|
9b12400c0b |
@@ -5,11 +5,11 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libbbfdm
|
||||
PKG_VERSION:=6.2.6
|
||||
PKG_VERSION:=6.3.6
|
||||
PKG_FIXUP:=autoreconf
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/bbf.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=bbb44b4061ff531b198c11d6117c35631c778d91
|
||||
PKG_SOURCE_VERSION:=b22628c0ddd294bc04f3768e7c1559ab6ad4192f
|
||||
PKG_RELEASE=$(PKG_SOURCE_VERSION)
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
11
dectmngr/Config.in
Normal file
11
dectmngr/Config.in
Normal file
@@ -0,0 +1,11 @@
|
||||
if PACKAGE_dectmngr
|
||||
|
||||
menu "Configuration"
|
||||
|
||||
config ENABLE_LINE_SETTINGS_EXTENSION
|
||||
bool "Enable Line Settings List extension "
|
||||
default y
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
||||
@@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=dectmngr
|
||||
PKG_RELEASE:=3
|
||||
PKG_VERSION:=3.2.1
|
||||
PKG_VERSION:=3.4.0
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/dectmngr.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=8f777088767d3fe4d751ca36e166c96e7f6de4ab
|
||||
PKG_SOURCE_VERSION:=6d85dfeb2e29eb7a05069c11e850195b2d283494
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
@@ -41,6 +41,10 @@ define Package/$(PKG_NAME)/description
|
||||
DECT manager is a daemon that provides UBUS RPC objects and sends UBUS events for communication with the DECT chip.
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/config
|
||||
source "$(SOURCE)/Config.in"
|
||||
endef
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
rsync -av --exclude=.* ~/git/voip/dectmngr/* $(PKG_BUILD_DIR)/
|
||||
@@ -51,6 +55,10 @@ TARGET_CFLAGS += \
|
||||
-Wall \
|
||||
-I$(STAGING_DIR)/usr/include/libxml2
|
||||
|
||||
ifeq ($(CONFIG_ENABLE_LINE_SETTINGS_EXTENSION),y)
|
||||
TARGET_CFLAGS += -DENABLE_LINE_SETTINGS_EXTENSION
|
||||
endif
|
||||
|
||||
define Package/$(PKG_NAME)/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_DIR) $(1)/etc
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
config dect 'global'
|
||||
option log_dect_cmbs '0'
|
||||
option log_dect_cmbs 'syslog'
|
||||
|
||||
@@ -34,24 +34,30 @@ start_service() {
|
||||
rfpi=$(db -q get hw.board.dect_rfpi)
|
||||
[ -n "$rfpi" -a ${#rfpi} -eq 14 ] && opt_ext="$opt_ext -rfpi $rfpi"
|
||||
|
||||
# model_id=$(db -q get hw.board.dect_model_id)
|
||||
# Setting model_id to 0x010203 is a workaround to reduce synchronisation time of some handset
|
||||
# TODO: remove below line and uncomment the line above to get value from db when the problem is solved
|
||||
model_id="01.02.03"
|
||||
[ -n "$model_id" -a ${#model_id} -eq 8 ] && opt_ext="$opt_ext -model $model_id"
|
||||
model_id=$(db -q get hw.board.dect_model_id)
|
||||
[ -n "$model_id" -a ${#model_id} -eq 8 ] || {
|
||||
echo "Invalid hw.board.dect_model_id:$model_id. Set to 30.3B.06"
|
||||
model_id="30.3B.06"
|
||||
}
|
||||
opt_ext="$opt_ext -model $model_id"
|
||||
|
||||
config_load dect
|
||||
config_get_bool log_dect_cmbs global log_dect_cmbs 0
|
||||
config_get log_dect_cmbs global log_dect_cmbs syslog
|
||||
|
||||
procd_open_instance
|
||||
if [ $log_dect_cmbs -eq 0 ]; then
|
||||
if [ "$log_dect_cmbs" = "none" ]; then
|
||||
echo "Starting dectmngr with cmbs logging disabled"
|
||||
procd_set_param command $PROG -comname ttyH0 $opt_ext
|
||||
rm -f $LOG_PATH/*
|
||||
else
|
||||
echo "Starting dectmngr with cmbs logging enabled"
|
||||
elif [ "$log_dect_cmbs" = "file" ]; then
|
||||
echo "Starting dectmngr with cmbs logging enabled to file"
|
||||
procd_set_param command $PROG -comname ttyH0 -log $LOG_PATH/dect-cmbs.log $opt_ext
|
||||
else
|
||||
echo "Starting dectmngr with cmbs logging enabled to syslog"
|
||||
procd_set_param command $PROG -comname ttyH0 -syslog $opt_ext
|
||||
rm -f $LOG_PATH/*
|
||||
fi
|
||||
|
||||
procd_set_param respawn 6 2 3
|
||||
procd_set_param term_timeout 20
|
||||
procd_set_param triggers asterisk
|
||||
@@ -66,13 +72,13 @@ stop_service() {
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
stop_and_wait_dectmngr
|
||||
start
|
||||
ubus call dect reload
|
||||
}
|
||||
|
||||
service_triggers()
|
||||
{
|
||||
procd_add_reload_trigger asterisk dect
|
||||
procd_add_config_trigger "config.change" "asterisk" /etc/init.d/dectmngr restart
|
||||
procd_add_config_trigger "config.change" "dect" /etc/init.d/dectmngr reload
|
||||
}
|
||||
|
||||
boot() {
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=easy-soc-libs
|
||||
PKG_VERSION:=6.4.28
|
||||
PKG_VERSION:=6.4.32
|
||||
PKG_RELEASE:=1
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=a6f80b4c7f3f9f6c8d8785516e83df4f12dcfc1b
|
||||
PKG_SOURCE_VERSION:=88577dd44871eb5d5eafc696b73b1972ada8432a
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/easy-soc-libs.git
|
||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
|
||||
@@ -12,7 +12,7 @@ PKG_VERSION:=1.0
|
||||
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/fdtextract.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=ef46eb3be68ae1216d8699234f237fb2243289f1
|
||||
PKG_SOURCE_VERSION:=7e013f0afa68378d38a6bdc9b0c5a342bd3dd0a5
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
PKG_LICENSE:=GPLv2
|
||||
|
||||
@@ -8,11 +8,11 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=icwmp
|
||||
PKG_VERSION:=8.2.11-2021-11-23
|
||||
PKG_VERSION:=8.2.18
|
||||
PKG_FIXUP:=autoreconf
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/icwmp.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=5401894b4e447aa72d0acf82bd938a04a0330dc5
|
||||
PKG_SOURCE_VERSION:=00e48a59436160b1692f2da3590904bf296f1ab4
|
||||
PKG_RELEASE=$(PKG_SOURCE_VERSION)
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
@@ -82,19 +82,18 @@ define Package/$(PKG_NAME)/install
|
||||
$(INSTALL_DIR) $(1)/etc/icwmpd
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||
$(INSTALL_DIR) $(1)/lib/upgrade/keep.d
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/icwmpd $(1)/usr/sbin/icwmpd
|
||||
$(INSTALL_DATA) ./files/etc/config/cwmp $(1)/etc/config/cwmp
|
||||
$(INSTALL_BIN) ./files/etc/firewall.cwmp $(1)/etc/firewall.cwmp
|
||||
$(INSTALL_BIN) ./files/etc/hotplug.d/iface/99-icwmp $(1)/etc/hotplug.d/iface/99-icwmp
|
||||
$(INSTALL_BIN) ./files/etc/init.d/icwmpd $(1)/etc/init.d/icwmpd
|
||||
$(INSTALL_BIN) ./files/etc/uci-defaults/85-cwmp-set-userid $(1)/etc/uci-defaults/
|
||||
$(INSTALL_BIN) ./files/etc/uci-defaults/90-cwmpfirewall $(1)/etc/uci-defaults/
|
||||
$(INSTALL_BIN) ./files/etc/uci-defaults/95-icwmp-generate-ssl $(1)/etc/uci-defaults/
|
||||
$(INSTALL_DATA) ./files/lib/upgrade/keep.d/icwmp $(1)/lib/upgrade/keep.d/icwmp
|
||||
$(INSTALL_BIN) ./files/etc/icwmpd/update.sh $(1)/etc/icwmpd/update.sh
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(PKG_NAME)))
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
config acs 'acs'
|
||||
option url ''
|
||||
option userid '' #$OUI-$SER
|
||||
option passwd 'iopsys'
|
||||
option periodic_inform_enable 'true'
|
||||
|
||||
@@ -1,128 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions/network.sh
|
||||
|
||||
[ "$ACTION" == "ifup" -o "$ACTION" == "ifupdate" ] || exit 0
|
||||
|
||||
[ -f /etc/config/cwmp ] || exit 0
|
||||
|
||||
handle_icwmp_restart() {
|
||||
[ -f /tmp/switching_mode ] && exit 0
|
||||
[ -f /tmp/wificontrol.txt -a -f /tmp/netmode-conf.pid ] && exit 0
|
||||
|
||||
[ "$INTERFACE" == "loopback" ] && exit 0
|
||||
|
||||
local defwan=$(uci -q get cwmp.cpe.default_wan_interface)
|
||||
[ -n "$defwan" -a "$(uci -q get network.$defwan)" == "interface" -a "$defwan" != "$INTERFACE" ] && exit 0
|
||||
|
||||
local islan="$(uci -q get network.$INTERFACE.is_lan)"
|
||||
[ "$islan" == "1" ] && exit 0
|
||||
|
||||
local proto="$(uci -q get network.$INTERFACE.proto)"
|
||||
[ "$proto" == "none" ] && exit 0
|
||||
|
||||
local ifname="$(uci -q get network.$INTERFACE.ifname)"
|
||||
[ "${ifname:0:1}" == "@" ] && exit 0
|
||||
|
||||
mkdir -p /tmp/ipv4
|
||||
|
||||
network_flush_cache
|
||||
|
||||
local previpaddr=""
|
||||
local curipaddr=""
|
||||
local ipaddrfile=/tmp/ipv4/$INTERFACE-ipaddr
|
||||
previpaddr=$(cat $ipaddrfile 2>/dev/null)
|
||||
network_get_ipaddr curipaddr $INTERFACE
|
||||
[ -n "$curipaddr" ] && echo $curipaddr > $ipaddrfile || rm -f $ipaddrfile
|
||||
|
||||
local prevgateway=""
|
||||
local curgateway=""
|
||||
local gatewayfile=/tmp/ipv4/$INTERFACE-gateway
|
||||
prevgateway=$(cat $gatewayfile 2>/dev/null)
|
||||
network_get_gateway curgateway $INTERFACE
|
||||
[ -n "$curgateway" ] && echo $curgateway > $gatewayfile || rm -f $gatewayfile
|
||||
|
||||
local prevsubnets=""
|
||||
local cursubnets=""
|
||||
local subnetsfile=/tmp/ipv4/$INTERFACE-subnets
|
||||
prevsubnets=$(cat $subnetsfile 2>/dev/null)
|
||||
network_get_subnets cursubnets $INTERFACE
|
||||
[ -n "$cursubnets" ] && echo $cursubnets > $subnetsfile || rm -f $subnetsfile
|
||||
|
||||
local prevdnsservers=""
|
||||
local curdnsservers=""
|
||||
local dnsserverfile=/tmp/ipv4/$INTERFACE-dnsservers
|
||||
prevdnsservers=$(cat $dnsserverfile 2>/dev/null)
|
||||
network_get_dnsserver curdnsservers $INTERFACE
|
||||
[ -n "$curdnsservers" ] && echo $curdnsservers > $dnsserverfile || rm -f $dnsserverfile
|
||||
|
||||
local prevdev=""
|
||||
local curdev=""
|
||||
local devfile=/tmp/ipv4/$INTERFACE-dev
|
||||
prevdev=$(cat $devfile 2>/dev/null)
|
||||
network_get_device curdev $INTERFACE
|
||||
[ -n "$curdev" ] && echo $curdev > $devfile || rm -f $devfile
|
||||
|
||||
if [ ! -f /var/state/cwmp ]
|
||||
then
|
||||
if [ -f /etc/icwmpd/cwmp ]
|
||||
then
|
||||
uci -c /etc/icwmpd delete cwmp.acs
|
||||
uci -c /etc/icwmpd commit cwmp
|
||||
cp /etc/icwmpd/cwmp /var/state/cwmp
|
||||
else
|
||||
touch /var/state/cwmp
|
||||
fi
|
||||
fi
|
||||
|
||||
uci -q -c /var/state/ get cwmp.cpe
|
||||
if [ "$?" -ne 0 ]; then
|
||||
unnamedcpe=`uci -q -c /var/state/ add cwmp cpe`
|
||||
uci -c /var/state/ -q rename cwmp.$unnamedcpe='cpe'
|
||||
fi
|
||||
|
||||
local vendorspecinf=`ubus call network.interface.${defwan} status | jsonfilter -e "@.data.vendorspecinf"`
|
||||
[ -n "$vendorspecinf" ] && {
|
||||
local url=""
|
||||
case $vendorspecinf in
|
||||
http://*|https://*)
|
||||
url="$vendorspecinf"
|
||||
;;
|
||||
*)
|
||||
for optval in $vendorspecinf; do
|
||||
case $optval in
|
||||
1=*)
|
||||
url="$(echo $optval | cut -d"=" -f2-)"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
;;
|
||||
esac
|
||||
[ -n "$url" ] && uci -q set cwmp.acs.dhcp_url="$url"
|
||||
uci commit cwmp
|
||||
}
|
||||
|
||||
local prevopt43url=""
|
||||
local curopt43url=""
|
||||
local opt43urlfile=/tmp/ipv4/$INTERFACE-opt43url
|
||||
prevopt43url=$(cat $opt43urlfile 2>/dev/null)
|
||||
curopt43url="$(uci -c /var/state -q get cwmp.acs.dhcp_url)"
|
||||
[ -n "$curopt43url" ] && echo $curopt43url > $opt43urlfile || rm -f $opt43urlfile
|
||||
|
||||
[ \
|
||||
"$prevdev" == "$curdev" -a \
|
||||
"$previpaddr" = "$curipaddr" -a \
|
||||
"$prevgateway" = "$curgateway" -a \
|
||||
"$prevsubnets" = "$cursubnets" -a \
|
||||
"$prevdnsservers" = "$curdnsservers" \
|
||||
] && {
|
||||
[ "$prevopt43url" = "$curopt43url" ] && exit 0
|
||||
[ -z "$prevopt43url" ] && exit 0
|
||||
}
|
||||
|
||||
echo "Restarting icwmp"|logger -t cwmp.hotplug -p info
|
||||
|
||||
/etc/init.d/icwmpd reload &
|
||||
}
|
||||
|
||||
handle_icwmp_restart
|
||||
42
icwmp/files/etc/icwmpd/update.sh
Normal file
42
icwmp/files/etc/icwmpd/update.sh
Normal file
@@ -0,0 +1,42 @@
|
||||
#!/bin/sh
|
||||
|
||||
log() {
|
||||
echo $@ |logger -t cwmp.update -p info
|
||||
}
|
||||
|
||||
handle_icwmp_update() {
|
||||
local defwan=$(uci -q get cwmp.cpe.default_wan_interface)
|
||||
local vendorspecinf=`ubus call network.interface.${defwan} status | jsonfilter -e "@.data.vendorspecinf"`
|
||||
|
||||
log "Handling dhcp option value ${vendorspecinf}"
|
||||
[ -n "$vendorspecinf" ] && {
|
||||
local url=""
|
||||
local old_url=$(uci -q get cwmp.acs.dhcp_url)
|
||||
|
||||
case $vendorspecinf in
|
||||
http://*|https://*)
|
||||
url="$vendorspecinf"
|
||||
;;
|
||||
*)
|
||||
for optval in $vendorspecinf; do
|
||||
case $optval in
|
||||
1=*)
|
||||
url="$(echo $optval | cut -d"=" -f2-)"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -n "$url" ]; then
|
||||
log "## icwmp url[${old_url}] changed to [${url}]"
|
||||
if [ -z "${old_url}" -o "${url}" != "${old_url}" ]; then
|
||||
log "Restarting icwmp url[${old_url}] changed to [${url}]"
|
||||
uci -q set cwmp.acs.dhcp_url="$url"
|
||||
ubus call uci commit '{"config":"cwmp"}'
|
||||
fi
|
||||
fi
|
||||
}
|
||||
}
|
||||
|
||||
handle_icwmp_update
|
||||
@@ -16,7 +16,7 @@ log() {
|
||||
}
|
||||
|
||||
enable_dhcp_option43() {
|
||||
local wan=$1
|
||||
local wan="${1}"
|
||||
|
||||
### Ask for DHCP Option 43 only if CWMP is enabled ###
|
||||
local reqopts="$(uci -q get network.$wan.reqopts)"
|
||||
@@ -43,25 +43,6 @@ enable_dhcp_option43() {
|
||||
fi
|
||||
}
|
||||
|
||||
wait_for_option43() {
|
||||
local time=$1
|
||||
|
||||
local tm=0
|
||||
|
||||
log "Waiting for discovery of ACS URL from dhcp server ..."
|
||||
while [ $tm -le $time ]
|
||||
do
|
||||
acs_url=`uci -q get cwmp.acs.dhcp_url`
|
||||
if [ "$acs_url" != "" ]
|
||||
then
|
||||
break
|
||||
else
|
||||
sleep 1
|
||||
fi
|
||||
tm=$((tm+1))
|
||||
done
|
||||
}
|
||||
|
||||
wait_for_resolvfile() {
|
||||
local time=$1
|
||||
local tm=1
|
||||
@@ -76,15 +57,27 @@ wait_for_resolvfile() {
|
||||
done
|
||||
}
|
||||
|
||||
set_wan_interface() {
|
||||
local l3_device=""
|
||||
local default_wan_interface=""
|
||||
get_default_wan_interface() {
|
||||
local default_wan_interface
|
||||
|
||||
config_load cwmp
|
||||
config_get default_wan_interface cpe default_wan_interface "wan"
|
||||
json_load "$(ifstatus $default_wan_interface)"
|
||||
|
||||
echo ${default_wan_interface}
|
||||
}
|
||||
|
||||
set_wan_interface() {
|
||||
local wan_interface="${1}"
|
||||
local l3_device=""
|
||||
|
||||
if [ -z "${wan_interface}" ]; then
|
||||
return 0;
|
||||
fi
|
||||
|
||||
json_load "$(ifstatus ${wan_interface})"
|
||||
json_get_var l3_device l3_device
|
||||
if [ "$l3_device" != "" ];then
|
||||
uci -q set cwmp.cpe.interface="$l3_device"
|
||||
if [ -n "$l3_device" ]; then
|
||||
uci -q set cwmp.cpe.interface="${l3_device}"
|
||||
uci -q commit cwmp
|
||||
fi
|
||||
}
|
||||
@@ -101,7 +94,7 @@ copy_cwmp_etc_files_to_varstate() {
|
||||
touch /var/state/cwmp
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
mkdir -p /var/state/icwmpd
|
||||
if [ -f /etc/icwmpd/.icwmpd_backup_session.xml ]
|
||||
then
|
||||
@@ -135,14 +128,15 @@ validate_acs_section()
|
||||
'periodic_inform_enable:bool' \
|
||||
'periodic_inform_interval:uinteger' \
|
||||
'periodic_inform_time:string' \
|
||||
'url:string:http://192.168.1.1' \
|
||||
'url:string' \
|
||||
'dhcp_url:string' \
|
||||
'dhcp_discovery:or("enable", "disable")' \
|
||||
'compression:or("GZIP","Deflate","Disabled")' \
|
||||
'retry_min_wait_interval:range(1, 65535)' \
|
||||
'retry_interval_multiplier:range(1000, 65535)' \
|
||||
'https_ssl_capath:file' \
|
||||
'ipv6_enable:bool'
|
||||
|
||||
|
||||
}
|
||||
|
||||
validate_cpe_section()
|
||||
@@ -166,7 +160,7 @@ validate_cpe_section()
|
||||
'exec_download:bool' \
|
||||
'periodic_notify_enable:bool' \
|
||||
'enable:bool' \
|
||||
'periodic_notify_interval:uinteger'
|
||||
'periodic_notify_interval:uinteger'
|
||||
}
|
||||
|
||||
validate_defaults() {
|
||||
@@ -177,6 +171,11 @@ validate_defaults() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
[ -z "${url}" -a -z "${dhcp_url}" ] && {
|
||||
log "ACS url is empty can't start"
|
||||
return 1;
|
||||
}
|
||||
|
||||
validate_cpe_section || {
|
||||
log "Validation of cpe section failed"
|
||||
return 1;
|
||||
@@ -190,56 +189,44 @@ validate_defaults() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
validate_acs_url() {
|
||||
dhcp_url=`uci -q get cwmp.acs.dhcp_url`
|
||||
[ -z "${url}" -a -z "${dhcp_url}" ] && {
|
||||
log "ACS url is empty"
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
start_service() {
|
||||
enable_cwmp=`uci -q get cwmp.cpe.enable`
|
||||
local enable_cwmp=`uci -q get cwmp.cpe.enable`
|
||||
local wan_interface=$(get_default_wan_interface)
|
||||
local dhcp_discovery=`uci -q get cwmp.acs.dhcp_discovery`
|
||||
|
||||
if [ "$enable_cwmp" = "0" -o "$enable_cwmp" = "false" ]; then
|
||||
log "CWMP is not enabled"
|
||||
return
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Set wan interface if not configured
|
||||
set_wan_interface "${wan_interface}"
|
||||
|
||||
# Set dhcp option 43 if dhcp discovery enabled
|
||||
if [ "${dhcp_discovery}" == "enable" -o "${dhcp_discovery}" == "1" ]; then
|
||||
enable_dhcp_option43 "${wan_interface}"
|
||||
fi
|
||||
|
||||
[ -f /sbin/netifd ] && log "Waiting for Network to be started ..." && ubus -t 5 wait_for network.interface
|
||||
[ -f /usr/sbin/dnsmasq ] && log "Waiting for DNS Proxy to be started ..." && ubus -t 5 wait_for dnsmasq
|
||||
[ -f /etc/config/dhcp ] && log "Waiting for DNS Server(s) ..." && wait_for_resolvfile 20
|
||||
|
||||
log "Waiting for usp.raw to be started"
|
||||
ubus wait_for usp.raw
|
||||
|
||||
|
||||
# Copy backup data so that if it restart latter on it gets the info
|
||||
copy_cwmp_etc_files_to_varstate
|
||||
|
||||
validate_defaults || {
|
||||
log "Validation of defaults failed"
|
||||
return 1;
|
||||
}
|
||||
|
||||
# Set wan interface if not configured
|
||||
set_wan_interface
|
||||
|
||||
# Set dhcp option 43 if dhcp discovery enabled
|
||||
if [ "${dhcp_discovery}" == "enable" -o "${dhcp_discovery}" == "1" ]; then
|
||||
enable_dhcp_option43 $default_wan_interface
|
||||
wait_for_option43 30
|
||||
fi
|
||||
|
||||
validate_acs_url || {
|
||||
log "Validation of ACS URL failed"
|
||||
return 1;
|
||||
}
|
||||
|
||||
copy_cwmp_etc_files_to_varstate
|
||||
|
||||
procd_open_instance icwmp
|
||||
procd_set_param command "$PROG"
|
||||
procd_append_param command -b
|
||||
procd_set_param respawn \
|
||||
${respawn_threshold:-5} \
|
||||
${respawn_timeout:-10} ${respawn_retry:-3}
|
||||
|
||||
|
||||
procd_set_param watch network.interface
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
@@ -249,11 +236,25 @@ stop_service()
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
log "Restarting CWMP client"
|
||||
stop
|
||||
start
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_config_trigger "config.change" "cwmp" /etc/init.d/icwmpd reload
|
||||
procd_add_reload_trigger "cwmp"
|
||||
|
||||
procd_open_trigger
|
||||
json_add_array
|
||||
json_add_string "" "interface.update"
|
||||
json_add_array
|
||||
json_add_array
|
||||
json_add_string "" "run_script"
|
||||
json_add_string "" "/etc/icwmpd/update.sh"
|
||||
json_close_array
|
||||
json_close_array
|
||||
json_add_int "" "2000"
|
||||
json_close_array
|
||||
procd_close_trigger
|
||||
}
|
||||
|
||||
|
||||
@@ -3,12 +3,16 @@
|
||||
. /lib/functions.sh
|
||||
|
||||
regenerate_ssl_link(){
|
||||
[ ! -d "/etc/ssl/certs" ] && return 0;
|
||||
[ ! -f "/etc/ssl/certs/*.pem" ] && return 0;
|
||||
|
||||
local cert_dir="/etc/ssl/certs"
|
||||
local all_file=$(ls $cert_dir/*.pem)
|
||||
|
||||
for cfile in $all_file
|
||||
do
|
||||
ln -s $cfile $cert_dir/$(openssl x509 -hash -noout -in $cfile).0
|
||||
done
|
||||
}
|
||||
|
||||
regenerate_ssl_link
|
||||
regenerate_ssl_link
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=ieee1905
|
||||
PKG_VERSION:=4.0.5
|
||||
PKG_VERSION:=4.1.1
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=67ace7d344e287cd8b1d90003ed487cd021e5223
|
||||
PKG_SOURCE_VERSION:=28dbe8330ba82f131771a0cfd502c41867f0ad83
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/ieee1905.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
@@ -124,6 +124,11 @@ define Build/InstallDev
|
||||
$(call Build/InstallDev/map-plugin,$(1),$(2))
|
||||
endef
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
rsync -r --exclude=.* ~/git/ieee1905/ $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
endif
|
||||
|
||||
$(eval $(call BuildPackage,ieee1905))
|
||||
$(eval $(call BuildPackage,libieee1905))
|
||||
|
||||
@@ -25,6 +25,7 @@ CONFIG_PACKAGE_map-topology=y
|
||||
CONFIG_PACKAGE_mosquitto-client-ssl=y
|
||||
CONFIG_PACKAGE_mosquitto-ssl=y
|
||||
CONFIG_PACKAGE_wfadatad=y
|
||||
CONFIG_PACKAGE_wfadatad-collector=y
|
||||
CONFIG_PACKAGE_imonitor=m
|
||||
CONFIG_PACKAGE_inbd=y
|
||||
CONFIG_PACKAGE_ip-full=y
|
||||
@@ -188,8 +189,6 @@ CONFIG_LIBCURL_CRYPTO_AUTH=y
|
||||
CONFIG_LIBCURL_OPENSSL=y
|
||||
CONFIG_OPENVPN_openssl_ENABLE_IPROUTE2=y
|
||||
# CONFIG_SIGNED_PACKAGES is not set
|
||||
CONFIG_KERNEL_DEVTMPFS=y
|
||||
CONFIG_KERNEL_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_BUSYBOX_CONFIG_IP is not set
|
||||
CONFIG_LOCALMIRROR="https://download.iopsys.eu/iopsys/mirror/"
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=map-agent
|
||||
PKG_VERSION:=6.1.1
|
||||
PKG_VERSION:=6.3.2
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE_VERSION:=11c7b8686a936262d25123a3c1eb822da31078a5
|
||||
PKG_SOURCE_VERSION:=39193fccea6493c57d169611d8f21256753f7a3b
|
||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
||||
|
||||
PKG_LICENSE:=PROPRIETARY IOPSYS
|
||||
@@ -33,10 +33,24 @@ define Package/map-agent
|
||||
+map-plugin
|
||||
endef
|
||||
|
||||
|
||||
define Package/dynbhd
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=Dynamic Backhaul Daemon
|
||||
DEPENDS:=+libwifi +libuci +libubox +ubus +libeasy +libieee1905 +ieee1905 \
|
||||
+map-plugin +map-agent
|
||||
endef
|
||||
|
||||
|
||||
define Package/map-agent/description
|
||||
This package implements EasyMesh R2 compliant WiFi Agent.
|
||||
endef
|
||||
|
||||
define Package/dynbhd/description
|
||||
Dyanmic LAN/WAN port detection and loop avoidance.
|
||||
endef
|
||||
|
||||
define Package/map-agent/config
|
||||
#source "$(SOURCE)/Config.in"
|
||||
endef
|
||||
@@ -56,6 +70,16 @@ define Package/map-agent/install
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/mapagent $(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
define Package/dynbhd/install
|
||||
$(INSTALL_DIR) $(1)/etc
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_DIR) $(1)/lib/wifi/dynbhd
|
||||
$(INSTALL_DIR) $(1)/etc/hotplug.d/ethernet
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/dynbh/dynbhd $(1)/usr/sbin/dynbhd
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/dynbh/api $(1)/lib/wifi/dynbhd/api
|
||||
# $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/dynbh/map-dynamic-backhaul $(1)/etc/hotplug.d/ethernet/map-dynamic-backhaul
|
||||
endef
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
rsync -r --exclude=.* ~/git/map-agent/ $(PKG_BUILD_DIR)/
|
||||
@@ -63,3 +87,4 @@ endef
|
||||
endif
|
||||
|
||||
$(eval $(call BuildPackage,map-agent))
|
||||
$(eval $(call BuildPackage,dynbhd))
|
||||
|
||||
@@ -4,7 +4,7 @@ config agent 'agent'
|
||||
option profile '2'
|
||||
option al_bridge 'br-lan'
|
||||
|
||||
#config fh-iface
|
||||
#config ap
|
||||
# option ifname 'wl0'
|
||||
# option steer 'rssi bssload'
|
||||
# list exclude '00:11:22:33:44:55'
|
||||
@@ -18,7 +18,7 @@ config agent 'agent'
|
||||
# option assoc_ctrl_secs '30'
|
||||
# option band '2'
|
||||
|
||||
#config fh-iface
|
||||
#config ap
|
||||
# option ifname 'wl1'
|
||||
# option steer 'rssi bssload'
|
||||
# list exclude '00:11:22:33:44:55'
|
||||
|
||||
@@ -36,10 +36,10 @@ if [ "$LINK" = "up" ]; then
|
||||
|
||||
config_load "mapagent"
|
||||
bridge=$(uci get mapagent.agent.al_bridge | cut -d '-' -f2)
|
||||
config_foreach remove_from_bridge bk-iface $bridge
|
||||
config_foreach update_bstas bk-iface down
|
||||
config_foreach remove_from_bridge bsta $bridge
|
||||
config_foreach update_bstas bsta down
|
||||
else
|
||||
rm -f /tmp/map.agent.bsta_global_disable
|
||||
config_load "mapagent"
|
||||
config_foreach update_bstas bk-iface up
|
||||
config_foreach update_bstas bsta up
|
||||
fi
|
||||
|
||||
@@ -46,7 +46,19 @@ remove_map() {
|
||||
ubus call network reload
|
||||
}
|
||||
|
||||
start_dynbhd_service() {
|
||||
rm -f /tmp/map.agent.bsta_global_disable
|
||||
procd_open_instance
|
||||
procd_set_param command "/usr/sbin/dynbhd"
|
||||
procd_set_param respawn
|
||||
# procd_set_param stdout 1
|
||||
# procd_set_param stderr 1
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
start_service() {
|
||||
[ -f /usr/sbin/dynbhd ] && start_dynbhd_service
|
||||
|
||||
config_load "mapagent"
|
||||
|
||||
ubus -t 5 wait_for wifi
|
||||
|
||||
@@ -25,12 +25,41 @@ EOF
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
type_to_multi_ap () {
|
||||
type="$1"
|
||||
|
||||
if [ "$type" = "backhaul" ]; then
|
||||
echo "1"
|
||||
return
|
||||
elif [ "$type" = "fronthaul" ]; then
|
||||
echo "2"
|
||||
return
|
||||
elif [ "$type" = "combined" ]; then
|
||||
echo "3"
|
||||
return
|
||||
fi
|
||||
|
||||
echo "0"
|
||||
}
|
||||
|
||||
get_type_by_section() {
|
||||
section="$1"
|
||||
|
||||
config_get type $section type "0"
|
||||
|
||||
echo "$(type_to_multi_ap $type)"
|
||||
}
|
||||
|
||||
brcm_sync_credentials() {
|
||||
bands=""
|
||||
mapagent_process_fh() {
|
||||
local section=$1
|
||||
local dev=$2
|
||||
|
||||
multi_ap=$(get_type_by_section $section)
|
||||
[ "$multi_ap" == "0" ] && return
|
||||
|
||||
config_get device $section device
|
||||
|
||||
[ "$dev" != "$device" ] && return
|
||||
@@ -64,7 +93,7 @@ brcm_sync_credentials() {
|
||||
fi
|
||||
done
|
||||
|
||||
config_foreach mapagent_process_fh fh-iface $device
|
||||
config_foreach mapagent_process_fh ap $device
|
||||
bands="$bands $band"
|
||||
}
|
||||
|
||||
@@ -78,7 +107,7 @@ brcm_sync_credentials() {
|
||||
config_foreach ieee1905_del_ap ap
|
||||
|
||||
config_load mapagent
|
||||
config_foreach mapagent_process_radio wifi-radio
|
||||
config_foreach mapagent_process_radio radio
|
||||
|
||||
uci commit ieee1905
|
||||
}
|
||||
@@ -116,8 +145,10 @@ brcm_write_credentials() {
|
||||
local bk_ssid="$3"
|
||||
local bk_key="$4"
|
||||
|
||||
multi_ap=$(get_type_by_section $section)
|
||||
[ "$multi_ap" == "0" ] && return
|
||||
|
||||
config_get device $section device
|
||||
config_get multi_ap $section multi_ap "0"
|
||||
|
||||
#echo found dev=$dev device=$device map=$multi_ap
|
||||
|
||||
@@ -136,8 +167,10 @@ brcm_write_credentials() {
|
||||
local section=$1
|
||||
local dev=$2
|
||||
|
||||
multi_ap=$(get_type_by_section $section)
|
||||
[ "$multi_ap" == "0" ] && return
|
||||
|
||||
config_get device $section device
|
||||
config_get multi_ap $section multi_ap "0"
|
||||
config_get enabled $section enabled "1"
|
||||
|
||||
#echo found dev=$dev device=$device map=$multi_ap
|
||||
@@ -151,7 +184,7 @@ brcm_write_credentials() {
|
||||
|
||||
#echo found ssid="$ssid" key="$key"
|
||||
|
||||
config_foreach mapagent_find_fbss fh-iface $dev "$ssid" "$key"
|
||||
config_foreach mapagent_find_fbss ap $dev "$ssid" "$key"
|
||||
}
|
||||
|
||||
mapagent_process_radio() {
|
||||
@@ -161,11 +194,11 @@ brcm_write_credentials() {
|
||||
|
||||
#echo found dev=$dev
|
||||
|
||||
config_foreach mapagent_find_bbss fh-iface $device
|
||||
config_foreach mapagent_find_bbss ap $device
|
||||
}
|
||||
|
||||
|
||||
config_foreach mapagent_process_radio wifi-radio
|
||||
config_foreach mapagent_process_radio radio
|
||||
|
||||
uci commit wireless
|
||||
}
|
||||
@@ -237,7 +270,7 @@ write_bsta_config() {
|
||||
}
|
||||
|
||||
|
||||
config_foreach mapagent_process_bk bk-iface $ifname
|
||||
config_foreach mapagent_process_bk bsta $ifname
|
||||
|
||||
#echo result diff = $diff > /dev/console
|
||||
[ "$diff" == "1" ] && {
|
||||
@@ -277,6 +310,9 @@ brcm_teardown_iface() {
|
||||
local section=$1
|
||||
local iface=$2
|
||||
|
||||
multi_ap=$(get_type_by_section $section)
|
||||
[ "$multi_ap" == "0" ] && return
|
||||
|
||||
config_get ifname $section ifname
|
||||
|
||||
[ "$iface" != "$ifname" ] && return
|
||||
@@ -291,7 +327,7 @@ brcm_teardown_iface() {
|
||||
}
|
||||
|
||||
|
||||
config_foreach mapagent_teardown_bss fh-iface $iface
|
||||
config_foreach mapagent_teardown_bss ap $iface
|
||||
|
||||
uci commit wireless
|
||||
uci commit mapagent
|
||||
@@ -316,7 +352,7 @@ brcm_bsta_to_wireless() {
|
||||
local sec=""
|
||||
local prio="-1"
|
||||
|
||||
config_foreach mapagent_process_bk bk-iface
|
||||
config_foreach mapagent_process_bk bsta
|
||||
echo $sec
|
||||
}
|
||||
|
||||
@@ -389,7 +425,7 @@ brcm_bsta_to_wireless() {
|
||||
config_get enabled $1 enabled "0"
|
||||
|
||||
if [ "$onboarded" = "0" ]; then
|
||||
config_foreach mapagent_find_other_creds bk-iface $ifname $band $enabled
|
||||
config_foreach mapagent_find_other_creds bsta $ifname $band $enabled
|
||||
else
|
||||
config_get ssid $1 ssid
|
||||
config_get key $1 key
|
||||
@@ -408,11 +444,11 @@ brcm_bsta_to_wireless() {
|
||||
# sec=""
|
||||
# prio=""
|
||||
#
|
||||
# config_foreach mapagent_enable_best bk-iface $best
|
||||
# config_foreach mapagent_enable_best bsta $best
|
||||
# uci commit mapagent
|
||||
config_load mapagent
|
||||
|
||||
diff=$(config_foreach mapagent_bsta_to_wireless bk-iface)
|
||||
diff=$(config_foreach mapagent_bsta_to_wireless bsta)
|
||||
|
||||
# [ "$diff" != "" ] && {
|
||||
ubus call uci commit '{"config":"wireless"}'
|
||||
@@ -524,7 +560,7 @@ bsta_scan_on_enabled() {
|
||||
wpa_cli -i "$ifname" save_config > /dev/null 2>&1
|
||||
}
|
||||
|
||||
config_foreach mapagent_enable_bk bk-iface
|
||||
config_foreach mapagent_enable_bk bsta
|
||||
}
|
||||
|
||||
bsta_enable_all() {
|
||||
@@ -535,7 +571,7 @@ bsta_enable_all() {
|
||||
|
||||
config_load mapagent
|
||||
|
||||
config_foreach mapagent_enable_bk bk-iface
|
||||
config_foreach mapagent_enable_bk bsta
|
||||
uci commit mapagent
|
||||
bsta_scan_on_enabled
|
||||
}
|
||||
@@ -594,10 +630,10 @@ bsta_disable_lower_priority() {
|
||||
|
||||
local bsta=$1
|
||||
|
||||
prio=$(config_foreach mapagent_get_priority bk-iface $bsta)
|
||||
prio=$(config_foreach mapagent_get_priority bsta $bsta)
|
||||
#echo bsta $bsta has prio $prio > /dev/console
|
||||
|
||||
config_foreach mapagent_disable_lower_bk bk-iface $bsta $prio
|
||||
config_foreach mapagent_disable_lower_bk bsta $bsta $prio
|
||||
uci commit mapagent
|
||||
|
||||
# ubus call uci commit '{"config":"wireless"}'
|
||||
@@ -622,7 +658,7 @@ bsta_use_link() {
|
||||
|
||||
local bsta=$1
|
||||
|
||||
config_foreach mapagent_disable_bk bk-iface $bsta
|
||||
config_foreach mapagent_disable_bk bsta $bsta
|
||||
}
|
||||
|
||||
bsta_swap_to_link() {
|
||||
|
||||
@@ -5,17 +5,20 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=map-controller
|
||||
PKG_VERSION:=5.1.1
|
||||
PKG_VERSION:=5.2.2
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||
PKG_SOURCE_VERSION:=234cff05ee7987f50e3d5e76d920f59f9c680212
|
||||
PKG_SOURCE_VERSION:=827cb6e25e7428c7d7c4ed07dd0e018d2f727abc
|
||||
|
||||
PKG_LICENSE:=PROPRIETARY IOPSYS
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/map-controller
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
endif
|
||||
|
||||
|
||||
PKG_BUILD_DEPENDS:=map-plugin
|
||||
@@ -51,4 +54,10 @@ define Package/map-controller/install
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/mapcontroller $(1)/usr/sbin/
|
||||
endef
|
||||
|
||||
ifeq ($(LOCAL_DEV),1)
|
||||
define Build/Prepare
|
||||
rsync -r --exclude=.* ~/git/map-controller/ $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
endif
|
||||
|
||||
$(eval $(call BuildPackage,map-controller))
|
||||
|
||||
@@ -6,11 +6,11 @@ include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=map-topology
|
||||
PKG_VERSION:=3.0.4
|
||||
PKG_VERSION:=3.1.0
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_VERSION:=5763d405ed896140f5ca5ed9073b98d4bb728b14
|
||||
PKG_SOURCE_VERSION:=b7556dcfb023acccbfd293f14ff036814bf25daf
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/map-topology.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=obuspa
|
||||
PKG_VERSION:=4.1.0.11
|
||||
PKG_VERSION:=4.1.0.16
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=a52205791ef71cb54fa468064075ff85c7f5a638
|
||||
PKG_SOURCE_VERSION:=9db79a21298becd2c6a133abad3063f532fc281b
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/fork/obuspa.git
|
||||
PKG_MAINTAINER:=Vivek Dutta <vivek.dutta@iopsys.eu>
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
@@ -81,13 +81,11 @@ define Package/obuspa/install
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_DIR) $(1)/etc/config
|
||||
$(INSTALL_DIR) $(1)/etc/obuspa
|
||||
$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/obuspa $(1)/usr/sbin/
|
||||
$(INSTALL_BIN) ./files/etc/init.d/obuspa $(1)/etc/init.d/
|
||||
$(INSTALL_DATA) ./files/etc/config/obuspa $(1)/etc/config/
|
||||
$(INSTALL_DATA) ./files/etc/obuspa/roles.json $(1)/etc/obuspa/roles.json
|
||||
$(INSTALL_DATA) ./files/etc/obuspa/dmcaching_exclude.json $(1)/etc/obuspa/dmcaching_exclude.json
|
||||
$(INSTALL_BIN) ./files/etc/hotplug.d/iface/85-obuspa $(1)/etc/hotplug.d/iface/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,obuspa))
|
||||
|
||||
@@ -4,6 +4,7 @@ config obuspa 'global'
|
||||
#option ifname 'lo'
|
||||
option debug '1'
|
||||
option log_level '1'
|
||||
option prototrace '0'
|
||||
#option db_file '/etc/obuspa/usp.db'
|
||||
#option role_file '/etc/obuspa/roles.json'
|
||||
option dm_caching_exclude '/etc/obuspa/dmcaching_exclude.json'
|
||||
@@ -46,7 +47,7 @@ config subscription
|
||||
# option Description 'Request to get Administrative access'
|
||||
# option role_name 'full_access'
|
||||
# option Enable '1'
|
||||
# option Value 'admin'
|
||||
# option Value 'YWRtaW4='
|
||||
# option Retries 2
|
||||
# option LockoutPeriod 60
|
||||
|
||||
@@ -54,6 +55,6 @@ config subscription
|
||||
# option Description 'Request to get User access'
|
||||
# option role_name 'user'
|
||||
# option Enable '1'
|
||||
# option Value 'user'
|
||||
# option Value 'dXNlcg=='
|
||||
# option Retries 3
|
||||
# option LockoutPeriod 30
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ "$(uci -q get obuspa.global.interface)" == "$INTERFACE" ] || exit 0
|
||||
|
||||
[ "$ACTION" = ifup -o "$ACTION" = ifupdate ] || exit 0
|
||||
[ "$ACTION" = ifupdate -a -z "$IFUPDATE_ADDRESSES" ] && exit 0
|
||||
|
||||
echo "Restarting obuspa bcz ${ACTION} and ${IFUPDATE_ADDRESSES} change"|logger -t obuspa.hotplug -p debug
|
||||
|
||||
/etc/init.d/obuspa reload
|
||||
|
||||
@@ -67,7 +67,7 @@ get_role_index_from_json() {
|
||||
local num=0
|
||||
|
||||
# In case of role is empty or file not present
|
||||
if [ -z "${role}" -o ! -f ${role_def_file} ]; then
|
||||
if [ -z "${role}" -o ! -f "${role_def_file}" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
@@ -98,7 +98,7 @@ get_role_index_from_json() {
|
||||
get_uci_ref_index() {
|
||||
local val;
|
||||
|
||||
[ -f ${USP_TEMP_FILE} ] && rm -f ${USP_TEMP_FILE}
|
||||
[ -f "${USP_TEMP_FILE}" ] && rm -f ${USP_TEMP_FILE}
|
||||
|
||||
index=0
|
||||
config_load $CONFIGURATION
|
||||
@@ -123,6 +123,7 @@ validate_obuspa_section()
|
||||
'interface:string' \
|
||||
'ifname:string:br-lan' \
|
||||
'debug:bool:false' \
|
||||
'prototrace:bool:false' \
|
||||
'log_level:uinteger' \
|
||||
'log_dest:string' \
|
||||
'db_file:string' \
|
||||
@@ -222,13 +223,30 @@ validate_mqtt_client_section()
|
||||
'ConnectRetryMaxInterval:uinteger:60'
|
||||
}
|
||||
|
||||
get_oui_from_hw() {
|
||||
local oui=$(uci -q get cwmp.cpe.manufacturer_oui)
|
||||
|
||||
if [ -z "${oui}" ]; then
|
||||
oui="$(db get device.deviceinfo.ManufacturerOUI)"
|
||||
fi
|
||||
|
||||
echo "${oui}"
|
||||
}
|
||||
|
||||
get_serial_from_hw() {
|
||||
local serial="$(db get hw.board.serial_number)"
|
||||
|
||||
# this can encoded further
|
||||
echo "${serial}"
|
||||
}
|
||||
|
||||
publish_endpoint() {
|
||||
local AgentEndpointID serial oui user pass
|
||||
local opt=""
|
||||
|
||||
# return if mosquitto_pub is not present
|
||||
if ! which mosquitto_pub; then
|
||||
log "mosquitto_pub not present can't publish endpointid"
|
||||
if [ ! "$(which mosquitto_pub)" ]; then
|
||||
log "mosquitto_pub not present can't publish EndpointID"
|
||||
return 0;
|
||||
fi
|
||||
|
||||
@@ -236,8 +254,8 @@ publish_endpoint() {
|
||||
config_load obuspa
|
||||
config_get AgentEndpointID localagent EndpointID ""
|
||||
if [ -z "${AgentEndpointID}" ]; then
|
||||
serial=$(ubus -t 1 call usp.raw get '{"path":"Device.DeviceInfo.SerialNumber"}'|jsonfilter -e '@["parameters"][0].value')
|
||||
oui=$(ubus -t 1 call usp.raw get '{"path":"Device.DeviceInfo.ManufacturerOUI"}'|jsonfilter -e '@["parameters"][0].value')
|
||||
serial=$(get_serial_from_hw)
|
||||
oui=$(get_oui_from_hw)
|
||||
AgentEndpointID="os::${oui}-${serial}"
|
||||
fi
|
||||
|
||||
@@ -250,8 +268,8 @@ publish_endpoint() {
|
||||
opt="${opt} -P ${pass}"
|
||||
fi
|
||||
|
||||
# publish Agent's EndpointID in mosquito broker for discovery
|
||||
# This is a work around till obuspa does not support advertising
|
||||
# publish Agent's EndpointID in mosquito broker for discovery by usp-js
|
||||
# This is a work around till obuspa adds supports for mDNS discovery
|
||||
log "Publishing EndpointID ${AgentEndpointID} to local mqtt broker"
|
||||
mosquitto_pub -r -t "obuspa/EndpointID" -m "${AgentEndpointID}" ${opt}
|
||||
}
|
||||
@@ -291,17 +309,17 @@ configure_controller() {
|
||||
return 1;
|
||||
fi
|
||||
|
||||
if [ -z ${Reference} ]; then
|
||||
if [ ${Protocol} = "STOMP" ]; then
|
||||
if [ -z "${Reference}" ]; then
|
||||
if [ "${Protocol}" = "STOMP" ]; then
|
||||
val=$(get_uci_ref_index stomp ${stomp})
|
||||
if [ ${val} -eq 0 ]; then
|
||||
if [ "${val}" -eq 0 ]; then
|
||||
log "Not able to find the referred stomp section"
|
||||
return 1;
|
||||
fi
|
||||
Reference="Device.STOMP.Connection.${val}"
|
||||
elif [ ${Protocol} = "MQTT" ]; then
|
||||
elif [ "${Protocol}" = "MQTT" ]; then
|
||||
val=$(get_uci_ref_index mqtt ${mqtt})
|
||||
if [ ${val} -eq 0 ]; then
|
||||
if [ "${val}" -eq 0 ]; then
|
||||
log "Not able to find the referred mqtt section"
|
||||
return 1;
|
||||
fi
|
||||
@@ -378,9 +396,9 @@ configure_subscription(){
|
||||
log "No recipient for subscription"
|
||||
fi
|
||||
|
||||
if [ -z ${Recipient} ]; then
|
||||
if [ -z "${Recipient}" ]; then
|
||||
val=$(get_uci_ref_index controller ${controller})
|
||||
if [ ${val} -eq 0 ]; then
|
||||
if [ "${val}" -eq 0 ]; then
|
||||
log "Not able to find the referred controller section"
|
||||
return 1;
|
||||
fi
|
||||
@@ -414,9 +432,9 @@ validate_challenge_section()
|
||||
check_json_load()
|
||||
{
|
||||
local ret=0
|
||||
if [ -f ${role_def_file} ]; then
|
||||
if [ -f "${role_def_file}" ]; then
|
||||
json_init
|
||||
json_load_file ${role_def_file} 2>&1 |grep -q Failed
|
||||
json_load_file "${role_def_file}" 2>&1 |grep -q Failed
|
||||
if [ $? -eq 0 ]; then # In case of invalid json file
|
||||
log "failed to load [${role_def_file}]"
|
||||
ret=1
|
||||
@@ -460,7 +478,7 @@ configure_challenges() {
|
||||
exit 1;
|
||||
}
|
||||
|
||||
if [ -z "${role_name}" -a -z ${Role} ]; then
|
||||
if [ -z "${role_name}" -a -z "${Role}" ]; then
|
||||
log "Either role_name or Role must defined for a challenge";
|
||||
return 1;
|
||||
fi
|
||||
@@ -496,17 +514,17 @@ configure_mtp() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if [ -z ${Reference} ]; then
|
||||
if [ ${Protocol} = "STOMP" ]; then
|
||||
if [ -z "${Reference}" ]; then
|
||||
if [ "${Protocol}" = "STOMP" ]; then
|
||||
val=$(get_uci_ref_index stomp ${stomp})
|
||||
if [ ${val} -eq 0 ]; then
|
||||
if [ "${val}" -eq 0 ]; then
|
||||
log "Referred stomp section not found"
|
||||
return 1;
|
||||
fi
|
||||
Reference="Device.STOMP.Connection.${val}"
|
||||
elif [ ${Protocol} = "MQTT" ]; then
|
||||
elif [ "${Protocol}" = "MQTT" ]; then
|
||||
val=$(get_uci_ref_index mqtt ${mqtt})
|
||||
if [ ${val} -eq 0 ]; then
|
||||
if [ "${val}" -eq 0 ]; then
|
||||
log "Referred mqtt section not found"
|
||||
return 1;
|
||||
fi
|
||||
@@ -602,7 +620,7 @@ configure_mqtt_client(){
|
||||
|
||||
|
||||
configure_obuspa() {
|
||||
local enabled trust_cert ifname interface debug log_level db_file log_dest role_file
|
||||
local enabled trust_cert ifname interface debug prototrace log_level db_file log_dest role_file
|
||||
|
||||
validate_obuspa_section "global" || {
|
||||
log "Validation of global section failed"
|
||||
@@ -611,15 +629,18 @@ configure_obuspa() {
|
||||
|
||||
role_def_file="${role_file}"
|
||||
|
||||
if [ ${debug} -eq 1 ]; then
|
||||
if [ "${debug}" -eq 1 ]; then
|
||||
# Forward stdout of the command to logd
|
||||
procd_set_param stdout 1
|
||||
# Same for stderr
|
||||
procd_set_param stderr 1
|
||||
fi
|
||||
|
||||
if [ "${debug}" -eq 1 -a "${prototrace}" -eq 1 ]; then
|
||||
procd_append_param command -p
|
||||
fi
|
||||
|
||||
if [ -n ${log_level} ]; then
|
||||
if [ "${debug}" -eq 1 -a -n "${log_level}" ]; then
|
||||
procd_append_param command -v ${log_level}
|
||||
fi
|
||||
|
||||
@@ -629,7 +650,6 @@ configure_obuspa() {
|
||||
|
||||
if [ -n "${interface}" ]; then
|
||||
network_get_physdev ifname ${interface}
|
||||
log "ifname from ${interface} is ${ifname}"
|
||||
fi
|
||||
|
||||
# Set this variable for root user and obuspa -c tool
|
||||
@@ -685,7 +705,6 @@ db_init() {
|
||||
}
|
||||
|
||||
service_running() {
|
||||
ubus wait_for usp.raw
|
||||
publish_endpoint
|
||||
}
|
||||
|
||||
@@ -700,8 +719,6 @@ start_service() {
|
||||
return 0;
|
||||
fi
|
||||
|
||||
ubus wait_for usp.raw
|
||||
|
||||
procd_open_instance ${CONFIGURATION}
|
||||
procd_set_param command ${PROG}
|
||||
db_init
|
||||
@@ -726,8 +743,8 @@ stop_service() {
|
||||
db_file="/tmp/usp.db"
|
||||
fi
|
||||
|
||||
[ -f ${db_file} ] && rm -f ${db_file}
|
||||
[ -f ${PARAM_FILE} ] && rm -f ${PARAM_FILE}
|
||||
[ -f "${db_file}" ] && rm -f ${db_file}
|
||||
[ -f "${PARAM_FILE}" ] && rm -f ${PARAM_FILE}
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=periodicstats
|
||||
PKG_VERSION:=1.0.4
|
||||
PKG_VERSION:=1.0.5
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=17a22d2a74f0ab2af6cec17b9b51ad5aac6fdd48
|
||||
PKG_SOURCE_VERSION:=26d65740dad0fd4e295a1bd88cd059b2bfaaf5af
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/periodicstats.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
@@ -4,26 +4,23 @@ START=99
|
||||
STOP=10
|
||||
|
||||
USE_PROCD=1
|
||||
NAME=periodicstatsd
|
||||
PROG=/usr/sbin/periodicstatsd
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
start_service() {
|
||||
ubus wait_for usp
|
||||
if [ -f "/etc/config/periodicstats" ]; then
|
||||
if [ "$(uci -q get periodicstats.globals.enable)" == "1" ]; then
|
||||
procd_open_instance periodicstatsd
|
||||
procd_set_param command ${PROG}
|
||||
procd_set_param respawn
|
||||
procd_close_instance
|
||||
fi
|
||||
fi
|
||||
service_running() {
|
||||
ubus -t 10 wait_for usp.raw
|
||||
}
|
||||
|
||||
stop() {
|
||||
#stop_service() is called after procd killed the service
|
||||
echo ;
|
||||
start_service() {
|
||||
enable=$(uci -q get periodicstats.globals.enable)
|
||||
|
||||
if [ "$(enable)" != "1" ]; then
|
||||
return 0;
|
||||
fi
|
||||
|
||||
procd_open_instance periodicstatsd
|
||||
procd_set_param command ${PROG}
|
||||
procd_set_param respawn
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
|
||||
55
quickjs-websocket/Makefile
Normal file
55
quickjs-websocket/Makefile
Normal file
@@ -0,0 +1,55 @@
|
||||
#
|
||||
# Copyright (c) 2020 Genexis B.V.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation
|
||||
# files (the "Software"), to deal in the Software without
|
||||
# restriction, including without limitation the rights to use, copy,
|
||||
# modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
# of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=quickjs-websocket
|
||||
PKG_LICENSE:=MIT
|
||||
PKG_VERSION:=1
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/quickjs-websocket
|
||||
SECTION:=libs
|
||||
CATEGORY:=Libraries
|
||||
TITLE:=WebSocket API for QuickJS
|
||||
MAINTAINER:=Erik Karlsson <erik.karlsson@genexis.eu>
|
||||
DEPENDS:=+quickjs +libwebsockets
|
||||
endef
|
||||
|
||||
define Package/quickjs-websocket/description
|
||||
Implementation of the W3C WebSocket API in QuickJS on top of the
|
||||
libwebsockets C library.
|
||||
endef
|
||||
|
||||
define Package/quickjs-websocket/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/quickjs
|
||||
$(CP) $(PKG_BUILD_DIR)/lws-client.so $(1)/usr/lib/quickjs/
|
||||
$(CP) $(PKG_BUILD_DIR)/websocket.js $(1)/usr/lib/quickjs/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,quickjs-websocket))
|
||||
23
quickjs-websocket/README
Executable file
23
quickjs-websocket/README
Executable file
@@ -0,0 +1,23 @@
|
||||
WebSocket API for QuickJS
|
||||
===============
|
||||
|
||||
Introduction
|
||||
------------
|
||||
This is an implementation of the W3C WebSocket API for the QuickJS
|
||||
JavaScript engine on top of the libwebsockets C library.
|
||||
|
||||
Usage
|
||||
------------
|
||||
import { WebSocket } from '/usr/lib/quickjs/websocket.js'
|
||||
|
||||
const w = new WebSocket('wss://example.com/', ['protocol1', 'protocol2'])
|
||||
|
||||
globalThis.WebSocket = WebSocket // To make the API available globally
|
||||
|
||||
Limitations
|
||||
------------
|
||||
Events emitted by WebSocket objects do not implement the full DOM
|
||||
event specification. Only a subset of properties is available. The
|
||||
EventTarget interface, i.e. addEventListener/removeEventListener, is
|
||||
unimplemented. The onopen/onerror/onclose/onmesseage handlers have to
|
||||
be used instead.
|
||||
38
quickjs-websocket/src/Makefile
Normal file
38
quickjs-websocket/src/Makefile
Normal file
@@ -0,0 +1,38 @@
|
||||
#
|
||||
# Copyright (c) 2020 Genexis B.V.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation
|
||||
# files (the "Software"), to deal in the Software without
|
||||
# restriction, including without limitation the rights to use, copy,
|
||||
# modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
# of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
|
||||
TARGETS = lws-client.so
|
||||
|
||||
CFLAGS += -Os -Wall -Werror
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
%.pic.o: %.c
|
||||
$(CC) $(CFLAGS) -fPIC -c -o $@ $<
|
||||
|
||||
lws-client.so: lws-client.pic.o
|
||||
$(CC) $(LDFLAGS) -shared -o $@ $^ -lwebsockets
|
||||
|
||||
clean:
|
||||
rm -f *.o $(TARGETS)
|
||||
958
quickjs-websocket/src/lws-client.c
Normal file
958
quickjs-websocket/src/lws-client.c
Normal file
@@ -0,0 +1,958 @@
|
||||
/*
|
||||
* Copyright (c) 2020 Genexis B.V.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <quickjs/quickjs.h>
|
||||
#include <quickjs/quickjs-libc.h>
|
||||
#include <libwebsockets.h>
|
||||
|
||||
#define countof(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
#define CDEF(name) JS_PROP_INT32_DEF(#name, name, JS_PROP_CONFIGURABLE)
|
||||
|
||||
#if LWS_LIBRARY_VERSION_NUMBER < 3002000
|
||||
#define MAX_WAIT 1000
|
||||
#else
|
||||
#define MAX_WAIT INT32_MAX
|
||||
#ifndef LWS_WITH_EXTERNAL_POLL
|
||||
#error "LWS_WITH_EXTERNAL_POLL is needed for LWS versions >= 3.2.0"
|
||||
#endif
|
||||
#if LWS_LIBRARY_VERSION_NUMBER < 4001002
|
||||
#error "External poll is broken for 3.2.0 <= LWS version < 4.1.2"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define WSI_DATA_USE_OBJECT (1 << 0)
|
||||
#define WSI_DATA_USE_LINKED (1 << 1)
|
||||
|
||||
typedef struct js_lws_wsi_data {
|
||||
struct js_lws_wsi_data *next;
|
||||
struct lws *wsi;
|
||||
JSValue object;
|
||||
JSValue context;
|
||||
JSValue user;
|
||||
uint8_t in_use;
|
||||
} js_lws_wsi_data_t;
|
||||
|
||||
typedef struct {
|
||||
struct lws_context *context;
|
||||
JSContext *ctx;
|
||||
JSValue callback;
|
||||
js_lws_wsi_data_t *wsi_list;
|
||||
} js_lws_context_data_t;
|
||||
|
||||
static JSClassID js_lws_context_class_id;
|
||||
static JSClassID js_lws_wsi_class_id;
|
||||
|
||||
static void free_wsi_data_rt(JSRuntime *rt, js_lws_wsi_data_t *data)
|
||||
{
|
||||
JS_FreeValueRT(rt, data->object);
|
||||
JS_FreeValueRT(rt, data->context);
|
||||
JS_FreeValueRT(rt, data->user);
|
||||
js_free_rt(rt, data);
|
||||
}
|
||||
|
||||
static void unlink_wsi_rt(JSRuntime *rt, js_lws_context_data_t *data,
|
||||
js_lws_wsi_data_t *wsi_data)
|
||||
{
|
||||
js_lws_wsi_data_t **p;
|
||||
for (p = &data->wsi_list; *p; p = &(*p)->next) {
|
||||
if (*p == wsi_data) {
|
||||
*p = (*p)->next;
|
||||
break;
|
||||
}
|
||||
}
|
||||
wsi_data->next = NULL;
|
||||
wsi_data->wsi = NULL;
|
||||
JS_FreeValueRT(rt, wsi_data->object);
|
||||
wsi_data->object = JS_UNDEFINED;
|
||||
wsi_data->in_use &= ~WSI_DATA_USE_LINKED;
|
||||
if (wsi_data->in_use == 0)
|
||||
free_wsi_data_rt(rt, wsi_data);
|
||||
}
|
||||
|
||||
static void unlink_wsi(JSContext *ctx, js_lws_context_data_t *data,
|
||||
js_lws_wsi_data_t *wsi_data)
|
||||
{
|
||||
unlink_wsi_rt(JS_GetRuntime(ctx), data, wsi_data);
|
||||
}
|
||||
|
||||
static JSValue convert_pollargs(JSContext *ctx, const struct lws_pollargs *pa)
|
||||
{
|
||||
JSValue obj;
|
||||
|
||||
if (pa == NULL)
|
||||
return JS_NULL;
|
||||
|
||||
obj = JS_NewObject(ctx);
|
||||
if (JS_IsException(obj))
|
||||
return obj;
|
||||
|
||||
if (JS_SetPropertyStr(ctx, obj, "fd", JS_NewInt32(ctx, pa->fd)) < 0
|
||||
|| JS_SetPropertyStr(ctx, obj, "events",
|
||||
JS_NewInt32(ctx, pa->events)) < 0
|
||||
|| JS_SetPropertyStr(ctx, obj, "prev_events",
|
||||
JS_NewInt32(ctx, pa->prev_events)) < 0) {
|
||||
JS_FreeValue(ctx, obj);
|
||||
return JS_EXCEPTION;
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
static JSValue convert_close_payload(JSContext *ctx,
|
||||
uint8_t *payload, size_t len)
|
||||
{
|
||||
JSValue array;
|
||||
uint16_t status;
|
||||
JSValue reason;
|
||||
|
||||
if (payload == NULL || len < 2)
|
||||
return JS_NULL;
|
||||
|
||||
array = JS_NewArray(ctx);
|
||||
if (JS_IsException(array))
|
||||
return array;
|
||||
|
||||
status = (payload[0] << 8) | payload[1];
|
||||
if (JS_SetPropertyUint32(ctx, array, 0, JS_NewInt32(ctx, status)) < 0) {
|
||||
JS_FreeValue(ctx, array);
|
||||
return JS_EXCEPTION;
|
||||
}
|
||||
|
||||
reason = JS_NewStringLen(ctx, (const char *)(payload + 2), len - 2);
|
||||
if (JS_IsException(reason)
|
||||
|| JS_SetPropertyUint32(ctx, array, 1, reason) < 0) {
|
||||
JS_FreeValue(ctx, array);
|
||||
return JS_EXCEPTION;
|
||||
}
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
static int client_callback(struct lws *wsi, enum lws_callback_reasons reason,
|
||||
void *user, void *in, size_t len)
|
||||
{
|
||||
js_lws_context_data_t *data = lws_context_user(lws_get_context(wsi));
|
||||
js_lws_wsi_data_t *wsi_data = lws_wsi_user(wsi);
|
||||
JSContext *ctx;
|
||||
JSValue args[3];
|
||||
JSValue ret;
|
||||
int32_t ret_int;
|
||||
int i;
|
||||
|
||||
if (data == NULL || data->ctx == NULL || JS_IsUndefined(data->callback))
|
||||
return 0;
|
||||
|
||||
ctx = data->ctx;
|
||||
args[0] = wsi_data ? JS_DupValue(ctx, wsi_data->object) : JS_NULL;
|
||||
args[1] = JS_NewInt32(ctx, reason);
|
||||
args[2] = JS_NULL;
|
||||
|
||||
switch (reason) {
|
||||
case LWS_CALLBACK_ADD_POLL_FD:
|
||||
case LWS_CALLBACK_DEL_POLL_FD:
|
||||
case LWS_CALLBACK_CHANGE_MODE_POLL_FD:
|
||||
args[2] = convert_pollargs(ctx, in);
|
||||
break;
|
||||
case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
|
||||
if (in)
|
||||
args[2] = JS_NewStringLen(ctx, in, len);
|
||||
break;
|
||||
case LWS_CALLBACK_WS_PEER_INITIATED_CLOSE:
|
||||
args[2] = convert_close_payload(ctx, in, len);
|
||||
break;
|
||||
case LWS_CALLBACK_RECEIVE:
|
||||
case LWS_CALLBACK_CLIENT_RECEIVE:
|
||||
if (in)
|
||||
args[2] = JS_NewArrayBufferCopy(ctx, in, len);
|
||||
break;
|
||||
case LWS_CALLBACK_WSI_DESTROY:
|
||||
if (wsi_data)
|
||||
unlink_wsi(ctx, data, wsi_data);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (JS_IsException(args[2]))
|
||||
ret = JS_EXCEPTION;
|
||||
else
|
||||
ret = JS_Call(ctx, data->callback, JS_UNDEFINED, countof(args), args);
|
||||
|
||||
if (JS_IsException(ret) || JS_ToInt32(ctx, &ret_int, ret) < 0) {
|
||||
js_std_dump_error(ctx);
|
||||
ret_int = -1;
|
||||
}
|
||||
|
||||
JS_FreeValue(ctx, ret);
|
||||
for (i = 0; i < countof(args); i++) {
|
||||
JS_FreeValue(ctx, args[i]);
|
||||
}
|
||||
|
||||
return ret_int;
|
||||
}
|
||||
|
||||
static const struct lws_protocols client_protocols[] = {
|
||||
{ "lws-client", client_callback, 0, 0, 0, NULL, 0 },
|
||||
{ NULL, NULL, 0, 0, 0, NULL, 0 }
|
||||
};
|
||||
|
||||
static JSValue js_decode_utf8(JSContext *ctx, JSValueConst this_val,
|
||||
int argc, JSValueConst *argv)
|
||||
{
|
||||
size_t size;
|
||||
uint8_t *ptr = JS_GetArrayBuffer(ctx, &size, argv[0]);
|
||||
if (ptr == NULL)
|
||||
return JS_EXCEPTION;
|
||||
return JS_NewStringLen(ctx, (const char *)ptr, size);
|
||||
}
|
||||
|
||||
static JSValue js_lws_set_log_level(JSContext *ctx, JSValueConst this_val,
|
||||
int argc, JSValueConst *argv)
|
||||
{
|
||||
int32_t level;
|
||||
if (JS_ToInt32(ctx, &level, argv[0]) < 0)
|
||||
return JS_EXCEPTION;
|
||||
lws_set_log_level(level, NULL);
|
||||
return JS_UNDEFINED;
|
||||
}
|
||||
|
||||
static JSValue js_lws_create_context(JSContext *ctx, JSValueConst this_val,
|
||||
int argc, JSValueConst *argv)
|
||||
{
|
||||
int secure;
|
||||
JSValue obj;
|
||||
js_lws_context_data_t *data;
|
||||
struct lws_context_creation_info info;
|
||||
struct lws_context *context;
|
||||
|
||||
if (!JS_IsFunction(ctx, argv[0]))
|
||||
return JS_ThrowTypeError(ctx, "not a function");
|
||||
|
||||
secure = JS_ToBool(ctx, argv[1]);
|
||||
if (secure < 0)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
obj = JS_NewObjectClass(ctx, js_lws_context_class_id);
|
||||
if (JS_IsException(obj))
|
||||
return obj;
|
||||
|
||||
data = js_mallocz(ctx, sizeof(js_lws_context_data_t));
|
||||
if (data == NULL) {
|
||||
JS_FreeValue(ctx, obj);
|
||||
return JS_EXCEPTION;
|
||||
}
|
||||
data->callback = JS_UNDEFINED;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.port = CONTEXT_PORT_NO_LISTEN;
|
||||
info.protocols = client_protocols;
|
||||
info.gid = -1;
|
||||
info.uid = -1;
|
||||
info.options = secure ? LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT : 0;
|
||||
info.user = data;
|
||||
context = lws_create_context(&info);
|
||||
if (context == NULL) {
|
||||
JS_FreeValue(ctx, obj);
|
||||
js_free(ctx, data);
|
||||
return JS_ThrowOutOfMemory(ctx);
|
||||
}
|
||||
|
||||
data->context = context;
|
||||
data->ctx = JS_DupContext(ctx);
|
||||
data->callback = JS_DupValue(ctx, argv[0]);
|
||||
JS_SetOpaque(obj, data);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
static void js_lws_context_finalizer(JSRuntime *rt, JSValue val)
|
||||
{
|
||||
js_lws_context_data_t *data = JS_GetOpaque(val, js_lws_context_class_id);
|
||||
if (data) {
|
||||
JS_FreeContext(data->ctx);
|
||||
data->ctx = NULL;
|
||||
JS_FreeValueRT(rt, data->callback);
|
||||
data->callback = JS_UNDEFINED;
|
||||
|
||||
lws_context_destroy(data->context);
|
||||
|
||||
while (data->wsi_list) {
|
||||
unlink_wsi_rt(rt, data, data->wsi_list);
|
||||
}
|
||||
|
||||
js_free_rt(rt, data);
|
||||
}
|
||||
}
|
||||
|
||||
static void js_lws_context_mark(JSRuntime *rt, JSValue val,
|
||||
JS_MarkFunc *mark_func)
|
||||
{
|
||||
js_lws_context_data_t *data = JS_GetOpaque(val, js_lws_context_class_id);
|
||||
if (data) {
|
||||
js_lws_wsi_data_t *wd;
|
||||
mark_func(rt, (JSGCObjectHeader *)data->ctx);
|
||||
JS_MarkValue(rt, data->callback, mark_func);
|
||||
for (wd = data->wsi_list; wd; wd = wd->next) {
|
||||
JS_MarkValue(rt, wd->object, mark_func);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static JSValue js_lws_context_get_connections(JSContext *ctx,
|
||||
JSValueConst this_val)
|
||||
{
|
||||
js_lws_context_data_t *data = JS_GetOpaque2(ctx, this_val,
|
||||
js_lws_context_class_id);
|
||||
int32_t connections = 0;
|
||||
js_lws_wsi_data_t *wd;
|
||||
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
for (wd = data->wsi_list; wd; wd = wd->next) {
|
||||
connections++;
|
||||
}
|
||||
|
||||
return JS_NewInt32(ctx, connections);
|
||||
}
|
||||
|
||||
static JSValue js_lws_client_connect(JSContext *ctx, JSValueConst this_val,
|
||||
int argc, JSValueConst *argv)
|
||||
{
|
||||
js_lws_context_data_t *data = JS_GetOpaque2(ctx, this_val,
|
||||
js_lws_context_class_id);
|
||||
const char *address = NULL;
|
||||
int32_t port;
|
||||
int secure;
|
||||
const char *path = NULL, *host = NULL, *origin = NULL, *protocol = NULL;
|
||||
JSValue obj = JS_UNDEFINED, ret = JS_EXCEPTION;
|
||||
js_lws_wsi_data_t *wsi_data;
|
||||
struct lws_client_connect_info info;
|
||||
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
address = JS_ToCString(ctx, argv[0]);
|
||||
if (address == NULL)
|
||||
goto exception;
|
||||
|
||||
if (JS_ToInt32(ctx, &port, argv[1]) < 0)
|
||||
goto exception;
|
||||
|
||||
if (port < 1 || port > 65535) {
|
||||
JS_ThrowRangeError(ctx, "port must be between 1 and 65535");
|
||||
goto exception;
|
||||
}
|
||||
|
||||
secure = JS_ToBool(ctx, argv[2]);
|
||||
if (secure < 0)
|
||||
goto exception;
|
||||
|
||||
path = JS_ToCString(ctx, argv[3]);
|
||||
if (path == NULL)
|
||||
goto exception;
|
||||
|
||||
host = JS_ToCString(ctx, argv[4]);
|
||||
if (host == NULL)
|
||||
goto exception;
|
||||
|
||||
if (!JS_IsUndefined(argv[5]) && !JS_IsNull(argv[5])) {
|
||||
origin = JS_ToCString(ctx, argv[5]);
|
||||
if (origin == NULL)
|
||||
goto exception;
|
||||
}
|
||||
|
||||
if (!JS_IsUndefined(argv[6]) && !JS_IsNull(argv[6])) {
|
||||
protocol = JS_ToCString(ctx, argv[6]);
|
||||
if (protocol == NULL)
|
||||
goto exception;
|
||||
}
|
||||
|
||||
obj = JS_NewObjectClass(ctx, js_lws_wsi_class_id);
|
||||
if (JS_IsException(obj))
|
||||
goto exception;
|
||||
|
||||
wsi_data = js_mallocz(ctx, sizeof(js_lws_wsi_data_t));
|
||||
if (wsi_data == NULL)
|
||||
goto exception;
|
||||
wsi_data->next = data->wsi_list;
|
||||
wsi_data->object = JS_DupValue(ctx, obj);
|
||||
wsi_data->context = JS_DupValue(ctx, this_val);
|
||||
wsi_data->user = JS_DupValue(ctx, argv[7]);
|
||||
wsi_data->in_use = WSI_DATA_USE_OBJECT | WSI_DATA_USE_LINKED;
|
||||
data->wsi_list = wsi_data;
|
||||
JS_SetOpaque(obj, wsi_data);
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.context = data->context;
|
||||
info.address = address;
|
||||
info.port = port;
|
||||
info.ssl_connection = secure ? LCCSCF_USE_SSL : 0;
|
||||
info.local_protocol_name = "lws-client";
|
||||
info.path = path;
|
||||
info.host = host;
|
||||
info.origin = origin;
|
||||
info.protocol = protocol;
|
||||
info.ietf_version_or_minus_one = -1;
|
||||
info.userdata = wsi_data;
|
||||
info.pwsi = &wsi_data->wsi;
|
||||
lws_client_connect_via_info(&info);
|
||||
|
||||
if (wsi_data->wsi) {
|
||||
ret = JS_DupValue(ctx, obj);
|
||||
} else {
|
||||
unlink_wsi(ctx, data, wsi_data);
|
||||
JS_ThrowReferenceError(ctx, "cannot connect to [%s]:%d (%s)",
|
||||
address, port, secure ? "wss" : "ws");
|
||||
}
|
||||
|
||||
exception:
|
||||
JS_FreeCString(ctx, address);
|
||||
JS_FreeCString(ctx, path);
|
||||
JS_FreeCString(ctx, host);
|
||||
JS_FreeCString(ctx, origin);
|
||||
JS_FreeCString(ctx, protocol);
|
||||
JS_FreeValue(ctx, obj);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static JSValue js_lws_service_fd(JSContext *ctx, JSValueConst this_val,
|
||||
int argc, JSValueConst *argv)
|
||||
{
|
||||
js_lws_context_data_t *data = JS_GetOpaque2(ctx, this_val,
|
||||
js_lws_context_class_id);
|
||||
int32_t fd, events, revents;
|
||||
struct lws_pollfd pfd;
|
||||
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
if (JS_ToInt32(ctx, &fd, argv[0]) < 0)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
if (JS_ToInt32(ctx, &events, argv[1]) < 0)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
if (JS_ToInt32(ctx, &revents, argv[2]) < 0)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
pfd.fd = fd;
|
||||
pfd.events = events;
|
||||
pfd.revents = revents;
|
||||
lws_service_fd(data->context, &pfd);
|
||||
|
||||
return JS_NewInt32(ctx,
|
||||
lws_service_adjust_timeout(data->context, MAX_WAIT, 0));
|
||||
}
|
||||
|
||||
static JSValue js_lws_service_periodic(JSContext *ctx, JSValueConst this_val,
|
||||
int argc, JSValueConst *argv)
|
||||
{
|
||||
js_lws_context_data_t *data = JS_GetOpaque2(ctx, this_val,
|
||||
js_lws_context_class_id);
|
||||
int timeout;
|
||||
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
#if LWS_LIBRARY_VERSION_NUMBER < 3002000
|
||||
lws_service_fd(data->context, NULL);
|
||||
#endif
|
||||
|
||||
timeout = lws_service_adjust_timeout(data->context, MAX_WAIT, 0);
|
||||
if (timeout == 0) {
|
||||
lws_service(data->context, -1);
|
||||
timeout = lws_service_adjust_timeout(data->context, MAX_WAIT, 0);
|
||||
}
|
||||
|
||||
return JS_NewInt32(ctx, timeout);
|
||||
}
|
||||
|
||||
static void js_lws_wsi_finalizer(JSRuntime *rt, JSValue val)
|
||||
{
|
||||
js_lws_wsi_data_t *data = JS_GetOpaque(val, js_lws_wsi_class_id);
|
||||
if (data) {
|
||||
JS_FreeValueRT(rt, data->context);
|
||||
data->context = JS_UNDEFINED;
|
||||
JS_FreeValueRT(rt, data->user);
|
||||
data->user = JS_UNDEFINED;
|
||||
|
||||
data->in_use &= ~WSI_DATA_USE_OBJECT;
|
||||
if (data->in_use == 0)
|
||||
free_wsi_data_rt(rt, data);
|
||||
}
|
||||
}
|
||||
|
||||
static void js_lws_wsi_mark(JSRuntime *rt, JSValue val,
|
||||
JS_MarkFunc *mark_func)
|
||||
{
|
||||
js_lws_wsi_data_t *data = JS_GetOpaque(val, js_lws_wsi_class_id);
|
||||
if (data) {
|
||||
JS_MarkValue(rt, data->context, mark_func);
|
||||
JS_MarkValue(rt, data->user, mark_func);
|
||||
}
|
||||
}
|
||||
|
||||
static JSValue js_lws_wsi_get_context(JSContext *ctx, JSValueConst this_val)
|
||||
{
|
||||
js_lws_wsi_data_t *data = JS_GetOpaque2(ctx, this_val, js_lws_wsi_class_id);
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
return JS_DupValue(ctx, data->context);
|
||||
}
|
||||
|
||||
static JSValue js_lws_wsi_get_user(JSContext *ctx, JSValueConst this_val)
|
||||
{
|
||||
js_lws_wsi_data_t *data = JS_GetOpaque2(ctx, this_val, js_lws_wsi_class_id);
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
return JS_DupValue(ctx, data->user);
|
||||
}
|
||||
|
||||
static JSValue js_lws_wsi_get_hdr(JSContext *ctx, JSValueConst this_val,
|
||||
int magic)
|
||||
{
|
||||
js_lws_wsi_data_t *data = JS_GetOpaque2(ctx, this_val, js_lws_wsi_class_id);
|
||||
int len;
|
||||
char *str;
|
||||
JSValue ret;
|
||||
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
if (data->wsi == NULL)
|
||||
return JS_ThrowTypeError(ctx, "defunct WSI");
|
||||
|
||||
len = lws_hdr_total_length(data->wsi, magic);
|
||||
if (len < 0)
|
||||
return JS_ThrowReferenceError(ctx, "HTTP headers unavailable");
|
||||
|
||||
len++;
|
||||
str = js_mallocz(ctx, len);
|
||||
if (str == NULL)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
len = lws_hdr_copy(data->wsi, str, len, magic);
|
||||
if (len < 0)
|
||||
ret = JS_ThrowReferenceError(ctx, "HTTP headers unavailable");
|
||||
else
|
||||
ret = JS_NewStringLen(ctx, str, len);
|
||||
|
||||
js_free(ctx, str);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static JSValue js_lws_is_final_fragment(JSContext *ctx, JSValueConst this_val,
|
||||
int argc, JSValueConst *argv)
|
||||
{
|
||||
js_lws_wsi_data_t *data = JS_GetOpaque2(ctx, this_val, js_lws_wsi_class_id);
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
if (data->wsi == NULL)
|
||||
return JS_ThrowTypeError(ctx, "defunct WSI");
|
||||
return JS_NewBool(ctx, lws_is_final_fragment(data->wsi));
|
||||
}
|
||||
|
||||
static JSValue js_lws_is_first_fragment(JSContext *ctx, JSValueConst this_val,
|
||||
int argc, JSValueConst *argv)
|
||||
{
|
||||
js_lws_wsi_data_t *data = JS_GetOpaque2(ctx, this_val, js_lws_wsi_class_id);
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
if (data->wsi == NULL)
|
||||
return JS_ThrowTypeError(ctx, "defunct WSI");
|
||||
return JS_NewBool(ctx, lws_is_first_fragment(data->wsi));
|
||||
}
|
||||
|
||||
static JSValue js_lws_frame_is_binary(JSContext *ctx, JSValueConst this_val,
|
||||
int argc, JSValueConst *argv)
|
||||
{
|
||||
js_lws_wsi_data_t *data = JS_GetOpaque2(ctx, this_val, js_lws_wsi_class_id);
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
if (data->wsi == NULL)
|
||||
return JS_ThrowTypeError(ctx, "defunct WSI");
|
||||
return JS_NewBool(ctx, lws_frame_is_binary(data->wsi));
|
||||
}
|
||||
|
||||
static JSValue js_lws_callback_on_writable(JSContext *ctx,
|
||||
JSValueConst this_val,
|
||||
int argc, JSValueConst *argv)
|
||||
{
|
||||
js_lws_wsi_data_t *data = JS_GetOpaque2(ctx, this_val, js_lws_wsi_class_id);
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
if (data->wsi == NULL)
|
||||
return JS_ThrowTypeError(ctx, "defunct WSI");
|
||||
lws_callback_on_writable(data->wsi);
|
||||
return JS_UNDEFINED;
|
||||
}
|
||||
|
||||
static JSValue js_lws_write(JSContext *ctx, JSValueConst this_val,
|
||||
int argc, JSValueConst *argv)
|
||||
{
|
||||
js_lws_wsi_data_t *data = JS_GetOpaque2(ctx, this_val, js_lws_wsi_class_id);
|
||||
const char *str = NULL;
|
||||
const uint8_t *ptr;
|
||||
uint8_t *buf;
|
||||
size_t size;
|
||||
enum lws_write_protocol protocol;
|
||||
int ret;
|
||||
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
if (data->wsi == NULL)
|
||||
return JS_ThrowTypeError(ctx, "defunct WSI");
|
||||
|
||||
if (JS_IsString(argv[0])) {
|
||||
str = JS_ToCStringLen(ctx, &size, argv[0]);
|
||||
if (str == NULL)
|
||||
return JS_EXCEPTION;
|
||||
ptr = (const uint8_t *)str;
|
||||
protocol = LWS_WRITE_TEXT;
|
||||
} else {
|
||||
ptr = JS_GetArrayBuffer(ctx, &size, argv[0]);
|
||||
if (ptr == NULL)
|
||||
return JS_EXCEPTION;
|
||||
protocol = LWS_WRITE_BINARY;
|
||||
}
|
||||
|
||||
buf = js_malloc(ctx, LWS_PRE + size);
|
||||
if (buf)
|
||||
memcpy(buf + LWS_PRE, ptr, size);
|
||||
if (str)
|
||||
JS_FreeCString(ctx, str);
|
||||
if (buf == NULL)
|
||||
return JS_EXCEPTION;
|
||||
ret = lws_write(data->wsi, buf + LWS_PRE, size, protocol);
|
||||
js_free(ctx, buf);
|
||||
|
||||
if (ret < 0)
|
||||
return JS_ThrowTypeError(ctx, "WSI not writable");
|
||||
|
||||
return JS_UNDEFINED;
|
||||
}
|
||||
|
||||
static JSValue js_lws_close_reason(JSContext *ctx, JSValueConst this_val,
|
||||
int argc, JSValueConst *argv)
|
||||
{
|
||||
js_lws_wsi_data_t *data = JS_GetOpaque2(ctx, this_val, js_lws_wsi_class_id);
|
||||
int32_t status;
|
||||
const char *reason = NULL;
|
||||
size_t len = 0;
|
||||
|
||||
if (data == NULL)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
if (data->wsi == NULL)
|
||||
return JS_ThrowTypeError(ctx, "defunct WSI");
|
||||
|
||||
if (JS_ToInt32(ctx, &status, argv[0]) < 0)
|
||||
return JS_EXCEPTION;
|
||||
|
||||
if (status < 0 || status > 65535)
|
||||
return JS_ThrowRangeError(ctx, "status must be between 0 and 65535");
|
||||
|
||||
if (!JS_IsUndefined(argv[1])) {
|
||||
reason = JS_ToCStringLen(ctx, &len, argv[1]);
|
||||
if (reason == NULL)
|
||||
return JS_EXCEPTION;
|
||||
if (len > 123) {
|
||||
JS_FreeCString(ctx, reason);
|
||||
return JS_ThrowTypeError(ctx, "reason too long (%zu > 123)", len);
|
||||
}
|
||||
}
|
||||
|
||||
lws_close_reason(data->wsi, status, (uint8_t *)reason, len);
|
||||
|
||||
if (reason)
|
||||
JS_FreeCString(ctx, reason);
|
||||
|
||||
return JS_UNDEFINED;
|
||||
}
|
||||
|
||||
static const JSCFunctionListEntry js_lws_funcs[] = {
|
||||
CDEF(LLL_ERR),
|
||||
CDEF(LLL_WARN),
|
||||
CDEF(LLL_NOTICE),
|
||||
CDEF(LLL_INFO),
|
||||
CDEF(LLL_DEBUG),
|
||||
CDEF(LLL_PARSER),
|
||||
CDEF(LLL_HEADER),
|
||||
CDEF(LLL_EXT),
|
||||
CDEF(LLL_CLIENT),
|
||||
CDEF(LLL_LATENCY),
|
||||
CDEF(LLL_USER),
|
||||
CDEF(LLL_THREAD),
|
||||
CDEF(LLL_COUNT),
|
||||
CDEF(LWS_CALLBACK_PROTOCOL_INIT),
|
||||
CDEF(LWS_CALLBACK_PROTOCOL_DESTROY),
|
||||
CDEF(LWS_CALLBACK_WSI_CREATE),
|
||||
CDEF(LWS_CALLBACK_WSI_DESTROY),
|
||||
CDEF(LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS),
|
||||
CDEF(LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS),
|
||||
CDEF(LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION),
|
||||
CDEF(LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY),
|
||||
CDEF(LWS_CALLBACK_SSL_INFO),
|
||||
CDEF(LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION),
|
||||
CDEF(LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED),
|
||||
CDEF(LWS_CALLBACK_HTTP),
|
||||
CDEF(LWS_CALLBACK_HTTP_BODY),
|
||||
CDEF(LWS_CALLBACK_HTTP_BODY_COMPLETION),
|
||||
CDEF(LWS_CALLBACK_HTTP_FILE_COMPLETION),
|
||||
CDEF(LWS_CALLBACK_HTTP_WRITEABLE),
|
||||
CDEF(LWS_CALLBACK_CLOSED_HTTP),
|
||||
CDEF(LWS_CALLBACK_FILTER_HTTP_CONNECTION),
|
||||
CDEF(LWS_CALLBACK_ADD_HEADERS),
|
||||
CDEF(LWS_CALLBACK_CHECK_ACCESS_RIGHTS),
|
||||
CDEF(LWS_CALLBACK_PROCESS_HTML),
|
||||
CDEF(LWS_CALLBACK_HTTP_BIND_PROTOCOL),
|
||||
CDEF(LWS_CALLBACK_HTTP_DROP_PROTOCOL),
|
||||
CDEF(LWS_CALLBACK_HTTP_CONFIRM_UPGRADE),
|
||||
CDEF(LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP),
|
||||
CDEF(LWS_CALLBACK_CLOSED_CLIENT_HTTP),
|
||||
CDEF(LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ),
|
||||
CDEF(LWS_CALLBACK_RECEIVE_CLIENT_HTTP),
|
||||
CDEF(LWS_CALLBACK_COMPLETED_CLIENT_HTTP),
|
||||
CDEF(LWS_CALLBACK_CLIENT_HTTP_WRITEABLE),
|
||||
CDEF(LWS_CALLBACK_CLIENT_HTTP_BIND_PROTOCOL),
|
||||
CDEF(LWS_CALLBACK_CLIENT_HTTP_DROP_PROTOCOL),
|
||||
CDEF(LWS_CALLBACK_ESTABLISHED),
|
||||
CDEF(LWS_CALLBACK_CLOSED),
|
||||
CDEF(LWS_CALLBACK_SERVER_WRITEABLE),
|
||||
CDEF(LWS_CALLBACK_RECEIVE),
|
||||
CDEF(LWS_CALLBACK_RECEIVE_PONG),
|
||||
CDEF(LWS_CALLBACK_WS_PEER_INITIATED_CLOSE),
|
||||
CDEF(LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION),
|
||||
CDEF(LWS_CALLBACK_CONFIRM_EXTENSION_OKAY),
|
||||
CDEF(LWS_CALLBACK_WS_SERVER_BIND_PROTOCOL),
|
||||
CDEF(LWS_CALLBACK_WS_SERVER_DROP_PROTOCOL),
|
||||
CDEF(LWS_CALLBACK_CLIENT_CONNECTION_ERROR),
|
||||
CDEF(LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH),
|
||||
CDEF(LWS_CALLBACK_CLIENT_ESTABLISHED),
|
||||
CDEF(LWS_CALLBACK_CLIENT_CLOSED),
|
||||
CDEF(LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER),
|
||||
CDEF(LWS_CALLBACK_CLIENT_RECEIVE),
|
||||
CDEF(LWS_CALLBACK_CLIENT_RECEIVE_PONG),
|
||||
CDEF(LWS_CALLBACK_CLIENT_WRITEABLE),
|
||||
CDEF(LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED),
|
||||
CDEF(LWS_CALLBACK_WS_EXT_DEFAULTS),
|
||||
CDEF(LWS_CALLBACK_FILTER_NETWORK_CONNECTION),
|
||||
CDEF(LWS_CALLBACK_WS_CLIENT_BIND_PROTOCOL),
|
||||
CDEF(LWS_CALLBACK_WS_CLIENT_DROP_PROTOCOL),
|
||||
CDEF(LWS_CALLBACK_GET_THREAD_ID),
|
||||
CDEF(LWS_CALLBACK_ADD_POLL_FD),
|
||||
CDEF(LWS_CALLBACK_DEL_POLL_FD),
|
||||
CDEF(LWS_CALLBACK_CHANGE_MODE_POLL_FD),
|
||||
CDEF(LWS_CALLBACK_LOCK_POLL),
|
||||
CDEF(LWS_CALLBACK_UNLOCK_POLL),
|
||||
CDEF(LWS_CALLBACK_CGI),
|
||||
CDEF(LWS_CALLBACK_CGI_TERMINATED),
|
||||
CDEF(LWS_CALLBACK_CGI_STDIN_DATA),
|
||||
CDEF(LWS_CALLBACK_CGI_STDIN_COMPLETED),
|
||||
CDEF(LWS_CALLBACK_CGI_PROCESS_ATTACH),
|
||||
CDEF(LWS_CALLBACK_SESSION_INFO),
|
||||
CDEF(LWS_CALLBACK_GS_EVENT),
|
||||
CDEF(LWS_CALLBACK_HTTP_PMO),
|
||||
CDEF(LWS_CALLBACK_RAW_RX),
|
||||
CDEF(LWS_CALLBACK_RAW_CLOSE),
|
||||
CDEF(LWS_CALLBACK_RAW_WRITEABLE),
|
||||
CDEF(LWS_CALLBACK_RAW_ADOPT),
|
||||
CDEF(LWS_CALLBACK_RAW_SKT_BIND_PROTOCOL),
|
||||
CDEF(LWS_CALLBACK_RAW_SKT_DROP_PROTOCOL),
|
||||
CDEF(LWS_CALLBACK_RAW_ADOPT_FILE),
|
||||
CDEF(LWS_CALLBACK_RAW_RX_FILE),
|
||||
CDEF(LWS_CALLBACK_RAW_WRITEABLE_FILE),
|
||||
CDEF(LWS_CALLBACK_RAW_CLOSE_FILE),
|
||||
CDEF(LWS_CALLBACK_RAW_FILE_BIND_PROTOCOL),
|
||||
CDEF(LWS_CALLBACK_RAW_FILE_DROP_PROTOCOL),
|
||||
CDEF(LWS_CALLBACK_TIMER),
|
||||
CDEF(LWS_CALLBACK_EVENT_WAIT_CANCELLED),
|
||||
CDEF(LWS_CALLBACK_CHILD_CLOSING),
|
||||
CDEF(LWS_CALLBACK_VHOST_CERT_AGING),
|
||||
CDEF(LWS_CALLBACK_VHOST_CERT_UPDATE),
|
||||
CDEF(LWS_CALLBACK_USER),
|
||||
CDEF(LWS_POLLHUP),
|
||||
CDEF(LWS_POLLIN),
|
||||
CDEF(LWS_POLLOUT),
|
||||
JS_CFUNC_DEF("decode_utf8", 1, js_decode_utf8),
|
||||
JS_CFUNC_DEF("set_log_level", 1, js_lws_set_log_level),
|
||||
JS_CFUNC_DEF("create_context", 2, js_lws_create_context),
|
||||
};
|
||||
|
||||
static const JSClassDef js_lws_context_class = {
|
||||
"Context",
|
||||
.finalizer = js_lws_context_finalizer,
|
||||
.gc_mark = js_lws_context_mark,
|
||||
};
|
||||
|
||||
static const JSCFunctionListEntry js_lws_context_proto_funcs[] = {
|
||||
JS_CGETSET_DEF("connections", js_lws_context_get_connections, NULL),
|
||||
JS_CFUNC_DEF("client_connect", 8, js_lws_client_connect),
|
||||
JS_CFUNC_DEF("service_fd", 3, js_lws_service_fd),
|
||||
JS_CFUNC_DEF("service_periodic", 0, js_lws_service_periodic),
|
||||
};
|
||||
|
||||
static const JSClassDef js_lws_wsi_class = {
|
||||
"WSI",
|
||||
.finalizer = js_lws_wsi_finalizer,
|
||||
.gc_mark = js_lws_wsi_mark,
|
||||
};
|
||||
|
||||
#define HDRGET(name) JS_CGETSET_MAGIC_DEF(#name, js_lws_wsi_get_hdr, NULL, name)
|
||||
|
||||
static const JSCFunctionListEntry js_lws_wsi_proto_funcs[] = {
|
||||
JS_CGETSET_DEF("context", js_lws_wsi_get_context, NULL),
|
||||
JS_CGETSET_DEF("user", js_lws_wsi_get_user, NULL),
|
||||
HDRGET(WSI_TOKEN_GET_URI),
|
||||
HDRGET(WSI_TOKEN_POST_URI),
|
||||
HDRGET(WSI_TOKEN_OPTIONS_URI),
|
||||
HDRGET(WSI_TOKEN_HOST),
|
||||
HDRGET(WSI_TOKEN_CONNECTION),
|
||||
HDRGET(WSI_TOKEN_UPGRADE),
|
||||
HDRGET(WSI_TOKEN_ORIGIN),
|
||||
HDRGET(WSI_TOKEN_DRAFT),
|
||||
HDRGET(WSI_TOKEN_CHALLENGE),
|
||||
HDRGET(WSI_TOKEN_EXTENSIONS),
|
||||
HDRGET(WSI_TOKEN_KEY1),
|
||||
HDRGET(WSI_TOKEN_KEY2),
|
||||
HDRGET(WSI_TOKEN_PROTOCOL),
|
||||
HDRGET(WSI_TOKEN_ACCEPT),
|
||||
HDRGET(WSI_TOKEN_NONCE),
|
||||
HDRGET(WSI_TOKEN_HTTP),
|
||||
HDRGET(WSI_TOKEN_HTTP2_SETTINGS),
|
||||
HDRGET(WSI_TOKEN_HTTP_ACCEPT),
|
||||
HDRGET(WSI_TOKEN_HTTP_AC_REQUEST_HEADERS),
|
||||
HDRGET(WSI_TOKEN_HTTP_IF_MODIFIED_SINCE),
|
||||
HDRGET(WSI_TOKEN_HTTP_IF_NONE_MATCH),
|
||||
HDRGET(WSI_TOKEN_HTTP_ACCEPT_ENCODING),
|
||||
HDRGET(WSI_TOKEN_HTTP_ACCEPT_LANGUAGE),
|
||||
HDRGET(WSI_TOKEN_HTTP_PRAGMA),
|
||||
HDRGET(WSI_TOKEN_HTTP_CACHE_CONTROL),
|
||||
HDRGET(WSI_TOKEN_HTTP_AUTHORIZATION),
|
||||
HDRGET(WSI_TOKEN_HTTP_COOKIE),
|
||||
HDRGET(WSI_TOKEN_HTTP_CONTENT_LENGTH),
|
||||
HDRGET(WSI_TOKEN_HTTP_CONTENT_TYPE),
|
||||
HDRGET(WSI_TOKEN_HTTP_DATE),
|
||||
HDRGET(WSI_TOKEN_HTTP_RANGE),
|
||||
HDRGET(WSI_TOKEN_HTTP_REFERER),
|
||||
HDRGET(WSI_TOKEN_KEY),
|
||||
HDRGET(WSI_TOKEN_VERSION),
|
||||
HDRGET(WSI_TOKEN_SWORIGIN),
|
||||
HDRGET(WSI_TOKEN_HTTP_COLON_AUTHORITY),
|
||||
HDRGET(WSI_TOKEN_HTTP_COLON_METHOD),
|
||||
HDRGET(WSI_TOKEN_HTTP_COLON_PATH),
|
||||
HDRGET(WSI_TOKEN_HTTP_COLON_SCHEME),
|
||||
HDRGET(WSI_TOKEN_HTTP_COLON_STATUS),
|
||||
HDRGET(WSI_TOKEN_HTTP_ACCEPT_CHARSET),
|
||||
HDRGET(WSI_TOKEN_HTTP_ACCEPT_RANGES),
|
||||
HDRGET(WSI_TOKEN_HTTP_ACCESS_CONTROL_ALLOW_ORIGIN),
|
||||
HDRGET(WSI_TOKEN_HTTP_AGE),
|
||||
HDRGET(WSI_TOKEN_HTTP_ALLOW),
|
||||
HDRGET(WSI_TOKEN_HTTP_CONTENT_DISPOSITION),
|
||||
HDRGET(WSI_TOKEN_HTTP_CONTENT_ENCODING),
|
||||
HDRGET(WSI_TOKEN_HTTP_CONTENT_LANGUAGE),
|
||||
HDRGET(WSI_TOKEN_HTTP_CONTENT_LOCATION),
|
||||
HDRGET(WSI_TOKEN_HTTP_CONTENT_RANGE),
|
||||
HDRGET(WSI_TOKEN_HTTP_ETAG),
|
||||
HDRGET(WSI_TOKEN_HTTP_EXPECT),
|
||||
HDRGET(WSI_TOKEN_HTTP_EXPIRES),
|
||||
HDRGET(WSI_TOKEN_HTTP_FROM),
|
||||
HDRGET(WSI_TOKEN_HTTP_IF_MATCH),
|
||||
HDRGET(WSI_TOKEN_HTTP_IF_RANGE),
|
||||
HDRGET(WSI_TOKEN_HTTP_IF_UNMODIFIED_SINCE),
|
||||
HDRGET(WSI_TOKEN_HTTP_LAST_MODIFIED),
|
||||
HDRGET(WSI_TOKEN_HTTP_LINK),
|
||||
HDRGET(WSI_TOKEN_HTTP_LOCATION),
|
||||
HDRGET(WSI_TOKEN_HTTP_MAX_FORWARDS),
|
||||
HDRGET(WSI_TOKEN_HTTP_PROXY_AUTHENTICATE),
|
||||
HDRGET(WSI_TOKEN_HTTP_PROXY_AUTHORIZATION),
|
||||
HDRGET(WSI_TOKEN_HTTP_REFRESH),
|
||||
HDRGET(WSI_TOKEN_HTTP_RETRY_AFTER),
|
||||
HDRGET(WSI_TOKEN_HTTP_SERVER),
|
||||
HDRGET(WSI_TOKEN_HTTP_SET_COOKIE),
|
||||
HDRGET(WSI_TOKEN_HTTP_STRICT_TRANSPORT_SECURITY),
|
||||
HDRGET(WSI_TOKEN_HTTP_TRANSFER_ENCODING),
|
||||
HDRGET(WSI_TOKEN_HTTP_USER_AGENT),
|
||||
HDRGET(WSI_TOKEN_HTTP_VARY),
|
||||
HDRGET(WSI_TOKEN_HTTP_VIA),
|
||||
HDRGET(WSI_TOKEN_HTTP_WWW_AUTHENTICATE),
|
||||
HDRGET(WSI_TOKEN_PATCH_URI),
|
||||
HDRGET(WSI_TOKEN_PUT_URI),
|
||||
HDRGET(WSI_TOKEN_DELETE_URI),
|
||||
HDRGET(WSI_TOKEN_HTTP_URI_ARGS),
|
||||
HDRGET(WSI_TOKEN_PROXY),
|
||||
HDRGET(WSI_TOKEN_HTTP_X_REAL_IP),
|
||||
HDRGET(WSI_TOKEN_HTTP1_0),
|
||||
HDRGET(WSI_TOKEN_X_FORWARDED_FOR),
|
||||
HDRGET(WSI_TOKEN_CONNECT),
|
||||
HDRGET(WSI_TOKEN_HEAD_URI),
|
||||
HDRGET(WSI_TOKEN_TE),
|
||||
HDRGET(WSI_TOKEN_REPLAY_NONCE),
|
||||
HDRGET(WSI_TOKEN_COLON_PROTOCOL),
|
||||
HDRGET(WSI_TOKEN_X_AUTH_TOKEN),
|
||||
JS_CFUNC_DEF("is_final_fragment", 0, js_lws_is_final_fragment),
|
||||
JS_CFUNC_DEF("is_first_fragment", 0, js_lws_is_first_fragment),
|
||||
JS_CFUNC_DEF("frame_is_binary", 0, js_lws_frame_is_binary),
|
||||
JS_CFUNC_DEF("callback_on_writable", 0, js_lws_callback_on_writable),
|
||||
JS_CFUNC_DEF("write", 1, js_lws_write),
|
||||
JS_CFUNC_DEF("close_reason", 2, js_lws_close_reason),
|
||||
};
|
||||
|
||||
static int js_lws_init(JSContext *ctx, JSModuleDef *m)
|
||||
{
|
||||
JSValue proto;
|
||||
|
||||
JS_NewClassID(&js_lws_context_class_id);
|
||||
JS_NewClass(JS_GetRuntime(ctx), js_lws_context_class_id,
|
||||
&js_lws_context_class);
|
||||
proto = JS_NewObject(ctx);
|
||||
JS_SetPropertyFunctionList(ctx, proto, js_lws_context_proto_funcs,
|
||||
countof(js_lws_context_proto_funcs));
|
||||
JS_SetClassProto(ctx, js_lws_context_class_id, proto);
|
||||
|
||||
JS_NewClassID(&js_lws_wsi_class_id);
|
||||
JS_NewClass(JS_GetRuntime(ctx), js_lws_wsi_class_id, &js_lws_wsi_class);
|
||||
proto = JS_NewObject(ctx);
|
||||
JS_SetPropertyFunctionList(ctx, proto, js_lws_wsi_proto_funcs,
|
||||
countof(js_lws_wsi_proto_funcs));
|
||||
JS_SetClassProto(ctx, js_lws_wsi_class_id, proto);
|
||||
|
||||
return JS_SetModuleExportList(ctx, m, js_lws_funcs, countof(js_lws_funcs));
|
||||
}
|
||||
|
||||
JSModuleDef *js_init_module(JSContext *ctx, const char *module_name)
|
||||
{
|
||||
JSModuleDef *m = JS_NewCModule(ctx, module_name, js_lws_init);
|
||||
if (m == NULL)
|
||||
return NULL;
|
||||
JS_AddModuleExportList(ctx, m, js_lws_funcs, countof(js_lws_funcs));
|
||||
return m;
|
||||
}
|
||||
415
quickjs-websocket/src/websocket.js
Normal file
415
quickjs-websocket/src/websocket.js
Normal file
@@ -0,0 +1,415 @@
|
||||
/*
|
||||
* Copyright (c) 2020 Genexis B.V.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
import * as os from 'os'
|
||||
import * as lws from './lws-client.so'
|
||||
|
||||
const CONNECTING = 0
|
||||
const OPEN = 1
|
||||
const CLOSING = 2
|
||||
const CLOSED = 3
|
||||
|
||||
const CLOSING1 = 0x10 | CLOSING
|
||||
const CLOSING2 = 0x20 | CLOSING
|
||||
|
||||
function serviceScheduler (context) {
|
||||
let running = false
|
||||
let timeout = null
|
||||
|
||||
function schedule (time) {
|
||||
if (timeout) os.clearTimeout(timeout)
|
||||
timeout = running ? os.setTimeout(callback, time) : null
|
||||
}
|
||||
|
||||
function callback () {
|
||||
schedule(context.service_periodic())
|
||||
}
|
||||
|
||||
return {
|
||||
start: function () {
|
||||
running = true
|
||||
schedule(0)
|
||||
},
|
||||
stop: function () {
|
||||
running = false
|
||||
schedule(0)
|
||||
},
|
||||
reschedule: schedule
|
||||
}
|
||||
}
|
||||
|
||||
function fdHandler (fd, events, revents) {
|
||||
return function () {
|
||||
service.reschedule(context.service_fd(fd, events, revents))
|
||||
}
|
||||
}
|
||||
|
||||
function contextCallback (wsi, reason, arg) {
|
||||
switch (reason) {
|
||||
case lws.LWS_CALLBACK_ADD_POLL_FD:
|
||||
service.start()
|
||||
// fallthrough
|
||||
case lws.LWS_CALLBACK_CHANGE_MODE_POLL_FD:
|
||||
os.setReadHandler(
|
||||
arg.fd,
|
||||
(arg.events & lws.LWS_POLLIN)
|
||||
? fdHandler(arg.fd, arg.events, lws.LWS_POLLIN)
|
||||
: null
|
||||
)
|
||||
os.setWriteHandler(
|
||||
arg.fd,
|
||||
(arg.events & lws.LWS_POLLOUT)
|
||||
? fdHandler(arg.fd, arg.events, lws.LWS_POLLOUT)
|
||||
: null
|
||||
)
|
||||
break
|
||||
case lws.LWS_CALLBACK_DEL_POLL_FD:
|
||||
os.setReadHandler(arg.fd, null)
|
||||
os.setWriteHandler(arg.fd, null)
|
||||
break
|
||||
case lws.LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
|
||||
wsi.user.error(typeof arg === 'string' ? arg : '')
|
||||
break
|
||||
case lws.LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH:
|
||||
if (wsi.user.readyState !== CONNECTING) {
|
||||
return -1
|
||||
}
|
||||
wsi.user.protocol = wsi.WSI_TOKEN_PROTOCOL
|
||||
wsi.user.extensions = wsi.WSI_TOKEN_EXTENSIONS
|
||||
break
|
||||
case lws.LWS_CALLBACK_CLIENT_ESTABLISHED:
|
||||
if (wsi.user.readyState !== CONNECTING) {
|
||||
return -1
|
||||
}
|
||||
wsi.user.wsi = wsi
|
||||
wsi.user.open()
|
||||
break
|
||||
case lws.LWS_CALLBACK_WS_PEER_INITIATED_CLOSE:
|
||||
if (wsi.user.readyState === CLOSED) {
|
||||
return -1
|
||||
}
|
||||
if (arg instanceof Array) {
|
||||
wsi.user.closeEvent.code = arg[0]
|
||||
wsi.user.closeEvent.reason = arg[1]
|
||||
} else {
|
||||
wsi.user.closeEvent.code = 1005
|
||||
wsi.user.closeEvent.reason = ''
|
||||
}
|
||||
wsi.user.readyState = CLOSING2
|
||||
break
|
||||
case lws.LWS_CALLBACK_CLIENT_CLOSED:
|
||||
wsi.user.close()
|
||||
break
|
||||
case lws.LWS_CALLBACK_CLIENT_RECEIVE:
|
||||
if (!(arg instanceof ArrayBuffer) ||
|
||||
wsi.user.readyState === CONNECTING ||
|
||||
wsi.user.readyState === CLOSED) {
|
||||
return -1
|
||||
}
|
||||
if (wsi.is_first_fragment()) {
|
||||
wsi.user.inbuf = []
|
||||
}
|
||||
wsi.user.inbuf.push(arg)
|
||||
if (wsi.is_final_fragment()) {
|
||||
wsi.user.message(wsi.frame_is_binary())
|
||||
}
|
||||
break
|
||||
case lws.LWS_CALLBACK_CLIENT_WRITEABLE:
|
||||
if ((wsi.user.readyState === OPEN || wsi.user.readyState === CLOSING1) &&
|
||||
wsi.user.outbuf.length > 0) {
|
||||
const msg = wsi.user.outbuf.shift()
|
||||
if (msg === null) {
|
||||
wsi.user.readyState = CLOSING2
|
||||
return -1
|
||||
}
|
||||
wsi.write(msg)
|
||||
if (wsi.user.outbuf.length > 0) {
|
||||
wsi.callback_on_writable()
|
||||
}
|
||||
}
|
||||
break
|
||||
case lws.LWS_CALLBACK_WSI_DESTROY:
|
||||
if (wsi.context.connections === 0) service.stop()
|
||||
break
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
lws.set_log_level(lws.LLL_ERR | lws.LLL_WARN)
|
||||
const context = lws.create_context(contextCallback, true)
|
||||
const service = serviceScheduler(context)
|
||||
|
||||
function arrayBufferJoin (bufs) {
|
||||
if (!(bufs instanceof Array)) {
|
||||
throw new TypeError('Array expected')
|
||||
}
|
||||
|
||||
if (!bufs.every(function (val) { return val instanceof ArrayBuffer })) {
|
||||
throw new TypeError('ArrayBuffer expected')
|
||||
}
|
||||
|
||||
const len = bufs.reduce(function (acc, val) {
|
||||
return acc + val.byteLength
|
||||
}, 0)
|
||||
const array = new Uint8Array(len)
|
||||
|
||||
let offset = 0
|
||||
for (const b of bufs) {
|
||||
array.set(new Uint8Array(b), offset)
|
||||
offset += b.byteLength
|
||||
}
|
||||
|
||||
return array.buffer
|
||||
}
|
||||
|
||||
export function WebSocket (url, protocols) {
|
||||
const pattern = /^(ws|wss):\/\/([^/?#]*)([^#]*)$/i
|
||||
const match = pattern.exec(url)
|
||||
if (match === null) {
|
||||
throw new TypeError('invalid WebSocket URL')
|
||||
}
|
||||
const secure = match[1].toLowerCase() === 'wss'
|
||||
const host = match[2]
|
||||
const path = match[3].startsWith('/') ? match[3] : '/' + match[3]
|
||||
|
||||
const hostPattern = /^(?:([a-z\d.-]+)|\[([\da-f:]+:[\da-f.]*)\])(?::(\d*))?$/i
|
||||
const hostMatch = hostPattern.exec(host)
|
||||
if (hostMatch === null) {
|
||||
throw new TypeError('invalid WebSocket URL')
|
||||
}
|
||||
const address = hostMatch[1] || hostMatch[2]
|
||||
const port = hostMatch[3] ? parseInt(hostMatch[3]) : (secure ? 443 : 80)
|
||||
|
||||
const validPath = /^\/[A-Za-z0-9_.!~*'()%:@&=+$,;/?-]*$/
|
||||
if (!validPath.test(path)) {
|
||||
throw new TypeError('invalid WebSocket URL')
|
||||
}
|
||||
if (!(port >= 1 && port <= 65535)) {
|
||||
throw new RangeError('port must be between 1 and 65535')
|
||||
}
|
||||
|
||||
if (protocols === undefined) {
|
||||
protocols = []
|
||||
} else if (!(protocols instanceof Array)) {
|
||||
protocols = [protocols]
|
||||
}
|
||||
const validProto = /^[A-Za-z0-9!#$%&'*+.^_|~-]+$/
|
||||
if (!protocols.every(function (val) { return validProto.test(val) })) {
|
||||
throw new TypeError('invalid WebSocket subprotocol name')
|
||||
}
|
||||
const proto = protocols.length > 0 ? protocols.join(', ') : null
|
||||
|
||||
const self = this
|
||||
const state = {
|
||||
url: url,
|
||||
readyState: CONNECTING,
|
||||
extensions: '',
|
||||
protocol: '',
|
||||
onopen: null,
|
||||
onerror: null,
|
||||
onclose: null,
|
||||
onmessage: null,
|
||||
wsi: null,
|
||||
inbuf: [],
|
||||
outbuf: [],
|
||||
closeEvent: {
|
||||
type: 'close',
|
||||
code: 1005,
|
||||
reason: '',
|
||||
wasClean: false
|
||||
},
|
||||
open: function () {
|
||||
if (state.readyState === CONNECTING) {
|
||||
state.readyState = OPEN
|
||||
if (state.onopen) {
|
||||
state.onopen.call(self, { type: 'open' })
|
||||
}
|
||||
}
|
||||
},
|
||||
error: function (e) {
|
||||
if (state.readyState !== CLOSED) {
|
||||
state.closeEvent.code = 1006
|
||||
state.closeEvent.reason = String(e)
|
||||
state.readyState = CLOSED
|
||||
try {
|
||||
if (state.onerror) {
|
||||
state.onerror.call(self, { type: 'error' })
|
||||
}
|
||||
} finally {
|
||||
if (state.onclose) {
|
||||
state.onclose.call(self, Object.assign({}, state.closeEvent))
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
close: function () {
|
||||
if (state.readyState !== CLOSED) {
|
||||
state.closeEvent.wasClean = true
|
||||
state.readyState = CLOSED
|
||||
if (state.onclose) {
|
||||
state.onclose.call(self, Object.assign({}, state.closeEvent))
|
||||
}
|
||||
}
|
||||
},
|
||||
message: function (binary) {
|
||||
if (state.inbuf.length > 0) {
|
||||
const msg = state.inbuf.length === 1
|
||||
? state.inbuf[0]
|
||||
: arrayBufferJoin(state.inbuf)
|
||||
state.inbuf = []
|
||||
if (state.readyState === OPEN && state.onmessage) {
|
||||
state.onmessage.call(self, {
|
||||
type: 'messasge',
|
||||
data: binary ? msg : lws.decode_utf8(msg)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this._wsState = state
|
||||
|
||||
os.setTimeout(function () {
|
||||
try {
|
||||
context.client_connect(
|
||||
address, port, secure, path, host, null, proto, state
|
||||
)
|
||||
} catch (e) {
|
||||
state.error(e)
|
||||
}
|
||||
}, 0)
|
||||
}
|
||||
|
||||
const readyStateConstants = {
|
||||
CONNECTING: { value: CONNECTING },
|
||||
OPEN: { value: OPEN },
|
||||
CLOSING: { value: CLOSING },
|
||||
CLOSED: { value: CLOSED }
|
||||
}
|
||||
|
||||
Object.defineProperties(WebSocket, readyStateConstants)
|
||||
Object.defineProperties(WebSocket.prototype, readyStateConstants)
|
||||
|
||||
function checkNullOrFunction (val) {
|
||||
if (val !== null && typeof val !== 'function') {
|
||||
throw new TypeError('null or Function expected')
|
||||
}
|
||||
}
|
||||
|
||||
Object.defineProperties(WebSocket.prototype, {
|
||||
url: { get: function () { return this._wsState.url } },
|
||||
readyState: { get: function () { return this._wsState.readyState & 0xf } },
|
||||
extensions: { get: function () { return this._wsState.extensions } },
|
||||
protocol: { get: function () { return this._wsState.protocol } },
|
||||
bufferedAmount: {
|
||||
get: function () {
|
||||
return this._wsState.outbuf.reduce(function (acc, val) {
|
||||
if (val instanceof ArrayBuffer) {
|
||||
acc += val.byteLength
|
||||
} else if (typeof val === 'string') {
|
||||
acc += val.length
|
||||
}
|
||||
return acc
|
||||
}, 0)
|
||||
}
|
||||
},
|
||||
binaryType: {
|
||||
get: function () { return 'arraybuffer' },
|
||||
set: function (val) {
|
||||
if (val !== 'arraybuffer') {
|
||||
throw new TypeError('only "arraybuffer" allowed for "binaryType"')
|
||||
}
|
||||
}
|
||||
},
|
||||
onopen: {
|
||||
get: function () { return this._wsState.onopen },
|
||||
set: function (val) {
|
||||
checkNullOrFunction(val)
|
||||
this._wsState.onopen = val
|
||||
}
|
||||
},
|
||||
onerror: {
|
||||
get: function () { return this._wsState.onerror },
|
||||
set: function (val) {
|
||||
checkNullOrFunction(val)
|
||||
this._wsState.onerror = val
|
||||
}
|
||||
},
|
||||
onclose: {
|
||||
get: function () { return this._wsState.onclose },
|
||||
set: function (val) {
|
||||
checkNullOrFunction(val)
|
||||
this._wsState.onclose = val
|
||||
}
|
||||
},
|
||||
onmessage: {
|
||||
get: function () { return this._wsState.onmessage },
|
||||
set: function (val) {
|
||||
checkNullOrFunction(val)
|
||||
this._wsState.onmessage = val
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
WebSocket.prototype.close = function (code, reason) {
|
||||
if (code !== undefined) {
|
||||
code = Math.trunc(code)
|
||||
reason = reason === undefined ? '' : String(reason)
|
||||
if (code !== 1000 && !(code >= 3000 && code <= 4999)) {
|
||||
throw new RangeError('code must be 1000 or between 3000 and 4999')
|
||||
}
|
||||
}
|
||||
const state = this._wsState
|
||||
if (state.readyState === OPEN) {
|
||||
if (code !== undefined) {
|
||||
state.wsi.close_reason(code, reason)
|
||||
state.closeEvent.code = code
|
||||
state.closeEvent.reason = reason
|
||||
}
|
||||
state.readyState = CLOSING1
|
||||
state.outbuf.push(null)
|
||||
state.wsi.callback_on_writable()
|
||||
} else if (state.readyState === CONNECTING) {
|
||||
state.readyState = CLOSING2
|
||||
}
|
||||
}
|
||||
|
||||
WebSocket.prototype.send = function (msg) {
|
||||
const state = this._wsState
|
||||
if (state.readyState === CONNECTING) {
|
||||
throw new TypeError('send() not allowed in CONNECTING state')
|
||||
}
|
||||
if (msg instanceof ArrayBuffer) {
|
||||
state.outbuf.push(msg.slice(0))
|
||||
} else if (ArrayBuffer.isView(msg)) {
|
||||
state.outbuf.push(
|
||||
msg.buffer.slice(msg.byteOffset, msg.byteOffset + msg.byteLength)
|
||||
)
|
||||
} else {
|
||||
state.outbuf.push(String(msg))
|
||||
}
|
||||
if (state.readyState === OPEN) {
|
||||
state.wsi.callback_on_writable()
|
||||
}
|
||||
}
|
||||
@@ -5,14 +5,14 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=rulengd
|
||||
PKG_VERSION:=1.2.3
|
||||
PKG_VERSION:=1.2.4
|
||||
PKG_RELEASE:=1
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
PKG_INSTALL:=1
|
||||
|
||||
PKG_SOURCE_PROTO=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/rulengd.git
|
||||
PKG_SOURCE_VERSION:=f5ded45562189a05f3912182d708bcb1427912f8
|
||||
PKG_SOURCE_VERSION:=070a9778c2511a6f52a15904e29350aed69abdac
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
PKG_SOURCE_SUBDIR:=${PKG_NAME}-${PKG_VERSION}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=sulu
|
||||
PKG_VERSION:=0.2.20
|
||||
PKG_VERSION:=0.2.21
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/sulu.git
|
||||
|
||||
@@ -9,45 +9,9 @@ log() {
|
||||
echo "${@}"|logger -t sulu.init -p debug
|
||||
}
|
||||
|
||||
publish_endpoint() {
|
||||
local AgentEndpointID serial oui user pass
|
||||
local opt=""
|
||||
|
||||
# return if mosquitto_pub is not present
|
||||
if ! which mosquitto_pub; then
|
||||
log "mosquitto_pub not present can't publish endpointid"
|
||||
return 0;
|
||||
fi
|
||||
|
||||
ubus -t 10 wait_for usp.raw
|
||||
|
||||
# Get endpoint id from obuspa config first
|
||||
config_load obuspa
|
||||
config_get AgentEndpointID localagent EndpointID ""
|
||||
if [ -z "${AgentEndpointID}" ]; then
|
||||
serial=$(ubus -t 1 call usp.raw get '{"path":"Device.DeviceInfo.SerialNumber"}'|jsonfilter -e '@["parameters"][0].value')
|
||||
oui=$(ubus -t 1 call usp.raw get '{"path":"Device.DeviceInfo.ManufacturerOUI"}'|jsonfilter -e '@["parameters"][0].value')
|
||||
AgentEndpointID="os::${oui}-${serial}"
|
||||
fi
|
||||
|
||||
config_get user localmqtt Username
|
||||
if [ -n "${user}" ]; then
|
||||
opt="-u ${user}"
|
||||
fi
|
||||
config_get pass localmqtt Password
|
||||
if [ -n "${pass}" ]; then
|
||||
opt="${opt} -P ${pass}"
|
||||
fi
|
||||
|
||||
# publish Agent's EndpointID in mosquito broker for discovery
|
||||
# This is a work around till obuspa does not support advertising
|
||||
log "Publishing EndpointID ${AgentEndpointID} to local mqtt broker"
|
||||
mosquitto_pub -r -t "obuspa/EndpointID" -m "${AgentEndpointID}" ${opt}
|
||||
}
|
||||
|
||||
start_service() {
|
||||
procd_open_instance sulu
|
||||
publish_endpoint
|
||||
# append sulu connection injection
|
||||
procd_close_instance
|
||||
|
||||
}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
# proxy required for nginx to save the file
|
||||
location /upload_proxy {
|
||||
return 200 "File upload is successful \n";
|
||||
}
|
||||
|
||||
location /upload {
|
||||
limit_except POST { deny all; }
|
||||
client_body_temp_path /tmp/sulu; # the directory to which uploads will be saved, make sure to create the directory you wish to use
|
||||
client_body_in_file_only on;
|
||||
client_body_buffer_size 128K;
|
||||
client_max_body_size 50M;
|
||||
proxy_pass_request_headers on;
|
||||
proxy_set_header X-FILE $request_body_file;
|
||||
proxy_set_body $request_body_file;
|
||||
proxy_redirect off;
|
||||
#proxy_pass is necessary. body is only stored when being passed to middleware, so we are providing a proxy that just returns 200.
|
||||
proxy_pass http://127.0.0.1:8080/upload_proxy;
|
||||
}
|
||||
@@ -5,6 +5,5 @@ uci -q get nginx._sulu && exit 0
|
||||
uci -q set nginx._sulu=server
|
||||
uci -q add_list nginx._sulu.listen='8080'
|
||||
uci -q add_list nginx._sulu.listen='[::]:8080'
|
||||
uci -q add_list nginx._sulu.include='conf.d/sulu.locations'
|
||||
uci -q set nginx._sulu.root='/sulu'
|
||||
uci -q set nginx._sulu.server_name='_sulu'
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=swmodd
|
||||
PKG_VERSION:=2.0.11
|
||||
PKG_VERSION:=2.0.15
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=6e30dfc3582b3a52a786b1177bc5d070a4bdc178
|
||||
PKG_SOURCE_VERSION:=39e711d51eed6d6268b18011cf7c40fc71eb332e
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/swmodd.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
@@ -26,7 +26,7 @@ define Package/swmodd
|
||||
CATEGORY:=Utilities
|
||||
SUBMENU:=TRx69
|
||||
TITLE:= Software Modules Daemon
|
||||
DEPENDS:=+libuci +libubox +ubus +libuuid +libbbf_api +opkg \
|
||||
DEPENDS:=+libuci +libubox +ubus +libuuid +libbbf_api +opkg +libcurl \
|
||||
+PACKAGE_liblxc:liblxc +PACKAGE_liblxc:cgroupfs-mount \
|
||||
+@BUSYBOX_CONFIG_BUSYBOX +@BUSYBOX_CONFIG_FEATURE_SHOW_SCRIPT
|
||||
endef
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=uspd
|
||||
PKG_VERSION:=2.1.37
|
||||
PKG_VERSION:=2.1.39
|
||||
|
||||
LOCAL_DEV:=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=14347b98036c21cb5b775e33762a96354bcfef44
|
||||
PKG_SOURCE_VERSION:=718d0b24529d94b7bec09b6ffc6c3f84073d7bde
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/uspd.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
|
||||
@@ -2,4 +2,3 @@ config uspd 'usp'
|
||||
option granularitylevel '0'
|
||||
option debug '0'
|
||||
option loglevel '1'
|
||||
option bbf_caching_time '5'
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=wfadatad
|
||||
PKG_VERSION:=5.0.5
|
||||
PKG_VERSION:=6.10.0
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=988a20b25f90a9095b0d4e168b4c471fa556a83e
|
||||
PKG_SOURCE_VERSION:=74aa2efe7f3f835e02cab1f8965afabd918b1477
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/wfadatad.git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
|
||||
PKG_MIRROR_HASH:=skip
|
||||
@@ -25,19 +25,25 @@ include $(INCLUDE_DIR)/package.mk
|
||||
define Package/wfadatad
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=WiFi Data Elements-1.0 Agent and Collector
|
||||
TITLE:=WiFi DataElements Agent
|
||||
DEPENDS:=+libwifi +libuci +libubox +ubus +libpthread +libnl-genl \
|
||||
+!WFA_DELM_STANDALONE:map-agent +libieee1905 +map-plugin
|
||||
endef
|
||||
|
||||
define Package/wfadatad/description
|
||||
This package implements WiFi Alliance's Data Elements v.1.0.
|
||||
It collects WiFi network's diagnostic data and reports them
|
||||
to the Data Elements Collector.
|
||||
In Data Elements Agent mode, the package by default is built
|
||||
as a loadable plugin module to the MultiAP Agent.
|
||||
The package can also be built as a standalone daemon running
|
||||
independently of a MultiAP Agent.
|
||||
This package implements WiFi DataElements Agent.
|
||||
endef
|
||||
|
||||
define Package/wfadatad-collector
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
TITLE:=WiFi DataElements Collector
|
||||
DEPENDS:=+libuci +libubox +ubus +libpthread +libnl-genl \
|
||||
+libieee1905 +map-plugin
|
||||
endef
|
||||
|
||||
define Package/wfadatad-collector/description
|
||||
It implements WiFi DataElement Collector.
|
||||
endef
|
||||
|
||||
|
||||
@@ -45,7 +51,6 @@ define Package/wfadatad/config
|
||||
source "$(SOURCE)/Config.in"
|
||||
endef
|
||||
|
||||
|
||||
ifeq ($(CONFIG_WFA_DELM_STANDALONE),y)
|
||||
MAKE_FLAGS += CONFIG_WFA_DELM_STANDALONE=y
|
||||
endif
|
||||
@@ -63,12 +68,26 @@ define Package/wfadatad/install
|
||||
ifeq ($(CONFIG_WFA_DELM_STANDALONE),y)
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) ./files/wfadatad.init $(1)/etc/init.d/wfadatad
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/wfadatad $(1)/usr/sbin/
|
||||
$(INSTALL_BIN) ./files/wfadatad.init $(1)/etc/init.d/
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/agent/deagent $(1)/usr/sbin/
|
||||
else
|
||||
$(INSTALL_DIR) $(1)/usr/lib/map-plugins
|
||||
$(CP) $(PKG_BUILD_DIR)/src/wfa_delm.so $(1)/usr/lib/map-plugins
|
||||
$(CP) $(PKG_BUILD_DIR)/src/agent/deagent.so $(1)/usr/lib/map-plugins
|
||||
endif
|
||||
endef
|
||||
|
||||
define Package/wfadatad-collector/install
|
||||
|
||||
ifeq ($(CONFIG_WFA_DELM_STANDALONE),y)
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) ./files/wfadatad.collector.init $(1)/etc/init.d/
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/collector/decollector $(1)/usr/sbin/
|
||||
else
|
||||
$(INSTALL_DIR) $(1)/usr/lib/map-plugins
|
||||
$(CP) $(PKG_BUILD_DIR)/src/collector/decollector.so $(1)/usr/lib/map-plugins
|
||||
endif
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,wfadatad))
|
||||
$(eval $(call BuildPackage,wfadatad-collector))
|
||||
|
||||
39
wfadatad/files/wfadatad.collector.init
Normal file
39
wfadatad/files/wfadatad.collector.init
Normal file
@@ -0,0 +1,39 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=98
|
||||
STOP=11
|
||||
|
||||
USE_PROCD=1
|
||||
PROG=/usr/sbin/decollector
|
||||
|
||||
service_running() {
|
||||
ubus -t 2 wait_for ieee1905 ieee1905.map
|
||||
}
|
||||
|
||||
start_service() {
|
||||
sleep 3
|
||||
[ -e "/etc/config/mapcontroller" ] && {
|
||||
local en
|
||||
|
||||
config_load mapcontroller
|
||||
config_get en controller enabled "0"
|
||||
|
||||
[ $en -gt 0 ] && {
|
||||
procd_open_instance
|
||||
procd_set_param command "$PROG" "-d"
|
||||
#procd_set_param stdout 1
|
||||
#procd_set_param stderr 1
|
||||
procd_close_instance
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
stop
|
||||
start
|
||||
}
|
||||
|
||||
service_triggers()
|
||||
{
|
||||
procd_add_reload_trigger mapcontroller
|
||||
}
|
||||
@@ -4,30 +4,19 @@ START=98
|
||||
STOP=11
|
||||
|
||||
USE_PROCD=1
|
||||
PROG=/usr/sbin/wfadatad
|
||||
PROG=/usr/sbin/deagent
|
||||
|
||||
service_running() {
|
||||
ubus -t 2 wait_for ieee1905 ieee1905.map
|
||||
ubus -t 2 wait_for wifi ieee1905 ieee1905.map
|
||||
}
|
||||
|
||||
start_service() {
|
||||
procd_open_instance
|
||||
procd_set_param command "$PROG" "-d" "-t 15"
|
||||
procd_set_param command "$PROG" "-d" "-t 10"
|
||||
#procd_set_param stdout 1
|
||||
#procd_set_param stderr 1
|
||||
#procd_set_param respawn
|
||||
procd_close_instance
|
||||
|
||||
[ -e "/etc/config/mapcontroller" ] && {
|
||||
local en
|
||||
|
||||
config_load mapcontroller
|
||||
config_get en controller enabled "0"
|
||||
|
||||
[ $en -gt 0 ] && {
|
||||
procd_open_instance
|
||||
procd_set_param command "$PROG" "-d -C"
|
||||
procd_close_instance
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=wifimngr
|
||||
PKG_VERSION:=14.0.0
|
||||
PKG_VERSION:=14.0.3
|
||||
|
||||
LOCAL_DEV=0
|
||||
ifneq ($(LOCAL_DEV),1)
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_VERSION:=04b6b7d52f810bf3b1ff59fe6e26e02f2ae3b088
|
||||
PKG_SOURCE_VERSION:=0b8fe7e672e5e14519121ccba9a61591d5ea16b4
|
||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/wifimngr.git
|
||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||
|
||||
Reference in New Issue
Block a user