mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 05:31:44 +08:00
138 lines
3.2 KiB
Go
138 lines
3.2 KiB
Go
package os
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func readOSRelease() map[string]string {
|
|
file, err := os.Open("/etc/os-release")
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
defer func(file *os.File) { _ = file.Close() }(file)
|
|
|
|
osRelease := make(map[string]string)
|
|
scanner := bufio.NewScanner(file)
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
if len(line) > 0 && strings.Contains(line, "=") {
|
|
parts := strings.SplitN(line, "=", 2)
|
|
key := parts[0]
|
|
value := strings.Trim(parts[1], `"`)
|
|
osRelease[key] = value
|
|
}
|
|
}
|
|
return osRelease
|
|
}
|
|
|
|
// IsDebian 判断是否是 Debian 系统
|
|
func IsDebian() bool {
|
|
osRelease := readOSRelease()
|
|
if osRelease == nil {
|
|
return false
|
|
}
|
|
id, idLike := osRelease["ID"], osRelease["ID_LIKE"]
|
|
return id == "debian" || strings.Contains(idLike, "debian")
|
|
}
|
|
|
|
// IsRHEL 判断是否是 RHEL 系统
|
|
func IsRHEL() bool {
|
|
osRelease := readOSRelease()
|
|
if osRelease == nil {
|
|
return false
|
|
}
|
|
// alinux Alibaba Cloud Linux
|
|
// hce Huawei Cloud EulerOS
|
|
// openEuler openEuler
|
|
id, idLike := osRelease["ID"], osRelease["ID_LIKE"]
|
|
return id == "rhel" || id == "almalinux" || id == "rocky" || id == "alinux" || id == "tencentos" || id == "opencloudos" || strings.Contains(idLike, "rhel")
|
|
}
|
|
|
|
// IsUbuntu 判断是否是 Ubuntu 系统
|
|
func IsUbuntu() bool {
|
|
osRelease := readOSRelease()
|
|
if osRelease == nil {
|
|
return false
|
|
}
|
|
id, idLike := osRelease["ID"], osRelease["ID_LIKE"]
|
|
return id == "ubuntu" || strings.Contains(idLike, "ubuntu")
|
|
}
|
|
|
|
// IsEOL 判断系统是否已到达生命周期终点
|
|
func IsEOL() bool {
|
|
eolTimeTable := map[string]map[string]time.Time{
|
|
"rhel": {
|
|
"9": time.Date(2032, 5, 31, 0, 0, 0, 0, time.UTC),
|
|
"10": time.Date(2035, 5, 31, 0, 0, 0, 0, time.UTC),
|
|
},
|
|
"debian": {
|
|
"12": time.Date(2028, 6, 30, 0, 0, 0, 0, time.UTC),
|
|
"13": time.Date(2030, 6, 30, 0, 0, 0, 0, time.UTC),
|
|
},
|
|
"ubuntu": {
|
|
"22.04": time.Date(2027, 4, 1, 0, 0, 0, 0, time.UTC),
|
|
"24.04": time.Date(2029, 5, 31, 0, 0, 0, 0, time.UTC),
|
|
},
|
|
}
|
|
|
|
osRelease := readOSRelease()
|
|
|
|
if IsRHEL() {
|
|
version, ok := osRelease["VERSION_ID"]
|
|
if !ok {
|
|
return false
|
|
}
|
|
majorVersion := strings.Split(version, ".")[0]
|
|
if eol, ok := eolTimeTable["rhel"][majorVersion]; ok {
|
|
return time.Now().After(eol)
|
|
}
|
|
}
|
|
if IsUbuntu() {
|
|
version, ok := osRelease["VERSION_ID"]
|
|
if !ok {
|
|
return false
|
|
}
|
|
majorVersion := strings.Join(strings.Split(version, ".")[:2], ".")
|
|
if eol, ok := eolTimeTable["ubuntu"][majorVersion]; ok {
|
|
return time.Now().After(eol)
|
|
}
|
|
}
|
|
if IsDebian() {
|
|
version, ok := osRelease["VERSION_ID"]
|
|
if !ok {
|
|
return false
|
|
}
|
|
majorVersion := strings.Split(version, ".")[0]
|
|
if eol, ok := eolTimeTable["debian"][majorVersion]; ok {
|
|
return time.Now().After(eol)
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func TCPPortInUse(port uint) bool {
|
|
addr := fmt.Sprintf(":%d", port)
|
|
conn, err := net.Listen("tcp", addr)
|
|
if err != nil {
|
|
return true
|
|
}
|
|
defer func(conn net.Listener) { _ = conn.Close() }(conn)
|
|
return false
|
|
}
|
|
|
|
func UDPPortInUse(port uint) bool {
|
|
addr := fmt.Sprintf(":%d", port)
|
|
conn, err := net.ListenPacket("udp", addr)
|
|
if err != nil {
|
|
return true
|
|
}
|
|
defer func(conn net.PacketConn) { _ = conn.Close() }(conn)
|
|
return false
|
|
}
|