myxce/src/frontend/apiserver/middleware/startserver.go

121 lines
2.8 KiB
Go

package middleware
import (
"apiserver/utils"
logger "apiserver/utils"
"fmt"
"net"
"os"
"os/user"
"path/filepath"
"runtime"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
// openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt -config openssl.cnf -extensions v3_req
func StartServer(r *gin.Engine) error {
logger.Debug("Enter StartServer() function")
if runtime.GOOS != "windows" {
currentUser, err := user.Current()
if err != nil {
logger.Error("Failed to get current user:", zap.Error(err))
os.Exit(1)
}
if currentUser.Uid != "0" {
logger.Warn("Not running as root — PAM authentication will not work. OK for dev/testing.")
}
}
ips, err := GetIPAddresses()
if err != nil {
logger.Error("Failed to get server IP address:", zap.Error(err))
os.Exit(1)
}
ip := ips[0]
logger.Debug("API Server IP address:", zap.String("ip", ip))
httpsConfig := utils.HttpsYamlConfig //get only once
if httpsConfig.Enabled {
addr := ":" + httpsConfig.Port
logger.Info("Starting HTTPS server on " + addr)
fmt.Println("[GIN-debug] The API server will be run on https://" + ip + addr)
if err := r.RunTLS(
addr,
filepath.Join(utils.Global_TopDir, httpsConfig.CertFile),
filepath.Join(utils.Global_TopDir, httpsConfig.KeyFile),
); err != nil {
logger.Error("HTTPS Server fails to start:", zap.Error(err))
os.Exit(1)
}
} else {
addr := ":" + utils.AppYamlConfig.HTTPPort
logger.Info("Starting HTTP server on " + addr)
fmt.Println("[GIN-debug] The API server will be run on http://" + ip + addr)
if err := r.Run(addr); err != nil {
logger.Error("API Server fails to start:", zap.Error(err))
os.Exit(1)
}
}
return nil
}
func getServerIP() (string, error) {
// get the server IP address
addrs, err := net.InterfaceAddrs()
if err != nil {
logger.Error("Failed to get server IP address:", zap.Error(err))
return "", err
}
for _, addr := range addrs {
if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() && ipnet.IP.To4() != nil {
return ipnet.IP.String(), nil // real ip address
}
}
return "", nil
}
func GetIPAddresses() ([]string, error) {
var ips []string
interfaces, err := net.Interfaces()
if err != nil {
return nil, err
}
for _, iface := range interfaces {
if iface.Flags&net.FlagUp == 0 || iface.Flags&net.FlagLoopback != 0 {
// Skip down or loopback interfaces
continue
}
addrs, err := iface.Addrs()
if err != nil {
continue
}
for _, addr := range addrs {
var ip net.IP
switch v := addr.(type) {
case *net.IPNet:
ip = v.IP
case *net.IPAddr:
ip = v.IP
}
// Skip IPv6 link-local or loopback addresses
if ip == nil || ip.IsLoopback() || ip.IsLinkLocalUnicast() {
continue
}
ips = append(ips, ip.String())
}
}
return ips, nil
}