|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"XProxy/cmd/config"
|
|
|
|
"XProxy/cmd/process"
|
|
|
|
"XProxy/cmd/radvd"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"os"
|
|
|
|
"os/signal"
|
|
|
|
"syscall"
|
|
|
|
)
|
|
|
|
|
|
|
|
var version = "0.0.9"
|
|
|
|
|
|
|
|
var v4RouteTable = 100
|
|
|
|
var v6RouteTable = 106
|
|
|
|
var v4TProxyPort = 7288
|
|
|
|
var v6TProxyPort = 7289
|
|
|
|
|
|
|
|
var exposeDir = "/xproxy"
|
|
|
|
var configDir = "/etc/xproxy"
|
|
|
|
var assetFile = "/assets.tar.xz"
|
|
|
|
var assetDir = exposeDir + "/assets"
|
|
|
|
var configFile = exposeDir + "/config.yml"
|
|
|
|
|
|
|
|
var subProcess []*process.Process
|
|
|
|
|
|
|
|
func runProcess(command ...string) {
|
|
|
|
sub := process.New(command...)
|
|
|
|
sub.Run(true)
|
|
|
|
sub.Daemon()
|
|
|
|
subProcess = append(subProcess, sub)
|
|
|
|
}
|
|
|
|
|
|
|
|
func blockWait() {
|
|
|
|
sigExit := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(sigExit, syscall.SIGINT, syscall.SIGTERM) // wait until get exit signal
|
|
|
|
<-sigExit
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
defer func() {
|
|
|
|
if err := recover(); err != nil {
|
|
|
|
log.Errorf("Panic exit -> %v", err)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
log.SetLevel(log.DebugLevel)
|
|
|
|
log.Infof("XProxy %s start", version)
|
|
|
|
|
|
|
|
settings := config.Load(configFile)
|
|
|
|
loadNetwork(&settings)
|
|
|
|
loadProxy(&settings)
|
|
|
|
loadAsset(&settings)
|
|
|
|
radvd.Load(&settings.Radvd)
|
|
|
|
|
|
|
|
runScript(&settings)
|
|
|
|
runProcess("xray", "-confdir", configDir)
|
|
|
|
if settings.Radvd.Enable {
|
|
|
|
runProcess("radvd", "-n", "-m", "logfile", "-l", exposeDir+"/log/radvd.log")
|
|
|
|
}
|
|
|
|
blockWait()
|
|
|
|
process.Exit(subProcess...)
|
|
|
|
}
|