123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- package main
- /*
- ______
- |___ /
- / / ___ _ __ __ ___ ___ _
- / / / _ \| '__/ _` \ \/ / | | |
- / /_| (_) | | | (_| |> <| |_| |
- /_____\___/|_| \__,_/_/\_\\__, |
- __/ |
- |___/
- Zoraxy - A general purpose HTTP reverse proxy and forwarding tool
- Author: tobychui
- License: AGPLv3
- --------------------------------------------
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, version 3 of the License or any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
- import (
- "flag"
- "fmt"
- "log"
- "net/http"
- "os"
- "os/signal"
- "syscall"
- "time"
- "github.com/google/uuid"
- "github.com/gorilla/csrf"
- "imuslab.com/zoraxy/mod/geodb"
- "imuslab.com/zoraxy/mod/update"
- "imuslab.com/zoraxy/mod/utils"
- )
- /* SIGTERM handler, do shutdown sequences before closing */
- func SetupCloseHandler() {
- c := make(chan os.Signal, 2)
- signal.Notify(c, os.Interrupt, syscall.SIGTERM)
- go func() {
- <-c
- ShutdownSeq()
- os.Exit(0)
- }()
- }
- func main() {
- //Parse startup flags
- flag.Parse()
- /* Maintaince Function Modes */
- if *showver {
- fmt.Println(SYSTEM_NAME + " - Version " + SYSTEM_VERSION)
- os.Exit(0)
- }
- if *geoDbUpdate {
- geodb.DownloadGeoDBUpdate("./conf/geodb")
- os.Exit(0)
- }
- /* Main Zoraxy Routines */
- if !utils.ValidateListeningAddress(*webUIPort) {
- fmt.Println("Malformed -port (listening address) paramter. Do you mean -port=:" + *webUIPort + "?")
- os.Exit(0)
- }
- if *enableAutoUpdate {
- fmt.Println("Checking required config update")
- update.RunConfigUpdate(0, update.GetVersionIntFromVersionNumber(SYSTEM_VERSION))
- }
- SetupCloseHandler()
- //Read or create the system uuid
- uuidRecord := *path_uuid
- if !utils.FileExists(uuidRecord) {
- newSystemUUID := uuid.New().String()
- os.WriteFile(uuidRecord, []byte(newSystemUUID), 0775)
- }
- uuidBytes, err := os.ReadFile(uuidRecord)
- if err != nil {
- SystemWideLogger.PrintAndLog("ZeroTier", "Unable to read system uuid from file system", nil)
- panic(err)
- }
- nodeUUID = string(uuidBytes)
- //Create a new webmin mux and csrf middleware layer
- webminPanelMux = http.NewServeMux()
- csrfMiddleware = csrf.Protect(
- []byte(nodeUUID),
- csrf.CookieName(CSRF_COOKIENAME),
- csrf.Secure(false),
- csrf.Path("/"),
- csrf.SameSite(csrf.SameSiteLaxMode),
- )
- //Startup all modules, see start.go
- startupSequence()
- //Initiate management interface APIs
- requireAuth = !(*noauth)
- initAPIs(webminPanelMux)
- //Start the reverse proxy server in go routine
- go func() {
- ReverseProxtInit()
- }()
- time.Sleep(500 * time.Millisecond)
- //Start the finalize sequences
- finalSequence()
- SystemWideLogger.Println(SYSTEM_NAME + " started. Visit control panel at http://localhost" + *webUIPort)
- err = http.ListenAndServe(*webUIPort, csrfMiddleware(webminPanelMux))
- if err != nil {
- log.Fatal(err)
- }
- }
|