Commit bcf6c6f5 authored by duanjinfei's avatar duanjinfei

optimization nps map network

parent 3d73495b
This diff is collapsed.
......@@ -32,7 +32,7 @@ var (
bigSeventy = big.NewInt(70)
bigEighty = big.NewInt(80)
bigNinety = big.NewInt(90)
bighundred = big.NewInt(100)
bigHundred = big.NewInt(100)
bigK = big.NewInt(1000)
)
......@@ -49,7 +49,7 @@ type PullEvent struct {
func init() {
var err error
rpc := beego.AppConfig.String("chain_rpc_url")
deployBlock := beego.AppConfig.String("deployedBlock")
deployedBlock := beego.AppConfig.String("deployedBlock")
log.Info("connect chain rpc url:", rpc)
pullTask = &PullEvent{contractHandler: make(map[common.Address]logHandler)}
client, err := ethclient.Dial(rpc)
......@@ -59,7 +59,7 @@ func init() {
pullTask.client = client
lastBlock := cache.Redis.Get(LastSyncBlockKey)
if len(lastBlock) == 0 {
lastBlock = deployBlock
lastBlock = deployedBlock
}
blockNumber, _ := new(big.Int).SetString(lastBlock, 10)
pullTask.lastBlock = blockNumber
......@@ -97,7 +97,7 @@ func (p *PullEvent) GetLogs() {
} else if height > 1000 && (height-1000) >= p.lastBlock.Uint64() {
query.ToBlock = new(big.Int).Add(p.lastBlock, bigK)
} else if height > 100 && (height-100) >= p.lastBlock.Uint64() {
query.ToBlock = new(big.Int).Add(p.lastBlock, bighundred)
query.ToBlock = new(big.Int).Add(p.lastBlock, bigHundred)
} else if height > 10 && (height-10) >= p.lastBlock.Uint64() {
query.ToBlock = new(big.Int).Add(p.lastBlock, bigTen)
} else {
......@@ -113,12 +113,20 @@ func (p *PullEvent) GetLogs() {
for _, vlog := range allLogs {
handle, exist := p.contractHandler[vlog.Address]
if exist {
handle(vlog)
err := handle(vlog)
if err != nil {
log.Error("handle logs failed", err)
return
}
}
}
}
p.lastBlock = new(big.Int).Add(query.ToBlock, bigOne)
cache.Redis.Set(LastSyncBlockKey, p.lastBlock.Text(10))
err = cache.Redis.Set(LastSyncBlockKey, p.lastBlock.Text(10))
if err != nil {
log.Error("set last sync block failed", err)
return
}
}
}
......
package common
const (
Stopped = "stopped"
Running = "running"
Ens18 = "ens18"
Ipv4 = "ipv4"
Ipv6 = "ipv6"
SuccessCode = 200
Stopped = "stopped"
Running = "running"
Ens18 = "ens18"
Ipv4 = "ipv4"
Ipv6 = "ipv6"
SuccessCode = 200
LocalHost = "127.0.0.1"
DefaultSshPort = 22
DefaultVncPort = 5900
NpsReqFailedStatus int64 = 0
SplitSupportType = "-"
VmSupportConnectVnc = 1
VmSupportConnectSsh = 2
VmSupportConnectAll = 3
)
......@@ -6,12 +6,11 @@ const (
// VmCreateEvent 虚拟机创建事件
const (
VmCreateEvent = "0x7d25d4d054c4e119d70f7f809edd27dfdff08e176a4a4a3f25e7e7ad63d3398e"
VmCreateEvent = "0x14cfc769ae51024fff38f2bdd079158750cf8a7676da49060b89e554166c9a2d"
)
// VmCreateContract 虚拟机创建合约
const (
VmContract = "0x72C20a56980Ab01e994B810cd8f177609c179Ce8"
VmCreateContract = "0xAea46B15eF82be16ef33994Febd6475C073a8b89"
//VmCreateContract = "0xCE80565919c846F87328bFA54bC7443aC07C7fFE"
VmContract = "0x5Ea6719343d035A6695054278c087D7a971CA802"
VmCreateContract = "0x94186f71FD90486b65aC318ed6C08D4d78042307"
)
package common
const (
NpsGetAuthKeyAPI = "/auth/getauthkey"
NpsGetTimeAPI = "/auth/gettime"
NpsGetClientList = "/client/list"
NpsAddTunnel = "/index/add/"
NpsGetTunnel = "/index/gettunnel"
)
package commonApi
import (
"bytes"
"encoding/json"
"fmt"
"github.com/astaxie/beego"
"github.com/mitchellh/mapstructure"
hashrateCommon "hashrateNode/common"
"hashrateNode/log"
"hashrateNode/models"
"hashrateNode/utils"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
"strconv"
)
var npsApi string
var lastRequestAuthKeyTime int64
var authKey string
var timeStamp int64
func init() {
npsApi = fmt.Sprintf("http://%s%s%s", beego.AppConfig.String("nps::api_host"), ":", beego.AppConfig.String("nps::api_port"))
}
func GetClientList() []*models.NpsClientInfo {
getClientListApi := npsApi + hashrateCommon.NpsGetClientList
formData := make(map[string]interface{})
formData["start"] = "0"
formData["limit"] = "10"
formData["order"] = "asc"
request, res, err := sendNpsPostRequest(getClientListApi, formData)
if err != nil || !request {
log.Error("Nps send get client list req err:", err.Error())
return nil
}
npsClientArr := make([]*models.NpsClientInfo, 0)
marshal, err := json.Marshal(res["rows"])
if err != nil {
log.Error("GetClientList json marshal error:", err.Error())
return nil
}
err = json.Unmarshal(marshal, &npsClientArr)
if err != nil {
log.Error("GetClientList json Unmarshal error:", err.Error())
return nil
}
return npsClientArr
}
func GetTunnel(clientId string) []*models.TcpTunnelInfo {
getTunnelsApi := npsApi + hashrateCommon.NpsGetTunnel
formData := make(map[string]interface{})
formData["client_id"] = clientId
formData["type"] = "tcp"
formData["offset"] = "0"
formData["limit"] = "10"
formData["order"] = "asc"
request, resMap, err := sendNpsPostRequest(getTunnelsApi, formData)
if !request || err != nil {
log.Errorf("Nps AddTunnel error, error:%s", err.Error())
return nil
}
res := make([]*models.TcpTunnelInfo, 0)
tunnelList, err := json.Marshal(resMap["rows"])
if err != nil {
log.Error("GetTunnel json marshal error:", err.Error())
return nil
}
err = json.Unmarshal(tunnelList, &res)
if err != nil {
log.Error("GetTunnel json unmarshal error:", err.Error())
return nil
}
return res
}
func AddTunnel(tunnelRequest *models.AddTunnelRequest) *models.NpsOperateResp {
addTunnelApi := npsApi + hashrateCommon.NpsAddTunnel
mapReq := make(map[string]interface{})
marshal, err := json.Marshal(tunnelRequest)
if err != nil {
return nil
}
err = json.Unmarshal(marshal, &mapReq)
if err != nil {
return nil
}
request, resMap, err := sendNpsPostRequest(addTunnelApi, mapReq)
if !request || err != nil {
log.Errorf("Nps AddTunnel error, isSuccess:%s error:%s", request, err.Error())
return nil
}
res := &models.NpsOperateResp{}
err = mapstructure.Decode(resMap, res)
if err != nil {
log.Errorf("Nps AddTunnel mapStructure decode error:", err.Error())
return nil
}
return res
}
func getAuthKey() (string, int64) {
nowTimestampUri := npsApi + hashrateCommon.NpsGetTimeAPI
authKeyUri := npsApi + hashrateCommon.NpsGetAuthKeyAPI
isSuccess, res, err := sendNpsPostRequest(nowTimestampUri, nil)
if err != nil || !isSuccess {
return "", 0
}
timeStruct := &models.UnixTime{}
marshalTimeStruct, err := json.Marshal(res)
if err != nil {
return "", 0
}
err = json.Unmarshal(marshalTimeStruct, timeStruct)
if err != nil {
return "", 0
}
isSuccess, res, err = sendNpsPostRequest(authKeyUri, nil)
if err != nil || !isSuccess {
return "", 0
}
authKeyStruct := &models.AuthKey{}
marshalAuthKeyStruct, err := json.Marshal(res)
if err != nil {
return "", 0
}
err = json.Unmarshal(marshalAuthKeyStruct, authKeyStruct)
if err != nil {
return "", 0
}
return utils.GetAuthKey(authKeyStruct.CryptAuthKey, timeStruct.Timestamp), timeStruct.Timestamp
}
func sendNpsPostRequest(uri string, formData map[string]interface{}) (bool, map[string]interface{}, error) {
payload := &bytes.Buffer{}
writer := multipart.NewWriter(payload)
if formData != nil {
for key, value := range formData {
if strValue, ok := value.(string); ok {
_ = writer.WriteField(key, strValue)
}
}
authKey, timeStamp = getAuthKey()
if authKey == "" || timeStamp == 0 {
return false, nil, nil
}
_ = writer.WriteField("auth_key", authKey)
_ = writer.WriteField("timestamp", strconv.FormatInt(timeStamp, 10))
lastRequestAuthKeyTime = timeStamp
log.Info("Get auth key timestamp:", lastRequestAuthKeyTime)
}
err := writer.Close()
if err != nil {
fmt.Println("Error closing writer:", err)
return false, nil, err
}
request, err := http.NewRequest("POST", uri, payload)
request.Header.Set("Content-Type", writer.FormDataContentType())
if err != nil {
log.Error("Nps api new request error:", err.Error())
return false, nil, nil
}
resp, err := client.Do(request)
if err != nil {
log.Errorf("Nps api send post request uri:%s , error:%s", uri, err.Error())
return false, nil, nil
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
log.Error("Nps api close body error:", err.Error())
return
}
}(resp.Body)
if resp.StatusCode != hashrateCommon.SuccessCode {
log.Error("Nps api Send post request failed:", resp.Status)
return false, nil, nil
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return false, nil, err
}
var res map[string]interface{}
err = json.Unmarshal(body, &res)
if err != nil {
log.Error("Nps api unmarshal resp error:", err.Error())
return false, nil, err
}
return true, res, nil
}
package pveApi
package commonApi
import (
"bytes"
......@@ -9,6 +9,7 @@ import (
hashrateCommon "hashrateNode/common"
"hashrateNode/log"
"hashrateNode/models"
"io"
"io/ioutil"
"net/http"
"net/url"
......@@ -23,9 +24,9 @@ func init() {
port := beego.AppConfig.String("pve::port")
path := beego.AppConfig.String("pve::ticket_api")
hostName = beego.AppConfig.String("pve::host_name")
url := "https://" + ip + ":" + port
pveNodesPrefixApi = url + beego.AppConfig.String("pve::nodes_api") + fmt.Sprintf("/%s/qemu", hostName)
pveTicketApi = url + path
pveUrl := "https://" + ip + ":" + port
pveNodesPrefixApi = pveUrl + beego.AppConfig.String("pve::nodes_api") + fmt.Sprintf("/%s/qemu", hostName)
pveTicketApi = pveUrl + path
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // 忽略 SSL 证书错误
}
......@@ -37,7 +38,7 @@ func GetCreateVmTicket() (*models.HeaderInfo, error) {
data := url.Values{}
data.Set("username", beego.AppConfig.String("pve::user"))
data.Set("password", beego.AppConfig.String("pve::pass"))
isSuccess, _, result, err := sendPostForm(pveTicketApi, data, nil)
isSuccess, _, result, err := sendPvePostForm(pveTicketApi, data, nil)
if err != nil || !isSuccess {
return nil, err
}
......@@ -62,7 +63,7 @@ func StartVm(vm *models.VM) (interface{}, error) {
data := url.Values{}
data.Set("node", hostName)
data.Set("vmid", vm.NewId)
isSuccess, _, result, err := sendPostForm(uri, data, vm.HeaderInfo)
isSuccess, _, result, err := sendPvePostForm(uri, data, vm.HeaderInfo)
if err != nil || !isSuccess {
return nil, err
}
......@@ -77,8 +78,8 @@ func CreateVm(vm *models.VM) (interface{}, error) {
data.Set("node", hostName)
data.Set("vmid", vm.VmId)
data.Set("newid", vm.NewId)
data.Set("name", vm.Name)
isSuccess, _, result, err := sendPostForm(uri, data, vm.HeaderInfo)
data.Set("name", vm.VmCfg.Name)
isSuccess, _, result, err := sendPvePostForm(uri, data, vm.HeaderInfo)
if err != nil || !isSuccess {
return nil, err
}
......@@ -95,7 +96,7 @@ func SetVmConfig(vm *models.VM) (interface{}, error) {
data.Set("cores", vm.VmCfg.Cores.String())
data.Set("sockets", vm.VmCfg.Sockets.String())
data.Set("memory", vm.VmCfg.Memory.String())
isSuccess, _, result, err := sendPostForm(uri, data, vm.HeaderInfo)
isSuccess, _, result, err := sendPvePostForm(uri, data, vm.HeaderInfo)
if err != nil || !isSuccess {
return nil, err
}
......@@ -105,7 +106,7 @@ func SetVmConfig(vm *models.VM) (interface{}, error) {
func GetVmNetWork(vm *models.VM) ([]*models.NetworkInfo, error) {
uriSuffix := fmt.Sprintf("/%s/agent/network-get-interfaces", vm.NewId)
uri := pveNodesPrefixApi + uriSuffix
isSuccess, _, resp, err := sendGetRequest(uri, vm.HeaderInfo)
isSuccess, _, resp, err := sendPveGetRequest(uri, vm.HeaderInfo)
if err != nil || !isSuccess {
return nil, err
}
......@@ -125,7 +126,7 @@ func GetVmNetWork(vm *models.VM) ([]*models.NetworkInfo, error) {
func VmStatus(vm *models.VM) (*models.VmStatusRep, error) {
uriSuffix := fmt.Sprintf("/%s/status/current", vm.NewId)
uri := pveNodesPrefixApi + uriSuffix
isSuccess, _, resp, err := sendGetRequest(uri, vm.HeaderInfo)
isSuccess, _, resp, err := sendPveGetRequest(uri, vm.HeaderInfo)
if err != nil || !isSuccess {
return nil, err
}
......@@ -142,7 +143,7 @@ func VmStatus(vm *models.VM) (*models.VmStatusRep, error) {
}
func GetQemuList(headerInfo *models.HeaderInfo) ([]*models.QemuList, error) {
isSuccess, responseArr, _, err := sendGetRequest(pveNodesPrefixApi, headerInfo)
isSuccess, responseArr, _, err := sendPveGetRequest(pveNodesPrefixApi, headerInfo)
if err != nil || !isSuccess {
return nil, err
}
......@@ -170,15 +171,15 @@ func SetVmLoginUser(vm *models.VM) (interface{}, error) {
data.Set("vmid", vm.NewId)
data.Set("password", vm.VmCfg.Cores.String())
data.Set("username", vm.VmCfg.Sockets.String())
isSuccess, _, result, err := sendPostForm(uri, data, vm.HeaderInfo)
isSuccess, _, result, err := sendPvePostForm(uri, data, vm.HeaderInfo)
if err != nil || !isSuccess {
return nil, err
}
return result, nil
}
// sendPostForm 发送postForm请求
func sendPostForm(uri string, data url.Values, headInfo *models.HeaderInfo) (bool, []interface{}, map[string]interface{}, error) {
// sendPvePostForm 发送postForm请求
func sendPvePostForm(uri string, data url.Values, headInfo *models.HeaderInfo) (bool, []interface{}, map[string]interface{}, error) {
request, err := http.NewRequest("POST", uri, bytes.NewBufferString(data.Encode()))
if err != nil {
return false, nil, nil, err
......@@ -196,8 +197,8 @@ func sendPostForm(uri string, data url.Values, headInfo *models.HeaderInfo) (boo
return isSuccess, responseArr, response, nil
}
// sendGetRequest 发送Get请求
func sendGetRequest(uri string, headInfo *models.HeaderInfo) (bool, []interface{}, map[string]interface{}, error) {
// sendPveGetRequest 发送Get请求
func sendPveGetRequest(uri string, headInfo *models.HeaderInfo) (bool, []interface{}, map[string]interface{}, error) {
request, err := http.NewRequest("GET", uri, nil)
if headInfo != nil {
request.Header.Set("Cookie", headInfo.Ticket)
......@@ -218,7 +219,12 @@ func handlerResponse(request *http.Request) (bool, []interface{}, map[string]int
log.Errorf("Send get request error: %s , uri: %s", err.Error(), request.URL.String())
return false, nil, nil, err
}
defer resp.Body.Close()
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
log.Errorf("IO error closing error body: %s", err.Error())
}
}(resp.Body)
if resp.StatusCode != hashrateCommon.SuccessCode {
log.Error("Send post request failed:", resp.Status)
return false, nil, nil, nil
......
......@@ -2,21 +2,25 @@ appname = hashrateNode
httpport = 8080
runmode = dev
chain_rpc_url = http://192.168.1.109:7545
chainID = 5777
chain_rpc_url = http://192.168.1.125:7545
chainID = 1337
# chain_rpc_url = http://15.161.177.5:26658
# chainID = 256256
local_ip = 192.168.1.125
secret = bdcd61d5-6d48-4a0b-ac74-509ec0c3ecde
sendTranAddress = 0x4BCA676dc7140DE25217780892a763262967Ee41
sendTranPrv = 0x23384e00f2faa72b5a632f2c6bd5d23ba3e4c16b3c279dc850fd52c442d50d78
sendTranAddress = 0x257A1F95F3C09a0A2F4d82d3f916E8DbCE084659
sendTranPrv = 0xfd5cc6f5e7e2805e920ac5dc83d5af1106f9c92f0c04f9d5e1fd4261b4b4464a
deployedBlock = 1
# sendTranAddress = 0x40EC4256fcBCA69CdbAc942594caeC79FBE10494
# sendTranPrv = 0x37871f094f89fc95599e73d72d3008c828bb76d0864759011fa14dbaf6cf3c06
vncDefaultPort = 5900
sshDefaultPort = 22
deployedBlock = 1
[nps]
api_host = http://124.193.167.71
api_port = 8090
auth_crypt_key = 90ac0231b59d4f7e
[pve]
ip = 192.168.1.60
......
[
[
{
"inputs": [
{
......@@ -133,7 +133,7 @@
{
"indexed": false,
"internalType": "uint64",
"name": "memoryNum",
"name": "memorySize",
"type": "uint64"
},
{
......@@ -145,7 +145,7 @@
{
"indexed": false,
"internalType": "uint256",
"name": "disk",
"name": "diskSize",
"type": "uint256"
}
],
......@@ -185,11 +185,6 @@
"name": "owner",
"type": "address"
},
{
"internalType": "string",
"name": "taskId",
"type": "string"
},
{
"internalType": "uint256",
"name": "vmId",
......@@ -265,9 +260,33 @@
{
"inputs": [
{
"internalType": "string",
"name": "taskId",
"type": "string"
"internalType": "uint8",
"name": "start",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "count",
"type": "uint8"
}
],
"name": "getVmIds",
"outputs": [
{
"internalType": "uint256[]",
"name": "res",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "vmId",
"type": "uint256"
}
],
"name": "getVmInfo",
......@@ -279,7 +298,36 @@
},
{
"internalType": "string",
"name": "externalPort",
"name": "ex_ssh_port",
"type": "string"
},
{
"internalType": "string",
"name": "ex_vnc_port",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "vmId",
"type": "uint256"
}
],
"name": "getVmUser",
"outputs": [
{
"internalType": "string",
"name": "username",
"type": "string"
},
{
"internalType": "string",
"name": "password",
"type": "string"
}
],
......@@ -398,7 +446,7 @@
},
{
"internalType": "uint64",
"name": "memoryNum",
"name": "memorySize",
"type": "uint64"
},
{
......@@ -408,11 +456,11 @@
},
{
"internalType": "uint256",
"name": "disk",
"name": "diskSize",
"type": "uint256"
}
],
"name": "updateVMInfoEvent",
"name": "updateVmInfo",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
......@@ -473,7 +521,31 @@
"type": "uint256"
}
],
"name": "vmData",
"name": "vmConigData",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "vmInfo",
"outputs": [
{
"internalType": "string",
......
This diff is collapsed.
[
[
{
"inputs": [
{
......@@ -72,6 +72,12 @@
"internalType": "string",
"name": "os",
"type": "string"
},
{
"indexed": false,
"internalType": "string",
"name": "vmName",
"type": "string"
}
],
"name": "AddCreateVMInfoEvent",
......@@ -186,13 +192,18 @@
},
{
"internalType": "uint64",
"name": "memNum",
"name": "memSize",
"type": "uint64"
},
{
"internalType": "string",
"name": "os",
"type": "string"
},
{
"internalType": "string",
"name": "vmName",
"type": "string"
}
],
"name": "addVirtualMachine",
......@@ -214,13 +225,47 @@
"type": "function"
},
{
"inputs": [],
"name": "getTaskId",
"outputs": [
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "string",
"name": "",
"name": "taskId",
"type": "string"
},
{
"internalType": "uint256",
"name": "vmId",
"type": "uint256"
}
],
"name": "finishTask",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "start",
"type": "uint8"
},
{
"internalType": "uint8",
"name": "count",
"type": "uint8"
}
],
"name": "getTaskId",
"outputs": [
{
"internalType": "string[]",
"name": "res",
"type": "string[]"
}
],
"stateMutability": "view",
......@@ -250,6 +295,25 @@
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "taskId",
"type": "string"
}
],
"name": "getVmId",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
......
This diff is collapsed.
......@@ -32,6 +32,7 @@ require (
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 // indirect
github.com/elastic/go-elasticsearch/v6 v6.8.5 // indirect
github.com/ethereum/go-ethereum v1.12.2 // indirect
github.com/fatih/structs v1.1.0 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/garyburd/redigo v1.6.4 // indirect
github.com/go-ole/go-ole v1.2.1 // indirect
......@@ -55,6 +56,7 @@ require (
github.com/lestrrat-go/strftime v1.0.6 // indirect
github.com/lib/pq v1.0.0 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/oschwald/geoip2-golang v1.9.0 // indirect
github.com/oschwald/maxminddb-golang v1.11.0 // indirect
github.com/pelletier/go-toml v1.2.0 // indirect
......
package models
type ClientListRequest struct {
AuthKey string `json:"auth_key"`
Timestamp int64 `json:"timestamp"`
Start int64 `json:"start"`
Limit int64 `json:"limit"`
Order string `json:"order"`
}
type AddTunnelRequest struct {
Type string `json:"type"`
Remark string `json:"remark"`
Port string `json:"port"`
Target string `json:"target"`
ClientId string `json:"client_id"`
}
package models
type AuthKey struct {
CryptAuthKey string `json:"crypt_auth_key"`
CryptType string `json:"crypt_type"`
Status int64 `json:"status"`
}
type NpsOperateResp struct {
Msg string `json:"Msg"`
Status int64 `json:"Status"`
}
type UnixTime struct {
Timestamp int64 `json:"time"`
}
type NpsClientInfo struct {
Id int64 `json:"Id"`
Status bool `json:"Status"`
IsConnect bool `json:"IsConnect"`
RateLimit int64 `json:"RateLimit"`
VerifyKey string `json:"VerifyKey"`
Addr string `json:"Addr"`
}
type TcpTunnelInfo struct {
Id int64 `json:"Id"`
Port int64 `json:"Port"`
Mode string `json:"Mode"`
Status bool `json:"Status"`
RunStatus bool `json:"RunStatus"`
}
......@@ -14,13 +14,13 @@ type HeaderInfo struct {
// VM 虚拟机的数据
type VM struct {
NewId string `json:"newId"` // 克隆虚拟机模版新id
VmId string `json:"vmId"` // 虚拟机模版id
Name string `json:"name"`
VmCfg *VmConfig `json:"vmConfig"`
User string `json:"user"`
Password string `json:"password"`
HeaderInfo *HeaderInfo `json:"headerInfo"`
NewId string `json:"newId"` // 克隆虚拟机模版新id
VmId string `json:"vmId"` // 虚拟机模版id
SupportType int `json:"supportType"`
VmCfg *VmConfig `json:"vmConfig"`
User string `json:"user"`
Password string `json:"password"`
HeaderInfo *HeaderInfo `json:"headerInfo"`
}
// VmConfig 虚拟机的配置信息
......@@ -37,4 +37,15 @@ type VmConfig struct {
GpuNum *big.Int `json:"gpuNum"` // 设置虚拟机的Gpu数量。
StartDate time.Time `json:"startDate"` // 设置虚拟机的初始日期和时间。
Disk *big.Int `json:"disk"`
Name string `json:"name"`
}
type VmNetWork struct {
InternalIp string `json:"internal_ip"`
InSshPort int64 `json:"in_ssh_port"`
InVncPort int64 `json:"in_vnc_port"`
ExternalIp string `json:"external_ip"`
ExSshPort string `json:"ex_ssh_port"`
ExVncPort string `json:"ex_vnc_port"`
SupportType int64 `json:"support_type"`
}
......@@ -24,6 +24,8 @@ type QemuList struct {
//Pid int64 `json:"pid"`
MaxMem *big.Int `json:"maxMem"`
Template int64 `json:"template" default:"0"`
Name string `json:"name"`
Uptime int64 `json:"uptime"`
}
type NetWorkResult struct {
......
......@@ -41,3 +41,8 @@ func TestIpAddressCondition(t *testing.T) {
condition := asyncLog.IsCreateVmCondition("13.38.146.66")
fmt.Println("condition:", condition)
}
func TestNpsMappingInternalIp(t *testing.T) {
mapping := asyncLog.NpsMappingNetwork("192.168.1.117", 2)
fmt.Println("mapping:", mapping)
}
......@@ -2,8 +2,13 @@ package utils
import (
"context"
"crypto/aes"
"crypto/cipher"
"crypto/ecdsa"
"crypto/md5"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"github.com/astaxie/beego"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
......@@ -84,7 +89,12 @@ func GetIpAddr(ipAddress string) *Coordinates {
log.Error(" geoip2 open error:", err)
return nil
}
defer db.Close()
defer func(db *geoip2.Reader) {
err := db.Close()
if err != nil {
log.Error(" geoip2 close error:", err)
}
}(db)
// 解析 IP 地址
ip := net.ParseIP(ipAddress)
// 查询 IP 地址的位置信息
......@@ -118,3 +128,44 @@ func CalculateDistance(coord1, coord2 *Coordinates) float64 {
distance := EarthRadius * c
return distance
}
func GetAuthKey(encryptedText string, timestamp int64) string {
cryptKeyStr := beego.AppConfig.String("nps::auth_crypt_key")
cryptKey := []byte(cryptKeyStr)
encryptedTextByte, _ := hex.DecodeString(encryptedText)
// 创建解密器
decrypt, err := AesDecrypt(encryptedTextByte, cryptKey)
if err != nil {
return ""
}
log.Info("Decrypt test:", string(decrypt))
input := fmt.Sprintf("%s%d", string(decrypt), timestamp)
hash := md5.New()
hash.Write([]byte(input))
hashBytes := hash.Sum(nil)
md5Str := hex.EncodeToString(hashBytes)
log.Info("md5Str:", md5Str)
return md5Str
}
func PKCS5UnPadding(origData []byte) (error, []byte) {
length := len(origData)
unpadding := int(origData[length-1])
if (length - unpadding) < 0 {
return errors.New("len error"), nil
}
return nil, origData[:(length - unpadding)]
}
func AesDecrypt(crypted, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
blockSize := block.BlockSize()
blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
origData := make([]byte, len(crypted))
blockMode.CryptBlocks(origData, crypted)
err, origData = PKCS5UnPadding(origData)
return origData, err
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment