update 2026-07-27 22:20:34

This commit is contained in:
action committed 2026-07-27 22:20:34 +08:00
1 parent 079ea4f182
commit 20b786ab77
6243 files changed
-2850540

No files matched your search

-20
View File
@@ -1,20 +0,0 @@
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-msd_lite
LUCI_TITLE:=LuCI app for msd_lite
LUCI_PKGARCH:=all
LUCI_DEPENDS:=+msd_lite
LUCI_DESCRIPTION:=LuCI support for msd_lite
define Package/luci-app-msd_lite/conffiles
/etc/config/msd_lite
endef
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -1,131 +0,0 @@
'use strict';
'require view';
'require fs';
'require form';
'require poll';
'require uci';
'require rpc';
'require tools.widgets as widgets';
const callServiceList = rpc.declare({
object: 'service',
method: 'list',
params: ['name'],
expect: { '': {} }
});
function getServiceStatus() {
return L.resolveDefault(callServiceList('msd_lite'), {}).then((res) => {
var isRunning = false;
try {
isRunning = res['msd_lite']?.['instances']?.['msd_lite-c']?.['running'] || false;
} catch (e) {
console.error('Error checking service status:', e);
}
return isRunning;
});
}
function renderStatus(isRunning) {
var spanTemp = '<em><span style="color:%s"><strong>%s %s</strong></span></em>';
var renderHTML;
if (isRunning)
renderHTML = spanTemp.format('green', _('msd_lite'), _('Running'));
else
renderHTML = spanTemp.format('red', _('msd_lite'), _('Not Running'));
return renderHTML;
}
return view.extend({
load: function () {
return Promise.all([
uci.load('msd_lite')
]);
},
render: function () {
var m, s, o;
m = new form.Map('msd_lite', _('Multi Stream daemon Lite'),
_('The lightweight version of Multi Stream daemon (msd) for organizing IPTV streaming over HTTP.'));
// Status section
s = m.section(form.TypedSection, null, _('Service Status'));
s.anonymous = true;
s.render = function () {
poll.add(function () {
return L.resolveDefault(getServiceStatus()).then((res) => {
var view = document.getElementById('service_status');
if (view) {
view.innerHTML = renderStatus(res);
}
});
}, 5);
return E('div', { class: 'cbi-section', id: 'status_bar' }, [
E('p', { id: 'service_status' }, _('Collecting data...'))
]);
}
s = m.section(form.NamedSection, 'default', 'msd_lite');
s.tab('settings', _('Basic Settings'));
o = s.taboption('settings', form.Flag, 'enabled', _('Enable'), _('Enable Msd_lite service'));
o.rmempty = false;
o = s.taboption('settings', form.DynamicList, 'address', _('Bind address'));
o.datatype = 'ipaddrport';
o.rmempty = false;
o.placeholder = '0.0.0.0:8080';
o = s.taboption('settings', widgets.NetworkSelect, 'network', _('Source interface'),
_('Used for receiving multicast.'));
o.nocreate = true;
o.optional = true;
o = s.taboption('settings', form.Value, 'threads', _('Worker threads'),
_('Set 0 or leave empty to auto detect.'));
o.datatype = 'uinteger';
o.placeholder = '0';
o = s.taboption('settings', form.Flag, 'bind_to_cpu', _('Bind threads to CPUs'));
o.default = o.disabled;
o = s.taboption('settings', form.Flag, 'drop_slow_clients', _('Disconnect slow clients'));
o.default = o.disabled;
o = s.taboption('settings', form.Value, 'precache_size', _('Pre cache size'));
o.datatype = 'uinteger';
o.placeholder = '4096';
o = s.taboption('settings', form.Value, 'ring_buffer_size', _('Ring buffer size'),
_('Stream receive ring buffer size.'));
o.datatype = 'uinteger';
o.placeholder = '1024';
o = s.taboption('settings', form.Value, 'multicast_recv_buffer_size', _('Receive buffer size'),
_('Multicast socket receive buffer size.'));
o.datatype = 'uinteger';
o.placeholder = '512';
o = s.taboption('settings', form.Value, 'multicast_recv_timeout', _('Receive timeout'),
_('Multicast receive timeout (seconds).'));
o.datatype = 'uinteger';
o.placeholder = '2';
o = s.taboption('settings', form.Value, 'rejoin_time', _('IGMP/MLD rejoin time'),
_('IGMP/MLD leave+join interval in seconds. 0 disables.'));
o.datatype = 'uinteger';
o.placeholder = '0';
o = s.taboption('settings', form.ListValue, 'loglevel', _('Log Level'),
_('Syslog severity level: 0=emerg, 7=debug'));
for (let i = 0; i <= 7; i++) {
o.value(i.toString(), i.toString());
}
o.default = '0';
return m.render();
}
});
-89
View File
@@ -1,89 +0,0 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language: zh_Hans\n"
#: luci-app-msd-lite
msgid "Multi Stream daemon Lite"
msgstr "多流守护进程精简版"
msgid "The lightweight version of Multi Stream daemon (msd) for organizing IPTV streaming over HTTP."
msgstr "精简版 Multi Stream daemon (msd),用于通过 HTTP 组织 IPTV 流媒体传输。"
msgid "Service Status"
msgstr "服务状态"
msgid "Collecting data..."
msgstr "正在收集数据..."
msgid "msd_lite"
msgstr "msd_lite"
msgid "Running"
msgstr "运行中"
msgid "Not Running"
msgstr "未运行"
msgid "Basic Settings"
msgstr "基本设置"
msgid "Enable"
msgstr "启用"
msgid "Enable Msd_lite service"
msgstr "启用 Msd_lite 服务"
msgid "Bind address"
msgstr "绑定地址"
msgid "Source interface"
msgstr "源接口"
msgid "Used for receiving multicast."
msgstr "用于接收组播。"
msgid "Worker threads"
msgstr "工作线程数"
msgid "Set 0 or leave empty to auto detect."
msgstr "设为 0 或留空以自动检测。"
msgid "Bind threads to CPUs"
msgstr "线程绑定 CPU"
msgid "Disconnect slow clients"
msgstr "断开慢速客户端"
msgid "Pre cache size"
msgstr "预缓存大小"
msgid "Ring buffer size"
msgstr "环形缓冲区大小"
msgid "Stream receive ring buffer size."
msgstr "流接收环形缓冲区大小。"
msgid "Receive buffer size"
msgstr "接收缓冲区大小"
msgid "Multicast socket receive buffer size."
msgstr "组播套接字接收缓冲区大小。"
msgid "Receive timeout"
msgstr "接收超时"
msgid "Multicast receive timeout (seconds)."
msgstr "组播接收超时时间(秒)。"
msgid "IGMP/MLD rejoin time"
msgstr "IGMP/MLD 重入时间"
msgid "IGMP/MLD leave+join interval in seconds. 0 disables."
msgstr "IGMP/MLD 离开+加入间隔时间(秒)。0 表示禁用。"
msgid "Log Level"
msgstr "日志级别"
msgid "Syslog severity level: 0=emerg, 7=debug"
msgstr "系统日志严重级别:0=紧急,7=调试"
@@ -1,30 +0,0 @@
config msd_lite 'default'
option 'enabled' '0'
# Bind address
list 'address' '0.0.0.0:7088'
list 'address' '[::]:7088'
# For multicast receive
option 'network' ''
# syslog Severity level: 0=emerg - 7=debug
option loglevel '0'
# 0 = auto detect
option 'threads' '0'
# Bind threads to CPUs
option 'bind_to_cpu' '0'
# Disconnect slow clients
option 'drop_slow_clients' '0'
# Pre cache size
option 'precache_size' '4096'
# Stream receive ring buffer size
option 'ring_buffer_size' '1024'
# Multicast receive socket buffer size
option 'multicast_recv_buffer_size' '512'
# Multicast receive timeout
option 'multicast_recv_timeout' '2'
# Do IGMP/MLD leave+join every X seconds
option 'rejoin_time' '0'
-131
View File
@@ -1,131 +0,0 @@
#!/bin/sh /etc/rc.common
. /lib/functions/network.sh # 导入网络相关函数库
START=99 # 启动优先级
USE_PROCD=1 # 使用 procd 管理进程
NAME="msd_lite" # 服务名称
PROG="/usr/bin/$NAME" # 可执行程序路径
CONF="/etc/$NAME/$NAME.conf.sample" # 模板配置文件路径
CONFDIR="/var/run/$NAME" # 运行时生成配置文件目录
CONFIG_SECTION="default" # 使用固定配置节名称
# 添加网络触发器
add_interface_triggers() {
local enabled network
# 读取配置节中的 enabled
config_get_bool enabled "$CONFIG_SECTION" "enabled" "0"
# 读取配置节中的 network 字段
config_get network "$CONFIG_SECTION" "network"
# 如果 enabled = 1 且 network 非空,则为该 network 添加接口变更触发器
[ "$enabled" -eq 0 -o -z "$network" ] || procd_add_reload_interface_trigger "$network"
}
# 启动服务
start_service() {
local seconds="0"
local enabled address network interface
local bindlist addr bind_to_cpu drop_slow_clients
local loglevel threads precache_size ring_buffer_size
local multicast_recv_buffer_size multicast_recv_timeout rejoin_tim
config_load "$NAME"
# 检查服务是否启用
config_get_bool enabled "$CONFIG_SECTION" "enabled" "0"
[ "$enabled" -eq 1 ] || return 0
# 获取地址列表
config_get address "$CONFIG_SECTION" "address"
# 地址不能为空
[ -n "$address" ] || {
logger -p daemon.err -t "$NAME" "No bind addresses configured."
return 1
}
# 获取网络接口
config_get network "$CONFIG_SECTION" "network"
# 若配置了 network,则尝试最多10秒等待对应接口上线
if [ -n "$network" ]; then
while [ "$seconds" -le 10 ]; do
network_flush_cache
network_get_device interface "$network"
[ -n "$interface" ] && break
seconds=$((seconds + 2))
sleep 2
done
[ -n "$interface" ] || logger -p daemon.warn -t "$NAME" "Interface for network '$network' not found after 10 seconds"
fi
# 生成绑定地址的 XML 列表
for addr in $address; do
bindlist="${bindlist:+$bindlist\\n\\t\\t\\t}<bind><address>$addr</address></bind>"
done
# 读取并转换布尔配置为 yes/no
config_get_bool bind_to_cpu "$CONFIG_SECTION" "bind_to_cpu" 0
[ "$bind_to_cpu" = "1" ] && bind_to_cpu="yes" || bind_to_cpu="no"
config_get_bool drop_slow_clients "$CONFIG_SECTION" "drop_slow_clients" 0
[ "$drop_slow_clients" = "1" ] && drop_slow_clients="yes" || drop_slow_clients="no"
# 读取其他配置参数
config_get loglevel "$CONFIG_SECTION" "loglevel" "0"
config_get threads "$CONFIG_SECTION" "threads" "0"
config_get precache_size "$CONFIG_SECTION" "precache_size" "4096"
config_get ring_buffer_size "$CONFIG_SECTION" "ring_buffer_size" "1024"
config_get multicast_recv_buffer_size "$CONFIG_SECTION" "multicast_recv_buffer_size" "512"
config_get multicast_recv_timeout "$CONFIG_SECTION" "multicast_recv_timeout" "2"
config_get rejoin_time "$CONFIG_SECTION" "rejoin_time" "0"
# 创建配置目录
mkdir -p "$CONFDIR"
# 通过模板替换生成具体的配置文件
sed -e "s,@logLevel@,$loglevel,g" \
-e "s,@threadsCountMax@,$threads,g" \
-e "s,@fBindToCPU@,$bind_to_cpu,g" \
-e "s,@bindList@,$bindlist,g" \
-e "s,@ifName@,$interface,g" \
-e "s,@fDropSlowClients@,$drop_slow_clients,g" \
-e "s,@precache@,$precache_size,g" \
-e "s,@ringBufSize@,$ring_buffer_size,g" \
-e "s,@rcvBuf@,$multicast_recv_buffer_size,g" \
-e "s,@rcvTimeout@,$multicast_recv_timeout,g" \
-e "s,@rejoinTime@,$rejoin_time,g" \
"$CONF" > "$CONFDIR/$NAME.conf"
# 使用 procd 启动服务
procd_open_instance "$NAME-c"
procd_set_param command "$PROG"
procd_append_param command -c "$CONFDIR/$NAME.conf"
procd_set_param limits core="unlimited"
procd_set_param limits nofile="1000000 1000000"
procd_set_param respawn
procd_set_param stderr 1
procd_close_instance
}
# 停止服务
stop_service() {
# 停止服务并删除配置文件
procd_kill "$NAME-c" >/dev/null 2>&1
rm -f "$CONFDIR/$NAME.conf"
}
restart() {
stop_service
start_service
}
# 添加服务触发器
service_triggers() {
# 添加配置文件变更触发器
procd_add_reload_trigger "$NAME" "/etc/init.d/$NAME" restart
# 添加网络接口触发器
config_load "$NAME"
add_interface_triggers
}
@@ -1,14 +0,0 @@
{
"admin/services/msd_lite": {
"title": "Multi Stream daemon Lite",
"order": 91,
"action": {
"type": "view",
"path": "msd_lite"
},
"depends": {
"acl": [ "luci-app-msd_lite" ],
"fs": { "/etc/config/msd_lite": "file" }
}
}
}
@@ -1,11 +0,0 @@
{
"luci-app-msd_lite": {
"description": "Grant UCI access for luci-app-msd_lite",
"read": {
"uci": [ "msd_lite" ]
},
"write": {
"uci": [ "msd_lite" ]
}
}
}