Skip to content

Releases: TSS-Small-sunshine/StardustFlashLink

v2.1.3.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 16:09
f071807

Windows 安装程序 v2.1.3.0 "Vega"(织女星)(Inno Setup 自动构建 · 安装包已内嵌 Python,无需预装)。

本版变更

🏷 本版是 2.1 线(Vega 织女星)的多网络多账号版:同一个方案可以带自己的
账号与密码,切方案时连密码一起换 ✓;顺带修掉「状态页那张凭据卡存不了账号」的毛病 ✓。
接口、配置结构、服务名、AppId、安装路径都没动 —— 老配置与升级路径不受影响 ✓。

👤 ① 每个方案可以有自己的账号与密码(多网络多账号)

  • 以前方案能记住账号与后缀,但密码只有一份(公共 password.txt)——
    「宿舍用移动账号、教学楼用校园账号」这种玩法,切完方案密码还是上一个 ✗。
    现在方案可以带自己的密码:password.<方案名>.txt(一行密码)✓;
  • 配置页新增「选中方案的账号与密码」:选好方案 → 填账号 / 运营商 / 该方案的密码 →
    点「保存到选中方案」✓;想改回共用公共密码,勾上「删除该方案的专属密码」再保存 ✓;
  • 切方案连密码一起换:密码以前只在服务启动时读过一次 —— 就算方案带了专属密码,
    切完方案服务还在用旧密码,登录一路失败却「配置看着都对」✗。现在切方案后会重载密码 ✓
    (重载失败只记一条日志、不算切换失败:配置已经切好了,不该因为读不出密码再回滚 ✓);
  • 界面上看得见:方案下拉里带「专属密码」标记,编辑区上面写明「『宿舍』有专属密码文件
    (password.宿舍.txt)」✓;没设过专属密码的方案照旧用公共 password.txt ✓
    (老用户零迁移 ✓);
  • 密码仍然永不写进 config.json ✓、不进诊断包 ✓、界面不回显 ✓。

💾 ② 状态页那张凭据卡现在真的能存账号了(修复)

  • v2.1.2.0 把「账户与登录密码」从配置页搬到了状态页,但按钮沿用的还是老实现 ——
    只存密码:账号和运营商在界面上能改,点「保存」却什么都没发生(看着像存上了 ✗)。
    现在按钮叫「保存账号与密码」,一次存下账号 + 运营商 + 密码 ✓;
  • 存的姿势也修了:账号 / 运营商走部分更新(只改这两个键),
    不会再把网关 / 端口 / 间隔 / 守卫设置一起重置回默认值 ✗;改某个方案同理走合并改 ✓;
  • 卡上写明保存范围:账号与运营商进本机配置,密码永不写进配置文件 ✓(只进密码文件)。

🔧 ③ 其它修复

  • 兜底异常处理里的日志调用换成模块自带日志:以前若 logger 没被注入,这里会先报
    NameError、把真正的异常盖住 —— 客户端只看到「连接被重置」,服务端一条线索都没有 ✗;
  • 改的若正是当前方案,保存凭据后会自动重新应用一次 → 状态页立刻显示新账号 ✓。

🎨 v2.1.2.0:界面重做(四页信息架构 + 星尘风默认主题)

🏷 那是 2.1 线的界面重做版:状态 / 配置 / 日志 / 关于四页的信息架构重新排过,
「星尘风」成为默认主题,全站字体统一到 MiSans ✓。
接口、配置结构、服务名、AppId、安装路径都没动 —— 老配置与升级路径不受影响 ✓。

🎨 四页信息架构重做(本版重点)

  • 状态页:状态与「立即登录」合成一张卡;下面两条统计条 —— 日常 5 格
    (网络可达性 / 当前账号 / 上次登录 / 上次错误 / 下次检查)+ 诊断 4 格
    (在线率 / 掉线重登 / 平均恢复耗时 / 当前延迟);右栏是「账户与登录密码」。
    诊断指标不再折叠,一进页面就能看全 ✓。
  • 配置页:左栏「配置方案 + 网络与服务端口」、右栏「自动化」——
    升级相关整块搬去了「关于 → 更新」(配置页只留「本机怎么上网」的事)✓。
  • 日志页:改成终端窗口(红黄绿灯 + 行数 / 偏移 / 体积 + 过滤 + 自动滚动),
    下面是「日志占用与诊断包」✓。
  • 关于页:版本 / 运行时长 → 更新(结论条 + 立即检查 / 立即升级 / 查看升级历史 +
    升级流水 + 折叠的「升级设置(进阶)」)→ 数据与文件位置 → 服务与维护 ✓。

🌟 新默认主题「星尘风」+ 全站字体统一

  • 右上角一键三态循环:星尘(新默认)→ 亮色 → 暗色;老主题不受影响 ✓。
  • 字体统一到 MiSans(本机装了就用,没装自动退回系统字体栈 —— 不挑电脑、不缺字)✓。

🧹 界面瘦身

  • 撤掉界面上那些「实现说明」:顶栏的监听 / 数据位置提示条、诊断指标的数据来源脚注、
    凭据说明段;「关于」页的安装方式判据改到徽标悬停提示上(想核对时鼠标停一下就有)✓。
  • 删掉「连接质量」柱图板块(4 项诊断指标已经常显在状态页)✓。

🔧 排版修复

  • 长路径只在目录分隔符后换行,不再断出「…config.js / on」这种半截文件名 ✓;
  • 统计条里的日期不再折成三行(最多两行:日期 / 时间)✓;
  • 卡片间距统一到一套令牌,各页左右边界与行距对齐 ✓;
  • 「服务与维护」的按钮改成小尺寸,窄栏里不再占两行 ✓。

⚡ v2.1.1.0:网络一变就立刻登录

  • 刚连上 Wi-Fi 不用再等:以前要等到下一个检查周期(最长 60 分钟)才会登录,
    现在网络一通、或换到另一个 Wi-Fi,几秒内就会自动检查并登录 ✓。
  • 场景切换当场生效:走进教学楼 / 回到宿舍,配置方案(网关、间隔、账号、后缀、守卫白名单)
    会立刻跟着切 ✓ —— 方案里现在可以带账号与后缀了,所以「宿舍用移动账号、
    教学楼用校园账号 + 无尾缀」这类用法能真正跑起来 ✓(老方案不受影响 ✓)。

📶 配置页能直接选 Wi-Fi 名

  • 「允许的 Wi-Fi 名称」下面会显示当前 Wi-Fi,并把「保存过的 / 附近可见的」名字列成
    可点的按钮 —— 点一下就填进去,不用再手打 ✓(手打错一个字母就会一直不生效 ✗)。
  • 「配置方案」里的「自动匹配的 Wi-Fi 名」也有一键「用当前 Wi-Fi」✓。

👤 多账号(可选)

  • 想给某个方案单独用一份密码:在安装目录里放 password.<方案名>.txt(一行密码),
    该方案生效时会优先用它;没有这个文件就照旧用 password.txt ✓。
  • 密码永远只存在本机文件里 —— 不写进 config.json ✓、不进诊断包 ✓、界面不回显 ✓。

🔒 安全

  • 诊断包里的账号脱敏现在覆盖所有账号(含方案里存的)✓,并且不再改动运行中的配置 ✓。

🔧 修复 / 加固(相对 v2.1.0.0 之前)

🔒 安全 / 修复(相对 v2.0.14.0)

  • 登录失败不再可能把密码写进日志:登录用的是 GET、密码就在网址里,某些网络错误的
    文字里会带上整条网址 —— 现在日志与错误提示只保留「错误类型 / HTTP 状态码」,
    网址与密码参数会被自动擦掉(<url> / ***)。
  • 状态页的「下次检查」时间不再跳:以前服务与调度线程各写一次、两个值来回闪;
    现在只在需要时写一次。
  • 卸载更省心:删除用户数据那一步补上了默认选项与超时(无人值守时不会卡住,默认保留数据)。
  • 源码安装不再挑 Python 版本路径:以前写死 C:\Python314,现在自动找 py 启动器
    或常见安装位置。
  • 两个批处理脚本头部写明了已知限制:安装路径里不能含 !(cmd 的延迟展开会吃掉它)。

🔧 修复 / 加固(相对 v2.0.13.0)

  • 配置导入不再怕「zip 炸弹」:以前只看上传文件大小,一个很小的 zip 能解出几十 GB;
    现在导入前会先检查解压后的体积(单文件 ≤ 4 MB、合计 ≤ 8 MB),超了直接拒绝。
    导入包里字段类型写错也不再报 500,而是明确告诉你哪里不对(400)。
  • 账号没填也能保存其它设置:以前账号为空时整份配置都存不下去(连「自动升级」开关都改不了);
    现在账号可以留空,服务会跳过登录并在状态页提示「账号未设置」(不计入退避)。
  • 定时检查更结实:以前周期线程一旦遇到异常就会静默退出(之后再也不会自动登录);
    现在会记一条带原因的日志、停一会儿继续跑。

🔒 加固(相对 v2.0.12.0)

  • 安全响应头:页面与接口现在都带 CSP(default-src 'none',只放宽内联脚本与样式 ——
    因为页面本来就是全内联的)、X-Frame-Options: DENY(禁止被任何页面嵌框)、
    X-Content-Type-Options: nosniff、Referrer-Policy: no-referrer、Permissions-Policy
    (定位 / 摄像头 / 麦克风全部禁用)。
  • 请求体上限:JSON 接口最多收 1 MB,超出直接回 413(以前是无条件读进来)。
    拒绝时会先把已到达的字节排空再干净关连接 —— 否则 Windows 会因未读数据发 RST,
    把 413 本身冲掉。
  • 运行时单实例锁:手工再跑一份服务时,第二份现在什么都不做就退出(以前会先把
    定时检查跑起来);升级 / 重启时对旧进程宽容,最多等 20 秒。

✨ 新增(相对 v2.0.11.0)

  • 日志不再无限长大:业务日志超过 5 MB 自动轮转(保留 3 份旧档,合计 ≤ 20 MB),
    升级日志超过 2 MB 轮转(保留 2 份)—— 以前只能靠你自己去删。
    状态页「近 7 天」的统计会把旧档一起读,轮转不会让数字凭空变少。
  • 一键诊断包(已脱敏):「关于 → 日志与诊断」里能看到各日志占用,并一键下载诊断包 ——
    里面是版本 / 运行环境 / 服务状态 + 脱敏后的配置 + 各日志尾部(每个 ≤ 512 KB)。
    账号打码成「前 4 位 + ******」、MAC 打码、不含任何密码;校园网内网 IP 与 Wi-Fi 名会保留
    (排障需要),分享前请自行确认。反馈问题时发它,比截图 + 口述都准。

✨ 新增(相对 v2.0.10.0)

  • 升级前备份整目录 + 升级失败自动回滚:以前升级前只留一个 联网_service.py 的副本
    (还放在 %TEMP%),真要是新版本起不来,别的模块就回不去了 ✗。现在升级前会把全部代码文件
    备份到安装目录的 backup\<旧版本>\(每个文件都记 sha256),并且:
    • 执行器在两轮健康探测都探不到服务时,自动还原这些文件、重启服务、再探一次;
    • Web UI「配置 → 自动升级 → 版本回滚」也能手动一键回退到某个备份版本(服务会重启,约 15 秒)。
  • 回滚只动代码:config.json、密码、配置方案都不动(备份里那份 config.json 只供你人工比对)。
    备份保留 7 天、至少留最新 2 份;卸载时一并清掉。
  • 安全兜底:备份被改坏、清单缺失、版本对不上、清单里文件名带路径分隔符 → 一律拒绝回滚
    且不写任何文件(宁可不动,也不写出一套「半新半旧」的代码)。
  • 顺带修掉一个陷阱:升级后的启动自检原先「找不到旧式备份就直接跳过」,换备份方案后会把
    升级结果确认、AppExit 自愈、托盘自启项对齐全部跳过 ✗ —— 现在照常执行。

✨ 新增(相对 v2.0.9.1)

  • 升级收尾改探 HTTP 健康端点:自动升级跑完安装器后,执行器会用随包内嵌的 Python 探一次
    http://127.0.0.1:<你的端口>/api/health —— 只有拿到 {"ok": true} 才算「服务真的活了」。
    此前只看 sc query,而那是 nssm 的 wrapper:里面的 Python 崩了它照样显示 RUNNING
    (AppExit=Ignore:不重启也不报错),所以「升级把服务弄挂了」以前要等你自己发现 ✗。
  • 探不到就自动重启重试:先 sc stop + sc start 重启一次服务,再给一个窗口重探。
  • 失败会留下明确告警:结论写进 logs\upgrade.log(中文、带时间戳)。
    服务真起不来时 Web UI 也打不开,那行日志就是唯一的告警面 ——
    托盘右键「打开日志目录」即可看到,里面会写明「服务可能没起来」与下一步该看哪个日志。
  • 顺手修掉一个从 v2.0.4.2 起就在的老坑:升级记录里的 installer_rc=(安装器退出码)其实
    从来没真正写下来过 —— echo installer_rc=0>"…" 里的数字紧贴 >,cmd 会把它当成
    「句柄 0 重定向」→ 文件被写空、文本跑进 stdout ✗,于是「安装器非 0 退出码就告警」那条
    一直是死代码。现在改成把重定向写在命令前面,退出码正常落盘,装失败时日志里能看见它。
  • 探针自包含(只用标准库、不读你的配置以外的东西、不走系统代理),跑完自删;
    内嵌 Python 或探针缺失时自动退回旧判据(不影响升级本身)。

⚠️ 如果你装过 v2.0.8.0 且 Web UI 打不开 / 托盘说「服务未响应」:
重新运行本安装包即可恢复(会自动停服务 → 补齐文件 → 再启动服务;配置与密码不变)。

🔴 紧急修复(相对 v2.0.8.0)

  • 修「升级时安装中途回滚把安装弄坏」:托盘进程锁着 {app}\python\libcrypto-3.dll,
    安装器替换它失败后静默模式会 Abort 并回滚 ✗ —— 结果新脚本已就位、新增的 metrics.py
    被回滚删掉,服务启动即崩、Web UI 端口消失。现在安装器在写任何文件之前先请走托盘
    (只匹配「tray.py + 本安装目录」的进程,不误伤别的程序),并且可选模块缺失时服务降级运行
    (只是少一块面板,不影响登录与页面)。

⚠️ 装过 v2.0.9.0 且 Web UI 打不开 / 托盘说「服务未响应」的话:重新运行本安装包即可恢复
(配置、密码、方案都不动)。

🔴 紧急修复(相对 v2.0.9.0)

  • 修「升级后服务起不来」:v2.0.9.0 在服务主流程里多写了一句 import protocol as _protocol_mod,
    而 Python 里函数内的 import 会让该名字在整个函数里变成局部变量 ✗ → 同一函数里更早的
    _protocol_mod._attach(...) 直接 UnboundLocalError → 服务启动即退 ✗(nssm 配的是
    AppExit=Ignore,不会自动重启,所以表现成"服务在跑、网页打不开")。
    已删掉该行,并加静态守卫:服务里出现「函数内 import 模块别名」一律判失败。

✨ 新增(相对 v2.0.8.1)

  • 配置方案:给「教室 / 宿舍 / 家里」各存一套位置相关设置(认证网关、检查间隔、
    网络位置守卫白名单),配置页一键切换;填了「自动匹配的 Wi-Fi 名」的方案还能在打开
    「按 Wi-Fi 名自动切换」后自动切换(默认关)。
  • 账号、密码、升级设置不会进方案,切换方案也不动它们 —— 换的只是"哪儿该不该登录"。
  • 新增 GET /api/profiles 与 POST /api/profiles/save|activate|delete|auto 四个写接口
    (老接口与老配置完全不受影响)。

✨ 新增(相对 v2.0.7.1)

  • 连接质量面板:状态页新增「在线率(近 7 天)/ 掉线重登 / 平均恢复耗时 / 当前延迟」
    与一张近 7 天柱状图。数据全部从已有日志现算,不新增状态文件 —— 服务重启不清零、
    升级不丢数据。延迟量的是到校园网关的 TCP 握手(校园网常禁 ping)。
  • 接口 GET /api/metrics?days=7(1–30 天);面板属于锦上添花:日志被删、参数非法、
    统计出错都只在面板上显示空白,不影响状态页其它部分。

🔧 修复(相对 v2.0.7.0)

  • 升级后托盘会自己换上新代码:以前升级只换了磁盘上的文件,正在跑的托盘还留在内存里的
    旧版本 —— 于是像「睡醒 / 换网立刻重连」这种新功能要等到下次注销 / 重启才生效 ✗。
    现在托盘盯着自己的脚本指纹(mtime + 大小),一变就先放开单实例锁 → 起新进程 → 自己退出;
    万一新进程起不来,会把锁拿回来继续跑(只记一行日志,不会反复重试)。

✨ 新增(相对 v2.0.6.3)

  • 睡醒 / 换网之后立刻重连:以前合盖睡一觉、插网线、换 Wi-Fi 之后,服务可能要等到下一次
    周期检查(默认 30 分钟)才补上登录 ✗。现在托盘盯着这两类事件 —— 系统唤醒(等 4 秒让网卡
    连上)与网络地址变化(立刻)—— 一到就触发一次登录检查。
  • 事件有 5 秒去抖(唤醒时电源 + 无线 + DHCP 常常连着来);拿不到事件时自动退化成原来的
    10 秒轮询,不会因为新功能变脆弱。

🔧 修复(相对 v2.0.6.2)

  • 升级 / 检查按钮不再「假成功」:先点「立即检查更新」、紧接着点「立即升级」时,
    第二个请求会被升级锁挡掉,但接口一律先回「已提交」✗ —— 界面提示「升级已启动」,
    实际什么都没发生。现在两个入口先探锁再回车:忙就回 409 + 当前进度
    (「任务进行中(检查 GitHub 最新版本...),请稍候再试」),空闲才回「已提交」并真的开跑。

🔧 修复(相对 v2.0.6.1)

  • 自动升级上来的用户,托盘也会自启了:之前从旧版升级上来时,安装器不知道新加的
    「托盘」任务,启动项会被跳过 ✗。现在改由服务每次启动对齐(安装器把开关记进注册表,
    服务据此建 / 修 / 删启动项)—— 不论你从哪个版本升上来都能自愈。

🔧 修复(相对 v2.0.6.0)

  • 托盘自启项改挂 HKLM:原来是 HKCU,而自动升级以 SYSTEM 身份运行安装器 →
    会写进 SYSTEM 的配置单元,真实用户登录时托盘不会自启。现在对每个登录用户都生效。
  • 卸载后不再留孤儿图标:安装目录里找不到自己的脚本(连续两次轮询)时托盘自行退出。

✨ 新增:托盘图标 + 断线通知

  • 装完会多一个通知区图标(默认随开机启动,安装向导里可取消勾选)。掉线、恢复、
    服务未响应时会弹气泡提醒,不用再自己盯着网页看。
  • 右键图标:打开配置页 / 立即登录 / 打开日志目录 / 退出托盘;双击图标打开配置页;
    鼠标悬停看当前状态(含当前 Wi-Fi 名)。
  • 通知有防刷屏:刚开机不弹;偶发一次连不上服务不弹(连续 3 次 ≈30 秒才报「服务无响应」);
    同一状态不重复弹。
  • 它是个独立的小程序(tray.py,随登录会话运行)—— 服务本身跑在后台会话里,没法直接弹通知。
    只用管理员权限才能在 Program Files 写日志,所以托盘自己的日志在
    %LOCALAPPDATA%\DrcomAutoLogin\tray.log。
  • 接口、配置结构、服务名、AppId 全未动(PATCH +1),老配置与升级路径不受影响。

安装包信息

项 值
应用版本 2.1.3.0 "Vega"
文件名 StardustFlashLink-Setup-v2.1.3.0.exe
大小 11943884 bytes(约 11.39 MB)
SHA256 bf13a399bba9c350e67b49298bd8212b27ebc85e4da6a839e8742373a151bdc4
构建提交 f071807
构建编号 #76
构建时间 2026-09-29
系统要求 Windows 10/11 x64(安装包已内嵌 Python,无需预装)

安装后会自动注册系统服务、创建桌面与开始菜单快捷方式。
首次使用请通过 Web UI(http://127.0.0.1:8848)填写账号与密码。

升级本版前请注意:若你的机器上 nssm 的 AppExit 曾被写成空值,需要管理员执行一次
nssm set DrcomAutoLogin AppExit Default Ignore;服务下次启动时也会尝试自愈。

用户机器验证步骤(装包后跑)

Get-Service DrcomAutoLogin | Select-Object Status, StartType
(Invoke-WebRequest http://127.0.0.1:8848/api/config -UseBasicParsing -TimeoutSec 10).StatusCode   # 必须是 200,且不能挂住
Get-Content "D:\Program Files\DrcomAutoLogin\logs\service_stderr.log" -Tail 30
Get-Content "D:\Program Files\DrcomAutoLogin\logs\campus_login.log" -Tail 50 | Select-String -Pattern "NameError|ModuleNotFound"
Get-Content "D:\Program Files\DrcomAutoLogin\logs\upgrade.log" -Tail 20

预期:Status=Running;/api/config 立刻 200(配置页能读到值、保存立即生效);
stderr 无 ModuleNotFoundError;campus_login.log 无 NameError;
upgrade.log 不再出现「几十秒一轮的下载 → 装 → 重启」死循环。
自动升级过的话,upgrade.log 里还应看到
升级执行器结果:installer_rc=0 / service=RUNNING / health=OK(前两项是 v2...

Read more

v2.1.2.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 15:20
f187545

Windows 安装程序 v2.1.2.0 "Vega"(织女星)(Inno Setup 自动构建 · 安装包已内嵌 Python,无需预装)。

本版变更

🏷 本版是 2.1 线(Vega 织女星)的界面重做版:状态 / 配置 / 日志 / 关于四页的
信息架构重新排过,「星尘风」成为默认主题,全站字体统一到 MiSans ✓。
接口、配置结构、服务名、AppId、安装路径都没动 —— 老配置与升级路径不受影响 ✓。

🎨 四页信息架构重做(本版重点)

  • 状态页:状态与「立即登录」合成一张卡;下面两条统计条 —— 日常 5 格
    (网络可达性 / 当前账号 / 上次登录 / 上次错误 / 下次检查)+ 诊断 4 格
    (在线率 / 掉线重登 / 平均恢复耗时 / 当前延迟);右栏是「账户与登录密码」。
    诊断指标不再折叠,一进页面就能看全 ✓。
  • 配置页:左栏「配置方案 + 网络与服务端口」、右栏「自动化」——
    升级相关整块搬去了「关于 → 更新」(配置页只留「本机怎么上网」的事)✓。
  • 日志页:改成终端窗口(红黄绿灯 + 行数 / 偏移 / 体积 + 过滤 + 自动滚动),
    下面是「日志占用与诊断包」✓。
  • 关于页:版本 / 运行时长 → 更新(结论条 + 立即检查 / 立即升级 / 查看升级历史 +
    升级流水 + 折叠的「升级设置(进阶)」)→ 数据与文件位置 → 服务与维护 ✓。

🌟 新默认主题「星尘风」+ 全站字体统一

  • 右上角一键三态循环:星尘(新默认)→ 亮色 → 暗色;老主题不受影响 ✓。
  • 字体统一到 MiSans(本机装了就用,没装自动退回系统字体栈 —— 不挑电脑、不缺字)✓。

🧹 界面瘦身

  • 撤掉界面上那些「实现说明」:顶栏的监听 / 数据位置提示条、诊断指标的数据来源脚注、
    凭据说明段;「关于」页的安装方式判据改到徽标悬停提示上(想核对时鼠标停一下就有)✓。
  • 删掉「连接质量」柱图板块(4 项诊断指标已经常显在状态页)✓。

🔧 排版修复

  • 长路径只在目录分隔符后换行,不再断出「…config.js / on」这种半截文件名 ✓;
  • 统计条里的日期不再折成三行(最多两行:日期 / 时间)✓;
  • 卡片间距统一到一套令牌,各页左右边界与行距对齐 ✓;
  • 「服务与维护」的按钮改成小尺寸,窄栏里不再占两行 ✓。

⚡ v2.1.1.0:网络一变就立刻登录

  • 刚连上 Wi-Fi 不用再等:以前要等到下一个检查周期(最长 60 分钟)才会登录,
    现在网络一通、或换到另一个 Wi-Fi,几秒内就会自动检查并登录 ✓。
  • 场景切换当场生效:走进教学楼 / 回到宿舍,配置方案(网关、间隔、账号、后缀、守卫白名单)
    会立刻跟着切 ✓ —— 方案里现在可以带账号与后缀了,所以「宿舍用移动账号、
    教学楼用校园账号 + 无尾缀」这类用法能真正跑起来 ✓(老方案不受影响 ✓)。

📶 配置页能直接选 Wi-Fi 名

  • 「允许的 Wi-Fi 名称」下面会显示当前 Wi-Fi,并把「保存过的 / 附近可见的」名字列成
    可点的按钮 —— 点一下就填进去,不用再手打 ✓(手打错一个字母就会一直不生效 ✗)。
  • 「配置方案」里的「自动匹配的 Wi-Fi 名」也有一键「用当前 Wi-Fi」✓。

👤 多账号(可选)

  • 想给某个方案单独用一份密码:在安装目录里放 password.<方案名>.txt(一行密码),
    该方案生效时会优先用它;没有这个文件就照旧用 password.txt ✓。
  • 密码永远只存在本机文件里 —— 不写进 config.json ✓、不进诊断包 ✓、界面不回显 ✓。

🔒 安全

  • 诊断包里的账号脱敏现在覆盖所有账号(含方案里存的)✓,并且不再改动运行中的配置 ✓。

🔧 修复 / 加固(相对 v2.1.0.0 之前)

🔒 安全 / 修复(相对 v2.0.14.0)

  • 登录失败不再可能把密码写进日志:登录用的是 GET、密码就在网址里,某些网络错误的
    文字里会带上整条网址 —— 现在日志与错误提示只保留「错误类型 / HTTP 状态码」,
    网址与密码参数会被自动擦掉(<url> / ***)。
  • 状态页的「下次检查」时间不再跳:以前服务与调度线程各写一次、两个值来回闪;
    现在只在需要时写一次。
  • 卸载更省心:删除用户数据那一步补上了默认选项与超时(无人值守时不会卡住,默认保留数据)。
  • 源码安装不再挑 Python 版本路径:以前写死 C:\Python314,现在自动找 py 启动器
    或常见安装位置。
  • 两个批处理脚本头部写明了已知限制:安装路径里不能含 !(cmd 的延迟展开会吃掉它)。

🔧 修复 / 加固(相对 v2.0.13.0)

  • 配置导入不再怕「zip 炸弹」:以前只看上传文件大小,一个很小的 zip 能解出几十 GB;
    现在导入前会先检查解压后的体积(单文件 ≤ 4 MB、合计 ≤ 8 MB),超了直接拒绝。
    导入包里字段类型写错也不再报 500,而是明确告诉你哪里不对(400)。
  • 账号没填也能保存其它设置:以前账号为空时整份配置都存不下去(连「自动升级」开关都改不了);
    现在账号可以留空,服务会跳过登录并在状态页提示「账号未设置」(不计入退避)。
  • 定时检查更结实:以前周期线程一旦遇到异常就会静默退出(之后再也不会自动登录);
    现在会记一条带原因的日志、停一会儿继续跑。

🔒 加固(相对 v2.0.12.0)

  • 安全响应头:页面与接口现在都带 CSP(default-src 'none',只放宽内联脚本与样式 ——
    因为页面本来就是全内联的)、X-Frame-Options: DENY(禁止被任何页面嵌框)、
    X-Content-Type-Options: nosniff、Referrer-Policy: no-referrer、Permissions-Policy
    (定位 / 摄像头 / 麦克风全部禁用)。
  • 请求体上限:JSON 接口最多收 1 MB,超出直接回 413(以前是无条件读进来)。
    拒绝时会先把已到达的字节排空再干净关连接 —— 否则 Windows 会因未读数据发 RST,
    把 413 本身冲掉。
  • 运行时单实例锁:手工再跑一份服务时,第二份现在什么都不做就退出(以前会先把
    定时检查跑起来);升级 / 重启时对旧进程宽容,最多等 20 秒。

✨ 新增(相对 v2.0.11.0)

  • 日志不再无限长大:业务日志超过 5 MB 自动轮转(保留 3 份旧档,合计 ≤ 20 MB),
    升级日志超过 2 MB 轮转(保留 2 份)—— 以前只能靠你自己去删。
    状态页「近 7 天」的统计会把旧档一起读,轮转不会让数字凭空变少。
  • 一键诊断包(已脱敏):「关于 → 日志与诊断」里能看到各日志占用,并一键下载诊断包 ——
    里面是版本 / 运行环境 / 服务状态 + 脱敏后的配置 + 各日志尾部(每个 ≤ 512 KB)。
    账号打码成「前 4 位 + ******」、MAC 打码、不含任何密码;校园网内网 IP 与 Wi-Fi 名会保留
    (排障需要),分享前请自行确认。反馈问题时发它,比截图 + 口述都准。

✨ 新增(相对 v2.0.10.0)

  • 升级前备份整目录 + 升级失败自动回滚:以前升级前只留一个 联网_service.py 的副本
    (还放在 %TEMP%),真要是新版本起不来,别的模块就回不去了 ✗。现在升级前会把全部代码文件
    备份到安装目录的 backup\<旧版本>\(每个文件都记 sha256),并且:
    • 执行器在两轮健康探测都探不到服务时,自动还原这些文件、重启服务、再探一次;
    • Web UI「配置 → 自动升级 → 版本回滚」也能手动一键回退到某个备份版本(服务会重启,约 15 秒)。
  • 回滚只动代码:config.json、密码、配置方案都不动(备份里那份 config.json 只供你人工比对)。
    备份保留 7 天、至少留最新 2 份;卸载时一并清掉。
  • 安全兜底:备份被改坏、清单缺失、版本对不上、清单里文件名带路径分隔符 → 一律拒绝回滚
    且不写任何文件(宁可不动,也不写出一套「半新半旧」的代码)。
  • 顺带修掉一个陷阱:升级后的启动自检原先「找不到旧式备份就直接跳过」,换备份方案后会把
    升级结果确认、AppExit 自愈、托盘自启项对齐全部跳过 ✗ —— 现在照常执行。

✨ 新增(相对 v2.0.9.1)

  • 升级收尾改探 HTTP 健康端点:自动升级跑完安装器后,执行器会用随包内嵌的 Python 探一次
    http://127.0.0.1:<你的端口>/api/health —— 只有拿到 {"ok": true} 才算「服务真的活了」。
    此前只看 sc query,而那是 nssm 的 wrapper:里面的 Python 崩了它照样显示 RUNNING
    (AppExit=Ignore:不重启也不报错),所以「升级把服务弄挂了」以前要等你自己发现 ✗。
  • 探不到就自动重启重试:先 sc stop + sc start 重启一次服务,再给一个窗口重探。
  • 失败会留下明确告警:结论写进 logs\upgrade.log(中文、带时间戳)。
    服务真起不来时 Web UI 也打不开,那行日志就是唯一的告警面 ——
    托盘右键「打开日志目录」即可看到,里面会写明「服务可能没起来」与下一步该看哪个日志。
  • 顺手修掉一个从 v2.0.4.2 起就在的老坑:升级记录里的 installer_rc=(安装器退出码)其实
    从来没真正写下来过 —— echo installer_rc=0>"…" 里的数字紧贴 >,cmd 会把它当成
    「句柄 0 重定向」→ 文件被写空、文本跑进 stdout ✗,于是「安装器非 0 退出码就告警」那条
    一直是死代码。现在改成把重定向写在命令前面,退出码正常落盘,装失败时日志里能看见它。
  • 探针自包含(只用标准库、不读你的配置以外的东西、不走系统代理),跑完自删;
    内嵌 Python 或探针缺失时自动退回旧判据(不影响升级本身)。

⚠️ 如果你装过 v2.0.8.0 且 Web UI 打不开 / 托盘说「服务未响应」:
重新运行本安装包即可恢复(会自动停服务 → 补齐文件 → 再启动服务;配置与密码不变)。

🔴 紧急修复(相对 v2.0.8.0)

  • 修「升级时安装中途回滚把安装弄坏」:托盘进程锁着 {app}\python\libcrypto-3.dll,
    安装器替换它失败后静默模式会 Abort 并回滚 ✗ —— 结果新脚本已就位、新增的 metrics.py
    被回滚删掉,服务启动即崩、Web UI 端口消失。现在安装器在写任何文件之前先请走托盘
    (只匹配「tray.py + 本安装目录」的进程,不误伤别的程序),并且可选模块缺失时服务降级运行
    (只是少一块面板,不影响登录与页面)。

⚠️ 装过 v2.0.9.0 且 Web UI 打不开 / 托盘说「服务未响应」的话:重新运行本安装包即可恢复
(配置、密码、方案都不动)。

🔴 紧急修复(相对 v2.0.9.0)

  • 修「升级后服务起不来」:v2.0.9.0 在服务主流程里多写了一句 import protocol as _protocol_mod,
    而 Python 里函数内的 import 会让该名字在整个函数里变成局部变量 ✗ → 同一函数里更早的
    _protocol_mod._attach(...) 直接 UnboundLocalError → 服务启动即退 ✗(nssm 配的是
    AppExit=Ignore,不会自动重启,所以表现成"服务在跑、网页打不开")。
    已删掉该行,并加静态守卫:服务里出现「函数内 import 模块别名」一律判失败。

✨ 新增(相对 v2.0.8.1)

  • 配置方案:给「教室 / 宿舍 / 家里」各存一套位置相关设置(认证网关、检查间隔、
    网络位置守卫白名单),配置页一键切换;填了「自动匹配的 Wi-Fi 名」的方案还能在打开
    「按 Wi-Fi 名自动切换」后自动切换(默认关)。
  • 账号、密码、升级设置不会进方案,切换方案也不动它们 —— 换的只是"哪儿该不该登录"。
  • 新增 GET /api/profiles 与 POST /api/profiles/save|activate|delete|auto 四个写接口
    (老接口与老配置完全不受影响)。

✨ 新增(相对 v2.0.7.1)

  • 连接质量面板:状态页新增「在线率(近 7 天)/ 掉线重登 / 平均恢复耗时 / 当前延迟」
    与一张近 7 天柱状图。数据全部从已有日志现算,不新增状态文件 —— 服务重启不清零、
    升级不丢数据。延迟量的是到校园网关的 TCP 握手(校园网常禁 ping)。
  • 接口 GET /api/metrics?days=7(1–30 天);面板属于锦上添花:日志被删、参数非法、
    统计出错都只在面板上显示空白,不影响状态页其它部分。

🔧 修复(相对 v2.0.7.0)

  • 升级后托盘会自己换上新代码:以前升级只换了磁盘上的文件,正在跑的托盘还留在内存里的
    旧版本 —— 于是像「睡醒 / 换网立刻重连」这种新功能要等到下次注销 / 重启才生效 ✗。
    现在托盘盯着自己的脚本指纹(mtime + 大小),一变就先放开单实例锁 → 起新进程 → 自己退出;
    万一新进程起不来,会把锁拿回来继续跑(只记一行日志,不会反复重试)。

✨ 新增(相对 v2.0.6.3)

  • 睡醒 / 换网之后立刻重连:以前合盖睡一觉、插网线、换 Wi-Fi 之后,服务可能要等到下一次
    周期检查(默认 30 分钟)才补上登录 ✗。现在托盘盯着这两类事件 —— 系统唤醒(等 4 秒让网卡
    连上)与网络地址变化(立刻)—— 一到就触发一次登录检查。
  • 事件有 5 秒去抖(唤醒时电源 + 无线 + DHCP 常常连着来);拿不到事件时自动退化成原来的
    10 秒轮询,不会因为新功能变脆弱。

🔧 修复(相对 v2.0.6.2)

  • 升级 / 检查按钮不再「假成功」:先点「立即检查更新」、紧接着点「立即升级」时,
    第二个请求会被升级锁挡掉,但接口一律先回「已提交」✗ —— 界面提示「升级已启动」,
    实际什么都没发生。现在两个入口先探锁再回车:忙就回 409 + 当前进度
    (「任务进行中(检查 GitHub 最新版本...),请稍候再试」),空闲才回「已提交」并真的开跑。

🔧 修复(相对 v2.0.6.1)

  • 自动升级上来的用户,托盘也会自启了:之前从旧版升级上来时,安装器不知道新加的
    「托盘」任务,启动项会被跳过 ✗。现在改由服务每次启动对齐(安装器把开关记进注册表,
    服务据此建 / 修 / 删启动项)—— 不论你从哪个版本升上来都能自愈。

🔧 修复(相对 v2.0.6.0)

  • 托盘自启项改挂 HKLM:原来是 HKCU,而自动升级以 SYSTEM 身份运行安装器 →
    会写进 SYSTEM 的配置单元,真实用户登录时托盘不会自启。现在对每个登录用户都生效。
  • 卸载后不再留孤儿图标:安装目录里找不到自己的脚本(连续两次轮询)时托盘自行退出。

✨ 新增:托盘图标 + 断线通知

  • 装完会多一个通知区图标(默认随开机启动,安装向导里可取消勾选)。掉线、恢复、
    服务未响应时会弹气泡提醒,不用再自己盯着网页看。
  • 右键图标:打开配置页 / 立即登录 / 打开日志目录 / 退出托盘;双击图标打开配置页;
    鼠标悬停看当前状态(含当前 Wi-Fi 名)。
  • 通知有防刷屏:刚开机不弹;偶发一次连不上服务不弹(连续 3 次 ≈30 秒才报「服务无响应」);
    同一状态不重复弹。
  • 它是个独立的小程序(tray.py,随登录会话运行)—— 服务本身跑在后台会话里,没法直接弹通知。
    只用管理员权限才能在 Program Files 写日志,所以托盘自己的日志在
    %LOCALAPPDATA%\DrcomAutoLogin\tray.log。
  • 接口、配置结构、服务名、AppId 全未动(PATCH +1),老配置与升级路径不受影响。

安装包信息

项 值
应用版本 2.1.2.0 "Vega"
文件名 StardustFlashLink-Setup-v2.1.2.0.exe
大小 11938372 bytes(约 11.39 MB)
SHA256 fa9a4a6d8da145d669aeb31ad969637302f3a863e959aed295f3607f2756d0c0
构建提交 f187545
构建编号 #75
构建时间 2026-09-29
系统要求 Windows 10/11 x64(安装包已内嵌 Python,无需预装)

安装后会自动注册系统服务、创建桌面与开始菜单快捷方式。
首次使用请通过 Web UI(http://127.0.0.1:8848)填写账号与密码。

升级本版前请注意:若你的机器上 nssm 的 AppExit 曾被写成空值,需要管理员执行一次
nssm set DrcomAutoLogin AppExit Default Ignore;服务下次启动时也会尝试自愈。

用户机器验证步骤(装包后跑)

Get-Service DrcomAutoLogin | Select-Object Status, StartType
(Invoke-WebRequest http://127.0.0.1:8848/api/config -UseBasicParsing -TimeoutSec 10).StatusCode   # 必须是 200,且不能挂住
Get-Content "D:\Program Files\DrcomAutoLogin\logs\service_stderr.log" -Tail 30
Get-Content "D:\Program Files\DrcomAutoLogin\logs\campus_login.log" -Tail 50 | Select-String -Pattern "NameError|ModuleNotFound"
Get-Content "D:\Program Files\DrcomAutoLogin\logs\upgrade.log" -Tail 20

预期:Status=Running;/api/config 立刻 200(配置页能读到值、保存立即生效);
stderr 无 ModuleNotFoundError;campus_login.log 无 NameError;
upgrade.log 不再出现「几十秒一轮的下载 → 装 → 重启」死循环。
自动升级过的话,upgrade.log 里还应看到
升级执行器结果:installer_rc=0 / service=RUNNING / health=OK(前两项是 v2.0.4.2 的退出码与
服务状态回报,health= 是 v2.0.10.0 新增的 HTTP 健康探测结论 ——
OK 表示服务真的答上了 /api/health,比 sc query 可信)。
若这里是 health=FAIL,同一份日志里还会有一行「升级看门狗:HTTP 健康检查未通过」写明原因。

校验

certutil -hashfile StardustFlashLink-Setup-v2.1.2.0.exe SHA256

本 release 是自动升级通道(非 prerelease):客户端读 /releases/latest 取版本号与 asset digest(fail-closed 校验)。
固定下载链接仍见 prerelease installer。

v2.1.1.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 10:43
7786fdf

Windows 安装程序 v2.1.1.0 "Vega"(织女星)(Inno Setup 自动构建 · 安装包已内嵌 Python,无需预装)。

本版变更

🏷 本版是 2.1 线(代号 Vega 织女星)的第一次功能更新:把「网络一变就登」
和「多网络多账号」补上 ✓。代号、服务名、安装路径、配置结构都没有破坏性变化 ✓。

⚡ 网络一变就立刻登录(本版重点)

  • 刚连上 Wi-Fi 不用再等:以前要等到下一个检查周期(最长 60 分钟)才会登录,
    现在网络一通、或换到另一个 Wi-Fi,几秒内就会自动检查并登录 ✓。
  • 场景切换当场生效:走进教学楼 / 回到宿舍,配置方案(网关、间隔、账号、后缀、守卫白名单)
    会立刻跟着切 ✓ —— 方案里现在可以带账号与后缀了,所以「宿舍用移动账号、
    教学楼用校园账号 + 无尾缀」这类用法能真正跑起来 ✓(老方案不受影响 ✓)。

📶 配置页能直接选 Wi-Fi 名

  • 「允许的 Wi-Fi 名称」下面会显示当前 Wi-Fi,并把「保存过的 / 附近可见的」名字列成
    可点的按钮 —— 点一下就填进去,不用再手打 ✓(手打错一个字母就会一直不生效 ✗)。
  • 「配置方案」里的「自动匹配的 Wi-Fi 名」也有一键「用当前 Wi-Fi」✓。

👤 多账号(可选)

  • 想给某个方案单独用一份密码:在安装目录里放 password.<方案名>.txt(一行密码),
    该方案生效时会优先用它;没有这个文件就照旧用 password.txt ✓。
  • 密码永远只存在本机文件里 —— 不写进 config.json ✓、不进诊断包 ✓、界面不回显 ✓。

🔒 安全

  • 诊断包里的账号脱敏现在覆盖所有账号(含方案里存的)✓,并且不再改动运行中的配置 ✓。

🔧 修复 / 加固(相对 v2.1.0.0 之前)

🔒 安全 / 修复(相对 v2.0.14.0)

  • 登录失败不再可能把密码写进日志:登录用的是 GET、密码就在网址里,某些网络错误的
    文字里会带上整条网址 —— 现在日志与错误提示只保留「错误类型 / HTTP 状态码」,
    网址与密码参数会被自动擦掉(<url> / ***)。
  • 状态页的「下次检查」时间不再跳:以前服务与调度线程各写一次、两个值来回闪;
    现在只在需要时写一次。
  • 卸载更省心:删除用户数据那一步补上了默认选项与超时(无人值守时不会卡住,默认保留数据)。
  • 源码安装不再挑 Python 版本路径:以前写死 C:\Python314,现在自动找 py 启动器
    或常见安装位置。
  • 两个批处理脚本头部写明了已知限制:安装路径里不能含 !(cmd 的延迟展开会吃掉它)。

🔧 修复 / 加固(相对 v2.0.13.0)

  • 配置导入不再怕「zip 炸弹」:以前只看上传文件大小,一个很小的 zip 能解出几十 GB;
    现在导入前会先检查解压后的体积(单文件 ≤ 4 MB、合计 ≤ 8 MB),超了直接拒绝。
    导入包里字段类型写错也不再报 500,而是明确告诉你哪里不对(400)。
  • 账号没填也能保存其它设置:以前账号为空时整份配置都存不下去(连「自动升级」开关都改不了);
    现在账号可以留空,服务会跳过登录并在状态页提示「账号未设置」(不计入退避)。
  • 定时检查更结实:以前周期线程一旦遇到异常就会静默退出(之后再也不会自动登录);
    现在会记一条带原因的日志、停一会儿继续跑。

🔒 加固(相对 v2.0.12.0)

  • 安全响应头:页面与接口现在都带 CSP(default-src 'none',只放宽内联脚本与样式 ——
    因为页面本来就是全内联的)、X-Frame-Options: DENY(禁止被任何页面嵌框)、
    X-Content-Type-Options: nosniff、Referrer-Policy: no-referrer、Permissions-Policy
    (定位 / 摄像头 / 麦克风全部禁用)。
  • 请求体上限:JSON 接口最多收 1 MB,超出直接回 413(以前是无条件读进来)。
    拒绝时会先把已到达的字节排空再干净关连接 —— 否则 Windows 会因未读数据发 RST,
    把 413 本身冲掉。
  • 运行时单实例锁:手工再跑一份服务时,第二份现在什么都不做就退出(以前会先把
    定时检查跑起来);升级 / 重启时对旧进程宽容,最多等 20 秒。

✨ 新增(相对 v2.0.11.0)

  • 日志不再无限长大:业务日志超过 5 MB 自动轮转(保留 3 份旧档,合计 ≤ 20 MB),
    升级日志超过 2 MB 轮转(保留 2 份)—— 以前只能靠你自己去删。
    状态页「近 7 天」的统计会把旧档一起读,轮转不会让数字凭空变少。
  • 一键诊断包(已脱敏):「关于 → 日志与诊断」里能看到各日志占用,并一键下载诊断包 ——
    里面是版本 / 运行环境 / 服务状态 + 脱敏后的配置 + 各日志尾部(每个 ≤ 512 KB)。
    账号打码成「前 4 位 + ******」、MAC 打码、不含任何密码;校园网内网 IP 与 Wi-Fi 名会保留
    (排障需要),分享前请自行确认。反馈问题时发它,比截图 + 口述都准。

✨ 新增(相对 v2.0.10.0)

  • 升级前备份整目录 + 升级失败自动回滚:以前升级前只留一个 联网_service.py 的副本
    (还放在 %TEMP%),真要是新版本起不来,别的模块就回不去了 ✗。现在升级前会把全部代码文件
    备份到安装目录的 backup\<旧版本>\(每个文件都记 sha256),并且:
    • 执行器在两轮健康探测都探不到服务时,自动还原这些文件、重启服务、再探一次;
    • Web UI「配置 → 自动升级 → 版本回滚」也能手动一键回退到某个备份版本(服务会重启,约 15 秒)。
  • 回滚只动代码:config.json、密码、配置方案都不动(备份里那份 config.json 只供你人工比对)。
    备份保留 7 天、至少留最新 2 份;卸载时一并清掉。
  • 安全兜底:备份被改坏、清单缺失、版本对不上、清单里文件名带路径分隔符 → 一律拒绝回滚
    且不写任何文件(宁可不动,也不写出一套「半新半旧」的代码)。
  • 顺带修掉一个陷阱:升级后的启动自检原先「找不到旧式备份就直接跳过」,换备份方案后会把
    升级结果确认、AppExit 自愈、托盘自启项对齐全部跳过 ✗ —— 现在照常执行。

✨ 新增(相对 v2.0.9.1)

  • 升级收尾改探 HTTP 健康端点:自动升级跑完安装器后,执行器会用随包内嵌的 Python 探一次
    http://127.0.0.1:<你的端口>/api/health —— 只有拿到 {"ok": true} 才算「服务真的活了」。
    此前只看 sc query,而那是 nssm 的 wrapper:里面的 Python 崩了它照样显示 RUNNING
    (AppExit=Ignore:不重启也不报错),所以「升级把服务弄挂了」以前要等你自己发现 ✗。
  • 探不到就自动重启重试:先 sc stop + sc start 重启一次服务,再给一个窗口重探。
  • 失败会留下明确告警:结论写进 logs\upgrade.log(中文、带时间戳)。
    服务真起不来时 Web UI 也打不开,那行日志就是唯一的告警面 ——
    托盘右键「打开日志目录」即可看到,里面会写明「服务可能没起来」与下一步该看哪个日志。
  • 顺手修掉一个从 v2.0.4.2 起就在的老坑:升级记录里的 installer_rc=(安装器退出码)其实
    从来没真正写下来过 —— echo installer_rc=0>"…" 里的数字紧贴 >,cmd 会把它当成
    「句柄 0 重定向」→ 文件被写空、文本跑进 stdout ✗,于是「安装器非 0 退出码就告警」那条
    一直是死代码。现在改成把重定向写在命令前面,退出码正常落盘,装失败时日志里能看见它。
  • 探针自包含(只用标准库、不读你的配置以外的东西、不走系统代理),跑完自删;
    内嵌 Python 或探针缺失时自动退回旧判据(不影响升级本身)。

⚠️ 如果你装过 v2.0.8.0 且 Web UI 打不开 / 托盘说「服务未响应」:
重新运行本安装包即可恢复(会自动停服务 → 补齐文件 → 再启动服务;配置与密码不变)。

🔴 紧急修复(相对 v2.0.8.0)

  • 修「升级时安装中途回滚把安装弄坏」:托盘进程锁着 {app}\python\libcrypto-3.dll,
    安装器替换它失败后静默模式会 Abort 并回滚 ✗ —— 结果新脚本已就位、新增的 metrics.py
    被回滚删掉,服务启动即崩、Web UI 端口消失。现在安装器在写任何文件之前先请走托盘
    (只匹配「tray.py + 本安装目录」的进程,不误伤别的程序),并且可选模块缺失时服务降级运行
    (只是少一块面板,不影响登录与页面)。

⚠️ 装过 v2.0.9.0 且 Web UI 打不开 / 托盘说「服务未响应」的话:重新运行本安装包即可恢复
(配置、密码、方案都不动)。

🔴 紧急修复(相对 v2.0.9.0)

  • 修「升级后服务起不来」:v2.0.9.0 在服务主流程里多写了一句 import protocol as _protocol_mod,
    而 Python 里函数内的 import 会让该名字在整个函数里变成局部变量 ✗ → 同一函数里更早的
    _protocol_mod._attach(...) 直接 UnboundLocalError → 服务启动即退 ✗(nssm 配的是
    AppExit=Ignore,不会自动重启,所以表现成"服务在跑、网页打不开")。
    已删掉该行,并加静态守卫:服务里出现「函数内 import 模块别名」一律判失败。

✨ 新增(相对 v2.0.8.1)

  • 配置方案:给「教室 / 宿舍 / 家里」各存一套位置相关设置(认证网关、检查间隔、
    网络位置守卫白名单),配置页一键切换;填了「自动匹配的 Wi-Fi 名」的方案还能在打开
    「按 Wi-Fi 名自动切换」后自动切换(默认关)。
  • 账号、密码、升级设置不会进方案,切换方案也不动它们 —— 换的只是"哪儿该不该登录"。
  • 新增 GET /api/profiles 与 POST /api/profiles/save|activate|delete|auto 四个写接口
    (老接口与老配置完全不受影响)。

✨ 新增(相对 v2.0.7.1)

  • 连接质量面板:状态页新增「在线率(近 7 天)/ 掉线重登 / 平均恢复耗时 / 当前延迟」
    与一张近 7 天柱状图。数据全部从已有日志现算,不新增状态文件 —— 服务重启不清零、
    升级不丢数据。延迟量的是到校园网关的 TCP 握手(校园网常禁 ping)。
  • 接口 GET /api/metrics?days=7(1–30 天);面板属于锦上添花:日志被删、参数非法、
    统计出错都只在面板上显示空白,不影响状态页其它部分。

🔧 修复(相对 v2.0.7.0)

  • 升级后托盘会自己换上新代码:以前升级只换了磁盘上的文件,正在跑的托盘还留在内存里的
    旧版本 —— 于是像「睡醒 / 换网立刻重连」这种新功能要等到下次注销 / 重启才生效 ✗。
    现在托盘盯着自己的脚本指纹(mtime + 大小),一变就先放开单实例锁 → 起新进程 → 自己退出;
    万一新进程起不来,会把锁拿回来继续跑(只记一行日志,不会反复重试)。

✨ 新增(相对 v2.0.6.3)

  • 睡醒 / 换网之后立刻重连:以前合盖睡一觉、插网线、换 Wi-Fi 之后,服务可能要等到下一次
    周期检查(默认 30 分钟)才补上登录 ✗。现在托盘盯着这两类事件 —— 系统唤醒(等 4 秒让网卡
    连上)与网络地址变化(立刻)—— 一到就触发一次登录检查。
  • 事件有 5 秒去抖(唤醒时电源 + 无线 + DHCP 常常连着来);拿不到事件时自动退化成原来的
    10 秒轮询,不会因为新功能变脆弱。

🔧 修复(相对 v2.0.6.2)

  • 升级 / 检查按钮不再「假成功」:先点「立即检查更新」、紧接着点「立即升级」时,
    第二个请求会被升级锁挡掉,但接口一律先回「已提交」✗ —— 界面提示「升级已启动」,
    实际什么都没发生。现在两个入口先探锁再回车:忙就回 409 + 当前进度
    (「任务进行中(检查 GitHub 最新版本...),请稍候再试」),空闲才回「已提交」并真的开跑。

🔧 修复(相对 v2.0.6.1)

  • 自动升级上来的用户,托盘也会自启了:之前从旧版升级上来时,安装器不知道新加的
    「托盘」任务,启动项会被跳过 ✗。现在改由服务每次启动对齐(安装器把开关记进注册表,
    服务据此建 / 修 / 删启动项)—— 不论你从哪个版本升上来都能自愈。

🔧 修复(相对 v2.0.6.0)

  • 托盘自启项改挂 HKLM:原来是 HKCU,而自动升级以 SYSTEM 身份运行安装器 →
    会写进 SYSTEM 的配置单元,真实用户登录时托盘不会自启。现在对每个登录用户都生效。
  • 卸载后不再留孤儿图标:安装目录里找不到自己的脚本(连续两次轮询)时托盘自行退出。

✨ 新增:托盘图标 + 断线通知

  • 装完会多一个通知区图标(默认随开机启动,安装向导里可取消勾选)。掉线、恢复、
    服务未响应时会弹气泡提醒,不用再自己盯着网页看。
  • 右键图标:打开配置页 / 立即登录 / 打开日志目录 / 退出托盘;双击图标打开配置页;
    鼠标悬停看当前状态(含当前 Wi-Fi 名)。
  • 通知有防刷屏:刚开机不弹;偶发一次连不上服务不弹(连续 3 次 ≈30 秒才报「服务无响应」);
    同一状态不重复弹。
  • 它是个独立的小程序(tray.py,随登录会话运行)—— 服务本身跑在后台会话里,没法直接弹通知。
    只用管理员权限才能在 Program Files 写日志,所以托盘自己的日志在
    %LOCALAPPDATA%\DrcomAutoLogin\tray.log。
  • 接口、配置结构、服务名、AppId 全未动(PATCH +1),老配置与升级路径不受影响。

安装包信息

项 值
应用版本 2.1.1.0 "Sirius"
文件名 StardustFlashLink-Setup-v2.1.1.0.exe
大小 11929896 bytes(约 11.38 MB)
SHA256 af02668e2218fc9b3067b112a5e1314d964fb1f727506a620eed3d008226f963
构建提交 7786fdf
构建编号 #74
构建时间 2026-09-29
系统要求 Windows 10/11 x64(安装包已内嵌 Python,无需预装)

安装后会自动注册系统服务、创建桌面与开始菜单快捷方式。
首次使用请通过 Web UI(http://127.0.0.1:8848)填写账号与密码。

升级本版前请注意:若你的机器上 nssm 的 AppExit 曾被写成空值,需要管理员执行一次
nssm set DrcomAutoLogin AppExit Default Ignore;服务下次启动时也会尝试自愈。

用户机器验证步骤(装包后跑)

Get-Service DrcomAutoLogin | Select-Object Status, StartType
(Invoke-WebRequest http://127.0.0.1:8848/api/config -UseBasicParsing -TimeoutSec 10).StatusCode   # 必须是 200,且不能挂住
Get-Content "D:\Program Files\DrcomAutoLogin\logs\service_stderr.log" -Tail 30
Get-Content "D:\Program Files\DrcomAutoLogin\logs\campus_login.log" -Tail 50 | Select-String -Pattern "NameError|ModuleNotFound"
Get-Content "D:\Program Files\DrcomAutoLogin\logs\upgrade.log" -Tail 20

预期:Status=Running;/api/config 立刻 200(配置页能读到值、保存立即生效);
stderr 无 ModuleNotFoundError;campus_login.log 无 NameError;
upgrade.log 不再出现「几十秒一轮的下载 → 装 → 重启」死循环。
自动升级过的话,upgrade.log 里还应看到
升级执行器结果:installer_rc=0 / service=RUNNING / health=OK(前两项是 v2.0.4.2 的退出码与
服务状态回报,health= 是 v2.0.10.0 新增的 HTTP 健康探测结论 ——
OK 表示服务真的答上了 /api/health,比 sc query 可信)。
若这里是 health=FAIL,同一份日志里还会有一行「升级看门狗:HTTP 健康检查未通过」写明原因。

校验

certutil -hashfile StardustFlashLink-Setup-v2.1.1.0.exe SHA256

本 release 是自动升级通道(非 prerelease):客户端读 /releases/latest 取版本号与 asset digest(fail-closed 校验)。
固定下载链接仍见 prerelease installer。

Windows 安装程序 v2.1.3.0(跟随最新构建 · 固定下载链接)

Choose a tag to compare

@github-actions github-actions released this 29 Sep 16:09
f071807

Windows 安装程序 v2.1.3.0 "Vega"(织女星)(Inno Setup 自动构建 · 安装包已内嵌 Python,无需预装)。

本版变更

🏷 本版是 2.1 线(Vega 织女星)的多网络多账号版:同一个方案可以带自己的
账号与密码,切方案时连密码一起换 ✓;顺带修掉「状态页那张凭据卡存不了账号」的毛病 ✓。
接口、配置结构、服务名、AppId、安装路径都没动 —— 老配置与升级路径不受影响 ✓。

👤 ① 每个方案可以有自己的账号与密码(多网络多账号)

  • 以前方案能记住账号与后缀,但密码只有一份(公共 password.txt)——
    「宿舍用移动账号、教学楼用校园账号」这种玩法,切完方案密码还是上一个 ✗。
    现在方案可以带自己的密码:password.<方案名>.txt(一行密码)✓;
  • 配置页新增「选中方案的账号与密码」:选好方案 → 填账号 / 运营商 / 该方案的密码 →
    点「保存到选中方案」✓;想改回共用公共密码,勾上「删除该方案的专属密码」再保存 ✓;
  • 切方案连密码一起换:密码以前只在服务启动时读过一次 —— 就算方案带了专属密码,
    切完方案服务还在用旧密码,登录一路失败却「配置看着都对」✗。现在切方案后会重载密码 ✓
    (重载失败只记一条日志、不算切换失败:配置已经切好了,不该因为读不出密码再回滚 ✓);
  • 界面上看得见:方案下拉里带「专属密码」标记,编辑区上面写明「『宿舍』有专属密码文件
    (password.宿舍.txt)」✓;没设过专属密码的方案照旧用公共 password.txt ✓
    (老用户零迁移 ✓);
  • 密码仍然永不写进 config.json ✓、不进诊断包 ✓、界面不回显 ✓。

💾 ② 状态页那张凭据卡现在真的能存账号了(修复)

  • v2.1.2.0 把「账户与登录密码」从配置页搬到了状态页,但按钮沿用的还是老实现 ——
    只存密码:账号和运营商在界面上能改,点「保存」却什么都没发生(看着像存上了 ✗)。
    现在按钮叫「保存账号与密码」,一次存下账号 + 运营商 + 密码 ✓;
  • 存的姿势也修了:账号 / 运营商走部分更新(只改这两个键),
    不会再把网关 / 端口 / 间隔 / 守卫设置一起重置回默认值 ✗;改某个方案同理走合并改 ✓;
  • 卡上写明保存范围:账号与运营商进本机配置,密码永不写进配置文件 ✓(只进密码文件)。

🔧 ③ 其它修复

  • 兜底异常处理里的日志调用换成模块自带日志:以前若 logger 没被注入,这里会先报
    NameError、把真正的异常盖住 —— 客户端只看到「连接被重置」,服务端一条线索都没有 ✗;
  • 改的若正是当前方案,保存凭据后会自动重新应用一次 → 状态页立刻显示新账号 ✓。

🎨 v2.1.2.0:界面重做(四页信息架构 + 星尘风默认主题)

🏷 那是 2.1 线的界面重做版:状态 / 配置 / 日志 / 关于四页的信息架构重新排过,
「星尘风」成为默认主题,全站字体统一到 MiSans ✓。
接口、配置结构、服务名、AppId、安装路径都没动 —— 老配置与升级路径不受影响 ✓。

🎨 四页信息架构重做(本版重点)

  • 状态页:状态与「立即登录」合成一张卡;下面两条统计条 —— 日常 5 格
    (网络可达性 / 当前账号 / 上次登录 / 上次错误 / 下次检查)+ 诊断 4 格
    (在线率 / 掉线重登 / 平均恢复耗时 / 当前延迟);右栏是「账户与登录密码」。
    诊断指标不再折叠,一进页面就能看全 ✓。
  • 配置页:左栏「配置方案 + 网络与服务端口」、右栏「自动化」——
    升级相关整块搬去了「关于 → 更新」(配置页只留「本机怎么上网」的事)✓。
  • 日志页:改成终端窗口(红黄绿灯 + 行数 / 偏移 / 体积 + 过滤 + 自动滚动),
    下面是「日志占用与诊断包」✓。
  • 关于页:版本 / 运行时长 → 更新(结论条 + 立即检查 / 立即升级 / 查看升级历史 +
    升级流水 + 折叠的「升级设置(进阶)」)→ 数据与文件位置 → 服务与维护 ✓。

🌟 新默认主题「星尘风」+ 全站字体统一

  • 右上角一键三态循环:星尘(新默认)→ 亮色 → 暗色;老主题不受影响 ✓。
  • 字体统一到 MiSans(本机装了就用,没装自动退回系统字体栈 —— 不挑电脑、不缺字)✓。

🧹 界面瘦身

  • 撤掉界面上那些「实现说明」:顶栏的监听 / 数据位置提示条、诊断指标的数据来源脚注、
    凭据说明段;「关于」页的安装方式判据改到徽标悬停提示上(想核对时鼠标停一下就有)✓。
  • 删掉「连接质量」柱图板块(4 项诊断指标已经常显在状态页)✓。

🔧 排版修复

  • 长路径只在目录分隔符后换行,不再断出「…config.js / on」这种半截文件名 ✓;
  • 统计条里的日期不再折成三行(最多两行:日期 / 时间)✓;
  • 卡片间距统一到一套令牌,各页左右边界与行距对齐 ✓;
  • 「服务与维护」的按钮改成小尺寸,窄栏里不再占两行 ✓。

⚡ v2.1.1.0:网络一变就立刻登录

  • 刚连上 Wi-Fi 不用再等:以前要等到下一个检查周期(最长 60 分钟)才会登录,
    现在网络一通、或换到另一个 Wi-Fi,几秒内就会自动检查并登录 ✓。
  • 场景切换当场生效:走进教学楼 / 回到宿舍,配置方案(网关、间隔、账号、后缀、守卫白名单)
    会立刻跟着切 ✓ —— 方案里现在可以带账号与后缀了,所以「宿舍用移动账号、
    教学楼用校园账号 + 无尾缀」这类用法能真正跑起来 ✓(老方案不受影响 ✓)。

📶 配置页能直接选 Wi-Fi 名

  • 「允许的 Wi-Fi 名称」下面会显示当前 Wi-Fi,并把「保存过的 / 附近可见的」名字列成
    可点的按钮 —— 点一下就填进去,不用再手打 ✓(手打错一个字母就会一直不生效 ✗)。
  • 「配置方案」里的「自动匹配的 Wi-Fi 名」也有一键「用当前 Wi-Fi」✓。

👤 多账号(可选)

  • 想给某个方案单独用一份密码:在安装目录里放 password.<方案名>.txt(一行密码),
    该方案生效时会优先用它;没有这个文件就照旧用 password.txt ✓。
  • 密码永远只存在本机文件里 —— 不写进 config.json ✓、不进诊断包 ✓、界面不回显 ✓。

🔒 安全

  • 诊断包里的账号脱敏现在覆盖所有账号(含方案里存的)✓,并且不再改动运行中的配置 ✓。

🔧 修复 / 加固(相对 v2.1.0.0 之前)

🔒 安全 / 修复(相对 v2.0.14.0)

  • 登录失败不再可能把密码写进日志:登录用的是 GET、密码就在网址里,某些网络错误的
    文字里会带上整条网址 —— 现在日志与错误提示只保留「错误类型 / HTTP 状态码」,
    网址与密码参数会被自动擦掉(<url> / ***)。
  • 状态页的「下次检查」时间不再跳:以前服务与调度线程各写一次、两个值来回闪;
    现在只在需要时写一次。
  • 卸载更省心:删除用户数据那一步补上了默认选项与超时(无人值守时不会卡住,默认保留数据)。
  • 源码安装不再挑 Python 版本路径:以前写死 C:\Python314,现在自动找 py 启动器
    或常见安装位置。
  • 两个批处理脚本头部写明了已知限制:安装路径里不能含 !(cmd 的延迟展开会吃掉它)。

🔧 修复 / 加固(相对 v2.0.13.0)

  • 配置导入不再怕「zip 炸弹」:以前只看上传文件大小,一个很小的 zip 能解出几十 GB;
    现在导入前会先检查解压后的体积(单文件 ≤ 4 MB、合计 ≤ 8 MB),超了直接拒绝。
    导入包里字段类型写错也不再报 500,而是明确告诉你哪里不对(400)。
  • 账号没填也能保存其它设置:以前账号为空时整份配置都存不下去(连「自动升级」开关都改不了);
    现在账号可以留空,服务会跳过登录并在状态页提示「账号未设置」(不计入退避)。
  • 定时检查更结实:以前周期线程一旦遇到异常就会静默退出(之后再也不会自动登录);
    现在会记一条带原因的日志、停一会儿继续跑。

🔒 加固(相对 v2.0.12.0)

  • 安全响应头:页面与接口现在都带 CSP(default-src 'none',只放宽内联脚本与样式 ——
    因为页面本来就是全内联的)、X-Frame-Options: DENY(禁止被任何页面嵌框)、
    X-Content-Type-Options: nosniff、Referrer-Policy: no-referrer、Permissions-Policy
    (定位 / 摄像头 / 麦克风全部禁用)。
  • 请求体上限:JSON 接口最多收 1 MB,超出直接回 413(以前是无条件读进来)。
    拒绝时会先把已到达的字节排空再干净关连接 —— 否则 Windows 会因未读数据发 RST,
    把 413 本身冲掉。
  • 运行时单实例锁:手工再跑一份服务时,第二份现在什么都不做就退出(以前会先把
    定时检查跑起来);升级 / 重启时对旧进程宽容,最多等 20 秒。

✨ 新增(相对 v2.0.11.0)

  • 日志不再无限长大:业务日志超过 5 MB 自动轮转(保留 3 份旧档,合计 ≤ 20 MB),
    升级日志超过 2 MB 轮转(保留 2 份)—— 以前只能靠你自己去删。
    状态页「近 7 天」的统计会把旧档一起读,轮转不会让数字凭空变少。
  • 一键诊断包(已脱敏):「关于 → 日志与诊断」里能看到各日志占用,并一键下载诊断包 ——
    里面是版本 / 运行环境 / 服务状态 + 脱敏后的配置 + 各日志尾部(每个 ≤ 512 KB)。
    账号打码成「前 4 位 + ******」、MAC 打码、不含任何密码;校园网内网 IP 与 Wi-Fi 名会保留
    (排障需要),分享前请自行确认。反馈问题时发它,比截图 + 口述都准。

✨ 新增(相对 v2.0.10.0)

  • 升级前备份整目录 + 升级失败自动回滚:以前升级前只留一个 联网_service.py 的副本
    (还放在 %TEMP%),真要是新版本起不来,别的模块就回不去了 ✗。现在升级前会把全部代码文件
    备份到安装目录的 backup\<旧版本>\(每个文件都记 sha256),并且:
    • 执行器在两轮健康探测都探不到服务时,自动还原这些文件、重启服务、再探一次;
    • Web UI「配置 → 自动升级 → 版本回滚」也能手动一键回退到某个备份版本(服务会重启,约 15 秒)。
  • 回滚只动代码:config.json、密码、配置方案都不动(备份里那份 config.json 只供你人工比对)。
    备份保留 7 天、至少留最新 2 份;卸载时一并清掉。
  • 安全兜底:备份被改坏、清单缺失、版本对不上、清单里文件名带路径分隔符 → 一律拒绝回滚
    且不写任何文件(宁可不动,也不写出一套「半新半旧」的代码)。
  • 顺带修掉一个陷阱:升级后的启动自检原先「找不到旧式备份就直接跳过」,换备份方案后会把
    升级结果确认、AppExit 自愈、托盘自启项对齐全部跳过 ✗ —— 现在照常执行。

✨ 新增(相对 v2.0.9.1)

  • 升级收尾改探 HTTP 健康端点:自动升级跑完安装器后,执行器会用随包内嵌的 Python 探一次
    http://127.0.0.1:<你的端口>/api/health —— 只有拿到 {"ok": true} 才算「服务真的活了」。
    此前只看 sc query,而那是 nssm 的 wrapper:里面的 Python 崩了它照样显示 RUNNING
    (AppExit=Ignore:不重启也不报错),所以「升级把服务弄挂了」以前要等你自己发现 ✗。
  • 探不到就自动重启重试:先 sc stop + sc start 重启一次服务,再给一个窗口重探。
  • 失败会留下明确告警:结论写进 logs\upgrade.log(中文、带时间戳)。
    服务真起不来时 Web UI 也打不开,那行日志就是唯一的告警面 ——
    托盘右键「打开日志目录」即可看到,里面会写明「服务可能没起来」与下一步该看哪个日志。
  • 顺手修掉一个从 v2.0.4.2 起就在的老坑:升级记录里的 installer_rc=(安装器退出码)其实
    从来没真正写下来过 —— echo installer_rc=0>"…" 里的数字紧贴 >,cmd 会把它当成
    「句柄 0 重定向」→ 文件被写空、文本跑进 stdout ✗,于是「安装器非 0 退出码就告警」那条
    一直是死代码。现在改成把重定向写在命令前面,退出码正常落盘,装失败时日志里能看见它。
  • 探针自包含(只用标准库、不读你的配置以外的东西、不走系统代理),跑完自删;
    内嵌 Python 或探针缺失时自动退回旧判据(不影响升级本身)。

⚠️ 如果你装过 v2.0.8.0 且 Web UI 打不开 / 托盘说「服务未响应」:
重新运行本安装包即可恢复(会自动停服务 → 补齐文件 → 再启动服务;配置与密码不变)。

🔴 紧急修复(相对 v2.0.8.0)

  • 修「升级时安装中途回滚把安装弄坏」:托盘进程锁着 {app}\python\libcrypto-3.dll,
    安装器替换它失败后静默模式会 Abort 并回滚 ✗ —— 结果新脚本已就位、新增的 metrics.py
    被回滚删掉,服务启动即崩、Web UI 端口消失。现在安装器在写任何文件之前先请走托盘
    (只匹配「tray.py + 本安装目录」的进程,不误伤别的程序),并且可选模块缺失时服务降级运行
    (只是少一块面板,不影响登录与页面)。

⚠️ 装过 v2.0.9.0 且 Web UI 打不开 / 托盘说「服务未响应」的话:重新运行本安装包即可恢复
(配置、密码、方案都不动)。

🔴 紧急修复(相对 v2.0.9.0)

  • 修「升级后服务起不来」:v2.0.9.0 在服务主流程里多写了一句 import protocol as _protocol_mod,
    而 Python 里函数内的 import 会让该名字在整个函数里变成局部变量 ✗ → 同一函数里更早的
    _protocol_mod._attach(...) 直接 UnboundLocalError → 服务启动即退 ✗(nssm 配的是
    AppExit=Ignore,不会自动重启,所以表现成"服务在跑、网页打不开")。
    已删掉该行,并加静态守卫:服务里出现「函数内 import 模块别名」一律判失败。

✨ 新增(相对 v2.0.8.1)

  • 配置方案:给「教室 / 宿舍 / 家里」各存一套位置相关设置(认证网关、检查间隔、
    网络位置守卫白名单),配置页一键切换;填了「自动匹配的 Wi-Fi 名」的方案还能在打开
    「按 Wi-Fi 名自动切换」后自动切换(默认关)。
  • 账号、密码、升级设置不会进方案,切换方案也不动它们 —— 换的只是"哪儿该不该登录"。
  • 新增 GET /api/profiles 与 POST /api/profiles/save|activate|delete|auto 四个写接口
    (老接口与老配置完全不受影响)。

✨ 新增(相对 v2.0.7.1)

  • 连接质量面板:状态页新增「在线率(近 7 天)/ 掉线重登 / 平均恢复耗时 / 当前延迟」
    与一张近 7 天柱状图。数据全部从已有日志现算,不新增状态文件 —— 服务重启不清零、
    升级不丢数据。延迟量的是到校园网关的 TCP 握手(校园网常禁 ping)。
  • 接口 GET /api/metrics?days=7(1–30 天);面板属于锦上添花:日志被删、参数非法、
    统计出错都只在面板上显示空白,不影响状态页其它部分。

🔧 修复(相对 v2.0.7.0)

  • 升级后托盘会自己换上新代码:以前升级只换了磁盘上的文件,正在跑的托盘还留在内存里的
    旧版本 —— 于是像「睡醒 / 换网立刻重连」这种新功能要等到下次注销 / 重启才生效 ✗。
    现在托盘盯着自己的脚本指纹(mtime + 大小),一变就先放开单实例锁 → 起新进程 → 自己退出;
    万一新进程起不来,会把锁拿回来继续跑(只记一行日志,不会反复重试)。

✨ 新增(相对 v2.0.6.3)

  • 睡醒 / 换网之后立刻重连:以前合盖睡一觉、插网线、换 Wi-Fi 之后,服务可能要等到下一次
    周期检查(默认 30 分钟)才补上登录 ✗。现在托盘盯着这两类事件 —— 系统唤醒(等 4 秒让网卡
    连上)与网络地址变化(立刻)—— 一到就触发一次登录检查。
  • 事件有 5 秒去抖(唤醒时电源 + 无线 + DHCP 常常连着来);拿不到事件时自动退化成原来的
    10 秒轮询,不会因为新功能变脆弱。

🔧 修复(相对 v2.0.6.2)

  • 升级 / 检查按钮不再「假成功」:先点「立即检查更新」、紧接着点「立即升级」时,
    第二个请求会被升级锁挡掉,但接口一律先回「已提交」✗ —— 界面提示「升级已启动」,
    实际什么都没发生。现在两个入口先探锁再回车:忙就回 409 + 当前进度
    (「任务进行中(检查 GitHub 最新版本...),请稍候再试」),空闲才回「已提交」并真的开跑。

🔧 修复(相对 v2.0.6.1)

  • 自动升级上来的用户,托盘也会自启了:之前从旧版升级上来时,安装器不知道新加的
    「托盘」任务,启动项会被跳过 ✗。现在改由服务每次启动对齐(安装器把开关记进注册表,
    服务据此建 / 修 / 删启动项)—— 不论你从哪个版本升上来都能自愈。

🔧 修复(相对 v2.0.6.0)

  • 托盘自启项改挂 HKLM:原来是 HKCU,而自动升级以 SYSTEM 身份运行安装器 →
    会写进 SYSTEM 的配置单元,真实用户登录时托盘不会自启。现在对每个登录用户都生效。
  • 卸载后不再留孤儿图标:安装目录里找不到自己的脚本(连续两次轮询)时托盘自行退出。

✨ 新增:托盘图标 + 断线通知

  • 装完会多一个通知区图标(默认随开机启动,安装向导里可取消勾选)。掉线、恢复、
    服务未响应时会弹气泡提醒,不用再自己盯着网页看。
  • 右键图标:打开配置页 / 立即登录 / 打开日志目录 / 退出托盘;双击图标打开配置页;
    鼠标悬停看当前状态(含当前 Wi-Fi 名)。
  • 通知有防刷屏:刚开机不弹;偶发一次连不上服务不弹(连续 3 次 ≈30 秒才报「服务无响应」);
    同一状态不重复弹。
  • 它是个独立的小程序(tray.py,随登录会话运行)—— 服务本身跑在后台会话里,没法直接弹通知。
    只用管理员权限才能在 Program Files 写日志,所以托盘自己的日志在
    %LOCALAPPDATA%\DrcomAutoLogin\tray.log。
  • 接口、配置结构、服务名、AppId 全未动(PATCH +1),老配置与升级路径不受影响。

安装包信息

项 值
应用版本 2.1.3.0 "Vega"
文件名 StardustFlashLink-Setup-v2.1.3.0.exe
大小 11943884 bytes(约 11.39 MB)
SHA256 bf13a399bba9c350e67b49298bd8212b27ebc85e4da6a839e8742373a151bdc4
构建提交 f071807
构建编号 #76
构建时间 2026-09-29
系统要求 Windows 10/11 x64(安装包已内嵌 Python,无需预装)

安装后会自动注册系统服务、创建桌面与开始菜单快捷方式。
首次使用请通过 Web UI(http://127.0.0.1:8848)填写账号与密码。

升级本版前请注意:若你的机器上 nssm 的 AppExit 曾被写成空值,需要管理员执行一次
nssm set DrcomAutoLogin AppExit Default Ignore;服务下次启动时也会尝试自愈。

用户机器验证步骤(装包后跑)

Get-Service DrcomAutoLogin | Select-Object Status, StartType
(Invoke-WebRequest http://127.0.0.1:8848/api/config -UseBasicParsing -TimeoutSec 10).StatusCode   # 必须是 200,且不能挂住
Get-Content "D:\Program Files\DrcomAutoLogin\logs\service_stderr.log" -Tail 30
Get-Content "D:\Program Files\DrcomAutoLogin\logs\campus_login.log" -Tail 50 | Select-String -Pattern "NameError|ModuleNotFound"
Get-Content "D:\Program Files\DrcomAutoLogin\logs\upgrade.log" -Tail 20

预期:Status=Running;/api/config 立刻 200(配置页能读到值、保存立即生效);
stderr 无 ModuleNotFoundError;campus_login.log 无 NameError;
upgrade.log 不再出现「几十秒一轮的下载 → 装 → 重启」死循环。
自动升级过的话,upgrade.log 里还应看到
升级执行器结果:installer_rc=0 / service=RUNNING / health=OK(前两项是 v2...

Read more

v2.1.0.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 04:00
4b9ab4a

Windows 安装程序 v2.1.0.0 "Vega"(织女星)(Inno Setup 自动构建 · 安装包已内嵌 Python,无需预装)。

本版变更

🏷 本版起进入 2.1 版本线,代号 Vega(织女星) —— 上一版 v2.0.14.0 是 2.0 线
(Sirius 天狼星)的收束。代号只出现在标题与界面里,服务名 / 安装路径 / 配置都不变。

🔒 安全 / 修复(相对 v2.0.14.0)

  • 登录失败不再可能把密码写进日志:登录用的是 GET、密码就在网址里,某些网络错误的
    文字里会带上整条网址 —— 现在日志与错误提示只保留「错误类型 / HTTP 状态码」,
    网址与密码参数会被自动擦掉(<url> / ***)。
  • 状态页的「下次检查」时间不再跳:以前服务与调度线程各写一次、两个值来回闪;
    现在只在需要时写一次。
  • 卸载更省心:删除用户数据那一步补上了默认选项与超时(无人值守时不会卡住,默认保留数据)。
  • 源码安装不再挑 Python 版本路径:以前写死 C:\Python314,现在自动找 py 启动器
    或常见安装位置。
  • 两个批处理脚本头部写明了已知限制:安装路径里不能含 !(cmd 的延迟展开会吃掉它)。

🔧 修复 / 加固(相对 v2.0.13.0)

  • 配置导入不再怕「zip 炸弹」:以前只看上传文件大小,一个很小的 zip 能解出几十 GB;
    现在导入前会先检查解压后的体积(单文件 ≤ 4 MB、合计 ≤ 8 MB),超了直接拒绝。
    导入包里字段类型写错也不再报 500,而是明确告诉你哪里不对(400)。
  • 账号没填也能保存其它设置:以前账号为空时整份配置都存不下去(连「自动升级」开关都改不了);
    现在账号可以留空,服务会跳过登录并在状态页提示「账号未设置」(不计入退避)。
  • 定时检查更结实:以前周期线程一旦遇到异常就会静默退出(之后再也不会自动登录);
    现在会记一条带原因的日志、停一会儿继续跑。

🔒 加固(相对 v2.0.12.0)

  • 安全响应头:页面与接口现在都带 CSP(default-src 'none',只放宽内联脚本与样式 ——
    因为页面本来就是全内联的)、X-Frame-Options: DENY(禁止被任何页面嵌框)、
    X-Content-Type-Options: nosniff、Referrer-Policy: no-referrer、Permissions-Policy
    (定位 / 摄像头 / 麦克风全部禁用)。
  • 请求体上限:JSON 接口最多收 1 MB,超出直接回 413(以前是无条件读进来)。
    拒绝时会先把已到达的字节排空再干净关连接 —— 否则 Windows 会因未读数据发 RST,
    把 413 本身冲掉。
  • 运行时单实例锁:手工再跑一份服务时,第二份现在什么都不做就退出(以前会先把
    定时检查跑起来);升级 / 重启时对旧进程宽容,最多等 20 秒。

✨ 新增(相对 v2.0.11.0)

  • 日志不再无限长大:业务日志超过 5 MB 自动轮转(保留 3 份旧档,合计 ≤ 20 MB),
    升级日志超过 2 MB 轮转(保留 2 份)—— 以前只能靠你自己去删。
    状态页「近 7 天」的统计会把旧档一起读,轮转不会让数字凭空变少。
  • 一键诊断包(已脱敏):「关于 → 日志与诊断」里能看到各日志占用,并一键下载诊断包 ——
    里面是版本 / 运行环境 / 服务状态 + 脱敏后的配置 + 各日志尾部(每个 ≤ 512 KB)。
    账号打码成「前 4 位 + ******」、MAC 打码、不含任何密码;校园网内网 IP 与 Wi-Fi 名会保留
    (排障需要),分享前请自行确认。反馈问题时发它,比截图 + 口述都准。

✨ 新增(相对 v2.0.10.0)

  • 升级前备份整目录 + 升级失败自动回滚:以前升级前只留一个 联网_service.py 的副本
    (还放在 %TEMP%),真要是新版本起不来,别的模块就回不去了 ✗。现在升级前会把全部代码文件
    备份到安装目录的 backup\<旧版本>\(每个文件都记 sha256),并且:
    • 执行器在两轮健康探测都探不到服务时,自动还原这些文件、重启服务、再探一次;
    • Web UI「配置 → 自动升级 → 版本回滚」也能手动一键回退到某个备份版本(服务会重启,约 15 秒)。
  • 回滚只动代码:config.json、密码、配置方案都不动(备份里那份 config.json 只供你人工比对)。
    备份保留 7 天、至少留最新 2 份;卸载时一并清掉。
  • 安全兜底:备份被改坏、清单缺失、版本对不上、清单里文件名带路径分隔符 → 一律拒绝回滚
    且不写任何文件(宁可不动,也不写出一套「半新半旧」的代码)。
  • 顺带修掉一个陷阱:升级后的启动自检原先「找不到旧式备份就直接跳过」,换备份方案后会把
    升级结果确认、AppExit 自愈、托盘自启项对齐全部跳过 ✗ —— 现在照常执行。

✨ 新增(相对 v2.0.9.1)

  • 升级收尾改探 HTTP 健康端点:自动升级跑完安装器后,执行器会用随包内嵌的 Python 探一次
    http://127.0.0.1:<你的端口>/api/health —— 只有拿到 {"ok": true} 才算「服务真的活了」。
    此前只看 sc query,而那是 nssm 的 wrapper:里面的 Python 崩了它照样显示 RUNNING
    (AppExit=Ignore:不重启也不报错),所以「升级把服务弄挂了」以前要等你自己发现 ✗。
  • 探不到就自动重启重试:先 sc stop + sc start 重启一次服务,再给一个窗口重探。
  • 失败会留下明确告警:结论写进 logs\upgrade.log(中文、带时间戳)。
    服务真起不来时 Web UI 也打不开,那行日志就是唯一的告警面 ——
    托盘右键「打开日志目录」即可看到,里面会写明「服务可能没起来」与下一步该看哪个日志。
  • 顺手修掉一个从 v2.0.4.2 起就在的老坑:升级记录里的 installer_rc=(安装器退出码)其实
    从来没真正写下来过 —— echo installer_rc=0>"…" 里的数字紧贴 >,cmd 会把它当成
    「句柄 0 重定向」→ 文件被写空、文本跑进 stdout ✗,于是「安装器非 0 退出码就告警」那条
    一直是死代码。现在改成把重定向写在命令前面,退出码正常落盘,装失败时日志里能看见它。
  • 探针自包含(只用标准库、不读你的配置以外的东西、不走系统代理),跑完自删;
    内嵌 Python 或探针缺失时自动退回旧判据(不影响升级本身)。

⚠️ 如果你装过 v2.0.8.0 且 Web UI 打不开 / 托盘说「服务未响应」:
重新运行本安装包即可恢复(会自动停服务 → 补齐文件 → 再启动服务;配置与密码不变)。

🔴 紧急修复(相对 v2.0.8.0)

  • 修「升级时安装中途回滚把安装弄坏」:托盘进程锁着 {app}\python\libcrypto-3.dll,
    安装器替换它失败后静默模式会 Abort 并回滚 ✗ —— 结果新脚本已就位、新增的 metrics.py
    被回滚删掉,服务启动即崩、Web UI 端口消失。现在安装器在写任何文件之前先请走托盘
    (只匹配「tray.py + 本安装目录」的进程,不误伤别的程序),并且可选模块缺失时服务降级运行
    (只是少一块面板,不影响登录与页面)。

⚠️ 装过 v2.0.9.0 且 Web UI 打不开 / 托盘说「服务未响应」的话:重新运行本安装包即可恢复
(配置、密码、方案都不动)。

🔴 紧急修复(相对 v2.0.9.0)

  • 修「升级后服务起不来」:v2.0.9.0 在服务主流程里多写了一句 import protocol as _protocol_mod,
    而 Python 里函数内的 import 会让该名字在整个函数里变成局部变量 ✗ → 同一函数里更早的
    _protocol_mod._attach(...) 直接 UnboundLocalError → 服务启动即退 ✗(nssm 配的是
    AppExit=Ignore,不会自动重启,所以表现成"服务在跑、网页打不开")。
    已删掉该行,并加静态守卫:服务里出现「函数内 import 模块别名」一律判失败。

✨ 新增(相对 v2.0.8.1)

  • 配置方案:给「教室 / 宿舍 / 家里」各存一套位置相关设置(认证网关、检查间隔、
    网络位置守卫白名单),配置页一键切换;填了「自动匹配的 Wi-Fi 名」的方案还能在打开
    「按 Wi-Fi 名自动切换」后自动切换(默认关)。
  • 账号、密码、升级设置不会进方案,切换方案也不动它们 —— 换的只是"哪儿该不该登录"。
  • 新增 GET /api/profiles 与 POST /api/profiles/save|activate|delete|auto 四个写接口
    (老接口与老配置完全不受影响)。

✨ 新增(相对 v2.0.7.1)

  • 连接质量面板:状态页新增「在线率(近 7 天)/ 掉线重登 / 平均恢复耗时 / 当前延迟」
    与一张近 7 天柱状图。数据全部从已有日志现算,不新增状态文件 —— 服务重启不清零、
    升级不丢数据。延迟量的是到校园网关的 TCP 握手(校园网常禁 ping)。
  • 接口 GET /api/metrics?days=7(1–30 天);面板属于锦上添花:日志被删、参数非法、
    统计出错都只在面板上显示空白,不影响状态页其它部分。

🔧 修复(相对 v2.0.7.0)

  • 升级后托盘会自己换上新代码:以前升级只换了磁盘上的文件,正在跑的托盘还留在内存里的
    旧版本 —— 于是像「睡醒 / 换网立刻重连」这种新功能要等到下次注销 / 重启才生效 ✗。
    现在托盘盯着自己的脚本指纹(mtime + 大小),一变就先放开单实例锁 → 起新进程 → 自己退出;
    万一新进程起不来,会把锁拿回来继续跑(只记一行日志,不会反复重试)。

✨ 新增(相对 v2.0.6.3)

  • 睡醒 / 换网之后立刻重连:以前合盖睡一觉、插网线、换 Wi-Fi 之后,服务可能要等到下一次
    周期检查(默认 30 分钟)才补上登录 ✗。现在托盘盯着这两类事件 —— 系统唤醒(等 4 秒让网卡
    连上)与网络地址变化(立刻)—— 一到就触发一次登录检查。
  • 事件有 5 秒去抖(唤醒时电源 + 无线 + DHCP 常常连着来);拿不到事件时自动退化成原来的
    10 秒轮询,不会因为新功能变脆弱。

🔧 修复(相对 v2.0.6.2)

  • 升级 / 检查按钮不再「假成功」:先点「立即检查更新」、紧接着点「立即升级」时,
    第二个请求会被升级锁挡掉,但接口一律先回「已提交」✗ —— 界面提示「升级已启动」,
    实际什么都没发生。现在两个入口先探锁再回车:忙就回 409 + 当前进度
    (「任务进行中(检查 GitHub 最新版本...),请稍候再试」),空闲才回「已提交」并真的开跑。

🔧 修复(相对 v2.0.6.1)

  • 自动升级上来的用户,托盘也会自启了:之前从旧版升级上来时,安装器不知道新加的
    「托盘」任务,启动项会被跳过 ✗。现在改由服务每次启动对齐(安装器把开关记进注册表,
    服务据此建 / 修 / 删启动项)—— 不论你从哪个版本升上来都能自愈。

🔧 修复(相对 v2.0.6.0)

  • 托盘自启项改挂 HKLM:原来是 HKCU,而自动升级以 SYSTEM 身份运行安装器 →
    会写进 SYSTEM 的配置单元,真实用户登录时托盘不会自启。现在对每个登录用户都生效。
  • 卸载后不再留孤儿图标:安装目录里找不到自己的脚本(连续两次轮询)时托盘自行退出。

✨ 新增:托盘图标 + 断线通知

  • 装完会多一个通知区图标(默认随开机启动,安装向导里可取消勾选)。掉线、恢复、
    服务未响应时会弹气泡提醒,不用再自己盯着网页看。
  • 右键图标:打开配置页 / 立即登录 / 打开日志目录 / 退出托盘;双击图标打开配置页;
    鼠标悬停看当前状态(含当前 Wi-Fi 名)。
  • 通知有防刷屏:刚开机不弹;偶发一次连不上服务不弹(连续 3 次 ≈30 秒才报「服务无响应」);
    同一状态不重复弹。
  • 它是个独立的小程序(tray.py,随登录会话运行)—— 服务本身跑在后台会话里,没法直接弹通知。
    只用管理员权限才能在 Program Files 写日志,所以托盘自己的日志在
    %LOCALAPPDATA%\DrcomAutoLogin\tray.log。
  • 接口、配置结构、服务名、AppId 全未动(PATCH +1),老配置与升级路径不受影响。

安装包信息

项 值
应用版本 2.1.0.0 "Sirius"
文件名 StardustFlashLink-Setup-v2.1.0.0.exe
大小 11918944 bytes(约 11.37 MB)
SHA256 aea772f6e11bcf8a89fd8d1f6168d1565e21cbcc287b26c8b2f05016e664ab38
构建提交 4b9ab4a
构建编号 #73
构建时间 2026-09-28
系统要求 Windows 10/11 x64(安装包已内嵌 Python,无需预装)

安装后会自动注册系统服务、创建桌面与开始菜单快捷方式。
首次使用请通过 Web UI(http://127.0.0.1:8848)填写账号与密码。

升级本版前请注意:若你的机器上 nssm 的 AppExit 曾被写成空值,需要管理员执行一次
nssm set DrcomAutoLogin AppExit Default Ignore;服务下次启动时也会尝试自愈。

用户机器验证步骤(装包后跑)

Get-Service DrcomAutoLogin | Select-Object Status, StartType
(Invoke-WebRequest http://127.0.0.1:8848/api/config -UseBasicParsing -TimeoutSec 10).StatusCode   # 必须是 200,且不能挂住
Get-Content "D:\Program Files\DrcomAutoLogin\logs\service_stderr.log" -Tail 30
Get-Content "D:\Program Files\DrcomAutoLogin\logs\campus_login.log" -Tail 50 | Select-String -Pattern "NameError|ModuleNotFound"
Get-Content "D:\Program Files\DrcomAutoLogin\logs\upgrade.log" -Tail 20

预期:Status=Running;/api/config 立刻 200(配置页能读到值、保存立即生效);
stderr 无 ModuleNotFoundError;campus_login.log 无 NameError;
upgrade.log 不再出现「几十秒一轮的下载 → 装 → 重启」死循环。
自动升级过的话,upgrade.log 里还应看到
升级执行器结果:installer_rc=0 / service=RUNNING / health=OK(前两项是 v2.0.4.2 的退出码与
服务状态回报,health= 是 v2.0.10.0 新增的 HTTP 健康探测结论 ——
OK 表示服务真的答上了 /api/health,比 sc query 可信)。
若这里是 health=FAIL,同一份日志里还会有一行「升级看门狗:HTTP 健康检查未通过」写明原因。

校验

certutil -hashfile StardustFlashLink-Setup-v2.1.0.0.exe SHA256

本 release 是自动升级通道(非 prerelease):客户端读 /releases/latest 取版本号与 asset digest(fail-closed 校验)。
固定下载链接仍见 prerelease installer。

v2.0.14.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 03:37
dd2db43

Windows 安装程序 v2.0.14.0 "Sirius"(天狼星)(Inno Setup 自动构建 · 安装包已内嵌 Python,无需预装)。

本版变更

🔧 修复 / 加固(相对 v2.0.13.0)

  • 配置导入不再怕「zip 炸弹」:以前只看上传文件大小,一个很小的 zip 能解出几十 GB;
    现在导入前会先检查解压后的体积(单文件 ≤ 4 MB、合计 ≤ 8 MB),超了直接拒绝。
    导入包里字段类型写错也不再报 500,而是明确告诉你哪里不对(400)。
  • 账号没填也能保存其它设置:以前账号为空时整份配置都存不下去(连「自动升级」开关都改不了);
    现在账号可以留空,服务会跳过登录并在状态页提示「账号未设置」(不计入退避)。
  • 定时检查更结实:以前周期线程一旦遇到异常就会静默退出(之后再也不会自动登录);
    现在会记一条带原因的日志、停一会儿继续跑。

🔒 加固(相对 v2.0.12.0)

  • 安全响应头:页面与接口现在都带 CSP(default-src 'none',只放宽内联脚本与样式 ——
    因为页面本来就是全内联的)、X-Frame-Options: DENY(禁止被任何页面嵌框)、
    X-Content-Type-Options: nosniff、Referrer-Policy: no-referrer、Permissions-Policy
    (定位 / 摄像头 / 麦克风全部禁用)。
  • 请求体上限:JSON 接口最多收 1 MB,超出直接回 413(以前是无条件读进来)。
    拒绝时会先把已到达的字节排空再干净关连接 —— 否则 Windows 会因未读数据发 RST,
    把 413 本身冲掉。
  • 运行时单实例锁:手工再跑一份服务时,第二份现在什么都不做就退出(以前会先把
    定时检查跑起来);升级 / 重启时对旧进程宽容,最多等 20 秒。

✨ 新增(相对 v2.0.11.0)

  • 日志不再无限长大:业务日志超过 5 MB 自动轮转(保留 3 份旧档,合计 ≤ 20 MB),
    升级日志超过 2 MB 轮转(保留 2 份)—— 以前只能靠你自己去删。
    状态页「近 7 天」的统计会把旧档一起读,轮转不会让数字凭空变少。
  • 一键诊断包(已脱敏):「关于 → 日志与诊断」里能看到各日志占用,并一键下载诊断包 ——
    里面是版本 / 运行环境 / 服务状态 + 脱敏后的配置 + 各日志尾部(每个 ≤ 512 KB)。
    账号打码成「前 4 位 + ******」、MAC 打码、不含任何密码;校园网内网 IP 与 Wi-Fi 名会保留
    (排障需要),分享前请自行确认。反馈问题时发它,比截图 + 口述都准。

✨ 新增(相对 v2.0.10.0)

  • 升级前备份整目录 + 升级失败自动回滚:以前升级前只留一个 联网_service.py 的副本
    (还放在 %TEMP%),真要是新版本起不来,别的模块就回不去了 ✗。现在升级前会把全部代码文件
    备份到安装目录的 backup\<旧版本>\(每个文件都记 sha256),并且:
    • 执行器在两轮健康探测都探不到服务时,自动还原这些文件、重启服务、再探一次;
    • Web UI「配置 → 自动升级 → 版本回滚」也能手动一键回退到某个备份版本(服务会重启,约 15 秒)。
  • 回滚只动代码:config.json、密码、配置方案都不动(备份里那份 config.json 只供你人工比对)。
    备份保留 7 天、至少留最新 2 份;卸载时一并清掉。
  • 安全兜底:备份被改坏、清单缺失、版本对不上、清单里文件名带路径分隔符 → 一律拒绝回滚
    且不写任何文件(宁可不动,也不写出一套「半新半旧」的代码)。
  • 顺带修掉一个陷阱:升级后的启动自检原先「找不到旧式备份就直接跳过」,换备份方案后会把
    升级结果确认、AppExit 自愈、托盘自启项对齐全部跳过 ✗ —— 现在照常执行。

✨ 新增(相对 v2.0.9.1)

  • 升级收尾改探 HTTP 健康端点:自动升级跑完安装器后,执行器会用随包内嵌的 Python 探一次
    http://127.0.0.1:<你的端口>/api/health —— 只有拿到 {"ok": true} 才算「服务真的活了」。
    此前只看 sc query,而那是 nssm 的 wrapper:里面的 Python 崩了它照样显示 RUNNING
    (AppExit=Ignore:不重启也不报错),所以「升级把服务弄挂了」以前要等你自己发现 ✗。
  • 探不到就自动重启重试:先 sc stop + sc start 重启一次服务,再给一个窗口重探。
  • 失败会留下明确告警:结论写进 logs\upgrade.log(中文、带时间戳)。
    服务真起不来时 Web UI 也打不开,那行日志就是唯一的告警面 ——
    托盘右键「打开日志目录」即可看到,里面会写明「服务可能没起来」与下一步该看哪个日志。
  • 顺手修掉一个从 v2.0.4.2 起就在的老坑:升级记录里的 installer_rc=(安装器退出码)其实
    从来没真正写下来过 —— echo installer_rc=0>"…" 里的数字紧贴 >,cmd 会把它当成
    「句柄 0 重定向」→ 文件被写空、文本跑进 stdout ✗,于是「安装器非 0 退出码就告警」那条
    一直是死代码。现在改成把重定向写在命令前面,退出码正常落盘,装失败时日志里能看见它。
  • 探针自包含(只用标准库、不读你的配置以外的东西、不走系统代理),跑完自删;
    内嵌 Python 或探针缺失时自动退回旧判据(不影响升级本身)。

⚠️ 如果你装过 v2.0.8.0 且 Web UI 打不开 / 托盘说「服务未响应」:
重新运行本安装包即可恢复(会自动停服务 → 补齐文件 → 再启动服务;配置与密码不变)。

🔴 紧急修复(相对 v2.0.8.0)

  • 修「升级时安装中途回滚把安装弄坏」:托盘进程锁着 {app}\python\libcrypto-3.dll,
    安装器替换它失败后静默模式会 Abort 并回滚 ✗ —— 结果新脚本已就位、新增的 metrics.py
    被回滚删掉,服务启动即崩、Web UI 端口消失。现在安装器在写任何文件之前先请走托盘
    (只匹配「tray.py + 本安装目录」的进程,不误伤别的程序),并且可选模块缺失时服务降级运行
    (只是少一块面板,不影响登录与页面)。

⚠️ 装过 v2.0.9.0 且 Web UI 打不开 / 托盘说「服务未响应」的话:重新运行本安装包即可恢复
(配置、密码、方案都不动)。

🔴 紧急修复(相对 v2.0.9.0)

  • 修「升级后服务起不来」:v2.0.9.0 在服务主流程里多写了一句 import protocol as _protocol_mod,
    而 Python 里函数内的 import 会让该名字在整个函数里变成局部变量 ✗ → 同一函数里更早的
    _protocol_mod._attach(...) 直接 UnboundLocalError → 服务启动即退 ✗(nssm 配的是
    AppExit=Ignore,不会自动重启,所以表现成"服务在跑、网页打不开")。
    已删掉该行,并加静态守卫:服务里出现「函数内 import 模块别名」一律判失败。

✨ 新增(相对 v2.0.8.1)

  • 配置方案:给「教室 / 宿舍 / 家里」各存一套位置相关设置(认证网关、检查间隔、
    网络位置守卫白名单),配置页一键切换;填了「自动匹配的 Wi-Fi 名」的方案还能在打开
    「按 Wi-Fi 名自动切换」后自动切换(默认关)。
  • 账号、密码、升级设置不会进方案,切换方案也不动它们 —— 换的只是"哪儿该不该登录"。
  • 新增 GET /api/profiles 与 POST /api/profiles/save|activate|delete|auto 四个写接口
    (老接口与老配置完全不受影响)。

✨ 新增(相对 v2.0.7.1)

  • 连接质量面板:状态页新增「在线率(近 7 天)/ 掉线重登 / 平均恢复耗时 / 当前延迟」
    与一张近 7 天柱状图。数据全部从已有日志现算,不新增状态文件 —— 服务重启不清零、
    升级不丢数据。延迟量的是到校园网关的 TCP 握手(校园网常禁 ping)。
  • 接口 GET /api/metrics?days=7(1–30 天);面板属于锦上添花:日志被删、参数非法、
    统计出错都只在面板上显示空白,不影响状态页其它部分。

🔧 修复(相对 v2.0.7.0)

  • 升级后托盘会自己换上新代码:以前升级只换了磁盘上的文件,正在跑的托盘还留在内存里的
    旧版本 —— 于是像「睡醒 / 换网立刻重连」这种新功能要等到下次注销 / 重启才生效 ✗。
    现在托盘盯着自己的脚本指纹(mtime + 大小),一变就先放开单实例锁 → 起新进程 → 自己退出;
    万一新进程起不来,会把锁拿回来继续跑(只记一行日志,不会反复重试)。

✨ 新增(相对 v2.0.6.3)

  • 睡醒 / 换网之后立刻重连:以前合盖睡一觉、插网线、换 Wi-Fi 之后,服务可能要等到下一次
    周期检查(默认 30 分钟)才补上登录 ✗。现在托盘盯着这两类事件 —— 系统唤醒(等 4 秒让网卡
    连上)与网络地址变化(立刻)—— 一到就触发一次登录检查。
  • 事件有 5 秒去抖(唤醒时电源 + 无线 + DHCP 常常连着来);拿不到事件时自动退化成原来的
    10 秒轮询,不会因为新功能变脆弱。

🔧 修复(相对 v2.0.6.2)

  • 升级 / 检查按钮不再「假成功」:先点「立即检查更新」、紧接着点「立即升级」时,
    第二个请求会被升级锁挡掉,但接口一律先回「已提交」✗ —— 界面提示「升级已启动」,
    实际什么都没发生。现在两个入口先探锁再回车:忙就回 409 + 当前进度
    (「任务进行中(检查 GitHub 最新版本...),请稍候再试」),空闲才回「已提交」并真的开跑。

🔧 修复(相对 v2.0.6.1)

  • 自动升级上来的用户,托盘也会自启了:之前从旧版升级上来时,安装器不知道新加的
    「托盘」任务,启动项会被跳过 ✗。现在改由服务每次启动对齐(安装器把开关记进注册表,
    服务据此建 / 修 / 删启动项)—— 不论你从哪个版本升上来都能自愈。

🔧 修复(相对 v2.0.6.0)

  • 托盘自启项改挂 HKLM:原来是 HKCU,而自动升级以 SYSTEM 身份运行安装器 →
    会写进 SYSTEM 的配置单元,真实用户登录时托盘不会自启。现在对每个登录用户都生效。
  • 卸载后不再留孤儿图标:安装目录里找不到自己的脚本(连续两次轮询)时托盘自行退出。

✨ 新增:托盘图标 + 断线通知

  • 装完会多一个通知区图标(默认随开机启动,安装向导里可取消勾选)。掉线、恢复、
    服务未响应时会弹气泡提醒,不用再自己盯着网页看。
  • 右键图标:打开配置页 / 立即登录 / 打开日志目录 / 退出托盘;双击图标打开配置页;
    鼠标悬停看当前状态(含当前 Wi-Fi 名)。
  • 通知有防刷屏:刚开机不弹;偶发一次连不上服务不弹(连续 3 次 ≈30 秒才报「服务无响应」);
    同一状态不重复弹。
  • 它是个独立的小程序(tray.py,随登录会话运行)—— 服务本身跑在后台会话里,没法直接弹通知。
    只用管理员权限才能在 Program Files 写日志,所以托盘自己的日志在
    %LOCALAPPDATA%\DrcomAutoLogin\tray.log。
  • 接口、配置结构、服务名、AppId 全未动(PATCH +1),老配置与升级路径不受影响。

安装包信息

项 值
应用版本 2.0.14.0 "Sirius"
文件名 StardustFlashLink-Setup-v2.0.14.0.exe
大小 11919714 bytes(约 11.37 MB)
SHA256 734e2fc22d474bc078c135167127d164e4dcd94081a767abb9976291803d8cf8
构建提交 dd2db43
构建编号 #71
构建时间 2026-09-28
系统要求 Windows 10/11 x64(安装包已内嵌 Python,无需预装)

安装后会自动注册系统服务、创建桌面与开始菜单快捷方式。
首次使用请通过 Web UI(http://127.0.0.1:8848)填写账号与密码。

升级本版前请注意:若你的机器上 nssm 的 AppExit 曾被写成空值,需要管理员执行一次
nssm set DrcomAutoLogin AppExit Default Ignore;服务下次启动时也会尝试自愈。

用户机器验证步骤(装包后跑)

Get-Service DrcomAutoLogin | Select-Object Status, StartType
(Invoke-WebRequest http://127.0.0.1:8848/api/config -UseBasicParsing -TimeoutSec 10).StatusCode   # 必须是 200,且不能挂住
Get-Content "D:\Program Files\DrcomAutoLogin\logs\service_stderr.log" -Tail 30
Get-Content "D:\Program Files\DrcomAutoLogin\logs\campus_login.log" -Tail 50 | Select-String -Pattern "NameError|ModuleNotFound"
Get-Content "D:\Program Files\DrcomAutoLogin\logs\upgrade.log" -Tail 20

预期:Status=Running;/api/config 立刻 200(配置页能读到值、保存立即生效);
stderr 无 ModuleNotFoundError;campus_login.log 无 NameError;
upgrade.log 不再出现「几十秒一轮的下载 → 装 → 重启」死循环。
自动升级过的话,upgrade.log 里还应看到
升级执行器结果:installer_rc=0 / service=RUNNING / health=OK(前两项是 v2.0.4.2 的退出码与
服务状态回报,health= 是 v2.0.10.0 新增的 HTTP 健康探测结论 ——
OK 表示服务真的答上了 /api/health,比 sc query 可信)。
若这里是 health=FAIL,同一份日志里还会有一行「升级看门狗:HTTP 健康检查未通过」写明原因。

校验

certutil -hashfile StardustFlashLink-Setup-v2.0.14.0.exe SHA256

本 release 是自动升级通道(非 prerelease):客户端读 /releases/latest 取版本号与 asset digest(fail-closed 校验)。
固定下载链接仍见 prerelease installer。

v2.0.13.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 03:21
f8b152f

Windows 安装程序 v2.0.13.0 "Sirius"(天狼星)(Inno Setup 自动构建 · 安装包已内嵌 Python,无需预装)。

本版变更

🔒 加固(相对 v2.0.12.0)

  • 安全响应头:页面与接口现在都带 CSP(default-src 'none',只放宽内联脚本与样式 ——
    因为页面本来就是全内联的)、X-Frame-Options: DENY(禁止被任何页面嵌框)、
    X-Content-Type-Options: nosniff、Referrer-Policy: no-referrer、Permissions-Policy
    (定位 / 摄像头 / 麦克风全部禁用)。
  • 请求体上限:JSON 接口最多收 1 MB,超出直接回 413(以前是无条件读进来)。
    拒绝时会先把已到达的字节排空再干净关连接 —— 否则 Windows 会因未读数据发 RST,
    把 413 本身冲掉。
  • 运行时单实例锁:手工再跑一份服务时,第二份现在什么都不做就退出(以前会先把
    定时检查跑起来);升级 / 重启时对旧进程宽容,最多等 20 秒。

✨ 新增(相对 v2.0.11.0)

  • 日志不再无限长大:业务日志超过 5 MB 自动轮转(保留 3 份旧档,合计 ≤ 20 MB),
    升级日志超过 2 MB 轮转(保留 2 份)—— 以前只能靠你自己去删。
    状态页「近 7 天」的统计会把旧档一起读,轮转不会让数字凭空变少。
  • 一键诊断包(已脱敏):「关于 → 日志与诊断」里能看到各日志占用,并一键下载诊断包 ——
    里面是版本 / 运行环境 / 服务状态 + 脱敏后的配置 + 各日志尾部(每个 ≤ 512 KB)。
    账号打码成「前 4 位 + ******」、MAC 打码、不含任何密码;校园网内网 IP 与 Wi-Fi 名会保留
    (排障需要),分享前请自行确认。反馈问题时发它,比截图 + 口述都准。

✨ 新增(相对 v2.0.10.0)

  • 升级前备份整目录 + 升级失败自动回滚:以前升级前只留一个 联网_service.py 的副本
    (还放在 %TEMP%),真要是新版本起不来,别的模块就回不去了 ✗。现在升级前会把全部代码文件
    备份到安装目录的 backup\<旧版本>\(每个文件都记 sha256),并且:
    • 执行器在两轮健康探测都探不到服务时,自动还原这些文件、重启服务、再探一次;
    • Web UI「配置 → 自动升级 → 版本回滚」也能手动一键回退到某个备份版本(服务会重启,约 15 秒)。
  • 回滚只动代码:config.json、密码、配置方案都不动(备份里那份 config.json 只供你人工比对)。
    备份保留 7 天、至少留最新 2 份;卸载时一并清掉。
  • 安全兜底:备份被改坏、清单缺失、版本对不上、清单里文件名带路径分隔符 → 一律拒绝回滚
    且不写任何文件(宁可不动,也不写出一套「半新半旧」的代码)。
  • 顺带修掉一个陷阱:升级后的启动自检原先「找不到旧式备份就直接跳过」,换备份方案后会把
    升级结果确认、AppExit 自愈、托盘自启项对齐全部跳过 ✗ —— 现在照常执行。

✨ 新增(相对 v2.0.9.1)

  • 升级收尾改探 HTTP 健康端点:自动升级跑完安装器后,执行器会用随包内嵌的 Python 探一次
    http://127.0.0.1:<你的端口>/api/health —— 只有拿到 {"ok": true} 才算「服务真的活了」。
    此前只看 sc query,而那是 nssm 的 wrapper:里面的 Python 崩了它照样显示 RUNNING
    (AppExit=Ignore:不重启也不报错),所以「升级把服务弄挂了」以前要等你自己发现 ✗。
  • 探不到就自动重启重试:先 sc stop + sc start 重启一次服务,再给一个窗口重探。
  • 失败会留下明确告警:结论写进 logs\upgrade.log(中文、带时间戳)。
    服务真起不来时 Web UI 也打不开,那行日志就是唯一的告警面 ——
    托盘右键「打开日志目录」即可看到,里面会写明「服务可能没起来」与下一步该看哪个日志。
  • 顺手修掉一个从 v2.0.4.2 起就在的老坑:升级记录里的 installer_rc=(安装器退出码)其实
    从来没真正写下来过 —— echo installer_rc=0>"…" 里的数字紧贴 >,cmd 会把它当成
    「句柄 0 重定向」→ 文件被写空、文本跑进 stdout ✗,于是「安装器非 0 退出码就告警」那条
    一直是死代码。现在改成把重定向写在命令前面,退出码正常落盘,装失败时日志里能看见它。
  • 探针自包含(只用标准库、不读你的配置以外的东西、不走系统代理),跑完自删;
    内嵌 Python 或探针缺失时自动退回旧判据(不影响升级本身)。

⚠️ 如果你装过 v2.0.8.0 且 Web UI 打不开 / 托盘说「服务未响应」:
重新运行本安装包即可恢复(会自动停服务 → 补齐文件 → 再启动服务;配置与密码不变)。

🔴 紧急修复(相对 v2.0.8.0)

  • 修「升级时安装中途回滚把安装弄坏」:托盘进程锁着 {app}\python\libcrypto-3.dll,
    安装器替换它失败后静默模式会 Abort 并回滚 ✗ —— 结果新脚本已就位、新增的 metrics.py
    被回滚删掉,服务启动即崩、Web UI 端口消失。现在安装器在写任何文件之前先请走托盘
    (只匹配「tray.py + 本安装目录」的进程,不误伤别的程序),并且可选模块缺失时服务降级运行
    (只是少一块面板,不影响登录与页面)。

⚠️ 装过 v2.0.9.0 且 Web UI 打不开 / 托盘说「服务未响应」的话:重新运行本安装包即可恢复
(配置、密码、方案都不动)。

🔴 紧急修复(相对 v2.0.9.0)

  • 修「升级后服务起不来」:v2.0.9.0 在服务主流程里多写了一句 import protocol as _protocol_mod,
    而 Python 里函数内的 import 会让该名字在整个函数里变成局部变量 ✗ → 同一函数里更早的
    _protocol_mod._attach(...) 直接 UnboundLocalError → 服务启动即退 ✗(nssm 配的是
    AppExit=Ignore,不会自动重启,所以表现成"服务在跑、网页打不开")。
    已删掉该行,并加静态守卫:服务里出现「函数内 import 模块别名」一律判失败。

✨ 新增(相对 v2.0.8.1)

  • 配置方案:给「教室 / 宿舍 / 家里」各存一套位置相关设置(认证网关、检查间隔、
    网络位置守卫白名单),配置页一键切换;填了「自动匹配的 Wi-Fi 名」的方案还能在打开
    「按 Wi-Fi 名自动切换」后自动切换(默认关)。
  • 账号、密码、升级设置不会进方案,切换方案也不动它们 —— 换的只是"哪儿该不该登录"。
  • 新增 GET /api/profiles 与 POST /api/profiles/save|activate|delete|auto 四个写接口
    (老接口与老配置完全不受影响)。

✨ 新增(相对 v2.0.7.1)

  • 连接质量面板:状态页新增「在线率(近 7 天)/ 掉线重登 / 平均恢复耗时 / 当前延迟」
    与一张近 7 天柱状图。数据全部从已有日志现算,不新增状态文件 —— 服务重启不清零、
    升级不丢数据。延迟量的是到校园网关的 TCP 握手(校园网常禁 ping)。
  • 接口 GET /api/metrics?days=7(1–30 天);面板属于锦上添花:日志被删、参数非法、
    统计出错都只在面板上显示空白,不影响状态页其它部分。

🔧 修复(相对 v2.0.7.0)

  • 升级后托盘会自己换上新代码:以前升级只换了磁盘上的文件,正在跑的托盘还留在内存里的
    旧版本 —— 于是像「睡醒 / 换网立刻重连」这种新功能要等到下次注销 / 重启才生效 ✗。
    现在托盘盯着自己的脚本指纹(mtime + 大小),一变就先放开单实例锁 → 起新进程 → 自己退出;
    万一新进程起不来,会把锁拿回来继续跑(只记一行日志,不会反复重试)。

✨ 新增(相对 v2.0.6.3)

  • 睡醒 / 换网之后立刻重连:以前合盖睡一觉、插网线、换 Wi-Fi 之后,服务可能要等到下一次
    周期检查(默认 30 分钟)才补上登录 ✗。现在托盘盯着这两类事件 —— 系统唤醒(等 4 秒让网卡
    连上)与网络地址变化(立刻)—— 一到就触发一次登录检查。
  • 事件有 5 秒去抖(唤醒时电源 + 无线 + DHCP 常常连着来);拿不到事件时自动退化成原来的
    10 秒轮询,不会因为新功能变脆弱。

🔧 修复(相对 v2.0.6.2)

  • 升级 / 检查按钮不再「假成功」:先点「立即检查更新」、紧接着点「立即升级」时,
    第二个请求会被升级锁挡掉,但接口一律先回「已提交」✗ —— 界面提示「升级已启动」,
    实际什么都没发生。现在两个入口先探锁再回车:忙就回 409 + 当前进度
    (「任务进行中(检查 GitHub 最新版本...),请稍候再试」),空闲才回「已提交」并真的开跑。

🔧 修复(相对 v2.0.6.1)

  • 自动升级上来的用户,托盘也会自启了:之前从旧版升级上来时,安装器不知道新加的
    「托盘」任务,启动项会被跳过 ✗。现在改由服务每次启动对齐(安装器把开关记进注册表,
    服务据此建 / 修 / 删启动项)—— 不论你从哪个版本升上来都能自愈。

🔧 修复(相对 v2.0.6.0)

  • 托盘自启项改挂 HKLM:原来是 HKCU,而自动升级以 SYSTEM 身份运行安装器 →
    会写进 SYSTEM 的配置单元,真实用户登录时托盘不会自启。现在对每个登录用户都生效。
  • 卸载后不再留孤儿图标:安装目录里找不到自己的脚本(连续两次轮询)时托盘自行退出。

✨ 新增:托盘图标 + 断线通知

  • 装完会多一个通知区图标(默认随开机启动,安装向导里可取消勾选)。掉线、恢复、
    服务未响应时会弹气泡提醒,不用再自己盯着网页看。
  • 右键图标:打开配置页 / 立即登录 / 打开日志目录 / 退出托盘;双击图标打开配置页;
    鼠标悬停看当前状态(含当前 Wi-Fi 名)。
  • 通知有防刷屏:刚开机不弹;偶发一次连不上服务不弹(连续 3 次 ≈30 秒才报「服务无响应」);
    同一状态不重复弹。
  • 它是个独立的小程序(tray.py,随登录会话运行)—— 服务本身跑在后台会话里,没法直接弹通知。
    只用管理员权限才能在 Program Files 写日志,所以托盘自己的日志在
    %LOCALAPPDATA%\DrcomAutoLogin\tray.log。
  • 接口、配置结构、服务名、AppId 全未动(PATCH +1),老配置与升级路径不受影响。

安装包信息

项 值
应用版本 2.0.13.0 "Sirius"
文件名 StardustFlashLink-Setup-v2.0.13.0.exe
大小 11912120 bytes(约 11.36 MB)
SHA256 641e24c02191477225384d7409e76a6f6e2020ec18e113026053d92b6f85442f
构建提交 f8b152f
构建编号 #70
构建时间 2026-09-28
系统要求 Windows 10/11 x64(安装包已内嵌 Python,无需预装)

安装后会自动注册系统服务、创建桌面与开始菜单快捷方式。
首次使用请通过 Web UI(http://127.0.0.1:8848)填写账号与密码。

升级本版前请注意:若你的机器上 nssm 的 AppExit 曾被写成空值,需要管理员执行一次
nssm set DrcomAutoLogin AppExit Default Ignore;服务下次启动时也会尝试自愈。

用户机器验证步骤(装包后跑)

Get-Service DrcomAutoLogin | Select-Object Status, StartType
(Invoke-WebRequest http://127.0.0.1:8848/api/config -UseBasicParsing -TimeoutSec 10).StatusCode   # 必须是 200,且不能挂住
Get-Content "D:\Program Files\DrcomAutoLogin\logs\service_stderr.log" -Tail 30
Get-Content "D:\Program Files\DrcomAutoLogin\logs\campus_login.log" -Tail 50 | Select-String -Pattern "NameError|ModuleNotFound"
Get-Content "D:\Program Files\DrcomAutoLogin\logs\upgrade.log" -Tail 20

预期:Status=Running;/api/config 立刻 200(配置页能读到值、保存立即生效);
stderr 无 ModuleNotFoundError;campus_login.log 无 NameError;
upgrade.log 不再出现「几十秒一轮的下载 → 装 → 重启」死循环。
自动升级过的话,upgrade.log 里还应看到
升级执行器结果:installer_rc=0 / service=RUNNING / health=OK(前两项是 v2.0.4.2 的退出码与
服务状态回报,health= 是 v2.0.10.0 新增的 HTTP 健康探测结论 ——
OK 表示服务真的答上了 /api/health,比 sc query 可信)。
若这里是 health=FAIL,同一份日志里还会有一行「升级看门狗:HTTP 健康检查未通过」写明原因。

校验

certutil -hashfile StardustFlashLink-Setup-v2.0.13.0.exe SHA256

本 release 是自动升级通道(非 prerelease):客户端读 /releases/latest 取版本号与 asset digest(fail-closed 校验)。
固定下载链接仍见 prerelease installer。

v2.0.12.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 03:12
f02c503

Windows 安装程序 v2.0.12.0 "Sirius"(天狼星)(Inno Setup 自动构建 · 安装包已内嵌 Python,无需预装)。

本版变更

✨ 新增(相对 v2.0.11.0)

  • 日志不再无限长大:业务日志超过 5 MB 自动轮转(保留 3 份旧档,合计 ≤ 20 MB),
    升级日志超过 2 MB 轮转(保留 2 份)—— 以前只能靠你自己去删。
    状态页「近 7 天」的统计会把旧档一起读,轮转不会让数字凭空变少。
  • 一键诊断包(已脱敏):「关于 → 日志与诊断」里能看到各日志占用,并一键下载诊断包 ——
    里面是版本 / 运行环境 / 服务状态 + 脱敏后的配置 + 各日志尾部(每个 ≤ 512 KB)。
    账号打码成「前 4 位 + ******」、MAC 打码、不含任何密码;校园网内网 IP 与 Wi-Fi 名会保留
    (排障需要),分享前请自行确认。反馈问题时发它,比截图 + 口述都准。

✨ 新增(相对 v2.0.10.0)

  • 升级前备份整目录 + 升级失败自动回滚:以前升级前只留一个 联网_service.py 的副本
    (还放在 %TEMP%),真要是新版本起不来,别的模块就回不去了 ✗。现在升级前会把全部代码文件
    备份到安装目录的 backup\<旧版本>\(每个文件都记 sha256),并且:
    • 执行器在两轮健康探测都探不到服务时,自动还原这些文件、重启服务、再探一次;
    • Web UI「配置 → 自动升级 → 版本回滚」也能手动一键回退到某个备份版本(服务会重启,约 15 秒)。
  • 回滚只动代码:config.json、密码、配置方案都不动(备份里那份 config.json 只供你人工比对)。
    备份保留 7 天、至少留最新 2 份;卸载时一并清掉。
  • 安全兜底:备份被改坏、清单缺失、版本对不上、清单里文件名带路径分隔符 → 一律拒绝回滚
    且不写任何文件(宁可不动,也不写出一套「半新半旧」的代码)。
  • 顺带修掉一个陷阱:升级后的启动自检原先「找不到旧式备份就直接跳过」,换备份方案后会把
    升级结果确认、AppExit 自愈、托盘自启项对齐全部跳过 ✗ —— 现在照常执行。

✨ 新增(相对 v2.0.9.1)

  • 升级收尾改探 HTTP 健康端点:自动升级跑完安装器后,执行器会用随包内嵌的 Python 探一次
    http://127.0.0.1:<你的端口>/api/health —— 只有拿到 {"ok": true} 才算「服务真的活了」。
    此前只看 sc query,而那是 nssm 的 wrapper:里面的 Python 崩了它照样显示 RUNNING
    (AppExit=Ignore:不重启也不报错),所以「升级把服务弄挂了」以前要等你自己发现 ✗。
  • 探不到就自动重启重试:先 sc stop + sc start 重启一次服务,再给一个窗口重探。
  • 失败会留下明确告警:结论写进 logs\upgrade.log(中文、带时间戳)。
    服务真起不来时 Web UI 也打不开,那行日志就是唯一的告警面 ——
    托盘右键「打开日志目录」即可看到,里面会写明「服务可能没起来」与下一步该看哪个日志。
  • 顺手修掉一个从 v2.0.4.2 起就在的老坑:升级记录里的 installer_rc=(安装器退出码)其实
    从来没真正写下来过 —— echo installer_rc=0>"…" 里的数字紧贴 >,cmd 会把它当成
    「句柄 0 重定向」→ 文件被写空、文本跑进 stdout ✗,于是「安装器非 0 退出码就告警」那条
    一直是死代码。现在改成把重定向写在命令前面,退出码正常落盘,装失败时日志里能看见它。
  • 探针自包含(只用标准库、不读你的配置以外的东西、不走系统代理),跑完自删;
    内嵌 Python 或探针缺失时自动退回旧判据(不影响升级本身)。

⚠️ 如果你装过 v2.0.8.0 且 Web UI 打不开 / 托盘说「服务未响应」:
重新运行本安装包即可恢复(会自动停服务 → 补齐文件 → 再启动服务;配置与密码不变)。

🔴 紧急修复(相对 v2.0.8.0)

  • 修「升级时安装中途回滚把安装弄坏」:托盘进程锁着 {app}\python\libcrypto-3.dll,
    安装器替换它失败后静默模式会 Abort 并回滚 ✗ —— 结果新脚本已就位、新增的 metrics.py
    被回滚删掉,服务启动即崩、Web UI 端口消失。现在安装器在写任何文件之前先请走托盘
    (只匹配「tray.py + 本安装目录」的进程,不误伤别的程序),并且可选模块缺失时服务降级运行
    (只是少一块面板,不影响登录与页面)。

⚠️ 装过 v2.0.9.0 且 Web UI 打不开 / 托盘说「服务未响应」的话:重新运行本安装包即可恢复
(配置、密码、方案都不动)。

🔴 紧急修复(相对 v2.0.9.0)

  • 修「升级后服务起不来」:v2.0.9.0 在服务主流程里多写了一句 import protocol as _protocol_mod,
    而 Python 里函数内的 import 会让该名字在整个函数里变成局部变量 ✗ → 同一函数里更早的
    _protocol_mod._attach(...) 直接 UnboundLocalError → 服务启动即退 ✗(nssm 配的是
    AppExit=Ignore,不会自动重启,所以表现成"服务在跑、网页打不开")。
    已删掉该行,并加静态守卫:服务里出现「函数内 import 模块别名」一律判失败。

✨ 新增(相对 v2.0.8.1)

  • 配置方案:给「教室 / 宿舍 / 家里」各存一套位置相关设置(认证网关、检查间隔、
    网络位置守卫白名单),配置页一键切换;填了「自动匹配的 Wi-Fi 名」的方案还能在打开
    「按 Wi-Fi 名自动切换」后自动切换(默认关)。
  • 账号、密码、升级设置不会进方案,切换方案也不动它们 —— 换的只是"哪儿该不该登录"。
  • 新增 GET /api/profiles 与 POST /api/profiles/save|activate|delete|auto 四个写接口
    (老接口与老配置完全不受影响)。

✨ 新增(相对 v2.0.7.1)

  • 连接质量面板:状态页新增「在线率(近 7 天)/ 掉线重登 / 平均恢复耗时 / 当前延迟」
    与一张近 7 天柱状图。数据全部从已有日志现算,不新增状态文件 —— 服务重启不清零、
    升级不丢数据。延迟量的是到校园网关的 TCP 握手(校园网常禁 ping)。
  • 接口 GET /api/metrics?days=7(1–30 天);面板属于锦上添花:日志被删、参数非法、
    统计出错都只在面板上显示空白,不影响状态页其它部分。

🔧 修复(相对 v2.0.7.0)

  • 升级后托盘会自己换上新代码:以前升级只换了磁盘上的文件,正在跑的托盘还留在内存里的
    旧版本 —— 于是像「睡醒 / 换网立刻重连」这种新功能要等到下次注销 / 重启才生效 ✗。
    现在托盘盯着自己的脚本指纹(mtime + 大小),一变就先放开单实例锁 → 起新进程 → 自己退出;
    万一新进程起不来,会把锁拿回来继续跑(只记一行日志,不会反复重试)。

✨ 新增(相对 v2.0.6.3)

  • 睡醒 / 换网之后立刻重连:以前合盖睡一觉、插网线、换 Wi-Fi 之后,服务可能要等到下一次
    周期检查(默认 30 分钟)才补上登录 ✗。现在托盘盯着这两类事件 —— 系统唤醒(等 4 秒让网卡
    连上)与网络地址变化(立刻)—— 一到就触发一次登录检查。
  • 事件有 5 秒去抖(唤醒时电源 + 无线 + DHCP 常常连着来);拿不到事件时自动退化成原来的
    10 秒轮询,不会因为新功能变脆弱。

🔧 修复(相对 v2.0.6.2)

  • 升级 / 检查按钮不再「假成功」:先点「立即检查更新」、紧接着点「立即升级」时,
    第二个请求会被升级锁挡掉,但接口一律先回「已提交」✗ —— 界面提示「升级已启动」,
    实际什么都没发生。现在两个入口先探锁再回车:忙就回 409 + 当前进度
    (「任务进行中(检查 GitHub 最新版本...),请稍候再试」),空闲才回「已提交」并真的开跑。

🔧 修复(相对 v2.0.6.1)

  • 自动升级上来的用户,托盘也会自启了:之前从旧版升级上来时,安装器不知道新加的
    「托盘」任务,启动项会被跳过 ✗。现在改由服务每次启动对齐(安装器把开关记进注册表,
    服务据此建 / 修 / 删启动项)—— 不论你从哪个版本升上来都能自愈。

🔧 修复(相对 v2.0.6.0)

  • 托盘自启项改挂 HKLM:原来是 HKCU,而自动升级以 SYSTEM 身份运行安装器 →
    会写进 SYSTEM 的配置单元,真实用户登录时托盘不会自启。现在对每个登录用户都生效。
  • 卸载后不再留孤儿图标:安装目录里找不到自己的脚本(连续两次轮询)时托盘自行退出。

✨ 新增:托盘图标 + 断线通知

  • 装完会多一个通知区图标(默认随开机启动,安装向导里可取消勾选)。掉线、恢复、
    服务未响应时会弹气泡提醒,不用再自己盯着网页看。
  • 右键图标:打开配置页 / 立即登录 / 打开日志目录 / 退出托盘;双击图标打开配置页;
    鼠标悬停看当前状态(含当前 Wi-Fi 名)。
  • 通知有防刷屏:刚开机不弹;偶发一次连不上服务不弹(连续 3 次 ≈30 秒才报「服务无响应」);
    同一状态不重复弹。
  • 它是个独立的小程序(tray.py,随登录会话运行)—— 服务本身跑在后台会话里,没法直接弹通知。
    只用管理员权限才能在 Program Files 写日志,所以托盘自己的日志在
    %LOCALAPPDATA%\DrcomAutoLogin\tray.log。
  • 接口、配置结构、服务名、AppId 全未动(PATCH +1),老配置与升级路径不受影响。

安装包信息

项 值
应用版本 2.0.12.0 "Sirius"
文件名 StardustFlashLink-Setup-v2.0.12.0.exe
大小 11909616 bytes(约 11.36 MB)
SHA256 2bf2c19dff5e19fe2b313555cbc8f13c9bb7ad0ffdabb1bc6699933a2b2f272f
构建提交 f02c503
构建编号 #69
构建时间 2026-09-28
系统要求 Windows 10/11 x64(安装包已内嵌 Python,无需预装)

安装后会自动注册系统服务、创建桌面与开始菜单快捷方式。
首次使用请通过 Web UI(http://127.0.0.1:8848)填写账号与密码。

升级本版前请注意:若你的机器上 nssm 的 AppExit 曾被写成空值,需要管理员执行一次
nssm set DrcomAutoLogin AppExit Default Ignore;服务下次启动时也会尝试自愈。

用户机器验证步骤(装包后跑)

Get-Service DrcomAutoLogin | Select-Object Status, StartType
(Invoke-WebRequest http://127.0.0.1:8848/api/config -UseBasicParsing -TimeoutSec 10).StatusCode   # 必须是 200,且不能挂住
Get-Content "D:\Program Files\DrcomAutoLogin\logs\service_stderr.log" -Tail 30
Get-Content "D:\Program Files\DrcomAutoLogin\logs\campus_login.log" -Tail 50 | Select-String -Pattern "NameError|ModuleNotFound"
Get-Content "D:\Program Files\DrcomAutoLogin\logs\upgrade.log" -Tail 20

预期:Status=Running;/api/config 立刻 200(配置页能读到值、保存立即生效);
stderr 无 ModuleNotFoundError;campus_login.log 无 NameError;
upgrade.log 不再出现「几十秒一轮的下载 → 装 → 重启」死循环。
自动升级过的话,upgrade.log 里还应看到
升级执行器结果:installer_rc=0 / service=RUNNING / health=OK(前两项是 v2.0.4.2 的退出码与
服务状态回报,health= 是 v2.0.10.0 新增的 HTTP 健康探测结论 ——
OK 表示服务真的答上了 /api/health,比 sc query 可信)。
若这里是 health=FAIL,同一份日志里还会有一行「升级看门狗:HTTP 健康检查未通过」写明原因。

校验

certutil -hashfile StardustFlashLink-Setup-v2.0.12.0.exe SHA256

本 release 是自动升级通道(非 prerelease):客户端读 /releases/latest 取版本号与 asset digest(fail-closed 校验)。
固定下载链接仍见 prerelease installer。

v2.0.11.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 02:54
94b8926

Windows 安装程序 v2.0.11.0 "Sirius"(天狼星)(Inno Setup 自动构建 · 安装包已内嵌 Python,无需预装)。

本版变更

✨ 新增(相对 v2.0.10.0)

  • 升级前备份整目录 + 升级失败自动回滚:以前升级前只留一个 联网_service.py 的副本
    (还放在 %TEMP%),真要是新版本起不来,别的模块就回不去了 ✗。现在升级前会把全部代码文件
    备份到安装目录的 backup\<旧版本>\(每个文件都记 sha256),并且:
    • 执行器在两轮健康探测都探不到服务时,自动还原这些文件、重启服务、再探一次;
    • Web UI「配置 → 自动升级 → 版本回滚」也能手动一键回退到某个备份版本(服务会重启,约 15 秒)。
  • 回滚只动代码:config.json、密码、配置方案都不动(备份里那份 config.json 只供你人工比对)。
    备份保留 7 天、至少留最新 2 份;卸载时一并清掉。
  • 安全兜底:备份被改坏、清单缺失、版本对不上、清单里文件名带路径分隔符 → 一律拒绝回滚
    且不写任何文件(宁可不动,也不写出一套「半新半旧」的代码)。
  • 顺带修掉一个陷阱:升级后的启动自检原先「找不到旧式备份就直接跳过」,换备份方案后会把
    升级结果确认、AppExit 自愈、托盘自启项对齐全部跳过 ✗ —— 现在照常执行。

✨ 新增(相对 v2.0.9.1)

  • 升级收尾改探 HTTP 健康端点:自动升级跑完安装器后,执行器会用随包内嵌的 Python 探一次
    http://127.0.0.1:<你的端口>/api/health —— 只有拿到 {"ok": true} 才算「服务真的活了」。
    此前只看 sc query,而那是 nssm 的 wrapper:里面的 Python 崩了它照样显示 RUNNING
    (AppExit=Ignore:不重启也不报错),所以「升级把服务弄挂了」以前要等你自己发现 ✗。
  • 探不到就自动重启重试:先 sc stop + sc start 重启一次服务,再给一个窗口重探。
  • 失败会留下明确告警:结论写进 logs\upgrade.log(中文、带时间戳)。
    服务真起不来时 Web UI 也打不开,那行日志就是唯一的告警面 ——
    托盘右键「打开日志目录」即可看到,里面会写明「服务可能没起来」与下一步该看哪个日志。
  • 顺手修掉一个从 v2.0.4.2 起就在的老坑:升级记录里的 installer_rc=(安装器退出码)其实
    从来没真正写下来过 —— echo installer_rc=0>"…" 里的数字紧贴 >,cmd 会把它当成
    「句柄 0 重定向」→ 文件被写空、文本跑进 stdout ✗,于是「安装器非 0 退出码就告警」那条
    一直是死代码。现在改成把重定向写在命令前面,退出码正常落盘,装失败时日志里能看见它。
  • 探针自包含(只用标准库、不读你的配置以外的东西、不走系统代理),跑完自删;
    内嵌 Python 或探针缺失时自动退回旧判据(不影响升级本身)。

⚠️ 如果你装过 v2.0.8.0 且 Web UI 打不开 / 托盘说「服务未响应」:
重新运行本安装包即可恢复(会自动停服务 → 补齐文件 → 再启动服务;配置与密码不变)。

🔴 紧急修复(相对 v2.0.8.0)

  • 修「升级时安装中途回滚把安装弄坏」:托盘进程锁着 {app}\python\libcrypto-3.dll,
    安装器替换它失败后静默模式会 Abort 并回滚 ✗ —— 结果新脚本已就位、新增的 metrics.py
    被回滚删掉,服务启动即崩、Web UI 端口消失。现在安装器在写任何文件之前先请走托盘
    (只匹配「tray.py + 本安装目录」的进程,不误伤别的程序),并且可选模块缺失时服务降级运行
    (只是少一块面板,不影响登录与页面)。

⚠️ 装过 v2.0.9.0 且 Web UI 打不开 / 托盘说「服务未响应」的话:重新运行本安装包即可恢复
(配置、密码、方案都不动)。

🔴 紧急修复(相对 v2.0.9.0)

  • 修「升级后服务起不来」:v2.0.9.0 在服务主流程里多写了一句 import protocol as _protocol_mod,
    而 Python 里函数内的 import 会让该名字在整个函数里变成局部变量 ✗ → 同一函数里更早的
    _protocol_mod._attach(...) 直接 UnboundLocalError → 服务启动即退 ✗(nssm 配的是
    AppExit=Ignore,不会自动重启,所以表现成"服务在跑、网页打不开")。
    已删掉该行,并加静态守卫:服务里出现「函数内 import 模块别名」一律判失败。

✨ 新增(相对 v2.0.8.1)

  • 配置方案:给「教室 / 宿舍 / 家里」各存一套位置相关设置(认证网关、检查间隔、
    网络位置守卫白名单),配置页一键切换;填了「自动匹配的 Wi-Fi 名」的方案还能在打开
    「按 Wi-Fi 名自动切换」后自动切换(默认关)。
  • 账号、密码、升级设置不会进方案,切换方案也不动它们 —— 换的只是"哪儿该不该登录"。
  • 新增 GET /api/profiles 与 POST /api/profiles/save|activate|delete|auto 四个写接口
    (老接口与老配置完全不受影响)。

✨ 新增(相对 v2.0.7.1)

  • 连接质量面板:状态页新增「在线率(近 7 天)/ 掉线重登 / 平均恢复耗时 / 当前延迟」
    与一张近 7 天柱状图。数据全部从已有日志现算,不新增状态文件 —— 服务重启不清零、
    升级不丢数据。延迟量的是到校园网关的 TCP 握手(校园网常禁 ping)。
  • 接口 GET /api/metrics?days=7(1–30 天);面板属于锦上添花:日志被删、参数非法、
    统计出错都只在面板上显示空白,不影响状态页其它部分。

🔧 修复(相对 v2.0.7.0)

  • 升级后托盘会自己换上新代码:以前升级只换了磁盘上的文件,正在跑的托盘还留在内存里的
    旧版本 —— 于是像「睡醒 / 换网立刻重连」这种新功能要等到下次注销 / 重启才生效 ✗。
    现在托盘盯着自己的脚本指纹(mtime + 大小),一变就先放开单实例锁 → 起新进程 → 自己退出;
    万一新进程起不来,会把锁拿回来继续跑(只记一行日志,不会反复重试)。

✨ 新增(相对 v2.0.6.3)

  • 睡醒 / 换网之后立刻重连:以前合盖睡一觉、插网线、换 Wi-Fi 之后,服务可能要等到下一次
    周期检查(默认 30 分钟)才补上登录 ✗。现在托盘盯着这两类事件 —— 系统唤醒(等 4 秒让网卡
    连上)与网络地址变化(立刻)—— 一到就触发一次登录检查。
  • 事件有 5 秒去抖(唤醒时电源 + 无线 + DHCP 常常连着来);拿不到事件时自动退化成原来的
    10 秒轮询,不会因为新功能变脆弱。

🔧 修复(相对 v2.0.6.2)

  • 升级 / 检查按钮不再「假成功」:先点「立即检查更新」、紧接着点「立即升级」时,
    第二个请求会被升级锁挡掉,但接口一律先回「已提交」✗ —— 界面提示「升级已启动」,
    实际什么都没发生。现在两个入口先探锁再回车:忙就回 409 + 当前进度
    (「任务进行中(检查 GitHub 最新版本...),请稍候再试」),空闲才回「已提交」并真的开跑。

🔧 修复(相对 v2.0.6.1)

  • 自动升级上来的用户,托盘也会自启了:之前从旧版升级上来时,安装器不知道新加的
    「托盘」任务,启动项会被跳过 ✗。现在改由服务每次启动对齐(安装器把开关记进注册表,
    服务据此建 / 修 / 删启动项)—— 不论你从哪个版本升上来都能自愈。

🔧 修复(相对 v2.0.6.0)

  • 托盘自启项改挂 HKLM:原来是 HKCU,而自动升级以 SYSTEM 身份运行安装器 →
    会写进 SYSTEM 的配置单元,真实用户登录时托盘不会自启。现在对每个登录用户都生效。
  • 卸载后不再留孤儿图标:安装目录里找不到自己的脚本(连续两次轮询)时托盘自行退出。

✨ 新增:托盘图标 + 断线通知

  • 装完会多一个通知区图标(默认随开机启动,安装向导里可取消勾选)。掉线、恢复、
    服务未响应时会弹气泡提醒,不用再自己盯着网页看。
  • 右键图标:打开配置页 / 立即登录 / 打开日志目录 / 退出托盘;双击图标打开配置页;
    鼠标悬停看当前状态(含当前 Wi-Fi 名)。
  • 通知有防刷屏:刚开机不弹;偶发一次连不上服务不弹(连续 3 次 ≈30 秒才报「服务无响应」);
    同一状态不重复弹。
  • 它是个独立的小程序(tray.py,随登录会话运行)—— 服务本身跑在后台会话里,没法直接弹通知。
    只用管理员权限才能在 Program Files 写日志,所以托盘自己的日志在
    %LOCALAPPDATA%\DrcomAutoLogin\tray.log。
  • 接口、配置结构、服务名、AppId 全未动(PATCH +1),老配置与升级路径不受影响。

安装包信息

项 值
应用版本 2.0.11.0 "Sirius"
文件名 StardustFlashLink-Setup-v2.0.11.0.exe
大小 11907505 bytes(约 11.36 MB)
SHA256 f02fc84b63d63db24b14f13c2b455c757db0489ef0d6da17988198acaadfc40d
构建提交 94b8926
构建编号 #68
构建时间 2026-09-28
系统要求 Windows 10/11 x64(安装包已内嵌 Python,无需预装)

安装后会自动注册系统服务、创建桌面与开始菜单快捷方式。
首次使用请通过 Web UI(http://127.0.0.1:8848)填写账号与密码。

升级本版前请注意:若你的机器上 nssm 的 AppExit 曾被写成空值,需要管理员执行一次
nssm set DrcomAutoLogin AppExit Default Ignore;服务下次启动时也会尝试自愈。

用户机器验证步骤(装包后跑)

Get-Service DrcomAutoLogin | Select-Object Status, StartType
(Invoke-WebRequest http://127.0.0.1:8848/api/config -UseBasicParsing -TimeoutSec 10).StatusCode   # 必须是 200,且不能挂住
Get-Content "D:\Program Files\DrcomAutoLogin\logs\service_stderr.log" -Tail 30
Get-Content "D:\Program Files\DrcomAutoLogin\logs\campus_login.log" -Tail 50 | Select-String -Pattern "NameError|ModuleNotFound"
Get-Content "D:\Program Files\DrcomAutoLogin\logs\upgrade.log" -Tail 20

预期:Status=Running;/api/config 立刻 200(配置页能读到值、保存立即生效);
stderr 无 ModuleNotFoundError;campus_login.log 无 NameError;
upgrade.log 不再出现「几十秒一轮的下载 → 装 → 重启」死循环。
自动升级过的话,upgrade.log 里还应看到
升级执行器结果:installer_rc=0 / service=RUNNING / health=OK(前两项是 v2.0.4.2 的退出码与
服务状态回报,health= 是 v2.0.10.0 新增的 HTTP 健康探测结论 ——
OK 表示服务真的答上了 /api/health,比 sc query 可信)。
若这里是 health=FAIL,同一份日志里还会有一行「升级看门狗:HTTP 健康检查未通过」写明原因。

校验

certutil -hashfile StardustFlashLink-Setup-v2.0.11.0.exe SHA256

本 release 是自动升级通道(非 prerelease):客户端读 /releases/latest 取版本号与 asset digest(fail-closed 校验)。
固定下载链接仍见 prerelease installer。

v2.0.10.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 02:27
b1b2b1e

Windows 安装程序 v2.0.10.0 "Sirius"(天狼星)(Inno Setup 自动构建 · 安装包已内嵌 Python,无需预装)。

本版变更

✨ 新增(相对 v2.0.9.1)

  • 升级收尾改探 HTTP 健康端点:自动升级跑完安装器后,执行器会用随包内嵌的 Python 探一次
    http://127.0.0.1:<你的端口>/api/health —— 只有拿到 {"ok": true} 才算「服务真的活了」。
    此前只看 sc query,而那是 nssm 的 wrapper:里面的 Python 崩了它照样显示 RUNNING
    (AppExit=Ignore:不重启也不报错),所以「升级把服务弄挂了」以前要等你自己发现 ✗。
  • 探不到就自动重启重试:先 sc stop + sc start 重启一次服务,再给一个窗口重探。
  • 失败会留下明确告警:结论写进 logs\upgrade.log(中文、带时间戳)。
    服务真起不来时 Web UI 也打不开,那行日志就是唯一的告警面 ——
    托盘右键「打开日志目录」即可看到,里面会写明「服务可能没起来」与下一步该看哪个日志。
  • 顺手修掉一个从 v2.0.4.2 起就在的老坑:升级记录里的 installer_rc=(安装器退出码)其实
    从来没真正写下来过 —— echo installer_rc=0>"…" 里的数字紧贴 >,cmd 会把它当成
    「句柄 0 重定向」→ 文件被写空、文本跑进 stdout ✗,于是「安装器非 0 退出码就告警」那条
    一直是死代码。现在改成把重定向写在命令前面,退出码正常落盘,装失败时日志里能看见它。
  • 探针自包含(只用标准库、不读你的配置以外的东西、不走系统代理),跑完自删;
    内嵌 Python 或探针缺失时自动退回旧判据(不影响升级本身)。

⚠️ 如果你装过 v2.0.8.0 且 Web UI 打不开 / 托盘说「服务未响应」:
重新运行本安装包即可恢复(会自动停服务 → 补齐文件 → 再启动服务;配置与密码不变)。

🔴 紧急修复(相对 v2.0.8.0)

  • 修「升级时安装中途回滚把安装弄坏」:托盘进程锁着 {app}\python\libcrypto-3.dll,
    安装器替换它失败后静默模式会 Abort 并回滚 ✗ —— 结果新脚本已就位、新增的 metrics.py
    被回滚删掉,服务启动即崩、Web UI 端口消失。现在安装器在写任何文件之前先请走托盘
    (只匹配「tray.py + 本安装目录」的进程,不误伤别的程序),并且可选模块缺失时服务降级运行
    (只是少一块面板,不影响登录与页面)。

⚠️ 装过 v2.0.9.0 且 Web UI 打不开 / 托盘说「服务未响应」的话:重新运行本安装包即可恢复
(配置、密码、方案都不动)。

🔴 紧急修复(相对 v2.0.9.0)

  • 修「升级后服务起不来」:v2.0.9.0 在服务主流程里多写了一句 import protocol as _protocol_mod,
    而 Python 里函数内的 import 会让该名字在整个函数里变成局部变量 ✗ → 同一函数里更早的
    _protocol_mod._attach(...) 直接 UnboundLocalError → 服务启动即退 ✗(nssm 配的是
    AppExit=Ignore,不会自动重启,所以表现成"服务在跑、网页打不开")。
    已删掉该行,并加静态守卫:服务里出现「函数内 import 模块别名」一律判失败。

✨ 新增(相对 v2.0.8.1)

  • 配置方案:给「教室 / 宿舍 / 家里」各存一套位置相关设置(认证网关、检查间隔、
    网络位置守卫白名单),配置页一键切换;填了「自动匹配的 Wi-Fi 名」的方案还能在打开
    「按 Wi-Fi 名自动切换」后自动切换(默认关)。
  • 账号、密码、升级设置不会进方案,切换方案也不动它们 —— 换的只是"哪儿该不该登录"。
  • 新增 GET /api/profiles 与 POST /api/profiles/save|activate|delete|auto 四个写接口
    (老接口与老配置完全不受影响)。

✨ 新增(相对 v2.0.7.1)

  • 连接质量面板:状态页新增「在线率(近 7 天)/ 掉线重登 / 平均恢复耗时 / 当前延迟」
    与一张近 7 天柱状图。数据全部从已有日志现算,不新增状态文件 —— 服务重启不清零、
    升级不丢数据。延迟量的是到校园网关的 TCP 握手(校园网常禁 ping)。
  • 接口 GET /api/metrics?days=7(1–30 天);面板属于锦上添花:日志被删、参数非法、
    统计出错都只在面板上显示空白,不影响状态页其它部分。

🔧 修复(相对 v2.0.7.0)

  • 升级后托盘会自己换上新代码:以前升级只换了磁盘上的文件,正在跑的托盘还留在内存里的
    旧版本 —— 于是像「睡醒 / 换网立刻重连」这种新功能要等到下次注销 / 重启才生效 ✗。
    现在托盘盯着自己的脚本指纹(mtime + 大小),一变就先放开单实例锁 → 起新进程 → 自己退出;
    万一新进程起不来,会把锁拿回来继续跑(只记一行日志,不会反复重试)。

✨ 新增(相对 v2.0.6.3)

  • 睡醒 / 换网之后立刻重连:以前合盖睡一觉、插网线、换 Wi-Fi 之后,服务可能要等到下一次
    周期检查(默认 30 分钟)才补上登录 ✗。现在托盘盯着这两类事件 —— 系统唤醒(等 4 秒让网卡
    连上)与网络地址变化(立刻)—— 一到就触发一次登录检查。
  • 事件有 5 秒去抖(唤醒时电源 + 无线 + DHCP 常常连着来);拿不到事件时自动退化成原来的
    10 秒轮询,不会因为新功能变脆弱。

🔧 修复(相对 v2.0.6.2)

  • 升级 / 检查按钮不再「假成功」:先点「立即检查更新」、紧接着点「立即升级」时,
    第二个请求会被升级锁挡掉,但接口一律先回「已提交」✗ —— 界面提示「升级已启动」,
    实际什么都没发生。现在两个入口先探锁再回车:忙就回 409 + 当前进度
    (「任务进行中(检查 GitHub 最新版本...),请稍候再试」),空闲才回「已提交」并真的开跑。

🔧 修复(相对 v2.0.6.1)

  • 自动升级上来的用户,托盘也会自启了:之前从旧版升级上来时,安装器不知道新加的
    「托盘」任务,启动项会被跳过 ✗。现在改由服务每次启动对齐(安装器把开关记进注册表,
    服务据此建 / 修 / 删启动项)—— 不论你从哪个版本升上来都能自愈。

🔧 修复(相对 v2.0.6.0)

  • 托盘自启项改挂 HKLM:原来是 HKCU,而自动升级以 SYSTEM 身份运行安装器 →
    会写进 SYSTEM 的配置单元,真实用户登录时托盘不会自启。现在对每个登录用户都生效。
  • 卸载后不再留孤儿图标:安装目录里找不到自己的脚本(连续两次轮询)时托盘自行退出。

✨ 新增:托盘图标 + 断线通知

  • 装完会多一个通知区图标(默认随开机启动,安装向导里可取消勾选)。掉线、恢复、
    服务未响应时会弹气泡提醒,不用再自己盯着网页看。
  • 右键图标:打开配置页 / 立即登录 / 打开日志目录 / 退出托盘;双击图标打开配置页;
    鼠标悬停看当前状态(含当前 Wi-Fi 名)。
  • 通知有防刷屏:刚开机不弹;偶发一次连不上服务不弹(连续 3 次 ≈30 秒才报「服务无响应」);
    同一状态不重复弹。
  • 它是个独立的小程序(tray.py,随登录会话运行)—— 服务本身跑在后台会话里,没法直接弹通知。
    只用管理员权限才能在 Program Files 写日志,所以托盘自己的日志在
    %LOCALAPPDATA%\DrcomAutoLogin\tray.log。
  • 接口、配置结构、服务名、AppId 全未动(PATCH +1),老配置与升级路径不受影响。

安装包信息

项 值
应用版本 2.0.10.0 "Sirius"
文件名 StardustFlashLink-Setup-v2.0.10.0.exe
大小 11898227 bytes(约 11.35 MB)
SHA256 f147aadf1f8e54d3ae88d1e3eed34b38ef99722060d8e1b5de7c267072073406
构建提交 b1b2b1e
构建编号 #67
构建时间 2026-09-28
系统要求 Windows 10/11 x64(安装包已内嵌 Python,无需预装)

安装后会自动注册系统服务、创建桌面与开始菜单快捷方式。
首次使用请通过 Web UI(http://127.0.0.1:8848)填写账号与密码。

升级本版前请注意:若你的机器上 nssm 的 AppExit 曾被写成空值,需要管理员执行一次
nssm set DrcomAutoLogin AppExit Default Ignore;服务下次启动时也会尝试自愈。

用户机器验证步骤(装包后跑)

Get-Service DrcomAutoLogin | Select-Object Status, StartType
(Invoke-WebRequest http://127.0.0.1:8848/api/config -UseBasicParsing -TimeoutSec 10).StatusCode   # 必须是 200,且不能挂住
Get-Content "D:\Program Files\DrcomAutoLogin\logs\service_stderr.log" -Tail 30
Get-Content "D:\Program Files\DrcomAutoLogin\logs\campus_login.log" -Tail 50 | Select-String -Pattern "NameError|ModuleNotFound"
Get-Content "D:\Program Files\DrcomAutoLogin\logs\upgrade.log" -Tail 20

预期:Status=Running;/api/config 立刻 200(配置页能读到值、保存立即生效);
stderr 无 ModuleNotFoundError;campus_login.log 无 NameError;
upgrade.log 不再出现「几十秒一轮的下载 → 装 → 重启」死循环。
自动升级过的话,upgrade.log 里还应看到
升级执行器结果:installer_rc=0 / service=RUNNING / health=OK(前两项是 v2.0.4.2 的退出码与
服务状态回报,health= 是 v2.0.10.0 新增的 HTTP 健康探测结论 ——
OK 表示服务真的答上了 /api/health,比 sc query 可信)。
若这里是 health=FAIL,同一份日志里还会有一行「升级看门狗:HTTP 健康检查未通过」写明原因。

校验

certutil -hashfile StardustFlashLink-Setup-v2.0.10.0.exe SHA256

本 release 是自动升级通道(非 prerelease):客户端读 /releases/latest 取版本号与 asset digest(fail-closed 校验)。
固定下载链接仍见 prerelease installer。