mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2026-01-07 23:08:47 +08:00
Compare commits
1 Commits
add_libblo
...
wps
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1882e6f8ad |
78
ated/Makefile
Normal file
78
ated/Makefile
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2019 iopsys Software Solutions AB. All rights reserved.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License
|
||||||
|
# version 2 as published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# General Public License for more details.
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
include $(INCLUDE_DIR)/kernel.mk
|
||||||
|
|
||||||
|
PKG_NAME:=ated
|
||||||
|
PKG_VERSION:=1.2.2
|
||||||
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
|
PKG_SOURCE_VERSION:=f614cba983d827d5185c60a6a5a35530621d44d2
|
||||||
|
PKG_SOURCE_PROTO:=git
|
||||||
|
PKG_SOURCE_URL:=https://dev.iopsys.eu/mediatek/ated.git
|
||||||
|
|
||||||
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)-$(PKG_SOURCE_VERSION).tar.gz
|
||||||
|
PKG_MIRROR_HASH:=skip
|
||||||
|
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||||
|
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||||
|
|
||||||
|
PKG_LICENSE:=GPLv2
|
||||||
|
PKG_LICENSE_FILES:=LICENSE
|
||||||
|
|
||||||
|
# support parallel build
|
||||||
|
#PKG_BUILD_PARALLEL:=1
|
||||||
|
|
||||||
|
#re create configure scripts if not present.
|
||||||
|
#PKG_FIXUP:=autoreconf
|
||||||
|
|
||||||
|
# run install target when cross compiling. basically, make install DESTDIR=$(PKG_INSTALL_DIR)
|
||||||
|
# this way we don't need to pick out the resulting files from the build dir.
|
||||||
|
PKG_INSTALL:=1
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
|
define Package/ated
|
||||||
|
CATEGORY:=Utilities
|
||||||
|
TITLE:=Daemon for handling wifi calibration
|
||||||
|
URL:=
|
||||||
|
DEPENDS:= libc
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/ated/description
|
||||||
|
Daemon for handling wifi calibration
|
||||||
|
endef
|
||||||
|
|
||||||
|
#TARGET_CFLAGS += -I$(LINUX_DIR)/include -I$(LINUX_DIR)/arch/mips/include
|
||||||
|
|
||||||
|
MAKE_FLAGS += \
|
||||||
|
v=2 \
|
||||||
|
m=3
|
||||||
|
|
||||||
|
|
||||||
|
#TARGET_CPPFLAGS := \
|
||||||
|
# -I$(STAGING_DIR)/usr/include/bcm963xx/shared/opensource/include/bcm963xx \
|
||||||
|
# -I$(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx \
|
||||||
|
# $(TARGET_CPPFLAGS)
|
||||||
|
|
||||||
|
# we donot wwant to have any install.
|
||||||
|
define Build/Install/Default
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/ated/install
|
||||||
|
$(INSTALL_DIR) $(1)/sbin
|
||||||
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/ated $(1)/sbin/
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call BuildPackage,ated))
|
||||||
@@ -1,35 +1,19 @@
|
|||||||
config BBF_VENDOR_EXTENSION
|
if PACKAGE_libbbfdm
|
||||||
bool "Enable Vendor Extension"
|
|
||||||
|
config LIBBBFDM_VENDOR_PREFIX
|
||||||
|
string "Vendor Prefix"
|
||||||
|
default "X_IOPSYS_EU_"
|
||||||
|
|
||||||
|
config BBF_TR181
|
||||||
|
bool "Compile with tr181 device features"
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config BBF_VENDOR_LIST
|
|
||||||
string "Vendor List"
|
|
||||||
default "iopsys"
|
|
||||||
|
|
||||||
config BBF_VENDOR_PREFIX
|
|
||||||
string "Vendor Prefix"
|
|
||||||
default "X_IOPSYS_EU_"
|
|
||||||
|
|
||||||
config BBF_TR104
|
config BBF_TR104
|
||||||
bool "Enable TR-104 Data Model Support"
|
bool "Compile with tr104 voice features"
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config BBF_TR143
|
config BBF_TR143
|
||||||
bool "Enable TR-143 Data Model Support"
|
bool "Compile with tr143 diagnostics features"
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config BBF_TR471
|
endif
|
||||||
bool "Enable TR-471 Data Model Support"
|
|
||||||
default y
|
|
||||||
|
|
||||||
config BBFDM_ENABLE_JSON_PLUGIN
|
|
||||||
bool "Enable json plugin to extend datamodel"
|
|
||||||
default y
|
|
||||||
|
|
||||||
config BBFDM_ENABLE_DOTSO_PLUGIN
|
|
||||||
bool "Enable shared library plugin to extend datamodel"
|
|
||||||
default y
|
|
||||||
|
|
||||||
config BBF_MAX_OBJECT_INSTANCES
|
|
||||||
int "Maximum number of instances per object"
|
|
||||||
default 255
|
|
||||||
|
|||||||
189
bbf/Makefile
189
bbf/Makefile
@@ -1,82 +1,39 @@
|
|||||||
#
|
#
|
||||||
# Copyright (C) 2022 IOPSYS
|
# Copyright (C) 2021 IOPSYS
|
||||||
#
|
#
|
||||||
|
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=libbbfdm
|
PKG_NAME:=libbbfdm
|
||||||
PKG_VERSION:=6.8.49
|
PKG_VERSION:=3.7.9
|
||||||
|
PKG_FIXUP:=autoreconf
|
||||||
PKG_SOURCE_PROTO:=git
|
|
||||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/bbf.git
|
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/bbf.git
|
||||||
PKG_SOURCE_VERSION:=87ae46df8b4e221b8894fd861d2eb785ae1f3bf3
|
PKG_SOURCE_PROTO:=git
|
||||||
|
PKG_SOURCE_VERSION:=3b44e4430ad4ca5735647dd69bc30d0e56218850
|
||||||
|
PKG_RELEASE=$(PKG_SOURCE_VERSION)
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||||
PKG_MIRROR_HASH:=skip
|
PKG_MIRROR_HASH:=skip
|
||||||
|
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||||
|
|
||||||
PKG_RELEASE=$(PKG_SOURCE_VERSION)
|
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||||
|
|
||||||
PKG_LICENSE:=LGPL-2.1
|
PKG_LICENSE:=LGPL-2.1
|
||||||
PKG_LICENSE_FILES:=LICENSE
|
PKG_LICENSE_FILES:=LICENSE
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
include $(INCLUDE_DIR)/cmake.mk
|
|
||||||
|
|
||||||
define Package/libbbf_api
|
define Package/libbbf_api
|
||||||
SECTION:=utils
|
SECTION:=libs
|
||||||
CATEGORY:=Utilities
|
CATEGORY:=Libraries
|
||||||
SUBMENU:=TRx69
|
TITLE:=Library for libbbfdm API
|
||||||
TITLE:=BBF datamodel library, provides API to extend datamodel using DotSO plugins
|
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libjson-c
|
||||||
ABI_VERSION:=1.0
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/libbbfdm/default
|
|
||||||
SECTION:=utils
|
|
||||||
CATEGORY:=Utilities
|
|
||||||
SUBMENU:=TRx69
|
|
||||||
TITLE:=Library for broadband forum data model support
|
|
||||||
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libjson-c +libcurl +libbbf_api \
|
|
||||||
+BBF_TR471:obudpst
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/libbbfdm
|
define Package/libbbfdm
|
||||||
$(Package/libbbfdm/default)
|
SECTION:=libs
|
||||||
TITLE += (internal)
|
CATEGORY:=Libraries
|
||||||
VARIANT:=internal
|
TITLE:=Library for broadband-forum data model
|
||||||
endef
|
DEPENDS:=+libuci +libubox +libubus +libblobmsg-json +libjson-c +libtrace +libbbf_api +libopenssl +libmbedtls +libcurl
|
||||||
|
|
||||||
define Package/libbbfdm-mbedtls
|
|
||||||
$(Package/libbbfdm/default)
|
|
||||||
TITLE += (mbedtls)
|
|
||||||
DEPENDS += +PACKAGE_libbbfdm-mbedtls:libmbedtls
|
|
||||||
VARIANT:=mbedtls
|
|
||||||
DEFAULT_VARIANT:=1
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/libbbfdm-openssl
|
|
||||||
$(Package/libbbfdm/default)
|
|
||||||
TITLE += (openssl)
|
|
||||||
DEPENDS += +PACKAGE_libbbfdm-openssl:libopenssl
|
|
||||||
CONFLICTS := libbbfdm-mbedtls
|
|
||||||
VARIANT:=openssl
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/libbbfdm-wolfssl
|
|
||||||
$(Package/libbbfdm/default)
|
|
||||||
TITLE += (wolfssl)
|
|
||||||
DEPENDS += +PACKAGE_libbbfdm-wolfssl:libwolfssl
|
|
||||||
CONFLICTS := libbbfdm-mbedtls libbbfdm-openssl
|
|
||||||
VARIANT:=wolfssl
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/userinterface
|
|
||||||
SECTION:=utils
|
|
||||||
CATEGORY:=Utilities
|
|
||||||
SUBMENU:=TRx69
|
|
||||||
TITLE:=Package to add Device.UserInterface. datamodel support
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/userinterface/description
|
|
||||||
Package to add Device.UserInterface. datamodel support using libbbf JSON Plugin
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/libbbfdm/config
|
define Package/libbbfdm/config
|
||||||
@@ -98,116 +55,66 @@ define Build/Prepare
|
|||||||
endef
|
endef
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CMAKE_OPTIONS += \
|
TARGET_CFLAGS += -DCUSTOM_PREFIX=\\\"$(CONFIG_LIBBBFDM_VENDOR_PREFIX)\\\"
|
||||||
-DBBF_TR181=ON
|
|
||||||
|
TARGET_CFLAGS += \
|
||||||
|
-D_GNU_SOURCE -D_AADJ
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_BBF_TR181),y)
|
||||||
|
CONFIGURE_ARGS += \
|
||||||
|
--enable-tr181
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_BBF_TR104),y)
|
ifeq ($(CONFIG_BBF_TR104),y)
|
||||||
CMAKE_OPTIONS += \
|
CONFIGURE_ARGS += \
|
||||||
-DBBF_TR104=ON
|
--enable-tr104
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_BBF_TR143),y)
|
ifeq ($(CONFIG_BBF_TR143),y)
|
||||||
CMAKE_OPTIONS += \
|
CONFIGURE_ARGS += \
|
||||||
-DBBF_TR143=ON
|
--enable-tr143
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_BBF_TR471),y)
|
ifeq ($(CONFIG_PACKAGE_libopenssl),y)
|
||||||
CMAKE_OPTIONS += \
|
CONFIGURE_ARGS += \
|
||||||
-DBBF_TR471=ON
|
--enable-libopenssl
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_BBF_VENDOR_EXTENSION),y)
|
ifeq ($(CONFIG_PACKAGE_libmbedtls),y)
|
||||||
CMAKE_OPTIONS += \
|
CONFIGURE_ARGS += \
|
||||||
-DBBF_VENDOR_EXTENSION=ON
|
--enable-libmbedtls
|
||||||
|
|
||||||
CMAKE_OPTIONS += \
|
|
||||||
-DBBF_VENDOR_LIST:String="$(CONFIG_BBF_VENDOR_LIST)" \
|
|
||||||
-DBBF_VENDOR_PREFIX:String="$(CONFIG_BBF_VENDOR_PREFIX)" \
|
|
||||||
-DBBF_MAX_OBJECT_INSTANCES:Integer=$(CONFIG_BBF_MAX_OBJECT_INSTANCES)
|
|
||||||
|
|
||||||
endif ##CONFIG_BBF_VENDOR_EXTENSION
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_BBFDM_ENABLE_JSON_PLUGIN),y)
|
|
||||||
CMAKE_OPTIONS += \
|
|
||||||
-DBBF_JSON_PLUGIN=ON
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_BBFDM_ENABLE_DOTSO_PLUGIN),y)
|
|
||||||
CMAKE_OPTIONS += \
|
|
||||||
-DBBF_DOTSO_PLUGIN=ON
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(BUILD_VARIANT),openssl)
|
|
||||||
CMAKE_OPTIONS += -DWITH_OPENSSL=ON
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(BUILD_VARIANT),wolfssl)
|
|
||||||
CMAKE_OPTIONS += -DWITH_WOLFSSL=ON
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(BUILD_VARIANT),mbedtls)
|
|
||||||
CMAKE_OPTIONS += -DWITH_MBEDTLS=ON
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
define Package/libbbf_api/install
|
define Package/libbbf_api/install
|
||||||
$(INSTALL_DIR) $(1)/lib
|
$(INSTALL_DIR) $(1)/lib
|
||||||
|
$(CP) $(PKG_BUILD_DIR)/bin/.libs/libbbf_api.so* $(1)/lib/
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/libbbfdm/default/install
|
define Package/libbbfdm/install
|
||||||
$(INSTALL_DIR) $(1)/lib
|
$(INSTALL_DIR) $(1)/lib
|
||||||
$(INSTALL_DIR) $(1)/etc/bbfdm
|
$(CP) $(PKG_BUILD_DIR)/bin/.libs/libbbfdm.so* $(1)/lib/
|
||||||
$(INSTALL_DIR) $(1)/etc/bbfdm/dmmap
|
|
||||||
$(INSTALL_DIR) $(1)/etc/bbfdm/json
|
|
||||||
$(INSTALL_DIR) $(1)/usr/share/bbfdm
|
$(INSTALL_DIR) $(1)/usr/share/bbfdm
|
||||||
|
$(CP) $(PKG_BUILD_DIR)/scripts/functions $(1)/usr/share/bbfdm
|
||||||
|
$(INSTALL_DIR) $(1)/etc/bbfdm
|
||||||
|
$(INSTALL_DIR) $(1)/etc/bbfdm/json
|
||||||
$(INSTALL_DIR) $(1)/usr/lib/bbfdm
|
$(INSTALL_DIR) $(1)/usr/lib/bbfdm
|
||||||
$(INSTALL_DIR) $(1)/usr/libexec/rpcd
|
|
||||||
$(INSTALL_DIR) $(1)/lib/upgrade/keep.d
|
|
||||||
$(CP) $(PKG_BUILD_DIR)/libbbfdm.so $(1)/lib/
|
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/* $(1)/usr/share/bbfdm
|
|
||||||
$(LN) /usr/share/bbfdm/bbf.diag $(1)/usr/libexec/rpcd/bbf.diag
|
|
||||||
$(INSTALL_DATA) ./files/lib/upgrade/keep.d/bbf $(1)/lib/upgrade/keep.d/bbf
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/libbbfdm/default/prerm
|
define Package/libbbfdm/prerm
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
rm -rf /etc/bbfdm/dmmap/*
|
rm -rf /etc/bbfdm/*
|
||||||
exit 0
|
exit 0
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/userinterface/install
|
|
||||||
$(INSTALL_DIR) $(1)/etc/bbfdm/json
|
|
||||||
$(INSTALL_DIR) $(1)/etc/config
|
|
||||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
|
||||||
$(INSTALL_DIR) $(1)/etc/init.d
|
|
||||||
$(INSTALL_DATA) ./files/etc/bbfdm/json/UserInterface.json $(1)/etc/bbfdm/json/
|
|
||||||
$(INSTALL_DATA) ./files/etc/config/userinterface $(1)/etc/config/userinterface
|
|
||||||
$(INSTALL_BIN) ./files/etc/init.d/userinterface $(1)/etc/init.d/userinterface
|
|
||||||
$(INSTALL_BIN) ./files/etc/uci-defaults/93-userinterface-firewall $(1)/etc/uci-defaults/93-userinterface-firewall
|
|
||||||
$(INSTALL_BIN) ./files/etc/firewall.userinterface $(1)/etc/firewall.userinterface
|
|
||||||
endef
|
|
||||||
|
|
||||||
Package/libbbfdm-openssl/prerm = $(Package/libbbfdm/default/prerm)
|
|
||||||
Package/libbbfdm-wolfssl/prerm = $(Package/libbbfdm/default/prerm)
|
|
||||||
Package/libbbfdm-mbedtls/prerm = $(Package/libbbfdm/default/prerm)
|
|
||||||
|
|
||||||
Package/libbbfdm-openssl/install = $(Package/libbbfdm/default/install)
|
|
||||||
Package/libbbfdm-wolfssl/install = $(Package/libbbfdm/default/install)
|
|
||||||
Package/libbbfdm-mbedtls/install = $(Package/libbbfdm/default/install)
|
|
||||||
|
|
||||||
define Build/InstallDev
|
define Build/InstallDev
|
||||||
$(INSTALL_DIR) $(1)/usr/lib
|
|
||||||
$(INSTALL_DIR) $(1)/usr/include
|
|
||||||
$(INSTALL_DIR) $(1)/usr/include/libbbfdm
|
$(INSTALL_DIR) $(1)/usr/include/libbbfdm
|
||||||
$(INSTALL_DIR) $(1)/usr/include/libbbf_api
|
$(INSTALL_DIR) $(1)/usr/include/libbbf_api
|
||||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/include/*.h $(1)/usr/include/
|
$(CP) $(PKG_BUILD_DIR)/*.h $(1)/usr/include/libbbfdm/
|
||||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/*.h $(1)/usr/include/libbbfdm/
|
$(CP) $(PKG_BUILD_DIR)/libbbf_api/*.h $(1)/usr/include/libbbf_api/
|
||||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/libbbf_api/*.h $(1)/usr/include/libbbf_api/
|
$(INSTALL_DIR) $(1)/usr/lib
|
||||||
$(CP) $(PKG_BUILD_DIR)/libbbfdm.so $(1)/usr/lib/
|
$(CP) $(PKG_BUILD_DIR)/bin/.libs/libbbfdm.{a,so*} $(1)/usr/lib/
|
||||||
|
$(CP) $(PKG_BUILD_DIR)/bin/.libs/libbbf_api.{a,so*} $(1)/usr/lib/
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage,userinterface))
|
|
||||||
$(eval $(call BuildPackage,libbbf_api))
|
$(eval $(call BuildPackage,libbbf_api))
|
||||||
$(eval $(call BuildPackage,libbbfdm))
|
$(eval $(call BuildPackage,libbbfdm))
|
||||||
$(eval $(call BuildPackage,libbbfdm-openssl))
|
|
||||||
$(eval $(call BuildPackage,libbbfdm-wolfssl))
|
|
||||||
$(eval $(call BuildPackage,libbbfdm-mbedtls))
|
|
||||||
|
|||||||
@@ -1,117 +0,0 @@
|
|||||||
{
|
|
||||||
"Device.UserInterface.": {
|
|
||||||
"type": "object",
|
|
||||||
"version": "2.0",
|
|
||||||
"protocols": [
|
|
||||||
"cwmp",
|
|
||||||
"usp"
|
|
||||||
],
|
|
||||||
"access": false,
|
|
||||||
"array": false,
|
|
||||||
"Device.UserInterface.RemoteAccess.": {
|
|
||||||
"type": "object",
|
|
||||||
"version": "2.0",
|
|
||||||
"protocols": [
|
|
||||||
"cwmp",
|
|
||||||
"usp"
|
|
||||||
],
|
|
||||||
"access": false,
|
|
||||||
"array": false,
|
|
||||||
"Enable": {
|
|
||||||
"type": "boolean",
|
|
||||||
"read": true,
|
|
||||||
"write": true,
|
|
||||||
"version": "2.0",
|
|
||||||
"protocols": [
|
|
||||||
"cwmp",
|
|
||||||
"usp"
|
|
||||||
],
|
|
||||||
"mapping": [
|
|
||||||
{
|
|
||||||
"type": "uci",
|
|
||||||
"uci": {
|
|
||||||
"file": "userinterface",
|
|
||||||
"section": {
|
|
||||||
"name": "remote_access"
|
|
||||||
},
|
|
||||||
"option": {
|
|
||||||
"name": "enable"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Port": {
|
|
||||||
"type": "unsignedInt",
|
|
||||||
"read": true,
|
|
||||||
"write": true,
|
|
||||||
"version": "2.0",
|
|
||||||
"protocols": [
|
|
||||||
"cwmp",
|
|
||||||
"usp"
|
|
||||||
],
|
|
||||||
"range": [
|
|
||||||
{
|
|
||||||
"max": 65535
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"mapping": [
|
|
||||||
{
|
|
||||||
"type": "uci",
|
|
||||||
"uci": {
|
|
||||||
"file": "userinterface",
|
|
||||||
"section": {
|
|
||||||
"name": "remote_access"
|
|
||||||
},
|
|
||||||
"option": {
|
|
||||||
"name": "port"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"SupportedProtocols": {
|
|
||||||
"type": "string",
|
|
||||||
"read": true,
|
|
||||||
"write": false,
|
|
||||||
"version": "2.0",
|
|
||||||
"protocols": [
|
|
||||||
"cwmp",
|
|
||||||
"usp"
|
|
||||||
],
|
|
||||||
"list": {
|
|
||||||
"datatype": "string",
|
|
||||||
"enumerations": [
|
|
||||||
"HTTP",
|
|
||||||
"HTTPS"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"default": "HTTP"
|
|
||||||
},
|
|
||||||
"Protocol": {
|
|
||||||
"type": "string",
|
|
||||||
"read": true,
|
|
||||||
"write": true,
|
|
||||||
"version": "2.0",
|
|
||||||
"protocols": [
|
|
||||||
"cwmp",
|
|
||||||
"usp"
|
|
||||||
],
|
|
||||||
"mapping": [
|
|
||||||
{
|
|
||||||
"type": "uci",
|
|
||||||
"uci": {
|
|
||||||
"file": "userinterface",
|
|
||||||
"section": {
|
|
||||||
"name": "remote_access"
|
|
||||||
},
|
|
||||||
"option": {
|
|
||||||
"name": "protocol"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
config userinterface 'remote_access'
|
|
||||||
option enable '0'
|
|
||||||
option interface 'wan'
|
|
||||||
option port '80'
|
|
||||||
option protocol 'HTTP'
|
|
||||||
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
|
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. /lib/functions.sh
|
|
||||||
|
|
||||||
IDENTIFIER="REMOTE-ACCESS-WAN"
|
|
||||||
|
|
||||||
log() {
|
|
||||||
echo "${@}"|logger -t firewall.userinterface -p info
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ ! -f "/etc/config/userinterface" ]; then
|
|
||||||
exit 0;
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec_cmd() {
|
|
||||||
if ! "$@"; then
|
|
||||||
log "Failed to run [$*]"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_firewall_rule() {
|
|
||||||
local enable port protocol gui_port
|
|
||||||
local zone interface
|
|
||||||
|
|
||||||
config_load userinterface
|
|
||||||
config_get_bool enable remote_access enable 1
|
|
||||||
config_get port remote_access port
|
|
||||||
config_get interface remote_access interface
|
|
||||||
|
|
||||||
if [ "${enable}" -eq "0" ] || [ -z "${port}" ] || [ -z "${interface}" ]; then
|
|
||||||
return 0;
|
|
||||||
fi
|
|
||||||
|
|
||||||
zone="zone_${interface}_input"
|
|
||||||
iptables -w 1 -t filter -nL "${zone}" 2>/dev/null 1>&2
|
|
||||||
if [ "$?" -eq 0 ]; then
|
|
||||||
iptables -w 1 -I "${zone}" -p tcp -m multiport --dports "${port}" -m conntrack --ctstate NEW,ESTABLISHED -m comment --comment "${IDENTIFIER}" -j ACCEPT
|
|
||||||
fi
|
|
||||||
|
|
||||||
zone="zone_${interface}_output"
|
|
||||||
iptables -w 1 -t filter -nL "${zone}" 2>/dev/null 1>&2
|
|
||||||
if [ "$?" -eq 0 ]; then
|
|
||||||
iptables -w 1 -I "${zone}" -p tcp -m multiport --dports "${port}" -m conntrack --ctstate ESTABLISHED -m comment --comment "${IDENTIFIER}" -j ACCEPT
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_firewall_rule() {
|
|
||||||
local zone interface
|
|
||||||
local CMD
|
|
||||||
|
|
||||||
config_load userinterface
|
|
||||||
config_get interface remote_access interface
|
|
||||||
|
|
||||||
# Clean remote interface rules
|
|
||||||
if [ -z "${interface}" ]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
zone="zone_${interface}_input"
|
|
||||||
CMD="iptables -w 1 -t filter -nL ${zone} --line-numbers"
|
|
||||||
while ${CMD} 2>/dev/null | grep "${IDENTIFIER}"; do
|
|
||||||
rule_num="$(${CMD} | grep "${IDENTIFIER}" | head -1|awk '{print $1}')"
|
|
||||||
if [ -n "${rule_num}" ]; then
|
|
||||||
exec_cmd iptables -w 1 -t filter -D "${zone}" "${rule_num}";
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
zone="zone_${interface}_output"
|
|
||||||
CMD="iptables -w 1 -t filter -nL ${zone} --line-numbers"
|
|
||||||
while ${CMD} 2>/dev/null | grep "${IDENTIFIER}"; do
|
|
||||||
rule_num="$(${CMD} | grep "${IDENTIFIER}" | head -1|awk '{print $1}')"
|
|
||||||
if [ -n "${rule_num}" ]; then
|
|
||||||
exec_cmd iptables -w 1 -t filter -D "${zone}" "${rule_num}";
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# Delete existing remote access rules
|
|
||||||
delete_firewall_rule
|
|
||||||
|
|
||||||
# Configure the User Interface rule
|
|
||||||
configure_firewall_rule
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
#!/bin/sh /etc/rc.common
|
|
||||||
|
|
||||||
START=99
|
|
||||||
STOP=01
|
|
||||||
|
|
||||||
USE_PROCD=1
|
|
||||||
|
|
||||||
start_service() {
|
|
||||||
local enable
|
|
||||||
|
|
||||||
procd_open_instance usp
|
|
||||||
|
|
||||||
config_load userinterface
|
|
||||||
config_get_bool enable global enable 1
|
|
||||||
|
|
||||||
# Inject firewall rules
|
|
||||||
if [ "${enable}" -eq "1" ]; then
|
|
||||||
/etc/firewall.userinterface
|
|
||||||
fi
|
|
||||||
|
|
||||||
procd_close_instance
|
|
||||||
}
|
|
||||||
|
|
||||||
service_triggers()
|
|
||||||
{
|
|
||||||
procd_add_reload_trigger "userinterface"
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
uci -q batch <<-EOT
|
|
||||||
delete firewall.userinterface
|
|
||||||
set firewall.userinterface=include
|
|
||||||
set firewall.userinterface.path=/etc/firewall.userinterface
|
|
||||||
set firewall.userinterface.reload=1
|
|
||||||
commit firewall
|
|
||||||
EOT
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/etc/bbfdm/sysctl.conf
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (C) 2022 iopsys Software Solutions AB
|
# Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
#
|
#
|
||||||
# This is free software, licensed under the GNU General Public License v2.
|
# This is free software, licensed under the GNU General Public License v2.
|
||||||
# See /LICENSE for more information.
|
# See /LICENSE for more information.
|
||||||
@@ -8,23 +8,10 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=bulkdata
|
PKG_NAME:=bulkdata
|
||||||
PKG_VERSION:=2.0.10
|
PKG_VERSION:=1.0.0
|
||||||
|
|
||||||
LOCAL_DEV:=0
|
|
||||||
ifneq ($(LOCAL_DEV),1)
|
|
||||||
PKG_SOURCE_PROTO:=git
|
|
||||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/bulkdata.git
|
|
||||||
PKG_SOURCE_VERSION:=6e85d2032e66df581fae7c72cd83cc89367b8fc8
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
|
||||||
PKG_MIRROR_HASH:=skip
|
|
||||||
endif
|
|
||||||
|
|
||||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
|
||||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||||
|
|
||||||
PKG_LICENSE:=GPL-2.0-only
|
|
||||||
PKG_LICENSE_FILES:=LICENSE
|
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
define Package/$(PKG_NAME)
|
define Package/$(PKG_NAME)
|
||||||
@@ -32,25 +19,26 @@ define Package/$(PKG_NAME)
|
|||||||
CATEGORY:=Utilities
|
CATEGORY:=Utilities
|
||||||
SUBMENU:=TRx69
|
SUBMENU:=TRx69
|
||||||
TITLE:=BBF BulkData Collection
|
TITLE:=BBF BulkData Collection
|
||||||
DEPENDS:=+libubus +libuci +libubox +libjson-c +libcurl +libblobmsg-json +zlib
|
DEPENDS:=+libubus +libuci +libubox +libjson-c +libcurl +curl +libblobmsg-json +libbbfdm +libbbf_api
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/$(PKG_NAME)/description
|
||||||
|
BBF BulkData Collection
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Prepare
|
||||||
|
$(CP) ./src/* $(PKG_BUILD_DIR)/
|
||||||
endef
|
endef
|
||||||
|
|
||||||
TARGET_CFLAGS += \
|
TARGET_CFLAGS += \
|
||||||
-D_GNU_SOURCE \
|
-D_GNU_SOURCE
|
||||||
-Wall -Werror
|
|
||||||
|
|
||||||
ifeq ($(LOCAL_DEV),1)
|
|
||||||
define Build/Prepare
|
|
||||||
$(CP) -rf ~/git/bulkdata/* $(PKG_BUILD_DIR)/
|
|
||||||
endef
|
|
||||||
endif
|
|
||||||
|
|
||||||
define Package/$(PKG_NAME)/install
|
define Package/$(PKG_NAME)/install
|
||||||
$(INSTALL_DIR) $(1)/usr/sbin
|
$(INSTALL_DIR) $(1)/usr/sbin
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bulkdatad $(1)/usr/sbin/
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bulkdatad $(1)/usr/sbin/
|
||||||
$(INSTALL_DIR) $(1)/etc/bbfdm/json
|
$(INSTALL_DIR) $(1)/usr/lib/bbfdm
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bbf_plugin/*.json $(1)/etc/bbfdm/json
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/*.so $(1)/usr/lib/bbfdm
|
||||||
$(CP) ./files/* $(1)/
|
$(CP) ./files/* $(1)/
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage,$(PKG_NAME)))
|
$(eval $(call BuildPackage,$(PKG_NAME)))
|
||||||
@@ -1,6 +1,43 @@
|
|||||||
|
|
||||||
config bulkdata 'bulkdata'
|
config bulkdata 'bulkdata'
|
||||||
option enable '0'
|
option enable '0'
|
||||||
#Log levels: Error=1, Warning=2, Info=3, Debug=4
|
#Log levels: Critical=0, Warning=1, Notice=2, Info=3, Debug=4
|
||||||
option log_level '3'
|
option log_level '3'
|
||||||
|
|
||||||
|
config profile
|
||||||
|
option profile_id '1'
|
||||||
|
option enable '0'
|
||||||
|
option name ''
|
||||||
|
option nbre_of_retained_failed_reports '0'
|
||||||
|
option protocol 'http'
|
||||||
|
option encoding_type ''
|
||||||
|
option reporting_interval '86400'
|
||||||
|
option time_reference '0'
|
||||||
|
option csv_encoding_field_separator ','
|
||||||
|
option csv_encoding_row_separator ' '
|
||||||
|
option csv_encoding_escape_character '"'
|
||||||
|
option csv_encoding_report_format 'column'
|
||||||
|
option csv_encoding_row_time_stamp 'unix'
|
||||||
|
option json_encoding_report_format 'objecthierarchy'
|
||||||
|
option json_encoding_report_time_stamp 'unix'
|
||||||
|
option http_url ''
|
||||||
|
option http_username ''
|
||||||
|
option http_password ''
|
||||||
|
option http_compression 'none'
|
||||||
|
option http_method 'post'
|
||||||
|
option http_use_date_header '1'
|
||||||
|
option http_retry_enable '0'
|
||||||
|
option http_retry_minimum_wait_interval '5'
|
||||||
|
option http_retry_interval_multiplier '2000'
|
||||||
|
option http_persist_across_reboot '0'
|
||||||
|
|
||||||
|
config profile_parameter
|
||||||
|
option profile_id '1'
|
||||||
|
option name ''
|
||||||
|
option reference ''
|
||||||
|
|
||||||
|
config profile_http_request_uri_parameter
|
||||||
|
option profile_id '1'
|
||||||
|
option name ''
|
||||||
|
option reference ''
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
#!/bin/sh /etc/rc.common
|
#!/bin/sh /etc/rc.common
|
||||||
|
# Bulkdata Software
|
||||||
|
# Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
# Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
|
||||||
START=99
|
START=99
|
||||||
STOP=10
|
STOP=10
|
||||||
@@ -7,17 +10,17 @@ USE_PROCD=1
|
|||||||
PROG="/usr/sbin/bulkdatad"
|
PROG="/usr/sbin/bulkdatad"
|
||||||
|
|
||||||
start_service() {
|
start_service() {
|
||||||
local enable
|
local bulkdata_enable=`uci -q get bulkdata.bulkdata.enable`
|
||||||
|
if [ "$bulkdata_enable" = "1" ]; then
|
||||||
config_load bulkdata
|
procd_open_instance
|
||||||
config_get_bool enable bulkdata enable 1
|
|
||||||
|
|
||||||
procd_open_instance bulkdata
|
|
||||||
[ "$enable" -eq "1" ] && {
|
|
||||||
procd_set_param command "$PROG"
|
procd_set_param command "$PROG"
|
||||||
procd_set_param respawn "3" "7" "0"
|
procd_set_param respawn "3" "7" "0"
|
||||||
}
|
procd_close_instance
|
||||||
procd_close_instance
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
boot() {
|
||||||
|
start
|
||||||
}
|
}
|
||||||
|
|
||||||
reload_service() {
|
reload_service() {
|
||||||
|
|||||||
@@ -1,75 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. /lib/functions.sh
|
|
||||||
|
|
||||||
PROFILE_COUNT=1
|
|
||||||
|
|
||||||
get_next_count()
|
|
||||||
{
|
|
||||||
local config="$1"
|
|
||||||
local default_name="${2}"
|
|
||||||
local count=${3}
|
|
||||||
local found=0
|
|
||||||
|
|
||||||
if [ -z "$count" ]; then
|
|
||||||
count=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
while [ "${found}" -ne 1 ]; do
|
|
||||||
uci -q get "${config}"."${default_name}"_${count} >/dev/null
|
|
||||||
if [ "$?" -eq 0 ]; then
|
|
||||||
count=$((count + 1))
|
|
||||||
else
|
|
||||||
found=1;
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "${default_name}_${count}"
|
|
||||||
}
|
|
||||||
|
|
||||||
translate_profile_id_to_profile_name() {
|
|
||||||
local section="${1}"
|
|
||||||
local profile_id="${2}"
|
|
||||||
local profile_name="${3}"
|
|
||||||
local curr_profile_id
|
|
||||||
|
|
||||||
config_get curr_profile_id "${section}" profile_id
|
|
||||||
|
|
||||||
[ -n "${curr_profile_id}" ] || return
|
|
||||||
|
|
||||||
[ "${curr_profile_id}" != "${profile_id}" ] && return
|
|
||||||
|
|
||||||
uci -q set bulkdata."${section}".profile_name="${profile_name}"
|
|
||||||
uci -q set bulkdata."${section}".profile_id=""
|
|
||||||
}
|
|
||||||
|
|
||||||
update_profile_sections() {
|
|
||||||
local section="${1}"
|
|
||||||
local default="${2}"
|
|
||||||
local profile_name
|
|
||||||
|
|
||||||
config_get profile_id "${section}" profile_id
|
|
||||||
|
|
||||||
[ -n "${profile_id}" ] || return
|
|
||||||
|
|
||||||
case "${section}" in
|
|
||||||
"cfg"*)
|
|
||||||
profile_name="$(get_next_count bulkdata "${default}" ${PROFILE_COUNT})"
|
|
||||||
uci_rename bulkdata "${section}" "${profile_name}"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
PROFILE_COUNT=$((PROFILE_COUNT + 1))
|
|
||||||
|
|
||||||
[ -n "$profile_name" ] && section="${profile_name}"
|
|
||||||
|
|
||||||
uci -q set bulkdata."${section}".profile_id=""
|
|
||||||
|
|
||||||
config_foreach translate_profile_id_to_profile_name profile_parameter "${profile_id}" "${profile_name}"
|
|
||||||
config_foreach translate_profile_id_to_profile_name profile_http_request_uri_parameter "${profile_id}" "${profile_name}"
|
|
||||||
}
|
|
||||||
|
|
||||||
config_load bulkdata
|
|
||||||
config_foreach update_profile_sections profile profile
|
|
||||||
uci commit bulkdata
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
23
bulkdata/src/Makefile
Normal file
23
bulkdata/src/Makefile
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
PROG = bulkdatad
|
||||||
|
LIB = libbulkdata.so
|
||||||
|
|
||||||
|
PROG_OBJS = bulkdata.o common.o config.o http.o log.o report.o times.o buci.o
|
||||||
|
LIB_OBJS = datamodel.o
|
||||||
|
|
||||||
|
PROG_CFLAGS = $(CFLAGS) -Wall -Werror -fPIC
|
||||||
|
PROG_LDFLAGS = $(LDFLAGS) -lubus -luci -lubox -ljson-c -lcurl -lblobmsg_json -lbbfdm -lbbf_api
|
||||||
|
LIB_LDFLAGS = $(LDFLAGS) -lbbf_api
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
$(CC) $(PROG_CFLAGS) $(FPIC) -c -o $@ $<
|
||||||
|
|
||||||
|
all: $(PROG) $(LIB)
|
||||||
|
|
||||||
|
$(PROG): $(PROG_OBJS)
|
||||||
|
$(CC) $(PROG_CFLAGS) -o $@ $^ $(PROG_LDFLAGS)
|
||||||
|
|
||||||
|
$(LIB): $(LIB_OBJS)
|
||||||
|
$(CC) $(PROG_CFLAGS) $(LIB_LDFLAGS) -shared -o $@ $^
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o $(PROG) $(LIB)
|
||||||
265
bulkdata/src/buci.c
Normal file
265
bulkdata/src/buci.c
Normal file
@@ -0,0 +1,265 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <strings.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#include "buci.h"
|
||||||
|
|
||||||
|
struct uci_context *uci_ctx = NULL;
|
||||||
|
|
||||||
|
int buci_init(void)
|
||||||
|
{
|
||||||
|
uci_ctx = uci_alloc_context();
|
||||||
|
if (!uci_ctx) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int buci_fini(void)
|
||||||
|
{
|
||||||
|
if (uci_ctx) {
|
||||||
|
uci_free_context(uci_ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool buci_validate_section(const char *str)
|
||||||
|
{
|
||||||
|
if (!*str)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (; *str; str++) {
|
||||||
|
unsigned char c = *str;
|
||||||
|
|
||||||
|
if (isalnum(c) || c == '_')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int buci_init_ptr(struct uci_context *ctx, struct uci_ptr *ptr, char *package, char *section, char *option, char *value)
|
||||||
|
{
|
||||||
|
memset(ptr, 0, sizeof(struct uci_ptr));
|
||||||
|
|
||||||
|
/* value */
|
||||||
|
if (value) {
|
||||||
|
ptr->value = value;
|
||||||
|
}
|
||||||
|
ptr->package = package;
|
||||||
|
if (!ptr->package)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
ptr->section = section;
|
||||||
|
if (!ptr->section) {
|
||||||
|
ptr->target = UCI_TYPE_PACKAGE;
|
||||||
|
goto lastval;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr->option = option;
|
||||||
|
if (!ptr->option) {
|
||||||
|
ptr->target = UCI_TYPE_SECTION;
|
||||||
|
goto lastval;
|
||||||
|
} else {
|
||||||
|
ptr->target = UCI_TYPE_OPTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastval:
|
||||||
|
if (ptr->section && !buci_validate_section(ptr->section))
|
||||||
|
ptr->flags |= UCI_LOOKUP_EXTENDED;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct uci_section *buci_walk_section(char *package, char *section_type, struct uci_section *prev_section)
|
||||||
|
{
|
||||||
|
struct uci_ptr ptr;
|
||||||
|
struct uci_element *e;
|
||||||
|
struct uci_section *next_section;
|
||||||
|
|
||||||
|
if (section_type == NULL) {
|
||||||
|
if (prev_section) {
|
||||||
|
e = &prev_section->e;
|
||||||
|
if (e->list.next == &prev_section->package->sections)
|
||||||
|
return NULL;
|
||||||
|
e = container_of(e->list.next, struct uci_element, list);
|
||||||
|
next_section = uci_to_section(e);
|
||||||
|
return next_section;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (buci_init_ptr(uci_ctx, &ptr, package, NULL, NULL, NULL)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (uci_lookup_ptr(uci_ctx, &ptr, NULL, true) != UCI_OK) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (ptr.p->sections.next == &ptr.p->sections)
|
||||||
|
return NULL;
|
||||||
|
e = container_of(ptr.p->sections.next, struct uci_element, list);
|
||||||
|
next_section = uci_to_section(e);
|
||||||
|
|
||||||
|
return next_section;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
struct uci_list *ul, *shead = NULL;
|
||||||
|
|
||||||
|
if (prev_section) {
|
||||||
|
ul = &prev_section->e.list;
|
||||||
|
shead = &prev_section->package->sections;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (buci_init_ptr(uci_ctx, &ptr, package, NULL, NULL, NULL)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (uci_lookup_ptr(uci_ctx, &ptr, NULL, true) != UCI_OK) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ul = &ptr.p->sections;
|
||||||
|
shead = &ptr.p->sections;
|
||||||
|
}
|
||||||
|
while (ul->next != shead) {
|
||||||
|
e = container_of(ul->next, struct uci_element, list);
|
||||||
|
next_section = uci_to_section(e);
|
||||||
|
if (strcmp(next_section->type, section_type) == 0)
|
||||||
|
return next_section;
|
||||||
|
ul = ul->next;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void buci_print_list(struct uci_list *uh, char **val, char *delimiter)
|
||||||
|
{
|
||||||
|
struct uci_element *e;
|
||||||
|
static char buffer[512];
|
||||||
|
char *buf = buffer;
|
||||||
|
*buf = '\0';
|
||||||
|
|
||||||
|
uci_foreach_element(uh, e) {
|
||||||
|
if (*buf) {
|
||||||
|
strcat(buf, delimiter);
|
||||||
|
strcat(buf, e->name);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strcpy(buf, e->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*val = buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct uci_element *buci_lookup_list(struct uci_list *list, const char *name)
|
||||||
|
{
|
||||||
|
struct uci_element *e;
|
||||||
|
|
||||||
|
uci_foreach_element(list, e) {
|
||||||
|
if (!strcmp(e->name, name))
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int uci_lookup_ptr_bysection(struct uci_context *ctx, struct uci_ptr *ptr, struct uci_section *section, char *option, char *value)
|
||||||
|
{
|
||||||
|
struct uci_element *e;
|
||||||
|
memset(ptr, 0, sizeof(struct uci_ptr));
|
||||||
|
|
||||||
|
ptr->package = section->package->e.name;
|
||||||
|
ptr->section = section->e.name;
|
||||||
|
ptr->option = option;
|
||||||
|
ptr->value = value;
|
||||||
|
ptr->flags |= UCI_LOOKUP_DONE;
|
||||||
|
|
||||||
|
ptr->p = section->package;
|
||||||
|
ptr->s = section;
|
||||||
|
|
||||||
|
if (ptr->option) {
|
||||||
|
e = buci_lookup_list(&ptr->s->options, ptr->option);
|
||||||
|
if (!e)
|
||||||
|
return UCI_OK;
|
||||||
|
ptr->o = uci_to_option(e);
|
||||||
|
ptr->last = e;
|
||||||
|
ptr->target = UCI_TYPE_OPTION;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ptr->last = &ptr->s->e;
|
||||||
|
ptr->target = UCI_TYPE_SECTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr->flags |= UCI_LOOKUP_COMPLETE;
|
||||||
|
|
||||||
|
return UCI_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *buci_get_value_bysection(struct uci_section *section, char *option)
|
||||||
|
{
|
||||||
|
struct uci_ptr ptr;
|
||||||
|
char *val = "";
|
||||||
|
|
||||||
|
if (uci_lookup_ptr_bysection(uci_ctx, &ptr, section, option, NULL) != UCI_OK) {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ptr.o)
|
||||||
|
return val;
|
||||||
|
|
||||||
|
if(ptr.o->type == UCI_TYPE_LIST) {
|
||||||
|
buci_print_list(&ptr.o->v.list, &val, " ");
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ptr.o->v.string)
|
||||||
|
return ptr.o->v.string;
|
||||||
|
else
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *buci_get_value(char *package, char *section, char *option)
|
||||||
|
{
|
||||||
|
struct uci_ptr ptr;
|
||||||
|
char *val = "";
|
||||||
|
|
||||||
|
if (!section || !option)
|
||||||
|
return val;
|
||||||
|
|
||||||
|
if (buci_init_ptr(uci_ctx, &ptr, package, section, option, NULL)) {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
if (uci_lookup_ptr(uci_ctx, &ptr, NULL, true) != UCI_OK) {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ptr.o)
|
||||||
|
return val;
|
||||||
|
|
||||||
|
if(ptr.o->type == UCI_TYPE_LIST) {
|
||||||
|
buci_print_list(&ptr.o->v.list, &val, " ");
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ptr.o->v.string)
|
||||||
|
return ptr.o->v.string;
|
||||||
|
else
|
||||||
|
return val;
|
||||||
|
}
|
||||||
31
bulkdata/src/buci.h
Normal file
31
bulkdata/src/buci.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __BUCI_H
|
||||||
|
#define __BUCI_H
|
||||||
|
|
||||||
|
#include <uci.h>
|
||||||
|
|
||||||
|
int buci_init(void);
|
||||||
|
int buci_fini(void);
|
||||||
|
struct uci_section *buci_walk_section(char *package, char *section_type, struct uci_section *prev_section);
|
||||||
|
void buci_print_list(struct uci_list *uh, char **val, char *delimiter);
|
||||||
|
struct uci_element *buci_lookup_list(struct uci_list *list, const char *name);
|
||||||
|
int uci_lookup_ptr_bysection(struct uci_context *ctx, struct uci_ptr *ptr, struct uci_section *section, char *option, char *value);
|
||||||
|
char *buci_get_value_bysection(struct uci_section *section, char *option);
|
||||||
|
char *buci_get_value(char *package, char *section, char *option);
|
||||||
|
|
||||||
|
#define buci_foreach_section(package, section_type, section) \
|
||||||
|
for (section = buci_walk_section(package, section_type, NULL); \
|
||||||
|
section != NULL; \
|
||||||
|
section = buci_walk_section(package, section_type, section))
|
||||||
|
|
||||||
|
#endif //__BUCI_H
|
||||||
144
bulkdata/src/bulkdata.c
Normal file
144
bulkdata/src/bulkdata.c
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
* Omar Kallel <omar.kallel@pivasoftware.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <libubox/uloop.h>
|
||||||
|
|
||||||
|
#include "http.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "report.h"
|
||||||
|
#include "times.h"
|
||||||
|
#include "bulkdata.h"
|
||||||
|
|
||||||
|
struct bulkdata bulkdata_main = {0};
|
||||||
|
int profiles_number = 0;
|
||||||
|
|
||||||
|
void bulkdata_profile_cb(struct uloop_timeout *timeout);
|
||||||
|
|
||||||
|
int get_retry_period(int min)
|
||||||
|
{
|
||||||
|
srand(time(NULL));
|
||||||
|
return rand()%min + min;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bulkdata_run_profiles(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
unsigned int next_period;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < profiles_number; i++) {
|
||||||
|
bulkdata->profile[i].utimer.cb = bulkdata_profile_cb;
|
||||||
|
LIST_HEAD(failedreports);
|
||||||
|
bulkdata->profile[i].failed_reports = &failedreports;
|
||||||
|
next_period = get_next_period(bulkdata->profile[i].time_reference, bulkdata->profile[i].reporting_interval);
|
||||||
|
bulkdata_log(SINFO, "The session of profile_id %d will be start in %d sec", bulkdata->profile[i].profile_id, next_period);
|
||||||
|
uloop_timeout_set(&bulkdata->profile[i].utimer, next_period * 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int http_send_report(struct profile *profile, char *report)
|
||||||
|
{
|
||||||
|
char *msg_in = NULL;
|
||||||
|
int http_code;
|
||||||
|
|
||||||
|
http_client_init(profile);
|
||||||
|
bulkdata_log(SINFO, "Send the report of profile_id %d to Bulkdata Collector", profile->profile_id);
|
||||||
|
http_code = http_send_message(profile, report, strlen(report), &msg_in);
|
||||||
|
http_client_exit();
|
||||||
|
return http_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bulkdata_profile_cb(struct uloop_timeout *timeout)
|
||||||
|
{
|
||||||
|
struct profile *profile;
|
||||||
|
unsigned int http_code, retry_period;
|
||||||
|
char *report = NULL;
|
||||||
|
|
||||||
|
profile = container_of(timeout, struct profile, utimer);
|
||||||
|
time_t now = time(NULL);
|
||||||
|
|
||||||
|
bulkdata_log(SINFO, "New session of profile_id %d started", profile->profile_id);
|
||||||
|
if(profile->retry_count == 0 || profile->next_retry > now || !profile->http_retry_enable) //Perdiodic execution
|
||||||
|
create_encoding_bulkdata_report(profile, &report);
|
||||||
|
else
|
||||||
|
create_failed_report(profile, &report);
|
||||||
|
|
||||||
|
bulkdata_log(SDEBUG, "The content of the profile_id report %d is :\n==========\n%s\n==========\n", profile->profile_id, report);
|
||||||
|
http_code= http_send_report(profile, report);
|
||||||
|
if(http_code != 200){
|
||||||
|
if(profile->retry_count == 0 || profile->next_retry > now || !profile->http_retry_enable) { //Perdiodic execution
|
||||||
|
retry_period = get_retry_period(profile->http_retry_minimum_wait_interval);
|
||||||
|
profile->next_period = now + profile->reporting_interval;
|
||||||
|
profile->next_retry = now + retry_period;
|
||||||
|
profile->retry_count = 1;
|
||||||
|
profile->min_retry = profile->http_retry_minimum_wait_interval * 2;
|
||||||
|
if((profile->next_retry < profile->next_period) && profile->http_retry_enable) {
|
||||||
|
bulkdata_log(SINFO, "Retry session of profile_id %d in %d sec", profile->profile_id, retry_period);
|
||||||
|
uloop_timeout_set(timeout, 1000 * retry_period);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bulkdata_log(SINFO, "Start New session of profile_id %d in %d sec", profile->profile_id, profile->reporting_interval);
|
||||||
|
uloop_timeout_set(timeout, 1000 * profile->reporting_interval);
|
||||||
|
}
|
||||||
|
} else { //Retry execution
|
||||||
|
retry_period= get_retry_period(profile->min_retry);
|
||||||
|
profile->min_retry*=2;
|
||||||
|
profile->next_retry+=retry_period;
|
||||||
|
profile->retry_count++;
|
||||||
|
if(profile->next_retry < profile->next_period) {
|
||||||
|
bulkdata_log(SINFO, "Retry session of profile_id %d in %d sec", profile->profile_id, retry_period);
|
||||||
|
uloop_timeout_set(timeout, 1000 * retry_period);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bulkdata_log(SINFO, "Retry session of profile_id %d in %d sec", profile->profile_id, (profile->next_period-profile->next_retry+retry_period));
|
||||||
|
uloop_timeout_set(timeout, 1000 * (profile->next_period-profile->next_retry+retry_period));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(profile->new_report){
|
||||||
|
bulkdata_add_failed_report(profile, profile->new_report);
|
||||||
|
FREE(profile->new_report);
|
||||||
|
}
|
||||||
|
FREE(report);
|
||||||
|
} else {
|
||||||
|
if(profile->retry_count == 0 || profile->next_retry > now || !profile->http_retry_enable) {
|
||||||
|
bulkdata_log(SINFO, "Start New session of profile_id %d in %d sec", profile->profile_id, profile->reporting_interval);
|
||||||
|
uloop_timeout_set(timeout, 1000 * profile->reporting_interval);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bulkdata_log(SINFO, "Retry session of profile_id %d in %d sec", profile->profile_id, (profile->next_period-profile->next_retry));
|
||||||
|
uloop_timeout_set(timeout, 1000 * (profile->next_period-profile->next_retry));
|
||||||
|
}
|
||||||
|
FREE(profile->new_report);
|
||||||
|
FREE(report);
|
||||||
|
empty_failed_reports_list(profile);
|
||||||
|
profile->retry_count= 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
struct bulkdata *bulkdata = &bulkdata_main;
|
||||||
|
if (bulkdata_config_init(bulkdata) == -1)
|
||||||
|
return -1;
|
||||||
|
bulkdata_log(SINFO, "Start bulkdatad daemon");
|
||||||
|
|
||||||
|
uloop_init();
|
||||||
|
bulkdata_run_profiles(bulkdata);
|
||||||
|
uloop_run();
|
||||||
|
uloop_done();
|
||||||
|
|
||||||
|
bulkdata_config_fini(bulkdata);
|
||||||
|
bulkdata_log(SINFO, "Stop bulkdatad daemon");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
18
bulkdata/src/bulkdata.h
Normal file
18
bulkdata/src/bulkdata.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __BULKDATA_H
|
||||||
|
#define __BULKDATA_H
|
||||||
|
|
||||||
|
extern struct bulkdata bulkdata_main;
|
||||||
|
extern int profiles_number;
|
||||||
|
|
||||||
|
#endif /* __BULKDATA_H */
|
||||||
105
bulkdata/src/bulkdata.md
Normal file
105
bulkdata/src/bulkdata.md
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
# README #
|
||||||
|
|
||||||
|
bulkdatad is an implementation of The HTTP bulk data collection mechanism which is an extended feature of CPE and other agents implementing TR-069(CWMP) or TR-369(USP), defined by the Broadband Forum. It provides a means by which an Auto-Configuration Server (ACS), or USP Controller, can configure an agent to periodically send a JSON or CSV formatted set of Device information to an HTTP server running a data collection application.
|
||||||
|
|
||||||
|
## Configuration File ##
|
||||||
|
|
||||||
|
The bulkdatad UCI configuration is located in **'/etc/config/bulkdata'**, and contains 4 sections: **bulkdata**, **profile**, **profile\_parameter** and **profile\_http\_request\_uri\_parameter**.
|
||||||
|
|
||||||
|
```
|
||||||
|
config bulkdata 'bulkdata'
|
||||||
|
option enable '0'
|
||||||
|
option log_level '3'
|
||||||
|
|
||||||
|
config profile
|
||||||
|
option profile_id '1'
|
||||||
|
option enable '0'
|
||||||
|
option csv_encoding_row_time_stamp 'unix'
|
||||||
|
option json_encoding_report_time_stamp 'unix'
|
||||||
|
option http_retry_minimum_wait_interval '5'
|
||||||
|
option http_retry_interval_multiplier '2000'
|
||||||
|
|
||||||
|
config profile_parameter
|
||||||
|
option profile_id '1'
|
||||||
|
option name ''
|
||||||
|
option reference ''
|
||||||
|
|
||||||
|
config profile_http_request_uri_parameter
|
||||||
|
option profile_id '1'
|
||||||
|
option name ''
|
||||||
|
option reference ''
|
||||||
|
```
|
||||||
|
|
||||||
|
### bulkdata section ###
|
||||||
|
|
||||||
|
It defines **bulkdata configuration**: enable and log\_level.
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ----------- | ------- | ----------------------------------------------------------------------------------------------- |
|
||||||
|
| `enable` | boolean | Enables the BulkData feature if set to **1**. |
|
||||||
|
| `log_level` | integer | Specifies the log type to use, by default **'INFO'**. The possible types are **'EMERG', 'ALERT', 'CRITIC' ,'ERROR', 'WARNING', 'NOTICE', 'INFO' and 'DEBUG'**. |
|
||||||
|
|
||||||
|
### profile section ###
|
||||||
|
|
||||||
|
It defines **the profile section configuration**: enable, name,... The possible options for **profile** section are listed below:
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ---------------------------------- | ------- | ---------------------------------------------- |
|
||||||
|
| `profile_id` | integer | The profile id to use. |
|
||||||
|
| `enable` | boolean | If set to **1**, enables the bulkdata profile. |
|
||||||
|
| `name` | string | The name of the profile. |
|
||||||
|
| `nbre_of_retained_failed_reports` | integer | The number of failed reports to be retained and transmitted at the end of the current reporting interval. |
|
||||||
|
| `protocol` | string | The protocol used for the collection profile. |
|
||||||
|
| `encoding_type` | string | The encoding type used for the collection profile. |
|
||||||
|
| `reporting_interval` | integer | The reporting interval in seconds. |
|
||||||
|
| `time_reference` | integer | The time reference to determine when the profile will be transmitted to the ACS collector. |
|
||||||
|
| `csv_encoding_field_separator` | string | The field separator to use when encoding CSV data. |
|
||||||
|
| `csv_encoding_row_separator` | string | The row separator to use when encoding CSV data. |
|
||||||
|
| `csv_encoding_escape_character` | string | The escape character to use when encoding CSV data. |
|
||||||
|
| `csv_encoding_report_format` | string | Describes how reports will be formatted. Two possible formats are supported: **'ParameterPerRow' and 'ParameterPerColumn'**. |
|
||||||
|
| `csv_encoding_row_time_stamp` | string | The format of the timestamp to use for data inserted into the row. The row time stamp supported are **'Unix-Epoch', 'ISO-8601' and 'None'**. |
|
||||||
|
| `json_encoding_report_format` | string | Describes the report format. The supported report formats are **'ObjectHierarchy' and 'NameValuePair'**. |
|
||||||
|
| `json_encoding_report_time_stamp` | string | The format of the timestamp to use for the JSON Object named "CollectionTime". The supported timestamp are **'Unix-Epoch', 'ISO-8601' and 'None'**. |
|
||||||
|
| `http_url` | string | The URL of the collection server. |
|
||||||
|
| `http_username` | string | The username of the collection server. |
|
||||||
|
| `http_password` | string | The password of the collection server. |
|
||||||
|
| `http_compression` | string | The HTTP Compression mechanism used by the collection server. The supported compression mechanism are **'GZIP', 'Compress' and 'Deflate'**. |
|
||||||
|
| `http_method` | string | The HTTP method used by the collection server. Two methods are supported: **'POST' and 'PUT'**. |
|
||||||
|
| `http_use_date_header` | boolean | If set to **1**, the CPE encodes the HTTP Date Header. |
|
||||||
|
| `http_retry_enable` | boolean | If set to **1**, the CPE retries unsuccessful attempts to transfer data. |
|
||||||
|
| `http_retry_minimum_wait_interval` | integer | The data transfer retry wait interval. |
|
||||||
|
| `http_retry_interval_multiplier` | integer | The retry interval multiplier. |
|
||||||
|
| `http_persist_across_reboot` | boolean | If set to **1**, failed data transfers must be persisted across reboots. |
|
||||||
|
|
||||||
|
### profile_parameter section ###
|
||||||
|
|
||||||
|
It defines **the profile\_parameter section configuration**: profile\_id, name, reference.
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ------------ | ------- | --------------------------------------- |
|
||||||
|
| `profile_id` | integer | The id of the used profile. |
|
||||||
|
| `name` | string | The name of the profile parameter. |
|
||||||
|
| `reference` | string | The reference of the profile parameter. |
|
||||||
|
|
||||||
|
### profile_http_request_uri_parameter section ###
|
||||||
|
|
||||||
|
It defines **the profile\_http\_request\_uri\_parameter section configuration**: profile\_id, name, reference.
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ------------ | ------- | --------------------------------------- |
|
||||||
|
| `profile_id` | integer | The id of the used profile. |
|
||||||
|
| `name` | string | The name of the Request-URI parameter. |
|
||||||
|
| `reference` | string | The reference of the profile parameter. |
|
||||||
|
|
||||||
|
## Dependencies ##
|
||||||
|
|
||||||
|
To successfully build bulkdatad, the following libraries are needed:
|
||||||
|
|
||||||
|
| Dependency | Link | License |
|
||||||
|
| ----------- | ------------------------------------------- | -------------- |
|
||||||
|
| libuci | https://git.openwrt.org/project/uci.git | LGPL 2.1 |
|
||||||
|
| libubox | https://git.openwrt.org/project/libubox.git | BSD |
|
||||||
|
| libjson-c | https://s3.amazonaws.com/json-c_releases | MIT |
|
||||||
|
| libcurl | https://dl.uxnr.de/mirror/curl | MIT |
|
||||||
|
| libbbfdm | https://dev.iopsys.eu/iopsys/bbf.git | LGPL 2.1 |
|
||||||
|
|
||||||
450
bulkdata/src/common.c
Normal file
450
bulkdata/src/common.c
Normal file
@@ -0,0 +1,450 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
* Omar Kallel <omar.kallel@pivasoftware.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
static pathnode *head = NULL;
|
||||||
|
static pathnode *temphead = NULL;
|
||||||
|
|
||||||
|
int bulkdata_dm_ctx_init(struct dmctx *ctx)
|
||||||
|
{
|
||||||
|
struct bulkdata *bulkdata = &bulkdata_main;
|
||||||
|
dm_ctx_init(ctx, bulkdata->instance_mode);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bulkdata_dm_ctx_clean(struct dmctx *ctx)
|
||||||
|
{
|
||||||
|
dm_ctx_clean(ctx);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char **str_split(const char* str, const char* delim, size_t* numtokens)
|
||||||
|
{
|
||||||
|
char *s = strdup(str);
|
||||||
|
size_t tokens_alloc = 1;
|
||||||
|
size_t tokens_used = 0;
|
||||||
|
char **tokens = calloc(tokens_alloc, sizeof(char*));
|
||||||
|
char *token, *strtok_ctx;
|
||||||
|
for (token = strtok_r(s, delim, &strtok_ctx); token != NULL; token = strtok_r(NULL, delim, &strtok_ctx)) {
|
||||||
|
if (tokens_used == tokens_alloc) {
|
||||||
|
tokens_alloc *= 2;
|
||||||
|
tokens = realloc(tokens, tokens_alloc * sizeof(char*));
|
||||||
|
}
|
||||||
|
tokens[tokens_used++] = strdup(token);
|
||||||
|
}
|
||||||
|
// cleanup
|
||||||
|
if (tokens_used == 0) {
|
||||||
|
FREE(tokens);
|
||||||
|
} else {
|
||||||
|
tokens = realloc(tokens, tokens_used * sizeof(char*));
|
||||||
|
}
|
||||||
|
*numtokens = tokens_used;
|
||||||
|
FREE(s);
|
||||||
|
return tokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool bulkdata_match(const char *string, const char *pattern)
|
||||||
|
{
|
||||||
|
regex_t re;
|
||||||
|
if (regcomp(&re, pattern, REG_EXTENDED) != 0) return 0;
|
||||||
|
int status = regexec(&re, string, 0, NULL, 0);
|
||||||
|
regfree(&re);
|
||||||
|
if (status != 0) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool is_res_required(char *str, int *start, int *len)
|
||||||
|
{
|
||||||
|
char temp_char[NAME_MAX] = {'\0'};
|
||||||
|
|
||||||
|
if (bulkdata_match(str, GLOB_CHAR)) {
|
||||||
|
int s_len = strlen(str);
|
||||||
|
int b_len = s_len, p_len = s_len;
|
||||||
|
|
||||||
|
char *star = strchr(str, '*');
|
||||||
|
if(star)
|
||||||
|
s_len = star - str;
|
||||||
|
*start = MIN(MIN(s_len, p_len), b_len);
|
||||||
|
if (*start == s_len)
|
||||||
|
*len = 1;
|
||||||
|
|
||||||
|
strncpy(temp_char, str+*start, *len);
|
||||||
|
|
||||||
|
if (bulkdata_match(temp_char, "[*+]+"))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*start = strlen(str);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void insert(char *data, bool active)
|
||||||
|
{
|
||||||
|
pathnode *link = (pathnode*) calloc(1, sizeof(pathnode));
|
||||||
|
if(!link) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
link->ref_path = data;
|
||||||
|
|
||||||
|
if(active) {
|
||||||
|
link->next = head;
|
||||||
|
head = link;
|
||||||
|
} else {
|
||||||
|
link->next = temphead;
|
||||||
|
temphead = link;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void swap_heads(void)
|
||||||
|
{
|
||||||
|
pathnode *temp = head;
|
||||||
|
head = temphead;
|
||||||
|
temphead = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void deleteList(void)
|
||||||
|
{
|
||||||
|
pathnode *ptr = head, *temp;
|
||||||
|
while(ptr != NULL) {
|
||||||
|
temp = ptr;
|
||||||
|
free(ptr->ref_path);
|
||||||
|
if(ptr->next != NULL) {
|
||||||
|
ptr = ptr->next;
|
||||||
|
} else {
|
||||||
|
ptr = NULL;
|
||||||
|
}
|
||||||
|
free(temp);
|
||||||
|
}
|
||||||
|
head = NULL;
|
||||||
|
swap_heads();
|
||||||
|
}
|
||||||
|
|
||||||
|
void bulkdata_add_data_to_list(struct list_head *dup_list, char *name, char *value, char *type)
|
||||||
|
{
|
||||||
|
struct resultsnode *link;
|
||||||
|
link = calloc(1, sizeof(struct resultsnode));
|
||||||
|
list_add_tail(&link->list, dup_list);
|
||||||
|
link->name = strdup(name);
|
||||||
|
link->data = strdup(value);
|
||||||
|
link->type = strdup(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bulkdata_delete_data_from_list(struct resultsnode *link)
|
||||||
|
{
|
||||||
|
list_del(&link->list);
|
||||||
|
FREE(link->name);
|
||||||
|
FREE(link->data);
|
||||||
|
FREE(link->type);
|
||||||
|
FREE(link);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bulkdata_free_data_from_list(struct list_head *dup_list)
|
||||||
|
{
|
||||||
|
struct resultsnode *link;
|
||||||
|
while (dup_list->next != dup_list) {
|
||||||
|
link = list_entry(dup_list->next, struct resultsnode, list);
|
||||||
|
bulkdata_delete_data_from_list(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool bulkdata_get(int operation, char *path, struct dmctx *dm_ctx)
|
||||||
|
{
|
||||||
|
int fault = 0;
|
||||||
|
|
||||||
|
switch(operation) {
|
||||||
|
case CMD_GET_NAME:
|
||||||
|
fault = dm_entry_param_method(dm_ctx, CMD_GET_NAME, path, "true", NULL);
|
||||||
|
break;
|
||||||
|
case CMD_GET_VALUE:
|
||||||
|
fault = dm_entry_param_method(dm_ctx, CMD_GET_VALUE, path, NULL, NULL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dm_ctx->list_fault_param.next != &dm_ctx->list_fault_param) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (fault) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *bulkdata_get_value_param(char *path)
|
||||||
|
{
|
||||||
|
struct dmctx ctx = {0};
|
||||||
|
struct dm_parameter *n;
|
||||||
|
char *value = NULL;
|
||||||
|
|
||||||
|
bulkdata_dm_ctx_init(&ctx);
|
||||||
|
if(bulkdata_get(CMD_GET_VALUE, path, &ctx)) {
|
||||||
|
list_for_each_entry(n, &ctx.list_parameter, list) {
|
||||||
|
value = strdup(n->data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bulkdata_dm_ctx_clean(&ctx);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bulkdata_get_value(char *path, struct list_head *list)
|
||||||
|
{
|
||||||
|
struct dmctx ctx = {0};
|
||||||
|
struct dm_parameter *n;
|
||||||
|
|
||||||
|
bulkdata_dm_ctx_init(&ctx);
|
||||||
|
if(bulkdata_get(CMD_GET_VALUE, path, &ctx)) {
|
||||||
|
list_for_each_entry(n, &ctx.list_parameter, list) {
|
||||||
|
bulkdata_add_data_to_list(list, n->name, n->data, n->type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bulkdata_dm_ctx_clean(&ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool bulkdata_get_name(char *path)
|
||||||
|
{
|
||||||
|
struct dmctx ctx = {0};
|
||||||
|
struct dm_parameter *n;
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
|
bulkdata_dm_ctx_init(&ctx);
|
||||||
|
if(bulkdata_get(CMD_GET_NAME, path, &ctx)) {
|
||||||
|
list_for_each_entry(n, &ctx.list_parameter, list) {
|
||||||
|
insert(strdup(n->name), false);
|
||||||
|
}
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
bulkdata_dm_ctx_clean(&ctx);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fill_node_path(void)
|
||||||
|
{
|
||||||
|
pathnode *p=head;
|
||||||
|
while(p!=NULL) {
|
||||||
|
bulkdata_get_name(p->ref_path);
|
||||||
|
p=p->next;
|
||||||
|
}
|
||||||
|
deleteList();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bulkdata_filter_results(char *path, int start, int end)
|
||||||
|
{
|
||||||
|
int startpos = start, m_index = 0, m_len = 0;
|
||||||
|
char *pp = path + startpos;
|
||||||
|
char exp[NAME_MAX] = {'\0'};
|
||||||
|
|
||||||
|
if(start >= end) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!is_res_required(pp, &m_index, &m_len)) {
|
||||||
|
//append rest of the path to the final list
|
||||||
|
if(pp == path ) {
|
||||||
|
insert(strdup(pp), true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pathnode *p = head;
|
||||||
|
while(p != NULL) {
|
||||||
|
char name[NAME_MAX] = {'\0'};
|
||||||
|
strcpy(name, p->ref_path);
|
||||||
|
strcat(name, pp);
|
||||||
|
insert(strdup(name), false);
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
|
deleteList();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the string before the match
|
||||||
|
char name[NAME_MAX]={'\0'};
|
||||||
|
strncpy(name, pp, m_index);
|
||||||
|
|
||||||
|
pathnode *p = head;
|
||||||
|
if(p == NULL) {
|
||||||
|
insert(strdup(name), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
while(p != NULL) {
|
||||||
|
char ref_name[NAME_MAX] = {'\0'};
|
||||||
|
sprintf(ref_name, "%s%s", p->ref_path, name);
|
||||||
|
insert(strdup(ref_name), false);
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
|
deleteList();
|
||||||
|
|
||||||
|
startpos += m_index;
|
||||||
|
strncpy(exp, pp+m_index, m_len);
|
||||||
|
pp = path + startpos;
|
||||||
|
fill_node_path();
|
||||||
|
startpos += 2;
|
||||||
|
bulkdata_filter_results(path, startpos, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bulkdata_parse_results(struct list_head *list)
|
||||||
|
{
|
||||||
|
pathnode *p = head;
|
||||||
|
while(p != NULL) {
|
||||||
|
bulkdata_get_value(p->ref_path, list);
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
|
deleteList();
|
||||||
|
}
|
||||||
|
|
||||||
|
void bulkdata_get_value_results(char *path, struct list_head *list)
|
||||||
|
{
|
||||||
|
bulkdata_filter_results(path, 0, strlen(path));
|
||||||
|
bulkdata_parse_results(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *create_request_url(struct profile *profile)
|
||||||
|
{
|
||||||
|
int i = 0, http_uri_number = profile->profile_http_request_uri_parameter_number;
|
||||||
|
char *value, *uri_param = NULL, *uri_tmp = NULL, *http_url = NULL;
|
||||||
|
|
||||||
|
for (i = 0; i < http_uri_number; i++)
|
||||||
|
{
|
||||||
|
if((profile->profile_http_uri_parameter[i].reference == NULL) || (profile->profile_http_uri_parameter[i].name == NULL))
|
||||||
|
continue;
|
||||||
|
value = bulkdata_get_value_param(profile->profile_http_uri_parameter[i].reference);
|
||||||
|
if(!uri_param) {
|
||||||
|
asprintf(&uri_param, "&%s=%s", profile->profile_http_uri_parameter[i].name, value);
|
||||||
|
free(value);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
uri_tmp = strdup(uri_param);
|
||||||
|
free(uri_param);
|
||||||
|
asprintf(&uri_param, "%s&%s=%s", uri_tmp, profile->profile_http_uri_parameter[i].name, value);
|
||||||
|
free(value);
|
||||||
|
free(uri_tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(uri_param) {
|
||||||
|
asprintf(&http_url, "%s%s", profile->http_url, uri_param);
|
||||||
|
free(uri_param);
|
||||||
|
} else {
|
||||||
|
asprintf(&http_url, "%s", profile->http_url);
|
||||||
|
}
|
||||||
|
return http_url;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *get_bulkdata_profile_parameter_name(char *paramref, char *paramname, char *param)
|
||||||
|
{
|
||||||
|
char **paramarr, *idx1 = NULL, *idx2 = NULL, *res = NULL, *instance = NULL, *tmp = NULL, *retparam = NULL, *s = NULL;
|
||||||
|
int i, j = 0;
|
||||||
|
size_t length;
|
||||||
|
|
||||||
|
if(paramname == NULL || strlen(paramname) <= 0)
|
||||||
|
return strdup(param);
|
||||||
|
paramarr = str_split(paramref, "*", &length);
|
||||||
|
res = strdup(paramname);
|
||||||
|
for(i = 0; i < length; i++) {
|
||||||
|
if(i == length - 1)
|
||||||
|
break;
|
||||||
|
j++;
|
||||||
|
idx1 = strstr(param, paramarr[i]);
|
||||||
|
idx2 = strstr(param, paramarr[i+1]);
|
||||||
|
instance = (char*)calloc(idx2 - idx1 - strlen(paramarr[i]) + 1, sizeof(char));
|
||||||
|
memcpy(instance, idx1 + strlen(paramarr[i]), idx2 - idx1 - strlen(paramarr[i]));
|
||||||
|
tmp = strdup(res);
|
||||||
|
FREE(res);
|
||||||
|
asprintf(&res, "%s.%s", tmp, instance);
|
||||||
|
FREE(tmp);
|
||||||
|
FREE(instance);
|
||||||
|
}
|
||||||
|
if ((s = strstr(param,paramarr[j]) ) != NULL && strlen(s) == strlen(paramarr[j]))
|
||||||
|
asprintf(&retparam, "%s", res);
|
||||||
|
else
|
||||||
|
asprintf(&retparam, "%s.%s", res, strstr(param, paramarr[j]) + strlen(paramarr[j]));
|
||||||
|
|
||||||
|
FREE(res);
|
||||||
|
for(int k = 0; k < length; k++)
|
||||||
|
FREE(paramarr[k]);
|
||||||
|
FREE(paramarr);
|
||||||
|
|
||||||
|
return retparam;
|
||||||
|
}
|
||||||
|
|
||||||
|
void append_string_to_string(char *strappend, char **target)
|
||||||
|
{
|
||||||
|
char *tmp = NULL;
|
||||||
|
|
||||||
|
if(strappend == NULL || strlen(strappend) <= 0)
|
||||||
|
return;
|
||||||
|
if(*target == NULL || strlen(*target) <= 0) {
|
||||||
|
*target = strdup(strappend);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
tmp = strdup(*target);
|
||||||
|
FREE(*target);
|
||||||
|
}
|
||||||
|
asprintf(target, "%s%s", tmp, strappend);
|
||||||
|
FREE(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bulkdata_add_failed_report(struct profile *profile, char *freport)
|
||||||
|
{
|
||||||
|
struct failed_reports *report, *retreport, *rtmp;
|
||||||
|
|
||||||
|
if(profile->nbre_failed_reports < profile->nbre_of_retained_failed_reports || profile->nbre_of_retained_failed_reports < 0) {
|
||||||
|
profile->nbre_failed_reports++;
|
||||||
|
} else {
|
||||||
|
list_for_each_entry_safe(retreport, rtmp, profile->failed_reports, list) {
|
||||||
|
bulkdata_delete_failed_report(retreport);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
report = calloc(1, sizeof(struct failed_reports));
|
||||||
|
list_add_tail(&report->list, profile->failed_reports);
|
||||||
|
report->freport= strdup(freport);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bulkdata_delete_failed_report(struct failed_reports *report)
|
||||||
|
{
|
||||||
|
if(report != NULL) {
|
||||||
|
list_del(&report->list);
|
||||||
|
FREE(report->freport);
|
||||||
|
FREE(report);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct failed_reports* empty_failed_reports_list(struct profile *profile)
|
||||||
|
{
|
||||||
|
struct failed_reports *report, *rtmp;
|
||||||
|
|
||||||
|
if(list_empty(profile->failed_reports))
|
||||||
|
return NULL;
|
||||||
|
list_for_each_entry_safe(report, rtmp, profile->failed_reports, list) {
|
||||||
|
list_del(&report->list);
|
||||||
|
FREE(report->freport);
|
||||||
|
FREE(report);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_failed_reports_to_report_csv(struct profile *profile, char **report, int isnext)
|
||||||
|
{
|
||||||
|
struct failed_reports *retreport = NULL;
|
||||||
|
int j = 0;
|
||||||
|
|
||||||
|
if(list_empty(profile->failed_reports))
|
||||||
|
return;
|
||||||
|
list_for_each_entry(retreport, profile->failed_reports, list) {
|
||||||
|
if(!j && isnext) {
|
||||||
|
j = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
append_string_to_string(retreport->freport, report);
|
||||||
|
}
|
||||||
|
}
|
||||||
69
bulkdata/src/common.h
Normal file
69
bulkdata/src/common.h
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __COMMON_H
|
||||||
|
#define __COMMON_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <regex.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
#include <libubox/blobmsg.h>
|
||||||
|
#include <libubox/blobmsg_json.h>
|
||||||
|
#include <libubox/utils.h>
|
||||||
|
#include <libubus.h>
|
||||||
|
|
||||||
|
#include <libbbfdm/dmentry.h>
|
||||||
|
#include <libbbfdm/dmbbfcommon.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "bulkdata.h"
|
||||||
|
|
||||||
|
typedef struct pathnode {
|
||||||
|
char *ref_path;
|
||||||
|
struct pathnode *next;
|
||||||
|
} pathnode;
|
||||||
|
|
||||||
|
typedef struct resultsnode {
|
||||||
|
struct list_head list;
|
||||||
|
char *name;
|
||||||
|
char *data;
|
||||||
|
char *type;
|
||||||
|
} resultsnode;
|
||||||
|
|
||||||
|
struct failed_reports {
|
||||||
|
struct list_head list;
|
||||||
|
char *freport;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GLOB_CHAR "[[+*]+"
|
||||||
|
|
||||||
|
int bulkdata_dm_ctx_init(struct dmctx *ctx);
|
||||||
|
int bulkdata_dm_ctx_clean(struct dmctx *ctx);
|
||||||
|
|
||||||
|
char *bulkdata_get_value_param(char *path);
|
||||||
|
void bulkdata_get_value(char *path, struct list_head *list);
|
||||||
|
|
||||||
|
void bulkdata_free_data_from_list(struct list_head *dup_list);
|
||||||
|
void bulkdata_get_value_results(char *path, struct list_head *list);
|
||||||
|
char *create_request_url(struct profile *profile);
|
||||||
|
char *get_bulkdata_profile_parameter_name(char *paramref, char *paramname, char *param);
|
||||||
|
void append_string_to_string(char *strappend, char **target);
|
||||||
|
void bulkdata_add_failed_report(struct profile *profile, char *freport);
|
||||||
|
void bulkdata_delete_failed_report(struct failed_reports *report);
|
||||||
|
|
||||||
|
struct failed_reports *empty_failed_reports_list(struct profile *profile);
|
||||||
|
void add_failed_reports_to_report_csv(struct profile *profile, char **report, int isnext);
|
||||||
|
|
||||||
|
#endif //__COMMON_H
|
||||||
523
bulkdata/src/config.c
Normal file
523
bulkdata/src/config.c
Normal file
@@ -0,0 +1,523 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
* Omar Kallel <omar.kallel@pivasoftware.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "log.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "buci.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "bulkdata.h"
|
||||||
|
|
||||||
|
int get_log_level_config(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
char *value = NULL;
|
||||||
|
|
||||||
|
buci_init();
|
||||||
|
value = buci_get_value("bulkdata", "bulkdata", "log_level");
|
||||||
|
if(value != NULL && *value != '\0')
|
||||||
|
bulkdata->log_level = atoi(value);
|
||||||
|
else
|
||||||
|
bulkdata->log_level = DEFAULT_LOGLEVEL;
|
||||||
|
bulkdata_log(SDEBUG,"Log Level of Bulkdata is : %d", bulkdata->log_level);
|
||||||
|
buci_fini();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_amd_version_config(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
char *value = NULL;
|
||||||
|
|
||||||
|
buci_init();
|
||||||
|
value = buci_get_value("cwmp", "cpe", "amd_version");
|
||||||
|
if(value != NULL && *value != '\0')
|
||||||
|
bulkdata->amd_version = atoi(value);
|
||||||
|
else
|
||||||
|
bulkdata->amd_version = DEFAULT_AMD_VERSION;
|
||||||
|
bulkdata_log(SDEBUG,"CWMP Amendment Version is : %d", bulkdata->amd_version);
|
||||||
|
buci_fini();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_instance_mode_config(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
char *value = NULL;
|
||||||
|
|
||||||
|
buci_init();
|
||||||
|
value = buci_get_value("cwmp", "cpe", "instance_mode");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
if(!strcmp(value, "InstanceNumber"))
|
||||||
|
bulkdata->instance_mode = INSTANCE_MODE_NUMBER;
|
||||||
|
else
|
||||||
|
bulkdata->instance_mode = INSTANCE_MODE_ALIAS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
bulkdata->instance_mode = DEFAULT_INSTANCE_MODE;
|
||||||
|
bulkdata_log(SDEBUG,"CWMP Instance Mode is : %d", bulkdata->instance_mode);
|
||||||
|
buci_fini();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_device_id_config(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
struct dmctx dmctx = {0};
|
||||||
|
|
||||||
|
bulkdata_dm_ctx_init(&dmctx);
|
||||||
|
bulkdata->device_id.manufacturer_oui = bulkdata_get_value_param("Device.DeviceInfo.ManufacturerOUI");
|
||||||
|
bulkdata->device_id.product_class = bulkdata_get_value_param("Device.DeviceInfo.ProductClass");
|
||||||
|
bulkdata->device_id.serial_number = bulkdata_get_value_param("Device.DeviceInfo.SerialNumber");
|
||||||
|
bulkdata_dm_ctx_clean(&dmctx);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int load_profile_config(struct bulkdata *bulkdata, struct uci_section *s, int i)
|
||||||
|
{
|
||||||
|
char *value = NULL;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "profile_id");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].profile_id = atoi(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The profile_id of profile_id %d is : %d", i, bulkdata->profile[i].profile_id);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "nbre_of_retained_failed_reports");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].nbre_of_retained_failed_reports = atoi(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The nombre of retained failed reports of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].nbre_of_retained_failed_reports);
|
||||||
|
}
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "protocol");
|
||||||
|
if(value != NULL && *value != '\0' && strcasecmp(value, "http")==0) {
|
||||||
|
bulkdata->profile[i].protocol = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The protocol of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].protocol);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "encoding_type");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].encoding_type = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The encoding type of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].encoding_type);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "reporting_interval");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].reporting_interval = atoi(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The reporting interval of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].reporting_interval);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "time_reference");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].time_reference = atoi(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The time reference of profile_id %d is : %ld", bulkdata->profile[i].profile_id, bulkdata->profile[i].time_reference);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "csv_encoding_field_separator");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].csv_encoding_field_separator = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The csv encoding field separator of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].csv_encoding_field_separator);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "csv_encoding_row_separator");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].csv_encoding_row_separator = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The csv encoding row separator of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].csv_encoding_row_separator);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "csv_encoding_escape_character");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].csv_encoding_escape_character = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The csv encoding escape character of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].csv_encoding_escape_character);
|
||||||
|
}
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "csv_encoding_report_format");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].csv_encoding_report_format = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The csv encoding report format of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].csv_encoding_report_format);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "csv_encoding_row_time_stamp");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].csv_encoding_row_time_stamp = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The csv encoding row time stamp of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].csv_encoding_row_time_stamp);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "json_encoding_report_format");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].json_encoding_report_format = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The json encoding report format of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].json_encoding_report_format);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "json_encoding_report_time_stamp");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].json_encoding_report_time_stamp = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The json encoding report time stamp of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].json_encoding_report_time_stamp);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "http_url");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
char *url = NULL;
|
||||||
|
asprintf(&url, "%s?oui=%s&pc=%s&sn=%s", value, bulkdata->device_id.manufacturer_oui, bulkdata->device_id.serial_number, bulkdata->device_id.serial_number);
|
||||||
|
bulkdata->profile[i].http_url = strdup(url);
|
||||||
|
free(url);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP url of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_url);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "http_username");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].http_username = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP username of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_username);
|
||||||
|
} else {
|
||||||
|
bulkdata->profile[i].http_username = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "http_password");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].http_password = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP password of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_password);
|
||||||
|
} else {
|
||||||
|
bulkdata->profile[i].http_password = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "http_compression");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].http_compression = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP compression of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_compression);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "http_method");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].http_method = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP method of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_method);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "http_use_date_header");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].http_use_date_header = atoi(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP use date header of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_use_date_header);
|
||||||
|
}
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "http_retry_enable");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].http_retry_enable = atoi(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP retry enable of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_retry_enable);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "http_retry_minimum_wait_interval");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].http_retry_minimum_wait_interval = atoi(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP retry minimum wait interval of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_retry_minimum_wait_interval);
|
||||||
|
}
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "http_retry_interval_multiplier");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].http_retry_interval_multiplier = atoi(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP retry interval multiplier of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_retry_interval_multiplier);
|
||||||
|
}
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "http_persist_across_reboot");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].http_persist_across_reboot = atoi(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP persist across reboot of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_persist_across_reboot);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "http_ssl_capath");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].http_ssl_capath = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP ssl capath of profile_id %d is : %s", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_ssl_capath);
|
||||||
|
} else {
|
||||||
|
bulkdata->profile[i].http_ssl_capath = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "http_insecure_enable");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].http_insecure_enable = atoi(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP insecure enable of profile_id %d is : %d", bulkdata->profile[i].profile_id, bulkdata->profile[i].http_insecure_enable);
|
||||||
|
}
|
||||||
|
|
||||||
|
bulkdata->profile[i].retry_count = 0;
|
||||||
|
bulkdata->profile[i].nbre_failed_reports = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_profiles_enable(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
struct uci_section *s;
|
||||||
|
char *enable;
|
||||||
|
int i = 0, nbr_profiles = 0;
|
||||||
|
|
||||||
|
buci_init();
|
||||||
|
|
||||||
|
buci_foreach_section("bulkdata", "profile", s) {
|
||||||
|
enable = buci_get_value_bysection(s, "enable");
|
||||||
|
if(strcmp(enable, "1") == 0) {
|
||||||
|
nbr_profiles++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(nbr_profiles != 0)
|
||||||
|
bulkdata->profile = calloc(2, sizeof(struct profile));
|
||||||
|
|
||||||
|
buci_foreach_section("bulkdata", "profile", s) {
|
||||||
|
enable = buci_get_value_bysection(s, "enable");
|
||||||
|
if(strcmp(enable, "1") == 0) {
|
||||||
|
if(load_profile_config(bulkdata, s, i) == -1) {
|
||||||
|
bulkdata_log(SCRIT,"Not able to start bulkdata: some required bulkdata configurations in profile must be set");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
profiles_number = nbr_profiles;
|
||||||
|
|
||||||
|
buci_fini();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int load_profile_parameter_config(struct bulkdata *bulkdata, struct uci_section *s, int i, int j)
|
||||||
|
{
|
||||||
|
char *value = NULL;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "name");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].profile_parameter[j].name = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The parameter name %d of profile_id %d is : %s", j+1, bulkdata->profile[i].profile_id, bulkdata->profile[i].profile_parameter[j].name);
|
||||||
|
} else {
|
||||||
|
bulkdata->profile[i].profile_parameter[j].name = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "reference");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].profile_parameter[j].reference = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The parameter reference %d of profile_id %d is : %s", j+1, bulkdata->profile[i].profile_id, bulkdata->profile[i].profile_parameter[j].reference);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_profiles_parameters(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
struct uci_section *s;
|
||||||
|
char *profile_id;
|
||||||
|
int i, j, nbr_profile_parameters;
|
||||||
|
|
||||||
|
buci_init();
|
||||||
|
|
||||||
|
for (i = 0; i < profiles_number; i++) {
|
||||||
|
j = 0;
|
||||||
|
nbr_profile_parameters = 0;
|
||||||
|
buci_foreach_section("bulkdata", "profile_parameter", s) {
|
||||||
|
profile_id = buci_get_value_bysection(s, "profile_id");
|
||||||
|
if(bulkdata->profile[i].profile_id != atoi(profile_id))
|
||||||
|
continue;
|
||||||
|
nbr_profile_parameters++;
|
||||||
|
if(nbr_profile_parameters == 1) {
|
||||||
|
bulkdata->profile[i].profile_parameter = calloc(1, sizeof(struct profile_parameter));
|
||||||
|
} else {
|
||||||
|
bulkdata->profile[i].profile_parameter = realloc(bulkdata->profile[i].profile_parameter, nbr_profile_parameters * sizeof(struct profile_parameter));
|
||||||
|
}
|
||||||
|
if(load_profile_parameter_config(bulkdata, s, i, j) == -1) {
|
||||||
|
bulkdata_log(SCRIT,"Not able to start bulkdata: some required bulkdata configurations in profile_parameter must be set");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
bulkdata->profile[i].profile_parameter_number = nbr_profile_parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
buci_fini();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int load_profile_http_request_uri_parameter_config(struct bulkdata *bulkdata, struct uci_section *s, int i, int j)
|
||||||
|
{
|
||||||
|
char *value = NULL;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "name");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].profile_http_uri_parameter[j].name = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP resuest URI parameter name %d of profile_id %d is : %s", j+1, bulkdata->profile[i].profile_id, bulkdata->profile[i].profile_http_uri_parameter[j].name);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
value = buci_get_value_bysection(s, "reference");
|
||||||
|
if(value != NULL && *value != '\0') {
|
||||||
|
bulkdata->profile[i].profile_http_uri_parameter[j].reference = strdup(value);
|
||||||
|
value = NULL;
|
||||||
|
bulkdata_log(SDEBUG,"The HTTP resuest URI parameter reference %d of profile_id %d is : %s", j+1, bulkdata->profile[i].profile_id, bulkdata->profile[i].profile_http_uri_parameter[j].reference);
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_profile_http_request_uri_parameter(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
struct uci_section *s;
|
||||||
|
char *profile_id;
|
||||||
|
int i, j, nbr_profile_http_request_uri_parameter;
|
||||||
|
|
||||||
|
buci_init();
|
||||||
|
|
||||||
|
for (i = 0; i < profiles_number; i++) {
|
||||||
|
j = 0;
|
||||||
|
nbr_profile_http_request_uri_parameter = 0;
|
||||||
|
buci_foreach_section("bulkdata", "profile_http_request_uri_parameter", s) {
|
||||||
|
profile_id = buci_get_value_bysection(s, "profile_id");
|
||||||
|
if(bulkdata->profile[i].profile_id != atoi(profile_id))
|
||||||
|
continue;
|
||||||
|
nbr_profile_http_request_uri_parameter++;
|
||||||
|
if(nbr_profile_http_request_uri_parameter == 1) {
|
||||||
|
bulkdata->profile[i].profile_http_uri_parameter = calloc(1, sizeof(struct profile_http_request_uri_parameter));
|
||||||
|
} else {
|
||||||
|
bulkdata->profile[i].profile_http_uri_parameter = realloc(bulkdata->profile[i].profile_http_uri_parameter, nbr_profile_http_request_uri_parameter * sizeof(struct profile_http_request_uri_parameter));
|
||||||
|
}
|
||||||
|
if(load_profile_http_request_uri_parameter_config(bulkdata, s, i, j)== -1) {
|
||||||
|
bulkdata_log(SCRIT,"Not able to start bulkdata: some required bulkdata configurations in profile_http_request_uri_parameter must be set");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
bulkdata->profile[i].profile_http_request_uri_parameter_number = nbr_profile_http_request_uri_parameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
buci_fini();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bulkdata_config_init(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
get_log_level_config(bulkdata);
|
||||||
|
get_amd_version_config(bulkdata);
|
||||||
|
get_instance_mode_config(bulkdata);
|
||||||
|
get_device_id_config(bulkdata);
|
||||||
|
if (get_profiles_enable(bulkdata) == -1)
|
||||||
|
return -1;
|
||||||
|
if (get_profiles_parameters(bulkdata) == -1)
|
||||||
|
return -1;
|
||||||
|
if (get_profile_http_request_uri_parameter(bulkdata) == -1)
|
||||||
|
return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int free_device_id_config(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
FREE(bulkdata->device_id.manufacturer_oui);
|
||||||
|
FREE(bulkdata->device_id.product_class);
|
||||||
|
FREE(bulkdata->device_id.serial_number);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int free_profiles_enable(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < profiles_number; i++) {
|
||||||
|
FREE(bulkdata->profile[i].protocol);
|
||||||
|
FREE(bulkdata->profile[i].encoding_type);
|
||||||
|
FREE(bulkdata->profile[i].csv_encoding_field_separator);
|
||||||
|
FREE(bulkdata->profile[i].csv_encoding_row_separator);
|
||||||
|
FREE(bulkdata->profile[i].csv_encoding_escape_character);
|
||||||
|
FREE(bulkdata->profile[i].csv_encoding_report_format);
|
||||||
|
FREE(bulkdata->profile[i].csv_encoding_row_time_stamp);
|
||||||
|
FREE(bulkdata->profile[i].json_encoding_report_format);
|
||||||
|
FREE(bulkdata->profile[i].json_encoding_report_time_stamp);
|
||||||
|
FREE(bulkdata->profile[i].http_url);
|
||||||
|
FREE(bulkdata->profile[i].http_username);
|
||||||
|
FREE(bulkdata->profile[i].http_password);
|
||||||
|
FREE(bulkdata->profile[i].http_compression);
|
||||||
|
FREE(bulkdata->profile[i].http_method);
|
||||||
|
FREE(bulkdata->profile[i].http_ssl_capath);
|
||||||
|
}
|
||||||
|
FREE(bulkdata->profile);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int free_profiles_parameters(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < profiles_number; i++) {
|
||||||
|
for(int j = 0; j < bulkdata->profile[i].profile_parameter_number; j++) {
|
||||||
|
FREE(bulkdata->profile[i].profile_parameter[j].name);
|
||||||
|
FREE(bulkdata->profile[i].profile_parameter[j].reference);
|
||||||
|
}
|
||||||
|
FREE(bulkdata->profile[i].profile_parameter);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int free_profile_http_request_uri_parameter(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < profiles_number; i++) {
|
||||||
|
for(int j = 0; j < bulkdata->profile[i].profile_http_request_uri_parameter_number; j++) {
|
||||||
|
FREE(bulkdata->profile[i].profile_http_uri_parameter[j].name);
|
||||||
|
FREE(bulkdata->profile[i].profile_http_uri_parameter[j].reference);
|
||||||
|
}
|
||||||
|
FREE(bulkdata->profile[i].profile_http_uri_parameter);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bulkdata_config_fini(struct bulkdata *bulkdata)
|
||||||
|
{
|
||||||
|
free_device_id_config(bulkdata);
|
||||||
|
free_profiles_parameters(bulkdata);
|
||||||
|
free_profile_http_request_uri_parameter(bulkdata);
|
||||||
|
free_profiles_enable(bulkdata);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
103
bulkdata/src/config.h
Normal file
103
bulkdata/src/config.h
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CONFIG_H
|
||||||
|
#define __CONFIG_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <libubox/uloop.h>
|
||||||
|
|
||||||
|
#define DEFAULT_AMD_VERSION 2
|
||||||
|
#define DEFAULT_INSTANCE_MODE 0
|
||||||
|
|
||||||
|
typedef struct device_id {
|
||||||
|
char *manufacturer_oui;
|
||||||
|
char *product_class;
|
||||||
|
char *serial_number;
|
||||||
|
} device_id;
|
||||||
|
|
||||||
|
typedef struct profile_parameter {
|
||||||
|
int profile_id;
|
||||||
|
char *name;
|
||||||
|
char *reference;
|
||||||
|
} profile_parameter;
|
||||||
|
|
||||||
|
typedef struct profile_http_request_uri_parameter {
|
||||||
|
int profile_id;
|
||||||
|
char *name;
|
||||||
|
char *reference;
|
||||||
|
} profile_http_request_uri_parameter;
|
||||||
|
|
||||||
|
typedef struct profile {
|
||||||
|
struct uloop_timeout utimer;
|
||||||
|
int profile_id;
|
||||||
|
int nbre_of_retained_failed_reports;
|
||||||
|
int nbre_failed_reports;
|
||||||
|
int reporting_interval;
|
||||||
|
int profile_parameter_number;
|
||||||
|
int profile_http_request_uri_parameter_number;
|
||||||
|
int http_retry_minimum_wait_interval;
|
||||||
|
int http_retry_interval_multiplier;
|
||||||
|
int min_retry;
|
||||||
|
int retry_count;
|
||||||
|
char *protocol;
|
||||||
|
char *encoding_type;
|
||||||
|
char *csv_encoding_field_separator;
|
||||||
|
char *csv_encoding_row_separator;
|
||||||
|
char *csv_encoding_escape_character;
|
||||||
|
char *csv_encoding_report_format;
|
||||||
|
char *csv_encoding_row_time_stamp;
|
||||||
|
char *json_encoding_report_format;
|
||||||
|
char *json_encoding_report_time_stamp;
|
||||||
|
char *http_url;
|
||||||
|
char *http_username;
|
||||||
|
char *http_password;
|
||||||
|
char *http_compression;
|
||||||
|
char *http_method;
|
||||||
|
char *http_ssl_capath;
|
||||||
|
char *new_report;
|
||||||
|
time_t time_reference;
|
||||||
|
time_t next_retry;
|
||||||
|
time_t next_period;
|
||||||
|
bool http_persist_across_reboot;
|
||||||
|
bool http_insecure_enable;
|
||||||
|
bool enable;
|
||||||
|
bool http_use_date_header;
|
||||||
|
bool http_retry_enable;
|
||||||
|
struct profile_parameter *profile_parameter;
|
||||||
|
struct profile_http_request_uri_parameter *profile_http_uri_parameter;
|
||||||
|
struct list_head *failed_reports;
|
||||||
|
} profile;
|
||||||
|
|
||||||
|
typedef struct bulkdata {
|
||||||
|
struct device_id device_id;
|
||||||
|
struct profile *profile;
|
||||||
|
int log_level;
|
||||||
|
int amd_version;
|
||||||
|
unsigned int instance_mode;
|
||||||
|
} bulkdata;
|
||||||
|
|
||||||
|
int bulkdata_config_init(struct bulkdata *bulkdata);
|
||||||
|
int bulkdata_config_fini(struct bulkdata *bulkdata);
|
||||||
|
|
||||||
|
#ifndef FREE
|
||||||
|
#define FREE(x) do { if(x) {free(x); x = NULL;} } while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif //__CONFIG_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1293
bulkdata/src/datamodel.c
Normal file
1293
bulkdata/src/datamodel.c
Normal file
File diff suppressed because it is too large
Load Diff
29
bulkdata/src/datamodel.h
Normal file
29
bulkdata/src/datamodel.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License version 2.1
|
||||||
|
* as published by the Free Software Foundation
|
||||||
|
*
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BULKDATA_H_
|
||||||
|
#define _BULKDATA_H_
|
||||||
|
|
||||||
|
#include <libbbf_api/dmcommon.h>
|
||||||
|
|
||||||
|
extern DMOBJ tDeviceBulkDataObj[];
|
||||||
|
extern DMOBJ tBulkDataObj[];
|
||||||
|
extern DMLEAF tBulkDataParams[];
|
||||||
|
extern DMOBJ tBulkDataProfileObj[];
|
||||||
|
extern DMLEAF tBulkDataProfileParams[];
|
||||||
|
extern DMLEAF tBulkDataProfileParameterParams[];
|
||||||
|
extern DMLEAF tBulkDataProfileCSVEncodingParams[];
|
||||||
|
extern DMLEAF tBulkDataProfileJSONEncodingParams[];
|
||||||
|
extern DMOBJ tBulkDataProfileHTTPObj[];
|
||||||
|
extern DMLEAF tBulkDataProfileHTTPParams[];
|
||||||
|
extern DMLEAF tBulkDataProfileHTTPRequestURIParameterParams[];
|
||||||
|
|
||||||
|
#endif //__BULKDATA_H_
|
||||||
|
|
||||||
196
bulkdata/src/http.c
Normal file
196
bulkdata/src/http.c
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
* Omar Kallel <omar.kallel@pivasoftware.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "http.h"
|
||||||
|
|
||||||
|
static struct http_client http_c;
|
||||||
|
static CURL *curl;
|
||||||
|
|
||||||
|
int http_client_init(struct profile *profile)
|
||||||
|
{
|
||||||
|
char *url = create_request_url(profile);
|
||||||
|
if(url) {
|
||||||
|
asprintf(&http_c.url, "%s", url);
|
||||||
|
free(url);
|
||||||
|
}
|
||||||
|
bulkdata_log(SINFO, "ACS url: %s", http_c.url);
|
||||||
|
|
||||||
|
curl_global_init(CURL_GLOBAL_SSL);
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if (!curl) return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void http_client_exit(void)
|
||||||
|
{
|
||||||
|
FREE(http_c.url);
|
||||||
|
|
||||||
|
if (http_c.header_list) {
|
||||||
|
curl_slist_free_all(http_c.header_list);
|
||||||
|
http_c.header_list = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
curl_global_cleanup();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static size_t http_get_response(void *buffer, size_t size, size_t rxed, char **msg_in)
|
||||||
|
{
|
||||||
|
char *c;
|
||||||
|
|
||||||
|
if (asprintf(&c, "%s%.*s", *msg_in, (int) (size * rxed), (char *)buffer) == -1) {
|
||||||
|
FREE(*msg_in);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(*msg_in);
|
||||||
|
*msg_in = c;
|
||||||
|
|
||||||
|
return size * rxed;
|
||||||
|
}
|
||||||
|
|
||||||
|
int http_send_message(struct profile *profile, char *msg_out, int msg_out_len, char **msg_in)
|
||||||
|
{
|
||||||
|
CURLcode res;
|
||||||
|
long http_code = 0;
|
||||||
|
char errbuf[CURL_ERROR_SIZE];
|
||||||
|
|
||||||
|
http_c.header_list = NULL;
|
||||||
|
http_c.header_list = curl_slist_append(http_c.header_list, "User-Agent: iopsys-bulkdata");
|
||||||
|
if (!http_c.header_list) return -1;
|
||||||
|
|
||||||
|
if (profile->http_use_date_header) {
|
||||||
|
if (bulkdata_get_time() != NULL) {
|
||||||
|
http_c.header_list = curl_slist_append(http_c.header_list, bulkdata_get_time());
|
||||||
|
if (!http_c.header_list) return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(profile->encoding_type, "json") == 0) {
|
||||||
|
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Type: application/json; charset=\"utf-8\"");
|
||||||
|
if (!http_c.header_list) return -1;
|
||||||
|
|
||||||
|
if(strcmp (profile->json_encoding_report_format, "objecthierarchy") == 0) {
|
||||||
|
http_c.header_list = curl_slist_append(http_c.header_list, "BBF-Report-Format: \"ObjectHierarchy\"");
|
||||||
|
if (!http_c.header_list) return -1;
|
||||||
|
} else if(strcmp(profile->json_encoding_report_format, "namevaluepair") == 0) {
|
||||||
|
http_c.header_list = curl_slist_append(http_c.header_list, "BBF-Report-Format: \"NameValuePair\"");
|
||||||
|
if (!http_c.header_list) return -1;
|
||||||
|
}
|
||||||
|
} else if(strcmp(profile->encoding_type, "csv") == 0) {
|
||||||
|
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Type: text/csv; charset=\"utf-8\"");
|
||||||
|
if (!http_c.header_list) return -1;
|
||||||
|
|
||||||
|
if(strcmp (profile->csv_encoding_report_format, "row") == 0) {
|
||||||
|
http_c.header_list = curl_slist_append(http_c.header_list, "BBF-Report-Format: \"ParameterPerRow\"");
|
||||||
|
if (!http_c.header_list) return -1;
|
||||||
|
} else if(strcmp (profile->csv_encoding_report_format, "column") == 0) {
|
||||||
|
http_c.header_list = curl_slist_append(http_c.header_list, "BBF-Report-Format: \"ParameterPerColumn\"");
|
||||||
|
if (!http_c.header_list) return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, http_c.url);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_USERNAME, profile->http_username);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_PASSWORD, profile->http_password);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC|CURLAUTH_DIGEST);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_TIMEOUT, HTTP_TIMEOUT);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, HTTP_TIMEOUT);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_NOBODY, 0);
|
||||||
|
|
||||||
|
if(strcasecmp(profile->http_compression, "gzip") == 0) {
|
||||||
|
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "gzip");
|
||||||
|
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Encoding: gzip");
|
||||||
|
} else if(strcasecmp(profile->http_compression, "compress") == 0) {
|
||||||
|
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "compress");
|
||||||
|
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Encoding: compress");
|
||||||
|
} else if(strcasecmp(profile->http_compression, "deflate") == 0) {
|
||||||
|
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "deflate");
|
||||||
|
http_c.header_list = curl_slist_append(http_c.header_list, "Content-Encoding: deflate");
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_c.header_list);
|
||||||
|
if(strcasecmp(profile->http_method, "put") == 0)
|
||||||
|
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
|
||||||
|
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, msg_out);
|
||||||
|
if (msg_out)
|
||||||
|
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) msg_out_len);
|
||||||
|
else
|
||||||
|
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0);
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_get_response);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, msg_in);
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
|
||||||
|
|
||||||
|
if (profile->http_ssl_capath)
|
||||||
|
curl_easy_setopt(curl, CURLOPT_CAPATH, profile->http_ssl_capath);
|
||||||
|
if (profile->http_insecure_enable) {
|
||||||
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
|
||||||
|
}
|
||||||
|
*msg_in = (char *) calloc (1, sizeof(char));
|
||||||
|
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
if(res != CURLE_OK) {
|
||||||
|
size_t len = strlen(errbuf);
|
||||||
|
if(len) {
|
||||||
|
if (errbuf[len - 1] == '\n') errbuf[len - 1] = '\0';
|
||||||
|
bulkdata_log(SCRIT, "libcurl: (%d) %s", res, errbuf);
|
||||||
|
} else {
|
||||||
|
bulkdata_log(SCRIT, "libcurl: (%d) %s", res, curl_easy_strerror(res));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strlen(*msg_in))
|
||||||
|
FREE(*msg_in);
|
||||||
|
|
||||||
|
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
|
||||||
|
if(http_code == 200)
|
||||||
|
bulkdata_log(SINFO, "Receive HTTP 200 OK from Bulkdata Collector");
|
||||||
|
else if(http_code == 401)
|
||||||
|
bulkdata_log(SINFO, "Receive HTTP 401 Unauthorized from Bulkdata Collector");
|
||||||
|
else if(http_code == 204)
|
||||||
|
bulkdata_log(SINFO, "Receive HTTP 204 No Content from Bulkdata Collector");
|
||||||
|
else
|
||||||
|
bulkdata_log(SINFO, "Receive HTTP %d from Bulkdata Collector", http_code);
|
||||||
|
|
||||||
|
if(http_code == 415)
|
||||||
|
{
|
||||||
|
strcpy(profile->http_compression, "None");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (http_code != 200 && http_code != 204)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
curl_easy_reset(curl);
|
||||||
|
if (http_c.header_list) {
|
||||||
|
curl_slist_free_all(http_c.header_list);
|
||||||
|
http_c.header_list = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res) goto error;
|
||||||
|
|
||||||
|
return http_code;
|
||||||
|
|
||||||
|
error:
|
||||||
|
FREE(*msg_in);
|
||||||
|
if (http_c.header_list) {
|
||||||
|
curl_slist_free_all(http_c.header_list);
|
||||||
|
http_c.header_list = NULL;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
37
bulkdata/src/http.h
Normal file
37
bulkdata/src/http.h
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __HTTP_H
|
||||||
|
#define __HTTP_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include "config.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "times.h"
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#define HTTP_TIMEOUT 30
|
||||||
|
|
||||||
|
struct http_client
|
||||||
|
{
|
||||||
|
struct curl_slist *header_list;
|
||||||
|
char *url;
|
||||||
|
};
|
||||||
|
|
||||||
|
int http_client_init(struct profile *profile);
|
||||||
|
void http_client_exit(void);
|
||||||
|
int http_send_message(struct profile *profile, char *msg_out, int msg_out_len, char **msg_in);
|
||||||
|
|
||||||
|
#endif //__HTTP_H
|
||||||
57
bulkdata/src/log.c
Normal file
57
bulkdata/src/log.c
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "bulkdata.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
static const int log_syslogmap[] = {
|
||||||
|
[SCRIT] = LOG_CRIT,
|
||||||
|
[SWARNING] = LOG_WARNING,
|
||||||
|
[SNOTICE] = LOG_NOTICE,
|
||||||
|
[SINFO] = LOG_INFO,
|
||||||
|
[SDEBUG] = LOG_DEBUG
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* log_str[] = {
|
||||||
|
[SCRIT] = "CRITICAL",
|
||||||
|
[SWARNING] = "WARNING",
|
||||||
|
[SNOTICE] = "NOTICE",
|
||||||
|
[SINFO] = "INFO",
|
||||||
|
[SDEBUG] = "DEBUG"
|
||||||
|
};
|
||||||
|
|
||||||
|
void bulkdata_log(int priority, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list vl;
|
||||||
|
|
||||||
|
if (priority <= bulkdata_main.log_level) {
|
||||||
|
time_t t = time(NULL);
|
||||||
|
struct tm tm = *localtime(&t);
|
||||||
|
va_start(vl, format);
|
||||||
|
printf("%d-%02d-%02d %02d:%02d:%02d [bulkdata] %s - ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, log_str[priority]);
|
||||||
|
vprintf(format, vl);
|
||||||
|
va_end(vl);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
openlog("bulkdata", 0, LOG_DAEMON);
|
||||||
|
va_start(vl, format);
|
||||||
|
vsyslog(log_syslogmap[priority], format, vl);
|
||||||
|
va_end(vl);
|
||||||
|
closelog();
|
||||||
|
}
|
||||||
|
}
|
||||||
28
bulkdata/src/log.h
Normal file
28
bulkdata/src/log.h
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LOG_H
|
||||||
|
#define __LOG_H
|
||||||
|
|
||||||
|
#define DEFAULT_LOGLEVEL SINFO
|
||||||
|
|
||||||
|
enum bulkdata_log_level_enum {
|
||||||
|
SCRIT,
|
||||||
|
SWARNING,
|
||||||
|
SNOTICE,
|
||||||
|
SINFO,
|
||||||
|
SDEBUG,
|
||||||
|
__MAX_SLOG
|
||||||
|
};
|
||||||
|
|
||||||
|
void bulkdata_log(int priority, const char *format, ...);
|
||||||
|
|
||||||
|
#endif //__LOG_H
|
||||||
336
bulkdata/src/report.c
Normal file
336
bulkdata/src/report.c
Normal file
@@ -0,0 +1,336 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
* Author: Omar Kallel <omar.kallel@pivasoftware.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "report.h"
|
||||||
|
|
||||||
|
static void add_new_json_obj(json_object *json_obj, char *name, char *data, char *type)
|
||||||
|
{
|
||||||
|
json_object *jobj;
|
||||||
|
if(strstr(type, "unsignedInt") || strstr(type, "int") || strstr(type, "long"))
|
||||||
|
jobj = json_object_new_int64(atoi(data));
|
||||||
|
else if(strstr(type, "bool"))
|
||||||
|
jobj = json_object_new_boolean(atoi(data));
|
||||||
|
else
|
||||||
|
jobj = json_object_new_string(data);
|
||||||
|
|
||||||
|
json_object_object_add(json_obj, name, jobj);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void create_json_bulkdata_report_object_hierarchy(struct profile *profile, char **report)
|
||||||
|
{
|
||||||
|
struct json_object *json_obj, *json_obj1, *json_obj2;
|
||||||
|
struct resultsnode *p;
|
||||||
|
int i, j, profile_param_number = profile->profile_parameter_number;
|
||||||
|
char *param_name, *result, *pch, *pchr, *collection_time = NULL;
|
||||||
|
char buf[1024] = {0};
|
||||||
|
|
||||||
|
json_obj = json_object_new_object();
|
||||||
|
get_time_stamp(profile->json_encoding_report_time_stamp, &collection_time);
|
||||||
|
if(collection_time) {
|
||||||
|
if(strcmp(profile->json_encoding_report_time_stamp, "iso8601") == 0)
|
||||||
|
json_object_object_add(json_obj, "CollectionTime", json_object_new_string(collection_time));
|
||||||
|
else
|
||||||
|
json_object_object_add(json_obj, "CollectionTime", json_object_new_int64(atoi(collection_time)));
|
||||||
|
free(collection_time);
|
||||||
|
}
|
||||||
|
json_obj2 = json_obj;
|
||||||
|
for (i = 0; i < profile_param_number; i++) {
|
||||||
|
LIST_HEAD(results_list);
|
||||||
|
bulkdata_get_value_results(profile->profile_parameter[i].reference, &results_list);
|
||||||
|
list_for_each_entry(p, &results_list, list) {
|
||||||
|
char *argv[128] = {0};
|
||||||
|
j = 0;
|
||||||
|
param_name = get_bulkdata_profile_parameter_name(profile->profile_parameter[i].reference, profile->profile_parameter[i].name, p->name);
|
||||||
|
strcpy(buf, param_name);
|
||||||
|
for (pch = strtok_r(buf, ".", &pchr); pch != NULL; pch = strtok_r(NULL, ".", &pchr)) {
|
||||||
|
argv[j] = pch;
|
||||||
|
json_obj1 = (json_object *)bbf_api_dmjson_select_obj(json_obj, argv);
|
||||||
|
if (json_obj1)
|
||||||
|
json_obj2 = json_obj1;
|
||||||
|
else {
|
||||||
|
if (pchr != NULL && *pchr != '\0') {
|
||||||
|
json_object *new_obj = json_object_new_object();
|
||||||
|
json_object_object_add(json_obj2, pch, new_obj);
|
||||||
|
json_obj2 = new_obj;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
add_new_json_obj(json_obj2, pch, p->data, p->type);
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bulkdata_free_data_from_list(&results_list);
|
||||||
|
FREE(param_name);
|
||||||
|
}
|
||||||
|
result = (char *)json_object_to_json_string_ext(json_obj, JSON_C_TO_STRING_PRETTY);
|
||||||
|
*report = strdup(result);
|
||||||
|
json_object_put(json_obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void create_json_bulkdata_report_name_value_pair(struct profile *profile, char **report)
|
||||||
|
{
|
||||||
|
struct json_object *json_obj;
|
||||||
|
struct resultsnode *p;
|
||||||
|
char *param_name, *result, *collection_time = NULL;
|
||||||
|
int i = 0, profile_param_number = profile->profile_parameter_number;
|
||||||
|
|
||||||
|
json_obj = json_object_new_object();
|
||||||
|
get_time_stamp(profile->json_encoding_report_time_stamp, &collection_time);
|
||||||
|
if(collection_time) {
|
||||||
|
if(strcmp(profile->json_encoding_report_time_stamp, "iso8601") == 0)
|
||||||
|
json_object_object_add(json_obj, "CollectionTime", json_object_new_string(collection_time));
|
||||||
|
else
|
||||||
|
json_object_object_add(json_obj, "CollectionTime", json_object_new_int64(atoi(collection_time)));
|
||||||
|
free(collection_time);
|
||||||
|
}
|
||||||
|
for (i = 0; i < profile_param_number; i++) {
|
||||||
|
LIST_HEAD(results_list);
|
||||||
|
bulkdata_get_value_results(profile->profile_parameter[i].reference, &results_list);
|
||||||
|
list_for_each_entry(p, &results_list, list) {
|
||||||
|
param_name = get_bulkdata_profile_parameter_name(profile->profile_parameter[i].reference, profile->profile_parameter[i].name, p->name);
|
||||||
|
add_new_json_obj(json_obj, param_name, p->data, p->type);
|
||||||
|
FREE(param_name);
|
||||||
|
}
|
||||||
|
bulkdata_free_data_from_list(&results_list);
|
||||||
|
}
|
||||||
|
result = (char *)json_object_to_json_string_ext(json_obj, JSON_C_TO_STRING_PRETTY);
|
||||||
|
*report = strdup(result);
|
||||||
|
json_object_put(json_obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void add_failed_reports_to_report_json(struct profile *profile, char *new_report, char **report, int isnext)
|
||||||
|
{
|
||||||
|
json_object *json_obj, *json_array, *json_string;
|
||||||
|
struct failed_reports *retreport = NULL;
|
||||||
|
char *msgout = NULL;
|
||||||
|
int j = 0;
|
||||||
|
|
||||||
|
json_obj = json_object_new_object();
|
||||||
|
json_array = json_object_new_array();
|
||||||
|
json_object_object_add(json_obj,"Report", json_array);
|
||||||
|
|
||||||
|
if(list_empty(profile->failed_reports))
|
||||||
|
goto new_report;
|
||||||
|
|
||||||
|
list_for_each_entry(retreport, profile->failed_reports, list) {
|
||||||
|
if(!j && isnext) {
|
||||||
|
j = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
json_string = json_tokener_parse(retreport->freport);
|
||||||
|
json_object_array_add(json_array, json_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
new_report :
|
||||||
|
if(new_report) {
|
||||||
|
json_string = json_tokener_parse(new_report);
|
||||||
|
json_object_array_add(json_array, json_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgout = (char *)json_object_to_json_string_ext(json_obj, JSON_C_TO_STRING_PRETTY);
|
||||||
|
*report = strdup(msgout);
|
||||||
|
json_object_put(json_obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void create_report_json(char *new_report, char **report)
|
||||||
|
{
|
||||||
|
json_object *json_obj, *json_array, *json_string;
|
||||||
|
char *msgout = NULL;
|
||||||
|
|
||||||
|
json_obj = json_object_new_object();
|
||||||
|
json_array = json_object_new_array();
|
||||||
|
json_object_object_add(json_obj,"Report", json_array);
|
||||||
|
|
||||||
|
if(new_report) {
|
||||||
|
json_string = json_tokener_parse(new_report);
|
||||||
|
json_object_array_add(json_array, json_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgout = (char *)json_object_to_json_string_ext(json_obj, JSON_C_TO_STRING_PRETTY);
|
||||||
|
*report = strdup(msgout);
|
||||||
|
json_object_put(json_obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
int create_json_bulkdata_report(struct profile *profile, char **report)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* create json msg of current report
|
||||||
|
* parse failed reports list and add it to the report
|
||||||
|
* then add new report to the report
|
||||||
|
*/
|
||||||
|
char *msgout;
|
||||||
|
|
||||||
|
profile->new_report = NULL;
|
||||||
|
if(strcmp(profile->json_encoding_report_format, "objecthierarchy") == 0) {
|
||||||
|
create_json_bulkdata_report_object_hierarchy(profile, &msgout);
|
||||||
|
} else if(strcmp(profile->json_encoding_report_format, "namevaluepair") == 0) {
|
||||||
|
create_json_bulkdata_report_name_value_pair(profile, &msgout);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(profile->nbre_of_retained_failed_reports != 0) {
|
||||||
|
if(profile->nbre_failed_reports >= profile->nbre_of_retained_failed_reports && profile->nbre_of_retained_failed_reports > 0)
|
||||||
|
add_failed_reports_to_report_json(profile, msgout, report, 1);
|
||||||
|
else
|
||||||
|
add_failed_reports_to_report_json(profile, msgout, report, 0);
|
||||||
|
} else {
|
||||||
|
create_report_json(msgout, report);
|
||||||
|
}
|
||||||
|
|
||||||
|
append_string_to_string(msgout, &profile->new_report);
|
||||||
|
FREE(msgout);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int create_csv_bulkdata_report(struct profile *profile, char **report)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* create csv msg of current report
|
||||||
|
* parse failed reports list and add it to the report
|
||||||
|
*/
|
||||||
|
int i;
|
||||||
|
struct resultsnode *p;
|
||||||
|
char *str1 = NULL, *str2 = NULL, *str = NULL, *paramprofilename, *timestamp = NULL, *type = NULL, rowseparator = '\0', separator = '\0';
|
||||||
|
|
||||||
|
if(strcmp(profile->csv_encoding_row_separator, " ") == 0)
|
||||||
|
rowseparator = '\n';
|
||||||
|
else if(strcmp(profile->csv_encoding_row_separator, " ") == 0)
|
||||||
|
rowseparator = '\r';
|
||||||
|
|
||||||
|
if(profile->csv_encoding_field_separator)
|
||||||
|
separator = profile->csv_encoding_field_separator[0];
|
||||||
|
|
||||||
|
get_time_stamp(profile->csv_encoding_row_time_stamp, ×tamp);
|
||||||
|
/*
|
||||||
|
* Create header ReportTimestamp,ParameterName,ParameterValue,ParameterType in case of ParameterPerRow
|
||||||
|
*/
|
||||||
|
if(strcmp(profile->csv_encoding_report_format, "row") == 0) {
|
||||||
|
if(timestamp == NULL)
|
||||||
|
asprintf(&str, "ParameterName%cParameterValue%cParameterType%c", separator, separator, rowseparator);
|
||||||
|
else
|
||||||
|
asprintf(&str, "ReportTimestamp%cParameterName%cParameterValue%cParameterType%c", separator, separator, separator, rowseparator);
|
||||||
|
append_string_to_string(str, report);
|
||||||
|
FREE(str);
|
||||||
|
if(profile->nbre_of_retained_failed_reports != 0) {
|
||||||
|
if(profile->nbre_failed_reports >= profile->nbre_of_retained_failed_reports && profile->nbre_of_retained_failed_reports > 0)
|
||||||
|
add_failed_reports_to_report_csv(profile, report, 1);
|
||||||
|
else
|
||||||
|
add_failed_reports_to_report_csv(profile, report, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(strcmp(profile->csv_encoding_report_format, "column") == 0 && timestamp != NULL) {
|
||||||
|
if(profile->nbre_of_retained_failed_reports != 0) {
|
||||||
|
if(profile->nbre_failed_reports >= profile->nbre_of_retained_failed_reports && profile->nbre_of_retained_failed_reports > 0)
|
||||||
|
add_failed_reports_to_report_csv(profile, report, 1);
|
||||||
|
else
|
||||||
|
add_failed_reports_to_report_csv(profile, report, 0);
|
||||||
|
}
|
||||||
|
append_string_to_string("ReportTimestamp", &str1);
|
||||||
|
append_string_to_string(timestamp, &str2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add New reports
|
||||||
|
*/
|
||||||
|
profile->new_report = NULL;
|
||||||
|
for(i = 0; i < profile->profile_parameter_number; i++) {
|
||||||
|
LIST_HEAD(results_list);
|
||||||
|
bulkdata_get_value_results(profile->profile_parameter[i].reference, &results_list);
|
||||||
|
list_for_each_entry(p, &results_list, list) {
|
||||||
|
paramprofilename = get_bulkdata_profile_parameter_name(profile->profile_parameter[i].reference, profile->profile_parameter[i].name, p->name);
|
||||||
|
if(strcmp(profile->csv_encoding_report_format, "row") == 0) {
|
||||||
|
type = strstr(p->type, ":");
|
||||||
|
if(timestamp == NULL)
|
||||||
|
asprintf(&str, "%s%c%s%c%s%c", paramprofilename, separator, p->data, separator, type+1, rowseparator);
|
||||||
|
else
|
||||||
|
asprintf(&str, "%s%c%s%c%s%c%s%c", timestamp, separator, paramprofilename, separator, p->data, separator, type+1, rowseparator);
|
||||||
|
append_string_to_string(str, report);
|
||||||
|
append_string_to_string(str, &profile->new_report);
|
||||||
|
FREE(str);
|
||||||
|
} else if(strcmp(profile->csv_encoding_report_format, "column") == 0) {
|
||||||
|
if(str1 == NULL || strlen(str1) <= 0)
|
||||||
|
asprintf(&str, "%s", paramprofilename);
|
||||||
|
else
|
||||||
|
asprintf(&str, "%c%s", separator, paramprofilename);
|
||||||
|
append_string_to_string(str, &str1);
|
||||||
|
FREE(str);
|
||||||
|
if(str2 == NULL || strlen(str2) <= 0)
|
||||||
|
asprintf(&str, "%s", p->data);
|
||||||
|
else
|
||||||
|
asprintf(&str, "%c%s", separator, p->data);
|
||||||
|
append_string_to_string(str, &str2);
|
||||||
|
FREE(str);
|
||||||
|
}
|
||||||
|
FREE(paramprofilename);
|
||||||
|
}
|
||||||
|
bulkdata_free_data_from_list(&results_list);
|
||||||
|
}
|
||||||
|
if(strcmp(profile->csv_encoding_report_format, "column") == 0) {
|
||||||
|
asprintf(&str, "%c", rowseparator);
|
||||||
|
append_string_to_string(str, &str1);
|
||||||
|
append_string_to_string(str, &str2);
|
||||||
|
append_string_to_string(str1, report);
|
||||||
|
append_string_to_string(str2, report);
|
||||||
|
append_string_to_string(str1, &profile->new_report);
|
||||||
|
append_string_to_string(str2, &profile->new_report);
|
||||||
|
}
|
||||||
|
FREE(str);
|
||||||
|
FREE(str1);
|
||||||
|
FREE(str2);
|
||||||
|
FREE(timestamp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void create_json_failed_report(struct profile *profile, char **report)
|
||||||
|
{
|
||||||
|
add_failed_reports_to_report_json(profile, NULL, report, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void create_csv_failed_report(struct profile *profile, char **report)
|
||||||
|
{
|
||||||
|
char rowseparator = '\0', separator = '\0', *timestamp = NULL;
|
||||||
|
|
||||||
|
if(strcmp(profile->csv_encoding_row_separator, " ") == 0) {
|
||||||
|
rowseparator = '\n';
|
||||||
|
} else if(strcmp(profile->csv_encoding_row_separator, " ") == 0) {
|
||||||
|
rowseparator = '\r';
|
||||||
|
}
|
||||||
|
|
||||||
|
if(profile->csv_encoding_field_separator)
|
||||||
|
separator = profile->csv_encoding_field_separator[0];
|
||||||
|
|
||||||
|
get_time_stamp(profile->csv_encoding_row_time_stamp, ×tamp);
|
||||||
|
if(strcmp(profile->csv_encoding_report_format, "row") == 0) {
|
||||||
|
if(timestamp == NULL)
|
||||||
|
asprintf(report, "ParameterName%cParameterValue%cParameterType%c", separator, separator, rowseparator);
|
||||||
|
else
|
||||||
|
asprintf(report, "ReportTimestamp%cParameterName%cParameterValue%cParameterType%c", separator, separator, separator, rowseparator);
|
||||||
|
}
|
||||||
|
add_failed_reports_to_report_csv(profile, report, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void create_encoding_bulkdata_report(struct profile *profile, char **report)
|
||||||
|
{
|
||||||
|
if(strcasecmp(profile->encoding_type, "json") == 0) {
|
||||||
|
create_json_bulkdata_report(profile, report);
|
||||||
|
} else if(strcasecmp(profile->encoding_type, "csv") == 0) {
|
||||||
|
create_csv_bulkdata_report(profile, report);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void create_failed_report(struct profile *profile, char **report)
|
||||||
|
{
|
||||||
|
if(strcasecmp(profile->encoding_type, "json") == 0) {
|
||||||
|
create_json_failed_report(profile, report);
|
||||||
|
} else if(strcasecmp(profile->encoding_type, "csv") == 0) {
|
||||||
|
create_csv_failed_report(profile, report);
|
||||||
|
}
|
||||||
|
}
|
||||||
24
bulkdata/src/report.h
Normal file
24
bulkdata/src/report.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
* Author: Omar Kallel <omar.kallel@pivasoftware.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __REPORT_H_
|
||||||
|
#define __REPORT_H_
|
||||||
|
|
||||||
|
#include <json-c/json.h>
|
||||||
|
#include "common.h"
|
||||||
|
#include "times.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
void create_encoding_bulkdata_report(struct profile *profile, char **report);
|
||||||
|
void create_failed_report(struct profile *profile, char **report);
|
||||||
|
|
||||||
|
#endif /* __REPORT_H_ */
|
||||||
62
bulkdata/src/times.c
Normal file
62
bulkdata/src/times.c
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "times.h"
|
||||||
|
|
||||||
|
const char *bulkdata_get_time(void)
|
||||||
|
{
|
||||||
|
static char local_time[64];
|
||||||
|
|
||||||
|
time_t t_time = time(NULL);
|
||||||
|
struct tm *t_tm = localtime(&t_time);
|
||||||
|
if (t_tm == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (strftime(local_time, sizeof(local_time),"Date: %a, %d %b %Y %X%z GMT", t_tm) == 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return local_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_time_stamp(const char *format, char **timestamp)
|
||||||
|
{
|
||||||
|
time_t now = time(NULL);
|
||||||
|
|
||||||
|
if (strcmp(format, "unix") == 0) {
|
||||||
|
asprintf(timestamp, "%ld", now);
|
||||||
|
} else if (strcmp(format, "iso8601") == 0) {
|
||||||
|
char buf[32] = {0};
|
||||||
|
struct tm *ts = localtime(&now);
|
||||||
|
strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S%Z", ts);
|
||||||
|
asprintf(timestamp, "%s", buf);
|
||||||
|
} else
|
||||||
|
timestamp = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int get_next_period(time_t time_reference, int reporting_interval)
|
||||||
|
{
|
||||||
|
unsigned int next_period;
|
||||||
|
time_t now = time(NULL);
|
||||||
|
|
||||||
|
if (now > time_reference)
|
||||||
|
next_period = reporting_interval - ((now - time_reference) % reporting_interval);
|
||||||
|
else
|
||||||
|
next_period = (time_reference - now) % reporting_interval;
|
||||||
|
|
||||||
|
if (next_period == 0)
|
||||||
|
next_period = reporting_interval;
|
||||||
|
|
||||||
|
return next_period;
|
||||||
|
}
|
||||||
19
bulkdata/src/times.h
Normal file
19
bulkdata/src/times.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
|
* Author: Amin Ben Ramdhane <amin.benramdhane@pivasoftware.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TIMES_H
|
||||||
|
#define __TIMES_H
|
||||||
|
|
||||||
|
const char *bulkdata_get_time(void);
|
||||||
|
void get_time_stamp(const char *format, char **timestamp);
|
||||||
|
unsigned int get_next_period(time_t time_reference, int reporting_interval);
|
||||||
|
|
||||||
|
#endif /* __TIMES_H */
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (C) 2019 IOPSYS
|
|
||||||
#
|
|
||||||
|
|
||||||
include $(TOPDIR)/rules.mk
|
|
||||||
|
|
||||||
PKG_NAME:=bulut
|
|
||||||
PKG_VERSION:=0.2
|
|
||||||
|
|
||||||
PKG_SOURCE_PROTO:=git
|
|
||||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/bulut/bulut-gw-client.git
|
|
||||||
PKG_SOURCE_VERSION:=227700c44817afa2c392fa08bf4cf70fa6177f01
|
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
|
||||||
PKG_MIRROR_HASH:=skip
|
|
||||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
|
||||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
|
||||||
|
|
||||||
define Package/bulut
|
|
||||||
CATEGORY:=Utilities
|
|
||||||
DEPENDS:=
|
|
||||||
TITLE:=bulut
|
|
||||||
endef
|
|
||||||
|
|
||||||
TARGET_CFLAGS += \
|
|
||||||
-I$(STAGING_DIR)/usr/include
|
|
||||||
|
|
||||||
define Package/bulut/description
|
|
||||||
obuspa keys
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/bulut/install
|
|
||||||
$(CP) $(PKG_BUILD_DIR)/files/* $(1)/
|
|
||||||
endef
|
|
||||||
|
|
||||||
$(eval $(call BuildPackage,bulut))
|
|
||||||
40
crashlog/Makefile
Normal file
40
crashlog/Makefile
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2019 iopsys Software Solutions AB
|
||||||
|
#
|
||||||
|
# This is free software, licensed under the GNU General Public License v2.
|
||||||
|
# See /LICENSE for more information.
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
|
PKG_NAME:=crashlog
|
||||||
|
PKG_VERSION:=1.0.0
|
||||||
|
PKG_RELEASE:=1
|
||||||
|
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
||||||
|
PKG_LICENSE:=GPLv2
|
||||||
|
PKG_LICENSE_FILES:=none
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
|
define Package/crashlog
|
||||||
|
CATEGORY:=Utilities
|
||||||
|
TITLE:=Handling kernel crash logs
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/crashlog/description
|
||||||
|
Handling kernel crash logs.
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Prepare
|
||||||
|
mkdir -p $(PKG_BUILD_DIR)
|
||||||
|
$(CP) ./files/* $(PKG_BUILD_DIR)/
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Compile
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/crashlog/install
|
||||||
|
$(CP) ./files/* $(1)/
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call BuildPackage,crashlog))
|
||||||
BIN
crashlog/files/etc/dropbear/logid
Normal file
BIN
crashlog/files/etc/dropbear/logid
Normal file
Binary file not shown.
11
crashlog/files/etc/init.d/corelog
Executable file
11
crashlog/files/etc/init.d/corelog
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/sh /etc/rc.common
|
||||||
|
|
||||||
|
START=01
|
||||||
|
|
||||||
|
start()
|
||||||
|
{
|
||||||
|
if [ -e /proc/sys/kernel/core_pattern ]
|
||||||
|
then
|
||||||
|
echo "|/sbin/logcore %e %s" > /proc/sys/kernel/core_pattern
|
||||||
|
fi
|
||||||
|
}
|
||||||
55
crashlog/files/etc/init.d/crashlog
Executable file
55
crashlog/files/etc/init.d/crashlog
Executable file
@@ -0,0 +1,55 @@
|
|||||||
|
#!/bin/sh /etc/rc.common
|
||||||
|
|
||||||
|
START=99
|
||||||
|
|
||||||
|
send_log()
|
||||||
|
{
|
||||||
|
nr=$(db get hw.board.serial_number)
|
||||||
|
hw=$(db get hw.board.model_name)
|
||||||
|
fam=$(db get hw.board.iopVerFam)
|
||||||
|
sw=$(db get hw.board.iopVersion)
|
||||||
|
server=$(/sbin/uci get system.crashlog.server)
|
||||||
|
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
scp -S /usr/sbin/logssh /proc/last_kmsg log@${server}:log/${fam}_${hw}_${sw}_${nr}
|
||||||
|
if [ $? == 0 ]
|
||||||
|
then
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
# wait for another minute then try again
|
||||||
|
sleep 60
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
fill_in_default()
|
||||||
|
{
|
||||||
|
/sbin/uci add system log
|
||||||
|
/sbin/uci rename system.@log[-1]=crashlog
|
||||||
|
/sbin/uci set system.crashlog.enable=no
|
||||||
|
/sbin/uci set system.crashlog.server="crashlog.iopsys.eu"
|
||||||
|
/sbin/uci commit
|
||||||
|
}
|
||||||
|
|
||||||
|
boot()
|
||||||
|
{
|
||||||
|
# is crashlog enabled ?
|
||||||
|
enable=$(/sbin/uci get system.crashlog.enable)
|
||||||
|
case $enable in
|
||||||
|
0|no|NO|false|FALSE)
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
fill_in_default
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# is this boot a result from a crash ?
|
||||||
|
reason=$(cat /etc/boot_reason)
|
||||||
|
case $reason in
|
||||||
|
HW|WD)
|
||||||
|
send_log&
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
60
crashlog/files/sbin/logcore
Executable file
60
crashlog/files/sbin/logcore
Executable file
@@ -0,0 +1,60 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
TMP_CORE=/tmp/new_core
|
||||||
|
# first test if we can contact the log server.
|
||||||
|
# if not abort directly the core file takes up memory
|
||||||
|
alive()
|
||||||
|
{
|
||||||
|
ping -c1 $server
|
||||||
|
|
||||||
|
if [ $? != 0 ]
|
||||||
|
then
|
||||||
|
# drain core file from kernel
|
||||||
|
cat >/dev/null
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
fill_in_default()
|
||||||
|
{
|
||||||
|
/sbin/uci add system log
|
||||||
|
/sbin/uci rename system.@log[-1]=corelog
|
||||||
|
/sbin/uci set system.corelog.enable=no
|
||||||
|
/sbin/uci set system.corelog.server="corelog.iopsys.eu"
|
||||||
|
/sbin/uci commit
|
||||||
|
}
|
||||||
|
|
||||||
|
# is corelog enabled ?
|
||||||
|
enable=$(/sbin/uci get system.corelog.enable)
|
||||||
|
case $enable in
|
||||||
|
0|no|NO|false|FALSE)
|
||||||
|
# drain core file from kernel
|
||||||
|
cat >/dev/null
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
fill_in_default
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
server=$(/sbin/uci get system.corelog.server)
|
||||||
|
|
||||||
|
alive
|
||||||
|
|
||||||
|
# dump out the core to disk we need this as scp needs a size before we send data
|
||||||
|
# and this is the only way to know how much data there is
|
||||||
|
cat >$TMP_CORE
|
||||||
|
|
||||||
|
# in case filesystem/memory is full at least kill the core in the kernel memory should give us some
|
||||||
|
# more memory to work with. normally this would do nothing.
|
||||||
|
cat >/dev/null
|
||||||
|
|
||||||
|
nr=$(db get hw.board.serial_number)
|
||||||
|
hw=$(db get hw.board.model_name)
|
||||||
|
fam=$(hw.board.iopVerFam)
|
||||||
|
sw=$(db get hw.board.iopVersion)
|
||||||
|
|
||||||
|
scp -S /usr/sbin/logssh $TMP_CORE log@${server}:log/core_${1}_${2}_${fam}_${hw}_${sw}_${nr}
|
||||||
|
rm $TMP_CORE
|
||||||
|
|
||||||
6
crashlog/files/usr/sbin/logssh
Executable file
6
crashlog/files/usr/sbin/logssh
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# we need to have the -y option to dropbear to not halt the scp when
|
||||||
|
# transfering the log file to a new server for the first time.
|
||||||
|
# since we already need this also put in the keyfile
|
||||||
|
|
||||||
|
ssh -y -i /etc/dropbear/logid $@
|
||||||
42
crashlog/readme
Normal file
42
crashlog/readme
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
Install scp server.
|
||||||
|
|
||||||
|
Create a user account on a server and make sure it's possible to login to it
|
||||||
|
using ssh.
|
||||||
|
|
||||||
|
For now the user has to be called "log"
|
||||||
|
|
||||||
|
USER is the user name of the account
|
||||||
|
HOME is the user home directory.
|
||||||
|
Both should be changed to the correct value in all following example commands.
|
||||||
|
|
||||||
|
create HOME/bin
|
||||||
|
Put scp_upload in HOME/bin
|
||||||
|
make it executable "chmod a+x HOME/bin/scp_upload"
|
||||||
|
|
||||||
|
create home/.ssh (observer the dot .shh)
|
||||||
|
|
||||||
|
create an empty file HOME/.ssh/authorized_keys
|
||||||
|
|
||||||
|
-------------------------------
|
||||||
|
Now everyhting is setup for use but we have not added any clients.
|
||||||
|
What we need is the public key for the clients.
|
||||||
|
|
||||||
|
For dropbear "dropbearkey -y -f files/etc/dropbear/logid" will generate the public key.
|
||||||
|
|
||||||
|
----------
|
||||||
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwn9RaDAzxW1dTmIhXgFBnpi1lhj8xhYpCVQiPxxdk9IEmH8zjo4y9j3sPkqKOlRnkwjpZIpLEKBnpQTwVIMCU/AG7nDJX3OH9RfS9mLJQLfFL8HyGCyqDezFWldbyovhJZvdUeK4tAXJWv2W3OVHiz2L8IlncBgP/E9DJElsyhhQHsM96UE6tBkXsvXkoDbMSYXFcLbgiUwBKfmM2BF/aPDL45iznGur7/2j9v95PwJ0gtMu9jjNRq+pXCXhTh3bsnczm0MpZC1aiRc9nJAeGIMmhrf15E4jBKgTnrstzJxGVAdajKeR954KcNsS33cS2Wmui2YjmPbBXjqf1frzJ log@iopsys
|
||||||
|
----------
|
||||||
|
|
||||||
|
The public key should be just one line. Add that line to the
|
||||||
|
HOME/.ssh/authorized_keys file on the scp server. Then add the follwoing as
|
||||||
|
the first text on the same line. that is insert before the key data.
|
||||||
|
|
||||||
|
command="HOME/bin/scp_upload",no-port-forwarding,no-agent-forwarding,no-X11-forwarding
|
||||||
|
|
||||||
|
Do not forget to change HOME to the correct value for the server and there
|
||||||
|
should be one space separating the key data and the above text.
|
||||||
|
---------------------------------
|
||||||
|
Now test to make sure that you can upload new files, not download files
|
||||||
|
and not overwrite files from the client.
|
||||||
|
|
||||||
|
|
||||||
53
crashlog/scp_upload
Normal file
53
crashlog/scp_upload
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
# authorized_keys command="/home/boxi/my_scp",no-port-forwarding,no-agent-forwarding,no-X11-forwarding
|
||||||
|
|
||||||
|
val=`expr match "$SSH_ORIGINAL_COMMAND" "scp"`
|
||||||
|
if [ $val != 3 ]
|
||||||
|
then
|
||||||
|
echo "only scp is allowed for this rsa key"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
#strip out "scp" as getopts barf on anything not an option
|
||||||
|
|
||||||
|
args=${SSH_ORIGINAL_COMMAND:3}
|
||||||
|
|
||||||
|
# we must set args to positional paramters otherwise it's next to impossible
|
||||||
|
# to get to the rest of the line that is not arguments.
|
||||||
|
|
||||||
|
set -- $args
|
||||||
|
while getopts "rftdvpq" Option
|
||||||
|
do
|
||||||
|
case $Option in
|
||||||
|
r ) echo "recursive not allowed";exit 1;;
|
||||||
|
f ) echo "reading files not allowed";exit 1;;
|
||||||
|
t ) ;;
|
||||||
|
d ) ;;
|
||||||
|
v ) ;;
|
||||||
|
p ) ;;
|
||||||
|
q ) ;;
|
||||||
|
* ) ;; # Default.
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
shift $(($OPTIND - 1))
|
||||||
|
|
||||||
|
file="$*"
|
||||||
|
dir=$(dirname "$file")
|
||||||
|
|
||||||
|
if [ "$dir" != "log" ]
|
||||||
|
then
|
||||||
|
echo "only allowed to write to log/"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# try to create uniq files
|
||||||
|
EXTRA=$((0))
|
||||||
|
while [ -e "${file}_${EXTRA}" ]
|
||||||
|
do
|
||||||
|
EXTRA=$((EXTRA +1))
|
||||||
|
done
|
||||||
|
|
||||||
|
logger -t scp_upload "${SSH_ORIGINAL_COMMAND}_${EXTRA}"
|
||||||
|
|
||||||
|
exec ${SSH_ORIGINAL_COMMAND}_${EXTRA}
|
||||||
50
crun/Makefile
Normal file
50
crun/Makefile
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
|
PKG_NAME:=crun
|
||||||
|
PKG_VERSION:=0.17
|
||||||
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
|
PKG_SOURCE_PROTO:=git
|
||||||
|
PKG_SOURCE_URL:=https://github.com/containers/crun.git
|
||||||
|
PKG_SOURCE_VERSION:=0e9229ae34caaebcb86f1fde18de3acaf18c6d9a
|
||||||
|
|
||||||
|
PKG_LICENSE:=GPL-2.0
|
||||||
|
PKG_LICENSE_FILES:=COPYING
|
||||||
|
|
||||||
|
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||||
|
|
||||||
|
PKG_INSTALL:=1
|
||||||
|
PKG_BUILD_PARALLEL:=1
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
|
define Package/crun
|
||||||
|
SECTION:=utils
|
||||||
|
CATEGORY:=Utilities
|
||||||
|
DEPENDS:=+yajl +argp-standalone +libcap +libseccomp
|
||||||
|
TITLE:=A fast and low-memory footprint OCI Container Runtime fully written in C
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/crun/description
|
||||||
|
crun conforms to the OCI Container Runtime specifications
|
||||||
|
endef
|
||||||
|
|
||||||
|
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include
|
||||||
|
TARGET_LDFLAGS += -largp
|
||||||
|
|
||||||
|
MAKE_FLAGS := \
|
||||||
|
$(TARGET_CONFIGURE_OPTS) \
|
||||||
|
CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \
|
||||||
|
LDFLAGS="$(TARGET_LDFLAGS)"
|
||||||
|
|
||||||
|
define Build/Configure
|
||||||
|
cd $(PKG_BUILD_DIR)/ && sh autogen.sh && ./configure
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/crun/install
|
||||||
|
$(INSTALL_DIR) $(1)/usr/bin/
|
||||||
|
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/local/bin/crun $(1)/usr/bin/
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call BuildPackage,crun))
|
||||||
217
crun/patches/01-fix-for-openwrt-and-kernel-4-19.patch
Normal file
217
crun/patches/01-fix-for-openwrt-and-kernel-4-19.patch
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 5e9f2f9..5ed99bd 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -52,16 +52,6 @@ AS_IF([test "x$enable_seccomp" != "xno"], [
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
-dnl libsystemd
|
||||||
|
-AC_ARG_ENABLE([systemd],
|
||||||
|
- AS_HELP_STRING([--disable-systemd], [Ignore systemd and disable support]))
|
||||||
|
-AS_IF([test "x$enable_systemd" != "xno"], [
|
||||||
|
- AC_CHECK_HEADERS([systemd/sd-bus.h], [], [AC_MSG_ERROR([*** Missing libsystemd headers])])
|
||||||
|
- AS_IF([test "$ac_cv_header_systemd_sd_bus_h" = "yes"], [
|
||||||
|
- AC_SEARCH_LIBS(sd_bus_match_signal_async, [systemd], [AC_DEFINE([HAVE_SYSTEMD], 1, [Define if libsystemd is available])], [AC_MSG_ERROR([*** Failed to find libsystemd])])
|
||||||
|
- ])
|
||||||
|
-])
|
||||||
|
-
|
||||||
|
dnl ebpf
|
||||||
|
AC_ARG_ENABLE([bpf],
|
||||||
|
AS_HELP_STRING([--disable-bpf], [Ignore eBPF and disable support]))
|
||||||
|
@@ -114,26 +104,6 @@ AS_IF([test "x$enable_criu" != "xno"], [
|
||||||
|
FOUND_LIBS=$LIBS
|
||||||
|
LIBS=""
|
||||||
|
|
||||||
|
-AC_MSG_CHECKING([for new mount API (fsconfig)])
|
||||||
|
-AC_COMPILE_IFELSE(
|
||||||
|
- [AC_LANG_SOURCE([[
|
||||||
|
- #include <linux/mount.h>
|
||||||
|
- int cmd = FSCONFIG_CMD_CREATE;
|
||||||
|
- ]])],
|
||||||
|
- [AC_MSG_RESULT(yes)
|
||||||
|
- AC_DEFINE([HAVE_FSCONFIG_CMD_CREATE], 1, [Define if FSCONFIG_CMD_CREATE is available])],
|
||||||
|
- [AC_MSG_RESULT(no)])
|
||||||
|
-
|
||||||
|
-AC_MSG_CHECKING([for seccomp notify API])
|
||||||
|
-AC_COMPILE_IFELSE(
|
||||||
|
- [AC_LANG_SOURCE([[
|
||||||
|
- #include <linux/seccomp.h>
|
||||||
|
- int cmd = SECCOMP_GET_NOTIF_SIZES;
|
||||||
|
- ]])],
|
||||||
|
- [AC_MSG_RESULT(yes)
|
||||||
|
- AC_DEFINE([HAVE_SECCOMP_GET_NOTIF_SIZES], 1, [Define if SECCOMP_GET_NOTIF_SIZES is available])],
|
||||||
|
- [AC_MSG_RESULT(no)])
|
||||||
|
-
|
||||||
|
AC_DEFINE([LIBCRUN_PUBLIC], [__attribute__((visibility("default"))) extern], [LIBCRUN_PUBLIC])
|
||||||
|
AC_SUBST([FOUND_LIBS])
|
||||||
|
AC_SUBST([CRUN_LDFLAGS])
|
||||||
|
diff --git a/src/libcrun/cgroup.c b/src/libcrun/cgroup.c
|
||||||
|
index 29c1f7a..77dc441 100644
|
||||||
|
--- a/src/libcrun/cgroup.c
|
||||||
|
+++ b/src/libcrun/cgroup.c
|
||||||
|
@@ -575,23 +575,6 @@ get_file_owner (const char *path, uid_t *uid, gid_t *gid)
|
||||||
|
struct stat st;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
-#ifdef HAVE_STATX
|
||||||
|
- struct statx stx;
|
||||||
|
-
|
||||||
|
- ret = statx (AT_FDCWD, path, AT_STATX_DONT_SYNC, STATX_UID | STATX_GID, &stx);
|
||||||
|
- if (UNLIKELY (ret < 0))
|
||||||
|
- {
|
||||||
|
- if (errno == ENOSYS || errno == EINVAL)
|
||||||
|
- goto fallback;
|
||||||
|
-
|
||||||
|
- return ret;
|
||||||
|
- }
|
||||||
|
- *uid = stx.stx_uid;
|
||||||
|
- *gid = stx.stx_gid;
|
||||||
|
- return ret;
|
||||||
|
-
|
||||||
|
-fallback:
|
||||||
|
-#endif
|
||||||
|
ret = stat (path, &st);
|
||||||
|
if (UNLIKELY (ret < 0))
|
||||||
|
return ret;
|
||||||
|
diff --git a/src/libcrun/error.h b/src/libcrun/error.h
|
||||||
|
index aa3f3aa..477a2fe 100644
|
||||||
|
--- a/src/libcrun/error.h
|
||||||
|
+++ b/src/libcrun/error.h
|
||||||
|
@@ -18,9 +18,6 @@
|
||||||
|
#ifndef ERROR_H
|
||||||
|
#define ERROR_H
|
||||||
|
#include <config.h>
|
||||||
|
-#ifdef HAVE_ERROR_H
|
||||||
|
-# include <error.h>
|
||||||
|
-#else
|
||||||
|
# define error(status, errno, fmt, ...) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
@@ -35,7 +32,6 @@
|
||||||
|
exit (status); \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
-#endif
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
diff --git a/src/libcrun/utils.c b/src/libcrun/utils.c
|
||||||
|
index cbde9b6..5ef7f5f 100644
|
||||||
|
--- a/src/libcrun/utils.c
|
||||||
|
+++ b/src/libcrun/utils.c
|
||||||
|
@@ -164,22 +164,6 @@ get_file_type_fd (int fd, mode_t *mode)
|
||||||
|
struct stat st;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
-#ifdef HAVE_STATX
|
||||||
|
- struct statx stx;
|
||||||
|
-
|
||||||
|
- ret = statx (fd, "", AT_EMPTY_PATH | AT_STATX_DONT_SYNC, STATX_TYPE, &stx);
|
||||||
|
- if (UNLIKELY (ret < 0))
|
||||||
|
- {
|
||||||
|
- if (errno == ENOSYS || errno == EINVAL)
|
||||||
|
- goto fallback;
|
||||||
|
-
|
||||||
|
- return ret;
|
||||||
|
- }
|
||||||
|
- *mode = stx.stx_mode;
|
||||||
|
- return ret;
|
||||||
|
-
|
||||||
|
-fallback:
|
||||||
|
-#endif
|
||||||
|
ret = fstat (fd, &st);
|
||||||
|
*mode = st.st_mode;
|
||||||
|
return ret;
|
||||||
|
@@ -191,22 +175,6 @@ get_file_type_at (int dirfd, mode_t *mode, bool nofollow, const char *path)
|
||||||
|
struct stat st;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
-#ifdef HAVE_STATX
|
||||||
|
- struct statx stx;
|
||||||
|
-
|
||||||
|
- ret = statx (dirfd, path, (nofollow ? AT_SYMLINK_NOFOLLOW : 0) | AT_STATX_DONT_SYNC, STATX_TYPE, &stx);
|
||||||
|
- if (UNLIKELY (ret < 0))
|
||||||
|
- {
|
||||||
|
- if (errno == ENOSYS || errno == EINVAL)
|
||||||
|
- goto fallback;
|
||||||
|
-
|
||||||
|
- return ret;
|
||||||
|
- }
|
||||||
|
- *mode = stx.stx_mode;
|
||||||
|
- return ret;
|
||||||
|
-
|
||||||
|
-fallback:
|
||||||
|
-#endif
|
||||||
|
ret = fstatat (dirfd, path, &st, nofollow ? AT_SYMLINK_NOFOLLOW : 0);
|
||||||
|
*mode = st.st_mode;
|
||||||
|
return ret;
|
||||||
|
@@ -550,22 +518,7 @@ get_file_size (int fd, off_t *size)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
int ret;
|
||||||
|
-#ifdef HAVE_STATX
|
||||||
|
- struct statx stx;
|
||||||
|
-
|
||||||
|
- ret = statx (fd, "", AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW | AT_STATX_DONT_SYNC, STATX_SIZE, &stx);
|
||||||
|
- if (UNLIKELY (ret < 0))
|
||||||
|
- {
|
||||||
|
- if (errno == ENOSYS || errno == EINVAL)
|
||||||
|
- goto fallback;
|
||||||
|
- return ret;
|
||||||
|
- }
|
||||||
|
- *size = stx.stx_size;
|
||||||
|
-
|
||||||
|
- return ret;
|
||||||
|
|
||||||
|
-fallback:
|
||||||
|
-#endif
|
||||||
|
ret = fstat (fd, &st);
|
||||||
|
*size = st.st_size;
|
||||||
|
return ret;
|
||||||
|
@@ -1060,7 +1013,6 @@ run_process (char **args, libcrun_error_t *err)
|
||||||
|
_exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
-#ifndef HAVE_FGETPWENT_R
|
||||||
|
static unsigned
|
||||||
|
atou (char **s)
|
||||||
|
{
|
||||||
|
@@ -1126,7 +1078,6 @@ fgetpwent_r (FILE *f, struct passwd *pw, char *line, size_t size, struct passwd
|
||||||
|
errno = rv;
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
-#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
set_home_env (uid_t id)
|
||||||
|
@@ -1690,29 +1641,6 @@ copy_rec_stat_file_at (int dfd, const char *path, mode_t *mode, off_t *size, dev
|
||||||
|
struct stat st;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
-#ifdef HAVE_STATX
|
||||||
|
- struct statx stx;
|
||||||
|
-
|
||||||
|
- ret = statx (dfd, path, AT_SYMLINK_NOFOLLOW | AT_STATX_DONT_SYNC,
|
||||||
|
- STATX_TYPE | STATX_MODE | STATX_SIZE | STATX_UID | STATX_GID, &stx);
|
||||||
|
- if (UNLIKELY (ret < 0))
|
||||||
|
- {
|
||||||
|
- if (errno == ENOSYS || errno == EINVAL)
|
||||||
|
- goto fallback;
|
||||||
|
-
|
||||||
|
- return ret;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- *mode = stx.stx_mode;
|
||||||
|
- *size = stx.stx_size;
|
||||||
|
- *rdev = makedev (stx.stx_rdev_major, stx.stx_rdev_minor);
|
||||||
|
- *uid = stx.stx_uid;
|
||||||
|
- *gid = stx.stx_gid;
|
||||||
|
-
|
||||||
|
- return ret;
|
||||||
|
-
|
||||||
|
-fallback:
|
||||||
|
-#endif
|
||||||
|
ret = fstatat (dfd, path, &st, AT_SYMLINK_NOFOLLOW);
|
||||||
|
|
||||||
|
*mode = st.st_mode;
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
if PACKAGE_dectmngr
|
|
||||||
|
|
||||||
menu "Configuration"
|
|
||||||
|
|
||||||
config ENABLE_LINE_SETTINGS_EXTENSION
|
|
||||||
bool "Enable Line Settings List extension "
|
|
||||||
default y
|
|
||||||
|
|
||||||
endmenu
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -8,17 +8,17 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=dectmngr
|
PKG_NAME:=dectmngr
|
||||||
PKG_RELEASE:=3
|
PKG_RELEASE:=3
|
||||||
PKG_VERSION:=3.5.7
|
PKG_VERSION:=3.0.9
|
||||||
|
|
||||||
LOCAL_DEV=0
|
LOCAL_DEV=0
|
||||||
ifneq ($(LOCAL_DEV),1)
|
ifneq ($(LOCAL_DEV),1)
|
||||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/dectmngr.git
|
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/dectmngr.git
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_VERSION:=83f89a83cf860bbcf2b7f2e030215db315a5bbbf
|
PKG_SOURCE_VERSION:=b742ea24a85a67e15270f5d66a5af28f25b653f9
|
||||||
PKG_MIRROR_HASH:=skip
|
PKG_MIRROR_HASH:=skip
|
||||||
endif
|
endif
|
||||||
|
|
||||||
PKG_LICENSE:=PROPRIETARY
|
PKG_LICENSE:=GPLv2
|
||||||
PKG_LICENSE_FILES:=LICENSE
|
PKG_LICENSE_FILES:=LICENSE
|
||||||
|
|
||||||
RSTRIP:=true
|
RSTRIP:=true
|
||||||
@@ -34,41 +34,29 @@ include $(INCLUDE_DIR)/package.mk
|
|||||||
define Package/$(PKG_NAME)
|
define Package/$(PKG_NAME)
|
||||||
CATEGORY:=Utilities
|
CATEGORY:=Utilities
|
||||||
TITLE:=DECT Manager
|
TITLE:=DECT Manager
|
||||||
DEPENDS:= +libubox +ubus +uci +libxml2 +libjson-c
|
DEPENDS:= +libubox +ubus
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/$(PKG_NAME)/description
|
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.
|
DECT manager is a daemon that provides UBUS RPC objects and sends UBUS events for communication with the DECT chip.
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/$(PKG_NAME)/config
|
|
||||||
source "$(SOURCE)/Config.in"
|
|
||||||
endef
|
|
||||||
|
|
||||||
ifeq ($(LOCAL_DEV),1)
|
ifeq ($(LOCAL_DEV),1)
|
||||||
define Build/Prepare
|
define Build/Prepare
|
||||||
rsync -av --exclude=.* ~/git/voip/dectmngr/* $(PKG_BUILD_DIR)/
|
rsync -av --exclude=.* ~/git/voip/dectmngr/* $(PKG_BUILD_DIR)/
|
||||||
endef
|
endef
|
||||||
endif
|
endif
|
||||||
|
|
||||||
TARGET_CFLAGS += \
|
MAKE_FLAGS += \
|
||||||
-Wall \
|
CFLAGS+="-Wall"
|
||||||
-Werror \
|
|
||||||
-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
|
define Package/$(PKG_NAME)/install
|
||||||
$(INSTALL_DIR) $(1)/usr/sbin
|
$(INSTALL_DIR) $(1)/usr/sbin
|
||||||
$(INSTALL_DIR) $(1)/etc
|
$(INSTALL_DIR) $(1)/etc
|
||||||
$(INSTALL_DIR) $(1)/lib/upgrade/keep.d
|
|
||||||
|
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/app/dectmngr $(1)/usr/sbin/
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/app/dectmngr $(1)/usr/sbin/
|
||||||
$(STRIP) $(1)/usr/sbin/dectmngr
|
$(STRIP) $(1)/usr/sbin/dectmngr
|
||||||
$(CP) ./files/etc/* $(1)/etc/
|
$(CP) ./files/etc/* $(1)/etc/
|
||||||
$(INSTALL_DATA) ./files/lib/upgrade/keep.d/dect $(1)/lib/upgrade/keep.d/dect
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage,$(PKG_NAME)))
|
$(eval $(call BuildPackage,$(PKG_NAME)))
|
||||||
|
|||||||
1968
dectmngr/files/config/dg400prime-5.3-kernel.config
Normal file
1968
dectmngr/files/config/dg400prime-5.3-kernel.config
Normal file
File diff suppressed because it is too large
Load Diff
6709
dectmngr/files/config/dg400prime-5.3.config
Normal file
6709
dectmngr/files/config/dg400prime-5.3.config
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,3 +0,0 @@
|
|||||||
config dect 'global'
|
|
||||||
option log_dect_cmbs 'syslog'
|
|
||||||
option log_level 'realtime,warning,error'
|
|
||||||
Binary file not shown.
63
dectmngr/files/etc/init.d/dect
Executable file
63
dectmngr/files/etc/init.d/dect
Executable file
@@ -0,0 +1,63 @@
|
|||||||
|
#!/bin/sh /etc/rc.common
|
||||||
|
#
|
||||||
|
# Copyright (C) 2021 OpenWrt.org
|
||||||
|
#
|
||||||
|
|
||||||
|
source /lib/functions/uci-defaults.sh
|
||||||
|
|
||||||
|
START=70
|
||||||
|
STOP=12
|
||||||
|
|
||||||
|
USE_PROCD=1
|
||||||
|
NAME=dectmngr
|
||||||
|
PROG=/usr/sbin/dectmngr
|
||||||
|
|
||||||
|
# Ask dectmngr to exit nicely and wait for it to clean up, which is a slow process.
|
||||||
|
stop_and_wait_dectmngr() {
|
||||||
|
pidof $NAME && killall -q $NAME
|
||||||
|
|
||||||
|
pidof $NAME && sleep 2 # wait for the process to stop gracefully
|
||||||
|
while pidof $NAME; do
|
||||||
|
killall -q -9 $NAME
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
start_service() {
|
||||||
|
test $(db get hw.board.hasDect) = "0" && return
|
||||||
|
|
||||||
|
echo 1 > /sys/class/gpio/gpio14/value
|
||||||
|
|
||||||
|
rm -f /tmp/dect-cmbs.log /tmp/dect-cmbs_Host_log.txt /tmp/dectmngr.log
|
||||||
|
|
||||||
|
procd_open_instance
|
||||||
|
procd_set_param command $PROG -comname ttyH0 -log /tmp/dect-cmbs.log
|
||||||
|
procd_set_param respawn 6 2 3
|
||||||
|
procd_set_param term_timeout 20
|
||||||
|
procd_set_param triggers asterisk
|
||||||
|
procd_close_instance
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_service() {
|
||||||
|
test $(db get hw.board.hasDect) = "0" && return
|
||||||
|
|
||||||
|
echo 0 > /sys/class/gpio/gpio14/value
|
||||||
|
stop_and_wait_dectmngr
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_service() {
|
||||||
|
stop_and_wait_dectmngr
|
||||||
|
start
|
||||||
|
}
|
||||||
|
|
||||||
|
service_triggers()
|
||||||
|
{
|
||||||
|
procd_add_reload_trigger asterisk
|
||||||
|
}
|
||||||
|
|
||||||
|
boot() {
|
||||||
|
echo 14 > /sys/class/gpio/export
|
||||||
|
echo out > /sys/class/gpio/gpio14/direction
|
||||||
|
start
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
#!/bin/sh /etc/rc.common
|
|
||||||
|
|
||||||
source /lib/functions/uci-defaults.sh
|
|
||||||
|
|
||||||
START=70
|
|
||||||
STOP=12
|
|
||||||
|
|
||||||
USE_PROCD=1
|
|
||||||
NAME=dectmngr
|
|
||||||
PROG=/usr/sbin/dectmngr
|
|
||||||
LOG_PATH=/var/log/dectmngr
|
|
||||||
DB_PATH=/etc/dect
|
|
||||||
|
|
||||||
DECT_GPIO=$(db -q get hw.board.dect_gpio)
|
|
||||||
|
|
||||||
# Ask dectmngr to exit nicely and wait for it to clean up, which is a slow process.
|
|
||||||
stop_and_wait_dectmngr() {
|
|
||||||
pidof $NAME && killall -q $NAME
|
|
||||||
|
|
||||||
pidof $NAME && sleep 2 # wait for the process to stop gracefully
|
|
||||||
while pidof $NAME; do
|
|
||||||
killall -q -9 $NAME
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
start_service() {
|
|
||||||
local opt_ext=
|
|
||||||
local rfpi=
|
|
||||||
local model_id=
|
|
||||||
local rxtun=
|
|
||||||
|
|
||||||
test $(db get hw.board.hasDect) = "0" && return
|
|
||||||
|
|
||||||
[ -n "$DECT_GPIO" ] && echo 1 > /sys/class/gpio/gpio${DECT_GPIO}/value
|
|
||||||
|
|
||||||
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)
|
|
||||||
[ -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"
|
|
||||||
|
|
||||||
rxtun=$(db -q get hw.board.dect_rxtun)
|
|
||||||
[ -n "$rxtun" -a ${#rxtun} -eq 2 ] && opt_ext="$opt_ext -rxtun $rxtun"
|
|
||||||
|
|
||||||
config_load dect
|
|
||||||
config_get log_dect_cmbs global log_dect_cmbs syslog
|
|
||||||
|
|
||||||
procd_open_instance
|
|
||||||
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/*
|
|
||||||
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
|
|
||||||
procd_close_instance
|
|
||||||
}
|
|
||||||
|
|
||||||
stop_service() {
|
|
||||||
test $(db get hw.board.hasDect) = "0" && return
|
|
||||||
|
|
||||||
[ -n "$DECT_GPIO" ] && echo 0 > /sys/class/gpio/gpio${DECT_GPIO}/value
|
|
||||||
stop_and_wait_dectmngr
|
|
||||||
}
|
|
||||||
|
|
||||||
reload_service() {
|
|
||||||
ubus call dect reload
|
|
||||||
}
|
|
||||||
|
|
||||||
service_triggers()
|
|
||||||
{
|
|
||||||
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() {
|
|
||||||
[ -n "$DECT_GPIO" ] && {
|
|
||||||
echo ${DECT_GPIO} > /sys/class/gpio/export
|
|
||||||
echo out > /sys/class/gpio/gpio${DECT_GPIO}/direction
|
|
||||||
}
|
|
||||||
|
|
||||||
[ ! -d $LOG_PATH ] && mkdir -p $LOG_PATH
|
|
||||||
[ ! -d $DB_PATH ] && mkdir -p $DB_PATH
|
|
||||||
start
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/etc/dect/LA_DB
|
|
||||||
27
dectmngr/files/scripts/load_sound_modules.sh
Executable file
27
dectmngr/files/scripts/load_sound_modules.sh
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
SOUND_BASE=/lib/modules/$(uname -r)/kernel/sound
|
||||||
|
SOUND_MODULES="$SOUND_BASE/soundcore.ko $SOUND_BASE/core/snd.ko $SOUND_BASE/core/snd-timer.ko"
|
||||||
|
SOUND_MODULES="$SOUND_MODULES $SOUND_BASE/core/snd-pcm.ko $SOUND_BASE/core/snd-hwdep.ko"
|
||||||
|
SOUND_MODULES="$SOUND_MODULES $SOUND_BASE/core/seq/snd-seq-device.ko"
|
||||||
|
SOUND_MODULES="$SOUND_MODULES $SOUND_BASE/core/seq/snd-seq.ko $SOUND_BASE/core/snd-rawmidi.ko "
|
||||||
|
SOUND_MODULES="$SOUND_MODULES $SOUND_BASE/usb/snd-usbmidi-lib.ko $SOUND_BASE/usb/snd-usb-audio.ko"
|
||||||
|
|
||||||
|
load_sound_modules() {
|
||||||
|
for mod in $SOUND_MODULES; do
|
||||||
|
insmod $mod
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
unload_sound_modules() {
|
||||||
|
local modules=
|
||||||
|
|
||||||
|
# reverse the order
|
||||||
|
for mod in $SOUND_MODULES; do
|
||||||
|
modules="$mod $modules"
|
||||||
|
done
|
||||||
|
|
||||||
|
for mod in $modules; do
|
||||||
|
rmmod $mod
|
||||||
|
done
|
||||||
|
}
|
||||||
@@ -8,12 +8,12 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=dslmngr
|
PKG_NAME:=dslmngr
|
||||||
PKG_VERSION:=1.2.0
|
PKG_VERSION:=1.1.0
|
||||||
|
|
||||||
LOCAL_DEV=0
|
LOCAL_DEV=0
|
||||||
ifneq ($(LOCAL_DEV),1)
|
ifneq ($(LOCAL_DEV),1)
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_VERSION:=bb754ae620a9fc66fd6fc0745f0fead0708c7a17
|
PKG_SOURCE_VERSION:=d17c699c1fc9588303d6da35ac2250903bf17cd8
|
||||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/dslmngr.git
|
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/dslmngr.git
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||||
PKG_MIRROR_HASH:=skip
|
PKG_MIRROR_HASH:=skip
|
||||||
@@ -26,8 +26,14 @@ PKG_LICENSE_FILES:=LICENSE
|
|||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
ifeq ($(CONFIG_TARGET_brcmbca),y)
|
ifeq ($(CONFIG_TARGET_iopsys_brcm63xx_arm),y)
|
||||||
TARGET_PLATFORM=BROADCOM
|
TARGET_PLATFORM=BROADCOM
|
||||||
|
else ifeq ($(CONFIG_TARGET_iopsys_ramips),y)
|
||||||
|
TARGET_PLATFORM=MEDIATEK
|
||||||
|
else ifeq ($(CONFIG_TARGET_iopsys_linksys),y)
|
||||||
|
TARGET_PLATFORM=MARVELL
|
||||||
|
else ifeq ($(CONFIG_TARGET_intel_mips),y)
|
||||||
|
TARGET_PLATFORM=INTEL
|
||||||
else
|
else
|
||||||
$(info Unexpected CONFIG_TARGET)
|
$(info Unexpected CONFIG_TARGET)
|
||||||
endif
|
endif
|
||||||
@@ -68,10 +74,6 @@ define Build/Compile
|
|||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/dslmngr/install
|
define Package/dslmngr/install
|
||||||
$(CP) ./files/common/* $(1)/
|
|
||||||
ifeq ($(CONFIG_TARGET_brcmbca),y)
|
|
||||||
$(CP) ./files/broadcom/* $(1)/
|
|
||||||
endif
|
|
||||||
$(INSTALL_DIR) $(1)/sbin
|
$(INSTALL_DIR) $(1)/sbin
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dslmngr $(1)/sbin/
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/dslmngr $(1)/sbin/
|
||||||
endef
|
endef
|
||||||
|
|||||||
@@ -1,311 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. /lib/functions.sh
|
|
||||||
|
|
||||||
# ATM #
|
|
||||||
check_pvc() {
|
|
||||||
local vpi=$1
|
|
||||||
local vci=$2
|
|
||||||
local ret
|
|
||||||
|
|
||||||
ret=$(xtmctl operate conn --show | awk -v test="$vpi/$vci" '{if ($3==test ) print $5 }')
|
|
||||||
|
|
||||||
case $ret in
|
|
||||||
''|*[!0-9]*) return 0 ;;
|
|
||||||
*) return $ret ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
check_xtm_list() {
|
|
||||||
local qclass=$1
|
|
||||||
local pcr scr mbs
|
|
||||||
local ret
|
|
||||||
|
|
||||||
case $# in
|
|
||||||
1)
|
|
||||||
pcr=0
|
|
||||||
scr=0
|
|
||||||
mbs=0
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
pcr=$2
|
|
||||||
scr=0
|
|
||||||
mbs=0
|
|
||||||
;;
|
|
||||||
4)
|
|
||||||
pcr=$2
|
|
||||||
scr=$3
|
|
||||||
mbs=$4
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ret=$(xtmctl operate tdte --show | awk -v test="$qclass" -v pcr="$pcr" -v scr="$scr" -v mbs="$mbs" '{if ($2==test && $3==pcr && $4==scr && $5==mbs ) print $1 }')
|
|
||||||
|
|
||||||
case $ret in
|
|
||||||
''|*[!0-9]*) return 0 ;;
|
|
||||||
*) return $ret ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_atm_device() {
|
|
||||||
local name vpi vci device link_type encapsulation qos_class pcr mbs scr i
|
|
||||||
|
|
||||||
config_get name $1 name "ATM"
|
|
||||||
config_get vpi $1 vpi "8"
|
|
||||||
config_get vci $1 vci "35"
|
|
||||||
config_get device $1 device "atm0"
|
|
||||||
config_get link_type $1 link_type "eoa"
|
|
||||||
config_get encapsulation $1 encapsulation "llc"
|
|
||||||
config_get qos_class $1 qos_class "ubr"
|
|
||||||
config_get pcr $1 pcr
|
|
||||||
config_get mbs $1 mbs
|
|
||||||
config_get scr $1 scr
|
|
||||||
|
|
||||||
check_pvc $vpi $vci
|
|
||||||
ret=$?
|
|
||||||
|
|
||||||
if [ "$ret" -eq 0 ]; then
|
|
||||||
check_xtm_list $qos_class $pcr $scr $mbs
|
|
||||||
ret=$?
|
|
||||||
|
|
||||||
if [ "$ret" -eq 0 ]; then
|
|
||||||
case $qos_class in # ubr, cbr, gfr, vbr-nrt, vbr-rt, ubr+, abr
|
|
||||||
ubr)
|
|
||||||
xtmctl operate tdte --add "$qos_class"
|
|
||||||
;;
|
|
||||||
ubr_pcr|ubr+)
|
|
||||||
xtmctl operate tdte --add "$qos_class" $pcr
|
|
||||||
;;
|
|
||||||
cbr)
|
|
||||||
xtmctl operate tdte --add "$qos_class" $pcr
|
|
||||||
;;
|
|
||||||
nrtvbr|vbr-nrt)
|
|
||||||
xtmctl operate tdte --add "$qos_class" $pcr $scr $mbs
|
|
||||||
;;
|
|
||||||
rtvbr|vbr-rt)
|
|
||||||
xtmctl operate tdte --add "$qos_class" $pcr $scr $mbs
|
|
||||||
;;
|
|
||||||
gfr)
|
|
||||||
;;
|
|
||||||
abr)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
case $link_type in # EoA, IPoA, PPPoA, CIP
|
|
||||||
EoA|eoa)
|
|
||||||
[ $encapsulation == "vcmux" ] && encapsulation="vcmux_eth" || encapsulation="llcsnap_eth"
|
|
||||||
;;
|
|
||||||
PPPoA|pppoa)
|
|
||||||
[ $encapsulation == "vcmux" ] && encapsulation="vcmux_pppoa" || encapsulation="llcencaps_ppp"
|
|
||||||
;;
|
|
||||||
IPoA|ipoa)
|
|
||||||
[ $encapsulation == "vcmux" ] && encapsulation="vcmux_ipoa" || encapsulation="llcsnap_rtip"
|
|
||||||
;;
|
|
||||||
CIP|cip)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
check_xtm_list $qos_class $pcr $scr $mbs
|
|
||||||
ret="$?"
|
|
||||||
|
|
||||||
xtmctl operate conn --add 1.$vpi.$vci aal5 $encapsulation 0 1 $ret
|
|
||||||
for i in `seq 0 7`; do
|
|
||||||
xtmctl operate conn --addq 1.$vpi.$vci $i wrr 1 dt # queue priority 0-7
|
|
||||||
done
|
|
||||||
xtmctl operate conn --createnetdev 1.$vpi.$vci $device
|
|
||||||
xtmctl operate intf --state 1 enable
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_atm_devices() {
|
|
||||||
local vpi vci rest
|
|
||||||
local vpivci=`xtmctl operate conn --show | grep "ATM\|mode" | awk '{if (NR!=1 && $1!="PTM") {print $3}}'`
|
|
||||||
|
|
||||||
for i in $vpivci
|
|
||||||
do
|
|
||||||
rest=${i#\/}
|
|
||||||
vpi=${rest%%\/*}
|
|
||||||
vci=${rest#*\/}
|
|
||||||
echo "xtmctl operate conn --delete 1.$vpi.$vci"
|
|
||||||
xtmctl operate conn --delete 1.$vpi.$vci
|
|
||||||
echo "xtmctl operate conn --deletenetdev 1.$vpi.$vci"
|
|
||||||
xtmctl operate conn --deletenetdev 1.$vpi.$vci
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
create_atm_devices() {
|
|
||||||
echo "Creating ATM Device(s)"
|
|
||||||
config_load dsl
|
|
||||||
config_foreach configure_atm_device atm-device
|
|
||||||
}
|
|
||||||
# ATM END #
|
|
||||||
|
|
||||||
# PTM #
|
|
||||||
check_ptm() {
|
|
||||||
local ret
|
|
||||||
local ptmprio=$1
|
|
||||||
local dslat=$2
|
|
||||||
|
|
||||||
if [ "$ptmprio" -eq 2 ]; then
|
|
||||||
ptmprio="high"
|
|
||||||
else
|
|
||||||
ptmprio="low"
|
|
||||||
fi
|
|
||||||
|
|
||||||
ret=$(xtmctl operate conn --show | awk -v dslat="$dslat" -v ptmprio="$ptmprio" '{if ($2 == dslat && $3 == ptmprio ) print $2 }')
|
|
||||||
|
|
||||||
case $ret in
|
|
||||||
''|*[!0-9]*) return 0 ;;
|
|
||||||
*) return $ret ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_ptm_device() {
|
|
||||||
local name device priority portid i
|
|
||||||
|
|
||||||
config_get name $1 name "PTM"
|
|
||||||
config_get device $1 device "ptm0"
|
|
||||||
config_get priority $1 priority 1
|
|
||||||
config_get portid $1 portid 1
|
|
||||||
|
|
||||||
check_ptm $priority $portid
|
|
||||||
ret=$?
|
|
||||||
|
|
||||||
if [ "$ret" -eq 0 ]; then
|
|
||||||
xtmctl operate conn --add $portid.$priority
|
|
||||||
|
|
||||||
for i in `seq 0 7`; do
|
|
||||||
xtmctl operate conn --addq $portid.$priority $i wrr 1 dt -1 -1 3000 # queue priority 0-7
|
|
||||||
done
|
|
||||||
echo "xtmctl operate conn --createnetdev $portid.$priority $device"
|
|
||||||
xtmctl operate conn --createnetdev $portid.$priority $device
|
|
||||||
xtmctl operate intf --state 1 enable
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_ptm_devices() {
|
|
||||||
local delptm
|
|
||||||
local x=0
|
|
||||||
|
|
||||||
IFS=$'\n'
|
|
||||||
for i in `xtmctl operate conn --show | grep "PTM\|mode"`
|
|
||||||
do
|
|
||||||
if [ $x -eq 1 ]; then
|
|
||||||
delptm=$(echo $i | awk '{if ($1!="ATM") print $2"."$11}')
|
|
||||||
echo "xtmctl operate conn --delete $delptm"
|
|
||||||
xtmctl operate conn --delete $delptm
|
|
||||||
xtmctl operate conn --deletenetdev $delptm
|
|
||||||
fi
|
|
||||||
x=1
|
|
||||||
done
|
|
||||||
unset IFS
|
|
||||||
}
|
|
||||||
|
|
||||||
create_ptm_devices() {
|
|
||||||
echo "Creating PTM Device(s)"
|
|
||||||
config_load dsl
|
|
||||||
config_foreach configure_ptm_device ptm-device
|
|
||||||
}
|
|
||||||
# PTM END #
|
|
||||||
|
|
||||||
prioritize_arp()
|
|
||||||
{
|
|
||||||
ebtables -t nat -D POSTROUTING -j mark --mark-or 0x7 -p ARP >/dev/null
|
|
||||||
ebtables -t nat -A POSTROUTING -j mark --mark-or 0x7 -p ARP >/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
xtm_remove_devices() {
|
|
||||||
remove_atm_devices
|
|
||||||
remove_ptm_devices
|
|
||||||
}
|
|
||||||
|
|
||||||
xtm_create_devices() {
|
|
||||||
local tpstc="$(xdslctl info --show | grep TPS-TC)"
|
|
||||||
if echo "$tpstc" | grep -q "ATM Mode"; then
|
|
||||||
create_atm_devices
|
|
||||||
elif echo "$tpstc" | grep -q "PTM Mode"; then
|
|
||||||
create_ptm_devices
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
xdsl_configure() {
|
|
||||||
local VDSL=0
|
|
||||||
local GFAST=0
|
|
||||||
local mod=""
|
|
||||||
local modes=""
|
|
||||||
local profile=""
|
|
||||||
|
|
||||||
config_load dsl
|
|
||||||
|
|
||||||
# Modes
|
|
||||||
config_get mode line mode
|
|
||||||
for mod in $mode; do
|
|
||||||
[ $mod == "gdmt" ] && modes="${modes}d"
|
|
||||||
[ $mod == "glite" ] && modes="${modes}l"
|
|
||||||
[ $mod == "t1413" ] && modes="${modes}t"
|
|
||||||
[ $mod == "adsl2" ] && modes="${modes}2"
|
|
||||||
[ $mod == "adsl2p" ] && modes="${modes}p"
|
|
||||||
[ $mod == "annexl" ] && modes="${modes}e"
|
|
||||||
[ $mod == "annexm" ] && modes="${modes}m"
|
|
||||||
[ $mod == "vdsl2" ] && modes="${modes}v" && VDSL=1
|
|
||||||
[ $mod == "gfast" ] && modes="${modes}f" && GFAST=1
|
|
||||||
done
|
|
||||||
|
|
||||||
# VDSL Profiles
|
|
||||||
config_get profile line profile
|
|
||||||
# Capabilities
|
|
||||||
config_get_bool bitswap line bitswap 1
|
|
||||||
[ $bitswap -eq 1 ] && bitswap="on" || bitswap="off"
|
|
||||||
config_get_bool sra line sra 1
|
|
||||||
[ $sra -eq 1 ] && sra="on" || sra="off"
|
|
||||||
# config_get_bool trellis line trellis 1
|
|
||||||
config_get_bool sesdrop line sesdrop 0
|
|
||||||
[ $sesdrop -eq 1 ] && sesdrop="on" || sesdrop="off"
|
|
||||||
# VDSL2 only
|
|
||||||
config_get_bool us0 line us0 1
|
|
||||||
[ $us0 -eq 1 ] && us0="on" || us0="off"
|
|
||||||
# config_get_bool dynamicd line dynamicd 1
|
|
||||||
# config_get_bool dynamicf line dynamicf 1
|
|
||||||
config_get_bool sos line sos 0
|
|
||||||
[ $sos -eq 1 ] && sos="on" || sos="off"
|
|
||||||
|
|
||||||
config_get_bool phyReXmtUs line phyReXmtUs 0
|
|
||||||
config_get_bool phyReXmtDs line phyReXmtDs 1
|
|
||||||
phyReXmt=$(( $((phyReXmtUs<<1)) + phyReXmtDs))
|
|
||||||
|
|
||||||
if [ $VDSL -eq 1 -o $GFAST -eq 1 ]; then
|
|
||||||
echo "xdslctl start --up --mod $modes --profile "$profile" --sra $sra --bitswap $bitswap --us0 $us0 --sesdrop $sesdrop --SOS $sos --phyReXmt $phyReXmt"
|
|
||||||
xdslctl start --up --mod $modes --profile "$profile" --sra $sra --bitswap $bitswap --us0 $us0 --sesdrop $sesdrop --SOS $sos --phyReXmt $phyReXmt
|
|
||||||
# G.Fast hardware to VDSL hardware, to set the driver bit kPhyCfg2EnableGfastVdslMMTimeOut0.
|
|
||||||
# Enable V43 tone for GFAST.
|
|
||||||
echo "xdslctl configure1 --phycfg 0 0 0 0 0 0 0 0 0 0 0 0x1400400 0x1400400"
|
|
||||||
xdslctl configure1 --phycfg 0 0 0 0 0 0 0 0 0 0 0 0x1400400 0x1400400
|
|
||||||
else
|
|
||||||
echo "xdslctl start --up --mod $modes --sra $sra --bitswap $bitswap --sesdrop $sesdrop --SOS $sos --phyReXmt $phyReXmt"
|
|
||||||
xdslctl start --up --mod $modes --sra $sra --bitswap $bitswap --sesdrop $sesdrop --SOS $sos --phyReXmt $phyReXmt
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $GFAST -eq 1 ]; then
|
|
||||||
# G.Fast hardware to VDSL hardware, to set the driver bit kPhyCfg2EnableGfastVdslMMTimeOut0.
|
|
||||||
# Enable V43 tone for GFAST.
|
|
||||||
echo "xdslctl configure1 --phycfg 0 0 0 0 0 0 0 0 0 0 0 0x1400400 0x1400400"
|
|
||||||
xdslctl configure1 --phycfg 0 0 0 0 0 0 0 0 0 0 0 0x1400400 0x1400400
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
xdsl_stop() {
|
|
||||||
# echo "Stopping DSL"
|
|
||||||
# stop causes IRQ issues
|
|
||||||
# xdslctl stop
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
xdsl_init() {
|
|
||||||
prioritize_arp
|
|
||||||
|
|
||||||
echo "Starting DSL"
|
|
||||||
|
|
||||||
xtmctl start
|
|
||||||
xtmctl operate intf --state 1 enable
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# OEM specific parameters
|
|
||||||
config oem-parameters 'oem'
|
|
||||||
# option country_code "0000" # 2 bytes hex
|
|
||||||
# option vendor_id "IO" # 4 bytes string
|
|
||||||
# option vendor_suffix "0000" # 2 bytes hex
|
|
||||||
# option sw_version "iopsys" # 16 bytes string
|
|
||||||
# option serial_nr "00000000" # 32 bytes string
|
|
||||||
|
|
||||||
# DSL Modes
|
|
||||||
config dsl-line line
|
|
||||||
list mode gdmt
|
|
||||||
list mode glite
|
|
||||||
list mode t1413
|
|
||||||
list mode adsl2
|
|
||||||
list mode adsl2p
|
|
||||||
list mode annexl
|
|
||||||
list mode annexm
|
|
||||||
list mode vdsl2
|
|
||||||
# VDSL2 profiles
|
|
||||||
list profile 8a
|
|
||||||
list profile 8b
|
|
||||||
list profile 8c
|
|
||||||
list profile 8d
|
|
||||||
list profile 12a
|
|
||||||
list profile 12b
|
|
||||||
list profile 17a
|
|
||||||
list profile 30a
|
|
||||||
option bitswap 1
|
|
||||||
option sra 1
|
|
||||||
option us0 1 # VDSL2 only
|
|
||||||
option sesdrop 0
|
|
||||||
option sos 0
|
|
||||||
option phyReXmtUs 0
|
|
||||||
option phyReXmtDs 1
|
|
||||||
|
|
||||||
config atm-device atm0
|
|
||||||
option name 'ATM'
|
|
||||||
option vpi '8'
|
|
||||||
option vci '35'
|
|
||||||
option device atm0
|
|
||||||
option link_type 'eoa' # EoA, IPoA, PPPoA, CIP
|
|
||||||
option encapsulation 'llc' # llc, vcmux
|
|
||||||
option qos_class 'ubr' # ubr, cbr, gfr, vbr-nrt, vbr-rt, ubr+, abr
|
|
||||||
# option pcr '512'
|
|
||||||
# option scr '256'
|
|
||||||
# option mbs '1024'
|
|
||||||
|
|
||||||
config ptm-device ptm0
|
|
||||||
option name 'PTM'
|
|
||||||
option device 'ptm0'
|
|
||||||
option priority '1'
|
|
||||||
option portid '1'
|
|
||||||
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
[ "$STATUS" == "up" -o "$STATUS" == "down" ] || exit 0
|
|
||||||
|
|
||||||
. /lib/functions.sh
|
|
||||||
include /lib/dsl
|
|
||||||
|
|
||||||
xtm_remove_devices
|
|
||||||
xtm_create_devices
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
if [ "$STATUS" == "up" ]; then
|
|
||||||
ubus call led.dsl set '{"state":"ok"}'
|
|
||||||
elif [ "$STATUS" == "down" ]; then
|
|
||||||
ubus call led.dsl set '{"state":"off"}'
|
|
||||||
elif [ "$STATUS" == "training" ]; then
|
|
||||||
ubus call led.dsl set '{"state":"alert"}'
|
|
||||||
fi
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
#!/bin/sh /etc/rc.common
|
|
||||||
|
|
||||||
. /lib/functions.sh
|
|
||||||
include /lib/dsl
|
|
||||||
|
|
||||||
START=20
|
|
||||||
USE_PROCD=1
|
|
||||||
|
|
||||||
DSLMNGR=$(which dslmngr)
|
|
||||||
|
|
||||||
start_service() {
|
|
||||||
[ -n "$DSLMNGR" ] && {
|
|
||||||
procd_open_instance
|
|
||||||
procd_set_param command "$DSLMNGR"
|
|
||||||
procd_set_param respawn
|
|
||||||
procd_close_instance
|
|
||||||
}
|
|
||||||
|
|
||||||
xdsl_configure
|
|
||||||
xtm_create_devices
|
|
||||||
}
|
|
||||||
|
|
||||||
stop_service() {
|
|
||||||
[ -n "$DSLMNGR" ] && service_stop $DSLMNGR
|
|
||||||
|
|
||||||
xtm_remove_devices
|
|
||||||
xdsl_stop
|
|
||||||
}
|
|
||||||
|
|
||||||
boot() {
|
|
||||||
local HASADSL="$(db -q get hw.board.hasAdsl)"
|
|
||||||
local HASVDSL="$(db -q get hw.board.hasVdsl)"
|
|
||||||
[ "$HASADSL" == "1" -o "$HASVDSL" == "1" ] || return
|
|
||||||
|
|
||||||
xdsl_init
|
|
||||||
|
|
||||||
start
|
|
||||||
}
|
|
||||||
|
|
||||||
reload_service() {
|
|
||||||
stop
|
|
||||||
start
|
|
||||||
}
|
|
||||||
|
|
||||||
service_triggers() {
|
|
||||||
procd_add_reload_trigger dsl
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ define Package/easy-qos
|
|||||||
SECTION:=net
|
SECTION:=net
|
||||||
CATEGORY:=Network
|
CATEGORY:=Network
|
||||||
TITLE:=Easy QoS
|
TITLE:=Easy QoS
|
||||||
DEPENDS:=@(TARGET_brcmbca||TARGET_airoha)
|
DEPENDS:=@(TARGET_intel_mips||TARGET_iopsys_brcm63xx_arm)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/easy-qos/description
|
define Package/easy-qos/description
|
||||||
@@ -39,7 +39,11 @@ define Package/easy-qos/install
|
|||||||
$(INSTALL_DIR) $(1)/etc/init.d
|
$(INSTALL_DIR) $(1)/etc/init.d
|
||||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
||||||
$(CP) ./files/etc/config/easy_qos $(1)/etc/config/
|
$(CP) ./files/etc/config/easy_qos $(1)/etc/config/
|
||||||
|
ifeq ($(CONFIG_TARGET_intel_mips),y)
|
||||||
|
$(CP) ./files/etc/init.d/easy_qos.classcfg $(1)/etc/init.d/easy_qos
|
||||||
|
else
|
||||||
$(CP) ./files/etc/init.d/easy_qos.iptables $(1)/etc/init.d/easy_qos
|
$(CP) ./files/etc/init.d/easy_qos.iptables $(1)/etc/init.d/easy_qos
|
||||||
|
endif
|
||||||
$(CP) ./files/etc/uci-defaults/* $(1)/etc/uci-defaults/
|
$(CP) ./files/etc/uci-defaults/* $(1)/etc/uci-defaults/
|
||||||
$(CP) ./files/etc/firewall.easyqos $(1)/etc/firewall.easyqos
|
$(CP) ./files/etc/firewall.easyqos $(1)/etc/firewall.easyqos
|
||||||
endef
|
endef
|
||||||
|
|||||||
301
easy-qos/files/etc/init.d/easy_qos.classcfg
Executable file
301
easy-qos/files/etc/init.d/easy_qos.classcfg
Executable file
@@ -0,0 +1,301 @@
|
|||||||
|
#!/bin/sh /etc/rc.common
|
||||||
|
|
||||||
|
START=99
|
||||||
|
USE_PROCD=1
|
||||||
|
|
||||||
|
RULE_LIST="/tmp/easy_qos_rule.list"
|
||||||
|
CLIENT_LIST="/tmp/easy_qos_class_client.list"
|
||||||
|
BRIDGE_INTF=""
|
||||||
|
|
||||||
|
[ -f /etc/profile.d/intel.sh ] && {
|
||||||
|
. /etc/profile.d/intel.sh
|
||||||
|
sh /etc/profile.d/intel.sh
|
||||||
|
}
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo "${@}"|logger -t easy_qos_class -p debug
|
||||||
|
}
|
||||||
|
|
||||||
|
exec_log() {
|
||||||
|
${@}
|
||||||
|
if [ "${?}" -ne 0 ]; then
|
||||||
|
log "Failed to create ${@}";
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
exec_class_log() {
|
||||||
|
${@} |grep -i successful
|
||||||
|
if [ "${?}" -ne 0 ]; then
|
||||||
|
log "Failed to create ${@}";
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
get_priority() {
|
||||||
|
local prio=$(echo $1|tr [A-Z] [a-z]);
|
||||||
|
case "${prio}" in
|
||||||
|
"lowest")
|
||||||
|
echo 8;;
|
||||||
|
"low")
|
||||||
|
echo 7;;
|
||||||
|
"besteffort")
|
||||||
|
echo 6;;
|
||||||
|
"normal")
|
||||||
|
echo 5;;
|
||||||
|
"video")
|
||||||
|
echo 4;;
|
||||||
|
"medium")
|
||||||
|
echo 3;;
|
||||||
|
"high")
|
||||||
|
echo 2;;
|
||||||
|
"highest")
|
||||||
|
echo 1;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
get_mark() {
|
||||||
|
local prio=$(echo $1|tr [A-Z] [a-z]);
|
||||||
|
case "${prio}" in
|
||||||
|
"lowest")
|
||||||
|
echo "0x41/0x3df";;
|
||||||
|
"low")
|
||||||
|
echo "0x82/0x3df";;
|
||||||
|
"besteffort")
|
||||||
|
echo "0xc3/0x3df";;
|
||||||
|
"normal")
|
||||||
|
echo "0x104/0x3df";;
|
||||||
|
"video")
|
||||||
|
echo "0x145/0x3df";;
|
||||||
|
"medium")
|
||||||
|
echo "0x186/0x3df";;
|
||||||
|
"high")
|
||||||
|
echo "0x1c7/0x3df";;
|
||||||
|
"highest")
|
||||||
|
echo "0x208/0x3df";;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
clean_client_entries() {
|
||||||
|
[ -f ${CLIENT_LIST} ] && rm ${CLIENT_LIST}
|
||||||
|
}
|
||||||
|
|
||||||
|
map_client_entries() {
|
||||||
|
local clients ip mac host
|
||||||
|
|
||||||
|
json_load "$(ubus call router.network 'clients')"
|
||||||
|
json_get_keys keys
|
||||||
|
|
||||||
|
for key in ${keys};
|
||||||
|
do
|
||||||
|
json_select ${key}
|
||||||
|
json_get_vars ipaddr macaddr hostname
|
||||||
|
clients="${macaddr} ${ipaddr} ${hostname};${clients}"
|
||||||
|
json_select ..
|
||||||
|
done
|
||||||
|
|
||||||
|
json_init
|
||||||
|
|
||||||
|
IFS=";"
|
||||||
|
for client in ${clients};
|
||||||
|
do
|
||||||
|
macaddr=$(echo ${client} | cut -d" " -f1)
|
||||||
|
json_add_object "${macaddr//:/_}"
|
||||||
|
json_add_string "ip" "$(echo ${client} | cut -d" " -f2)"
|
||||||
|
json_add_string "macaddr" "$(echo ${client} | cut -d" " -f1)"
|
||||||
|
json_add_string "host" "$(echo ${client} | cut -d" " -f3)"
|
||||||
|
json_close_object
|
||||||
|
done
|
||||||
|
|
||||||
|
IFS=' '
|
||||||
|
echo `json_dump` > ${CLIENT_LIST}
|
||||||
|
json_cleanup
|
||||||
|
}
|
||||||
|
|
||||||
|
# Find the IP of a corresponding mac from arp table
|
||||||
|
get_ipaddress() {
|
||||||
|
local clients ip mac host
|
||||||
|
|
||||||
|
json_load "$(cat ${CLIENT_LIST})"
|
||||||
|
json_get_keys keys
|
||||||
|
|
||||||
|
# jshn seems a bit iffy on having : in key, replace by _
|
||||||
|
json_select "${1//:/_}" 2 > /dev/null
|
||||||
|
json_get_var ip ip
|
||||||
|
|
||||||
|
echo "$ip"
|
||||||
|
}
|
||||||
|
|
||||||
|
check_and_create() {
|
||||||
|
iptables -t mangle -C PREROUTING ${@} 2>/dev/null
|
||||||
|
# Create rule if not exists
|
||||||
|
if [ ${?} -ne 0 ]; then
|
||||||
|
exec_log iptables -t mangle -A PREROUTING ${@}
|
||||||
|
else
|
||||||
|
log "Rule exists for ${@}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
create_ip_rule() {
|
||||||
|
local proto=$1; shift
|
||||||
|
local src_ip=$1; shift
|
||||||
|
local mark=$1; shift
|
||||||
|
local ports=$1;
|
||||||
|
local cmd="";
|
||||||
|
|
||||||
|
cmd="-j EXTMARK --set-mark ${mark}";
|
||||||
|
if [ "${proto}" != "icmp" ]; then
|
||||||
|
if [ -n "${ports}" ]; then
|
||||||
|
cmd="--match multiport --dports ${ports} ${cmd}";
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${proto}" == "icmp" ]; then
|
||||||
|
cmd="-p icmp -m icmp --icmp-type 8 $cmd"
|
||||||
|
elif [ "${proto}" == "all" ]; then
|
||||||
|
cmd="-p all $cmd"
|
||||||
|
else
|
||||||
|
cmd="-p ${proto} -m ${proto} $cmd"
|
||||||
|
fi
|
||||||
|
cmd="-s ${src_ip} $cmd"
|
||||||
|
|
||||||
|
check_and_create ${cmd}
|
||||||
|
}
|
||||||
|
|
||||||
|
is_lan_bridge() {
|
||||||
|
local _section=$1
|
||||||
|
local _type
|
||||||
|
local _is_lan
|
||||||
|
|
||||||
|
config_get _type "$section" "type"
|
||||||
|
config_get _is_lan "$section" "is_lan"
|
||||||
|
|
||||||
|
if [ "${_type}" == "bridge" -a "${_is_lan}" == "1" ]; then
|
||||||
|
BRIDGE_INTF="br-${_section}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_bridge_interface() {
|
||||||
|
config_load network
|
||||||
|
config_foreach is_lan_bridge interface
|
||||||
|
}
|
||||||
|
|
||||||
|
validate_rule_section()
|
||||||
|
{
|
||||||
|
uci_validate_section easy_qos rule "${1}" \
|
||||||
|
'priority:string' \
|
||||||
|
'macaddr:string' \
|
||||||
|
'proto:string:none' \
|
||||||
|
'port:list(uinteger)' \
|
||||||
|
'comment:string:none'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Clear existing rules before applying new rules
|
||||||
|
clear_existing_rules() {
|
||||||
|
# execute the delete rules written onto a file then delete the file
|
||||||
|
[ -f ${RULE_LIST} ] || return 0
|
||||||
|
|
||||||
|
while read line
|
||||||
|
do
|
||||||
|
log "Deleting old classification rules"
|
||||||
|
exec_class_log classcfg -D ${line} -i ${BRIDGE_INTF}
|
||||||
|
done <${RULE_LIST}
|
||||||
|
|
||||||
|
local rule=$(iptables -t mangle -S PREROUTING|grep -m 1 EXTMARK |sed 's/-A/-D/1')
|
||||||
|
while [ -n "${rule}" ]; do
|
||||||
|
exec_log iptables -t mangle ${rule}
|
||||||
|
rule=$(iptables -t mangle -S PREROUTING|grep -m 1 EXTMARK |sed 's/-A/-D/1')
|
||||||
|
done
|
||||||
|
sync
|
||||||
|
|
||||||
|
[ -f ${RULE_LIST} ] && rm ${RULE_LIST}
|
||||||
|
}
|
||||||
|
|
||||||
|
# classcfg -M local_dhcp -i lo -p udp --dport 67:67 --dport 68:68 -j mark --mark 1
|
||||||
|
create_rule() {
|
||||||
|
local proto=$1; shift
|
||||||
|
local mac_addr=$1; shift
|
||||||
|
local mark=$1; shift
|
||||||
|
local ports=$1;
|
||||||
|
local cmd="";
|
||||||
|
# Rule name is uniqe, so we take hash of all the input as rule_name
|
||||||
|
local rule_name="$(echo ${mac_addr}${proto}${mark}${ports} |md5sum |head -c 30)"
|
||||||
|
|
||||||
|
cmd="-j mark --mark ${mark}";
|
||||||
|
|
||||||
|
if [ "${mac_addr}" != "none" ]; then
|
||||||
|
cmd="--smac ${mac_addr} ${cmd}";
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${proto}" != "icmp" ]; then
|
||||||
|
if [ "${ports}" != "none" ]; then
|
||||||
|
IFS=","
|
||||||
|
for port in ${ports};
|
||||||
|
do
|
||||||
|
cmd="--dport ${port}:${port} ${cmd}";
|
||||||
|
done
|
||||||
|
IFS=' '
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ "${proto}" != "none" ]; then
|
||||||
|
cmd="-p ${proto} $cmd"
|
||||||
|
fi
|
||||||
|
cmd="-i ${BRIDGE_INTF} $cmd"
|
||||||
|
cmd="-A ${rule_name} $cmd"
|
||||||
|
|
||||||
|
# Store the rule_names for cleanup on reload
|
||||||
|
exec_class_log classcfg ${cmd}
|
||||||
|
[ $? -eq 0 ] && \
|
||||||
|
echo ${rule_name} >> ${RULE_LIST}
|
||||||
|
}
|
||||||
|
|
||||||
|
manage_rule() {
|
||||||
|
local cfg="$1"
|
||||||
|
local priority macaddr proto port comment prio_num port_list ip ipmark
|
||||||
|
|
||||||
|
validate_rule_section "${1}" || {
|
||||||
|
log "Validation of section failed"
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
prio_num=$(get_priority ${priority})
|
||||||
|
port_list=$(echo ${port}|sed 's/ /,/g')
|
||||||
|
ipmark=$(get_mark ${priority})
|
||||||
|
ip=$(get_ipaddress ${macaddr})
|
||||||
|
|
||||||
|
if [ -n "${prio_num}" ]; then
|
||||||
|
if [ "${proto}" == "none" -o "${proto}" == "tcpudp" ]; then
|
||||||
|
create_rule tcp ${macaddr} ${prio_num} ${port_list}
|
||||||
|
create_rule udp ${macaddr} ${prio_num} ${port_list}
|
||||||
|
if [ -n "${ip}" ]; then
|
||||||
|
create_ip_rule tcp ${ip} ${ipmark} ${port_list}
|
||||||
|
create_ip_rule udp ${ip} ${ipmark} ${port_list}
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
create_rule ${proto} ${macaddr} ${prio_num} ${port_list}
|
||||||
|
if [ -n "${ip}" ]; then
|
||||||
|
create_ip_rule ${proto} ${ip} ${ipmark} ${port_list}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_service() {
|
||||||
|
get_bridge_interface
|
||||||
|
map_client_entries
|
||||||
|
clear_existing_rules
|
||||||
|
config_load easy_qos
|
||||||
|
config_foreach manage_rule rule
|
||||||
|
clean_client_entries
|
||||||
|
}
|
||||||
|
|
||||||
|
start_service() {
|
||||||
|
[ -x /opt/intel/usr/sbin/classcfg ] || exit 0
|
||||||
|
reload_service
|
||||||
|
log "Easy QoS class installed"
|
||||||
|
}
|
||||||
|
|
||||||
|
service_triggers() {
|
||||||
|
procd_add_reload_trigger "easy_qos" "network"
|
||||||
|
}
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ exec_log() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get_priority() {
|
get_priority() {
|
||||||
local prio=$(echo $1|tr 'A-Z' 'a-z');
|
local prio=$(echo $1|tr [A-Z] [a-z]);
|
||||||
case "${prio}" in
|
case "${prio}" in
|
||||||
"lowest")
|
"lowest")
|
||||||
echo 0;;
|
echo 0;;
|
||||||
@@ -98,7 +98,7 @@ manage_rule() {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
protocol=$(echo ${proto}|tr 'A-Z' 'a-z')
|
protocol=$(echo ${proto}|tr [A-Z] [a-z])
|
||||||
prio_num=$(get_priority ${priority})
|
prio_num=$(get_priority ${priority})
|
||||||
if [ -n "${macaddr}" -a -n "${prio_num}" ]; then
|
if [ -n "${macaddr}" -a -n "${prio_num}" ]; then
|
||||||
for p in ${port}; do
|
for p in ${port}; do
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ exec_log() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get_priority() {
|
get_priority() {
|
||||||
local prio=$(echo $1|tr 'A-Z' 'a-z');
|
local prio=$(echo $1|tr [A-Z] [a-z]);
|
||||||
case "${prio}" in
|
case "${prio}" in
|
||||||
"lowest")
|
"lowest")
|
||||||
echo 0;;
|
echo 0;;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ include $(INCLUDE_DIR)/package.mk
|
|||||||
|
|
||||||
-include $(TOPDIR)/.config
|
-include $(TOPDIR)/.config
|
||||||
|
|
||||||
ifneq ($(CONFIG_TARGET_brcmbca),)
|
ifneq ($(CONFIG_TARGET_iopsys_brcm63xx_arm),)
|
||||||
LINUX_DIR=$(BUILD_DIR)/bcmkernel/bcm963xx/kernel/linux-4.1
|
LINUX_DIR=$(BUILD_DIR)/bcmkernel/bcm963xx/kernel/linux-4.1
|
||||||
LINUX_VERSION := 4.1.52
|
LINUX_VERSION := 4.1.52
|
||||||
LINUXINCLUDE=-Iarch/$(LINUX_KARCH)/mach-bcm963xx/include
|
LINUXINCLUDE=-Iarch/$(LINUX_KARCH)/mach-bcm963xx/include
|
||||||
@@ -85,7 +85,7 @@ define Build/Compile
|
|||||||
endef
|
endef
|
||||||
|
|
||||||
|
|
||||||
ifneq ($(CONFIG_TARGET_brcmbca),)
|
ifneq ($(CONFIG_TARGET_iopsys_brcm63xx_arm),)
|
||||||
define KernelPackage/easy-soc-events/install-extra
|
define KernelPackage/easy-soc-events/install-extra
|
||||||
cp $(PKG_BUILD_DIR)/easyevent.ko $(FS_DIR)/lib/modules/$(LINUX_VERSION)/extra
|
cp $(PKG_BUILD_DIR)/easyevent.ko $(FS_DIR)/lib/modules/$(LINUX_VERSION)/extra
|
||||||
endef
|
endef
|
||||||
|
|||||||
5
easy-soc-libs/Config.in
Normal file
5
easy-soc-libs/Config.in
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# libeasy configuration
|
||||||
|
|
||||||
|
config LIBWIFI_USE_CTRL_IFACE
|
||||||
|
bool "Use UNIX sockets"
|
||||||
|
default n
|
||||||
@@ -7,13 +7,13 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=easy-soc-libs
|
PKG_NAME:=easy-soc-libs
|
||||||
PKG_VERSION:=7.2.26
|
PKG_VERSION:=6.1.89
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
LOCAL_DEV=0
|
LOCAL_DEV=0
|
||||||
ifneq ($(LOCAL_DEV),1)
|
ifneq ($(LOCAL_DEV),1)
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_VERSION:=350793b45873480d8981dac540c4145705a7b7ba
|
PKG_SOURCE_VERSION:=509c57cdcbabcc819932e673718c1a305bf32009
|
||||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/easy-soc-libs.git
|
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/easy-soc-libs.git
|
||||||
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
PKG_MAINTAINER:=Anjan Chanda <anjan.chanda@iopsys.eu>
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
|
||||||
@@ -36,63 +36,42 @@ define Package/easy-soc-libs
|
|||||||
MENU:=1
|
MENU:=1
|
||||||
endef
|
endef
|
||||||
|
|
||||||
ifeq ($(CONFIG_TARGET_brcmbca),y)
|
ifeq ($(CONFIG_TARGET_iopsys_brcm63xx_arm),y)
|
||||||
TARGET_PLATFORM=BROADCOM
|
TARGET_PLATFORM=BROADCOM
|
||||||
TARGET_WIFI_TYPE=BROADCOM
|
|
||||||
CHIP_ID=$(patsubst "%",%,$(CONFIG_BCM_CHIP_ID))
|
CHIP_ID=$(patsubst "%",%,$(CONFIG_BCM_CHIP_ID))
|
||||||
TARGET_CFLAGS +=-DIOPSYS_BROADCOM -DCHIP_$(CHIP_ID) -DCONFIG_BCM9$(CHIP_ID) \
|
TARGET_CFLAGS +=-DIOPSYS_BROADCOM -DCHIP_$(CHIP_ID) -DCONFIG_BCM9$(CHIP_ID) \
|
||||||
-I$(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx \
|
-I$(STAGING_DIR)/usr/include/bcm963xx/bcmdrivers/opensource/include/bcm963xx \
|
||||||
-I$(STAGING_DIR)/usr/include/bcm963xx/userspace/public/include
|
-I$(STAGING_DIR)/usr/include/bcm963xx/userspace/public/include
|
||||||
|
else ifeq ($(CONFIG_TARGET_iopsys_ramips),y)
|
||||||
|
TARGET_PLATFORM=MEDIATEK
|
||||||
|
TARGET_CFLAGS +=-DIOPSYS_MEDIATEK
|
||||||
|
else ifeq ($(CONFIG_TARGET_iopsys_linksys),y)
|
||||||
|
TARGET_PLATFORM=MARVELL
|
||||||
|
TARGET_CFLAGS +=-DIOPSYS_MARVELL
|
||||||
|
else ifeq ($(CONFIG_TARGET_intel_mips),y)
|
||||||
|
TARGET_PLATFORM=INTEL
|
||||||
|
TARGET_CFLAGS +=-DIOPSYS_INTEL
|
||||||
else ifeq ($(CONFIG_TARGET_iopsys_x86),y)
|
else ifeq ($(CONFIG_TARGET_iopsys_x86),y)
|
||||||
TARGET_PLATFORM=TEST
|
TARGET_PLATFORM=TEST
|
||||||
TARGET_WIFI_TYPE=TEST
|
|
||||||
TARGET_CFLAGS +=-DIOPSYS_TEST
|
TARGET_CFLAGS +=-DIOPSYS_TEST
|
||||||
else ifeq ($(CONFIG_TARGET_iopsys_armvirt),y)
|
else ifeq ($(CONFIG_TARGET_iopsys_armvirt),y)
|
||||||
TARGET_PLATFORM=TEST
|
TARGET_PLATFORM=TEST
|
||||||
TARGET_WIFI_TYPE=TEST
|
|
||||||
TARGET_CFLAGS +=-DIOPSYS_TEST
|
TARGET_CFLAGS +=-DIOPSYS_TEST
|
||||||
else ifeq ($(CONFIG_TARGET_airoha),y)
|
|
||||||
TARGET_PLATFORM=ECONET
|
|
||||||
TARGET_WIFI_TYPE=MEDIATEK MAC80211
|
|
||||||
TARGET_CFLAGS +=-DIOPSYS_ECONET
|
|
||||||
else ifeq ($(CONFIG_TARGET_ipq95xx),y)
|
|
||||||
TARGET_PLATFORM=IPQ95XX
|
|
||||||
TARGET_WIFI_TYPE=MAC80211
|
|
||||||
TARGET_CFLAGS +=-DIPQ95XX
|
|
||||||
else ifeq ($(CONFIG_TARGET_iopsys_mediatek),y)
|
|
||||||
TARGET_PLATFORM=LINUX
|
|
||||||
TARGET_WIFI_TYPE=MAC80211
|
|
||||||
TARGET_CFLAGS +=-DIOPSYS_LINUX
|
|
||||||
else
|
else
|
||||||
$(info Unexpected CONFIG_TARGET, use default MAC80211)
|
$(info Unexpected CONFIG_TARGET)
|
||||||
TARGET_PLATFORM=MAC80211
|
|
||||||
TARGET_WIFI_TYPE=MAC80211
|
|
||||||
TARGET_CFLAGS +=-DIOPSYS_MAC80211
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
export TARGET_PLATFORM
|
||||||
|
|
||||||
subdirs := \
|
subdirs := \
|
||||||
$(if $(CONFIG_PACKAGE_libeasy),libeasy) \
|
$(if $(CONFIG_PACKAGE_libeasy),libeasy) \
|
||||||
$(if $(CONFIG_PACKAGE_libwifiutils),libwifi) \
|
|
||||||
$(if $(CONFIG_PACKAGE_libwifi),libwifi) \
|
$(if $(CONFIG_PACKAGE_libwifi),libwifi) \
|
||||||
$(if $(CONFIG_PACKAGE_libdsl),libdsl) \
|
$(if $(CONFIG_PACKAGE_libdsl),libdsl) \
|
||||||
$(if $(CONFIG_PACKAGE_libethernet),libethernet) \
|
$(if $(CONFIG_PACKAGE_libethernet),libethernet) \
|
||||||
$(if $(CONFIG_PACKAGE_libqos),libqos)
|
$(if $(CONFIG_PACKAGE_libqos),libqos)
|
||||||
|
|
||||||
ifneq ($(CONFIG_PACKAGE_libwifi),)
|
EASY_SOC_LIBS := \
|
||||||
TARGET_CFLAGS +=-DHAS_WIFI
|
|
||||||
endif
|
|
||||||
|
|
||||||
esl-pkgs := \
|
|
||||||
$(if $(CONFIG_PACKAGE_libeasy),libeasy) \
|
|
||||||
$(if $(CONFIG_PACKAGE_libwifiutils),libwifiutils) \
|
|
||||||
$(if $(CONFIG_PACKAGE_libwifi),libwifi) \
|
|
||||||
$(if $(CONFIG_PACKAGE_libdsl),libdsl) \
|
|
||||||
$(if $(CONFIG_PACKAGE_libethernet),libethernet) \
|
|
||||||
$(if $(CONFIG_PACKAGE_libqos),libqos)
|
|
||||||
|
|
||||||
esl-pkgs-all := \
|
|
||||||
libeasy \
|
libeasy \
|
||||||
libwifiutils \
|
|
||||||
libwifi \
|
libwifi \
|
||||||
libdsl \
|
libdsl \
|
||||||
libethernet \
|
libethernet \
|
||||||
@@ -112,7 +91,6 @@ MAKE_FLAGS += \
|
|||||||
LDFLAGS="$(TARGET_LDFLAGS)" \
|
LDFLAGS="$(TARGET_LDFLAGS)" \
|
||||||
FPIC="$(FPIC)" \
|
FPIC="$(FPIC)" \
|
||||||
PLATFORM="$(TARGET_PLATFORM)" \
|
PLATFORM="$(TARGET_PLATFORM)" \
|
||||||
WIFI_TYPE="$(TARGET_WIFI_TYPE)" \
|
|
||||||
subdirs="$(subdirs)"
|
subdirs="$(subdirs)"
|
||||||
|
|
||||||
ifeq ($(LOCAL_DEV),1)
|
ifeq ($(LOCAL_DEV),1)
|
||||||
@@ -142,15 +120,15 @@ define Build/Compile
|
|||||||
$(Build/Compile/rebuild)
|
$(Build/Compile/rebuild)
|
||||||
touch $(PKG_BUILD_DIR)/.config_$(CONFIG_TARGET_PROFILE)
|
touch $(PKG_BUILD_DIR)/.config_$(CONFIG_TARGET_PROFILE)
|
||||||
$(call Build/Compile/Default)
|
$(call Build/Compile/Default)
|
||||||
$(foreach dir,$(esl-pkgs),$(call Build/Compile/$(dir)))
|
$(foreach dir,$(subdirs),$(call Build/Compile/$(dir)))
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Build/InstallDev
|
define Build/InstallDev
|
||||||
$(foreach dir,$(esl-pkgs),$(call Build/InstallDev/$(dir),$(1),$(2));)
|
$(foreach dir,$(subdirs),$(call Build/InstallDev/$(dir),$(1),$(2));)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/easy-soc-libs/install
|
define Package/easy-soc-libs/install
|
||||||
:
|
:
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(foreach e,$(esl-pkgs-all),$(call BuildPackage,$(e))))
|
$(eval $(foreach e,$(EASY_SOC_LIBS),$(call BuildPackage,$(e))))
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
|
|
||||||
define Package/libdsl
|
define Package/libdsl
|
||||||
$(call Package/easy-soc-libs)
|
$(call Package/easy-soc-libs)
|
||||||
TITLE:= xDSL library (libdsl)
|
TITLE:= XDSL library (libdsl)
|
||||||
|
DEPENDS+=+TARGET_intel_mips:dsl-cpe-api-vrx \
|
||||||
|
+TARGET_intel_mips:dsl-cpe-fapi \
|
||||||
|
+TARGET_intel_mips:kmod-ppa-drv
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/libdsl/config
|
define Package/libdsl/config
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ define Package/libeasy
|
|||||||
DEPENDS+=+libnl +libnl-route
|
DEPENDS+=+libnl +libnl-route
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
define Package/libeasy/config
|
||||||
|
source "$(SOURCE)/Config.in"
|
||||||
|
endef
|
||||||
|
|
||||||
define Build/InstallDev/libeasy
|
define Build/InstallDev/libeasy
|
||||||
$(INSTALL_DIR) $(1)/usr/include/easy
|
$(INSTALL_DIR) $(1)/usr/include/easy
|
||||||
$(INSTALL_DIR) $(1)/usr/lib
|
$(INSTALL_DIR) $(1)/usr/lib
|
||||||
@@ -14,7 +18,6 @@ define Build/InstallDev/libeasy
|
|||||||
$(CP) $(PKG_BUILD_DIR)/libeasy/utils.h $(1)/usr/include/easy/
|
$(CP) $(PKG_BUILD_DIR)/libeasy/utils.h $(1)/usr/include/easy/
|
||||||
$(CP) $(PKG_BUILD_DIR)/libeasy/if_utils.h $(1)/usr/include/easy/
|
$(CP) $(PKG_BUILD_DIR)/libeasy/if_utils.h $(1)/usr/include/easy/
|
||||||
$(CP) $(PKG_BUILD_DIR)/libeasy/debug.h $(1)/usr/include/easy/
|
$(CP) $(PKG_BUILD_DIR)/libeasy/debug.h $(1)/usr/include/easy/
|
||||||
$(CP) $(PKG_BUILD_DIR)/libeasy/hlist.h $(1)/usr/include/easy/
|
|
||||||
$(CP) $(PKG_BUILD_DIR)/libeasy/libeasy*.so* $(1)/usr/lib/
|
$(CP) $(PKG_BUILD_DIR)/libeasy/libeasy*.so* $(1)/usr/lib/
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
define Package/libethernet
|
define Package/libethernet
|
||||||
$(call Package/easy-soc-libs)
|
$(call Package/easy-soc-libs)
|
||||||
TITLE:= Ethernet library (libethernet)
|
TITLE:= Ethernet library (libethernet)
|
||||||
DEPENDS+=+libnl +libnl-route +libeasy +TARGET_airoha:ecnt_api
|
DEPENDS+=+libnl +libnl-route +libeasy +TARGET_iopsys_ramips:swconfig
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/libethernet/config
|
define Package/libethernet/config
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ endef
|
|||||||
define Build/InstallDev/libqos
|
define Build/InstallDev/libqos
|
||||||
$(INSTALL_DIR) $(1)/usr/include
|
$(INSTALL_DIR) $(1)/usr/include
|
||||||
$(INSTALL_DIR) $(1)/usr/lib
|
$(INSTALL_DIR) $(1)/usr/lib
|
||||||
$(CP) $(PKG_BUILD_DIR)/libqos/include/qos.h $(1)/usr/include/
|
$(CP) $(PKG_BUILD_DIR)/libqos/qos.h $(1)/usr/include/
|
||||||
$(CP) $(PKG_BUILD_DIR)/libqos/libqos.so $(1)/usr/lib/
|
$(CP) $(PKG_BUILD_DIR)/libqos/libqos.so $(1)/usr/lib/
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
|||||||
@@ -1,53 +1,29 @@
|
|||||||
|
|
||||||
define Package/libwifiutils
|
|
||||||
$(call Package/easy-soc-libs)
|
|
||||||
TITLE:= WiFi utility library (libwifiutils.so)
|
|
||||||
DEPENDS+=+libnl +libnl-route +libeasy
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Build/InstallDev/libwifiutils
|
|
||||||
$(INSTALL_DIR) $(1)/usr/include
|
|
||||||
$(INSTALL_DIR) $(1)/usr/lib
|
|
||||||
$(CP) $(PKG_BUILD_DIR)/libwifi/wifidefs.h $(1)/usr/include/
|
|
||||||
$(CP) $(PKG_BUILD_DIR)/libwifi/wifiutils.h $(1)/usr/include/
|
|
||||||
$(CP) $(PKG_BUILD_DIR)/libwifi/libwifiutils*.so* $(1)/usr/lib/
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/libwifiutils/install
|
|
||||||
$(INSTALL_DIR) $(1)/usr/lib
|
|
||||||
$(CP) $(PKG_BUILD_DIR)/libwifi/libwifiutils*.so* $(1)/usr/lib/
|
|
||||||
endef
|
|
||||||
|
|
||||||
|
|
||||||
define Package/libwifi
|
define Package/libwifi
|
||||||
$(call Package/easy-soc-libs)
|
$(call Package/easy-soc-libs)
|
||||||
TITLE:= WiFi library (libwifi)
|
TITLE:= WiFi library (libwifi)
|
||||||
DEPENDS+=+libnl +libnl-route +libeasy +libwifiutils +TARGET_brcmbca:bcmkernel
|
DEPENDS+=+libnl +libnl-route +libeasy +TARGET_iopsys_brcm63xx_arm:bcmkernel
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/libwifi/config
|
define Package/libwifi/config
|
||||||
if PACKAGE_libwifi
|
if PACKAGE_libdsl
|
||||||
config LIBWIFI_DEBUG
|
config LIBWIFI_DEBUG
|
||||||
depends on PACKAGE_libwifi
|
depends on PACKAGE_libwifi
|
||||||
bool "Enable debugging in libwifi"
|
bool "Enable wifi debugging"
|
||||||
default n
|
default n
|
||||||
|
|
||||||
config LIBWIFI_USE_CTRL_IFACE
|
|
||||||
bool "Create UNIX sockets to interface with hostapd/wpa_supplicant"
|
|
||||||
default n
|
|
||||||
endif
|
endif
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
|
||||||
define Build/InstallDev/libwifi
|
define Build/InstallDev/libwifi
|
||||||
$(INSTALL_DIR) $(1)/usr/include
|
$(INSTALL_DIR) $(1)/usr/include
|
||||||
$(INSTALL_DIR) $(1)/usr/lib
|
$(INSTALL_DIR) $(1)/usr/lib
|
||||||
$(CP) $(PKG_BUILD_DIR)/libwifi/wifiops.h $(1)/usr/include/
|
|
||||||
$(CP) $(PKG_BUILD_DIR)/libwifi/wifi.h $(1)/usr/include/
|
$(CP) $(PKG_BUILD_DIR)/libwifi/wifi.h $(1)/usr/include/
|
||||||
$(CP) $(PKG_BUILD_DIR)/libwifi/libwifi-7*.so* $(1)/usr/lib/
|
$(CP) $(PKG_BUILD_DIR)/libwifi/libwifi*.so* $(1)/usr/lib/
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/libwifi/install
|
define Package/libwifi/install
|
||||||
$(INSTALL_DIR) $(1)/usr/lib
|
$(INSTALL_DIR) $(1)/usr/lib
|
||||||
$(CP) $(PKG_BUILD_DIR)/libwifi/libwifi-7*.so* $(1)/usr/lib/
|
$(CP) $(PKG_BUILD_DIR)/libwifi/libwifi*.so* $(1)/usr/lib/
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
|||||||
@@ -6,21 +6,27 @@
|
|||||||
#
|
#
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=endptmngr
|
PKG_RELEASE:=1
|
||||||
PKG_VERSION:=0.6
|
PKG_VERSION:=0.4
|
||||||
|
PKG_SOURCE_VERSION:=510b885c049b8ba06772dae59e64b370d0fded3e
|
||||||
|
PKG_LICENSE:=MIT
|
||||||
|
PKG_LICENSE_FILES:=LICENSE
|
||||||
|
|
||||||
LOCAL_DEV=0
|
ifeq ($(CONFIG_ENDPT_OPEN),y)
|
||||||
ifneq ($(LOCAL_DEV),1)
|
BRCM_KERNEL_PROFILE=$(shell echo $(CONFIG_BCM_KERNEL_PROFILE) | sed s/\"//g)
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE:=endptmngr-$(BRCM_KERNEL_PROFILE)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||||
|
PKG_SOURCE_URL:=https://download.iopsys.eu/iopsys/opensdk/
|
||||||
|
PKG_NAME:=endptmngr-open
|
||||||
|
PATCH_DIR:=
|
||||||
|
PKG_HASH:=skip
|
||||||
|
else
|
||||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/endptmngr.git
|
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/endptmngr.git
|
||||||
PKG_SOURCE_VERSION:=fb85081443c19b5062bede49c80b1802c0f05d34
|
PKG_SOURCE_PROTO:=git
|
||||||
|
PKG_NAME:=endptmngr
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||||
PKG_MIRROR_HASH:=skip
|
PKG_MIRROR_HASH:=skip
|
||||||
endif
|
endif
|
||||||
|
|
||||||
PKG_LICENSE:=PROPRIETARY
|
|
||||||
PKG_LICENSE_FILES:=LICENSE
|
|
||||||
|
|
||||||
export BUILD_DIR
|
export BUILD_DIR
|
||||||
|
|
||||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||||
@@ -28,9 +34,15 @@ PKG_BUILD_PARALLEL:=1
|
|||||||
|
|
||||||
# All config variable that are passed to the make invocation, directly or
|
# All config variable that are passed to the make invocation, directly or
|
||||||
# indirectly. This ensures that the package is rebuilt on config-changes.
|
# indirectly. This ensures that the package is rebuilt on config-changes.
|
||||||
PKG_CONFIG_DEPENDS:=CONFIG_TARGET_BOARD
|
PKG_CONFIG_DEPENDS := \
|
||||||
|
CONFIG_TARGET_BOARD
|
||||||
|
|
||||||
|
export CONFIG_BRCM_SDK_VER_504001
|
||||||
|
export CONFIG_BRCM_SDK_VER_504002
|
||||||
|
export CONFIG_BRCM_SDK_VER_504003
|
||||||
|
export CONFIG_BRCM_SDK_VER_504004
|
||||||
|
export CONFIG_BRCM_SDK_VER_504005
|
||||||
|
|
||||||
export CONFIG_BCM_CHIP_ID
|
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
@@ -40,7 +52,7 @@ endef
|
|||||||
|
|
||||||
define Package/endptmngr
|
define Package/endptmngr
|
||||||
CATEGORY:=Utilities
|
CATEGORY:=Utilities
|
||||||
TITLE:=Broadcom Voice Endpoint Manager
|
TITLE:=Brcmslic
|
||||||
URL:=
|
URL:=
|
||||||
DEPENDS:= +libubox +ubus +libpicoevent +uci +bcmkernel @TARGET_HAS_VOICE @BCM_VOICE
|
DEPENDS:= +libubox +ubus +libpicoevent +uci +bcmkernel @TARGET_HAS_VOICE @BCM_VOICE
|
||||||
endef
|
endef
|
||||||
@@ -49,19 +61,18 @@ define Package/endptmngr/description
|
|||||||
endptmngr
|
endptmngr
|
||||||
endef
|
endef
|
||||||
|
|
||||||
ifeq ($(LOCAL_DEV),1)
|
ifeq ($(CONFIG_ENDPT_OPEN),y)
|
||||||
define Build/Prepare
|
|
||||||
rsync -av --exclude=.* ~/git/endptmngr/* $(PKG_BUILD_DIR)/
|
define Build/Compile
|
||||||
endef
|
endef
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
TARGET_CFLAGS += \
|
|
||||||
-Wall \
|
|
||||||
-Werror
|
|
||||||
|
|
||||||
define Package/endptmngr/install
|
define Package/endptmngr/install
|
||||||
$(CP) ./files/* $(1)/
|
|
||||||
$(INSTALL_DIR) $(1)/usr/sbin
|
$(INSTALL_DIR) $(1)/usr/sbin
|
||||||
|
$(INSTALL_DIR) $(1)/etc/init.d/
|
||||||
|
cp $(PKG_BUILD_DIR)/files/etc/init.d/* $(1)/etc/init.d/
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/endptmngr $(1)/usr/sbin/
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/endptmngr $(1)/usr/sbin/
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
#!/bin/sh /etc/rc.common
|
|
||||||
|
|
||||||
START=68
|
|
||||||
STOP=12
|
|
||||||
|
|
||||||
USE_PROCD=1
|
|
||||||
NAME=endptmngr
|
|
||||||
|
|
||||||
start_service() {
|
|
||||||
[ "$(db -q get hw.board.hasVoice)" = "1" ] || return
|
|
||||||
|
|
||||||
procd_open_instance
|
|
||||||
procd_set_param env hw_board_hasDect=$(db get hw.board.hasDect)
|
|
||||||
procd_set_param command $NAME
|
|
||||||
procd_set_param respawn "5" "0" "3"
|
|
||||||
procd_set_param nice -12
|
|
||||||
procd_close_instance
|
|
||||||
}
|
|
||||||
|
|
||||||
reload_service() {
|
|
||||||
stop
|
|
||||||
start
|
|
||||||
}
|
|
||||||
|
|
||||||
service_triggers() {
|
|
||||||
procd_add_reload_trigger asterisk
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=ethmngr
|
PKG_NAME:=ethmngr
|
||||||
PKG_VERSION:=2.1.0
|
PKG_VERSION:=2.0.1
|
||||||
|
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_VERSION:=5a0ff3bc7c49dcb05129f423ef8e0c4929f6aa03
|
PKG_SOURCE_VERSION:=5a0ff3bc7c49dcb05129f423ef8e0c4929f6aa03
|
||||||
@@ -23,7 +23,7 @@ define Package/ethmngr
|
|||||||
SECTION:=utils
|
SECTION:=utils
|
||||||
CATEGORY:=Utilities
|
CATEGORY:=Utilities
|
||||||
TITLE:=Ethernet status and configration utility
|
TITLE:=Ethernet status and configration utility
|
||||||
DEPENDS:=+(TARGET_brcmbca||TARGET_airoha||TARGET_ipq95xx||TARGET_iopsys_mediatek):libethernet +libuci +libubox +ubus +libpthread +libnl-genl
|
DEPENDS:=+libethernet +libuci +libubox +ubus +libpthread +libnl-genl
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/ethmngr/description
|
define Package/ethmngr/description
|
||||||
@@ -37,24 +37,10 @@ TARGET_CFLAGS += \
|
|||||||
-I$(STAGING_DIR)/usr/include/libnl3 \
|
-I$(STAGING_DIR)/usr/include/libnl3 \
|
||||||
-D_GNU_SOURCE
|
-D_GNU_SOURCE
|
||||||
|
|
||||||
ifeq ($(CONFIG_TARGET_brcmbca)$(CONFIG_TARGET_airoha)$(CONFIG_TARGET_ipq95xx)$(CONFIG_TARGET_iopsys_mediatek),)
|
|
||||||
define Build/Compile
|
|
||||||
endef
|
|
||||||
endif
|
|
||||||
|
|
||||||
define Package/ethmngr/install
|
define Package/ethmngr/install
|
||||||
$(CP) ./files/common/* $(1)/
|
$(INSTALL_DIR) $(1)/etc/init.d $(1)/usr/sbin
|
||||||
ifneq ($(CONFIG_TARGET_brcmbca),)
|
$(INSTALL_BIN) ./files/ethmngr.init $(1)/etc/init.d/ethmngr
|
||||||
$(CP) ./files/broadcom/* $(1)/
|
|
||||||
else ifneq ($(CONFIG_TARGET_airoha),)
|
|
||||||
$(CP) ./files/airoha/* $(1)/
|
|
||||||
else
|
|
||||||
$(CP) ./files/linux/* $(1)/
|
|
||||||
endif
|
|
||||||
ifneq ($(CONFIG_TARGET_brcmbca)$(CONFIG_TARGET_airoha)$(CONFIG_TARGET_ipq95xx)$(CONFIG_TARGET_iopsys_mediatek),)
|
|
||||||
$(INSTALL_DIR) $(1)/usr/sbin
|
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/ethmngr $(1)/usr/sbin/
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/ethmngr $(1)/usr/sbin/
|
||||||
endif
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage,ethmngr))
|
$(eval $(call BuildPackage,ethmngr))
|
||||||
|
|||||||
@@ -1,208 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
. /lib/functions.sh
|
|
||||||
|
|
||||||
unset -f switchmgr
|
|
||||||
# alias for switchmgr
|
|
||||||
switchmgr() {
|
|
||||||
"/userfs/bin/switchmgr" "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
unset -f tc3162_get_lan_port
|
|
||||||
# get lan port port by ifname
|
|
||||||
# arg1: port ifname, ex: eth0.1
|
|
||||||
tc3162_get_lan_port() {
|
|
||||||
[[ -z "$1" ]] && return 255
|
|
||||||
|
|
||||||
local ifname="$1"
|
|
||||||
local if_idx=255
|
|
||||||
|
|
||||||
# only for tc3162 eth switch ports (eth0.x, 0 < x < 7)
|
|
||||||
case "${ifname}" in
|
|
||||||
eth0.*)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
logger -t "port-management" \
|
|
||||||
"unsupported - ${ifname} is not tc3162 switch port"
|
|
||||||
return 255
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
let "if_idx=$(echo "${ifname}" | cut -f2 -d'.')"
|
|
||||||
[[ -z "${if_idx}" ]] && return 255
|
|
||||||
[[ ${if_idx} -lt 1 || ${if_idx} -gt 6 ]] && {
|
|
||||||
logger -t "port-management" \
|
|
||||||
"incorrect tc3162 lan port index ${if_idx} picked from ifname ${ifname}"
|
|
||||||
return 255
|
|
||||||
}
|
|
||||||
let "if_idx=${if_idx}-1"
|
|
||||||
return ${if_idx}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
unset -f tc3162_get_mapped_port
|
|
||||||
# get mapped switch port by ifname
|
|
||||||
# arg1: port ifname, ex: eth0.1
|
|
||||||
tc3162_get_mapped_port() {
|
|
||||||
[[ -z "$1" ]] && return 255
|
|
||||||
|
|
||||||
local ifname="$1"
|
|
||||||
local if_idx=255
|
|
||||||
local prtmap_procfile="/proc/tc3162/eth_portmap"
|
|
||||||
local lan_prt=255
|
|
||||||
local port=255
|
|
||||||
local prtmap_out_line_num=4
|
|
||||||
local prtmap_out_line=""
|
|
||||||
|
|
||||||
# check "lan port map" marker in portmap output string
|
|
||||||
prtmap_out_line="$(sed -n "${prtmap_out_line_num}p" ${prtmap_procfile})"
|
|
||||||
[[ ${prtmap_out_line} != "lan_port_map" ]] && return 255
|
|
||||||
|
|
||||||
tc3162_get_lan_port "${ifname}"
|
|
||||||
let "if_idx=$?"
|
|
||||||
[[ -z "${if_idx}" || ${if_idx} -eq 255 ]] && return
|
|
||||||
|
|
||||||
# get lan portmapping string "lan_port mapped_port" for ifname by it's index
|
|
||||||
let "prtmap_out_line_num=${prtmap_out_line_num}+1+${if_idx}"
|
|
||||||
prtmap_out_line="$(sed -n "${prtmap_out_line_num}p" ${prtmap_procfile})"
|
|
||||||
|
|
||||||
# get and check lan port index from lan portmapping string
|
|
||||||
lan_prt=$(echo "${prtmap_out_line}" | cut -f 1 -d' ')
|
|
||||||
[[ -z "${lan_prt}" || "${if_idx}" != "${lan_prt}" ]] && return 255
|
|
||||||
|
|
||||||
# get and check mapped port from lan portmapping string
|
|
||||||
let "port=$(echo "${prtmap_out_line}" | cut -f 2 -d' ')"
|
|
||||||
[[ ${port} -lt 0 || ${port} -gt 255 ]] && return 255
|
|
||||||
|
|
||||||
return ${port}
|
|
||||||
}
|
|
||||||
|
|
||||||
unset -f get_max_port_speed
|
|
||||||
# arg1: port ifname, ex: eth0.1
|
|
||||||
get_max_port_speed() {
|
|
||||||
[[ -z "$1" ]] && { echo 0; return; }
|
|
||||||
|
|
||||||
local ifname="$1"
|
|
||||||
local port=255
|
|
||||||
local speed=0
|
|
||||||
|
|
||||||
[[ -d "/sys/class/net/${ifname}" ]] || {
|
|
||||||
logger -t "port-management" "interface ${ifname} is not found"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
tc3162_get_lan_port "${ifname}"
|
|
||||||
let "port=$?"
|
|
||||||
[[ -z "${port}" || ${port} -eq 255 ]] && return
|
|
||||||
|
|
||||||
# tc3162 capability for all ports is 1Gbps
|
|
||||||
speed=1000
|
|
||||||
|
|
||||||
echo $speed
|
|
||||||
}
|
|
||||||
|
|
||||||
unset -f power_updown
|
|
||||||
# arg1: port ifname, ex: eth0.1
|
|
||||||
# arg2: port enabled, ex: 0/1/off/on/..
|
|
||||||
power_updown() {
|
|
||||||
[[ -z "$1" ]] && return
|
|
||||||
[[ -z "$2" ]] && return
|
|
||||||
|
|
||||||
local ifname="$1"
|
|
||||||
local enabled="$2"
|
|
||||||
local port=255
|
|
||||||
|
|
||||||
[[ -d "/sys/class/net/${ifname}" ]] || {
|
|
||||||
logger -t "port-management" "interface ${ifname} is not found"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let "enabled=$(get_bool "${enabled}" "-1")"
|
|
||||||
[[ ${enabled} -eq -1 ]] && return
|
|
||||||
|
|
||||||
tc3162_get_lan_port "${ifname}"
|
|
||||||
let "port=$?"
|
|
||||||
[[ -z "${port}" || ${port} -eq 255 ]] && return
|
|
||||||
|
|
||||||
switchmgr phy admin "${port}" "${enabled}"
|
|
||||||
}
|
|
||||||
|
|
||||||
unset -f set_port_settings
|
|
||||||
# arg1: port ifname, ex: eth0.1
|
|
||||||
# arg2: port enabled, ex: 0/1/off/on/..
|
|
||||||
# arg3: port speed, ex: 1000
|
|
||||||
# arg4: port duplex, ex: full
|
|
||||||
# arg5: port autoneg, ex: 0/1/off/on/..
|
|
||||||
# arg6: port eee, ex: 0/1/off/on/..
|
|
||||||
# arg7: port pause, ex: 0/1/off/on/..
|
|
||||||
set_port_settings() {
|
|
||||||
[[ -z "$1" ]] && return
|
|
||||||
[[ -z "$2" ]] && return
|
|
||||||
[[ -z "$3" ]] && return
|
|
||||||
[[ -z "$4" ]] && return
|
|
||||||
[[ -z "$5" ]] && return
|
|
||||||
[[ -z "$6" ]] && return
|
|
||||||
[[ -z "$7" ]] && return
|
|
||||||
|
|
||||||
local ifname="$1"
|
|
||||||
local enabled="$2"
|
|
||||||
local speed="$3"
|
|
||||||
local duplex="$4"
|
|
||||||
local autoneg=$5
|
|
||||||
local eee="$6"
|
|
||||||
local pause="$7"
|
|
||||||
local port=255
|
|
||||||
local speedmode=1
|
|
||||||
local last_speed=0
|
|
||||||
|
|
||||||
[[ -d "/sys/class/net/${ifname}" ]] || {
|
|
||||||
logger -t "port-management" "interface ${ifname} is not found"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let "enabled=$(get_bool "${enabled}" "-1")"
|
|
||||||
[[ ${enabled} -eq -1 ]] && return
|
|
||||||
|
|
||||||
let "autoneg=$(get_bool "${autoneg}" "-1")"
|
|
||||||
[[ ${autoneg} -eq -1 ]] && return
|
|
||||||
|
|
||||||
let "eee=$(get_bool "${eee}" "-1")"
|
|
||||||
[[ ${eee} -eq -1 ]] && return
|
|
||||||
|
|
||||||
let "pause=$(get_bool "${pause}" "-1")"
|
|
||||||
[[ ${pause} -eq -1 ]] && return
|
|
||||||
|
|
||||||
duplex="$(echo "${duplex}" | awk '{print tolower($0)}')"
|
|
||||||
[[ "${duplex}" != "half" && "${duplex}" != "full" ]] && return
|
|
||||||
|
|
||||||
tc3162_get_lan_port "${ifname}"
|
|
||||||
let "port=$?"
|
|
||||||
[[ -z "${port}" || ${port} -eq 255 ]] && return
|
|
||||||
|
|
||||||
last_speed="$(switchmgr phy maxspeed "${port}" | cut -f2 -d':')"
|
|
||||||
[[ -z "${last_speed}" || "${last_speed}" == "*Down*" ]] \
|
|
||||||
&& last_speed=${speed}
|
|
||||||
|
|
||||||
switchmgr phy pause "${port}" "${pause}"
|
|
||||||
|
|
||||||
# set speedmode: speed+duplex+autoneg
|
|
||||||
# FIXME: switchmgr has no separate setting for 1Gbps speed - use autoneg instead
|
|
||||||
if [[ ${autoneg} -eq 1 || ${speed} -gt 100 ]]; then
|
|
||||||
switchmgr phy speedmode ${port} "1"
|
|
||||||
else
|
|
||||||
[[ ${speed} -gt 10 ]] && let "speedmode=2" || let "speedmode=4"
|
|
||||||
[[ "${duplex}" == "half" ]] && let "speedmode=${speedmode}+1"
|
|
||||||
switchmgr phy speedmode "${port}" "${speedmode}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# TODO: implement MAC control register manipulations (mapped ports used) for
|
|
||||||
# eee settings change
|
|
||||||
# separate (tx/rx) pause (flow control) settings change
|
|
||||||
# set speed to 1Gbps separately from autoneg mode
|
|
||||||
|
|
||||||
# FIXME: workaround for duplex/pause settings being not applied if speed is unchanged
|
|
||||||
[[ ${last_speed} -eq ${speed} ]] && power_updown "${ifname}" 0
|
|
||||||
|
|
||||||
power_updown "${ifname}" ${enabled}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
# arg1: port ifname, ex: eth0
|
|
||||||
get_max_port_speed() {
|
|
||||||
if [ -z "$1" ]; then
|
|
||||||
echo 0
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
local ifname="$1"
|
|
||||||
local phycap="$(ethctl $ifname media-type 2>/dev/null | grep 'PHY Capabilities' | awk '{print$NF}' | cut -d'|' -f1)"
|
|
||||||
local speed=1000
|
|
||||||
|
|
||||||
case "$phycap" in
|
|
||||||
10GFD) speed=10000 ;;
|
|
||||||
5GFD) speed=5000 ;;
|
|
||||||
2.5GFD) speed=2500 ;;
|
|
||||||
1GFD|1GHD) speed=1000 ;;
|
|
||||||
100MFD|100MHD) speed=100 ;;
|
|
||||||
10MFD|10MHD) speed=10 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo $speed
|
|
||||||
}
|
|
||||||
|
|
||||||
# arg1: port name, ex: eth0
|
|
||||||
get_port_number() {
|
|
||||||
[ -z "$1" ] && return
|
|
||||||
local ports="0 1 2 3 4 5 6 7 8"
|
|
||||||
local units="0 1"
|
|
||||||
local port="$1"
|
|
||||||
local ifname
|
|
||||||
|
|
||||||
for unit in $units; do
|
|
||||||
for prt in $ports; do
|
|
||||||
ifname="$(ethswctl getifname $unit $prt 2>/dev/null | awk '{print$NF}')"
|
|
||||||
if [ "$ifname" == "$port" ]; then
|
|
||||||
echo "$unit $prt"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# arg1: port ifname, ex: eth0
|
|
||||||
# arg2: port enabled, ex: 1
|
|
||||||
power_updown() {
|
|
||||||
local ifname="$1"
|
|
||||||
local enabled=$2
|
|
||||||
|
|
||||||
local updown="up"
|
|
||||||
[ $enabled -eq 0 ] && updown="down"
|
|
||||||
ethctl $ifname phy-power $updown >/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
# arg1: port ifname, ex: eth0
|
|
||||||
# arg2: port enabled, ex: 1
|
|
||||||
# arg3: port speed, ex: 1000
|
|
||||||
# arg4: port duplex, ex: full
|
|
||||||
# arg5: port autoneg, ex: on
|
|
||||||
# arg6: port eee, ex: 0
|
|
||||||
# arg7: port pause, ex: 0
|
|
||||||
set_port_settings() {
|
|
||||||
local ifname="$1"
|
|
||||||
local enabled=$2
|
|
||||||
local speed="$3"
|
|
||||||
local duplex=$4
|
|
||||||
local autoneg=$5
|
|
||||||
local eee=$6
|
|
||||||
local pause=$7
|
|
||||||
|
|
||||||
[ -d /sys/class/net/$ifname ] || return
|
|
||||||
|
|
||||||
local unitport="$(get_port_number $ifname)"
|
|
||||||
local unit=$(echo $unitport | cut -d ' ' -f 1)
|
|
||||||
local port=$(echo $unitport | cut -d ' ' -f 2)
|
|
||||||
|
|
||||||
[ $autoneg -eq 1 ] && autoneg="on" || autoneg="off"
|
|
||||||
[ "$duplex" == "half" ] && duplex=0 || duplex=1
|
|
||||||
[ "$duplex" == 0 ] && dplx="HD" || dplx="FD"
|
|
||||||
[ "$autoneg" == "on" ] && media_type="auto" || media_type="$speed$dplx"
|
|
||||||
|
|
||||||
phycrossbar="$(ethctl $ifname phy-crossbar | head -1)"
|
|
||||||
crossbartype="$(echo $phycrossbar | awk '{print$2$3}')"
|
|
||||||
# Take only the last PHY Endpoint (non-Serdes) into account as Serdes port number precedes
|
|
||||||
[ "$crossbartype" == "oncrossbar" ] && pyhendpoint="$(echo $phycrossbar | awk '{print$NF}')"
|
|
||||||
|
|
||||||
phycaps="$(ethctl $ifname media-type ${pyhendpoint:+ port $pyhendpoint} | awk -F'PHY Capabilities: ' '{print$2}')"
|
|
||||||
numofcaps="$(echo $phycaps | tr '|' ' ' | wc -w)"
|
|
||||||
|
|
||||||
if [ "$numofcaps" == "1" ]; then
|
|
||||||
logger -t "port-management" "$ifname is capable of $phycaps only; not setting speed/duplex"
|
|
||||||
else
|
|
||||||
logger -t "port-management" "$ifname is capable of $phycaps; setting speed/duplex to $media_type"
|
|
||||||
ethctl $ifname media-type $media_type ${pyhendpoint:+ port $pyhendpoint} &>/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
[ $eee -eq 1 ] && eee="on" || eee="off"
|
|
||||||
ethtool --set-eee $ifname eee $eee 2>/dev/null
|
|
||||||
|
|
||||||
case $pause in
|
|
||||||
off|0)
|
|
||||||
pause=0x0
|
|
||||||
auto=off
|
|
||||||
rx=off
|
|
||||||
tx=off
|
|
||||||
;;
|
|
||||||
on|1)
|
|
||||||
pause=0x2
|
|
||||||
auto=off
|
|
||||||
rx=on
|
|
||||||
tx=on
|
|
||||||
;;
|
|
||||||
auto)
|
|
||||||
pause=0x1
|
|
||||||
auto=on
|
|
||||||
rx=on
|
|
||||||
tx=on
|
|
||||||
;;
|
|
||||||
tx)
|
|
||||||
pause=0x3
|
|
||||||
auto=off
|
|
||||||
rx=off
|
|
||||||
tx=on
|
|
||||||
;;
|
|
||||||
rx)
|
|
||||||
pause=0x4
|
|
||||||
auto=off
|
|
||||||
rx=on
|
|
||||||
tx=off
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
if [ "$auto" == "on" ]; then
|
|
||||||
# Use ethswctl utility to set pause autoneg
|
|
||||||
# as ethtool is not setting it properly
|
|
||||||
ethswctl -c pause -n $unit -p $port -v $pause 2>&1 >/dev/null
|
|
||||||
else
|
|
||||||
ethtool --pause $ifname autoneg $auto rx $rx tx $tx 2>/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
power_updown $ifname $enabled
|
|
||||||
}
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
populate_config_from_db() {
|
|
||||||
. /lib/functions.sh
|
|
||||||
. /lib/network/utils.sh
|
|
||||||
include /lib/ethernet
|
|
||||||
|
|
||||||
portorder="$(db -q get hw.board.ethernetPortOrder)"
|
|
||||||
for port in $portorder; do
|
|
||||||
speed="$(get_max_port_speed $port 2>/dev/null)"
|
|
||||||
speed="${speed:-1000}"
|
|
||||||
|
|
||||||
uci add ports ethport
|
|
||||||
uci rename ports.@ethport[-1]="$(get_port_name $port)"
|
|
||||||
uci set ports.@ethport[-1].enabled=1
|
|
||||||
uci set ports.@ethport[-1].name="$(get_port_name $port)"
|
|
||||||
uci set ports.@ethport[-1].ifname="$port"
|
|
||||||
uci set ports.@ethport[-1].speed="$speed"
|
|
||||||
uci set ports.@ethport[-1].duplex="full"
|
|
||||||
uci set ports.@ethport[-1].autoneg=1
|
|
||||||
uci set ports.@ethport[-1].eee=0
|
|
||||||
if [ "$(db -q get hw.board.ethernetWanPort)" = "$port" ]; then
|
|
||||||
uci set ports.@ethport[-1].pause=1
|
|
||||||
uci set ports.@ethport[-1].uplink=1
|
|
||||||
else
|
|
||||||
uci set ports.@ethport[-1].pause=0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
uci commit ports
|
|
||||||
}
|
|
||||||
|
|
||||||
populate_config_from_device_tree() {
|
|
||||||
for path in $(find /proc/device-tree/ -name "port@*"); do
|
|
||||||
port="$(cat $path/label)"
|
|
||||||
[ -n "$port" ] || continue
|
|
||||||
[ "$port" = "cpu" ] && continue
|
|
||||||
speed=1000
|
|
||||||
if [ -e "$path/phy-mode" ]; then
|
|
||||||
phymode="$(cat $path/phy-mode)"
|
|
||||||
case "$phymode" in
|
|
||||||
10000*) speed=10000 ;;
|
|
||||||
2500*) speed=2500 ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
PORT="$(echo $port | tr '[a-z]' '[A-Z]')"
|
|
||||||
uci add ports ethport
|
|
||||||
uci rename ports.@ethport[-1]="$PORT"
|
|
||||||
uci set ports.@ethport[-1].enabled=1
|
|
||||||
uci set ports.@ethport[-1].name="$PORT"
|
|
||||||
uci set ports.@ethport[-1].ifname="$port"
|
|
||||||
uci set ports.@ethport[-1].speed="$speed"
|
|
||||||
uci set ports.@ethport[-1].duplex="full"
|
|
||||||
uci set ports.@ethport[-1].autoneg=1
|
|
||||||
uci set ports.@ethport[-1].eee=0
|
|
||||||
if [ "$port" = "wan" ]; then
|
|
||||||
uci set ports.@ethport[-1].pause=1
|
|
||||||
uci set ports.@ethport[-1].uplink=1
|
|
||||||
else
|
|
||||||
uci set ports.@ethport[-1].pause=0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
uci commit ports
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ -s "/etc/config/ports" ]; then
|
|
||||||
if uci -q get ports.@ethport[0] >/dev/null; then
|
|
||||||
# exit if there is any valid content
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
rm -f /etc/config/ports
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
touch /etc/config/ports
|
|
||||||
|
|
||||||
if [ -f /sbin/db -a -n "$(db get hw.board.ethernetPortOrder 2>/dev/null)" ]; then
|
|
||||||
populate_config_from_db
|
|
||||||
elif [ -d /proc/device-tree/ ]; then
|
|
||||||
populate_config_from_device_tree
|
|
||||||
fi
|
|
||||||
19
ethmngr/files/ethmngr.init
Normal file
19
ethmngr/files/ethmngr.init
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/sh /etc/rc.common
|
||||||
|
|
||||||
|
START=95
|
||||||
|
STOP=10
|
||||||
|
|
||||||
|
USE_PROCD=1
|
||||||
|
PROG=/usr/sbin/ethmngr
|
||||||
|
|
||||||
|
start_service() {
|
||||||
|
procd_open_instance
|
||||||
|
procd_set_param command ${PROG}
|
||||||
|
procd_set_param respawn
|
||||||
|
procd_close_instance
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_service() {
|
||||||
|
stop
|
||||||
|
start
|
||||||
|
}
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
# arg1: port ifname, ex: eth0
|
|
||||||
get_max_port_speed() {
|
|
||||||
if [ -z "$1" ]; then
|
|
||||||
echo 0
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
local ifname="$1"
|
|
||||||
local phycap="$(ethtool $ifname | grep -A 10 "Supported link modes" | grep 000 | tail -n 1 | awk '{print$NF}')"
|
|
||||||
local speed=1000
|
|
||||||
|
|
||||||
case "$phycap" in
|
|
||||||
10000*) speed=10000 ;;
|
|
||||||
5000*) speed=5000 ;;
|
|
||||||
2500*) speed=2500 ;;
|
|
||||||
1000*) speed=1000 ;;
|
|
||||||
100*) speed=100 ;;
|
|
||||||
10*) speed=10 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo $speed
|
|
||||||
}
|
|
||||||
|
|
||||||
# arg1: port ifname, ex: eth0
|
|
||||||
# arg2: port enabled, ex: 1
|
|
||||||
power_updown() {
|
|
||||||
local ifname="$1"
|
|
||||||
local enabled=$2
|
|
||||||
|
|
||||||
local updown="up"
|
|
||||||
[ $enabled -eq 0 ] && updown="down"
|
|
||||||
ip link set dev $ifname $updown
|
|
||||||
}
|
|
||||||
|
|
||||||
# arg1: port ifname, ex: eth0
|
|
||||||
# arg2: port enabled, ex: 1
|
|
||||||
# arg3: port speed, ex: 1000
|
|
||||||
# arg4: port duplex, ex: full
|
|
||||||
# arg5: port autoneg, ex: on
|
|
||||||
# arg6: port eee, ex: 0
|
|
||||||
# arg7: port pause, ex: 0
|
|
||||||
set_port_settings() {
|
|
||||||
local ifname="$1"
|
|
||||||
local enabled=$2
|
|
||||||
local speed="$3"
|
|
||||||
local duplex=$4
|
|
||||||
local autoneg=$5
|
|
||||||
local eee=$6
|
|
||||||
local pause=$7
|
|
||||||
|
|
||||||
[ -d /sys/class/net/$ifname ] || return
|
|
||||||
|
|
||||||
[ $autoneg -eq 1 ] && autoneg="on" || autoneg="off"
|
|
||||||
ethtool --change $ifname speed $speed duplex $duplex autoneg $autoneg
|
|
||||||
|
|
||||||
[ $eee -eq 1 ] && eee="on" || eee="off"
|
|
||||||
ethtool --set-eee $ifname eee $eee 2>/dev/null
|
|
||||||
|
|
||||||
case $pause in
|
|
||||||
off|0)
|
|
||||||
pause=0x0
|
|
||||||
auto=off
|
|
||||||
rx=off
|
|
||||||
tx=off
|
|
||||||
;;
|
|
||||||
on|1)
|
|
||||||
pause=0x2
|
|
||||||
auto=off
|
|
||||||
rx=on
|
|
||||||
tx=on
|
|
||||||
;;
|
|
||||||
auto)
|
|
||||||
pause=0x1
|
|
||||||
auto=on
|
|
||||||
rx=on
|
|
||||||
tx=on
|
|
||||||
;;
|
|
||||||
tx)
|
|
||||||
pause=0x3
|
|
||||||
auto=off
|
|
||||||
rx=off
|
|
||||||
tx=on
|
|
||||||
;;
|
|
||||||
rx)
|
|
||||||
pause=0x4
|
|
||||||
auto=off
|
|
||||||
rx=on
|
|
||||||
tx=off
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ethtool --pause $ifname autoneg $auto rx $rx tx $tx 2>/dev/null
|
|
||||||
|
|
||||||
power_updown $ifname $enabled
|
|
||||||
}
|
|
||||||
106
evoice/Makefile
106
evoice/Makefile
@@ -1,106 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (C) 2022 IOPSYS Software Solutions AB
|
|
||||||
#
|
|
||||||
|
|
||||||
include $(TOPDIR)/rules.mk
|
|
||||||
|
|
||||||
PKG_NAME:=evoice
|
|
||||||
PKG_VERSION:=0.2.39
|
|
||||||
|
|
||||||
LOCAL_DEV=0
|
|
||||||
LOCAL_DEV_EVOICE_DIR=~/voip/evoice
|
|
||||||
|
|
||||||
ifneq ($(LOCAL_DEV),1)
|
|
||||||
PKG_SOURCE_PROTO:=git
|
|
||||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/evoice.git
|
|
||||||
PKG_SOURCE_VERSION:=30d65330de0368f73ecf4a2e804c39a2ee280454
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
|
||||||
PKG_MIRROR_HASH:=skip
|
|
||||||
endif
|
|
||||||
|
|
||||||
PKG_LICENSE:=PROPRIETARY IOPSYS
|
|
||||||
PKG_LICENSE_FILES:=LICENSE
|
|
||||||
|
|
||||||
# All config variable that are passed to the make invocation, directly or
|
|
||||||
# indirectly. This ensures that the package is rebuilt on config-changes.
|
|
||||||
#PKG_CONFIG_DEPENDS:=CONFIG_TARGET_BOARD
|
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
|
||||||
|
|
||||||
define Package/$(PKG_NAME)
|
|
||||||
CATEGORY:=Network
|
|
||||||
SUBMENU:=Telephony
|
|
||||||
TITLE:=Ensemble Voice
|
|
||||||
URL:=
|
|
||||||
DEPENDS:= +libubox +libubus +libpicoevent +libuci +libstdcpp +libopenssl +libjson-c +libblobmsg-json\
|
|
||||||
+TARGET_brcmbca:bcmkernel\
|
|
||||||
+TARGET_airoha:kmod-voip_driver\
|
|
||||||
+TARGET_airoha:voip_app +libbbf_api
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/$(PKG_NAME)/description
|
|
||||||
Ensemble Voice. A stand alone SIP VoIP application.
|
|
||||||
endef
|
|
||||||
|
|
||||||
ifeq ($(LOCAL_DEV),1)
|
|
||||||
# If you want to build the code from your own local repositiory enable
|
|
||||||
# LOCAL_DEV and set LOCAL_DEV_EVOICE_DIR to your own git repository.
|
|
||||||
define Build/Prepare
|
|
||||||
@echo "======================================================="
|
|
||||||
@echo "DEVELOPMENT BUILD! rsync $(LOCAL_DEV_EVOICE_DIR) to $(PKG_BUILD_DIR)"
|
|
||||||
@echo "======================================================="
|
|
||||||
rsync -a $(LOCAL_DEV_EVOICE_DIR)/* $(PKG_BUILD_DIR)/
|
|
||||||
endef
|
|
||||||
endif
|
|
||||||
|
|
||||||
IDIR = $(STAGING_DIR)/usr/include
|
|
||||||
TONES_INI_REQUIRED=
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_TARGET_brcmbca),y)
|
|
||||||
TARGET_PLATFORM=BROADCOM
|
|
||||||
BDIR = bcm963xx/userspace/private/apps/voice
|
|
||||||
CC_FLAGS = -I$(IDIR) -I$(IDIR)/$(BDIR)/inc\
|
|
||||||
-I$(IDIR)/bcm963xx/xchg/bos/publicInc\
|
|
||||||
-I$(IDIR)/bcm963xx/bcmdrivers/broadcom/include/bcm963xx
|
|
||||||
TRG=SVrgBcmFxs
|
|
||||||
JSONFILE=codecs_brcm.json
|
|
||||||
else ifeq ($(CONFIG_TARGET_airoha),y)
|
|
||||||
TARGET_PLATFORM=ECONET
|
|
||||||
TONES_INI_REQUIRED=y
|
|
||||||
TRG=SVrgMtekOwrt
|
|
||||||
JSONFILE=codecs_airoha.json
|
|
||||||
endif
|
|
||||||
|
|
||||||
# disable temporarily some not important warnings, force PIC
|
|
||||||
CC_FLAGS_VS=$(CC_FLAGS) -Wno-unused-parameter -Wno-unused-function -fPIC
|
|
||||||
|
|
||||||
export TARGET_PLATFORM
|
|
||||||
|
|
||||||
#used and altered by BIDE makefiles
|
|
||||||
export _XFLAGS
|
|
||||||
|
|
||||||
BIDE_MAKE_OPTS = -r -R -C $(PKG_BUILD_DIR) -f _bld/src/cdabs.mk\
|
|
||||||
SWB=b_gxxqca6 HWA=a_openwrt HWC=c_hosted OSP=p_posix LIF=cerder DBG=dbg
|
|
||||||
|
|
||||||
define Build/Compile
|
|
||||||
@echo "TARGET_PLATFORM=${TARGET_PLATFORM}"
|
|
||||||
+$(MAKE) $(BIDE_MAKE_OPTS) CC_FLAGS="$(CC_FLAGS)" TRG=$(TRG)
|
|
||||||
|
|
||||||
@echo "clean libvoiceservice before building shared lib!"
|
|
||||||
+$(MAKE) $(BIDE_MAKE_OPTS) CC_FLAGS="$(CC_FLAGS_VS)" TRG=libvoiceservice cleanall
|
|
||||||
+$(MAKE) $(BIDE_MAKE_OPTS) CC_FLAGS="$(CC_FLAGS_VS)" TRG=libvoiceservice
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/evoice/install
|
|
||||||
$(CP) ./files/* $(1)/
|
|
||||||
$(if $(TONES_INI_REQUIRED),,$(RM) $(1)/etc/evoice/tones.ini)
|
|
||||||
$(INSTALL_DIR) $(1)/usr/sbin
|
|
||||||
$(CP) $(1)/lib/voice/$(JSONFILE) $(1)/lib/voice/codecs_evoice.json
|
|
||||||
$(RM) $(1)/lib/voice/codecs_brcm.json
|
|
||||||
$(RM) $(1)/lib/voice/codecs_airoha.json
|
|
||||||
$(INSTALL_DIR) $(1)/usr/lib/bbfdm
|
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/_bin/a_openwrt/evoice $(1)/usr/sbin/
|
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/_bin/a_openwrt/libvoiceservice.so $(1)/usr/lib/bbfdm/
|
|
||||||
endef
|
|
||||||
|
|
||||||
$(eval $(call BuildPackage,evoice))
|
|
||||||
@@ -1,334 +0,0 @@
|
|||||||
|
|
||||||
config SIPClient 'Client1'
|
|
||||||
option Enable '1'
|
|
||||||
option RegisterMode 'RFC3261'
|
|
||||||
option AuthUserName '51234'
|
|
||||||
option AuthPassword '51234'
|
|
||||||
option Network 'Network1'
|
|
||||||
option MaxSessions '5'
|
|
||||||
option RegisiterURI '51234@sip-proxy.iopsys.eu'
|
|
||||||
option E164Format '1'
|
|
||||||
|
|
||||||
config SIPClient 'Client2'
|
|
||||||
option Enable '1'
|
|
||||||
option RegisterMode 'RFC3261'
|
|
||||||
option AuthUserName '51235'
|
|
||||||
option AuthPassword '51235'
|
|
||||||
option Network 'Network1'
|
|
||||||
option MaxSessions '5'
|
|
||||||
option RegisiterURI '51235@sip-proxy.iopsys.eu'
|
|
||||||
option E164Format '1'
|
|
||||||
|
|
||||||
config SIPNetwork 'Network1'
|
|
||||||
option Enable '1'
|
|
||||||
option ProxyServer 'sip-proxy.iopsys.eu'
|
|
||||||
option AcceptFromProxyOnly '0'
|
|
||||||
option ProxyServerPort '5060'
|
|
||||||
option ProxyServerTransport 'UDP'
|
|
||||||
option RegistrarServer 'sip-proxy.iopsys.eu'
|
|
||||||
option RegistrarServerPort '5060'
|
|
||||||
option RegistrarServerTransport 'UDP'
|
|
||||||
option RegistrationPeriod '3240'
|
|
||||||
option RegisterExpires '3600'
|
|
||||||
option UserAgentDomain ' '
|
|
||||||
option TimerRegistrationFailed '120'
|
|
||||||
option TimerT1 '500'
|
|
||||||
option VoIPProfile 'VoIPProfile1'
|
|
||||||
option SIPSessionTimerEnable '0'
|
|
||||||
option SIPSessionExpireInterval '1800'
|
|
||||||
option SIPSessionMinimumTimer '90'
|
|
||||||
option SIPSessionRefresher 'NONE'
|
|
||||||
option SIPSessionTimerMode 'REQUEST'
|
|
||||||
option SIPSessionRefreshRequest 'UPDATE'
|
|
||||||
list CodecList '1CodecProfile1'
|
|
||||||
list CodecList '1CodecProfile2'
|
|
||||||
list CodecList '1CodecProfile3'
|
|
||||||
list CodecList '1CodecProfile5'
|
|
||||||
list CodecList '1CodecProfile4'
|
|
||||||
|
|
||||||
config CodecProfile '1CodecProfile1'
|
|
||||||
option Enable '1'
|
|
||||||
option Codec 'G.711ALaw'
|
|
||||||
option PacketizationPeriod '20'
|
|
||||||
option SilenceSupression '1'
|
|
||||||
|
|
||||||
config CodecProfile '1CodecProfile2'
|
|
||||||
option Enable '1'
|
|
||||||
option Codec 'G.711MuLaw'
|
|
||||||
option PacketizationPeriod '20'
|
|
||||||
option SilenceSupression '1'
|
|
||||||
|
|
||||||
config CodecProfile '1CodecProfile3'
|
|
||||||
option Enable '1'
|
|
||||||
option Codec 'G.726'
|
|
||||||
option PacketizationPeriod '20'
|
|
||||||
option SilenceSupression '0'
|
|
||||||
|
|
||||||
config CodecProfile '1CodecProfile4'
|
|
||||||
option Enable '1'
|
|
||||||
option Codec 'G.722'
|
|
||||||
option PacketizationPeriod '20'
|
|
||||||
option SilenceSupression '0'
|
|
||||||
|
|
||||||
config CodecProfile '1CodecProfile5'
|
|
||||||
option Enable '1'
|
|
||||||
option Codec 'G.729'
|
|
||||||
option PacketizationPeriod '20'
|
|
||||||
option SilenceSupression '0'
|
|
||||||
|
|
||||||
config VoIPProfile 'VoIPProfile1'
|
|
||||||
option Enable '1'
|
|
||||||
option DTMFMethod 'RFC4733'
|
|
||||||
option RTP '1RTP'
|
|
||||||
|
|
||||||
config RTP '1RTP'
|
|
||||||
option LocalPortMin '10020'
|
|
||||||
option LocalPortMax '10039'
|
|
||||||
option JitterBufferType 'Static'
|
|
||||||
|
|
||||||
config FXXPorts 'POTS'
|
|
||||||
option Region 'US'
|
|
||||||
|
|
||||||
config FXSPorts 'FXS1'
|
|
||||||
option Enable '1'
|
|
||||||
option DialType 'Tone'
|
|
||||||
option TransmitGain '0'
|
|
||||||
option ReceiveGain '0'
|
|
||||||
option EchoCancellationEnable '1'
|
|
||||||
|
|
||||||
config FXSPorts 'FXS2'
|
|
||||||
option Enable '1'
|
|
||||||
option DialType 'Tone'
|
|
||||||
option TransmitGain '0'
|
|
||||||
option ReceiveGain '0'
|
|
||||||
option EchoCancellationEnable '1'
|
|
||||||
|
|
||||||
config Extension 'Extension1'
|
|
||||||
option Enable '1'
|
|
||||||
option ExtensionNumber '10#'
|
|
||||||
option Provider 'FXS1'
|
|
||||||
option CallingFeatures 'Set1'
|
|
||||||
option Name 'Phone 1'
|
|
||||||
|
|
||||||
config Extension 'Extension2'
|
|
||||||
option Enable '1'
|
|
||||||
option ExtensionNumber '11#'
|
|
||||||
option Provider 'FXS2'
|
|
||||||
option CallingFeatures 'Set1'
|
|
||||||
option Name 'Phone 2'
|
|
||||||
|
|
||||||
config Line 'Line1'
|
|
||||||
option Enable '1'
|
|
||||||
option Provider 'Client1'
|
|
||||||
option CallingFeatures 'Set1'
|
|
||||||
|
|
||||||
config Line 'Line2'
|
|
||||||
option Enable '1'
|
|
||||||
option Provider 'Client2'
|
|
||||||
option CallingFeatures 'Set2'
|
|
||||||
|
|
||||||
config IncomingMap 'IncomingMap1'
|
|
||||||
option Enable '1'
|
|
||||||
option Extension 'Extension1'
|
|
||||||
option Line 'Line1'
|
|
||||||
|
|
||||||
config IncomingMap 'IncomingMap2'
|
|
||||||
option Enable '1'
|
|
||||||
option Extension 'Extension2'
|
|
||||||
option Line 'Line2'
|
|
||||||
|
|
||||||
config IncomingMap 'IncomingMap3'
|
|
||||||
option Enable '0'
|
|
||||||
option Extension 'Extension2'
|
|
||||||
option Line 'Line1'
|
|
||||||
|
|
||||||
config OutgoingMap 'OutgoingMap1'
|
|
||||||
option Enable '1'
|
|
||||||
option Extension 'Extension1'
|
|
||||||
option Line 'Line1'
|
|
||||||
|
|
||||||
config OutgoingMap 'OutgoingMap2'
|
|
||||||
option Enable '1'
|
|
||||||
option Extension 'Extension2'
|
|
||||||
option Line 'Line2'
|
|
||||||
|
|
||||||
config CallingFeatures 'Set1'
|
|
||||||
option CallerIDEnable '1'
|
|
||||||
option CallerIDNameEnable '1'
|
|
||||||
option CallForwardUnconditionalEnable '0'
|
|
||||||
option CallForwardUnconditionalNumber ' '
|
|
||||||
option CallForwardOnBusyEnable '0'
|
|
||||||
option CallForwardOnBusyNumber ' '
|
|
||||||
option CallForwardOnNoAnswerEnable '0'
|
|
||||||
option CallForwardOnNoAnswerRingTimeout '24'
|
|
||||||
option CallForwardOnNoAnswerNumber ' '
|
|
||||||
option CallTransferEnable '1'
|
|
||||||
option MWIEnable '1'
|
|
||||||
option VMWIEnable '1'
|
|
||||||
option LineMessagesWaiting '0'
|
|
||||||
option AnonymousCallRejectionEnable '0'
|
|
||||||
option AnonymousCallEnable '1'
|
|
||||||
option DoNotDisturbEnable '1'
|
|
||||||
option RepeatDialEnable '1'
|
|
||||||
option VoiceMailEnable '1'
|
|
||||||
option CallPickUpEnable '1'
|
|
||||||
option CCBSEnable '1'
|
|
||||||
option CallWaitingEnable '0'
|
|
||||||
|
|
||||||
config CallingFeatures 'Set2'
|
|
||||||
option CallerIDEnable '1'
|
|
||||||
option CallerIDNameEnable '1'
|
|
||||||
option CallForwardUnconditionalEnable '0'
|
|
||||||
option CallForwardUnconditionalNumber ' '
|
|
||||||
option CallForwardOnBusyEnable '0'
|
|
||||||
option CallForwardOnBusyNumber ' '
|
|
||||||
option CallForwardOnNoAnswerEnable '0'
|
|
||||||
option CallForwardOnNoAnswerRingTimeout '24'
|
|
||||||
option CallForwardOnNoAnswerNumber ' '
|
|
||||||
option CallTransferEnable '1'
|
|
||||||
option MWIEnable '1'
|
|
||||||
option VMWIEnable '1'
|
|
||||||
option LineMessagesWaiting '0'
|
|
||||||
option AnonymousCallRejectionEnable '0'
|
|
||||||
option AnonymousCallEnable '1'
|
|
||||||
option DoNotDisturbEnable '1'
|
|
||||||
option RepeatDialEnable '1'
|
|
||||||
option VoiceMailEnable '1'
|
|
||||||
option CallPickUpEnable '1'
|
|
||||||
option CCBSEnable '1'
|
|
||||||
option CallWaitingEnable '1'
|
|
||||||
|
|
||||||
config NumberingPlan 'NumberingPlan1'
|
|
||||||
option MinimumNumberOfDigits '1'
|
|
||||||
option MaximumNumberOfDigits '15'
|
|
||||||
option InterDigitTimerStd '2000'
|
|
||||||
option InterDigitTimerOpen '2000'
|
|
||||||
option TerminationDigit '#'
|
|
||||||
|
|
||||||
config NumberingPlan 'NumberingPlan2'
|
|
||||||
option MinimumNumberOfDigits '5'
|
|
||||||
option MaximumNumberOfDigits '15'
|
|
||||||
option InterDigitTimerStd '2000'
|
|
||||||
option InterDigitTimerOpen '2000'
|
|
||||||
option TerminationDigit ' '
|
|
||||||
list PrefixList '2PrefixInfo1'
|
|
||||||
list PrefixList '2PrefixInfo2'
|
|
||||||
list PrefixList '2PrefixInfo3'
|
|
||||||
list PrefixList '2PrefixInfo4'
|
|
||||||
list PrefixList '2PrefixInfo5'
|
|
||||||
list PrefixList '2PrefixInfo6'
|
|
||||||
list PrefixList '2PrefixInfo7'
|
|
||||||
list PrefixList '2PrefixInfo8'
|
|
||||||
list PrefixList '2PrefixInfo9'
|
|
||||||
|
|
||||||
config NumberingPlan 'NumberingPlan3'
|
|
||||||
option MinimumNumberOfDigits '5'
|
|
||||||
option MaximumNumberOfDigits '15'
|
|
||||||
option InterDigitTimerStd '2000'
|
|
||||||
option InterDigitTimerOpen '2000'
|
|
||||||
option TerminationDigit '#'
|
|
||||||
list PrefixList '3PrefixInfo1'
|
|
||||||
|
|
||||||
config PrefixInfo '2PrefixInfo1'
|
|
||||||
option Enable '1'
|
|
||||||
option PrefixRange '*43#'
|
|
||||||
option PrefixMinNumberOfDigits '4'
|
|
||||||
option PrefixMaxNumberOfDigits '4'
|
|
||||||
option NumberOfDigitsToRemove '0'
|
|
||||||
option PosOfDigitsToRemove '0'
|
|
||||||
option FacilityAction 'CW_ACTIVATE'
|
|
||||||
option FacilityActionArgument ' '
|
|
||||||
|
|
||||||
config PrefixInfo '2PrefixInfo2'
|
|
||||||
option Enable '1'
|
|
||||||
option PrefixRange '#43#'
|
|
||||||
option PrefixMinNumberOfDigits '4'
|
|
||||||
option PrefixMaxNumberOfDigits '4'
|
|
||||||
option NumberOfDigitsToRemove '0'
|
|
||||||
option PosOfDigitsToRemove '0'
|
|
||||||
option FacilityAction 'CW_DEACTIVATE'
|
|
||||||
option FacilityActionArgument ' '
|
|
||||||
|
|
||||||
config PrefixInfo '2PrefixInfo3'
|
|
||||||
option Enable '1'
|
|
||||||
option PrefixRange '*21*(X+)#'
|
|
||||||
option PrefixMinNumberOfDigits '9'
|
|
||||||
option PrefixMaxNumberOfDigits '9'
|
|
||||||
option NumberOfDigitsToRemove '0'
|
|
||||||
option PosOfDigitsToRemove '0'
|
|
||||||
option FacilityAction 'CFU_ACTIVATE'
|
|
||||||
option FacilityActionArgument ' '
|
|
||||||
|
|
||||||
config PrefixInfo '2PrefixInfo4'
|
|
||||||
option Enable '1'
|
|
||||||
option PrefixRange '#21#'
|
|
||||||
option PrefixMinNumberOfDigits '4'
|
|
||||||
option PrefixMaxNumberOfDigits '4'
|
|
||||||
option NumberOfDigitsToRemove '0'
|
|
||||||
option PosOfDigitsToRemove '0'
|
|
||||||
option FacilityAction 'CFU_DEACTIVATE'
|
|
||||||
option FacilityActionArgument ' '
|
|
||||||
|
|
||||||
config PrefixInfo '2PrefixInfo5'
|
|
||||||
option Enable '1'
|
|
||||||
option PrefixRange '*67*(X+)#'
|
|
||||||
option PrefixMinNumberOfDigits '9'
|
|
||||||
option PrefixMaxNumberOfDigits '9'
|
|
||||||
option NumberOfDigitsToRemove '0'
|
|
||||||
option PosOfDigitsToRemove '0'
|
|
||||||
option FacilityAction 'CFB_ACTIVATE'
|
|
||||||
option FacilityActionArgument ' '
|
|
||||||
|
|
||||||
config PrefixInfo '2PrefixInfo6'
|
|
||||||
option Enable '1'
|
|
||||||
option PrefixRange '#67#'
|
|
||||||
option PrefixMinNumberOfDigits '4'
|
|
||||||
option PrefixMaxNumberOfDigits '4'
|
|
||||||
option NumberOfDigitsToRemove '0'
|
|
||||||
option PosOfDigitsToRemove '0'
|
|
||||||
option FacilityAction 'CFB_DEACTIVATE'
|
|
||||||
option FacilityActionArgument ' '
|
|
||||||
|
|
||||||
config PrefixInfo '2PrefixInfo7'
|
|
||||||
option Enable '1'
|
|
||||||
option PrefixRange '*61*(X+(*X+)?)#'
|
|
||||||
option PrefixMinNumberOfDigits '15'
|
|
||||||
option PrefixMaxNumberOfDigits '15'
|
|
||||||
option NumberOfDigitsToRemove '0'
|
|
||||||
option PosOfDigitsToRemove '0'
|
|
||||||
option FacilityAction 'CFNR_ACTIVATE'
|
|
||||||
option FacilityActionArgument ' '
|
|
||||||
|
|
||||||
config PrefixInfo '2PrefixInfo8'
|
|
||||||
option Enable '1'
|
|
||||||
option PrefixRange '#61#'
|
|
||||||
option PrefixMinNumberOfDigits '4'
|
|
||||||
option PrefixMaxNumberOfDigits '4'
|
|
||||||
option NumberOfDigitsToRemove '0'
|
|
||||||
option PosOfDigitsToRemove '0'
|
|
||||||
option FacilityAction 'CFNR_DEACTIVATE'
|
|
||||||
option FacilityActionArgument ' '
|
|
||||||
|
|
||||||
config PrefixInfo '2PrefixInfo9'
|
|
||||||
option Enable '1'
|
|
||||||
option PrefixRange '*31*'
|
|
||||||
option PrefixMinNumberOfDigits '4'
|
|
||||||
option PrefixMaxNumberOfDigits '4'
|
|
||||||
option NumberOfDigitsToRemove '0'
|
|
||||||
option PosOfDigitsToRemove '0'
|
|
||||||
option FacilityAction 'CA_ACTIVATE'
|
|
||||||
option FacilityActionArgument ' '
|
|
||||||
|
|
||||||
config PrefixInfo '3PrefixInfo1'
|
|
||||||
option Enable '1'
|
|
||||||
option PrefixRange '110|112'
|
|
||||||
option PrefixMinNumberOfDigits '7'
|
|
||||||
option PrefixMaxNumberOfDigits '7'
|
|
||||||
option NumberOfDigitsToRemove '0'
|
|
||||||
option PosOfDigitsToRemove '0'
|
|
||||||
option FacilityAction 'X_IOPSYS_EU_EMERGENCY'
|
|
||||||
option FacilityActionArgument ' '
|
|
||||||
|
|
||||||
config DialPlan 'X_IOPSYS_EU_InternalNumber1'
|
|
||||||
option RegExp '1X#'
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,181 +0,0 @@
|
|||||||
# RO (Main)
|
|
||||||
config account 'map_board'
|
|
||||||
option HW_Has_Voice 'hw.board.hasVoice'
|
|
||||||
option HW_Has_DECT 'hw.board.hasDect'
|
|
||||||
option HW_Nr_Of_POTS_Ports 'hw.board.VoicePorts'
|
|
||||||
option HW_VoiceDSP 'hw.board.VoiceDSP'
|
|
||||||
option ProductID 'device.deviceinfo.ModelName'
|
|
||||||
option I3_VERSION 'device.deviceinfo.SoftwareVersion'
|
|
||||||
option SerialNumber 'device.deviceinfo.SerialNumber'
|
|
||||||
|
|
||||||
config account 'map_pots'
|
|
||||||
option Country 'voice.POTS.Region'
|
|
||||||
|
|
||||||
# Voice Service navigation paths
|
|
||||||
# Not used to initialize internal configuration
|
|
||||||
config navigation 'map_vs'
|
|
||||||
option Account 'voice.Client@.'
|
|
||||||
option Network 'voice.Client@.Network'
|
|
||||||
option VoIPProfile 'voice.Network@.VoIPProfile'
|
|
||||||
option CfAccount 'voice.Line@.CallingFeatures'
|
|
||||||
option CfPhone 'voice.Extension@.CallingFeatures'
|
|
||||||
option CodecList 'voice.Network@.CodecList'
|
|
||||||
option Codec 'voice.Codec@.Codec'
|
|
||||||
option OutgoingMapEnabled 'voice.OutgoingMap@.Enable'
|
|
||||||
option From_Phone 'voice.OutgoingMap@.Extension'
|
|
||||||
option Extension 'voice.Extension@.Provider'
|
|
||||||
option To_Account 'voice.OutgoingMap@.Line'
|
|
||||||
option Line 'voice.Line@.Provider'
|
|
||||||
option LineEnable 'voice.Line@.Enable'
|
|
||||||
option LineProvider 'voice.Line@.Provider'
|
|
||||||
option IncomingMapEnabled 'voice.IncomingMap@.Enable'
|
|
||||||
option From_Account 'voice.IncomingMap@.Line'
|
|
||||||
option To_Phone 'voice.IncomingMap@.Extension'
|
|
||||||
option ExtensionEnable 'voice.Extension@.Enable'
|
|
||||||
option ExtensionProvider 'voice.Extension@.Provider'
|
|
||||||
|
|
||||||
# Registration for account A-Z is associate with SIP.Clienti.Enable
|
|
||||||
# All parameters in this table are written to internal configuration
|
|
||||||
config account 'map_account'
|
|
||||||
option Registration 'voice.Client@.Enable'
|
|
||||||
option Display_Name ''
|
|
||||||
option PhoneNumber 'voice.Client@.RegisiterURI'
|
|
||||||
option Username 'voice.Client@.AuthUserName'
|
|
||||||
option Password 'voice.Client@.AuthPassword'
|
|
||||||
option SIP_Telephone_Syntax 'voice.Client@.E164Format'
|
|
||||||
option Device_Description 'voice.Client@.UserAgent'
|
|
||||||
|
|
||||||
# Network stuff associated with an account.
|
|
||||||
# All parameters in this table are written to internal configuration
|
|
||||||
config network 'map_net'
|
|
||||||
option Enable 'voice.Network@.Enable'
|
|
||||||
option Registration_Server 'voice.Network@.RegistrarServer'
|
|
||||||
option Outbound_Proxy 'voice.Network@.ProxyServer'
|
|
||||||
option Accept_From_Registered 'voice.Network@.AcceptFromProxyOnly'
|
|
||||||
option SIP_Port 'voice.Network@.RegistrarServerPort'
|
|
||||||
option SIP_Transport 'voice.Network@.RegistrarServerTransport'
|
|
||||||
option RegistrationPeriod 'voice.Network@.RegistrationPeriod'
|
|
||||||
option Registration_Interval 'voice.Network@.RegisterExpires'
|
|
||||||
option Reg_Failure_Interval 'voice.Network@.TimerRegistrationFailed'
|
|
||||||
option T1 'voice.Network@.TimerT1'
|
|
||||||
option UserAgentDomain 'voice.Network@.UserAgentDomain'
|
|
||||||
option SIP_SessTmrEnable 'voice.Network@.SIPSessionTimerEnable'
|
|
||||||
option SIP_SessTmrMode 'voice.Network@.SIPSessionTimerMode'
|
|
||||||
option SIP_SessTmrMsg 'voice.Network@.SIPSessionRefreshRequest'
|
|
||||||
option SIP_SessTmrRefresher 'voice.Network@.SIPSessionRefresher'
|
|
||||||
option SIP_MinSE 'voice.Network@.SIPSessionMinimumTimer'
|
|
||||||
option SIP_SessInterval 'voice.Network@.SIPSessionExpireInterval'
|
|
||||||
|
|
||||||
config VoIPProfile 'map_voip'
|
|
||||||
option Enable 'voice.VoIPProfile@.Enable'
|
|
||||||
option DTMF_Method 'voice.VoIPProfile@.DTMFMethod'
|
|
||||||
option RTP 'voice.VoIPProfile@.RTP'
|
|
||||||
|
|
||||||
config RTP 'map_rtp'
|
|
||||||
option RTP_Port_Base 'voice.@RTP@.LocalPortMin'
|
|
||||||
option RTP_Port_End 'voice.@RTP@.LocalPortMax'
|
|
||||||
|
|
||||||
config codecs 'map_codec'
|
|
||||||
option Codec 'voice.CodecProfile@.Codec'
|
|
||||||
option enable 'voice.CodecProfile@.Enable'
|
|
||||||
option ptime 'voice.CodecProfile@.PacketizationPeriod'
|
|
||||||
option dtx 'voice.CodecProfile@.SilenceSupression'
|
|
||||||
|
|
||||||
config fxsinfo 'map_fxs'
|
|
||||||
option Enable 'voice.FXS@.Enable'
|
|
||||||
option DialType 'voice.FXS@.DialType'
|
|
||||||
option TransmitGain 'voice.FXS@.TransmitGain'
|
|
||||||
option ReceiveGain 'voice.FXS@.ReceiveGain'
|
|
||||||
option EchoCancellationEnable 'voice.FXS@.EchoCancellationEnable'
|
|
||||||
|
|
||||||
config extensioninfo 'map_ext'
|
|
||||||
option Enable 'voice.Extension@.Enable'
|
|
||||||
option Internal_Number_Phone 'voice.Extension@.ExtensionNumber'
|
|
||||||
option Display_Name_Phone 'voice.Extension@.Name'
|
|
||||||
|
|
||||||
config capabilities 'map_capa'
|
|
||||||
option Call_Waiting_Enable 'voice.Capabilities@FacilityActions'
|
|
||||||
option Enable_Call_Diversion 'voice.Capabilities@FacilityActions'
|
|
||||||
|
|
||||||
config cs_account 'map_set'
|
|
||||||
option BusyCallWait 'voice.Set@.CallWaitingEnable'
|
|
||||||
option AlwaysDivert 'voice.Set@.CallForwardUnconditionalEnable'
|
|
||||||
option CFU_Number 'voice.Set@.CallForwardUnconditionalNumber'
|
|
||||||
option BusyDivert 'voice.Set@.CallForwardOnBusyEnable'
|
|
||||||
option CFB_Number 'voice.Set@.CallForwardOnBusyNumber'
|
|
||||||
option NoAnswDivert 'voice.Set@.CallForwardOnNoAnswerEnable'
|
|
||||||
option CFNR_Number 'voice.Set@.CallForwardOnNoAnswerNumber'
|
|
||||||
option CFNR_Timeout 'voice.Set@.CallForwardOnNoAnswerRingTimeout'
|
|
||||||
option Enable_Call_Transfer 'voice.Set@.CallTransferEnable'
|
|
||||||
option AnonymousReject 'voice.Set@.AnonymousCallRejectionEnable'
|
|
||||||
option AllowAnonymousConf 'voice.Set@.AnonymousCallEnable'
|
|
||||||
option CallerIDEnable 'voice.Set@.CallerIDEnable'
|
|
||||||
|
|
||||||
config cs_xvendor 'map_np_cs'
|
|
||||||
option np_sc_actCW 'voice.X_IOPSYS_EU_NpSc@.CW_ACT'
|
|
||||||
option np_sc_actCW_output 'voice.X_IOPSYS_EU_NpSc@.CW_OUT'
|
|
||||||
option np_sc_deactCW 'voice.X_IOPSYS_EU_NpSc@.CW_DEACT'
|
|
||||||
option np_sc_isactCW 'voice.X_IOPSYS_EU_NpSc@.CW_ISACT'
|
|
||||||
option np_sc_actCFU 'voice.X_IOPSYS_EU_NpSc@.CFU_ACT'
|
|
||||||
option np_sc_actCFU_output 'voice.X_IOPSYS_EU_NpSc@.CFU_OUT'
|
|
||||||
option np_sc_deactCFU 'voice.X_IOPSYS_EU_NpSc@.CFU_DEACT'
|
|
||||||
option np_sc_actCFB 'voice.X_IOPSYS_EU_NpSc@.CFB_ACT'
|
|
||||||
option np_sc_actCFB_output 'voice.X_IOPSYS_EU_NpSc@.CFB_OUT'
|
|
||||||
option np_sc_deactCFB 'voice.X_IOPSYS_EU_NpSc@.CFB_DEACT'
|
|
||||||
option np_sc_actCFNR 'voice.X_IOPSYS_EU_NpSc@.CFNR_ACT'
|
|
||||||
option np_sc_actCFNR_output 'voice.X_IOPSYS_EU_NpSc@.CFNR_OUT'
|
|
||||||
option np_sc_deactCFNR 'voice.X_IOPSYS_EU_NpSc@.CFNR_DEACT'
|
|
||||||
option np_sc_actRA 'voice.X_IOPSYS_EU_NpSc@.RA_ACT'
|
|
||||||
option np_sc_deactRA 'voice.X_IOPSYS_EU_NpSc@.RA_DEACT'
|
|
||||||
option np_sc_actAC 'voice.X_IOPSYS_EU_NpSc@.AC_ACT'
|
|
||||||
option np_sc_deactAC 'voice.X_IOPSYS_EU_NpSc@.AC_DEACT'
|
|
||||||
option np_sc_actAA 'voice.X_IOPSYS_EU_NpSc@.AA_ACT'
|
|
||||||
option np_sc_deactAA 'voice.X_IOPSYS_EU_NpSc@.AA_DEACT'
|
|
||||||
option np_sc_actAD 'voice.X_IOPSYS_EU_NpSc@.AD_ACT'
|
|
||||||
option np_sc_actAD_output 'voice.X_IOPSYS_EU_NpSc@.AD_OUT'
|
|
||||||
option np_sc_deactAD 'voice.X_IOPSYS_EU_NpSc@.AD_DEACT'
|
|
||||||
option np_sc_actMWSplash 'voice.X_IOPSYS_EU_NpSc@.MWI_SPLASH_ACT'
|
|
||||||
option np_sc_deactMWSplash 'voice.X_IOPSYS_EU_NpSc@.MWI_SPLASH_DEACT'
|
|
||||||
option np_sc_actMWTone 'voice.X_IOPSYS_EU_NpSc@.MWI_TONE_ACT'
|
|
||||||
option np_sc_deactMWTone 'voice.X_IOPSYS_EU_NpSc@.MWI_TONE_DEACT'
|
|
||||||
option np_sc_redial 'voice.X_IOPSYS_EU_NpSc@.REDIAL'
|
|
||||||
option np_sc_setMiscConf 'voice.X_IOPSYS_EU_NpSc@.SET_MISC'
|
|
||||||
|
|
||||||
config cc_xvendor 'map_np_in'
|
|
||||||
option np_in_limitExp 'voice.X_IOPSYS_EU_InternalNumber@.RegExp'
|
|
||||||
|
|
||||||
config cc_xvendor 'map_np_sh'
|
|
||||||
option sh_no_str 'voice.X_IOPSYS_EU_ShortNumber@.RegExp'
|
|
||||||
|
|
||||||
config cc_xvendor 'map_np_eme'
|
|
||||||
option np_eme 'voice.X_IOPSYS_EU_EmergencyNumber@.RegExp'
|
|
||||||
option np_eme_out 'voice.X_IOPSYS_EU_EmergencyNumber@.OutStr'
|
|
||||||
|
|
||||||
config cc_xvendor 'map_np_rn'
|
|
||||||
option np_rn 'voice.X_IOPSYS_EU_RegularNumber@.RegExp'
|
|
||||||
option np_rn_out 'voice.X_IOPSYS_EU_RegularNumber@.OutStr'
|
|
||||||
option np_rn_account 'voice.X_IOPSYS_EU_RegularNumber@.AccStr'
|
|
||||||
|
|
||||||
config cc_xvendor 'map_np_bn'
|
|
||||||
option np_bn 'voice.X_IOPSYS_EU_BarredNumber@.RegExp'
|
|
||||||
option np_bn_out 'voice.X_IOPSYS_EU_BarredNumber@.OutStr'
|
|
||||||
|
|
||||||
config TR104NumberingPlan 'map_np_tr'
|
|
||||||
option min_digits 'voice.NumberingPlan@.MinimumNumberOfDigits'
|
|
||||||
option max_digits 'voice.NumberingPlan@.MaximumNumberOfDigits'
|
|
||||||
option tmo_std 'voice.NumberingPlan@.InterDigitTimerStd'
|
|
||||||
option tmo_open 'voice.NumberingPlan@.InterDigitTimerOpen'
|
|
||||||
option term_digit 'voice.NumberingPlan@.TerminationDigit'
|
|
||||||
option prefix_list 'voice.NumberingPlan@.PrefixList'
|
|
||||||
|
|
||||||
config TR104NumberingPlanPrefix 'map_np_pf'
|
|
||||||
option enable 'voice.@PrefixInfo@.Enable'
|
|
||||||
option range 'voice.@PrefixInfo@.PrefixRange'
|
|
||||||
option prefix_min_digits 'voice.@PrefixInfo@.PrefixMinNumberOfDigits'
|
|
||||||
option prefix_max_digits 'voice.@PrefixInfo@.PrefixMaxNumberOfDigits'
|
|
||||||
option remove_digits 'voice.@PrefixInfo@.NumberOfDigitsToRemove'
|
|
||||||
option remove_pos 'voice.@PrefixInfo@.NumberOfDigitsToRemove'
|
|
||||||
option facility_act 'voice.@PrefixInfo@.FacilityAction'
|
|
||||||
option facility_arg 'voice.@PrefixInfo@.FacilityActionArgument'
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
config static_prm 'defaults'
|
|
||||||
option Print_Control '4'
|
|
||||||
option Print_UDP_Addr '192.168.1.3'
|
|
||||||
option Print_UDP_Port '60000'
|
|
||||||
option Verbosity 'On'
|
|
||||||
option Failure_Log 'On'
|
|
||||||
option Message_Log 'On'
|
|
||||||
option Method_Trace 'Off'
|
|
||||||
option Dial_Cache_Size '0'
|
|
||||||
option Reverse_Fax_Detection '0'
|
|
||||||
option DSP_24 '0'
|
|
||||||
option DSP_36 '0'
|
|
||||||
option DSP_43 '0'
|
|
||||||
option Swap_Name_Nr_CID '0'
|
|
||||||
option R_Button_Lower_Lim '100'
|
|
||||||
option R_Button_Upper_Lim '800'
|
|
||||||
option HookOn_Delay '0'
|
|
||||||
option SupportLDD '0'
|
|
||||||
option LDD_Min_Break_Time '41'
|
|
||||||
option LDD_Max_Break_Time '94'
|
|
||||||
option LDD_Percent_Break '55'
|
|
||||||
option Tone_On_Hangup '1'
|
|
||||||
option BusyTone_On_Hangup '1'
|
|
||||||
option Enable_Analouge_Conf '0'
|
|
||||||
option PrackUsage '1'
|
|
||||||
option SIP_SupportedPath '0'
|
|
||||||
option IMS_Access_Network_Info ' '
|
|
||||||
option SIP_Reason_Protocol '0'
|
|
||||||
option SIP_Body_QOST '0'
|
|
||||||
option SIP_HistoryInfo '0'
|
|
||||||
option Customer_Spec2 '1'
|
|
||||||
option UTF8_Enable '0'
|
|
||||||
option RFC3325 '0'
|
|
||||||
option Accept_From_Registered '0'
|
|
||||||
option Polarity_Reversal '0'
|
|
||||||
option Closed_Dial_Plan '0'
|
|
||||||
option Netw_Dial '0'
|
|
||||||
option No_Answer_Tmo '180'
|
|
||||||
option UPnP_Enabled '0'
|
|
||||||
option NAT_Address ' '
|
|
||||||
option NAT_Address_From_SIP '0'
|
|
||||||
option HookOn_Transfer '0'
|
|
||||||
option Enable_Call_Transfer '1'
|
|
||||||
option CallerIDEnable '1'
|
|
||||||
option Multiparty_Transp '0'
|
|
||||||
option Presence_Indication '0'
|
|
||||||
option Login_Note ' '
|
|
||||||
option Login_Description ' '
|
|
||||||
option Logout_Note ' '
|
|
||||||
option Logout_Description ' '
|
|
||||||
option Resolve_Every_Transaction '2'
|
|
||||||
option Translate_Plus '1'
|
|
||||||
option Mid_Call_Services '0'
|
|
||||||
option Account_Restriction '0'
|
|
||||||
option Answering_Machine_Enable '0'
|
|
||||||
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#!/bin/sh /etc/rc.common
|
|
||||||
|
|
||||||
START=68
|
|
||||||
STOP=12
|
|
||||||
|
|
||||||
USE_PROCD=1
|
|
||||||
NAME=evoice
|
|
||||||
VOICE_UCI_CONFIG=voice
|
|
||||||
|
|
||||||
start_service() {
|
|
||||||
[ "$(db -q get hw.board.hasVoice)" = "1" ] || return
|
|
||||||
|
|
||||||
|
|
||||||
which endptmngr >/dev/null 2>&1 && {
|
|
||||||
echo "evoice can't be started since endptmngr is installed. Please remove endptmngr and retry"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
procd_open_instance
|
|
||||||
procd_set_param command $NAME
|
|
||||||
procd_set_param respawn "5" "0" "3"
|
|
||||||
procd_close_instance
|
|
||||||
}
|
|
||||||
|
|
||||||
reload_service() {
|
|
||||||
stop
|
|
||||||
start
|
|
||||||
}
|
|
||||||
|
|
||||||
service_triggers() {
|
|
||||||
procd_add_reload_trigger $VOICE_UCI_CONFIG
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
{
|
|
||||||
"G.711ALaw": [
|
|
||||||
{
|
|
||||||
"BitRate": 64000,
|
|
||||||
"PacketizationPeriod": "20",
|
|
||||||
"SilenceSuppression": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"G.711MuLaw": [
|
|
||||||
{
|
|
||||||
"BitRate": 64000,
|
|
||||||
"PacketizationPeriod": "20",
|
|
||||||
"SilenceSuppression": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"G.722": [
|
|
||||||
{
|
|
||||||
"BitRate": 64000,
|
|
||||||
"PacketizationPeriod": "20",
|
|
||||||
"SilenceSuppression": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"G.726": [
|
|
||||||
{
|
|
||||||
"BitRate": 32000,
|
|
||||||
"PacketizationPeriod": "20",
|
|
||||||
"SilenceSuppression": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 24000,
|
|
||||||
"PacketizationPeriod": "20",
|
|
||||||
"SilenceSuppression": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"G.729": [
|
|
||||||
{
|
|
||||||
"BitRate": 8000,
|
|
||||||
"PacketizationPeriod": "20",
|
|
||||||
"SilenceSuppression": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"AMR": [
|
|
||||||
{
|
|
||||||
"BitRate": 7400,
|
|
||||||
"PacketizationPeriod": "20",
|
|
||||||
"SilenceSuppression": false
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
{
|
|
||||||
"G.711MuLaw": [
|
|
||||||
{
|
|
||||||
"BitRate": 64000,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"G.711ALaw": [
|
|
||||||
{
|
|
||||||
"BitRate": 64000,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"G.726": [
|
|
||||||
{
|
|
||||||
"BitRate": 16000,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 24000,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 32000,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 40000,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"G.723.1": [
|
|
||||||
{
|
|
||||||
"BitRate": 5300,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 6300,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"G.729": [
|
|
||||||
{
|
|
||||||
"BitRate": 8000,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"iLBC": [
|
|
||||||
{
|
|
||||||
"BitRate": 15200,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 13300,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"G.722": [
|
|
||||||
{
|
|
||||||
"BitRate": 64000,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"AMR": [
|
|
||||||
{
|
|
||||||
"BitRate": 12200,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 10200,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 7950,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 7400,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 6700,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 5900,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 5150,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"BitRate": 4750,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"GSM-EFR": [
|
|
||||||
{
|
|
||||||
"BitRate": 12200,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"GSM-FR": [
|
|
||||||
{
|
|
||||||
"BitRate": 13200,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"GSM-HR": [
|
|
||||||
{
|
|
||||||
"BitRate": 5600,
|
|
||||||
"PacketizationPeriod": "10-30",
|
|
||||||
"SilenceSuppression": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -1,48 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (C) 2021 IOPSYS Software Solutions AB
|
|
||||||
#
|
|
||||||
# This is free software, licensed under the GNU General Public License v2.
|
|
||||||
# See /LICENSE for more information.
|
|
||||||
#
|
|
||||||
include $(TOPDIR)/rules.mk
|
|
||||||
|
|
||||||
PKG_NAME:=fdtextract
|
|
||||||
PKG_RELEASE:=1
|
|
||||||
PKG_VERSION:=1.0
|
|
||||||
|
|
||||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/fdtextract.git
|
|
||||||
PKG_SOURCE_PROTO:=git
|
|
||||||
PKG_SOURCE_VERSION:=e3cefda3b26c9aea3021b20725ce7b31b33eebc4
|
|
||||||
PKG_MIRROR_HASH:=skip
|
|
||||||
|
|
||||||
PKG_LICENSE:=GPLv2
|
|
||||||
PKG_LICENSE_FILES:=LICENSE
|
|
||||||
|
|
||||||
RSTRIP:=true
|
|
||||||
export BUILD_DIR
|
|
||||||
|
|
||||||
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
|
||||||
PKG_BUILD_PARALLEL:=1
|
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
|
||||||
|
|
||||||
define Package/$(PKG_NAME)
|
|
||||||
CATEGORY:=Utilities
|
|
||||||
TITLE:=fdtextract
|
|
||||||
DEPENDS:= +libfdt
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/$(PKG_NAME)/description
|
|
||||||
Command to extract sub images from FIT images.
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/$(PKG_NAME)/install
|
|
||||||
$(INSTALL_DIR) $(1)/usr/sbin
|
|
||||||
|
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/fdtextract $(1)/usr/sbin/
|
|
||||||
$(STRIP) $(1)/usr/sbin/fdtextract
|
|
||||||
endef
|
|
||||||
|
|
||||||
$(eval $(call BuildPackage,$(PKG_NAME)))
|
|
||||||
@@ -28,7 +28,6 @@ define KernelPackage/$(PKG_NAME)
|
|||||||
FILES:=$(PKG_BUILD_DIR)/$(PKG_NAME).$(LINUX_KMOD_SUFFIX)
|
FILES:=$(PKG_BUILD_DIR)/$(PKG_NAME).$(LINUX_KMOD_SUFFIX)
|
||||||
KCONFIG:=CONFIG_PACKAGE_kmod-gryphon-led-kernel-module=y
|
KCONFIG:=CONFIG_PACKAGE_kmod-gryphon-led-kernel-module=y
|
||||||
AUTOLOAD:=$(call AutoLoad,60,$(PKG_NAME))
|
AUTOLOAD:=$(call AutoLoad,60,$(PKG_NAME))
|
||||||
DEPENDS:= +(TARGET_brcmbca):bcmkernel
|
|
||||||
PKG_LICENSE:=GPLv2
|
PKG_LICENSE:=GPLv2
|
||||||
PKG_LICENSE_URL:=
|
PKG_LICENSE_URL:=
|
||||||
endef
|
endef
|
||||||
@@ -41,33 +40,6 @@ EXTRA_KCONFIG:= CONFIG_RGB_LED=m
|
|||||||
|
|
||||||
MODULE_INCLUDE=-I$(PKG_BUILD_DIR)
|
MODULE_INCLUDE=-I$(PKG_BUILD_DIR)
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_TARGET_brcmbca),y)
|
|
||||||
LINUX_DIR:=$(BUILD_DIR)/bcmkernel/bcm963xx/kernel/linux-4.19
|
|
||||||
# This assumes that the MODULES_SUBDIR set by OpenWrt is of the form
|
|
||||||
# lib/modules/4.19.235-abcdef where 4.19.235 is the version of our fake bcmlinux kernel
|
|
||||||
# and abcdef the git-commit.
|
|
||||||
# The kernel compiled by the Broadcom SDK has a uname -r of 4.19.235, i.e. without the git-commit.
|
|
||||||
# The assignment below removes the part after the - which puts modules in the right directory as
|
|
||||||
# long as the bcmlinux version matches the kernel version in the BCM SDK.
|
|
||||||
# So, this will only stop working in the time window where the BCM SDK has been updated
|
|
||||||
# but bcmlinux has not yet been updated.
|
|
||||||
MODULES_SUBDIR:=$(firstword $(subst -, ,$(MODULES_SUBDIR)))
|
|
||||||
TARGET_CROSS:=$(CONFIG_BRCM_ALT_TOOLCHAIN_BASE)/$(CONFIG_BRCM_ALT_ARM_TOOLCHAIN_TOPDIR)/bin/$(CONFIG_BRCM_ALT_ARM_TOOLCHAIN_PREFIX)-
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_BCM_CHIP_ID),$(filter $(CONFIG_BCM_CHIP_ID),"63158" "6856" "6858"))
|
|
||||||
# These targets use a 64-bit kernel
|
|
||||||
LINUX_KARCH:=arm64
|
|
||||||
TARGET_CROSS:=$(CONFIG_BRCM_ALT_TOOLCHAIN_BASE)/$(CONFIG_BRCM_ALT_AARCH64_TOOLCHAIN_TOPDIR)/bin/$(CONFIG_BRCM_ALT_AARCH64_TOOLCHAIN_PREFIX)-
|
|
||||||
else ifeq ($(CONFIG_BCM_CHIP_ID),$(filter $(CONFIG_BCM_CHIP_ID),"6855" "6756" "47622" "63148" "63178"))
|
|
||||||
# These targets use a 32-bit arm-sfp kernel
|
|
||||||
LINUX_KARCH:=arm
|
|
||||||
TARGET_CROSS:=$(CONFIG_BRCM_ALT_TOOLCHAIN_BASE)/$(CONFIG_BRCM_ALT_ARMSFP_TOOLCHAIN_TOPDIR)/bin/$(CONFIG_BRCM_ALT_ARMSFP_TOOLCHAIN_PREFIX)-
|
|
||||||
endif
|
|
||||||
# For some reason, Broadcom's kernel does not set the include paths correctly when compiling out-of-tree modules
|
|
||||||
EXTRA_KCPPFLAGS:="-I $(LINUX_DIR)/../bcmkernel/include -I $(LINUX_DIR)/arch/arm/mach-bcm963xx/include"
|
|
||||||
endif
|
|
||||||
|
|
||||||
define Build/Prepare
|
define Build/Prepare
|
||||||
mkdir -p $(PKG_BUILD_DIR)/kdevlinks/
|
mkdir -p $(PKG_BUILD_DIR)/kdevlinks/
|
||||||
$(CP) -s `pwd`/src/* $(PKG_BUILD_DIR)/kdevlinks/
|
$(CP) -s `pwd`/src/* $(PKG_BUILD_DIR)/kdevlinks/
|
||||||
|
|||||||
@@ -43,15 +43,10 @@
|
|||||||
static ssize_t get_led_color(struct device *dev,
|
static ssize_t get_led_color(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
|
/* [ln] todo: dummy implementation */
|
||||||
int len;
|
int len;
|
||||||
struct sk9822_leds *sk9822 = dev_get_drvdata(dev);
|
|
||||||
|
|
||||||
if (IS_ERR(sk9822)) {
|
len = scnprintf(buf, PAGE_SIZE, "%d\n", 123);
|
||||||
printk(KERN_ERR "Platform get drvdata returned NULL\n");
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = scnprintf(buf, PAGE_SIZE, "%02x%02x%02x\n", sk9822->led_colors[0].r, sk9822->led_colors[0].g, sk9822->led_colors[0].b);
|
|
||||||
if (len <= 0) {
|
if (len <= 0) {
|
||||||
dev_err(dev, "sk9822: Invalid sprintf len: %d\n", len);
|
dev_err(dev, "sk9822: Invalid sprintf len: %d\n", len);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
@@ -220,6 +215,7 @@ static int canyon_led_probe(struct platform_device *pdev)
|
|||||||
if (IS_ERR(leds->clock_gpio)) {
|
if (IS_ERR(leds->clock_gpio)) {
|
||||||
dev_err(&pdev->dev, "Failed to acquire clock GPIO %ld\n",
|
dev_err(&pdev->dev, "Failed to acquire clock GPIO %ld\n",
|
||||||
PTR_ERR(leds->clock_gpio));
|
PTR_ERR(leds->clock_gpio));
|
||||||
|
leds->clock_gpio = NULL;
|
||||||
return PTR_ERR(leds->clock_gpio);
|
return PTR_ERR(leds->clock_gpio);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,6 +223,7 @@ static int canyon_led_probe(struct platform_device *pdev)
|
|||||||
if (IS_ERR(leds->clock_gpio)) {
|
if (IS_ERR(leds->clock_gpio)) {
|
||||||
dev_err(&pdev->dev, "Failed to acquire clock GPIO %ld\n",
|
dev_err(&pdev->dev, "Failed to acquire clock GPIO %ld\n",
|
||||||
PTR_ERR(leds->clock_gpio));
|
PTR_ERR(leds->clock_gpio));
|
||||||
|
leds->clock_gpio = NULL;
|
||||||
return PTR_ERR(leds->clock_gpio);
|
return PTR_ERR(leds->clock_gpio);
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_INFO "Got clock gpio\n");
|
printk(KERN_INFO "Got clock gpio\n");
|
||||||
@@ -244,6 +241,7 @@ static int canyon_led_probe(struct platform_device *pdev)
|
|||||||
if (IS_ERR(leds->data_gpio)) {
|
if (IS_ERR(leds->data_gpio)) {
|
||||||
dev_err(&pdev->dev, "Failed to acquire data GPIO %ld\n",
|
dev_err(&pdev->dev, "Failed to acquire data GPIO %ld\n",
|
||||||
PTR_ERR(leds->data_gpio));
|
PTR_ERR(leds->data_gpio));
|
||||||
|
leds->data_gpio = NULL;
|
||||||
return PTR_ERR(leds->data_gpio);
|
return PTR_ERR(leds->data_gpio);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,6 +249,7 @@ static int canyon_led_probe(struct platform_device *pdev)
|
|||||||
if (IS_ERR(leds->data_gpio)) {
|
if (IS_ERR(leds->data_gpio)) {
|
||||||
dev_err(&pdev->dev, "Failed to acquire data GPIO %ld\n",
|
dev_err(&pdev->dev, "Failed to acquire data GPIO %ld\n",
|
||||||
PTR_ERR(leds->data_gpio));
|
PTR_ERR(leds->data_gpio));
|
||||||
|
leds->data_gpio = NULL;
|
||||||
return PTR_ERR(leds->data_gpio);
|
return PTR_ERR(leds->data_gpio);
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_INFO "Got data gpio\n");
|
printk(KERN_INFO "Got data gpio\n");
|
||||||
|
|||||||
27
icwmp/Config_cwmp.in
Normal file
27
icwmp/Config_cwmp.in
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
if PACKAGE_icwmp
|
||||||
|
|
||||||
|
config CWMP_SCRIPTS_FULL
|
||||||
|
bool "Install all icwmp scripts"
|
||||||
|
default y
|
||||||
|
|
||||||
|
choice
|
||||||
|
prompt "Select ACS sever"
|
||||||
|
default CWMP_ACS_MULTI
|
||||||
|
|
||||||
|
config CWMP_ACS_MULTI
|
||||||
|
bool "No specific ACS, follow standard"
|
||||||
|
|
||||||
|
config CWMP_ACS_HDM
|
||||||
|
bool "HDM"
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
config CWMP_DEBUG
|
||||||
|
bool "Compile with debug options"
|
||||||
|
default y
|
||||||
|
|
||||||
|
config CWMP_DEVEL_DEBUG
|
||||||
|
bool "Compile with development debug options"
|
||||||
|
default n
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
165
icwmp/Makefile
165
icwmp/Makefile
@@ -1,73 +1,54 @@
|
|||||||
#
|
#
|
||||||
# Copyright (C) 2020-2022 IOPSYS Software Solutions AB
|
# Copyright (C) 2020 iopsys Software Solutions AB
|
||||||
#
|
#
|
||||||
# This is free software, licensed under the BSD-3-Clause
|
# This is free software, licensed under the GNU General Public License v2.
|
||||||
# See /LICENSE for more information.
|
# See /LICENSE for more information.
|
||||||
#
|
#
|
||||||
|
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=icwmp
|
PKG_NAME:=icwmp
|
||||||
PKG_VERSION:=9.1.19
|
PKG_VERSION:=6.5.4-2021-03-23
|
||||||
|
PKG_FIXUP:=autoreconf
|
||||||
PKG_SOURCE_PROTO:=git
|
|
||||||
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/icwmp.git
|
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/icwmp.git
|
||||||
PKG_SOURCE_VERSION:=9d8389cda16f410826920bb27fd8af4d28c79de9
|
PKG_SOURCE_PROTO:=git
|
||||||
|
PKG_SOURCE_VERSION:=5a4e7a0cfb2cdc2576f1c93388760691cec8ee85
|
||||||
|
PKG_RELEASE=$(PKG_SOURCE_VERSION)
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
|
||||||
PKG_MIRROR_HASH:=skip
|
PKG_MIRROR_HASH:=skip
|
||||||
|
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
|
||||||
|
|
||||||
PKG_RELEASE=$(PKG_SOURCE_VERSION)
|
PKG_LICENSE:=GPLv2
|
||||||
|
PKG_LICENSE_FILES:=COPYING
|
||||||
|
|
||||||
PKG_LICENSE:=BSD-3-Clause
|
PKG_CONFIG_DEPENDS:= \
|
||||||
PKG_LICENSE_FILES:=LICENSE
|
CONFIG_CWMP_ACS_MULTI \
|
||||||
|
CONFIG_CWMP_ACS_HDM \
|
||||||
|
CONFIG_CWMP_DEBUG \
|
||||||
|
CONFIG_CWMP_DEVEL_DEBUG
|
||||||
|
|
||||||
|
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
|
||||||
|
|
||||||
|
CWMP_REVISION=$(shell svnversion ./src/ -n|cut -f2 -d:)
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
include $(INCLUDE_DIR)/cmake.mk
|
|
||||||
|
|
||||||
define Package/icwmp/default
|
define Package/$(PKG_NAME)
|
||||||
SECTION:=utils
|
SECTION:=utils
|
||||||
CATEGORY:=Utilities
|
CATEGORY:=Utilities
|
||||||
SUBMENU:=TRx69
|
SUBMENU:=TRx69
|
||||||
TITLE:=TR069 CWMP client
|
TITLE:=CWMP client
|
||||||
DEPENDS:=+libuci +libubox +libblobmsg-json +libubus +libjson-c +libcurl +mxml +libuuid +libbbf_api
|
DEPENDS:=+libuci +libmicroxml +libubox +jshn +libubus +libblobmsg-json +libpthread +ubusd +shflags +getopt +zlib +libjson-c +libopenssl +curl +libcurl
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/icwmp-openssl
|
define Package/$(PKG_NAME)/description
|
||||||
$(Package/icwmp/default)
|
A free client implementation of CWMP (TR-069) protocol
|
||||||
TITLE += (openssl)
|
|
||||||
DEPENDS += +PACKAGE_icwmp-openssl:libopenssl
|
|
||||||
VARIANT:=openssl
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/icwmp-wolfssl
|
define Package/$(PKG_NAME)/config
|
||||||
$(Package/icwmp/default)
|
source "$(SOURCE)/Config_cwmp.in"
|
||||||
TITLE += (wolfssl)
|
|
||||||
DEPENDS += +PACKAGE_icwmp-wolfssl:libwolfssl
|
|
||||||
CONFLICTS := icwmp-openssl
|
|
||||||
VARIANT:=wolfssl
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Package/icwmp-mbedtls
|
|
||||||
$(Package/icwmp/default)
|
|
||||||
TITLE += (mbedtls)
|
|
||||||
DEPENDS += +PACKAGE_icwmp-mbedtls:libmbedtls
|
|
||||||
CONFLICTS := icwmp-openssl icwmp-wolfssl
|
|
||||||
VARIANT:=mbedtls
|
|
||||||
DEFAULT_VARIANT:=1
|
|
||||||
endef
|
|
||||||
|
|
||||||
ifeq ($(BUILD_VARIANT),openssl)
|
|
||||||
CMAKE_OPTIONS += -DWITH_OPENSSL=ON
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(BUILD_VARIANT),wolfssl)
|
|
||||||
CMAKE_OPTIONS += -DWITH_WOLFSSL=ON
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(BUILD_VARIANT),mbedtls)
|
|
||||||
CMAKE_OPTIONS += -DWITH_MBEDTLS=ON
|
|
||||||
endif
|
|
||||||
|
|
||||||
USE_LOCAL=$(shell ls ./src/ 2>/dev/null >/dev/null && echo 1)
|
USE_LOCAL=$(shell ls ./src/ 2>/dev/null >/dev/null && echo 1)
|
||||||
ifneq ($(USE_LOCAL),)
|
ifneq ($(USE_LOCAL),)
|
||||||
define Build/Prepare
|
define Build/Prepare
|
||||||
@@ -75,34 +56,76 @@ define Build/Prepare
|
|||||||
endef
|
endef
|
||||||
endif
|
endif
|
||||||
|
|
||||||
define Package/icwmp/default/install
|
TARGET_CFLAGS += \
|
||||||
|
-D_GNU_SOURCE -D_AADJ
|
||||||
|
|
||||||
|
ifneq ($(CWMP_REVISION)_,_)
|
||||||
|
ifneq ($(CWMP_REVISION),exported)
|
||||||
|
ifneq ($(CWMP_REVISION),Unversioned directory)
|
||||||
|
TARGET_CFLAGS += "-DCWMP_REVISION=\\\"$(CWMP_REVISION)\\\""
|
||||||
|
TARGET_LDFLAGS += "-DCWMP_REVISION=\\\"$(CWMP_REVISION)\\\""
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
TARGET_LDFLAGS += \
|
||||||
|
-Wl,-rpath-link=$(STAGING_DIR)/usr/lib
|
||||||
|
|
||||||
|
CONFIGURE_ARGS += \
|
||||||
|
--with-uci-include-path=$(STAGING_DIR)/usr/include \
|
||||||
|
--with-libubox-include-path=$(STAGING_DIR)/usr/include \
|
||||||
|
--with-libubus-include-path=$(STAGING_DIR)/usr/include
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_CWMP_ACS_MULTI),y)
|
||||||
|
CONFIGURE_ARGS += \
|
||||||
|
--enable-acs=multi
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_CWMP_ACS_HDM),y)
|
||||||
|
CONFIGURE_ARGS += \
|
||||||
|
--enable-acs=hdm
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_CWMP_DEBUG),y)
|
||||||
|
CONFIGURE_ARGS += \
|
||||||
|
--enable-debug
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_CWMP_DEVEL_DEBUG),y)
|
||||||
|
CONFIGURE_ARGS += \
|
||||||
|
--enable-devel
|
||||||
|
endif
|
||||||
|
|
||||||
|
define Package/$(PKG_NAME)/install
|
||||||
$(INSTALL_DIR) $(1)/etc/icwmpd
|
$(INSTALL_DIR) $(1)/etc/icwmpd
|
||||||
$(INSTALL_DIR) $(1)/usr/sbin
|
$(INSTALL_DIR) $(1)/usr/sbin
|
||||||
$(INSTALL_DIR) $(1)/etc/config
|
$(CP) $(PKG_BUILD_DIR)/bin/icwmpd $(1)/usr/sbin
|
||||||
$(INSTALL_DIR) $(1)/etc/init.d
|
ifeq ($(CONFIG_CWMP_SCRIPTS_FULL),y)
|
||||||
$(INSTALL_DIR) $(1)/etc/uci-defaults
|
$(INSTALL_DIR) $(1)/usr/share/icwmp
|
||||||
$(INSTALL_DIR) $(1)/lib/upgrade/keep.d
|
$(CP) $(PKG_BUILD_DIR)/scripts/defaults $(1)/usr/share/icwmp
|
||||||
$(INSTALL_DIR) $(1)/etc/bbfdm/json/
|
$(CP) $(PKG_BUILD_DIR)/scripts/functions $(1)/usr/share/icwmp
|
||||||
$(INSTALL_DIR) $(1)/etc/udhcpc.user.d
|
$(INSTALL_DIR) $(1)/usr/sbin
|
||||||
$(INSTALL_DIR) $(1)/usr/lib/bbfdm
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/icwmp.sh $(1)/usr/sbin/icwmp
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/libcwmpdm.so $(1)/usr/lib/bbfdm/libcwmpdm.so
|
endif
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/icwmpd $(1)/usr/sbin/icwmpd
|
$(CP) ./files/* $(1)/
|
||||||
$(INSTALL_DATA) ./files/etc/config/cwmp $(1)/etc/config/cwmp
|
|
||||||
$(INSTALL_BIN) ./files/etc/firewall.cwmp $(1)/etc/firewall.cwmp
|
|
||||||
$(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_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
|
|
||||||
$(INSTALL_DATA) ./files/etc/bbfdm/json/CWMPManagementServer.json $(1)/etc/bbfdm/json/
|
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/files/etc/udhcpc.user.d/udhcpc_icwmp_opt125.user $(1)/etc/udhcpc.user.d/udhcpc_icwmp_opt125.user
|
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/files/etc/udhcpc.user.d/udhcpc_icwmp_opt43.user $(1)/etc/udhcpc.user.d/udhcpc_icwmp_opt43.user
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
Package/icwmp-openssl/install = $(Package/icwmp/default/install)
|
define Package/$(PKG_NAME)/postinst
|
||||||
Package/icwmp-wolfssl/install = $(Package/icwmp/default/install)
|
#!/bin/sh
|
||||||
Package/icwmp-mbedtls/install = $(Package/icwmp/default/install)
|
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||||
|
echo "Enabling rc.d symlink for icwmpd"
|
||||||
|
/etc/init.d/icwmpd enable
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
endef
|
||||||
|
|
||||||
$(eval $(call BuildPackage,icwmp-openssl))
|
define Package/$(PKG_NAME)/prerm
|
||||||
$(eval $(call BuildPackage,icwmp-wolfssl))
|
#!/bin/sh
|
||||||
$(eval $(call BuildPackage,icwmp-mbedtls))
|
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||||
|
echo "Disabling rc.d symlink for icwmpd"
|
||||||
|
/etc/init.d/icwmpd disable
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call BuildPackage,$(PKG_NAME)))
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
{
|
|
||||||
"json_plugin_version": 1,
|
|
||||||
"Device.CWMPManagementServer.": {
|
|
||||||
"type": "object",
|
|
||||||
"version": "2.15",
|
|
||||||
"protocols": [
|
|
||||||
"usp"
|
|
||||||
],
|
|
||||||
"access": false,
|
|
||||||
"array": false,
|
|
||||||
"dependency": "file:/etc/config/cwmp",
|
|
||||||
"EnableCWMP": {
|
|
||||||
"type": "boolean",
|
|
||||||
"version": "2.15",
|
|
||||||
"read": true,
|
|
||||||
"write": true,
|
|
||||||
"protocols": [
|
|
||||||
"usp"
|
|
||||||
],
|
|
||||||
"mapping": [
|
|
||||||
{
|
|
||||||
"type": "uci",
|
|
||||||
"uci": {
|
|
||||||
"file": "cwmp",
|
|
||||||
"section": {
|
|
||||||
"name": "cpe"
|
|
||||||
},
|
|
||||||
"option": {
|
|
||||||
"name": "enable"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
config acs 'acs'
|
config acs 'acs'
|
||||||
|
option url ''
|
||||||
option userid '' #$OUI-$SER
|
option userid '' #$OUI-$SER
|
||||||
option passwd 'iopsys'
|
option passwd 'iopsys'
|
||||||
option periodic_inform_enable 'true'
|
option periodic_inform_enable 'true'
|
||||||
option periodic_inform_interval '1800'
|
option periodic_inform_interval '1800'
|
||||||
option periodic_inform_time '0001-01-01T00:00:00Z'
|
option periodic_inform_time '0001-01-01T00:00:00Z'
|
||||||
|
option ParameterKey ''
|
||||||
option dhcp_discovery 'enable'
|
option dhcp_discovery 'enable'
|
||||||
# compression possible configs: GZIP, Deflate, Disabled
|
# compression possible configs: GZIP, Deflate, Disabled
|
||||||
option compression 'Disabled'
|
option compression 'Disabled'
|
||||||
@@ -11,15 +13,15 @@ config acs 'acs'
|
|||||||
option retry_min_wait_interval '5'
|
option retry_min_wait_interval '5'
|
||||||
# possible configs interval :[1000:65535]
|
# possible configs interval :[1000:65535]
|
||||||
option retry_interval_multiplier '2000'
|
option retry_interval_multiplier '2000'
|
||||||
|
option https_ssl_capath ''
|
||||||
option ipv6_enable '0'
|
option ipv6_enable '0'
|
||||||
option ip_version '4'
|
option ip_version '4'
|
||||||
|
|
||||||
config cpe 'cpe'
|
config cpe 'cpe'
|
||||||
option enable '1'
|
option interface 'eth0.1'
|
||||||
option default_wan_interface 'wan'
|
option default_wan_interface 'wan'
|
||||||
option default_lan_interface 'lan'
|
|
||||||
option log_to_console 'disable'
|
option log_to_console 'disable'
|
||||||
option log_to_file 'disable'
|
option log_to_file 'enable'
|
||||||
# log_severity: INFO (Default)
|
# log_severity: INFO (Default)
|
||||||
# log_severity possible configs: EMERG, ALERT, CRITIC ,ERROR, WARNING, NOTICE, INFO, DEBUG
|
# log_severity possible configs: EMERG, ALERT, CRITIC ,ERROR, WARNING, NOTICE, INFO, DEBUG
|
||||||
option log_severity 'INFO'
|
option log_severity 'INFO'
|
||||||
@@ -28,17 +30,16 @@ config cpe 'cpe'
|
|||||||
option userid '' #$OUI-$SER
|
option userid '' #$OUI-$SER
|
||||||
option passwd 'iopsys'
|
option passwd 'iopsys'
|
||||||
option port '7547'
|
option port '7547'
|
||||||
|
option ubus_socket '/var/run/ubus.sock'
|
||||||
option provisioning_code ''
|
option provisioning_code ''
|
||||||
option amd_version '5'
|
option amd_version '5'
|
||||||
# compression possible configs: InstanceNumber, InstanceAlias
|
# compression possible configs: InstanceNumber, InstanceAlias
|
||||||
option instance_mode 'InstanceNumber'
|
option instance_mode 'InstanceNumber'
|
||||||
option session_timeout '300'
|
option session_timeout '60'
|
||||||
option notification '1'
|
option notification '1'
|
||||||
option exec_download '0'
|
option exec_download '0'
|
||||||
option periodic_notify_enable '1'
|
option periodic_notify_enable '1'
|
||||||
option periodic_notify_interval '10'
|
option periodic_notify_interval '10'
|
||||||
option incoming_rule 'Port_Only'
|
|
||||||
option active_notif_throttle '0'
|
|
||||||
|
|
||||||
config lwn 'lwn'
|
config lwn 'lwn'
|
||||||
option enable '1'
|
option enable '1'
|
||||||
|
|||||||
@@ -1,80 +1,21 @@
|
|||||||
#!/bin/sh
|
#created by the icwmp package
|
||||||
|
zone_name=""
|
||||||
#created by the icwmp package
|
port=""
|
||||||
log() {
|
if [ "$zone_name" = "" ]; then
|
||||||
echo "${@}"|logger -t firewall.cwmp -p info
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ ! -f "/var/state/cwmp" ]; then
|
|
||||||
exit 0;
|
|
||||||
fi
|
|
||||||
|
|
||||||
zone_name=$(uci -c /var/state -q get cwmp.acs.zonename)
|
|
||||||
port=$(uci -q get cwmp.cpe.port)
|
|
||||||
ipaddr=$(uci -c /var/state -q get cwmp.acs.ip)
|
|
||||||
ip6addr=$(uci -c /var/state -q get cwmp.acs.ip6)
|
|
||||||
incoming_rule=$(uci -q get cwmp.cpe.incoming_rule|tr 'A-Z' 'a-z')
|
|
||||||
|
|
||||||
if [ -z "${zone_name}" ]; then
|
|
||||||
log "empty firewall zone name"
|
|
||||||
exit 0
|
exit 0
|
||||||
elif [ "$zone_name" = "icwmp" ]; then
|
elif [ "$zone_name" = "icwmp" ]; then
|
||||||
iptables -nL zone_icwmp_input 2> /dev/null
|
iptables -nL zone_icwmp_input 2> /dev/null
|
||||||
if [ "$?" != 0 ]; then
|
if [ $? != 0 ]; then
|
||||||
iptables -w 1 -N zone_icwmp_input
|
iptables -N zone_icwmp_input
|
||||||
iptables -w 1 -t filter -A INPUT -j zone_icwmp_input
|
iptables -t filter -A INPUT -j zone_icwmp_input
|
||||||
iptables -w 1 -I zone_icwmp_input -p tcp --dport "${port}" -j REJECT
|
iptables -I zone_icwmp_input -p tcp --dport $port -j REJECT
|
||||||
else
|
else
|
||||||
iptables -w 1 -F zone_icwmp_input
|
iptables -F zone_icwmp_input
|
||||||
iptables -w 1 -I zone_icwmp_input -p tcp --dport "${port}" -j REJECT
|
iptables -I zone_icwmp_input -p tcp --dport $port -j REJECT
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
iptables -w 1 -F zone_icwmp_input 2> /dev/null
|
iptables -F zone_icwmp_input 2> /dev/null
|
||||||
iptables -w 1 -t filter -D INPUT -j zone_icwmp_input 2> /dev/null
|
iptables -t filter -D INPUT -j zone_icwmp_input 2> /dev/null
|
||||||
iptables -w 1 -X zone_icwmp_input 2> /dev/null
|
iptables -X zone_icwmp_input 2> /dev/null
|
||||||
fi
|
fi
|
||||||
|
#iptables -I FW_ZONE -p tcp -s ACS_ADDRESS --dport PORT -j ACCEPT --comment "Open ACS port"
|
||||||
cmd="iptables -w 1 -I zone_${zone_name}_input -p tcp"
|
|
||||||
cmd6="ip6tables -w 1 -I zone_${zone_name}_input -p tcp"
|
|
||||||
|
|
||||||
# default incoming rule is Port only
|
|
||||||
if [ -z "${incoming_rule}" ]; then
|
|
||||||
incoming_rule="port_only"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${incoming_rule}" = "ip_only" ]; then
|
|
||||||
if [ -n "${ipaddr}" ]; then
|
|
||||||
cmd="${cmd} -s ${ipaddr}"
|
|
||||||
cmd6="${cmd6} -s ${ip6addr}"
|
|
||||||
fi
|
|
||||||
elif [ "${incoming_rule}" = "port_only" ]; then
|
|
||||||
if [ -n "${port}" ]; then
|
|
||||||
cmd="${cmd} --dport ${port}"
|
|
||||||
cmd6="${cmd6} --dport ${port}"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [ -n "${ipaddr}" ]; then
|
|
||||||
cmd="${cmd} -s ${ipaddr}"
|
|
||||||
cmd6="${cmd6} -s ${ip6addr}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "${port}" ]; then
|
|
||||||
cmd="${cmd} --dport ${port}"
|
|
||||||
cmd6="${cmd6} --dport ${port}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "${cmd}"|grep -q "\-\-dport \|\-s "
|
|
||||||
if [ "$?" -eq 0 ]; then
|
|
||||||
cmd="${cmd} -j ACCEPT -m comment --comment=Open_ACS_port"
|
|
||||||
${cmd}
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "${cmd6}"|grep -q "\-\-dport \|\-s "
|
|
||||||
if [ "$?" -eq 0 ]; then
|
|
||||||
cmd6="${cmd6} -j ACCEPT -m comment --comment=Open_ACS_port"
|
|
||||||
${cmd6}
|
|
||||||
fi
|
|
||||||
|
|
||||||
uci -c /var/state -q set cwmp.cpe.firewall_restart="init"
|
|
||||||
uci -c /var/state -q commit cwmp
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user