lib.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package main
  2. import "C"
  3. import (
  4. "github.com/Dreamacro/clash/config"
  5. "github.com/Dreamacro/clash/constant"
  6. "github.com/Dreamacro/clash/hub"
  7. "github.com/oschwald/geoip2-golang"
  8. "log"
  9. "os"
  10. "path/filepath"
  11. )
  12. var options []hub.Option
  13. func init() {
  14. constant.Version = "v1.16.0"
  15. }
  16. //export setHomeDir
  17. func setHomeDir(homeStr *C.char) bool {
  18. homeDir := C.GoString(homeStr)
  19. info, err := os.Stat(homeDir)
  20. if err != nil {
  21. log.Printf("clash_lib [setHomeDir]: %s : %+v\n", homeDir, err)
  22. return false
  23. }
  24. if !info.IsDir() {
  25. log.Printf("clash_lib [setHomeDir]: Path is not directory %s\n", homeDir)
  26. return false
  27. }
  28. constant.SetHomeDir(homeDir)
  29. return true
  30. }
  31. //export setConfig
  32. func setConfig(configStr *C.char) bool {
  33. configFile := C.GoString(configStr)
  34. if configFile == "" {
  35. return false
  36. }
  37. if !filepath.IsAbs(configFile) {
  38. configFile = filepath.Join(constant.Path.HomeDir(), configFile)
  39. }
  40. constant.SetConfig(configFile)
  41. return true
  42. }
  43. //export withExternalController
  44. func withExternalController(externalController *C.char) {
  45. options = append(options, hub.WithExternalController(C.GoString(externalController)))
  46. }
  47. //export withSecret
  48. func withSecret(secret *C.char) {
  49. options = append(options, hub.WithSecret(C.GoString(secret)))
  50. }
  51. //export mmdbVerify
  52. func mmdbVerify(path *C.char) bool {
  53. instance, err := geoip2.Open(C.GoString(path))
  54. if err == nil {
  55. _ = instance.Close()
  56. }
  57. return err == nil
  58. }
  59. //export startService
  60. func startService() bool {
  61. if err := config.Init(constant.Path.HomeDir()); err != nil {
  62. log.Printf("clash_lib [startService]: Initial error: %+v\n", err)
  63. return false
  64. }
  65. err := hub.Parse(options...)
  66. if err != nil {
  67. log.Printf("clash_lib [startService]: %+v\n", err)
  68. return false
  69. }
  70. return true
  71. }
  72. func main() {
  73. log.Println("hello clash")
  74. }