mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-05-12 17:14:27 +08:00
138 lines
3.4 KiB
Go
138 lines
3.4 KiB
Go
package session
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"os/exec"
|
|
|
|
"yunion.io/x/onecloud/pkg/mcclient"
|
|
"yunion.io/x/onecloud/pkg/mcclient/modules"
|
|
)
|
|
|
|
const (
|
|
VNC = "vnc"
|
|
ALIYUN = "aliyun"
|
|
QCLOUD = "qcloud"
|
|
OPENSTACK = "openstack"
|
|
SPICE = "spice"
|
|
WMKS = "wmks"
|
|
)
|
|
|
|
type RemoteConsoleInfo struct {
|
|
Host string `json:"host"`
|
|
Port int64 `json:"port"`
|
|
Protocol string `json:"protocol"`
|
|
Id string `json:"id"`
|
|
OsName string `json:"osName"`
|
|
VncPassword string `json:"vncPassword"`
|
|
|
|
// used by aliyun server
|
|
InstanceId string `json:"instance_id"`
|
|
Url string `json:"url"`
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
func NewRemoteConsoleInfoByCloud(s *mcclient.ClientSession, serverId string) (*RemoteConsoleInfo, error) {
|
|
metadata, err := modules.Servers.GetSpecific(s, serverId, "metadata", nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
osName, _ := metadata.GetString("os_name")
|
|
vncPasswd, _ := metadata.GetString("__vnc_password")
|
|
ret, err := modules.Servers.GetSpecific(s, serverId, "vnc", nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
vncInfo := RemoteConsoleInfo{}
|
|
err = ret.Unmarshal(&vncInfo)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
vncInfo.OsName = osName
|
|
vncInfo.VncPassword = vncPasswd
|
|
return &vncInfo, nil
|
|
}
|
|
|
|
// GetProtocol implements ISessionData interface
|
|
func (info *RemoteConsoleInfo) GetProtocol() string {
|
|
return info.Protocol
|
|
}
|
|
|
|
// GetCommand implements ISessionData interface
|
|
func (info *RemoteConsoleInfo) GetCommand() *exec.Cmd {
|
|
return nil
|
|
}
|
|
|
|
// Cleanup implements ISessionData interface
|
|
func (info *RemoteConsoleInfo) Cleanup() error {
|
|
return nil
|
|
}
|
|
|
|
// GetData implements ISessionData interface
|
|
func (info *RemoteConsoleInfo) Connect() error {
|
|
return nil
|
|
}
|
|
|
|
// GetData implements ISessionData interface
|
|
func (info *RemoteConsoleInfo) GetData(s string) (bool, string, string) {
|
|
return false, "", ""
|
|
}
|
|
|
|
// ShowInfo implements ISessionData interface
|
|
func (info *RemoteConsoleInfo) ShowInfo() string {
|
|
return ""
|
|
}
|
|
|
|
func (info *RemoteConsoleInfo) GetConnectParams() (string, error) {
|
|
switch info.Protocol {
|
|
case ALIYUN:
|
|
return info.getAliyunURL()
|
|
case QCLOUD:
|
|
return info.getQcloudURL()
|
|
case OPENSTACK:
|
|
return info.getOpenStackURL()
|
|
default:
|
|
return "", fmt.Errorf("Can't convert protocol %s to connect params", info.Protocol)
|
|
}
|
|
}
|
|
|
|
func (info *RemoteConsoleInfo) GetPassword() string {
|
|
if len(info.Password) != 0 {
|
|
return info.Password
|
|
}
|
|
return info.VncPassword
|
|
}
|
|
|
|
func (info *RemoteConsoleInfo) getOpenStackURL() (string, error) {
|
|
return info.getConnParamsURL(info.Url, nil), nil
|
|
}
|
|
|
|
func (info *RemoteConsoleInfo) getConnParamsURL(baseURL string, params url.Values) string {
|
|
if params == nil {
|
|
params = url.Values{}
|
|
}
|
|
params.Set("protocol", info.Protocol)
|
|
queryURL := params.Encode()
|
|
return fmt.Sprintf("%s?%s", baseURL, queryURL)
|
|
}
|
|
|
|
func (info *RemoteConsoleInfo) getQcloudURL() (string, error) {
|
|
base := "https://img.qcloud.com/qcloud/app/active_vnc/index.html?InstanceVncUrl=" + info.Url
|
|
return info.getConnParamsURL(base, nil), nil
|
|
}
|
|
|
|
func (info *RemoteConsoleInfo) getAliyunURL() (string, error) {
|
|
isWindows := "False"
|
|
if info.OsName == "Windows" {
|
|
isWindows = "True"
|
|
}
|
|
base := "https://g.alicdn.com/aliyun/ecs-console-vnc/0.0.7/index.html"
|
|
params := url.Values{
|
|
"vncUrl": {info.Url},
|
|
"instanceId": {info.InstanceId},
|
|
"isWindows": {isWindows},
|
|
"password": {info.Password},
|
|
}
|
|
return info.getConnParamsURL(base, params), nil
|
|
}
|