Compare commits

...

22 commits

Author SHA1 Message Date
Mohd Husaam Mehdi
4b5d368b97 sshmngr: set up pam separately for ssh service 2025-12-09 16:34:10 +05:30
Mohd Husaam Mehdi
61bda623ca iopsys-analytics: run non-threaded fluent-bit input plugins 2025-12-09 13:44:46 +05:30
Suvendhu Hansa
e2eaf6221a
tr143: per connection upload test using fast path 2025-12-09 12:27:44 +05:30
Vivek Kumar Dutta
82183e9e3b
parental-control: disable urlfilter by default 2025-12-08 21:58:50 +05:30
Vivek Kumar Dutta
edfbcb1074
Revert "parental-control: disable urlfilter by default"
This reverts commit 5af1df3493.
2025-12-08 21:45:01 +05:30
Vivek Kumar Dutta
5af1df3493 parental-control: disable urlfilter by default 2025-12-08 20:56:21 +05:30
Jakob Olsson
3ec6c21456 map-controller: 6.4.4.14 2025-12-08 16:09:18 +01:00
Reidar Cederqvist
9d251b5d9d
sulu: update to version 5.3.8
(cherry picked from commit 54f08fc89b)

Co-authored-by: Reidar Cederqvist <reidar.cederqvist@genexis.eu>
2025-12-08 14:38:37 +00:00
Amin Ben Romdhane
a3e4a0f6e9 map-controller: uci-defaults: Assign unique ID to qos_rule sections 2025-12-08 14:17:20 +01:00
Vivek Dutta
d5044df134
parental-control: read urlbundle definition from json 2025-12-08 18:07:13 +05:30
Jakob Olsson
cef4d4efea ieee1905: 8.7.43 2025-12-08 12:17:06 +01:00
Jakob Olsson
1f093159d8 map-agent: 6.5.0.8 2025-12-08 11:14:57 +01:00
Vivek Kumar Dutta
22e6d80384
bbfdm: 1.18.16 2025-12-08 12:21:10 +05:30
Sukru Senli
fe1bf101c3 sulu: 5.3.7 2025-12-07 11:11:12 +01:00
Reidar Cederqvist
24c30a098e
sulu: update to version 5.3.6 2025-12-05 18:53:16 +01:00
Sukru Senli
a0c1801511 netmode: fallback to checking usr_data if /opconf/opconf.json is not available 2025-12-05 17:24:09 +01:00
Reidar Cederqvist
59e7ece054
sulu: update to version 5.3.5 2025-12-05 17:00:22 +01:00
Jakob Olsson
cb9825504d Revert "map-agent: 6.5.0.8"
This reverts commit 3158f92912.
2025-12-05 16:26:44 +01:00
Jakob Olsson
628331c808 Revert "map-controller: 6.4.4.14"
This reverts commit 9bb0da51cf.
2025-12-05 16:26:43 +01:00
Reidar Cederqvist
229f62a906
sulu: update to version 5.3.4 2025-12-05 15:24:31 +01:00
Vivek Kumar Dutta
034bd7e8b2
sysmngr: 1.1.6 2025-12-05 18:32:51 +05:30
Vivek Kumar Dutta
c594a4957f
tr143: 1.1.12 2025-12-05 18:13:04 +05:30
28 changed files with 615 additions and 104 deletions

View file

@ -5,13 +5,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=bbfdm
PKG_VERSION:=1.18.15
PKG_VERSION:=1.18.16
USE_LOCAL:=0
ifneq ($(USE_LOCAL),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/bbfdm.git
PKG_SOURCE_VERSION:=8f72146f0f42b76b43ef545136548dd2ca1b0388
PKG_SOURCE_VERSION:=72c3307651cb583121fa5b4abcaad957ddc264bd
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View file

@ -6,12 +6,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=ieee1905
PKG_VERSION:=8.7.42
PKG_VERSION:=8.7.43
LOCAL_DEV=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=2e7d1377794b8d4f8aad252265110b09b129fdc8
PKG_SOURCE_VERSION:=48f1eb0ffceea5b6cd98846d7f774387f1e57401
PKG_SOURCE_URL:=https://dev.iopsys.eu/multi-ap/ieee1905.git
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_HASH:=skip

View file

@ -4,7 +4,7 @@ PKG_NAME:=iopsys-analytics
PKG_RELEASE:=$(COMMITCOUNT)
PKG_LICENSE:=PROPRIETARY
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=25e32ac5a860aec6e53e3449565b71595073e014
PKG_SOURCE_VERSION:=7c2780b4c24e5a1078c060bf9d3a03365f71f06a
PKG_SOURCE_URL:=https://dev.iopsys.eu/iopsys/iopsys-analytics.git
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)_$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_HASH:=skip

View file

@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=map-agent
PKG_VERSION:=6.5.0.8
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_VERSION:=ad7921410e313ad66e9bd4f75004407da96ae352
PKG_SOURCE_VERSION:=725909127f3ba4be38ae6e8f13b70260062737a6
PKG_MAINTAINER:=Jakob Olsson <jakob.olsson@iopsys.eu>
PKG_LICENSE:=BSD-3-Clause

View file

@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=map-controller
PKG_VERSION:=6.4.4.14
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_VERSION:=82d7fb6683dadd2339dd1bbd3d319cd4cb2692be
PKG_SOURCE_VERSION:=abd127215616717506fb03c94ca629f22768ff4f
PKG_MAINTAINER:=Jakob Olsson <jakob.olsson@genexis.eu>
LOCAL_DEV=0

View file

@ -0,0 +1,66 @@
#!/bin/sh
. /lib/functions.sh
cfg="mapcontroller"
config_load "$cfg"
used_ids=""
collect_used_ids() {
local section="$1"
local id
id=$(uci -q get ${cfg}.${section}.id)
if [ -n "$id" ] && printf "%s" "$id" | grep -qE '^[0-9]+$'; then
used_ids="$used_ids $id"
fi
}
# Find first available ID from 0 to INT32_MAX
find_first_available_id() {
local max_int=2147483647
local expected=0
local id
# Convert list to sorted unique list
sorted_ids=$(printf "%s\n" $used_ids | sort -n | uniq)
for id in $sorted_ids; do
if [ "$id" -eq "$expected" ]; then
expected=$((expected + 1))
elif [ "$id" -gt "$expected" ]; then
# Found a gap -> return the gap
echo "$expected"
return
fi
done
# If no gaps, next available is `expected`
if [ "$expected" -le "$max_int" ]; then
echo "$expected"
else
echo -1
fi
}
# Assign ID if missing
add_qos_rule_id() {
local section="$1"
local id
id=$(uci -q get ${cfg}.${section}.id)
if [ -z "$id" ]; then
new_id=$(find_first_available_id)
[ "$new_id" -ge 0 ] || return # No available ID
uci -q set ${cfg}.${section}.id="$new_id"
used_ids="$used_ids $new_id"
fi
}
# Step 1: Collect all existing IDs
config_foreach collect_used_ids qos_rule
# Step 2: Assign IDs to rules missing them
config_foreach add_qos_rule_id qos_rule

View file

@ -14,5 +14,3 @@ for sec in $sections; do
uci rename $cfg.$s=$sec
done
uci commit $cfg

View file

@ -5,15 +5,18 @@ if [ "$enabled" != "1" ]; then
exit 0
fi
opconf_file="/opconf/opconf.json"
[ -f $opconf_file ] || opconf_file="/usr_data/opconf/opconf.json"
# Check if netmode getting provisioned from opconf, in case of opconf
# provisioning, mode setting not required
mode="$(jsonfilter -i /opconf/opconf.json -e @.netmode.mode 2>/dev/null)"
mode="$(jsonfilter -i $opconf_file -e @.netmode.mode 2>/dev/null)"
if [ -n "${mode}" ]; then
exit 0
fi
# Check if opconf has wan provisioning enabled, if yes, get the proto/mode from opconf
proto="$(jsonfilter -i /usr_data/opconf/opconf.json -e '@.network.wan[@.name="wan"].proto' 2>/dev/null)"
proto="$(jsonfilter -i $opconf_file -e '@.network.wan[@.name="wan"].proto' 2>/dev/null)"
if [ -n "${proto}" ]; then
mode="routed-${proto}"
uci -q set netmode.global.mode="${mode}"

View file

@ -5,13 +5,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=parental-control
PKG_VERSION:=1.4.4
PKG_VERSION:=1.4.5
LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/network/parental-control.git
PKG_SOURCE_VERSION:=d0eabdda9790d1df3cec30589c97214731108367
PKG_SOURCE_VERSION:=11777ff069888fc543c2501110313b654bbbfbc9
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif
@ -27,7 +27,7 @@ define Package/parental-control
CATEGORY:=Utilities
TITLE:=URL filter
DEPENDS:=+libuci +libnetfilter-queue +libnfnetlink +iptables-mod-nfqueue +libpthread
DEPENDS+=+libubox +ubus +conntrack +libcurl +cmph
DEPENDS+=+libubox +ubus +conntrack +libcurl +cmph +libjson-c
DEPENDS+=+libbbfdm-api +libbbfdm-ubus +dm-service
endef
@ -87,12 +87,12 @@ define Package/parental-control/install
$(INSTALL_DATA) ./files/etc/uci-defaults/40-parental_control_update_bundle_path $(1)/etc/uci-defaults/
ifeq ($(CONFIG_PARENTAL_CONTROL_URLFILTERING),y)
$(INSTALL_DATA) ./files/etc/uci-defaults/50-parental_control_add_bundles $(1)/etc/uci-defaults/
$(CP) ./files/urlbundle_override.json $(1)/etc/parentalcontrol/
$(INSTALL_DATA) ./files/etc/parentalcontrol/url_bundles.json $(1)/etc/parentalcontrol/
$(INSTALL_DATA) ./files/etc/parentalcontrol/urlbundle_override.json $(1)/etc/parentalcontrol/
else
$(BBFDM_INSTALL_MS_PLUGIN) -v ${VENDOR_PREFIX} ./files/urlbundle_override.json $(1) parentalcontrol
$(INSTALL_DATA) ./files/etc/uci-defaults/50-parental_control_disable_urlfilter $(1)/etc/uci-defaults/
endif
$(INSTALL_DATA) ./files/etc/uci-defaults/50-parental_control_disable_urlfilter $(1)/etc/uci-defaults/
endef
$(eval $(call BuildPackage,parental-control))

