2022-10-28 00:01:05 +08:00
|
|
|
package cmd
|
2022-09-08 15:57:17 +08:00
|
|
|
|
|
|
|
|
import (
|
2022-11-10 16:52:00 +08:00
|
|
|
"context"
|
2022-09-15 19:27:07 +08:00
|
|
|
"fmt"
|
2026-01-20 23:23:23 +00:00
|
|
|
"os"
|
|
|
|
|
"os/signal"
|
|
|
|
|
"syscall"
|
|
|
|
|
"time"
|
|
|
|
|
|
2022-09-08 15:57:17 +08:00
|
|
|
"github.com/chainreactors/logs"
|
2025-02-22 20:31:32 +08:00
|
|
|
"github.com/chainreactors/spray/core"
|
2023-01-05 23:26:14 +08:00
|
|
|
"github.com/chainreactors/spray/pkg"
|
2022-09-15 19:27:07 +08:00
|
|
|
"github.com/jessevdk/go-flags"
|
2022-09-08 15:57:17 +08:00
|
|
|
)
|
|
|
|
|
|
2024-08-29 01:41:00 +08:00
|
|
|
var ver = "dev"
|
2024-03-07 04:15:28 +08:00
|
|
|
var DefaultConfig = "config.yaml"
|
2023-05-04 12:23:24 +08:00
|
|
|
|
2024-03-07 04:24:00 +08:00
|
|
|
func init() {
|
|
|
|
|
logs.Log.SetColorMap(map[logs.Level]func(string) string{
|
2026-05-26 07:25:07 -07:00
|
|
|
logs.InfoLevel: logs.PurpleBold,
|
|
|
|
|
logs.ImportantLevel: logs.GreenBold,
|
|
|
|
|
pkg.LogVerbose: logs.Green,
|
2024-03-07 04:24:00 +08:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-28 00:01:05 +08:00
|
|
|
func Spray() {
|
2025-02-22 20:31:32 +08:00
|
|
|
var option core.Option
|
2024-03-07 04:15:28 +08:00
|
|
|
|
2022-10-27 18:53:26 +08:00
|
|
|
parser := flags.NewParser(&option, flags.Default)
|
2026-05-07 15:23:50 +08:00
|
|
|
parser.Usage = core.Usage()
|
|
|
|
|
_, err := parser.ParseArgs(os.Args[1:])
|
2022-09-15 19:27:07 +08:00
|
|
|
if err != nil {
|
|
|
|
|
if err.(*flags.Error).Type != flags.ErrHelp {
|
|
|
|
|
fmt.Println(err.Error())
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
2024-02-12 16:49:44 +08:00
|
|
|
|
2025-06-05 11:41:11 +08:00
|
|
|
defer time.Sleep(time.Second)
|
2026-05-07 15:23:50 +08:00
|
|
|
ctx, canceler := context.WithTimeout(context.Background(), time.Duration(option.Deadline)*time.Second)
|
2024-11-01 12:30:35 +08:00
|
|
|
go func() {
|
|
|
|
|
select {
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
time.Sleep(10 * time.Second)
|
|
|
|
|
logs.Log.Errorf("deadline and timeout not work, hard exit!!!")
|
|
|
|
|
os.Exit(0)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
2022-12-12 17:05:44 +08:00
|
|
|
go func() {
|
2024-07-24 04:21:43 +08:00
|
|
|
exitChan := make(chan os.Signal, 2)
|
|
|
|
|
signal.Notify(exitChan, os.Interrupt, syscall.SIGTERM)
|
|
|
|
|
|
2022-12-12 17:05:44 +08:00
|
|
|
go func() {
|
2024-07-24 04:21:43 +08:00
|
|
|
sigCount := 0
|
|
|
|
|
for {
|
|
|
|
|
<-exitChan
|
|
|
|
|
sigCount++
|
|
|
|
|
if sigCount == 1 {
|
|
|
|
|
logs.Log.Infof("Exit signal received, saving task and exiting...")
|
|
|
|
|
canceler()
|
|
|
|
|
} else if sigCount == 2 {
|
|
|
|
|
logs.Log.Infof("forcing exit...")
|
|
|
|
|
os.Exit(1)
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-12-12 17:05:44 +08:00
|
|
|
}()
|
|
|
|
|
}()
|
|
|
|
|
|
2026-05-07 15:23:50 +08:00
|
|
|
if err := core.RunWithArgs(ctx, os.Args[1:], core.RunOptions{
|
|
|
|
|
DefaultConfig: DefaultConfig,
|
|
|
|
|
Version: ver,
|
|
|
|
|
}); err != nil {
|
2026-05-31 23:40:33 -07:00
|
|
|
logs.Log.Errorf("%s", err.Error())
|
2024-08-06 03:58:30 +08:00
|
|
|
return
|
2022-11-18 20:27:29 +08:00
|
|
|
}
|
2022-09-08 15:57:17 +08:00
|
|
|
}
|