123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- package main
- import (
- "embed"
- "flag"
- "fmt"
- "io/fs"
- "log"
- "net/http"
- "os"
- "github.com/google/uuid"
- )
- const (
- DEFAULT_DEV_MODE = true
- CONFIG_PATH = "./config"
- USB_KVM_CFG_PATH = CONFIG_PATH + "/usbkvm.json"
- UUID_FILE = CONFIG_PATH + "/uuid.cfg"
- DB_FILE_PATH = CONFIG_PATH + "/sys.db"
- )
- var (
- nodeUUID = "00000000-0000-0000-0000-000000000000"
- developent = flag.Bool("dev", DEFAULT_DEV_MODE, "Enable development mode with local static files")
- mode = flag.String("mode", "ipkvm", "Mode of operation: usbkvm, ipkvm or debug")
- tool = flag.String("tool", "", "Run debug tool, must be used with -mode=debug")
- )
- /* Web Server Static Files */
- //go:embed www
- var embeddedFiles embed.FS
- var webfs http.FileSystem
- func init() {
- // Initiate the web server static files
- if *developent {
- webfs = http.Dir("./www")
- } else {
- // Embed the ./www folder and trim the prefix
- subFS, err := fs.Sub(embeddedFiles, "www")
- if err != nil {
- log.Fatal(err)
- }
- webfs = http.FS(subFS)
- }
- // Initiate the config folder if not exists
- err := os.MkdirAll("./config", 0755)
- if err != nil {
- log.Fatal("Failed to create config folder:", err)
- }
- }
- func main() {
- flag.Parse()
- //Generate the node uuid if not set
- if _, err := os.Stat(UUID_FILE); os.IsNotExist(err) {
- newUUID := uuid.NewString()
- err = os.WriteFile(UUID_FILE, []byte(newUUID), 0644)
- if err != nil {
- log.Fatal("Failed to write UUID to file:", err)
- }
- }
- uuidBytes, err := os.ReadFile(UUID_FILE)
- if err != nil {
- log.Fatal("Failed to read UUID from file:", err)
- }
- nodeUUID = string(uuidBytes)
- switch *mode {
- case "cfgchip":
- //Load config file or create default one
- kvmCfg, err := loadUsbKvmConfig()
- if err != nil {
- log.Fatal("Failed to load or create USB KVM config:", err)
- }
- //Override the baudrate to 9600 for chip configuration
- kvmCfg.USBKVMBaudrate = 9600
- err = SetupHIDCommunication(kvmCfg)
- if err != nil {
- log.Fatal(err)
- }
- case "debug":
- err := handle_debug_tool()
- if err != nil {
- log.Fatal(err)
- }
- case "ipkvm":
- //Check runtime dependencies
- err := run_dependency_precheck()
- if err != nil {
- log.Fatal(err)
- }
- //Start IP-KVM mode
- err = init_ipkvm_mode()
- if err != nil {
- log.Fatal(err)
- }
- case "setpw":
- // Set system access password interactively
- err := init_auth_manager()
- if err != nil {
- log.Fatal("Failed to initialize Auth Manager:", err)
- }
- var pw string
- fmt.Print("Enter new password: ")
- _, err = fmt.Scanln(&pw)
- if err != nil {
- log.Fatal("Failed to read password:", err)
- }
- err = authManager.SetPassword(pw)
- if err != nil {
- log.Fatal("Failed to set password:", err)
- }
- fmt.Println("Password set successfully.")
- authManager.Close()
- default:
- log.Fatalf("Unknown mode: %s. Supported modes are: usbkvm, capture", *mode)
- }
- }
|