View file

@ -0,0 +1,76 @@
{
"urlBundles": [
{
"url": "https://blocklistproject.github.io/Lists/alt-version/abuse-nl.txt",
"name": "Abuse"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/ads-nl.txt",
"name": "Ads"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/crypto-nl.txt",
"name": "Crypto"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/drugs-nl.txt",
"name": "Drugs"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/everything-nl.txt",
"name": "Everything else"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/facebook-nl.txt",
"name": "Facebook/Instagram"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/fraud-nl.txt",
"name": "Fraud"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/gambling-nl.txt",
"name": "Gambling"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/malware-nl.txt",
"name": "Malware"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/phishing-nl.txt",
"name": "Phishing"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/piracy-nl.txt",
"name": "Piracy"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/porn-nl.txt",
"name": "Porn"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/ransomware-nl.txt",
"name": "Ransomware"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/redirect-nl.txt",
"name": "Redirect"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/scam-nl.txt",
"name": "Scam"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/tiktok-nl.txt",
"name": "TikTok"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/torrent-nl.txt",
"name": "Torrent"
},
{
"url": "https://blocklistproject.github.io/Lists/alt-version/tracking-nl.txt",
"name": "Tracking"
}
]
}

View file

@ -1,43 +0,0 @@
#!/bin/sh
[ ! -f "/etc/config/parentalcontrol" ] && exit 0
COUNT=1
add_urlbundle()
{
local name url
url="${1}"; shift
name="$*"
uci -q set parentalcontrol.urlbundle_${COUNT}=urlbundle
uci -q set parentalcontrol.urlbundle_${COUNT}.name="${name}"
uci -q set parentalcontrol.urlbundle_${COUNT}.download_url="${url}"
COUNT="$((COUNT+1))"
}
urlfilter="$(uci -q get parentalcontrol.globals.urlfilter)"
if [ "${urlfilter}" -eq "1" ]; then
add_urlbundle "https://blocklistproject.github.io/Lists/alt-version/abuse-nl.txt" "Abuse"
add_urlbundle "https://blocklistproject.github.io/Lists/alt-version/ads-nl.txt" "Ads"
add_urlbundle "https://blocklistproject.github.io/Lists/alt-version/crypto-nl.txt" "Crypto"
add_urlbundle "https://blocklistproject.github.io/Lists/alt-version/drugs-nl.txt" "Drugs"
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/everything-nl.txt' "Everything else"
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/facebook-nl.txt' 'Facebook/Instagram'
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/fraud-nl.txt' 'Fraud'
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/gambling-nl.txt' 'Gambling'
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/malware-nl.txt' 'Malware'
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/phishing-nl.txt' 'Phishing'
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/piracy-nl.txt' 'Piracy'
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/porn-nl.txt' 'Porn'
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/ransomware-nl.txt' 'Ransomware'
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/redirect-nl.txt' 'Redirect'
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/scam-nl.txt' 'Scam'
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/tiktok-nl.txt' 'TikTok'
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/torrent-nl.txt' 'Torrent'
add_urlbundle 'https://blocklistproject.github.io/Lists/alt-version/tracking-nl.txt' 'Tracking'
fi
exit 0

View file

@ -5,10 +5,3 @@
[ ! -f "/etc/config/parentalcontrol" ] && exit 0
uci -q set parentalcontrol.globals.urlfilter='0'
_delete_urlbundle() {
uci_remove parentalcontrol "${1}"
}
config_load "parentalcontrol"
config_foreach _delete_urlbundle urlbundle

View file

