main.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package main
  2. import (
  3. "context"
  4. "crypto/rand"
  5. "encoding/binary"
  6. "encoding/json"
  7. mRand "math/rand"
  8. "os"
  9. "os/signal"
  10. "syscall"
  11. "github.com/sagernet/sing-box/box"
  12. "github.com/sagernet/sing-box/config"
  13. "github.com/sagernet/sing/common"
  14. "github.com/sirupsen/logrus"
  15. "github.com/spf13/cobra"
  16. )
  17. func init() {
  18. logrus.StandardLogger().SetLevel(logrus.TraceLevel)
  19. logrus.StandardLogger().Formatter.(*logrus.TextFormatter).ForceColors = true
  20. var seed int64
  21. common.Must(binary.Read(rand.Reader, binary.LittleEndian, &seed))
  22. mRand.Seed(seed)
  23. }
  24. var configPath string
  25. func main() {
  26. command := &cobra.Command{
  27. Use: "sing-box",
  28. Run: run,
  29. }
  30. command.Flags().StringVarP(&configPath, "config", "c", "config.json", "set configuration file path")
  31. if err := command.Execute(); err != nil {
  32. logrus.Fatal(err)
  33. }
  34. }
  35. func run(cmd *cobra.Command, args []string) {
  36. configContent, err := os.ReadFile(configPath)
  37. if err != nil {
  38. logrus.Fatal("read config: ", err)
  39. }
  40. var boxConfig config.Config
  41. err = json.Unmarshal(configContent, &boxConfig)
  42. if err != nil {
  43. logrus.Fatal("parse config: ", err)
  44. }
  45. ctx, cancel := context.WithCancel(context.Background())
  46. service, err := box.NewService(ctx, &boxConfig)
  47. if err != nil {
  48. logrus.Fatal("create service: ", err)
  49. }
  50. err = service.Start()
  51. if err != nil {
  52. logrus.Fatal("start service: ", err)
  53. }
  54. osSignals := make(chan os.Signal, 1)
  55. signal.Notify(osSignals, os.Interrupt, syscall.SIGTERM)
  56. <-osSignals
  57. cancel()
  58. service.Close()
  59. }