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

- 新建Common/Core/子包,整合分散的核心功能 - Core/Constants.go: 整合端口常量和系统常量 - Core/Plugin.go: 整合插件系统,提供统一插件管理 - Core/Manager.go: 整合配置管理、参数解析和全局变量 - 更新原有文件保持向后兼容,引用Core包新结构 - 优化模块边界,减少文件数量,提升代码组织性 - 验证功能完整性,确保重构后项目正常运行 重构效果: - 文件数量: 7个核心文件 → 3个Core文件 + 兼容层 - 模块化程度: 高度模块化的插件和配置管理 - 向后兼容: 100%兼容现有API调用
591 lines
18 KiB
Go
591 lines
18 KiB
Go
package Core
|
||
|
||
import (
|
||
"flag"
|
||
"fmt"
|
||
"os"
|
||
"sync"
|
||
|
||
"github.com/fatih/color"
|
||
"github.com/shadow1ng/fscan/Common/config"
|
||
"github.com/shadow1ng/fscan/Common/parsers"
|
||
)
|
||
|
||
/*
|
||
Manager.go - 核心管理器
|
||
|
||
整合Flag.go、Parse.go、Variables.go的功能,提供统一的配置管理、
|
||
参数解析和全局变量管理机制。
|
||
*/
|
||
|
||
// =============================================================================
|
||
// 全局变量管理 (从Variables.go迁移)
|
||
// =============================================================================
|
||
|
||
// CoreConfig 核心配置结构
|
||
type CoreConfig struct {
|
||
// 扫描配置
|
||
ScanMode string `json:"scan_mode"` // 扫描模式
|
||
ThreadNum int `json:"thread_num"` // 线程数
|
||
Timeout int64 `json:"timeout"` // 超时时间
|
||
DisablePing bool `json:"disable_ping"` // 禁用ping
|
||
LocalMode bool `json:"local_mode"` // 本地模式
|
||
|
||
// 认证配置
|
||
Username string `json:"username"` // 用户名
|
||
Password string `json:"password"` // 密码
|
||
Userdict map[string][]string `json:"userdict"` // 用户字典
|
||
Passwords []string `json:"passwords"` // 密码列表
|
||
|
||
// 网络配置
|
||
HttpProxy string `json:"http_proxy"` // HTTP代理
|
||
Socks5Proxy string `json:"socks5_proxy"` // SOCKS5代理
|
||
|
||
// 显示控制
|
||
NoColor bool `json:"no_color"` // 禁用颜色
|
||
Language string `json:"language"` // 语言
|
||
LogLevel string `json:"log_level"` // 日志级别
|
||
|
||
// 端口映射
|
||
PortMap map[int][]string `json:"port_map"` // 端口映射
|
||
DefaultMap []string `json:"default_map"` // 默认映射
|
||
}
|
||
|
||
// 全局配置管理器
|
||
type ConfigManager struct {
|
||
mu sync.RWMutex
|
||
config *CoreConfig
|
||
parser *Parser
|
||
}
|
||
|
||
// 全局配置管理器实例
|
||
var globalConfigManager = NewConfigManager()
|
||
|
||
// NewConfigManager 创建新的配置管理器
|
||
func NewConfigManager() *ConfigManager {
|
||
return &ConfigManager{
|
||
config: &CoreConfig{},
|
||
parser: NewParser(nil),
|
||
}
|
||
}
|
||
|
||
// =============================================================================
|
||
// 参数解析器 (从Parse.go迁移的核心功能)
|
||
// =============================================================================
|
||
|
||
// Parser 参数解析器
|
||
type Parser struct {
|
||
mu sync.RWMutex
|
||
fileReader *parsers.FileReader
|
||
credentialParser *parsers.CredentialParser
|
||
targetParser *parsers.TargetParser
|
||
networkParser *parsers.NetworkParser
|
||
validationParser *parsers.ValidationParser
|
||
options *parsers.ParserOptions
|
||
initialized bool
|
||
}
|
||
|
||
// ParsedConfiguration 解析后的完整配置(兼容旧代码)
|
||
type ParsedConfiguration struct {
|
||
*parsers.ParsedConfig
|
||
}
|
||
|
||
// AllInputs 所有输入参数
|
||
type AllInputs struct {
|
||
Credential *parsers.CredentialInput
|
||
Target *parsers.TargetInput
|
||
Network *parsers.NetworkInput
|
||
}
|
||
|
||
// NewParser 创建新的解析器实例
|
||
func NewParser(options *parsers.ParserOptions) *Parser {
|
||
if options == nil {
|
||
options = parsers.DefaultParserOptions()
|
||
}
|
||
|
||
// 创建文件读取器
|
||
fileReader := parsers.NewFileReader(nil)
|
||
|
||
// 创建各个子解析器
|
||
credentialParser := parsers.NewCredentialParser(fileReader, nil)
|
||
targetParser := parsers.NewTargetParser(fileReader, nil)
|
||
networkParser := parsers.NewNetworkParser(nil)
|
||
validationParser := parsers.NewValidationParser(nil)
|
||
|
||
return &Parser{
|
||
fileReader: fileReader,
|
||
credentialParser: credentialParser,
|
||
targetParser: targetParser,
|
||
networkParser: networkParser,
|
||
validationParser: validationParser,
|
||
options: options,
|
||
initialized: true,
|
||
}
|
||
}
|
||
|
||
// =============================================================================
|
||
// 命令行参数定义 (从Flag.go迁移的核心功能)
|
||
// =============================================================================
|
||
|
||
// FlagConfig 命令行参数配置
|
||
type FlagConfig struct {
|
||
// 目标相关参数
|
||
Host string // 目标主机
|
||
ExcludeHosts string // 排除主机
|
||
Ports string // 端口
|
||
ExcludePorts string // 排除端口
|
||
AddPorts string // 添加端口
|
||
HostsFile string // 主机文件
|
||
PortsFile string // 端口文件
|
||
|
||
// 扫描配置参数
|
||
ScanMode string // 扫描模式
|
||
ThreadNum int // 线程数
|
||
ModuleThreadNum int // 模块线程数
|
||
Timeout int64 // 超时时间
|
||
GlobalTimeout int64 // 全局超时时间
|
||
LiveTop int // 存活探测端口数
|
||
UsePing bool // 使用ping
|
||
EnableFingerprint bool // 启用指纹识别
|
||
LocalMode bool // 本地模式
|
||
|
||
// 认证参数
|
||
Username string // 用户名
|
||
Password string // 密码
|
||
AddUsers string // 添加用户名
|
||
AddPasswords string // 添加密码
|
||
UsersFile string // 用户文件
|
||
PasswordsFile string // 密码文件
|
||
HashFile string // Hash文件
|
||
HashValue string // Hash值
|
||
Domain string // 域名
|
||
SshKeyPath string // SSH密钥路径
|
||
|
||
// Web扫描参数
|
||
TargetURL string // 目标URL
|
||
URLsFile string // URL文件
|
||
Cookie string // Cookie
|
||
WebTimeout int64 // Web超时时间
|
||
UserAgent string // User-Agent
|
||
Accept string // Accept
|
||
|
||
// POC参数
|
||
PocPath string // POC路径
|
||
PocFull bool // 完整POC
|
||
DnsLog bool // DNS日志
|
||
PocNum int // POC线程数
|
||
DisablePocScan bool // 禁用POC扫描
|
||
|
||
// 输出参数
|
||
Outputfile string // 输出文件
|
||
OutputFormat string // 输出格式
|
||
NoColor bool // 禁用颜色
|
||
Silent bool // 静默模式
|
||
|
||
// 代理参数
|
||
HttpProxy string // HTTP代理
|
||
Socks5Proxy string // SOCKS5代理
|
||
|
||
// 其他参数
|
||
Language string // 语言
|
||
Help bool // 帮助
|
||
Version bool // 版本
|
||
}
|
||
|
||
// 全局命令行参数配置
|
||
var GlobalFlagConfig = &FlagConfig{}
|
||
|
||
// =============================================================================
|
||
// 配置管理器方法
|
||
// =============================================================================
|
||
|
||
// InitializeDefaults 初始化默认配置
|
||
func (cm *ConfigManager) InitializeDefaults() {
|
||
cm.mu.Lock()
|
||
defer cm.mu.Unlock()
|
||
|
||
// 设置默认值
|
||
cm.config.ScanMode = DefaultScanMode
|
||
cm.config.ThreadNum = DefaultThreadNum
|
||
cm.config.Timeout = DefaultTimeout
|
||
cm.config.LogLevel = DefaultLogLevel
|
||
cm.config.Language = DefaultLanguage
|
||
|
||
// 初始化映射和切片
|
||
cm.config.Userdict = make(map[string][]string)
|
||
cm.config.PortMap = make(map[int][]string)
|
||
cm.config.DefaultMap = make([]string, 0)
|
||
|
||
// 从config模块获取字典和映射
|
||
if serviceDict := config.GetGlobalServiceDict(); serviceDict != nil {
|
||
cm.config.Userdict = serviceDict.GetAllUserDicts()
|
||
cm.config.Passwords = serviceDict.GetPasswords()
|
||
}
|
||
|
||
if probeMapping := config.GetGlobalProbeMapping(); probeMapping != nil {
|
||
cm.config.PortMap = probeMapping.GetAllPortMappings()
|
||
cm.config.DefaultMap = probeMapping.GetDefaultProbes()
|
||
}
|
||
}
|
||
|
||
// GetConfig 获取当前配置
|
||
func (cm *ConfigManager) GetConfig() *CoreConfig {
|
||
cm.mu.RLock()
|
||
defer cm.mu.RUnlock()
|
||
|
||
// 返回配置的深拷贝
|
||
configCopy := *cm.config
|
||
return &configCopy
|
||
}
|
||
|
||
// UpdateConfig 更新配置
|
||
func (cm *ConfigManager) UpdateConfig(config *CoreConfig) error {
|
||
if config == nil {
|
||
return fmt.Errorf("config cannot be nil")
|
||
}
|
||
|
||
cm.mu.Lock()
|
||
defer cm.mu.Unlock()
|
||
|
||
cm.config = config
|
||
return nil
|
||
}
|
||
|
||
// SetScanMode 设置扫描模式
|
||
func (cm *ConfigManager) SetScanMode(mode string) {
|
||
cm.mu.Lock()
|
||
defer cm.mu.Unlock()
|
||
cm.config.ScanMode = mode
|
||
}
|
||
|
||
// GetScanMode 获取扫描模式
|
||
func (cm *ConfigManager) GetScanMode() string {
|
||
cm.mu.RLock()
|
||
defer cm.mu.RUnlock()
|
||
return cm.config.ScanMode
|
||
}
|
||
|
||
// SetThreadNum 设置线程数
|
||
func (cm *ConfigManager) SetThreadNum(num int) {
|
||
cm.mu.Lock()
|
||
defer cm.mu.Unlock()
|
||
cm.config.ThreadNum = num
|
||
}
|
||
|
||
// GetThreadNum 获取线程数
|
||
func (cm *ConfigManager) GetThreadNum() int {
|
||
cm.mu.RLock()
|
||
defer cm.mu.RUnlock()
|
||
return cm.config.ThreadNum
|
||
}
|
||
|
||
// =============================================================================
|
||
// 参数解析功能
|
||
// =============================================================================
|
||
|
||
// ParseAll 解析所有配置 (简化版)
|
||
func (p *Parser) ParseAll(input *AllInputs) (*parsers.ParseResult, error) {
|
||
if input == nil {
|
||
return nil, fmt.Errorf("输入参数为空")
|
||
}
|
||
|
||
p.mu.Lock()
|
||
defer p.mu.Unlock()
|
||
|
||
if !p.initialized {
|
||
return nil, fmt.Errorf("解析器未初始化")
|
||
}
|
||
|
||
// 创建简化的结果结构
|
||
result := &parsers.ParseResult{
|
||
Config: &parsers.ParsedConfig{},
|
||
Errors: make([]error, 0),
|
||
}
|
||
|
||
var allErrors []error
|
||
|
||
// 解析凭据配置
|
||
if input.Credential != nil {
|
||
credResult, err := p.credentialParser.Parse(input.Credential, p.options)
|
||
if err != nil {
|
||
allErrors = append(allErrors, fmt.Errorf("凭据解析失败: %v", err))
|
||
} else if credResult != nil && credResult.Config != nil {
|
||
result.Config.Credentials = credResult.Config.Credentials
|
||
allErrors = append(allErrors, credResult.Errors...)
|
||
}
|
||
}
|
||
|
||
// 解析目标配置
|
||
if input.Target != nil {
|
||
targetResult, err := p.targetParser.Parse(input.Target, p.options)
|
||
if err != nil {
|
||
allErrors = append(allErrors, fmt.Errorf("目标解析失败: %v", err))
|
||
} else if targetResult != nil && targetResult.Config != nil {
|
||
result.Config.Targets = targetResult.Config.Targets
|
||
allErrors = append(allErrors, targetResult.Errors...)
|
||
}
|
||
}
|
||
|
||
// 解析网络配置
|
||
if input.Network != nil {
|
||
networkResult, err := p.networkParser.Parse(input.Network, p.options)
|
||
if err != nil {
|
||
allErrors = append(allErrors, fmt.Errorf("网络解析失败: %v", err))
|
||
} else if networkResult != nil && networkResult.Config != nil {
|
||
result.Config.Network = networkResult.Config.Network
|
||
allErrors = append(allErrors, networkResult.Errors...)
|
||
}
|
||
}
|
||
|
||
result.Errors = allErrors
|
||
return result, nil
|
||
}
|
||
|
||
// =============================================================================
|
||
// 命令行参数解析 (从Flag.go迁移)
|
||
// =============================================================================
|
||
|
||
// InitFlags 初始化命令行参数
|
||
func InitFlags() {
|
||
// 目标相关参数
|
||
flag.StringVar(&GlobalFlagConfig.Host, "h", "", "目标主机: IP, IP段, IP段文件, 域名")
|
||
flag.StringVar(&GlobalFlagConfig.ExcludeHosts, "eh", "", "排除主机")
|
||
flag.StringVar(&GlobalFlagConfig.Ports, "p", "", "端口: 默认1000个常用端口")
|
||
flag.StringVar(&GlobalFlagConfig.ExcludePorts, "ep", "", "排除端口")
|
||
flag.StringVar(&GlobalFlagConfig.AddPorts, "pa", "", "添加端口")
|
||
flag.StringVar(&GlobalFlagConfig.HostsFile, "hf", "", "主机文件")
|
||
flag.StringVar(&GlobalFlagConfig.PortsFile, "pf", "", "端口文件")
|
||
|
||
// 扫描配置参数
|
||
flag.StringVar(&GlobalFlagConfig.ScanMode, "m", "all", "扫描模式: all, portscan, tcpscan, udpscan等")
|
||
flag.IntVar(&GlobalFlagConfig.ThreadNum, "t", DefaultThreadNum, "端口扫描线程数")
|
||
flag.IntVar(&GlobalFlagConfig.ModuleThreadNum, "mt", DefaultModuleThreadNum, "模块扫描线程数")
|
||
flag.Int64Var(&GlobalFlagConfig.Timeout, "time", DefaultTimeout, "端口扫描超时时间")
|
||
flag.Int64Var(&GlobalFlagConfig.GlobalTimeout, "gt", DefaultGlobalTimeout, "全局超时时间")
|
||
flag.IntVar(&GlobalFlagConfig.LiveTop, "top", DefaultLiveTop, "存活探测top端口")
|
||
flag.BoolVar(&GlobalFlagConfig.UsePing, "ping", false, "启用ping探测")
|
||
flag.BoolVar(&GlobalFlagConfig.EnableFingerprint, "fp", false, "启用指纹识别")
|
||
flag.BoolVar(&GlobalFlagConfig.LocalMode, "local", false, "本地扫描模式")
|
||
|
||
// 认证参数
|
||
flag.StringVar(&GlobalFlagConfig.Username, "user", "", "用户名")
|
||
flag.StringVar(&GlobalFlagConfig.Password, "pwd", "", "密码")
|
||
flag.StringVar(&GlobalFlagConfig.AddUsers, "userf", "", "用户名字典")
|
||
flag.StringVar(&GlobalFlagConfig.AddPasswords, "pwdf", "", "密码字典")
|
||
flag.StringVar(&GlobalFlagConfig.UsersFile, "uf", "", "用户名字典文件")
|
||
flag.StringVar(&GlobalFlagConfig.PasswordsFile, "pf", "", "密码字典文件")
|
||
flag.StringVar(&GlobalFlagConfig.HashFile, "hashf", "", "Hash文件")
|
||
flag.StringVar(&GlobalFlagConfig.HashValue, "hash", "", "Hash值")
|
||
flag.StringVar(&GlobalFlagConfig.Domain, "domain", "", "域名(SMB扫描用)")
|
||
flag.StringVar(&GlobalFlagConfig.SshKeyPath, "sshkey", "", "SSH私钥文件")
|
||
|
||
// Web扫描参数
|
||
flag.StringVar(&GlobalFlagConfig.TargetURL, "u", "", "目标URL")
|
||
flag.StringVar(&GlobalFlagConfig.URLsFile, "uf", "", "URL文件")
|
||
flag.StringVar(&GlobalFlagConfig.Cookie, "cookie", "", "Cookie")
|
||
flag.Int64Var(&GlobalFlagConfig.WebTimeout, "wt", DefaultWebTimeout, "Web超时时间")
|
||
flag.StringVar(&GlobalFlagConfig.UserAgent, "ua", DefaultUserAgent, "User-Agent")
|
||
flag.StringVar(&GlobalFlagConfig.Accept, "accept", "", "Accept")
|
||
|
||
// POC参数
|
||
flag.StringVar(&GlobalFlagConfig.PocPath, "pocpath", "", "POC路径")
|
||
flag.BoolVar(&GlobalFlagConfig.PocFull, "pocfull", false, "完整POC扫描")
|
||
flag.BoolVar(&GlobalFlagConfig.DnsLog, "dnslog", false, "启用DNS日志")
|
||
flag.IntVar(&GlobalFlagConfig.PocNum, "pocnum", DefaultPocNum, "POC线程数")
|
||
flag.BoolVar(&GlobalFlagConfig.DisablePocScan, "nopoc", false, "禁用POC扫描")
|
||
|
||
// 输出参数
|
||
flag.StringVar(&GlobalFlagConfig.Outputfile, "o", "", "输出文件")
|
||
flag.StringVar(&GlobalFlagConfig.OutputFormat, "of", DefaultOutputFormat, "输出格式: txt, json, csv")
|
||
flag.BoolVar(&GlobalFlagConfig.NoColor, "nc", false, "禁用颜色输出")
|
||
flag.BoolVar(&GlobalFlagConfig.Silent, "silent", false, "静默模式")
|
||
|
||
// 代理参数
|
||
flag.StringVar(&GlobalFlagConfig.HttpProxy, "proxy", "", "HTTP代理")
|
||
flag.StringVar(&GlobalFlagConfig.Socks5Proxy, "socks5", "", "SOCKS5代理")
|
||
|
||
// 其他参数
|
||
flag.StringVar(&GlobalFlagConfig.Language, "lang", DefaultLanguage, "语言: zh, en")
|
||
flag.BoolVar(&GlobalFlagConfig.Help, "help", false, "显示帮助信息")
|
||
flag.BoolVar(&GlobalFlagConfig.Version, "version", false, "显示版本信息")
|
||
}
|
||
|
||
// ParseFlags 解析命令行参数
|
||
func ParseFlags() error {
|
||
if !flag.Parsed() {
|
||
flag.Parse()
|
||
}
|
||
|
||
// 处理帮助和版本
|
||
if GlobalFlagConfig.Help {
|
||
showHelp()
|
||
os.Exit(0)
|
||
}
|
||
|
||
if GlobalFlagConfig.Version {
|
||
showVersion()
|
||
os.Exit(0)
|
||
}
|
||
|
||
// 同步到全局配置管理器
|
||
return syncFlagsToConfig()
|
||
}
|
||
|
||
// syncFlagsToConfig 同步命令行参数到配置管理器
|
||
func syncFlagsToConfig() error {
|
||
config := globalConfigManager.GetConfig()
|
||
|
||
// 同步基础配置
|
||
config.ScanMode = GlobalFlagConfig.ScanMode
|
||
config.ThreadNum = GlobalFlagConfig.ThreadNum
|
||
config.Timeout = GlobalFlagConfig.Timeout
|
||
config.DisablePing = !GlobalFlagConfig.UsePing
|
||
config.LocalMode = GlobalFlagConfig.LocalMode
|
||
|
||
// 同步认证配置
|
||
config.Username = GlobalFlagConfig.Username
|
||
config.Password = GlobalFlagConfig.Password
|
||
|
||
// 同步网络配置
|
||
config.HttpProxy = GlobalFlagConfig.HttpProxy
|
||
config.Socks5Proxy = GlobalFlagConfig.Socks5Proxy
|
||
|
||
// 同步显示配置
|
||
config.NoColor = GlobalFlagConfig.NoColor
|
||
config.Language = GlobalFlagConfig.Language
|
||
|
||
return globalConfigManager.UpdateConfig(config)
|
||
}
|
||
|
||
// =============================================================================
|
||
// 帮助和版本信息
|
||
// =============================================================================
|
||
|
||
// showHelp 显示帮助信息
|
||
func showHelp() {
|
||
color.Red("fscan version: %s", Version)
|
||
color.Blue("https://github.com/shadow1ng/fscan\n")
|
||
|
||
fmt.Println("Usage:")
|
||
fmt.Println(" fscan -h 192.168.1.1/24 # 扫描指定IP段")
|
||
fmt.Println(" fscan -h 192.168.1.1-10 # 扫描指定IP范围")
|
||
fmt.Println(" fscan -h target.txt # 扫描文件中的目标")
|
||
fmt.Println("")
|
||
|
||
fmt.Println("Options:")
|
||
flag.PrintDefaults()
|
||
}
|
||
|
||
// showVersion 显示版本信息
|
||
func showVersion() {
|
||
fmt.Printf("fscan version %s\n", Version)
|
||
fmt.Printf("Build time: %s\n", BuildTime)
|
||
fmt.Printf("Git commit: %s\n", GitCommit)
|
||
}
|
||
|
||
// =============================================================================
|
||
// 全局访问函数 (保持向后兼容)
|
||
// =============================================================================
|
||
|
||
// GetGlobalConfigManager 获取全局配置管理器
|
||
func GetGlobalConfigManager() *ConfigManager {
|
||
return globalConfigManager
|
||
}
|
||
|
||
// InitGlobalConfig 初始化全局配置
|
||
func InitGlobalConfig() {
|
||
globalConfigManager.InitializeDefaults()
|
||
}
|
||
|
||
// 向后兼容的全局变量访问器
|
||
func GetScanMode() string { return globalConfigManager.GetScanMode() }
|
||
func SetScanMode(mode string) { globalConfigManager.SetScanMode(mode) }
|
||
func GetThreadNum() int { return globalConfigManager.GetThreadNum() }
|
||
func SetThreadNum(num int) { globalConfigManager.SetThreadNum(num) }
|
||
|
||
// 从Variables.go迁移的日志级别常量
|
||
const (
|
||
LogLevelAll = "all"
|
||
LogLevelError = "error"
|
||
LogLevelBase = "base"
|
||
LogLevelInfo = "info"
|
||
LogLevelSuccess = "success"
|
||
LogLevelDebug = "debug"
|
||
LogLevelInfoSuccess = "info,success"
|
||
LogLevelBaseInfoSuccess = "base,info,success"
|
||
)
|
||
|
||
// =============================================================================
|
||
// 向后兼容的全局变量 (将逐步废弃)
|
||
// =============================================================================
|
||
|
||
// 这些全局变量保持存在以确保向后兼容,但建议使用ConfigManager
|
||
var (
|
||
// 核心扫描配置
|
||
ScanMode string // 扫描模式
|
||
ThreadNum int // 线程数
|
||
Timeout int64 // 超时时间
|
||
DisablePing bool // 禁用ping
|
||
LocalMode bool // 本地模式
|
||
|
||
// 基础认证配置
|
||
Username string // 用户名
|
||
Password string // 密码
|
||
Userdict map[string][]string // 用户字典
|
||
Passwords []string // 密码列表
|
||
|
||
// 网络配置
|
||
HttpProxy string // HTTP代理
|
||
Socks5Proxy string // SOCKS5代理
|
||
|
||
// 显示控制
|
||
NoColor bool // 禁用颜色
|
||
Language string // 语言
|
||
LogLevel string // 日志级别
|
||
|
||
// 端口映射
|
||
PortMap map[int][]string // 端口映射
|
||
DefaultMap []string // 默认映射
|
||
|
||
// 输出配置变量
|
||
Outputfile string // 输出文件
|
||
OutputFormat string // 输出格式
|
||
|
||
// 其他全局状态
|
||
SlowLogOutput bool // 慢速日志输出
|
||
)
|
||
|
||
// init 初始化函数 (保持向后兼容)
|
||
func init() {
|
||
// 初始化默认配置
|
||
InitGlobalConfig()
|
||
|
||
// 同步到全局变量
|
||
syncConfigToGlobals()
|
||
}
|
||
|
||
// syncConfigToGlobals 同步配置到全局变量
|
||
func syncConfigToGlobals() {
|
||
config := globalConfigManager.GetConfig()
|
||
|
||
ScanMode = config.ScanMode
|
||
ThreadNum = config.ThreadNum
|
||
Timeout = config.Timeout
|
||
DisablePing = config.DisablePing
|
||
LocalMode = config.LocalMode
|
||
|
||
Username = config.Username
|
||
Password = config.Password
|
||
Userdict = config.Userdict
|
||
Passwords = config.Passwords
|
||
|
||
HttpProxy = config.HttpProxy
|
||
Socks5Proxy = config.Socks5Proxy
|
||
|
||
NoColor = config.NoColor
|
||
Language = config.Language
|
||
LogLevel = config.LogLevel
|
||
|
||
PortMap = config.PortMap
|
||
DefaultMap = config.DefaultMap
|
||
} |