fastlink/fastlink.go
2022-08-03 10:30:59 +08:00

190 lines
4.8 KiB
Go

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"))
}