@ -1,10 +1,12 @@
#!/bin/sh
. /lib/functions.sh
. /usr/share/libubox/jshn.sh
LOCKFILE="/tmp/sync_bundles.lock"
log_level="$(uci -q get parentalcontrol.globals.loglevel)"
log_level="${log_level:-1}"
URLBUNDLE_JSON="/etc/parentalcontrol/url_bundles.json"
DEBUG=0
log_err() {
@ -85,6 +87,7 @@ update_bundle_file_from_url() {
local success=0
while [ $attempt -le 3 ]; do
if curl -s -o "$temp_file" "$download_url"; then
log_info "Download successful for $download_url"
success=1
break
else
@ -218,24 +221,33 @@ cleanup_bundle_files() {
# Collect all download_url entries using config_foreach
local urls=""
get_download_url() {
local section="$1"
config_get url "$section" download_url
config_get_bool enable "$1" enable 1
local enable url
json_select "${2}"
json_get_var url url
json_get_var enable enable
enable="${enable:-1}"
if [ "${enable}" -eq 0 ]; then
# bundle is disabled
log_info "get_download_url: Skipping bundle ${name} not enabled"
json_select ..
return 0
fi
url="${url#file://}"
url="${url#https://}"
url="${url#http://}"
url="${url##*/}" # Get everything after the last '/'
urls="$urls $url"
json_select ..
}
config_load parentalcontrol
config_foreach get_download_url urlbundle
json_init
json_load_file "${URLBUNDLE_JSON}"
json_for_each_item get_download_url "urlBundles"
# Loop through all files in the directory
for file in "$dir"/*; do
@ -294,30 +306,29 @@ handle_filter_for_bundles() {
fi
check_bundle_exists() {
local enable download_url name cfg
local enable url name
cfg="$1"
config_get name "$cfg" name
config_get_bool enable "$cfg" enable 1
config_get download_url "$cfg" download_url
json_select "${2}"
json_get_var name name
json_get_var url url
json_get_var enable enable
enable="${enable:-1}"
if [ "${enable}" -eq 0 ]; then
log_info "Skipping bundle ${name} not enabled"
log_info "check_bundle_exists: Skipping bundle ${name} not enabled"
json_select ..
return 0
fi
handle_download_url "$download_url" "$name"
local exit_status=$?
if [ "$exit_status" -eq 1 ]; then
uci -q set "parentalcontrol.${cfg}.status"="Error"
else
uci -q set "parentalcontrol.${cfg}.status"=""
fi
uci commit parentalcontrol
handle_download_url "${url}" "${name}"
json_select ..
}
config_foreach check_bundle_exists urlbundle
json_init
json_load_file "${URLBUNDLE_JSON}"
json_for_each_item check_bundle_exists "urlBundles"
}
# Open file descriptor 200 for locking

View file

@ -28,4 +28,15 @@ config SSHMNGR_SFTP
default y
help
Enable this option to support the SFTP protocol.
config SSHMNGR_SECURITY_MFA
bool "MFA using PAM and Google authenticator"
depends on SSHMNGR_BACKEND_OPENSSH_PAM
default n
help
Enable this option to use MFA with PAM based Google authenticator.
config SSHMNGR_VENDOR_PREFIX
string "Package specific datamodel Vendor Prefix for TR181 extensions"
default ""
endif

View file

@ -34,6 +34,7 @@ define Package/sshmngr
DEPENDS+=+SSHMNGR_BACKEND_OPENSSH_PAM:openssh-server-pam +SSHMNGR_BACKEND_OPENSSH_PAM:openssh-client-utils
DEPENDS+=+SSHMNGR_BACKEND_DROPBEAR:dropbear
DEPENDS+=+SSHMNGR_SFTP:openssh-sftp-server
DEPENDS+=+SSHMNGR_SECURITY_MFA:google-authenticator-libpam
endef
define Package/sshmngr/description
@ -44,6 +45,13 @@ define Package/$(PKG_NAME)/config
source "$(SOURCE)/Config.in"
endef
ifeq ($(CONFIG_SSHMNGR_VENDOR_PREFIX),"")
VENDOR_PREFIX = $(CONFIG_BBF_VENDOR_PREFIX)
else
VENDOR_PREFIX = $(CONFIG_SSHMNGR_VENDOR_PREFIX)
endif
ifeq ($(LOCAL_DEV),1)
define Build/Prepare
$(CP) -rf ./sshmngr/* $(PKG_BUILD_DIR)/
@ -67,6 +75,16 @@ endif
$(BBFDM_REGISTER_SERVICES) ./bbfdm_service.json $(1) $(PKG_NAME)
$(BBFDM_INSTALL_MS_DM) $(PKG_BUILD_DIR)/src/libsshmngr.so $(1) $(PKG_NAME)
ifeq ($(CONFIG_SSHMNGR_BACKEND_OPENSSH_PAM),y)
$(INSTALL_DIR) $(1)/etc/uci-defaults
$(INSTALL_DATA) ./files/openssh_backend/lib/sshmngr/pam_config.sh $(1)/lib/sshmngr/
$(INSTALL_BIN) ./files/openssh_backend/etc/uci-defaults/91-set-sshd-pam $(1)/etc/uci-defaults/
ifeq ($(CONFIG_SSHMNGR_SECURITY_MFA),y)
$(INSTALL_BIN) ./files/openssh_backend/etc/uci-defaults/92-set-ssh-mfa $(1)/etc/uci-defaults/
$(BBFDM_INSTALL_MS_PLUGIN) -v ${VENDOR_PREFIX} ./files/openssh_backend/ssh_mfa_override.json $(1) $(PKG_NAME)
endif
endif
ifeq ($(CONFIG_PACKAGE_fail2ban),y)
$(INSTALL_DIR) $(1)/etc/fail2ban/jail.d
$(INSTALL_DIR) $(1)/etc/fail2ban/filter.d/

View file

@ -3,6 +3,8 @@
. /usr/share/libubox/jshn.sh
. /lib/sshmngr/backend.sh
MFA_SECRET_FILE="/etc/security/mfa_secret"
add_server_name()
{
local server_sec="${1}"
@ -44,7 +46,7 @@ get_pid()
case "$1" in
list)
echo '{ "dump" : {"server_name":"string"}, "kill_session" : {"session_pid":"string","server_name":"string"}, "list_keys" : {}, "add_pubkey" : {"current_key":"string","new_key":"string"}, "remove_pubkey" : {"key":"string"} }'
echo '{ "dump" : {"server_name":"string"}, "kill_session" : {"session_pid":"string","server_name":"string"}, "list_keys" : {}, "add_pubkey" : {"current_key":"string","new_key":"string"}, "remove_pubkey" : {"key":"string"}, "get_mfa_key" : {}, "get_mfa_recovery" : {} }'
;;
call)
case "$2" in
@ -221,6 +223,31 @@ case "$1" in
fi
echo '{}'
;;
get_mfa_key)
mfa_key=""
if [ -f "${MFA_SECRET_FILE}" ]; then
mfa_key="$(head -n 1 "$MFA_SECRET_FILE" 2>/dev/null)"
fi
json_init
json_add_string "mfa_key" "${mfa_key}"
json_dump
;;
get_mfa_recovery)
mfa_recovery_codes=""
if [ -f "${MFA_SECRET_FILE}" ]; then
mfa_recovery_codes="$(tail -n 3 "$MFA_SECRET_FILE" 2>/dev/null | tr '\n' ',')"
# remove trailing comma
mfa_recovery_codes="${mfa_recovery_codes%,}"
fi
json_init
json_add_string "recovery_codes" "${mfa_recovery_codes}"
json_dump
;;
esac
;;
esac

View file

@ -0,0 +1,36 @@
#!/bin/sh
# create or over-write our desired file
# /etc/pam.d/sshd
cat << 'EOF' > /etc/pam.d/sshd
auth required pam_env.so
auth include sshd-auth
account required pam_nologin.so
account include sshd-account
session include common-session
session required pam_limits.so
password include sshd-password
EOF
# /etc/pam.d/sshd-auth
cat << 'EOF' > /etc/pam.d/sshd-auth
auth [success=1 default=ignore] pam_unix.so nullok_secure
auth requisite pam_deny.so
auth required pam_permit.so
EOF
# /etc/pam.d/sshd-password
cat << 'EOF' > /etc/pam.d/sshd-password
password [success=1 default=ignore] pam_unix.so sha512
password requisite pam_deny.so
password required pam_permit.so
EOF
# /etc/pam.d/sshd-account
cat << 'EOF' > /etc/pam.d/sshd-account
account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
account requisite pam_deny.so
account required pam_permit.so
EOF
exit 0

View file

@ -0,0 +1,10 @@
#!/bin/sh
if [ -f /etc/config/sshd ]; then
# make sure not to change already existing setting
if ! uci -q get sshd.@sshd[0].UseMFA 2>&1 > /dev/null; then
uci -q set sshd.@sshd[0].UseMFA=1
fi
fi
exit 0

View file

@ -0,0 +1,228 @@
#!/bin/sh
# List of required .so files
REQUIRED_MODULES="
/usr/lib/security/pam_faildelay.so
/usr/lib/security/pam_faillock.so
/usr/lib/security/pam_unix.so
/usr/lib/security/pam_deny.so
/usr/lib/security/pam_permit.so
/usr/lib/security/pam_passwdqc.so
"
MFA_APP="google-authenticator"
MFA_LIB="/usr/lib/security/pam_google_authenticator.so"
MFA_DIR="/etc/security"
MFA_SECRET_FILE="${MFA_DIR}/mfa_secret"
MFA_QR_FILE="${MFA_DIR}/mfa_qr"
log() {
echo "$*" | logger -t sshd.init -p info
}
log_err() {
echo "$*" | logger -t sshd.init -p err
}
check_required_modules() {
for mod in $REQUIRED_MODULES; do
if [ ! -f "$mod" ]; then
log_err "ERROR: Cannot setup security policy, missing PAM module: $mod"
return 1
fi
done
return 0
}
write_line() {
local filepath="$1"
local line="$2"
echo "$line" >> "$filepath"
}
compare_and_replace() {
local src dst
src="$1"
dst="$2"
if [ ! -f "$dst" ] || ! cmp -s "$src" "$dst"; then
cp "$src" "$dst"
log "Updated $dst"
fi
}
setup_mfa() {
mkdir -p "$MFA_DIR"
if [ -f "${MFA_SECRET_FILE}" ] && [ -f "${MFA_QR_FILE}" ]; then
log "Not updating MFA files, they already exist"
return
fi
touch "$MFA_SECRET_FILE"
touch "$MFA_QR_FILE"
chmod 600 "$MFA_SECRET_FILE"
chmod 600 "$MFA_QR_FILE"
local cmd="$MFA_APP -f -s $MFA_SECRET_FILE -C -t -d -r 3 -R 30 -w 3 -Q UTF8 -e 3"
log "Running MFA app: $cmd"
# if the google-authenticator senses that the output is not going to a terminal
# then it does not print out the QR, so simple redirection does not work
# we have to run the command inside a pseudo-terminal using script command
# and then redirect that output to a file
cmd="script -q -c \"$cmd\" $MFA_QR_FILE > /dev/null"
eval "$cmd"
}
update_auth() {
# Write /etc/pam.d/sshd-auth
local tmp_file pam_file
tmp_file="/tmp/sshd-auth"
pam_file="/etc/pam.d/sshd-auth"
local auth_enabled="${1}"
local enabled="${2}"
local mfa_enabled="${3}"
local faildelay="$(uci -q get users.authentication_policy.fail_delay || echo 3)"
local faillock_lockout_time="$(uci -q get users.authentication_policy.faillock_lockout_time || echo 300)"
local faillock_attempts="$(uci -q get users.authentication_policy.faillock_attempts || echo 6)"
# Convert seconds to microseconds for pam_faildelay
local faildelay_usec=$((faildelay * 1000000))
rm -f "$tmp_file"
touch "$tmp_file"
if [ "${auth_enabled}" -eq 1 ] && [ "${enabled}" -eq 1 ]; then
write_line "$tmp_file" "auth optional pam_faildelay.so delay=$faildelay_usec"
write_line "$tmp_file" "auth required pam_faillock.so preauth deny=$faillock_attempts even_deny_root unlock_time=$faillock_lockout_time"
fi
write_line "$tmp_file" "auth [success=1 default=bad] pam_unix.so nullok_secure"
write_line "$tmp_file" "auth [default=die] pam_faillock.so authfail audit deny=$faillock_attempts even_deny_root unlock_time=$faillock_lockout_time"
if [ "$mfa_enabled" -eq 1 ]; then
write_line "$tmp_file" "auth [success=1 default=bad] pam_google_authenticator.so secret=$MFA_SECRET_FILE"
write_line "$tmp_file" "auth [default=die] pam_faillock.so authfail audit deny=$faillock_attempts even_deny_root unlock_time=$faillock_lockout_time"
fi
write_line "$tmp_file" "auth sufficient pam_faillock.so authsucc audit deny=$faillock_attempts even_deny_root unlock_time=$faillock_lockout_time"
write_line "$tmp_file" "auth requisite pam_deny.so"
compare_and_replace "$tmp_file" "$pam_file"
}
build_pam_passwdqc_line() {
local base="password requisite pam_passwdqc.so"
local k v line
for line in $(uci show users.passwdqc 2>/dev/null); do
case "$line" in
users.passwdqc=*) continue ;;
users.passwdqc.enabled=*) continue ;;
esac
k="${line%%=*}"
k="${k#users.passwdqc.}"
v="${line#*=}"
v="${v%\'}"
v="${v#\'}"
base="$base $k=$v"
done
base="$base match=0"
echo "$base"
}
# NOTE:
# for some reason setting min 8 makes passwdqc accept minimum 12 letter password with this configuration
# if we set it to 12 then we need atleast 16 characters and so on
# passphrase = 0 means no space separated words
# passphrase = N means the number of words required for a passphrase or 0 to disable the support for user-chosen passphrases.
# rest can be figured out from passwdqc man page
update_password() {
local tmp_file pam_file enabled line
tmp_file="/tmp/sshd-password"
pam_file="/etc/pam.d/sshd-password"
local auth_enabled="${1}"
rm -f "$tmp_file"
touch "$tmp_file"
# Check if section exists
if uci -q get users.passwdqc >/dev/null 2>&1; then
# if enabled is not present it is assumed to be 0
enabled=$(uci -q get users.passwdqc.enabled || echo "0")
if [ "${auth_enabled}" -eq 1 ] && [ "${enabled}" -eq 1 ]; then
line="$(build_pam_passwdqc_line)"
write_line "$tmp_file" "$line"
fi
fi
write_line "$tmp_file" "password [success=1 default=ignore] pam_unix.so sha512"
write_line "$tmp_file" ""
write_line "$tmp_file" "password requisite pam_deny.so"
write_line "$tmp_file" "password required pam_permit.so"
compare_and_replace "$tmp_file" "$pam_file"
}
update_account() {
# Write /etc/pam.d/sshd-account
local tmp_file pam_file
tmp_file="/tmp/sshd-account"
pam_file="/etc/pam.d/sshd-account"
local auth_enabled="${1}"
local enabled="${2}"
rm -f "$tmp_file"
touch "$tmp_file"
if [ "${auth_enabled}" -eq 1 ] && [ "${enabled}" -eq 1 ]; then
write_line "$tmp_file" "account required pam_faillock.so"
fi
write_line "$tmp_file" "account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so"
write_line "$tmp_file" ""
write_line "$tmp_file" "account requisite pam_deny.so"
write_line "$tmp_file" "account required pam_permit.so"
compare_and_replace "$tmp_file" "$pam_file"
}
handle_security_policy() {
local auth_enabled enabled
local use_mfa mfa_enabled
# Read UCI values
auth_enabled="$(uci -q get users.users.auth_policy_enable || echo 0)"
enabled="$(uci -q get users.authentication_policy.enabled || echo 0)"
use_mfa="$(uci -q get sshd.@sshd[0].UseMFA || echo 0)"
# if any .so files are missing, then we cannot setup security
if ! check_required_modules; then
return
fi
# Detect and enable MFA only if requested and module exists
if which "$MFA_APP" > /dev/null 2>&1 && [ "$use_mfa" = "1" ] && [ -f "$MFA_LIB" ]; then
mfa_enabled=1
setup_mfa
else
rm -rf "${MFA_QR_FILE}"
rm -rf "${MFA_SECRET_FILE}"
mfa_enabled=0
fi
update_auth "${auth_enabled}" "${enabled}" "${mfa_enabled}"
update_account "${auth_enabled}" "${enabled}"
update_password "${auth_enabled}"
}

View file

@ -0,0 +1,68 @@
{
"json_plugin_version": 2,
"Device.SSH.Server.{i}.": {
"type": "object",
"protocols": [
"cwmp",
"usp"
],
"access": false,
"array": false,
"{BBF_VENDOR_PREFIX}UseMFA": {
"type": "boolean",
"read": true,
"write": true,
"protocols": [
"cwmp",
"usp"
],
"mapping": [
{
"data": "@Parent",
"type": "uci_sec",
"key": "UseMFA"
}
]
},
"{BBF_VENDOR_PREFIX}MFA_Key": {
"type": "string",
"read": true,
"write": false,
"protocols": [
"cwmp",
"usp"
],
"mapping": [
{
"type": "ubus",
"ubus": {
"object": "sshmngr",
"method": "get_mfa_key",
"args": {},
"key": "mfa_key"
}
}
]
},
"{BBF_VENDOR_PREFIX}MFA_Recovery_Codes": {
"type": "string",
"read": true,
"write": false,
"protocols": [
"cwmp",
"usp"
],
"mapping": [
{
"type": "ubus",
"ubus": {
"object": "sshmngr",
"method": "get_mfa_recovery",
"args": {},
"key": "recovery_codes"
}
}
]
}
}
}

View file

@ -5,11 +5,11 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=sulu-base
PKG_VERSION:=5.3.3
PKG_VERSION:=5.3.8
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/websdk/sulu.git
PKG_SOURCE_VERSION:=662cac6c90cebe2a9e15dac12a299f4a230cdaed
PKG_SOURCE_VERSION:=d539ffdea1640b7cdeb55765c5737d8d7b6ab630
PKG_MIRROR_HASH:=skip
SULU_MOD:=core

View file

@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=sulu-builder
PKG_VERSION:=5.3.3
PKG_VERSION:=5.3.8
PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/websdk/sulu-builder.git
PKG_SOURCE_VERSION:=c94e8248294b42b58802de616033502afb73a908
PKG_SOURCE_VERSION:=fae099019a4dc74e529a909c110966c1cf10b4c7
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
PKG_BUILD_DIR:=$(BUILD_DIR)/sulu-$(PKG_VERSION)/sulu-builder-$(PKG_SOURCE_VERSION)

View file

@ -5,7 +5,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=sulu-theme-genexis
PKG_VERSION:=5.3.3
PKG_VERSION:=5.3.8
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/gnx/sulu-theme-genexis

View file

@ -5,13 +5,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=sysmngr
PKG_VERSION:=1.1.5
PKG_VERSION:=1.1.6
LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/system/sysmngr.git
PKG_SOURCE_VERSION:=70ca07fbc29ff65db875bc10c35ab8a9c3a42950
PKG_SOURCE_VERSION:=9e5cbc3c00e4e8ab1678baf5d8ff369a9345da09
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif

View file

@ -5,13 +5,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=tr143
PKG_VERSION:=1.1.11
PKG_VERSION:=1.1.13
LOCAL_DEV:=0
ifneq ($(LOCAL_DEV),1)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://dev.iopsys.eu/bbf/tr143d.git
PKG_SOURCE_VERSION:=998e96b068ee86c91773dc00a539a3ae9ab3f75e
PKG_SOURCE_VERSION:=be8ee7b6c52817914f66875d36061f2f62b80af8
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=skip
endif
@ -41,14 +41,15 @@ define Package/tr143/install
ifeq ($(CONFIG_TARGET_SUBTARGET),"an7581")
$(BBFDM_INSTALL_SCRIPT) $(PKG_BUILD_DIR)/airoha/scripts/download $(1)
$(BBFDM_INSTALL_SCRIPT) $(PKG_BUILD_DIR)/airoha/scripts/upload $(1)
$(INSTALL_DATA) ./files/an7581/etc/uci-defaults/* $(1)/etc/uci-defaults/
else
$(BBFDM_INSTALL_SCRIPT) $(PKG_BUILD_DIR)/scripts/download $(1)
$(BBFDM_INSTALL_SCRIPT) $(PKG_BUILD_DIR)/scripts/upload $(1)
$(INSTALL_DATA) ./files/other/etc/uci-defaults/* $(1)/etc/uci-defaults/
endif
$(BBFDM_INSTALL_SCRIPT) $(PKG_BUILD_DIR)/scripts/traceroute $(1)
$(BBFDM_INSTALL_SCRIPT) $(PKG_BUILD_DIR)/scripts/upload $(1)
$(BBFDM_INSTALL_SCRIPT) -d $(PKG_BUILD_DIR)/scripts/bbf_diag/ipping $(1)
$(BBFDM_INSTALL_SCRIPT) -d $(PKG_BUILD_DIR)/scripts/bbf_diag/serverselection $(1)
$(BBFDM_INSTALL_SCRIPT) -d $(PKG_BUILD_DIR)/scripts/bbf_diag/udpecho $(1)

View file

@ -1,6 +1,6 @@
#!/bin/sh
set_tr143_download_defaults() {
set_tr143_diagnostic_defaults() {
if [ ! -f /etc/bbfdm/dmmap/dmmap_diagnostics ]; then
touch /etc/bbfdm/dmmap/dmmap_diagnostics
fi
@ -9,7 +9,11 @@ set_tr143_download_defaults() {
uci -q -c /etc/bbfdm/dmmap set dmmap_diagnostics.download.DefaultNumberOfConnections='4'
uci -q -c /etc/bbfdm/dmmap set dmmap_diagnostics.download.DownloadDiagnosticMaxConnections='8'
uci -q -c /etc/bbfdm/dmmap set dmmap_diagnostics.upload='upload'
uci -q -c /etc/bbfdm/dmmap set dmmap_diagnostics.upload.DefaultNumberOfConnections='1'
uci -q -c /etc/bbfdm/dmmap set dmmap_diagnostics.upload.UploadDiagnosticMaxConnections='8'
uci -q -c /etc/bbfdm/dmmap commit dmmap_diagnostics
}
set_tr143_download_defaults
set_tr143_diagnostic_defaults

View file

@ -1,6 +1,6 @@
#!/bin/sh
set_tr143_download_defaults() {
set_tr143_diagnostic_defaults() {
if [ ! -f /etc/bbfdm/dmmap/dmmap_diagnostics ]; then
touch /etc/bbfdm/dmmap/dmmap_diagnostics
fi
@ -9,7 +9,11 @@ set_tr143_download_defaults() {
uci -q -c /etc/bbfdm/dmmap set dmmap_diagnostics.download.DefaultNumberOfConnections='1'
uci -q -c /etc/bbfdm/dmmap set dmmap_diagnostics.download.DownloadDiagnosticMaxConnections='1'
uci -q -c /etc/bbfdm/dmmap set dmmap_diagnostics.upload='upload'
uci -q -c /etc/bbfdm/dmmap set dmmap_diagnostics.upload.DefaultNumberOfConnections='1'
uci -q -c /etc/bbfdm/dmmap set dmmap_diagnostics.upload.UploadDiagnosticMaxConnections='1'
uci -q -c /etc/bbfdm/dmmap commit dmmap_diagnostics
}
set_tr143_download_defaults
set_tr143_diagnostic_defaults