|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"net"
|
|
|
|
"net/http"
|
|
|
|
"net/http/httputil"
|
|
|
|
"os"
|
|
|
|
"runtime"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/cr3a70r/shield/internal/management"
|
|
|
|
"github.com/cr3a70r/shield/internal/proxy"
|
|
|
|
"github.com/cr3a70r/shield/internal/utils"
|
|
|
|
"github.com/xlab/closer"
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
logFile, err := os.OpenFile("runlog.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
} else {
|
|
|
|
log.SetOutput(logFile)
|
|
|
|
}
|
|
|
|
defer logFile.Close()
|
|
|
|
|
|
|
|
closer.Bind(cleanup)
|
|
|
|
|
|
|
|
logger := utils.New(os.Stdout, utils.LevelInfo)
|
|
|
|
|
|
|
|
test := workingProxyForDomain(logger, "test.dev.corp.daydev.org", "10.10.20.40", "9090")
|
|
|
|
http.HandleFunc("/", test.Handler)
|
|
|
|
proxysrv := &http.Server{
|
|
|
|
Addr: ":8085",
|
|
|
|
Handler: nil,
|
|
|
|
}
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
if err := proxysrv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
|
|
|
logger.PrintError(err, map[string]string{
|
|
|
|
"err": "failed to start proxy server",
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
management.Settings.Initialize()
|
|
|
|
|
|
|
|
//Building hosts from configured domains
|
|
|
|
for _, d := range management.Settings.Domains {
|
|
|
|
management.Settings.Hosts = append(management.Settings.Hosts, d.DomainName)
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println(runtime.NumGoroutine())
|
|
|
|
|
|
|
|
go management.StartWebserver("0.0.0.0:8080")
|
|
|
|
|
|
|
|
closer.Hold()
|
|
|
|
}
|
|
|
|
|
|
|
|
func cleanup() {
|
|
|
|
fmt.Println("Closing Application")
|
|
|
|
}
|
|
|
|
|
|
|
|
func workingProxyForDomain(logger *utils.Logger, domain string, realServer string, port string) *proxy.ReverseProxy {
|
|
|
|
transport := &http.Transport{
|
|
|
|
DialContext: (&net.Dialer{
|
|
|
|
Timeout: 5 * time.Second,
|
|
|
|
}).DialContext,
|
|
|
|
}
|
|
|
|
|
|
|
|
conf := &proxy.Config{
|
|
|
|
Path: domain,
|
|
|
|
Host: realServer,
|
|
|
|
Override: proxy.Override{},
|
|
|
|
}
|
|
|
|
|
|
|
|
director := &httputil.ReverseProxy{Director: func(req *http.Request) {
|
|
|
|
originHost := conf.Host
|
|
|
|
logger.PrintInfo("provided host", map[string]string{
|
|
|
|
"host": originHost,
|
|
|
|
})
|
|
|
|
req.Header.Add("X-Forwarded-Host", req.Host)
|
|
|
|
req.Header.Add("X-Origin-Host", originHost)
|
|
|
|
req.Header.Add("Accept-Encoding", "")
|
|
|
|
req.Host = originHost
|
|
|
|
req.URL.Host = originHost
|
|
|
|
req.URL.Scheme = "http"
|
|
|
|
|
|
|
|
if conf.Override.Header != "" && conf.Override.Match != "" {
|
|
|
|
if req.Header.Get(conf.Override.Header) == conf.Override.Match {
|
|
|
|
req.URL.Path = conf.Override.Path
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}}
|
|
|
|
|
|
|
|
prv := proxy.NewProxy(conf.Host, transport, director, logger, port)
|
|
|
|
return prv
|
|
|
|
}
|