Commit 2881419d authored by ibuler's avatar ibuler

[Update] Merge

parents 0dcec41a 6370e59c
......@@ -172,7 +172,7 @@
[[projects]]
branch = "master"
digest = "1:343efc58e056071ced09d112d201b64af4d38e31bc81a5cb77744f2c74fe9e7f"
digest = "1:ed3d25dee9c9d77611e5ce1bd3a5a078930e8efb31afac120ccb1fbba7ec08d1"
name = "golang.org/x/sys"
packages = [
"cpu",
......@@ -180,7 +180,7 @@
"windows",
]
pruneopts = "UT"
revision = "2d0786266e9cd132da844109aa05016f11f3df28"
revision = "a5b02f93d862f065920dd6a40dddc66b60d0dec4"
[[projects]]
digest = "1:c805e517269b0ba4c21ded5836019ed7d16953d4026cb7d00041d039c7906be9"
......
......@@ -73,7 +73,7 @@ func displayBanner(sess ssh.Session, user string) {
welcomeMsg := prefix + utils.WrapperTitle(user+",") + " " + title + suffix
_, err := io.WriteString(sess, welcomeMsg)
if err != nil {
logger.Error("Send to client error, %s", err)
logger.Errorf("Send to client error, %s", err)
return
}
for _, v := range menu {
......
......@@ -59,6 +59,7 @@ func (h *interactiveHandler) Initial() {
h.displayBanner()
h.loadUserAssets()
h.loadUserAssetNodes()
h.searchResult = h.assets
}
func (h *interactiveHandler) displayBanner() {
......@@ -102,7 +103,8 @@ func (h *interactiveHandler) Dispatch(ctx cctx.Context) {
case 0, 1:
switch strings.ToLower(line) {
case "", "p":
h.Proxy(ctx)
h.displayAssets(h.assets)
//h.Proxy(ctx)
case "g":
h.displayNodes(h.nodes)
case "h":
......@@ -140,14 +142,38 @@ func (h *interactiveHandler) Dispatch(ctx cctx.Context) {
h.displayAssetsOrProxy(assets)
}
}
}
}
func (h *interactiveHandler) chooseSystemUser(systemUsers []model.SystemUser) model.SystemUser {
table := tablewriter.NewWriter(h.sess)
length := len(systemUsers)
switch length {
case 0:
return model.SystemUser{}
case 1:
return systemUsers[0]
default:
}
displaySystemUsers := make([]model.SystemUser, 0)
model.SortSystemUserByPriority(systemUsers)
highestPriority := systemUsers[length-1].Priority
displaySystemUsers = append(displaySystemUsers, systemUsers[length-1])
for i := length - 2; i >= 0; i-- {
if highestPriority == systemUsers[i].Priority {
displaySystemUsers = append(displaySystemUsers, systemUsers[i])
}
}
if len(displaySystemUsers) == 1 {
return displaySystemUsers[0]
}
table := tablewriter.NewWriter(h.term)
table.SetHeader([]string{"ID", "Username"})
for i := 0; i < len(systemUsers); i++ {
table.Append([]string{strconv.Itoa(i + 1), systemUsers[i].Username})
for i := 0; i < len(displaySystemUsers); i++ {
table.Append([]string{strconv.Itoa(i + 1), displaySystemUsers[i].Username})
}
table.SetBorder(false)
count := 0
......@@ -159,54 +185,32 @@ func (h *interactiveHandler) chooseSystemUser(systemUsers []model.SystemUser) mo
continue
}
if num, err := strconv.Atoi(line); err == nil {
if num > 0 && num <= len(systemUsers) {
return systemUsers[num-1]
if num > 0 && num <= len(displaySystemUsers) {
return displaySystemUsers[num-1]
}
}
count++
}
return systemUsers[0]
return displaySystemUsers[0]
}
// 当资产的数量为1的时候,就进行代理转化
func (h *interactiveHandler) displayAssetsOrProxy(assets []model.Asset) {
//if len(assets) == 1 {
// var systemUser model.SystemUser
// switch len(assets[0].SystemUsers) {
// case 0:
// // 有授权的资产,但是资产用户信息,无法登陆
// h.displayAssets(assets)
// return
// case 1:
// systemUser = assets[0].SystemUsers[0]
// default:
// systemUser = h.chooseSystemUser(assets[0].SystemUsers)
// }
//
// authInfo, err := model.GetSystemUserAssetAuthInfo(systemUser.ID, assets[0].ID)
// if err != nil {
// return
// }
// if ok := service.ValidateUserAssetPermission(h.user.ID, systemUser.ID, assets[0].ID); !ok {
// // 检查user 是否对该资产有权限
// return
// }
//
// err = h.Proxy(assets[0], authInfo)
// if err != nil {
// logger.Info(err)
// }
// return
//} else {
// h.displayAssets(assets)
//}
if len(assets) == 1 {
systemUser := h.chooseSystemUser(assets[0].SystemUsers)
h.assetSelect = &assets[0]
h.systemUserSelect = &systemUser
h.Proxy(context.TODO())
} else {
h.displayAssets(assets)
}
}
func (h *interactiveHandler) displayAssets(assets model.AssetList) {
if len(assets) == 0 {
_, _ = io.WriteString(h.sess, "\r\n No Assets\r\n\r")
_, _ = io.WriteString(h.term, "\r\n No Assets\r\n\r")
} else {
table := tablewriter.NewWriter(h.sess)
table := tablewriter.NewWriter(h.term)
table.SetHeader([]string{"ID", "Hostname", "IP", "LoginAs", "Comment"})
for index, assetItem := range assets {
sysUserArray := make([]string, len(assetItem.SystemUsers))
......@@ -228,9 +232,9 @@ func (h *interactiveHandler) displayNodes(nodes []model.Node) {
tipHeaderMsg := "\r\nNode: [ ID.Name(Asset amount) ]"
tipEndMsg := "Tips: Enter g+NodeID to display the host under the node, such as g1\r\n\r"
_, err := io.WriteString(h.sess, tipHeaderMsg)
_, err = io.WriteString(h.sess, tree.String())
_, err = io.WriteString(h.sess, tipEndMsg)
_, err := io.WriteString(h.term, tipHeaderMsg)
_, err = io.WriteString(h.term, tree.String())
_, err = io.WriteString(h.term, tipEndMsg)
if err != nil {
logger.Info("displayAssetNodes err:", err)
}
......@@ -252,75 +256,41 @@ func (h *interactiveHandler) loadUserAssetNodes() {
h.nodes = service.GetUserNodes(h.user.ID, "1")
}
func (h *interactiveHandler) changeLanguage() {
}
func (h *interactiveHandler) JoinShareRoom(roomID string) {
//sshConn := userhome.NewSSHConn(h.sess)
//ctx, cancelFuc := context.WithCancel(h.sess.Context())
//
//_, winCh, _ := h.sess.Pty()
//go func() {
// for {
// select {
// case <-ctx.Done():
// return
// case win, ok := <-winCh:
// if !ok {
// return
// }
// fmt.Println("join term change:", win)
// }
// }
//}()
//proxybak.Manager.JoinShareRoom(roomID, sshConn)
logger.Info("exit room id:", roomID)
//cancelFuc()
}
func (h *interactiveHandler) searchAsset(key string) (assets []model.Asset) {
//if indexNum, err := strconv.Atoi(key); err == nil {
// if indexNum > 0 && indexNum <= len(h.searchResult) {
// return []model.Asset{h.searchResult[indexNum-1]}
// }
//}
//
//if assetsData, ok := h.assetData.Load(AssetsMapKey); ok {
// for _, assetValue := range assetsData.([]model.Asset) {
// if isSubstring([]string{assetValue.Ip, assetValue.Hostname, assetValue.Comment}, key) {
// assets = append(assets, assetValue)
// }
// }
//} else {
if indexNum, err := strconv.Atoi(key); err == nil {
if indexNum > 0 && indexNum <= len(h.searchResult) {
assets = []model.Asset{h.searchResult[indexNum-1]}
return
}
}
for _, assetValue := range h.searchResult {
contents := []string{assetValue.Ip, assetValue.Hostname, assetValue.Comment}
if isSubstring(contents, key) {
assets = append(assets, assetValue)
}
}
// assetsData, _ := Cached.Load(h.user.ID)
// for _, assetValue := range assetsData.([]model.Asset) {
// if isSubstring([]string{assetValue.Ip, assetValue.Hostname, assetValue.Comment}, key) {
// assets = append(assets, assetValue)
// }
// }
//}
return assets
}
func (h *interactiveHandler) searchNodeAssets(num int) (assets []model.Asset) {
//var assetNodesData []model.Node
//if assetNodes, ok := h.assetData.Load(AssetNodesMapKey); ok {
// assetNodesData = assetNodes.([]model.Node)
// if num > len(assetNodesData) || num == 0 {
// return assets
// }
// return assetNodesData[num-1].AssetsGranted
//}
return assets
if num > len(h.nodes) || num == 0 {
return assets
}
return h.nodes[num-1].AssetsGranted
}
func (h *interactiveHandler) Proxy(ctx context.Context) {
h.assetSelect = &model.Asset{Hostname: "centos", Port: 22, Ip: "192.168.244.185", Protocol: "ssh"}
h.systemUserSelect = &model.SystemUser{Id: "5dd8b5a0-8cdb-4857-8629-faf811c525e1", Name: "web", Username: "root", Password: "redhat", Protocol: "telnet"}
//h.assetSelect = &model.Asset{Hostname: "centos", Port: 22, Ip: "192.168.244.185", Protocol: "ssh"}
//h.systemUserSelect = &model.SystemUser{Id: "5dd8b5a0-8cdb-4857-8629-faf811c525e1", Name: "web", Username: "root", Password: "redhat", Protocol: "telnet"}
userConn := &proxy.UserSSHConnection{Session: h.sess}
p := proxy.ProxyServer{
......@@ -332,6 +302,63 @@ func (h *interactiveHandler) Proxy(ctx context.Context) {
p.Proxy()
}
func ConstructAssetNodeTree(assetNodes []model.Node) treeprint.Tree {
model.SortAssetNodesByKey(assetNodes)
var treeMap = map[string]treeprint.Tree{}
tree := treeprint.New()
for i := 0; i < len(assetNodes); i++ {
r := strings.LastIndex(assetNodes[i].Key, ":")
if r < 0 {
subtree := tree.AddBranch(fmt.Sprintf("%s.%s(%s)",
strconv.Itoa(i+1), assetNodes[i].Name,
strconv.Itoa(assetNodes[i].AssetsAmount)))
treeMap[assetNodes[i].Key] = subtree
continue
}
if subtree, ok := treeMap[assetNodes[i].Key[:r]]; ok {
nodeTree := subtree.AddBranch(fmt.Sprintf("%s.%s(%s)",
strconv.Itoa(i+1), assetNodes[i].Name,
strconv.Itoa(assetNodes[i].AssetsAmount)))
treeMap[assetNodes[i].Key] = nodeTree
}
}
return tree
}
func isSubstring(sArray []string, substr string) bool {
for _, s := range sArray {
if strings.Contains(s, substr) {
return true
}
}
return false
}
//func (h *InteractiveHandler) JoinShareRoom(roomID string) {
//sshConn := userhome.NewSSHConn(h.sess)
//ctx, cancelFuc := context.WithCancel(h.sess.Context())
//
//_, winCh, _ := h.sess.Pty()
//go func() {
// for {
// select {
// case <-ctx.Done():
// return
// case win, ok := <-winCh:
// if !ok {
// return
// }
// fmt.Println("join term change:", win)
// }
// }
//}()
//proxybak.Manager.JoinShareRoom(roomID, sshConn)
//logger.Info("exit room id:", roomID)
//cancelFuc()
//
//}
// /*
// 1. 创建SSHConn,符合core.Conn接口
// 2. 创建一个session Home
......@@ -401,35 +428,3 @@ func (h *interactiveHandler) Proxy(ctx context.Context) {
// return err
//}
//
//func isSubstring(sArray []string, substr string) bool {
// for _, s := range sArray {
// if strings.Contains(s, substr) {
// return true
// }
// }
// return false
//}
//
func ConstructAssetNodeTree(assetNodes []model.Node) treeprint.Tree {
model.SortAssetNodesByKey(assetNodes)
var treeMap = map[string]treeprint.Tree{}
tree := treeprint.New()
for i := 0; i < len(assetNodes); i++ {
r := strings.LastIndex(assetNodes[i].Key, ":")
if r < 0 {
subtree := tree.AddBranch(fmt.Sprintf("%s.%s(%s)",
strconv.Itoa(i+1), assetNodes[i].Name,
strconv.Itoa(assetNodes[i].AssetsAmount)))
treeMap[assetNodes[i].Key] = subtree
continue
}
if subtree, ok := treeMap[assetNodes[i].Key[:r]]; ok {
nodeTree := subtree.AddBranch(fmt.Sprintf("%s.%s(%s)",
strconv.Itoa(i+1), assetNodes[i].Name,
strconv.Itoa(assetNodes[i].AssetsAmount)))
treeMap[assetNodes[i].Key] = nodeTree
}
}
return tree
}
......@@ -27,6 +27,6 @@ func SftpHandler(sess ssh.Session) {
server.Close()
logger.Info("sftp client exited session.")
} else if err != nil {
logger.Errorf("sftp server completed with error:", err)
logger.Error("sftp server completed with error:", err)
}
}
......@@ -126,7 +126,7 @@ func (p *ProxyServer) Proxy() {
}
srvConn, err := p.getServerConn()
if err != nil {
msg := fmt.Sprintf("Connect asset %s error: %s\n", p.Asset.Hostname, err)
msg := fmt.Sprintf("Connect asset %s error: %s\n\r", p.Asset.Hostname, err)
utils.IgnoreErrWriteString(p.UserConn, msg)
logger.Errorf(msg)
return
......
......@@ -158,7 +158,6 @@ func (sc *ServerSSHConnection) invokeShell(h, w int, term string) (err error) {
func (sc *ServerSSHConnection) Connect(h, w int, term string) (err error) {
_, err = sc.connect()
fmt.Println("error")
if err != nil {
return
}
......
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