mirror of
https://github.com/khairul169/vaulterm.git
synced 2026-09-15 17:03:30 +07:00
feat: add pve vnc session
This commit is contained in:
+1
-1
@@ -89,7 +89,7 @@ func (pve *PVEServer) GetAccessTicket() (*PVEAccessTicket, error) {
|
||||
}
|
||||
|
||||
type PVEInstance struct {
|
||||
Type string
|
||||
Type string // "qemu" | "lxc"
|
||||
Node string
|
||||
VMID string
|
||||
}
|
||||
|
||||
@@ -22,7 +22,19 @@ type PVEConfig struct {
|
||||
PrivateKeyPassphrase string
|
||||
}
|
||||
|
||||
func (pve *PVEServer) NewTerminalSession(c *websocket.Conn, access *PVEAccessTicket, instance *PVEInstance, ticket *PVEVNCTicketData) error {
|
||||
// https://github.com/proxmox/pve-xtermjs/blob/master/README
|
||||
|
||||
func (pve *PVEServer) NewTerminalSession(c *websocket.Conn, instance *PVEInstance) error {
|
||||
access, err := pve.GetAccessTicket()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
ticket, err := pve.GetVNCTicket(access, instance, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("wss://%s:%d/api2/json/nodes/%s/%s/%s/vncwebsocket?port=%s&vncticket=%s",
|
||||
pve.HostName, pve.Port, instance.Node, instance.Type, instance.VMID, ticket.Port, url.QueryEscape(ticket.Ticket))
|
||||
|
||||
@@ -44,8 +56,6 @@ func (pve *PVEServer) NewTerminalSession(c *websocket.Conn, access *PVEAccessTic
|
||||
// Send first ticket line
|
||||
ws.WriteMessage(fastWs.TextMessage, []byte(fmt.Sprintf("%s:%s\n", access.Username, access.Ticket)))
|
||||
|
||||
// https://github.com/proxmox/pve-xtermjs/blob/master/README
|
||||
|
||||
go func() {
|
||||
for {
|
||||
t, msg, err := c.ReadMessage()
|
||||
@@ -65,9 +75,8 @@ func (pve *PVEServer) NewTerminalSession(c *websocket.Conn, access *PVEAccessTic
|
||||
}
|
||||
|
||||
msg = []byte(fmt.Sprintf("0:%d:%s\n", len(msg), string(msg)))
|
||||
err = ws.WriteMessage(t, msg)
|
||||
|
||||
if err != nil {
|
||||
if err = ws.WriteMessage(t, msg); err != nil {
|
||||
log.Println("Error writing to Proxmox:", err)
|
||||
break
|
||||
}
|
||||
@@ -85,8 +94,70 @@ func (pve *PVEServer) NewTerminalSession(c *websocket.Conn, access *PVEAccessTic
|
||||
continue
|
||||
}
|
||||
|
||||
err = c.WriteMessage(t, msg)
|
||||
if err = c.WriteMessage(t, msg); err != nil {
|
||||
log.Println("Error writing to client:", err)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (pve *PVEServer) NewVNCSession(c *websocket.Conn, instance *PVEInstance) error {
|
||||
access, err := pve.GetAccessTicket()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
ticket, err := pve.GetVNCTicket(access, instance, true)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("wss://%s:%d/api2/json/nodes/%s/%s/%s/vncwebsocket?port=%s&vncticket=%s",
|
||||
pve.HostName, pve.Port, instance.Node, instance.Type, instance.VMID, ticket.Port, url.QueryEscape(ticket.Ticket))
|
||||
|
||||
headers := http.Header{}
|
||||
headers.Add("Authorization", "PVEAPIToken="+access.Username)
|
||||
headers.Add("Cookie", "PVEAuthCookie="+access.Ticket)
|
||||
|
||||
dialer := fastWs.Dialer{
|
||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
||||
}
|
||||
|
||||
ws, _, err := dialer.Dial(url, headers)
|
||||
if err != nil {
|
||||
log.Println("Error connecting to Proxmox WebSocket:", err)
|
||||
return err
|
||||
}
|
||||
defer ws.Close()
|
||||
|
||||
// Send vnc password
|
||||
c.WriteMessage(fastWs.TextMessage, []byte(fmt.Sprintf("\x01%s", ticket.Ticket)))
|
||||
|
||||
go func() {
|
||||
for {
|
||||
t, msg, err := c.ReadMessage()
|
||||
if err != nil {
|
||||
log.Println("Error reading from client:", err)
|
||||
break
|
||||
}
|
||||
|
||||
if err = ws.WriteMessage(t, msg); err != nil {
|
||||
log.Println("Error writing to Proxmox:", err)
|
||||
break
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
for {
|
||||
t, msg, err := ws.ReadMessage()
|
||||
if err != nil {
|
||||
log.Println("Error reading from Proxmox:", err)
|
||||
break
|
||||
}
|
||||
|
||||
if err = c.WriteMessage(t, msg); err != nil {
|
||||
log.Println("Error writing to client:", err)
|
||||
break
|
||||
}
|
||||
|
||||
+37
-30
@@ -31,42 +31,49 @@ func main() {
|
||||
return fiber.ErrUpgradeRequired
|
||||
})
|
||||
|
||||
// app.Get("/ws/ssh", websocket.New(func(c *websocket.Conn) {
|
||||
// err := lib.NewSSHWebsocketSession(c, &lib.SSHConfig{
|
||||
// HostName: "10.0.0.102",
|
||||
// User: "root",
|
||||
// Password: "ausya2",
|
||||
// })
|
||||
|
||||
// if err != nil {
|
||||
// msg := fmt.Sprintf("\r\n%s\r\n", err.Error())
|
||||
// c.WriteMessage(websocket.TextMessage, []byte(msg))
|
||||
// }
|
||||
// }))
|
||||
|
||||
app.Get("/ws/ssh", websocket.New(func(c *websocket.Conn) {
|
||||
node := &lib.PVEInstance{
|
||||
Type: "lxc",
|
||||
Node: "pve",
|
||||
VMID: "102",
|
||||
cfg := &lib.SSHConfig{
|
||||
HostName: "10.0.0.102",
|
||||
User: "root",
|
||||
Password: "ausya2",
|
||||
}
|
||||
|
||||
if err := lib.NewSSHWebsocketSession(c, cfg); err != nil {
|
||||
c.WriteMessage(websocket.TextMessage, []byte(err.Error()))
|
||||
}
|
||||
}))
|
||||
|
||||
app.Get("/ws/pve", websocket.New(func(c *websocket.Conn) {
|
||||
client := c.Query("client")
|
||||
serverId := c.Query("serverId")
|
||||
|
||||
var node *lib.PVEInstance
|
||||
|
||||
switch serverId {
|
||||
case "2":
|
||||
node = &lib.PVEInstance{
|
||||
Type: "qemu",
|
||||
Node: "pve",
|
||||
VMID: "105",
|
||||
}
|
||||
case "3":
|
||||
node = &lib.PVEInstance{
|
||||
Type: "lxc",
|
||||
Node: "pve",
|
||||
VMID: "102",
|
||||
}
|
||||
}
|
||||
|
||||
var err error
|
||||
if client == "vnc" {
|
||||
err = pve.NewVNCSession(c, node)
|
||||
} else {
|
||||
err = pve.NewTerminalSession(c, node)
|
||||
}
|
||||
|
||||
access, err := pve.GetAccessTicket()
|
||||
if err != nil {
|
||||
c.WriteMessage(websocket.TextMessage, []byte(err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
ticket, err := pve.GetVNCTicket(access, node, false)
|
||||
if err != nil {
|
||||
c.WriteMessage(websocket.TextMessage, []byte(err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
if err := pve.NewTerminalSession(c, access, node, ticket); err != nil {
|
||||
c.WriteMessage(websocket.TextMessage, []byte(err.Error()))
|
||||
}
|
||||
|
||||
}))
|
||||
app.Listen(":3000")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user