main.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package main
  2. import (
  3. "embed"
  4. "flag"
  5. "io/fs"
  6. "log"
  7. "net/http"
  8. "os"
  9. "github.com/google/uuid"
  10. )
  11. const (
  12. defaultDevMode = true
  13. configPath = "./config"
  14. usbKvmConfigPath = configPath + "/usbkvm.json"
  15. uuidFile = configPath + "/uuid.cfg"
  16. )
  17. var (
  18. nodeUUID = "00000000-0000-0000-0000-000000000000"
  19. developent = flag.Bool("dev", defaultDevMode, "Enable development mode with local static files")
  20. mode = flag.String("mode", "ipkvm", "Mode of operation: usbkvm, ipkvm or debug")
  21. tool = flag.String("tool", "", "Run debug tool, must be used with -mode=debug")
  22. )
  23. /* Web Server Static Files */
  24. //go:embed www
  25. var embeddedFiles embed.FS
  26. var webfs http.FileSystem
  27. func init() {
  28. // Initiate the web server static files
  29. if *developent {
  30. webfs = http.Dir("./www")
  31. } else {
  32. // Embed the ./www folder and trim the prefix
  33. subFS, err := fs.Sub(embeddedFiles, "www")
  34. if err != nil {
  35. log.Fatal(err)
  36. }
  37. webfs = http.FS(subFS)
  38. }
  39. // Initiate the config folder if not exists
  40. err := os.MkdirAll("./config", 0755)
  41. if err != nil {
  42. log.Fatal("Failed to create config folder:", err)
  43. }
  44. }
  45. func main() {
  46. flag.Parse()
  47. //Generate the node uuid if not set
  48. if _, err := os.Stat(uuidFile); os.IsNotExist(err) {
  49. newUUID := uuid.NewString()
  50. err = os.WriteFile(uuidFile, []byte(newUUID), 0644)
  51. if err != nil {
  52. log.Fatal("Failed to write UUID to file:", err)
  53. }
  54. }
  55. uuidBytes, err := os.ReadFile(uuidFile)
  56. if err != nil {
  57. log.Fatal("Failed to read UUID from file:", err)
  58. }
  59. nodeUUID = string(uuidBytes)
  60. switch *mode {
  61. case "cfgchip":
  62. //Load config file or create default one
  63. kvmCfg, err := loadUsbKvmConfig()
  64. if err != nil {
  65. log.Fatal("Failed to load or create USB KVM config:", err)
  66. }
  67. //Override the baudrate to 9600 for chip configuration
  68. kvmCfg.USBKVMBaudrate = 9600
  69. err = SetupHIDCommunication(kvmCfg)
  70. if err != nil {
  71. log.Fatal(err)
  72. }
  73. case "debug":
  74. err := handle_debug_tool()
  75. if err != nil {
  76. log.Fatal(err)
  77. }
  78. case "ipkvm":
  79. //Check runtime dependencies
  80. err := run_dependency_precheck()
  81. if err != nil {
  82. log.Fatal(err)
  83. }
  84. //Start IP-KVM mode
  85. err = init_ipkvm_mode()
  86. if err != nil {
  87. log.Fatal(err)
  88. }
  89. case "usbkvm":
  90. //Check runtime dependencies
  91. err := run_dependency_precheck()
  92. if err != nil {
  93. log.Fatal(err)
  94. }
  95. //Load config file or create default one
  96. kvmCfg, err := loadUsbKvmConfig()
  97. if err != nil {
  98. log.Fatal("Failed to load or create USB KVM config:", err)
  99. }
  100. //Start USB KVM mode
  101. err = startUsbKvmMode(kvmCfg)
  102. if err != nil {
  103. log.Fatal(err)
  104. }
  105. default:
  106. log.Fatalf("Unknown mode: %s. Supported modes are: usbkvm, capture", *mode)
  107. }
  108. }