Skip to content

Commit 3d7192d

Browse files
committed
0.0.1
1 parent 810dad5 commit 3d7192d

File tree

29 files changed

+1131
-199
lines changed

29 files changed

+1131
-199
lines changed

database/db.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ func InitDB(dbPath string) error {
5151
var gormLogger logger.Interface
5252

5353
if config.IsDebug() {
54-
gormLogger = logger.Discard
55-
} else {
5654
gormLogger = logger.Default
55+
} else {
56+
gormLogger = logger.Discard
5757
}
5858

5959
c := &gorm.Config{

database/model/model.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package model
22

33
import (
4-
"encoding/json"
4+
"fmt"
5+
"x-ui/util/json_util"
56
"x-ui/xray"
67
)
78

@@ -24,32 +25,32 @@ type User struct {
2425

2526
type Inbound struct {
2627
Id int `json:"id" form:"id" gorm:"primaryKey;autoIncrement"`
27-
UserId int `json:"user_id" form:"user_id"`
28-
Up int64 `json:"up" form:"up"`
29-
Down int64 `json:"down" form:"down"`
28+
UserId int `json:"-"`
29+
Up int64 `json:"up"`
30+
Down int64 `json:"down"`
3031
Remark string `json:"remark" form:"remark"`
3132
Enable bool `json:"enable" form:"enable"`
32-
ExpiryTime int64 `json:"expiry_time" form:"expiry_time"`
33+
ExpiryTime int64 `json:"expiryTime" form:"expiryTime"`
3334

3435
// config part
3536
Listen string `json:"listen" form:"listen"`
36-
Port int `json:"port" form:"port"`
37+
Port int `json:"port" form:"port" gorm:"unique"`
3738
Protocol Protocol `json:"protocol" form:"protocol"`
3839
Settings string `json:"settings" form:"settings"`
39-
StreamSettings string `json:"stream_settings" form:"stream_settings"`
40-
Tag string `json:"tag" form:"tag"`
40+
StreamSettings string `json:"streamSettings" form:"streamSettings"`
41+
Tag string `json:"tag" form:"tag" gorm:"unique"`
4142
Sniffing string `json:"sniffing" form:"sniffing"`
4243
}
4344

4445
func (i *Inbound) GenXrayInboundConfig() *xray.InboundConfig {
4546
return &xray.InboundConfig{
46-
Listen: json.RawMessage(i.Listen),
47+
Listen: json_util.RawMessage(fmt.Sprintf("\"%s\"", i.Listen)),
4748
Port: i.Port,
4849
Protocol: string(i.Protocol),
49-
Settings: json.RawMessage(i.Settings),
50-
StreamSettings: json.RawMessage(i.StreamSettings),
50+
Settings: json_util.RawMessage(i.Settings),
51+
StreamSettings: json_util.RawMessage(i.StreamSettings),
5152
Tag: i.Tag,
52-
Sniffing: json.RawMessage(i.Sniffing),
53+
Sniffing: json_util.RawMessage(i.Sniffing),
5354
}
5455
}
5556

install.sh

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
#!/bin/bash
2+
3+
red='\033[0;31m'
4+
green='\033[0;32m'
5+
yellow='\033[0;33m'
6+
plain='\033[0m'
7+
8+
cur_dir=$(pwd)
9+
10+
# check root
11+
[[ $EUID -ne 0 ]] && echo -e "${red}错误:${plain} 必须使用root用户运行此脚本!\n" && exit 1
12+
13+
# check os
14+
if [[ -f /etc/redhat-release ]]; then
15+
release="centos"
16+
elif cat /etc/issue | grep -Eqi "debian"; then
17+
release="debian"
18+
elif cat /etc/issue | grep -Eqi "ubuntu"; then
19+
release="ubuntu"
20+
elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then
21+
release="centos"
22+
elif cat /proc/version | grep -Eqi "debian"; then
23+
release="debian"
24+
elif cat /proc/version | grep -Eqi "ubuntu"; then
25+
release="ubuntu"
26+
elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then
27+
release="centos"
28+
else
29+
echo -e "${red}未检测到系统版本,请联系脚本作者!${plain}\n" && exit 1
30+
fi
31+
32+
arch=$(arch)
33+
34+
if [[ $arch == "x86_64" || $arch == "x64" || $arch == "amd64" ]]; then
35+
arch="amd64"
36+
elif [[ $arch == "aarch64" || $arch == "arm64" ]]; then
37+
arch="arm64"
38+
else
39+
arch="amd64"
40+
echo -e "${red}检测架构失败,使用默认架构: ${arch}${plain}"
41+
fi
42+
43+
echo "架构: ${arch}"
44+
45+
if [ $(getconf WORD_BIT) != '32' ] && [ $(getconf LONG_BIT) != '64' ] ; then
46+
echo "本软件不支持 32 位系统(x86),请使用 64 位系统(x86_64),如果检测有误,请联系作者"
47+
exit -1
48+
fi
49+
50+
os_version=""
51+
52+
# os version
53+
if [[ -f /etc/os-release ]]; then
54+
os_version=$(awk -F'[= ."]' '/VERSION_ID/{print $3}' /etc/os-release)
55+
fi
56+
if [[ -z "$os_version" && -f /etc/lsb-release ]]; then
57+
os_version=$(awk -F'[= ."]+' '/DISTRIB_RELEASE/{print $2}' /etc/lsb-release)
58+
fi
59+
60+
if [[ x"${release}" == x"centos" ]]; then
61+
if [[ ${os_version} -le 6 ]]; then
62+
echo -e "${red}请使用 CentOS 7 或更高版本的系统!${plain}\n" && exit 1
63+
fi
64+
elif [[ x"${release}" == x"ubuntu" ]]; then
65+
if [[ ${os_version} -lt 16 ]]; then
66+
echo -e "${red}请使用 Ubuntu 16 或更高版本的系统!${plain}\n" && exit 1
67+
fi
68+
elif [[ x"${release}" == x"debian" ]]; then
69+
if [[ ${os_version} -lt 8 ]]; then
70+
echo -e "${red}请使用 Debian 8 或更高版本的系统!${plain}\n" && exit 1
71+
fi
72+
fi
73+
74+
install_base() {
75+
if [[ x"${release}" == x"centos" ]]; then
76+
yum install wget curl tar -y
77+
else
78+
apt install wget curl tar -y
79+
fi
80+
}
81+
82+
install_x-ui() {
83+
systemctl stop x-ui
84+
cd /usr/local/
85+
if [[ -e /usr/local/x-ui/ ]]; then
86+
rm /usr/local/x-ui/ -rf
87+
fi
88+
89+
if [ $# == 0 ] ;then
90+
last_version=$(curl -Ls "https://api.github.com/repos/sprov065/x-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
91+
if [[ ! -n "$last_version" ]]; then
92+
echo -e "${red}检测 x-ui 版本失败,可能是超出 Github API 限制,请稍后再试,或手动指定 x-ui 版本安装${plain}"
93+
exit 1
94+
fi
95+
echo -e "检测到 x-ui 最新版本:${last_version},开始安装"
96+
wget -N --no-check-certificate -O /usr/local/x-ui-linux-${arch}.tar.gz https://github.com/sprov065/x-ui/releases/download/${last_version}/x-ui-linux-${arch}.tar.gz
97+
if [[ $? -ne 0 ]]; then
98+
echo -e "${red}下载 x-ui 失败,请确保你的服务器能够下载 Github 的文件${plain}"
99+
exit 1
100+
fi
101+
else
102+
last_version=$1
103+
url="https://github.com/sprov065/x-ui/releases/download/${last_version}/x-ui-linux-${arch}.tar.gz"
104+
echo -e "开始安装 x-ui v$1"
105+
wget -N --no-check-certificate -O /usr/local/x-ui-linux-${arch}.tar.gz ${url}
106+
if [[ $? -ne 0 ]]; then
107+
echo -e "${red}下载 x-ui v$1 失败,请确保此版本存在${plain}"
108+
exit 1
109+
fi
110+
fi
111+
112+
tar zxvf x-ui-linux-${arch}.tar.gz
113+
rm x-ui-linux-${arch}.tar.gz -f
114+
cd x-ui
115+
chmod +x x-ui bin/xray-x-ui-linux-${arch}
116+
cp -f x-ui.service /etc/systemd/system/
117+
systemctl daemon-reload
118+
systemctl enable x-ui
119+
systemctl start x-ui
120+
echo -e "${green}x-ui v${last_version}${plain} 安装完成,面板已启动,"
121+
echo -e ""
122+
echo -e "如果是全新安装,默认网页端口为 ${green}54321${plain},用户名和密码默认都是 ${green}admin${plain}"
123+
echo -e "请自行确保此端口没有被其他程序占用,${yellow}并且确保 54321 端口已放行${plain}"
124+
# echo -e "若想将 54321 修改为其它端口,输入 x-ui 命令进行修改,同样也要确保你修改的端口也是放行的"
125+
echo -e ""
126+
echo -e "如果是更新面板,则按你之前的方式访问面板"
127+
echo -e ""
128+
curl -o /usr/bin/x-ui -Ls https://raw.githubusercontent.com/sprov065/x-ui/master/x-ui.sh
129+
chmod +x /usr/bin/x-ui
130+
echo -e "x-ui 管理脚本使用方法: "
131+
echo -e "----------------------------------------------"
132+
echo -e "x-ui - 显示管理菜单 (功能更多)"
133+
echo -e "x-ui start - 启动 x-ui 面板"
134+
echo -e "x-ui stop - 停止 x-ui 面板"
135+
echo -e "x-ui restart - 重启 x-ui 面板"
136+
echo -e "x-ui status - 查看 x-ui 状态"
137+
echo -e "x-ui enable - 设置 x-ui 开机自启"
138+
echo -e "x-ui disable - 取消 x-ui 开机自启"
139+
echo -e "x-ui log - 查看 x-ui 日志"
140+
echo -e "x-ui update - 更新 x-ui 面板"
141+
echo -e "x-ui install - 安装 x-ui 面板"
142+
echo -e "x-ui uninstall - 卸载 x-ui 面板"
143+
echo -e "----------------------------------------------"
144+
}
145+
146+
echo -e "${green}开始安装${plain}"
147+
install_base
148+
install_x-ui $1

main.go

Lines changed: 106 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ import (
1212
"x-ui/config"
1313
"x-ui/database"
1414
"x-ui/logger"
15+
"x-ui/v2ui"
1516
"x-ui/web"
1617
"x-ui/web/global"
18+
"x-ui/web/service"
1719
)
1820

1921
// this function call global.setWebServer
@@ -46,7 +48,8 @@ func runWebServer() {
4648
setWebServer(server)
4749
err = server.Start()
4850
if err != nil {
49-
panic(err)
51+
log.Println(err)
52+
return
5053
}
5154

5255
sigCh := make(chan os.Signal, 1)
@@ -60,16 +63,57 @@ func runWebServer() {
6063
setWebServer(server)
6164
err = server.Start()
6265
if err != nil {
63-
panic(err)
66+
log.Println(err)
67+
return
6468
}
6569
} else {
6670
continue
6771
}
6872
}
6973
}
7074

71-
func v2ui(dbPath string) {
72-
// migrate from v2-ui
75+
func resetSetting() {
76+
err := database.InitDB(config.GetDBPath())
77+
if err != nil {
78+
fmt.Println(err)
79+
return
80+
}
81+
82+
settingService := service.SettingService{}
83+
err = settingService.ResetSettings()
84+
if err != nil {
85+
fmt.Println("reset setting failed:", err)
86+
} else {
87+
fmt.Println("reset setting success")
88+
}
89+
}
90+
91+
func updateSetting(port int, username string, password string) {
92+
err := database.InitDB(config.GetDBPath())
93+
if err != nil {
94+
fmt.Println(err)
95+
return
96+
}
97+
98+
settingService := service.SettingService{}
99+
100+
if port > 0 {
101+
err := settingService.SetPort(port)
102+
if err != nil {
103+
fmt.Println("set port failed:", err)
104+
} else {
105+
fmt.Printf("set port %v success", port)
106+
}
107+
}
108+
if username != "" || password != "" {
109+
userService := service.UserService{}
110+
err := userService.UpdateFirstUser(username, password)
111+
if err != nil {
112+
fmt.Println("set username and password failed:", err)
113+
} else {
114+
fmt.Println("set username and password success")
115+
}
116+
}
73117
}
74118

75119
func main() {
@@ -78,24 +122,77 @@ func main() {
78122
return
79123
}
80124

125+
var showVersion bool
126+
flag.BoolVar(&showVersion, "v", false, "show version")
127+
81128
runCmd := flag.NewFlagSet("run", flag.ExitOnError)
82129

83130
v2uiCmd := flag.NewFlagSet("v2-ui", flag.ExitOnError)
84131
var dbPath string
85132
v2uiCmd.StringVar(&dbPath, "db", "/etc/v2-ui/v2-ui.db", "set v2-ui db file path")
86133

87-
switch flag.Arg(0) {
134+
settingCmd := flag.NewFlagSet("setting", flag.ExitOnError)
135+
var port int
136+
var username string
137+
var password string
138+
var reset bool
139+
settingCmd.BoolVar(&reset, "reset", false, "reset all setting")
140+
settingCmd.IntVar(&port, "port", 0, "set panel port")
141+
settingCmd.StringVar(&username, "username", "", "set login username")
142+
settingCmd.StringVar(&password, "password", "", "set login password")
143+
144+
oldUsage := flag.Usage
145+
flag.Usage = func() {
146+
oldUsage()
147+
fmt.Println()
148+
fmt.Println("Commands:")
149+
fmt.Println(" run run web panel")
150+
fmt.Println(" v2-ui migrate form v2-ui")
151+
fmt.Println(" setting set settings")
152+
}
153+
154+
flag.Parse()
155+
if showVersion {
156+
fmt.Println(config.GetVersion())
157+
return
158+
}
159+
160+
switch os.Args[1] {
88161
case "run":
89-
runCmd.Parse(os.Args[2:])
162+
err := runCmd.Parse(os.Args[2:])
163+
if err != nil {
164+
fmt.Println(err)
165+
return
166+
}
90167
runWebServer()
91168
case "v2-ui":
92-
v2uiCmd.Parse(os.Args[2:])
93-
v2ui(dbPath)
169+
err := v2uiCmd.Parse(os.Args[2:])
170+
if err != nil {
171+
fmt.Println(err)
172+
return
173+
}
174+
err = v2ui.MigrateFromV2UI(dbPath)
175+
if err != nil {
176+
logger.Error("migrate from v2-ui failed:", err)
177+
}
178+
case "setting":
179+
err := settingCmd.Parse(os.Args[2:])
180+
if err != nil {
181+
fmt.Println(err)
182+
return
183+
}
184+
if reset {
185+
resetSetting()
186+
} else {
187+
updateSetting(port, username, password)
188+
}
94189
default:
95-
fmt.Println("excepted 'run' or 'v2-ui' subcommands")
190+
fmt.Println("except 'run' or 'v2-ui' or 'setting' subcommands")
96191
fmt.Println()
97192
runCmd.Usage()
98193
fmt.Println()
99194
v2uiCmd.Usage()
195+
fmt.Println()
196+
settingCmd.Usage()
100197
}
101198
}

0 commit comments

Comments
 (0)