package main import ( "encoding/json" "flag" "fmt" "github.com/gobuffalo/packr" "io" "log" "math/rand" "net/http" "os" "os/signal" "time" ) func main() { Logger = log.New(io.Writer(os.Stdout), "", log.Lshortfile|log.LstdFlags) rand.Seed(time.Now().Unix()) var port string var address string flag.StringVar(&port, "port", "1443", "serve port") flag.StringVar(&address, "listen", "", "listen address") flag.StringVar(&configPath, "config", "config.conf", "config path") flag.Parse() fastLinkService = new(FastLinkService) ReadConfig() c := make(chan os.Signal) signal.Notify(c, os.Interrupt, os.Kill) go func() { <-c //阻塞直至有信号传入 Logger.Println("Saving config") SaveConfig() Logger.Println("Save config done,exit now.") os.Exit(0) }() go func() { ticker := time.NewTicker(time.Minute) for range ticker.C { <-ticker.C fastLinkService.KillAloneSignalSession() fastLinkService.KillExpiredToken() SaveConfig() Logger.Println("Saving config") ticker.Reset(time.Minute) } }() http.HandleFunc("/admin/config", configHandler) http.HandleFunc("/admin/addUser", addUserHandler) http.HandleFunc("/admin/editUser", editUserHandler) http.HandleFunc("/admin/removeUser", removeUserHandler) http.HandleFunc("/admin/kickUser", kickUserHandler) http.HandleFunc("/admin/removeDevice", removeDeviceHandler) http.HandleFunc("/admin/removeCustomName", removeCustomNameHandler) http.HandleFunc("/socket.io/", socketHandler) http.HandleFunc("/fastLink/shareUrl/connect/check", checkHandler) http.HandleFunc("/fastLink/device/deviceVerificationType", deviceVerificationTypeHandler) http.HandleFunc("/fastLink/config/idTransfer", idTransferHandler) http.HandleFunc("/fastLink/stream/record/close", closeHandler) http.HandleFunc("/fastLink/user/loginForApp", loginForAppHandler) http.HandleFunc("/fastLink/device/list", appListDeviceHandler) http.HandleFunc("/fastLink/user/logout", logoutHandler) http.HandleFunc("/fastLink/user/register", registerHandler) http.HandleFunc("/fastLink/code/send", sendCodeHandler) box := packr.NewBox("web") http.Handle("/", http.FileServer(box)) err := http.ListenAndServeTLS(address+":"+port, "cert.crt", "private.key", nil) //套nginx或Caddy可直接使用Http //err := http.ListenAndServe(address+":"+port, nil) if err != nil { fmt.Print(err) } } func socketHandler(w http.ResponseWriter, r *http.Request) { clientType := r.FormValue("clientType") if clientType == CLIENT_TYPE_CPP || clientType == CLIENT_TYPE_WEB { signalHandler(w, r) } else { serviceHandler(w, r) } } func configHandler(w http.ResponseWriter, r *http.Request) { marshal, _ := json.Marshal(fastLinkService) w.Write(marshal) } func addUserHandler(w http.ResponseWriter, r *http.Request) { user := r.FormValue("user") pass := r.FormValue("pass") if user == "" { w.Write([]byte("user is empty")) return } if pass == "" { w.Write([]byte("pass is empty")) return } exist := fastLinkService.CheckUserExist(user) if exist { w.Write([]byte("user exist")) return } fastLinkService.AddUser(user, pass) w.Write([]byte("success")) } func editUserHandler(w http.ResponseWriter, r *http.Request) { user := r.FormValue("user") pass := r.FormValue("pass") if user == "" { w.Write([]byte("user is empty")) return } if pass == "" { w.Write([]byte("pass is empty")) return } exist := fastLinkService.CheckUserExist(user) if !exist { w.Write([]byte("user not exist")) return } fastLinkService.EditUser(user, pass) w.Write([]byte("success")) } func removeUserHandler(w http.ResponseWriter, r *http.Request) { user := r.FormValue("user") if user == "" { w.Write([]byte("user is empty")) return } fastLinkService.removeUser(user) fastLinkService.removeDevicesByUser(user) fastLinkService.removeTokenByUser(user) w.Write([]byte("success")) } func kickUserHandler(w http.ResponseWriter, r *http.Request) { user := r.FormValue("user") if user == "" { w.Write([]byte("user is empty")) return } fastLinkService.removeTokenByUser(user) w.Write([]byte("success")) } func removeDeviceHandler(w http.ResponseWriter, r *http.Request) { deviceNo := r.FormValue("deviceNo") if deviceNo == "" { w.Write([]byte("deviceNo is empty")) return } device := fastLinkService.GetDeviceByNo(deviceNo) if device != nil { user := device.BelongUser fastLinkService.removeDevice(deviceNo) if user != "" { notifyDeviceChange(user) } } w.Write([]byte("success")) } func removeCustomNameHandler(w http.ResponseWriter, r *http.Request) { deviceNo := r.FormValue("deviceNo") if deviceNo == "" { w.Write([]byte("deviceNo is empty")) return } device := fastLinkService.GetDeviceByNo(deviceNo) if device != nil { device.CustomName = "" if device.BelongUser != "" { notifyDeviceChange(device.BelongUser) } } w.Write([]byte("success")) }