mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00

- 创建app包实现依赖注入容器和初始化器模式 - 重构main.go为六阶段清晰的初始化流程 - 新增结构化错误处理替代简陋的os.Exit调用 - 为HostInfo添加辅助函数增强功能但保持向后兼容 - 引入TargetInfo包装器支持上下文和元数据管理 - 优化代码组织提升可维护性和可测试性
107 lines
2.3 KiB
Go
107 lines
2.3 KiB
Go
package app
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"sync"
|
||
|
||
"github.com/shadow1ng/fscan/common"
|
||
"github.com/shadow1ng/fscan/core"
|
||
)
|
||
|
||
// Container 依赖注入容器
|
||
type Container struct {
|
||
services map[string]interface{}
|
||
initializers []Initializer
|
||
mu sync.RWMutex
|
||
initialized bool
|
||
}
|
||
|
||
// NewContainer 创建新的容器
|
||
func NewContainer() *Container {
|
||
container := &Container{
|
||
services: make(map[string]interface{}),
|
||
}
|
||
|
||
// 注册默认初始化器
|
||
container.AddInitializer(&PluginInitializer{})
|
||
|
||
return container
|
||
}
|
||
|
||
// AddInitializer 添加初始化器
|
||
func (c *Container) AddInitializer(init Initializer) {
|
||
c.initializers = append(c.initializers, init)
|
||
}
|
||
|
||
// Register 注册服务
|
||
func (c *Container) Register(name string, service interface{}) {
|
||
c.mu.Lock()
|
||
defer c.mu.Unlock()
|
||
c.services[name] = service
|
||
}
|
||
|
||
// Get 获取服务
|
||
func (c *Container) Get(name string) (interface{}, bool) {
|
||
c.mu.RLock()
|
||
defer c.mu.RUnlock()
|
||
service, exists := c.services[name]
|
||
return service, exists
|
||
}
|
||
|
||
// Initialize 初始化容器和所有服务
|
||
func (c *Container) Initialize() error {
|
||
if c.initialized {
|
||
return nil
|
||
}
|
||
|
||
// 执行所有初始化器
|
||
for _, initializer := range c.initializers {
|
||
if err := initializer.Initialize(); err != nil {
|
||
return WrapError(ErrInitFailed, err)
|
||
}
|
||
}
|
||
|
||
c.initialized = true
|
||
return nil
|
||
}
|
||
|
||
// RunScan 执行扫描(包装现有的core.RunScan)
|
||
func (c *Container) RunScan(ctx context.Context, info common.HostInfo) error {
|
||
// 使用新的验证函数
|
||
if err := common.ValidateHostInfo(&info); err != nil {
|
||
return WrapError(ErrScanFailed, err)
|
||
}
|
||
|
||
// 创建目标信息(展示新功能,但保持兼容)
|
||
target := common.NewTargetInfo(info)
|
||
target.WithContext(ctx)
|
||
target.SetMetadata("container_managed", true)
|
||
target.SetMetadata("validation_passed", true)
|
||
|
||
// 记录扫描信息
|
||
c.logScanInfo(target)
|
||
|
||
// 调用现有的扫描逻辑
|
||
core.RunScan(info)
|
||
|
||
return nil
|
||
}
|
||
|
||
// logScanInfo 记录扫描信息
|
||
func (c *Container) logScanInfo(target *common.TargetInfo) {
|
||
targetStr := target.String()
|
||
if targetStr != "" {
|
||
common.LogDebug(fmt.Sprintf("容器管理的扫描目标: %s", targetStr))
|
||
}
|
||
|
||
if target.HasMetadata("validation_passed") {
|
||
common.LogDebug("目标验证通过")
|
||
}
|
||
}
|
||
|
||
// Cleanup 清理资源
|
||
func (c *Container) Cleanup() {
|
||
// 清理输出资源
|
||
common.CloseOutput()
|
||
} |