【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() 是整个运行时的核心函数,负责:
    • 解析命令行参数(--bundle、create)
    • 读取并修改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

相关推荐
江湖有缘8 小时前
Docker实战 | 使用Docker部署Bibliotheca阅读习惯管理工具
java·docker·容器
万联WANFLOW8 小时前
Docker Hub 镜像拉取慢、timeout 的排查方法
运维·docker·云原生·容器·eureka
zhangfeng11338 小时前
qjlDim 含义 TurboQuant QJL Quantized Johnson-Lindenstrauss,量化JL随机投影
人工智能·算法·ai编程·npu
hhb_6188 小时前
云原生赋能模型工具高效落地
云原生
xcl092515 小时前
北京24小时自助健身房系统软件开发实战:从架构到部署全流程指南
java·spring boot·架构
萧瑟余晖18 小时前
Dubbo SPI扩展机制详解
架构·dubbo
Shulex18 小时前
面向跨境电商多渠道消息系统的技术架构:亚马逊站内信合规对接与自动化执行链路设计
运维·架构·自动化
bloglin9999918 小时前
vmware部署centos7启动docker容器后无法访问服务
运维·docker·容器
weixin_4445793019 小时前
Containerd
容器·k8s
吴建旭 智宅焕20 小时前
AI搜索时代的智能家居交付知识架构:官网作为可信一手信息源与全国交付基础设施
人工智能·架构·智能家居