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() }