main.go 2.8 KB

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