【NPU】Ascend Docker Runtime v26.0.1 之一 runtime/main.go — 超深度分析

runtime/main.go --- 超深度逐行分析

文件行数:58行(含License 16行)| 核心代码:42行

模块定位:ascend-docker-runtime 运行时入口


一、模块定位

1.1 业务职责

runtime/main.go 是整个 ascend-docker-runtime 二进制的入口文件。当 Docker/Containerd 需要创建容器时,会调用此程序作为 OCI Runtime。该文件负责:

  1. 日志系统初始化 --- 配置hwlog日志组件
  2. 安全前置校验 --- 对命令行参数进行白名单过滤
  3. 日志权限管理 --- defer修改日志文件权限
  4. 主流程分发 --- 调用 process.DoProcess() 执行核心逻辑

1.2 在系统中的位置

#mermaid-svg-N0BGD7HCb6mFo8Xn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-N0BGD7HCb6mFo8Xn .error-icon{fill:#552222;}#mermaid-svg-N0BGD7HCb6mFo8Xn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-N0BGD7HCb6mFo8Xn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .marker.cross{stroke:#333333;}#mermaid-svg-N0BGD7HCb6mFo8Xn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-N0BGD7HCb6mFo8Xn p{margin:0;}#mermaid-svg-N0BGD7HCb6mFo8Xn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .cluster-label text{fill:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .cluster-label span{color:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .cluster-label span p{background-color:transparent;}#mermaid-svg-N0BGD7HCb6mFo8Xn .label text,#mermaid-svg-N0BGD7HCb6mFo8Xn span{fill:#333;color:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .node rect,#mermaid-svg-N0BGD7HCb6mFo8Xn .node circle,#mermaid-svg-N0BGD7HCb6mFo8Xn .node ellipse,#mermaid-svg-N0BGD7HCb6mFo8Xn .node polygon,#mermaid-svg-N0BGD7HCb6mFo8Xn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .rough-node .label text,#mermaid-svg-N0BGD7HCb6mFo8Xn .node .label text,#mermaid-svg-N0BGD7HCb6mFo8Xn .image-shape .label,#mermaid-svg-N0BGD7HCb6mFo8Xn .icon-shape .label{text-anchor:middle;}#mermaid-svg-N0BGD7HCb6mFo8Xn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .rough-node .label,#mermaid-svg-N0BGD7HCb6mFo8Xn .node .label,#mermaid-svg-N0BGD7HCb6mFo8Xn .image-shape .label,#mermaid-svg-N0BGD7HCb6mFo8Xn .icon-shape .label{text-align:center;}#mermaid-svg-N0BGD7HCb6mFo8Xn .node.clickable{cursor:pointer;}#mermaid-svg-N0BGD7HCb6mFo8Xn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .arrowheadPath{fill:#333333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N0BGD7HCb6mFo8Xn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-N0BGD7HCb6mFo8Xn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N0BGD7HCb6mFo8Xn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-N0BGD7HCb6mFo8Xn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .cluster text{fill:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn .cluster span{color:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-N0BGD7HCb6mFo8Xn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-N0BGD7HCb6mFo8Xn rect.text{fill:none;stroke-width:0;}#mermaid-svg-N0BGD7HCb6mFo8Xn .icon-shape,#mermaid-svg-N0BGD7HCb6mFo8Xn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N0BGD7HCb6mFo8Xn .icon-shape p,#mermaid-svg-N0BGD7HCb6mFo8Xn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-N0BGD7HCb6mFo8Xn .icon-shape .label rect,#mermaid-svg-N0BGD7HCb6mFo8Xn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N0BGD7HCb6mFo8Xn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-N0BGD7HCb6mFo8Xn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-N0BGD7HCb6mFo8Xn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} exec
1
2
3
4
defer
Docker/Containerd
runtime/main.go

入口函数
InitLogModule

日志初始化
GetLogPrefix

获取日志前缀
StringChecker

参数安全校验
process.DoProcess

核心流程
ChangeRuntimeLogMode

日志权限修改


二、源码逐行解析

2.1 包声明与导入(第17-30行)

