【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

相关推荐
To_OC23 分钟前
跑了3个Docker容器后,我终于搞懂镜像和容器到底啥关系
后端·docker·容器
画中有画2 小时前
MLOps 架构在大模型应用系统中的设计与实践
架构
Rain的Java大神之路2 小时前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
厚国兄2 小时前
大模型AI Agent记忆系统——Graphiti_源码架构与实现教程
架构·agent
canonical_entropy2 小时前
可逆不是逆向运行:DeepSeek Harness 架构的数学本质
人工智能·架构·agent
南城以南溫暖如初1473 小时前
外卖CPS实战指南:从技术选型到运营落地全流程解析
java·spring boot·mysql·架构·vue
ltl3 小时前
mTLS 工程实践:服务间双向认证怎么落地
kubernetes
ZGIAI4 小时前
ZGI Workflow:让知识检索进入业务流程
人工智能·架构
ZGIAI4 小时前
ZGI 模型网关:统一接入与路由大模型
人工智能·架构
易观Analysys4 小时前
中国低空经济产业链架构与图谱——《中国低空经济应用场景分析报告2026》解读一
架构