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

129 lines
3.3 KiB
Go

package util
import (
"bufio"
"fmt"
"io"
"math/rand"
"net"
"net/http"
"os"
"os/exec"
"strconv"
"time"
)
// PortIsUse 判断端口是否占用
func PortIsUse(port int) bool {
_, tcpError := net.DialTimeout("tcp", fmt.Sprintf(":%d", port), time.Millisecond*50)
udpAddr, _ := net.ResolveUDPAddr("udp4", fmt.Sprintf(":%d", port))
udpConn, udpError := net.ListenUDP("udp", udpAddr)
if udpConn != nil {
defer udpConn.Close()
}
return tcpError == nil || udpError != nil
}
// RandomPort 获取没占用的随机端口
func RandomPort() int {
for {
rand.New(rand.NewSource(time.Now().UnixNano()))
newPort := rand.Intn(65536)
if !PortIsUse(newPort) {
return newPort
}
}
}
// IsExists 检测指定路径文件或者文件夹是否存在
func IsExists(path string) bool {
_, err := os.Stat(path) //os.Stat获取文件信息
if err != nil {
if os.IsExist(err) {
return true
}
return false
}
return true
}
// GetLocalIP 获取本机ipv4地址
func GetLocalIP() string {
resp, err := http.Get("http://api.ipify.org")
if err != nil {
resp, _ = http.Get("http://icanhazip.com")
}
defer resp.Body.Close()
s, _ := io.ReadAll(resp.Body)
return string(s)
}
// InstallPack 安装指定名字软件
func InstallPack(name string) {
if !CheckCommandExists(name) {
if CheckCommandExists("yum") {
ExecCommand("yum install -y " + name)
} else if CheckCommandExists("apt-get") {
ExecCommand("apt-get update")
ExecCommand("apt-get install -y " + name)
}
}
}
// OpenPort 开通指定端口
func OpenPort(port int) {
if CheckCommandExists("firewall-cmd") {
ExecCommand(fmt.Sprintf("firewall-cmd --zone=public --add-port=%d/tcp --add-port=%d/udp --permanent >/dev/null 2>&1", port, port))
ExecCommand("firewall-cmd --reload >/dev/null 2>&1")
} else {
if len(ExecCommandWithResult(fmt.Sprintf(`iptables -nvL --line-number|grep -w "%d"`, port))) > 0 {
return
}
ExecCommand(fmt.Sprintf("iptables -I INPUT -p tcp --dport %d -j ACCEPT", port))
ExecCommand(fmt.Sprintf("iptables -I INPUT -p udp --dport %d -j ACCEPT", port))
ExecCommand(fmt.Sprintf("iptables -I OUTPUT -p udp --sport %d -j ACCEPT", port))
ExecCommand(fmt.Sprintf("iptables -I OUTPUT -p tcp --sport %d -j ACCEPT", port))
}
}
// Log 实时打印指定服务日志
func Log(serviceName string, line int) {
result, _ := LogChan(serviceName, "-n "+strconv.Itoa(line), make(chan byte))
for line := range result {
fmt.Println(line)
}
}
// LogChan 指定服务实时日志, 返回chan
func LogChan(serviceName, param string, closeChan chan byte) (chan string, error) {
logFile := fmt.Sprintf("/var/log/%s.log", serviceName)
command := fmt.Sprintf("journalctl -f -u %s -o cat %s", serviceName, param)
// docker-systemctl has no persistent journal. Compatibility images write
// service output to /var/log/<service>.log instead.
if IsExists(logFile) {
command = fmt.Sprintf("tail %s -F %s", param, logFile)
}
cmd := exec.Command("bash", "-c", command)
stdout, _ := cmd.StdoutPipe()
if err := cmd.Start(); err != nil {
fmt.Println("Error:The command is err: ", err.Error())
return nil, err
}
ch := make(chan string, 100)
stdoutScan := bufio.NewScanner(stdout)
go func() {
for stdoutScan.Scan() {
select {
case <-closeChan:
stdout.Close()
return
default:
ch <- stdoutScan.Text()
}
}
}()
return ch, nil
}