Commit 776c3a9a authored by 郭阔's avatar 郭阔

feat: per-source browser instance isolation

- nh_cdp_port: stable per-source CDP port (9300+name hash)
- nh_entry_write: entry scripts now export CDP_PORT_OVERRIDE +
  CDP_PROFILE_OVERRIDE so parallel harvests each drive a dedicated
  Chromium (own port + own profile); regenerated idempotently
- pairs with news-hub-skills CDP_PROFILE_OVERRIDE support
- darwin test asserts isolation env in generated entry
parent 5e5097d0
...@@ -139,18 +139,8 @@ nh_launchd_write() { # <name> <normalized-times> ...@@ -139,18 +139,8 @@ nh_launchd_write() { # <name> <normalized-times>
plist="$(nh_schedule_file "$name")" plist="$(nh_schedule_file "$name")"
agents_dir="$WORK_DIR/agents" agents_dir="$WORK_DIR/agents"
mkdir -p "$agents_dir" "$(dirname "$plist")" mkdir -p "$agents_dir" "$(dirname "$plist")"
nh_entry_write "$name"
# 入口脚本:文件名会显示在 系统设置-登录项,故按名字独立生成 entry="$(nh_entry_path "$name")"
entry="$agents_dir/news-harvester-${name}.sh"
if [ ! -f "$entry" ]; then
if [ "$name" = "digest" ]; then
printf '#!/bin/bash\n# LaunchAgent 入口:%s 每日汇总(文件名显示在 系统设置-登录项)\nexec "%s/daily-digest.sh"\n' "$name" "$NH_BIN_DIR" > "$entry"
else
printf '#!/bin/bash\n# LaunchAgent 入口:%s 定时采集(文件名显示在 系统设置-登录项)\nexec "%s/harvest.sh" "%s"\n' "$name" "$NH_BIN_DIR" "$name" > "$entry"
fi
chmod +x "$entry"
fi
cal="" cal=""
while IFS= read -r t; do while IFS= read -r t; do
[ -z "$t" ] && continue [ -z "$t" ] && continue
...@@ -180,6 +170,29 @@ EOF ...@@ -180,6 +170,29 @@ EOF
/usr/bin/plutil -lint "$plist" >/dev/null 2>&1 || { echo "❌ 生成的 plist 校验失败: $plist" >&2; return 1; } /usr/bin/plutil -lint "$plist" >/dev/null 2>&1 || { echo "❌ 生成的 plist 校验失败: $plist" >&2; return 1; }
} }
# --- 浏览器实例隔离(并行采集互不抢标签页) ---
nh_cdp_port() { # <name> → 按源名稳定的端口(9300-9499),不同源不同端口
local name="$1" sum=0 i
for ((i = 0; i < ${#name}; i++)); do
sum=$(( (sum * 31 + $(printf '%d' "'${name:i:1}")) % 200 ))
done
echo $((9300 + sum))
}
nh_entry_path() { echo "$WORK_DIR/agents/news-harvester-${1}.sh"; }
nh_entry_write() { # <name> 生成入口脚本(每次重写,保持幂等;注入该源专属浏览器实例)
local name="$1" entry
entry="$(nh_entry_path "$name")"
mkdir -p "$(dirname "$entry")"
if [ "$name" = "digest" ]; then
printf '#!/bin/bash\n# LaunchAgent 入口:%s 每日汇总(文件名显示在 系统设置-登录项)\nexec "%s/daily-digest.sh"\n' "$name" "$NH_BIN_DIR" > "$entry"
else
printf '#!/bin/bash\n# LaunchAgent 入口:%s 定时采集(文件名显示在 系统设置-登录项)\n# 该源专属浏览器实例:独立 CDP 端口 + 独立 profile,并行采集互不干扰\nexport CDP_PORT_OVERRIDE=%s\nexport CDP_PROFILE_OVERRIDE="%s/.news-harvester/profiles/%s"\nexec "%s/harvest.sh" "%s"\n' \
"$name" "$(nh_cdp_port "$name")" "$HOME" "$name" "$NH_BIN_DIR" "$name" > "$entry"
fi
chmod +x "$entry"
}
# --- 调度器:启停 --- # --- 调度器:启停 ---
nh_schedule_enable() { # <name> 加载/重新加载调度(改时间后同样调用此函数生效) nh_schedule_enable() { # <name> 加载/重新加载调度(改时间后同样调用此函数生效)
local name="$1" disabled active local name="$1" disabled active
......
...@@ -664,6 +664,10 @@ class DarwinPlatformTests(unittest.TestCase): ...@@ -664,6 +664,10 @@ class DarwinPlatformTests(unittest.TestCase):
self.assertIn('bootstrap', self.calls()) self.assertIn('bootstrap', self.calls())
entry = self.base / 'agents' / 'news-harvester-sample.sh' entry = self.base / 'agents' / 'news-harvester-sample.sh'
self.assertTrue(entry.exists() and entry.stat().st_mode & 0o111) self.assertTrue(entry.exists() and entry.stat().st_mode & 0o111)
# 入口脚本注入该源专属浏览器实例(独立 CDP 端口 + 独立 profile)
entry_text = entry.read_text()
self.assertIn('CDP_PORT_OVERRIDE=', entry_text)
self.assertIn(f'profiles/sample', entry_text)
mod = load_module('darwin_schedule', ROOT / 'bin' / 'schedule.py') mod = load_module('darwin_schedule', ROOT / 'bin' / 'schedule.py')
self.assertEqual(mod.read_schedule_times(plist), ['09:30']) self.assertEqual(mod.read_schedule_times(plist), ['09:30'])
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment