# os-active
**Repository Path**: eternalnight996/os-active
## Basic Information
- **Project Name**: os-active
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-08-18
- **Last Updated**: 2026-08-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# OS Active 系统激活状态检测
🌟 Gitee |
🐙 GitHub |
📦 下载
**一句话**: 跨平台 GUI 工具,一键检测 **银河麒麟 / 统信 UOS / Ubuntu 18.04+ / Windows 10/11** 的系统激活状态,读取设备 **SN**,e-log 把明细写入**程序目录 `logs/{操作系统}-{名称}-{product_serial}.log`**(如 `uos-os-active-8CG2100C5Z.log`),退出输出 ETest 标准 `R<{json}>R`。
## 功能
- ✅ **激活状态检测**: 启动即自动检测,大字英雄区显示 已激活 / 未激活 / 无需激活 / 无法判定
- ✅ **授权到期时间**: GUI 系统信息区显示授权到期(麒麟 `.kyinfo` term / 统信 `到期时间` / Windows 批量激活过期)
- ✅ **SN 读取**: 多方案自动探测(见下文),工具路径可在配置表自配
- ✅ **GUI 明细**: 系统信息(系统/版本/架构/SN/发行版) + 检测明细表格(检测项/命令/判定/原始输出)
- ✅ **e-log 日志**: 明细写入 `logs/{操作系统}-{名称}-{product_serial}.log`(如 `uos-os-active-8CG2100C5Z.log`,程序目录,避免写 U 盘)
- ✅ **确认流程**: 已激活点「确认激活状态」→ 倒计时自动关闭;未激活时 auto_close 开→自动关窗,关→显示「重新检测」
- ✅ **ETest R 标准输出**: 退出时输出 `R<{json}>R`,仅「激活校验通过 + 已确认」才 `status:true`
- ✅ **配置表自动生成**: 首次运行无 `os-active.toml` 自动生成默认配置(含注释)
- ✅ **tools 工具 + start.sh**: 按 `tools/<工具名>/<架构>//<工具>` 放置,`start.sh` 一键提权启动+EGL 回退
- ✅ **文件夹部署包**: `just pack` 产出与产测工具一致的部署目录
## 界面预览
| 系统 | PASS(全部校验通过) | FAIL(存在未通过项) |
|---|---|---|
| Windows 10 |  | — |
| 银河麒麟 V10 |  |  |
| 统信 UOS V20 |  |  |
> 主界面:大字 `PASS`/`FAIL` = 全部启用校验(产品序列号/主板序列号/激活状态)通过与否;「校验流程」逐项列出 通过/跳过/失败;「系统信息」含 产品序列号/主板序列号/激活状态/授权到期(检测明细表仅 debug 构建);确认后倒计时自动关闭,退出输出 ETest `R<...>R` 结果。
## 激活检测原理
| 系统 | 检测方式 | 判定依据 |
|---|---|---|
| Windows 10/11 | `slmgr.vbs -xpr` + `-dlv` | 永久激活/已激活/将在…到期 → 已激活;通知模式/未授权 → 未激活 |
| 银河麒麟 | `kylin_activation_check`(官方) | 含已激活 → 已激活;含未激活/试用/已过期 → 未激活 |
| 统信 UOS V20 | `uos-activator-cmd -q`(官方) | 激活状态=免费授权/已激活 → 已激活;试用期/未激活 → 未激活 |
| Ubuntu 18.04+ | 无激活机制 | 无需激活 |
> 麒麟激活:仅用 `kylin_activation_check`(非空才判定;已移除 licence -l / nklicadm -s / 文件式 .kyinfo/.kyactivation/kylin-verify);到期时间取自其「试用到期时间」。
> **系统激活(生产激活)**:UOS/麒麟界面提供「系统激活」面板(仅未激活时显示)——UOS 选激活码/KMS/试用;麒麟选激活码/一键激活(-b),若配置 `[activate].qrcode=true` 再加「扫码激活(-q)」。输入激活码后点「执行激活」调用 `uos-activator-cmd`/`kylin_activate` 执行,执行后自动重新检测并更新激活状态。
## SN 读取
多方案自动探测,工具路径可在 `os-active.toml` 的 `[sn].tool_path` 自配:
| # | 方案 | 来源 | 需 root |
|---|---|---|---|
**product_serial(主 SN)链 — 查询默认全开,查到即跳过后续:**
| # | 方案 | 来源 | 需 root |
|---|---|---|---|
| 1 | ByoDmi 工具 `-smbiosinfo` | DMI SMBIOS Type1 Serial(对齐产测烧录位置) | 是 |
| 2 | `dmidecode -s system-serial-number` | DMI 标准命令 | 是 |
| 3 | `/sys/class/dmi/id/product_serial` | DMI sysfs | 否 |
**board_serial 链 — 查询默认全开,查到即跳过后续:**
| # | 方案 | 来源 | 需 root |
|---|---|---|---|
| 1 | `dmidecode -s baseboard-serial-number` | DMI 标准命令 | 是 |
| 2 | `/sys/class/dmi/id/board_serial` | DMI 主板序列号 | 否 |
**Windows:** `Win32_BIOS.SerialNumber`
> 查询按优先级、查到即跳过后续;过滤占位符(`To be filled`/`None`);是否校验由 `os-active.toml` 的 `[sn].require_product_serial`(product_serial)与 `[sn].require_board_serial`(board_serial)控制。
## 使用
### Linux(麒麟/统信/Ubuntu)
```bash
./scripts/start.sh # 一键:root 提权(读 SN)+ 图形环境保留 + EGL 三级回退 + 启动
# 或手动(需 root 读 SN,EGL 回退):
E_AUTOTEST_GL=egl ./os-active
```
### Windows
```bash
os-active.exe
```
## 配置表 os-active.toml
首次运行自动生成(含注释),可修改后重启生效:
```toml
[app]
close_after_secs = 3 # PASS 后倒计时 N 秒自动关闭窗口(默认 3)
auto_close = false # true:全部校验通过自动确认并倒计时关闭
[sn]
# SN 工具(ByoDmi)路径,可自配;留空自动探测 tools/ByoDmi/<架构>//ByoDmi
tool_path = "" # SN 工具路径,留空自动探测
require_product_serial = true # 是否校验 product_serial 非空(计入 PASS)
require_board_serial = true # 是否校验 board_serial 非空(计入 PASS)
[activate]
qrcode = true # 是否开启「扫码激活」
check_activation = true # 是否把「系统激活状态」计入 PASS(默认 true)
```
## ETest R 输出
退出时(on_exit)输出一行 `R<{json}>R`(ETest 插件标准,主程序正则提取判定):
```json
R<{"content":"PASS;银河麒麟已激活;auto确认","status":true,"opts":{"activation":"已激活","sn":"MT81...","board_serial":"...","all_pass":true,"checks":[{"name":"产品序列号(product_serial)校验","enabled":true,"passed":true,"detail":"MT81..."},...],"expire_at":"2027-05-29",...}}>R
```
- `status:true` 需**同时满足**: 1) 全部启用校验通过(product_serial/board_serial/激活状态,按 toml 启用) 2) 已确认(按钮 或 auto_close=true)
- `content`: `PASS;...`(通过) / `NG;...`(未通过,含原因)
- `opts`: 系统信息 + product_serial/board_serial + 校验流 `checks` + 授权到期 + 激活判定 + 确认方式 + 检测明细(`details`,**仅 debug 构建**)
> 主界面大字 `PASS`/`FAIL` 由校验流决定:全部启用校验通过→`PASS`;任一失败→`FAIL`;下方「校验流程」逐项列出 通过/跳过/失败 与详情,系统激活状态在「系统信息」栏单独显示。
## 日志
- **程序目录 `logs/{操作系统}-{名称}-{product_serial}.log`**(如 `uos-os-active-8CG2100C5Z.log`;当前软件路径,避免写 U 盘;不可写则 fallback 家目录): 检测明细(每条命令 + 原始输出 + 判定,**仅 debug 构建**;release 仅结果级日志)
- `logs/bug.os-active.log`: panic 崩溃现场
- GUI 底部展示日志文件路径与最新日志,一键打开日志目录
> **release(生产)剔除检测明细**:GUI「检测明细」表、逐条命令日志、R 输出 `details` 均仅 debug 构建携带(`#[cfg(debug_assertions)]`);生产版只显示 校验流/系统信息/激活状态,输出 R 结果。debug 构建用 `just run`(`cargo build`),release 用 `just build-win`/`build-linux`(`cargo build --release`)。
## 构建与打包
依赖 **Rust**(≥1.85)与 **just**:
```bash
cargo install just
just setup # 一键装齐工具链
just doctor # 环境自检
just run # 本机运行
just dist # Windows 包 → dist/os-active-v<版本>.zip
just deb-native # Linux deb(Linux 原生构建,推荐)
just pack # 文件夹部署包 → dist/os-active-pack-v<版本>/(主程序+tools+README+start.sh+config)
```
Linux 二进制以 glibc 2.27 为基线,一次构建可在 Ubuntu 18.04+ / Kylin / UOS 全系运行;`start.sh`/deb 启动器内置 GLX→EGL→软件渲染三级显示回退。
## 发布(Release)
双源发布:**GitHub**(境外)+ **Gitee**(国内),同一批安装包两边都出 tag/release(参考 dsh-desktop 联动)。
**① 一键自动(推荐,CI)**
`.github/workflows/release.yml` 在推送 `v*` tag 时自动:
1. 构建 Windows zip + Linux deb(CI runner 原生编译;老系统 Ubuntu18+/Kylin/UOS 用本地 `just deb-native` 或 Windows 交叉 `just deb` 打 glibc 2.27 包)
2. `release`:GitHub Release 建 tag + 上传 zip/deb(用自动 `github.token`,无需额外 secret)
3. `gitee`:同步分支/tag 到 Gitee + `scripts/publish-gitee.mjs` 上传到 Gitee 发行版(用 secret `OS_ACTIVE_TOKEN`)
```bash
just dist && git tag v0.2.0 && git push origin v0.2.0 github v0.2.0 # 推 tag 触发 CI
# 或 GitHub Actions 页手动 Run workflow,填 tag(如 v0.2.0)补发
```
**前置 secret**(GitHub 仓库 → Settings → Secrets and variables → Actions → New repository secret):
- `OS_ACTIVE_TOKEN` = **Gitee 私人令牌**(gitee.com → 设置 → 安全设置 → 私人令牌,勾选 `projects/releases`)。
- 网页建 secret 只填「名称 + 值」即可,**无需公钥**;若走 REST API 才需仓库加密公钥:`gh api repos/EternalNight996/os-active/actions/secrets/public-key --jq '{key,key_id}'`(先 `gh auth login`)。
**② 手动 CLI(本地/补发)**
```bash
# GitHub(需 gh 已登录,scope 含 repo)
gh release create v0.2.0 "dist/os-active-v0.2.0.zip" "dist/os-active_0.2.0-1_amd64.deb" --repo EternalNight996/os-active --title v0.2.0 --notes "os-active v0.2.0 跨平台发布"
# Gitee(需 GITEE_TOKEN)
GITEE_TOKEN=<令牌> node scripts/publish-gitee.mjs --tag v0.2.0 --artifacts-dir dist --repo eternalnight996/os-active
```
> GitHub 附件上传 zip + deb;Gitee 发行版同样上传 `*.zip` + `*.deb`。
## tools 工具目录
`tools/` 存放产测/硬件工具,按 **工具名 → 架构 → 操作系统 → 具体工具** 分层。**具体工具不上传 git**(体积大/产线定制),用户自行放置,程序自动探测:
```
tools/
<工具名>/
<架构>/ # x86_64 / aarch64 ...
<操作系统>/ # linux / windows ...
具体工具
```
当前预留:ByoDmi(DMI/SN 烧录与读取)。详见 `tools/README.md`。
## 发布与双源管理(GitHub + Gitee)
推 tag 自动完成:**Windows zip + Linux deb 跨平台构建** → 发布 **GitHub Release** → 同步分支/tag 到 Gitee → 上传 **Gitee 发行版**(`.github/workflows/release.yml`)。首次需在 GitHub Actions secrets 配 `GITEE_TOKEN`。
```bash
git tag v0.2.0 && git push origin master github v0.2.0 # 双源推 tag 触发 CI
```
## 目录结构
```
src/ # 源码(main/app/config/data/detect)
tools/ # 工具(不上传 git,用户自添;按 工具名/架构/os/工具 分层)
assets/ # 界面截图
docs/ # 文档(含 TP100 分析)
vendor/ # EGL patch 的 eframe 0.36.1
justfile # 构建/打包统一入口
.github/ # CI 发布工作流
scripts/ # 启动脚本(start.sh + start.bat)与发布脚本
```
## 第三方修正
- **eframe 0.36.1(vendor)**—— 国产 OS EGL 回退 patch(`E_AUTOTEST_GL=egl` → `PreferEgl`,绕开 UOS/Kylin 损坏的 GLX;Linux 默认 EGL)