main.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package main
  5. import (
  6. "flag"
  7. "log"
  8. "time"
  9. "os"
  10. "net/http"
  11. "github.com/rs/cors"
  12. "github.com/marcsauter/single"
  13. )
  14. var addr = flag.String("port", "8000", "HTTP service address")
  15. var endpt = flag.String("endpt","http://localhost/AOB/SystemAOB/system/jwt/validate.php", "ShadowJWT Validation Endpoint")
  16. var useTLS = flag.Bool("tls", false, "Enable TLS support on websocket (aka wss:// instead of ws://). Reqire -cert and -key")
  17. var cert = flag.String("cert","server.crt", "Certification for TLS encription")
  18. var key = flag.String("key","server.key", "Server key for TLS encription")
  19. func serveHome(w http.ResponseWriter, r *http.Request) {
  20. log.Println(r.URL)
  21. if r.URL.Path != "/" {
  22. http.Error(w, "Not found", http.StatusNotFound)
  23. return
  24. }
  25. if r.Method != "GET" {
  26. http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
  27. return
  28. }
  29. http.ServeFile(w, r, "home.html")
  30. }
  31. func checkForTerminate(){
  32. if (fileExists("terminate.inf")){
  33. os.Remove("terminate.inf");
  34. os.Exit(0);
  35. }
  36. }
  37. func fileExists(filename string) bool {
  38. info, err := os.Stat(filename)
  39. if os.IsNotExist(err) {
  40. return false
  41. }
  42. return !info.IsDir()
  43. }
  44. func setInterval(someFunc func(), milliseconds int, async bool) chan bool {
  45. interval := time.Duration(milliseconds) * time.Millisecond
  46. ticker := time.NewTicker(interval)
  47. clear := make(chan bool)
  48. go func() {
  49. for {
  50. select {
  51. case <-ticker.C:
  52. if async {
  53. go someFunc()
  54. } else {
  55. someFunc()
  56. }
  57. case <-clear:
  58. ticker.Stop()
  59. return
  60. }
  61. }
  62. }()
  63. return clear
  64. }
  65. func main() {
  66. //Parse input flags
  67. flag.Parse()
  68. //Set terminate check on auto
  69. setInterval(checkForTerminate,1000,false)
  70. //Check if another instance is running
  71. s := single.New("aobws")
  72. if err := s.CheckLock(); err != nil && err == single.ErrAlreadyRunning {
  73. log.Fatal("Another instance of the app is already running, exiting")
  74. } else if err != nil {
  75. // Another error occurred, might be worth handling it as well
  76. log.Fatalf("Failed to acquire exclusive app lock: %v", err)
  77. }
  78. defer s.TryUnlock()
  79. //Create new websocket hub
  80. hub := newHub()
  81. go hub.run()
  82. log.Println("ArOZ Online WebSocket Server - CopyRight ArOZ Online Project 2020");
  83. mux := http.NewServeMux()
  84. mux.HandleFunc("/", serveHome)
  85. mux.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
  86. w.Header().Set("Access-Control-Allow-Origin", "*")
  87. serveWs(hub, w, r)
  88. })
  89. /*
  90. http.HandleFunc("/", serveHome)
  91. http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
  92. serveWs(hub, w, r)
  93. })
  94. */
  95. handler := cors.Default().Handler(mux)
  96. var err error
  97. if (*useTLS == true){
  98. err = http.ListenAndServeTLS(":" + *addr, *cert, *key, nil)
  99. }else{
  100. err = http.ListenAndServe(":" + *addr, handler)
  101. }
  102. if err != nil {
  103. log.Fatal("ListenAndServe: ", err)
  104. }
  105. }