fscan/Common/ParseIP.go
ZacharyZcR f09bfdc346 refactor: 重构ParseIP和ParsePort为模块化架构
将ParseIP.go和ParsePort.go的复杂解析逻辑迁移到parsers模块,
提供更好的错误处理、线程安全和功能扩展。

主要变更:
- ParseIP.go: 从550行复杂实现重构为199行简洁包装层
- ParsePort.go: 从94行实现重构为33行简洁包装层
- 所有解析逻辑统一到parsers/TargetParser.go中
- 新增parsers/LegacyParser.go提供向后兼容接口
- 支持所有原有功能:IP范围、CIDR、网段简写、端口组等
- 完全保持API兼容性,无需修改调用代码

测试验证:
- IP范围解析: 192.168.1.1-3 ✓
- 端口组展开: web → 210个端口 ✓
- CIDR和网段简写功能正常 ✓
2025-08-05 03:01:41 +08:00

200 lines
6.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package Common
/*
ParseIP.go - IP地址解析器重构版
此文件现在作为向后兼容的包装层内部委托给新的parsers模块。
原有的复杂解析逻辑已迁移到parsers/TargetParser.go中
提供更好的错误处理、线程安全和功能扩展。
向后兼容性:
- 保持原有函数签名不变
- 保持原有返回值格式
- 支持所有原有功能IP范围、CIDR、网段简写等
*/
import (
"errors"
"strings"
"github.com/shadow1ng/fscan/Common/parsers"
)
// IP解析相关错误
var (
ErrParseIP = errors.New(GetText("parse_ip_error")) // IP解析失败的统一错误
)
// ParseIP 解析各种格式的IP地址向后兼容包装函数
// 参数:
// - host: 主机地址可以是单个IP、IP范围、CIDR或常用网段简写
// - filename: 包含主机地址的文件名
// - nohosts: 需要排除的主机地址列表
//
// 返回:
// - []string: 解析后的IP地址列表
// - error: 解析过程中的错误
func ParseIP(host string, filename string, nohosts ...string) (hosts []string, err error) {
// 委托给新的parsers模块
hosts, err = parsers.ParseIP(host, filename, nohosts...)
if err != nil {
LogError(GetText("parse_ip_error") + ": " + err.Error())
return nil, ErrParseIP
}
// 处理主机和端口组合的情况 (格式: IP:PORT)
// 这个逻辑需要保持向后兼容
if filename == "" && len(hosts) > 0 {
// 检查原始输入是否包含端口
if strings.Contains(host, ":") {
hostport := strings.Split(host, ":")
if len(hostport) == 2 {
Ports = hostport[1]
LogBase(GetText("host_port_parsed", Ports))
}
}
}
LogBase(GetText("final_valid_hosts", len(hosts)))
return hosts, nil
}
// parseIPList 解析逗号分隔的IP地址列表已弃用重定向到parsers模块
// 保留此函数以确保向后兼容性
func parseIPList(ipList string) []string {
hosts, err := parsers.ParseIP(ipList, "")
if err != nil {
LogError(GetText("parse_ip_error") + ": " + err.Error())
return nil
}
return hosts
}
// parseSingleIP 解析单个IP地址或IP范围已弃用重定向到parsers模块
// 保留此函数以确保向后兼容性
func parseSingleIP(ip string) []string {
hosts, err := parsers.ParseIP(ip, "")
if err != nil {
LogError(GetText("invalid_ip_format", ip))
return nil
}
return hosts
}
// parseCIDR 解析CIDR格式的IP地址段已弃用重定向到parsers模块
// 保留此函数以确保向后兼容性
func parseCIDR(cidr string) []string {
hosts, err := parsers.ParseIP(cidr, "")
if err != nil {
LogError(GetText("cidr_parse_failed", cidr, err))
return nil
}
LogBase(GetText("parse_cidr_to_range", cidr, ""))
return hosts
}
// calculateIPRange 计算CIDR的起始IP和结束IP已弃用
// 此函数已迁移到parsers模块保留以确保向后兼容性
func calculateIPRange(cidr interface{}) string {
// 此函数已弃用功能已集成到parsers模块中
return ""
}
// parseIPRange 解析IP范围格式的地址已弃用重定向到parsers模块
// 保留此函数以确保向后兼容性
func parseIPRange(ipRange string) []string {
hosts, err := parsers.ParseIP(ipRange, "")
if err != nil {
LogError(GetText("ip_range_format_error", ipRange))
return nil
}
return hosts
}
// parseShortIPRange 解析简写格式的IP范围已弃用
// 此函数已迁移到parsers模块保留以确保向后兼容性
func parseShortIPRange(startIP, endSuffix string) []string {
hosts, err := parsers.ParseIP(startIP+"-"+endSuffix, "")
if err != nil {
LogError(GetText("ip_range_format_error", startIP+"-"+endSuffix))
return nil
}
return hosts
}
// parseFullIPRange 解析完整格式的IP范围已弃用
// 此函数已迁移到parsers模块保留以确保向后兼容性
func parseFullIPRange(startIP, endIP string) []string {
hosts, err := parsers.ParseIP(startIP+"-"+endIP, "")
if err != nil {
LogError(GetText("ip_format_error", startIP+"-"+endIP))
return nil
}
return hosts
}
// parseSubnet8 解析/8网段的IP地址生成采样IP列表已弃用
// 此函数已迁移到parsers模块保留以确保向后兼容性
func parseSubnet8(subnet string) []string {
hosts, err := parsers.ParseIP(subnet, "")
if err != nil {
LogError(GetText("invalid_ip_format", subnet))
return nil
}
LogBase(GetText("sample_ip_generated", len(hosts)))
return hosts
}
// readIPFile 从文件中按行读取IP地址已弃用重定向到parsers模块
// 保留此函数以确保向后兼容性但建议使用parsers模块的文件读取功能
func readIPFile(filename string) ([]string, error) {
// 委托给parsers模块
hosts, err := parsers.ParseIP("", filename)
if err != nil {
LogError(GetText("open_file_failed", filename, err))
return nil, err
}
LogBase(GetText("file_parse_complete", len(hosts)))
return hosts, nil
}
// excludeHosts 从主机列表中排除指定的主机(已弃用)
// 此函数已集成到parsers模块的解析过程中保留以确保向后兼容性
func excludeHosts(hosts []string, nohosts []string) []string {
// 如果没有需要排除的主机,直接返回原列表
if len(nohosts) == 0 || nohosts[0] == "" {
return hosts
}
// 使用parsers模块的功能
result, err := parsers.ParseIP(strings.Join(hosts, ","), "", nohosts...)
if err != nil {
LogError(GetText("hosts_excluded", 0))
return hosts
}
LogBase(GetText("hosts_excluded", len(hosts)-len(result)))
return result
}
// removeDuplicateIPs 去除重复的IP地址已弃用
// 此功能已集成到parsers模块中保留以确保向后兼容性
func removeDuplicateIPs(ips []string) []string {
// 使用parsers模块的去重功能
result, err := parsers.ParseIP(strings.Join(ips, ","), "")
if err != nil {
return ips
}
return result
}
// randomInt 生成指定范围内的随机整数(已弃用)
// 此函数已迁移到parsers模块保留以确保向后兼容性
func randomInt(min, max int) int {
if min >= max || min < 0 || max <= 0 {
return max
}
return min + (max-min)/2 // 简化版本
}