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()
|
||
}
|