137 lines
3.1 KiB
Go
137 lines
3.1 KiB
Go
|
package tui
|
|||
|
|
|||
|
import (
|
|||
|
"bufio"
|
|||
|
"fmt"
|
|||
|
"gitee.ltd/lxh/logger/log"
|
|||
|
"github.com/charmbracelet/bubbles/table"
|
|||
|
"github.com/charmbracelet/lipgloss"
|
|||
|
"github.com/spf13/cast"
|
|||
|
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
|||
|
"os"
|
|||
|
"strings"
|
|||
|
"wireguard-ui/http/vo"
|
|||
|
"wireguard-ui/model"
|
|||
|
"wireguard-ui/service"
|
|||
|
"wireguard-ui/utils"
|
|||
|
)
|
|||
|
|
|||
|
var BaseStyle = lipgloss.NewStyle().
|
|||
|
BorderStyle(lipgloss.NormalBorder()).
|
|||
|
BorderForeground(lipgloss.Color("240"))
|
|||
|
|
|||
|
var menus = []string{"[1] 客户端链接列表", "[2] 客户端", "[3] 服务端", "[4] 设置", "[q] 退出"}
|
|||
|
|
|||
|
// PrintMenu
|
|||
|
// @description: 打印一下菜单
|
|||
|
func PrintMenu() {
|
|||
|
fmt.Println("\n菜单:")
|
|||
|
for _, menu := range menus {
|
|||
|
fmt.Println(menu)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// GenerateTable
|
|||
|
// @description: 生成数据表
|
|||
|
// @param column
|
|||
|
// @param rows
|
|||
|
// @return string
|
|||
|
func GenerateTable(column []table.Column, rows [][]string) string {
|
|||
|
var data []table.Row
|
|||
|
for _, v := range rows {
|
|||
|
data = append(data, v)
|
|||
|
}
|
|||
|
|
|||
|
tl := table.New(
|
|||
|
table.WithColumns(column),
|
|||
|
table.WithRows(data),
|
|||
|
table.WithHeight(len(data)+1),
|
|||
|
)
|
|||
|
|
|||
|
s := table.DefaultStyles()
|
|||
|
s.Header = s.Header.
|
|||
|
BorderStyle(lipgloss.NormalBorder()).
|
|||
|
BorderForeground(lipgloss.Color("240")).
|
|||
|
BorderBottom(true).
|
|||
|
Bold(false)
|
|||
|
s.Selected = lipgloss.NewStyle()
|
|||
|
|
|||
|
tl.SetStyles(s)
|
|||
|
|
|||
|
return BaseStyle.Render(tl.View()+"\n") + "\n一共有 【" + fmt.Sprintf("%d", len(data)) + "】 条数据"
|
|||
|
}
|
|||
|
|
|||
|
// GenerateIP
|
|||
|
// @description: 生成IP
|
|||
|
// @return clientIPS
|
|||
|
// @return serverIPS
|
|||
|
// @return err
|
|||
|
func GenerateIP() (clientIPS, serverIPS []string, err error) {
|
|||
|
// 获取一下服务端信息,因为IP分配需要根据服务端的IP制定
|
|||
|
serverInfo, err := service.Setting().GetWGServerForConfig()
|
|||
|
if err != nil {
|
|||
|
return nil, nil, err
|
|||
|
}
|
|||
|
|
|||
|
var assignIPS []string
|
|||
|
// 只获取最新的一个
|
|||
|
var clientInfo *model.Client
|
|||
|
if err = service.Client().Order("created_at DESC").Take(&clientInfo).Error; err == nil {
|
|||
|
// 遍历每一个ip是否可允许再分配
|
|||
|
for _, ip := range strings.Split(clientInfo.IpAllocation, ",") {
|
|||
|
if cast.ToInt64(utils.Network().GetIPSuffix(ip)) >= 255 {
|
|||
|
log.Errorf("IP:[%s]已无法分配新IP", ip)
|
|||
|
continue
|
|||
|
} else {
|
|||
|
assignIPS = append(assignIPS, ip)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
ips := utils.Network().GenerateIPByIPS(serverInfo.Address, assignIPS...)
|
|||
|
|
|||
|
return ips, serverInfo.Address, nil
|
|||
|
}
|
|||
|
|
|||
|
// GenerateKeys
|
|||
|
// @description: 生成密钥对
|
|||
|
// @return keys
|
|||
|
// @return err
|
|||
|
func GenerateKeys() (keys *vo.Keys, err error) {
|
|||
|
// 为空,新增
|
|||
|
privateKey, err := wgtypes.GeneratePrivateKey()
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
publicKey := privateKey.PublicKey().String()
|
|||
|
presharedKey, err := wgtypes.GenerateKey()
|
|||
|
if err != nil {
|
|||
|
return nil, fmt.Errorf("生成预共享密钥失败: %s", err.Error())
|
|||
|
}
|
|||
|
keys = &vo.Keys{
|
|||
|
PrivateKey: privateKey.String(),
|
|||
|
PublicKey: publicKey,
|
|||
|
PresharedKey: presharedKey.String(),
|
|||
|
}
|
|||
|
|
|||
|
return keys, nil
|
|||
|
}
|
|||
|
|
|||
|
// Show
|
|||
|
// @description: 展示
|
|||
|
// @param data
|
|||
|
func Show(data any) {
|
|||
|
fmt.Println(data)
|
|||
|
}
|
|||
|
|
|||
|
// readInput
|
|||
|
// @description: 读取输入
|
|||
|
// @param prompt
|
|||
|
// @return string
|
|||
|
func readInput(prompt string) string {
|
|||
|
fmt.Print(prompt)
|
|||
|
scanner := bufio.NewScanner(os.Stdin)
|
|||
|
scanner.Scan()
|
|||
|
return scanner.Text()
|
|||
|
}
|