runtime/main.go --- 超深度逐行分析
文件行数:58行(含License 16行)| 核心代码:42行
模块定位:ascend-docker-runtime 运行时入口
一、模块定位
1.1 业务职责
runtime/main.go 是整个 ascend-docker-runtime 二进制的入口文件。当 Docker/Containerd 需要创建容器时,会调用此程序作为 OCI Runtime。该文件负责:
- 日志系统初始化 --- 配置hwlog日志组件
- 安全前置校验 --- 对命令行参数进行白名单过滤
- 日志权限管理 --- defer修改日志文件权限
- 主流程分发 --- 调用
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