mirror of
https://github.com/shadow1ng/fscan.git
synced 2026-09-21 19:00:42 +08:00
74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
//go:build !web
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"github.com/shadow1ng/fscan/common"
|
|
"github.com/shadow1ng/fscan/common/debug"
|
|
"github.com/shadow1ng/fscan/common/i18n"
|
|
"github.com/shadow1ng/fscan/core"
|
|
|
|
// 导入统一插件系统
|
|
_ "github.com/shadow1ng/fscan/plugins/local"
|
|
_ "github.com/shadow1ng/fscan/plugins/services"
|
|
_ "github.com/shadow1ng/fscan/plugins/web"
|
|
)
|
|
|
|
func main() {
|
|
os.Exit(run())
|
|
}
|
|
|
|
func run() int {
|
|
// 启动 pprof(仅调试版本)
|
|
debug.Start()
|
|
defer debug.Stop()
|
|
|
|
// 解析命令行参数
|
|
var info common.HostInfo
|
|
if err := common.Flag(&info); err != nil {
|
|
if err == common.ErrShowHelp {
|
|
return 0 // 显示帮助是正常退出
|
|
}
|
|
common.LogError(i18n.Tr("param_error", err))
|
|
return 1
|
|
}
|
|
|
|
// 检查参数互斥性
|
|
if err := common.ValidateExclusiveParams(&info); err != nil {
|
|
common.LogError(i18n.Tr("error_generic", err))
|
|
return 1
|
|
}
|
|
|
|
// 统一初始化:解析 → 配置 → 输出
|
|
result, err := common.Initialize(&info)
|
|
if err != nil {
|
|
common.LogError(i18n.Tr("init_failed", err))
|
|
return 1
|
|
}
|
|
|
|
// 设置信号处理,确保 Ctrl+C 时能正确保存结果
|
|
sigChan := make(chan os.Signal, 1)
|
|
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
|
|
go func() {
|
|
<-sigChan
|
|
common.LogInfo(i18n.GetText("received_exit_signal"))
|
|
_ = common.Cleanup() // 确保结果写入磁盘
|
|
os.Exit(130) // 128 + SIGINT(2) = 130,标准的中断退出码
|
|
}()
|
|
defer func() { _ = common.Cleanup() }()
|
|
defer common.CloseLogger()
|
|
|
|
// 执行扫描
|
|
if _, err := core.RunScan(context.Background(), *result.Info, result.Session); err != nil {
|
|
common.LogError(i18n.Tr("error_generic", err))
|
|
return 1
|
|
}
|
|
|
|
return 0
|
|
}
|