First commit
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
package main
|
||||
|
||||
// go run main.go config.go certificate.go proxy.go utils.go
|
||||
// go build -o proxy
|
||||
import (
|
||||
"crypto/tls"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"sync"
|
||||
)
|
||||
|
||||
// Shared global variables (declared only here)
|
||||
var (
|
||||
config Config
|
||||
configMux sync.RWMutex
|
||||
cert *tls.Certificate
|
||||
baseDir string
|
||||
certDir string
|
||||
certPath string
|
||||
keyPath string
|
||||
configPath string
|
||||
)
|
||||
|
||||
func init() {
|
||||
if runtime.GOOS == "windows" && len(os.Args) > 0 && filepath.Ext(os.Args[0]) == ".go" {
|
||||
var err error
|
||||
baseDir, err = os.Getwd()
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to get working directory: %v", err)
|
||||
}
|
||||
} else {
|
||||
exePath, err := os.Executable()
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to get executable path: %v", err)
|
||||
}
|
||||
baseDir = filepath.Dir(exePath)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
configPath = filepath.Join(baseDir, "config.yaml")
|
||||
if _, err := os.Stat(configPath); os.IsNotExist(err) {
|
||||
config = generateDefaultConfig()
|
||||
if err := saveConfig(config); err != nil {
|
||||
log.Fatalf("Failed to save default config: %v", err)
|
||||
}
|
||||
log.Println("Generated default config file")
|
||||
} else {
|
||||
cfg, err := loadConfig()
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to load config: %v", err)
|
||||
}
|
||||
config = cfg
|
||||
}
|
||||
|
||||
updatePaths()
|
||||
|
||||
_, certErr := os.Stat(certPath)
|
||||
_, keyErr := os.Stat(keyPath)
|
||||
if os.IsNotExist(certErr) || os.IsNotExist(keyErr) {
|
||||
if err := generateSelfSignedCert(); err != nil {
|
||||
log.Fatalf("Failed to generate self-signed certificate: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
if err := loadCertificate(); err != nil {
|
||||
log.Fatalf("Failed to load certificate: %v", err)
|
||||
}
|
||||
|
||||
go monitorCertificates()
|
||||
go monitorConfig()
|
||||
|
||||
httpServer := &http.Server{
|
||||
Addr: config.ListenHTTP,
|
||||
Handler: http.HandlerFunc(handler),
|
||||
}
|
||||
|
||||
tlsConfig := &tls.Config{
|
||||
GetCertificate: func(*tls.ClientHelloInfo) (*tls.Certificate, error) {
|
||||
configMux.RLock()
|
||||
defer configMux.RUnlock()
|
||||
return cert, nil
|
||||
},
|
||||
}
|
||||
httpsServer := &http.Server{
|
||||
Addr: config.ListenHTTPS,
|
||||
Handler: http.HandlerFunc(handler),
|
||||
TLSConfig: tlsConfig,
|
||||
}
|
||||
|
||||
go func() {
|
||||
log.Printf("Starting HTTP server on %s", config.ListenHTTP)
|
||||
if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||||
log.Fatalf("HTTP server error: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
log.Printf("Starting HTTPS server on %s", config.ListenHTTPS)
|
||||
if err := httpsServer.ListenAndServeTLS("", ""); err != nil && err != http.ErrServerClosed {
|
||||
log.Fatalf("HTTPS server error: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user