Files
trojanZ/trojan-master/trojan/trojan.go
T

151 lines
3.3 KiB
Go

package trojan
import (
"errors"
"fmt"
"os"
"os/signal"
"runtime"
"strconv"
"strings"
"trojan/core"
"trojan/util"
)
// ControlMenu Trojan控制菜单
func ControlMenu() {
fmt.Println()
tType := Type()
if tType == "trojan" {
tType = "trojan-go"
} else {
tType = "trojan"
}
menu := []string{"启动trojan", "停止trojan", "重启trojan", "查看trojan状态", "查看trojan日志", "修改trojan端口"}
menu = append(menu, "切换为"+tType)
switch util.LoopInput("请选择: ", menu, true) {
case 1:
Start()
case 2:
Stop()
case 3:
Restart()
case 4:
Status(true)
case 5:
go util.Log("trojan", 300)
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, os.Kill)
//阻塞
<-c
case 6:
ChangePort()
case 7:
if err := SwitchType(tType); err != nil {
fmt.Println(err)
}
}
}
// Restart 重启trojan
func Restart() error {
util.OpenPort(core.GetConfig().LocalPort)
return util.SystemctlRestart("trojan")
}
// Start 启动trojan
func Start() error {
util.OpenPort(core.GetConfig().LocalPort)
return util.SystemctlStart("trojan")
}
// Stop 停止trojan
func Stop() error {
return util.SystemctlStop("trojan")
}
// Status 获取trojan状态
func Status(isPrint bool) string {
result := util.SystemctlStatus("trojan")
if isPrint {
fmt.Println(result)
}
return result
}
// UpTime Trojan运行时间
func UpTime() string {
result := strings.TrimSpace(util.ExecCommandWithResult("ps -Ao etime,args|grep -v grep|grep /usr/local/etc/trojan/config.json"))
resultSlice := strings.Split(result, " ")
if len(resultSlice) > 0 {
return resultSlice[0]
}
return ""
}
// ChangePort 修改trojan端口
func ChangePort() {
config := core.GetConfig()
oldPort := config.LocalPort
randomPort := util.RandomPort()
fmt.Println("当前trojan端口: " + util.Green(strconv.Itoa(oldPort)))
newPortStr := util.Input(fmt.Sprintf("请输入新的trojan端口(若要使用随机端口%s直接回车即可): ", util.Blue(strconv.Itoa(randomPort))), strconv.Itoa(randomPort))
newPort, err := strconv.Atoi(newPortStr)
if err != nil {
fmt.Println("修改端口失败: " + err.Error())
return
}
if core.WritePort(newPort) {
util.OpenPort(newPort)
fmt.Println(util.Green("端口修改成功!"))
Restart()
} else {
fmt.Println(util.Red("端口修改成功!"))
}
}
// Version Trojan版本
func Version() string {
flag := "-v"
if Type() == "trojan-go" {
flag = "-version"
}
result := strings.TrimSpace(util.ExecCommandWithResult("/usr/bin/trojan/trojan " + flag))
if len(result) == 0 {
return ""
}
firstLine := strings.Split(result, "\n")[0]
tempSlice := strings.Split(firstLine, " ")
return tempSlice[len(tempSlice)-1]
}
// SwitchType 切换Trojan类型
func SwitchType(tType string) error {
ARCH := runtime.GOARCH
if ARCH != "amd64" && ARCH != "arm64" {
return errors.New("not support " + ARCH + " machine")
}
if tType == "trojan" && ARCH != "amd64" {
return errors.New("trojan not support " + ARCH + " machine")
}
if err := core.SetValue("trojanType", tType); err != nil {
return err
}
InstallTrojan("")
return nil
}
// Type Trojan类型
func Type() string {
tType, _ := core.GetValue("trojanType")
if tType == "" {
if strings.Contains(Status(false), "trojan-go") {
tType = "trojan-go"
} else {
tType = "trojan"
}
_ = core.SetValue("trojanType", tType)
}
return tType
}