go 复制代码
package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "strings"

    "ascend-common/common-utils/hwlog"
    "ascend-docker-runtime/mindxcheckutils"
    "ascend-docker-runtime/runtime/process"
)
导入项 来源 作用
context Go标准库 创建可取消的上下文,用于日志组件生命周期管理
fmt Go标准库 格式化输出(fmt.Println
log Go标准库 标准日志(log.Fatal 用于致命错误终止程序)
os Go标准库 获取命令行参数 os.Args、环境变量
strings Go标准库 strings.Join 拼接参数字符串用于安全校验
hwlog ascend-common 华为日志组件,提供结构化日志能力
mindxcheckutils 本项目 安全工具包,提供字符串白名单校验
process 本项目 核心处理包,包含 DoProcess()InitLogModule()

设计意图 :依赖最小化,仅导入必要包。context 用于日志组件的优雅关闭。

2.2 main函数 --- panic恢复(第32-35行)

go 复制代码
func main() {
    defer func() {
        if err := recover(); err != nil {
            log.Fatal(err)
        }
    }()
  • defer + recover() 捕获所有panic,防止程序崩溃时无日志输出
  • log.Fatal(err) 在panic发生时打印错误并 os.Exit(1)
  • 设计意图:确保任何未预期的panic都能被记录到日志,而非静默崩溃

2.3 创建上下文(第36行)

go 复制代码
    ctx, _ := context.WithCancel(context.Background())
  • context.Background() 创建根上下文
  • context.WithCancel 返回可取消的ctx和cancel函数
  • cancel函数被丢弃(_:ctx不会被显式取消,仅随进程退出结束
  • 设计意图:hwlog需要context参数管理日志goroutine生命周期,此处仅作形式参数

2.4 日志模块初始化(第37-39行)

go 复制代码
    if err := process.InitLogModule(ctx); err != nil {
        log.Fatal(err)
    }
  • 调用 process.InitLogModule(ctx) 初始化hwlog日志组件
  • 日志配置:日志路径 api.RunTimeRunLogPath、级别0(DEBUG)、最大备份2个、最大保留365天、单文件2MB
  • 如果初始化失败,log.Fatal(err) 终止程序
  • 设计意图:日志是调试基础,必须最先初始化,否则后续错误无法追溯

2.5 获取日志前缀(第40-43行)

go 复制代码
    logPrefixWords, err := mindxcheckutils.GetLogPrefix()
    if err != nil {
        log.Fatal(err)
    }
  • GetLogPrefix() 返回格式为 "uid: <uid> tty: <tty>" 的前缀字符串
  • 内部实现:读取 /proc/self/fd/0 获取终端路径,读取 os.Geteuid() 获取用户ID
  • 此前缀附加到后续所有日志消息中,便于审计追踪
  • 设计意图:安全审计需要知道执行者的UID和终端信息

2.6 defer日志权限修改(第44-47行)

go 复制代码
    defer func() {
        if err = mindxcheckutils.ChangeRuntimeLogMode("runtime-run-"); err != nil {
            fmt.Println("defer changeFileMode function failed")
        }
    }()
  • ChangeRuntimeLogMode("runtime-run-") 在程序退出时将日志文件权限修改为 0400(仅所有者可读)
  • 参数 "runtime-run-" 是日志文件名前缀,只修改以此前缀开头的日志文件
  • 使用defer确保无论程序正常退出还是异常退出,日志权限都被收紧
  • 设计意图:运行时日志可能包含敏感信息(设备ID、路径等),退出后应限制读取权限

2.7 命令行参数安全校验(第48-52行)

go 复制代码
    if !mindxcheckutils.StringChecker(strings.Join(os.Args, " "), 0,
        process.MaxCommandLength, mindxcheckutils.DefaultWhiteList+" ") {
        hwlog.RunLog.Errorf("%v docker runtime args check failed", logPrefixWords)
        log.Fatal("command error")
    }

逐参数解析

参数 含义
text strings.Join(os.Args, " ") 将所有命令行参数用空格拼接成字符串
minLength 0 最小长度为0
maxLength process.MaxCommandLength (65535) 最大长度65535
whiteList DefaultWhiteList+" " 白名单字符:-_./~ + 空格
  • StringChecker 逐字符检查:只允许字母(a-z, A-Z)、数字(0-9)和白名单字符
  • 校验失败:记录hwlog错误日志 + log.Fatal 终止程序
  • 设计意图:防止命令注入攻击。OCI Runtime接收外部输入,必须做输入校验

2.8 调用核心处理流程(第53-57行)

go 复制代码
    if err = process.DoProcess(); err != nil {
        hwlog.RunLog.Errorf("%v docker runtime failed: %v", logPrefixWords, err)
        log.Fatal(err)
    }
}
  • process.DoProcess() 是整个运行时的核心函数,负责:
    • 解析命令行参数(--bundlecreate
    • 读取并修改OCI Spec(config.json)
    • 注入NPU设备到Spec
    • 注入Prestart/Poststop Hook到Spec
    • 执行runc
  • 错误处理:记录带前缀的hwlog错误日志,然后 log.Fatal 终止
  • 设计意图:main函数保持极简,所有业务逻辑委托给process包

三、执行流程图

#mermaid-svg-tqi0NGHmhOjWHK0L{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tqi0NGHmhOjWHK0L .error-icon{fill:#552222;}#mermaid-svg-tqi0NGHmhOjWHK0L .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tqi0NGHmhOjWHK0L .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tqi0NGHmhOjWHK0L .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tqi0NGHmhOjWHK0L .marker.cross{stroke:#333333;}#mermaid-svg-tqi0NGHmhOjWHK0L svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tqi0NGHmhOjWHK0L p{margin:0;}#mermaid-svg-tqi0NGHmhOjWHK0L .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L .cluster-label text{fill:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L .cluster-label span{color:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L .cluster-label span p{background-color:transparent;}#mermaid-svg-tqi0NGHmhOjWHK0L .label text,#mermaid-svg-tqi0NGHmhOjWHK0L span{fill:#333;color:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L .node rect,#mermaid-svg-tqi0NGHmhOjWHK0L .node circle,#mermaid-svg-tqi0NGHmhOjWHK0L .node ellipse,#mermaid-svg-tqi0NGHmhOjWHK0L .node polygon,#mermaid-svg-tqi0NGHmhOjWHK0L .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tqi0NGHmhOjWHK0L .rough-node .label text,#mermaid-svg-tqi0NGHmhOjWHK0L .node .label text,#mermaid-svg-tqi0NGHmhOjWHK0L .image-shape .label,#mermaid-svg-tqi0NGHmhOjWHK0L .icon-shape .label{text-anchor:middle;}#mermaid-svg-tqi0NGHmhOjWHK0L .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tqi0NGHmhOjWHK0L .rough-node .label,#mermaid-svg-tqi0NGHmhOjWHK0L .node .label,#mermaid-svg-tqi0NGHmhOjWHK0L .image-shape .label,#mermaid-svg-tqi0NGHmhOjWHK0L .icon-shape .label{text-align:center;}#mermaid-svg-tqi0NGHmhOjWHK0L .node.clickable{cursor:pointer;}#mermaid-svg-tqi0NGHmhOjWHK0L .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tqi0NGHmhOjWHK0L .arrowheadPath{fill:#333333;}#mermaid-svg-tqi0NGHmhOjWHK0L .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tqi0NGHmhOjWHK0L .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tqi0NGHmhOjWHK0L .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tqi0NGHmhOjWHK0L .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tqi0NGHmhOjWHK0L .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tqi0NGHmhOjWHK0L .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tqi0NGHmhOjWHK0L .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tqi0NGHmhOjWHK0L .cluster text{fill:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L .cluster span{color:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tqi0NGHmhOjWHK0L .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tqi0NGHmhOjWHK0L rect.text{fill:none;stroke-width:0;}#mermaid-svg-tqi0NGHmhOjWHK0L .icon-shape,#mermaid-svg-tqi0NGHmhOjWHK0L .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tqi0NGHmhOjWHK0L .icon-shape p,#mermaid-svg-tqi0NGHmhOjWHK0L .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tqi0NGHmhOjWHK0L .icon-shape .label rect,#mermaid-svg-tqi0NGHmhOjWHK0L .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tqi0NGHmhOjWHK0L .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tqi0NGHmhOjWHK0L .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tqi0NGHmhOjWHK0L :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 失败
成功
失败
成功
失败
成功
失败
成功
main函数启动
defer panic恢复
创建context
InitLogModule

日志初始化
log.Fatal终止
GetLogPrefix

获取uid+tty前缀
log.Fatal终止
defer ChangeRuntimeLogMode

退出时收紧日志权限
StringChecker

参数白名单校验
log.Fatal终止
process.DoProcess

核心处理
log.Fatal终止
程序正常退出


四、关键设计决策

决策 原因 实现
panic恢复 防止goroutine panic导致无日志崩溃 defer recover()
日志最先初始化 后续所有操作都需要日志记录 第一行就调用InitLogModule
参数安全校验 防止命令注入,OCI Runtime接收外部输入 StringChecker白名单过滤
defer日志权限收紧 日志含敏感信息,运行后应限制访问 ChangeRuntimeLogMode设为0400
业务逻辑委托 main函数保持简洁可维护 所有逻辑在process包中

五、与process包的关系

#mermaid-svg-1TJInB1MPKnGcs1Q{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1TJInB1MPKnGcs1Q .error-icon{fill:#552222;}#mermaid-svg-1TJInB1MPKnGcs1Q .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1TJInB1MPKnGcs1Q .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1TJInB1MPKnGcs1Q .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1TJInB1MPKnGcs1Q .marker.cross{stroke:#333333;}#mermaid-svg-1TJInB1MPKnGcs1Q svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1TJInB1MPKnGcs1Q p{margin:0;}#mermaid-svg-1TJInB1MPKnGcs1Q g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-1TJInB1MPKnGcs1Q g.classGroup text .title{font-weight:bolder;}#mermaid-svg-1TJInB1MPKnGcs1Q .cluster-label text{fill:#333;}#mermaid-svg-1TJInB1MPKnGcs1Q .cluster-label span{color:#333;}#mermaid-svg-1TJInB1MPKnGcs1Q .cluster-label span p{background-color:transparent;}#mermaid-svg-1TJInB1MPKnGcs1Q .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1TJInB1MPKnGcs1Q .cluster text{fill:#333;}#mermaid-svg-1TJInB1MPKnGcs1Q .cluster span{color:#333;}#mermaid-svg-1TJInB1MPKnGcs1Q .nodeLabel,#mermaid-svg-1TJInB1MPKnGcs1Q .edgeLabel{color:#131300;}#mermaid-svg-1TJInB1MPKnGcs1Q .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-1TJInB1MPKnGcs1Q .label text{fill:#131300;}#mermaid-svg-1TJInB1MPKnGcs1Q .labelBkg{background:#ECECFF;}#mermaid-svg-1TJInB1MPKnGcs1Q .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-1TJInB1MPKnGcs1Q .classTitle{font-weight:bolder;}#mermaid-svg-1TJInB1MPKnGcs1Q .node rect,#mermaid-svg-1TJInB1MPKnGcs1Q .node circle,#mermaid-svg-1TJInB1MPKnGcs1Q .node ellipse,#mermaid-svg-1TJInB1MPKnGcs1Q .node polygon,#mermaid-svg-1TJInB1MPKnGcs1Q .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1TJInB1MPKnGcs1Q .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q g.clickable{cursor:pointer;}#mermaid-svg-1TJInB1MPKnGcs1Q g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-1TJInB1MPKnGcs1Q g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-1TJInB1MPKnGcs1Q .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-1TJInB1MPKnGcs1Q .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-1TJInB1MPKnGcs1Q .dashed-line{stroke-dasharray:3;}#mermaid-svg-1TJInB1MPKnGcs1Q .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-1TJInB1MPKnGcs1Q #compositionStart,#mermaid-svg-1TJInB1MPKnGcs1Q .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #compositionEnd,#mermaid-svg-1TJInB1MPKnGcs1Q .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #dependencyStart,#mermaid-svg-1TJInB1MPKnGcs1Q .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #dependencyStart,#mermaid-svg-1TJInB1MPKnGcs1Q .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #extensionStart,#mermaid-svg-1TJInB1MPKnGcs1Q .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #extensionEnd,#mermaid-svg-1TJInB1MPKnGcs1Q .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #aggregationStart,#mermaid-svg-1TJInB1MPKnGcs1Q .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #aggregationEnd,#mermaid-svg-1TJInB1MPKnGcs1Q .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #lollipopStart,#mermaid-svg-1TJInB1MPKnGcs1Q .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q #lollipopEnd,#mermaid-svg-1TJInB1MPKnGcs1Q .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-1TJInB1MPKnGcs1Q .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-1TJInB1MPKnGcs1Q .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1TJInB1MPKnGcs1Q .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1TJInB1MPKnGcs1Q .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1TJInB1MPKnGcs1Q :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 调用InitLogModule + DoProcess
调用安全校验函数
内部也调用安全校验
main_go
+main()
process_pkg
+MaxCommandLength int
+InitLogModule(ctx) : error
+DoProcess() : error
mindxcheckutils_pkg
+GetLogPrefix()(string, error)
+StringChecker(text, min, max, whitelist) : bool
+ChangeRuntimeLogMode(prefix) : error

相关推荐
Dawson Zhu5 小时前
工作流与 Agent 的工程选型:从“控制权归属“看 LLM 应用架构
人工智能·语言模型·架构·aigc·agi
nvd116 小时前
深入现代 Web 鉴权架构:网关统一代理 (Forward-Auth) vs 前端持有 JWT 的终极选型与边缘同域实践
前端·架构·状态模式
_itgo7 小时前
意图识别落地方案
运维·docker·容器
天空之城--7 小时前
Android行业一周动态:编码趋势与行业资讯汇总
android·性能优化·架构·kotlin·android jetpack
FII工业富联科技服务8 小时前
GPT-6 Astra发布,Agent的竞争开始从“会调用工具”走向“完成完整工作”
大数据·人工智能·gpt·架构·机器人·制造
这个DBA有点耶11 小时前
VLDB 2026核心议题解读:当负载被AI改写,数据库的内核该往哪走?
数据库·架构·aigc
分布式存储与RustFS12 小时前
RustFS 1.0 GA 前的生产验收清单:从 rc.1 到 GA 该准备什么
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
天远API12 小时前
零信任架构实战:基于天远行驶OCR证识别构建自动化智能停车网关
运维·人工智能·架构·自动化
冗量12 小时前
Pi Agent Chord 架构深度剖析
架构·agent·pi agent
好好生活中12 小时前
把“信任”设计进系统:从胖东来的前置服务,看服务型组织的架构思维
架构